diff --git a/resources/js/config.js b/resources/js/config.js
index 047ca15..f994244 100644
--- a/resources/js/config.js
+++ b/resources/js/config.js
@@ -1 +1 @@
-var __DOCS_CONFIG__ = {"id":"GxA4KWeO8OwSDbr+uKbPb2644w7rQGkrVTr","key":"sp74El79+BQVSSOa38a+9PO9jp9R1kD/VqGXa7CmZtg.mC3RjZxyrBnr30LFZCYKVqOb0fCFdR4GoewNs4AHRDZ1JLRfSo2acrDIgcESU9LDDWt/jgLXmUo4EeIVTJz4gg.105","base":"/","host":"docs.blissroms.org","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"2.3.0.710910015626","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"<path d=\"M12.97 2.59a1.5 1.5 0 00-1.94 200 0l-7.5 6.363A1.5 1.5 0 003 10.097V19.5A1.5 1.5 0 004.5 21h4.75a.75.75 0 00.75-.75V14h4v6.25c0 .414.336.75.75.75h4.75a1.5 1.5 0 001.5-1.5v-9.403a1.5 1.5 0 00-.53-1.144l-7.5-6.363z\"></path>","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties","shortLabel":"Props"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome","s":"<path fill-rule=\"evenodd\" d=\"M11.03 2.59a1.5 1.5 0 011.94 0l7.5 6.363a1.5 1.5 0 01.53 1.144V19.5a1.5 1.5 0 01-1.5 1.5h-5.75a.75.75 0 01-.75-.75V14h-2v6.25a.75.75 0 01-.75.75H4.5A1.5 1.5 0 013 19.5v-9.403c0-.44.194-.859.53-1.144l7.5-6.363zM12 3.734l-7.5 6.363V19.5h5v-6.25a.75.75 0 01.75-.75h3.5a.75.75 0 01.75.75v6.25h5v-9.403L12 3.734z\"/>"},{"n":"guides","l":"Guides","c":false,"o":true,"i":[{"n":"build-guide","l":"Build Bliss​Rom"},{"n":"conclusion","l":"Conclusion"},{"n":"troubleshoot","l":"Troubleshoot"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 3.75A.75.75 0 01.75 3h7.497c1.566 0 2.945.8 3.751 2.014A4.496 4.496 0 0115.75 3h7.5a.75.75 0 01.75.75v15.063a.75.75 0 01-.755.75l-7.682-.052a3 3 0 00-2.142.878l-.89.891a.75.75 0 01-1.061 0l-.902-.901a3 3 0 00-2.121-.879H.75a.75.75 0 01-.75-.75v-15zm11.247 3.747a3 3 0 00-3-2.997H1.5V18h6.947a4.5 4.5 0 012.803.98l-.003-11.483zm1.503 11.485V7.5a3 3 0 013-3h6.75v13.558l-6.927-.047a4.5 4.5 0 00-2.823.971z\"/>"},{"n":"documentation","l":"Documentation","c":false,"o":true,"i":[{"n":"overlays","l":"Overlays"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 4.75C0 3.784.784 3 1.75 3h20.5c.966 0 1.75.784 1.75 1.75v14.5A1.75 1.75 0 0122.25 21H1.75A1.75 1.75 0 010 19.25V4.75zm1.75-.25a.25.25 0 00-.25.25v14.5c0 .138.112.25.25.25h20.5a.25.25 0 00.25-.25V4.75a.25.25 0 00-.25-.25H1.75z\"/><path fill-rule=\"evenodd\" d=\"M5 8.75A.75.75 0 015.75 8h11.5a.75.75 0 010 1.5H5.75A.75.75 0 015 8.75zm0 4a.75.75 0 01.75-.75h5.5a.75.75 0 010 1.5h-5.5a.75.75 0 01-.75-.75z\"/>"},{"n":"maintainers","l":"Maintainers","c":false,"o":true,"i":[{"n":"code_of_conduct","l":"Code of Conduct"},{"n":"requirements","l":"Requirements"}],"s":"<path fill-rule=\"evenodd\" d=\"M3.5 8a5.5 5.5 0 118.596 4.547 9.005 9.005 0 015.9 8.18.75.75 0 01-1.5.045 7.5 7.5 0 00-14.993 0 .75.75 0 01-1.499-.044 9.005 9.005 0 015.9-8.181A5.494 5.494 0 013.5 8zM9 4a4 4 0 100 8 4 4 0 000-8z\"/><path d=\"M17.29 8c-.148 0-.292.01-.434.03a.75.75 0 11-.212-1.484 4.53 4.53 0 013.38 8.097 6.69 6.69 0 013.956 6.107.75.75 0 01-1.5 0 5.193 5.193 0 00-3.696-4.972l-.534-.16v-1.676l.41-.209A3.03 3.03 0 0017.29 8z\"/>"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["/"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false}};
+var __DOCS_CONFIG__ = {"id":"42cO6lsHk2tatVa9JVd156XVLgRMuaNC9WN","key":"kEvwwfxCMsjn26FbgmNFzE4dNDUyAaZ/E9abTHUpL0Q.hiveyeE+HL9VClk2cMIgDQBB+re2NBXzCt2aToS5Z8dqSNNw1tTjYsD6GavcKJaBiDE6WYHoku9yliR4TepH3Q.8275","base":"/","host":"docs.blissroms.org","version":"1.0.0","useRelativePaths":true,"documentName":"index.html","appendDocumentName":false,"trailingSlash":true,"preloadSearch":false,"cacheBustingToken":"2.4.0.711209158506","cacheBustingStrategy":"query","sidebarFilterPlaceholder":"Filter","toolbarFilterPlaceholder":"Filter","showSidebarFilter":true,"filterNotFoundMsg":"No member names found containing the query \"{query}\"","maxHistoryItems":15,"homeIcon":"<path d=\"M12.97 2.59a1.5 1.5 0 00-1.94 92 0l-7.5 6.363A1.5 1.5 0 003 10.097V19.5A1.5 1.5 0 004.5 21h4.75a.75.75 0 00.75-.75V14h4v6.25c0 .414.336.75.75.75h4.75a1.5 1.5 0 001.5-1.5v-9.403a1.5 1.5 0 00-.53-1.144l-7.5-6.363z\"></path>","access":[{"value":"public","label":"Public"},{"value":"protected","label":"Protected"}],"toolbarLinks":[{"id":"fields","label":"Fields"},{"id":"properties","label":"Properties","shortLabel":"Props"},{"id":"methods","label":"Methods"},{"id":"events","label":"Events"}],"sidebar":[{"n":"/","l":"Welcome to Bliss​Roms"},{"n":"guides","l":"Guides","c":false,"o":true,"i":[{"n":"build-guide","l":"Build Bliss​Rom"},{"n":"conclusion","l":"Conclusion"},{"n":"troubleshoot","l":"Troubleshoot"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 3.75A.75.75 0 01.75 3h7.497c1.566 0 2.945.8 3.751 2.014A4.496 4.496 0 0115.75 3h7.5a.75.75 0 01.75.75v15.063a.75.75 0 01-.755.75l-7.682-.052a3 3 0 00-2.142.878l-.89.891a.75.75 0 01-1.061 0l-.902-.901a3 3 0 00-2.121-.879H.75a.75.75 0 01-.75-.75v-15zm11.247 3.747a3 3 0 00-3-2.997H1.5V18h6.947a4.5 4.5 0 012.803.98l-.003-11.483zm1.503 11.485V7.5a3 3 0 013-3h6.75v13.558l-6.927-.047a4.5 4.5 0 00-2.823.971z\"/>"},{"n":"documentation","l":"Documentation","c":false,"o":true,"i":[{"n":"overlays","l":"Overlays"}],"s":"<path fill-rule=\"evenodd\" d=\"M0 4.75C0 3.784.784 3 1.75 3h20.5c.966 0 1.75.784 1.75 1.75v14.5A1.75 1.75 0 0122.25 21H1.75A1.75 1.75 0 010 19.25V4.75zm1.75-.25a.25.25 0 00-.25.25v14.5c0 .138.112.25.25.25h20.5a.25.25 0 00.25-.25V4.75a.25.25 0 00-.25-.25H1.75z\"/><path fill-rule=\"evenodd\" d=\"M5 8.75A.75.75 0 015.75 8h11.5a.75.75 0 010 1.5H5.75A.75.75 0 015 8.75zm0 4a.75.75 0 01.75-.75h5.5a.75.75 0 010 1.5h-5.5a.75.75 0 01-.75-.75z\"/>"},{"n":"maintainers","l":"Maintainers","c":false,"o":true,"i":[{"n":"code_of_conduct","l":"Code of Conduct"},{"n":"requirements","l":"Requirements"}],"s":"<path fill-rule=\"evenodd\" d=\"M3.5 8a5.5 5.5 0 118.596 4.547 9.005 9.005 0 015.9 8.18.75.75 0 01-1.5.045 7.5 7.5 0 00-14.993 0 .75.75 0 01-1.499-.044 9.005 9.005 0 015.9-8.181A5.494 5.494 0 013.5 8zM9 4a4 4 0 100 8 4 4 0 000-8z\"/><path d=\"M17.29 8c-.148 0-.292.01-.434.03a.75.75 0 11-.212-1.484 4.53 4.53 0 013.38 8.097 6.69 6.69 0 013.956 6.107.75.75 0 01-1.5 0 5.193 5.193 0 00-3.696-4.972l-.534-.16v-1.676l.41-.209A3.03 3.03 0 0017.29 8z\"/>"}],"search":{"mode":0,"minChars":2,"maxResults":20,"placeholder":"Search","hotkeys":["/"],"noResultsFoundMsg":"Sorry, no results found.","recognizeLanguages":true,"languages":[0],"preload":false}};
diff --git a/resources/js/lunr.js b/resources/js/lunr.js
index c020ab0..190227e 100644
--- a/resources/js/lunr.js
+++ b/resources/js/lunr.js
@@ -1,4 +1,4 @@
-/*! Retype v2.3.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
+/*! Retype v2.4.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
 
 /*! For license information please see lunr.js.LICENSE.txt */
 (()=>{var e={1336:(e,t,r)=>{var i,n;!function(){var s,o,a,u,l,c,h,d,f,p,y,m,g,x,v,w,Q,k,S,b,E,L,P,T,O,I,R=function(e){var t=new R.Builder;return t.pipeline.add(R.trimmer,R.stopWordFilter,R.stemmer),t.searchPipeline.add(R.stemmer),e.call(t,t),t.build()};R.version="2.3.9",R.utils={},R.utils.warn=(s=this,function(e){s.console&&console.warn&&console.warn(e)}),R.utils.asString=function(e){return null==e?"":e.toString()},R.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i<r.length;i++){var n=r[i],s=e[n];if(Array.isArray(s))t[n]=s.slice();else{if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s)throw new TypeError("clone is not deep and does not support nested objects");t[n]=s}}return t},R.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},R.FieldRef.joiner="/",R.FieldRef.fromString=function(e){var t=e.indexOf(R.FieldRef.joiner);if(-1===t)throw"malformed field ref string";var r=e.slice(0,t),i=e.slice(t+1);return new R.FieldRef(i,r,e)},R.FieldRef.prototype.toString=function(){return null==this._stringValue&&(this._stringValue=this.fieldName+R.FieldRef.joiner+this.docRef),this._stringValue},R.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var t=0;t<this.length;t++)this.elements[e[t]]=!0}else this.length=0},R.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},R.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},R.Set.prototype.contains=function(e){return!!this.elements[e]},R.Set.prototype.intersect=function(e){var t,r,i,n=[];if(e===R.Set.complete)return this;if(e===R.Set.empty)return e;this.length<e.length?(t=this,r=e):(t=e,r=this),i=Object.keys(t.elements);for(var s=0;s<i.length;s++){var o=i[s];o in r.elements&&n.push(o)}return new R.Set(n)},R.Set.prototype.union=function(e){return e===R.Set.complete?R.Set.complete:e===R.Set.empty?this:new R.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},R.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},R.Token=function(e,t){this.str=e||"",this.metadata=t||{}},R.Token.prototype.toString=function(){return this.str},R.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},R.Token.prototype.clone=function(e){return e=e||function(e){return e},new R.Token(e(this.str,this.metadata),this.metadata)},R.tokenizer=function(e,t){if(null==e||null==e)return[];if(Array.isArray(e))return e.map((function(e){return new R.Token(R.utils.asString(e).toLowerCase(),R.utils.clone(t))}));for(var r=e.toString().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;if(r.charAt(s).match(R.tokenizer.separator)||s==i){if(a>0){var u=R.utils.clone(t)||{};u.position=[o,a],u.index=n.length,n.push(new R.Token(r.slice(o,s),u))}o=s+1}}return n},R.tokenizer.separator=/[\s\-]+/,R.Pipeline=function(){this._stack=[]},R.Pipeline.registeredFunctions=Object.create(null),R.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&R.utils.warn("Overwriting existing registered function: "+t),e.label=t,R.Pipeline.registeredFunctions[e.label]=e},R.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||R.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},R.Pipeline.load=function(e){var t=new R.Pipeline;return e.forEach((function(e){var r=R.Pipeline.registeredFunctions[e];if(!r)throw new Error("Cannot load unregistered function: "+e);t.add(r)})),t},R.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach((function(e){R.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},R.Pipeline.prototype.after=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");r+=1,this._stack.splice(r,0,t)},R.Pipeline.prototype.before=function(e,t){R.Pipeline.warnIfFunctionNotRegistered(t);var r=this._stack.indexOf(e);if(-1==r)throw new Error("Cannot find existingFn");this._stack.splice(r,0,t)},R.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},R.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r<t;r++){for(var i=this._stack[r],n=[],s=0;s<e.length;s++){var o=i(e[s],s,e);if(null!=o&&""!==o)if(Array.isArray(o))for(var a=0;a<o.length;a++)n.push(o[a]);else n.push(o)}e=n}return e},R.Pipeline.prototype.runString=function(e,t){var r=new R.Token(e,t);return this.run([r]).map((function(e){return e.toString()}))},R.Pipeline.prototype.reset=function(){this._stack=[]},R.Pipeline.prototype.toJSON=function(){return this._stack.map((function(e){return R.Pipeline.warnIfFunctionNotRegistered(e),e.label}))},R.Vector=function(e){this._magnitude=0,this.elements=e||[]},R.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,r=this.elements.length/2,i=r-t,n=Math.floor(i/2),s=this.elements[2*n];i>1&&(s<e&&(t=n),s>e&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e||s>e?2*n:s<e?2*(n+1):void 0},R.Vector.prototype.insert=function(e,t){this.upsert(e,t,(function(){throw"duplicate index"}))},R.Vector.prototype.upsert=function(e,t,r){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=r(this.elements[i+1],t):this.elements.splice(i,0,e,t)},R.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,r=1;r<t;r+=2){var i=this.elements[r];e+=i*i}return this._magnitude=Math.sqrt(e)},R.Vector.prototype.dot=function(e){for(var t=0,r=this.elements,i=e.elements,n=r.length,s=i.length,o=0,a=0,u=0,l=0;u<n&&l<s;)(o=r[u])<(a=i[l])?u+=2:o>a?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},R.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},R.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t<this.elements.length;t+=2,r++)e[r]=this.elements[t];return e},R.Vector.prototype.toJSON=function(){return this.elements},R.stemmer=(o={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},a={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},u="[aeiouy]",l="[^aeiou][^aeiouy]*",c=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),h=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),d=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"),f=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"),p=/^(.+?)(ss|i)es$/,y=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,x=/.$/,v=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),Q=new RegExp("^"+l+u+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,S=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,b=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,E=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,L=/^(.+?)(s|t)(ion)$/,P=/^(.+?)e$/,T=/ll$/,O=new RegExp("^"+l+u+"[^aeiouwxy]$"),I=function(e){var t,r,i,n,s,u,l;if(e.length<3)return e;if("y"==(i=e.substr(0,1))&&(e=i.toUpperCase()+e.substr(1)),s=y,(n=p).test(e)?e=e.replace(n,"$1$2"):s.test(e)&&(e=e.replace(s,"$1$2")),s=g,(n=m).test(e)){var I=n.exec(e);(n=c).test(I[1])&&(n=x,e=e.replace(n,""))}else s.test(e)&&(t=(I=s.exec(e))[1],(s=f).test(t)&&(u=w,l=Q,(s=v).test(e=t)?e+="e":u.test(e)?(n=x,e=e.replace(n,"")):l.test(e)&&(e+="e")));return(n=k).test(e)&&(e=(t=(I=n.exec(e))[1])+"i"),(n=S).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+o[r])),(n=b).test(e)&&(t=(I=n.exec(e))[1],r=I[2],(n=c).test(t)&&(e=t+a[r])),s=L,(n=E).test(e)?(t=(I=n.exec(e))[1],(n=h).test(t)&&(e=t)):s.test(e)&&(t=(I=s.exec(e))[1]+I[2],(s=h).test(t)&&(e=t)),(n=P).test(e)&&(t=(I=n.exec(e))[1],s=d,u=O,((n=h).test(t)||s.test(t)&&!u.test(t))&&(e=t)),s=h,(n=T).test(e)&&s.test(e)&&(n=x,e=e.replace(n,"")),"y"==i&&(e=i.toLowerCase()+e.substr(1)),e},function(e){return e.update(I)}),R.Pipeline.registerFunction(R.stemmer,"stemmer"),R.generateStopWordFilter=function(e){var t=e.reduce((function(e,t){return e[t]=t,e}),{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},R.stopWordFilter=R.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),R.Pipeline.registerFunction(R.stopWordFilter,"stopWordFilter"),R.trimmer=function(e){return e.update((function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")}))},R.Pipeline.registerFunction(R.trimmer,"trimmer"),R.TokenSet=function(){this.final=!1,this.edges={},this.id=R.TokenSet._nextId,R.TokenSet._nextId+=1},R.TokenSet._nextId=1,R.TokenSet.fromArray=function(e){for(var t=new R.TokenSet.Builder,r=0,i=e.length;r<i;r++)t.insert(e[r]);return t.finish(),t.root},R.TokenSet.fromClause=function(e){return"editDistance"in e?R.TokenSet.fromFuzzyString(e.term,e.editDistance):R.TokenSet.fromString(e.term)},R.TokenSet.fromFuzzyString=function(e,t){for(var r=new R.TokenSet,i=[{node:r,editsRemaining:t,str:e}];i.length;){var n=i.pop();if(n.str.length>0){var s,o=n.str.charAt(0);o in n.node.edges?s=n.node.edges[o]:(s=new R.TokenSet,n.node.edges[o]=s),1==n.str.length&&(s.final=!0),i.push({node:s,editsRemaining:n.editsRemaining,str:n.str.slice(1)})}if(0!=n.editsRemaining){if("*"in n.node.edges)var a=n.node.edges["*"];else a=new R.TokenSet,n.node.edges["*"]=a;if(0==n.str.length&&(a.final=!0),i.push({node:a,editsRemaining:n.editsRemaining-1,str:n.str}),n.str.length>1&&i.push({node:n.node,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)}),1==n.str.length&&(n.node.final=!0),n.str.length>=1){if("*"in n.node.edges)var u=n.node.edges["*"];else u=new R.TokenSet,n.node.edges["*"]=u;1==n.str.length&&(u.final=!0),i.push({node:u,editsRemaining:n.editsRemaining-1,str:n.str.slice(1)})}if(n.str.length>1){var l,c=n.str.charAt(0),h=n.str.charAt(1);h in n.node.edges?l=n.node.edges[h]:(l=new R.TokenSet,n.node.edges[h]=l),1==n.str.length&&(l.final=!0),i.push({node:l,editsRemaining:n.editsRemaining-1,str:c+n.str.slice(2)})}}}return r},R.TokenSet.fromString=function(e){for(var t=new R.TokenSet,r=t,i=0,n=e.length;i<n;i++){var s=e[i],o=i==n-1;if("*"==s)t.edges[s]=t,t.final=o;else{var a=new R.TokenSet;a.final=o,t.edges[s]=a,t=a}}return r},R.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var r=t.pop(),i=Object.keys(r.node.edges),n=i.length;r.node.final&&(r.prefix.charAt(0),e.push(r.prefix));for(var s=0;s<n;s++){var o=i[s];t.push({prefix:r.prefix.concat(o),node:r.node.edges[o]})}}return e},R.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),r=t.length,i=0;i<r;i++){var n=t[i];e=e+n+this.edges[n].id}return e},R.TokenSet.prototype.intersect=function(e){for(var t=new R.TokenSet,r=void 0,i=[{qNode:e,output:t,node:this}];i.length;){r=i.pop();for(var n=Object.keys(r.qNode.edges),s=n.length,o=Object.keys(r.node.edges),a=o.length,u=0;u<s;u++)for(var l=n[u],c=0;c<a;c++){var h=o[c];if(h==l||"*"==l){var d=r.node.edges[h],f=r.qNode.edges[l],p=d.final&&f.final,y=void 0;h in r.output.edges?(y=r.output.edges[h]).final=y.final||p:((y=new R.TokenSet).final=p,r.output.edges[h]=y),i.push({qNode:f,output:y,node:d})}}}return t},R.TokenSet.Builder=function(){this.previousWord="",this.root=new R.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},R.TokenSet.Builder.prototype.insert=function(e){var t,r=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)r++;for(this.minimize(r),t=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child,i=r;i<e.length;i++){var n=new R.TokenSet,s=e[i];t.edges[s]=n,this.uncheckedNodes.push({parent:t,char:s,child:n}),t=n}t.final=!0,this.previousWord=e},R.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},R.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},R.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},R.Index.prototype.search=function(e){return this.query((function(t){new R.QueryParser(e,t).parse()}))},R.Index.prototype.query=function(e){for(var t=new R.Query(this.fields),r=Object.create(null),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=0;a<this.fields.length;a++)i[this.fields[a]]=new R.Vector;for(e.call(t,t),a=0;a<t.clauses.length;a++){var u,l=t.clauses[a],c=R.Set.empty;u=l.usePipeline?this.pipeline.runString(l.term,{fields:l.fields}):[l.term];for(var h=0;h<u.length;h++){var d=u[h];l.term=d;var f=R.TokenSet.fromClause(l),p=this.tokenSet.intersect(f).toArray();if(0===p.length&&l.presence===R.Query.presence.REQUIRED){for(var y=0;y<l.fields.length;y++)s[F=l.fields[y]]=R.Set.empty;break}for(var m=0;m<p.length;m++){var g=p[m],x=this.invertedIndex[g],v=x._index;for(y=0;y<l.fields.length;y++){var w=x[F=l.fields[y]],Q=Object.keys(w),k=g+"/"+F,S=new R.Set(Q);if(l.presence==R.Query.presence.REQUIRED&&(c=c.union(S),void 0===s[F]&&(s[F]=R.Set.complete)),l.presence!=R.Query.presence.PROHIBITED){if(i[F].upsert(v,l.boost,(function(e,t){return e+t})),!n[k]){for(var b=0;b<Q.length;b++){var E,L=Q[b],P=new R.FieldRef(L,F),T=w[L];void 0===(E=r[P])?r[P]=new R.MatchData(g,F,T):E.add(g,F,T)}n[k]=!0}}else void 0===o[F]&&(o[F]=R.Set.empty),o[F]=o[F].union(S)}}}if(l.presence===R.Query.presence.REQUIRED)for(y=0;y<l.fields.length;y++)s[F=l.fields[y]]=s[F].intersect(c)}var O=R.Set.complete,I=R.Set.empty;for(a=0;a<this.fields.length;a++){var F;s[F=this.fields[a]]&&(O=O.intersect(s[F])),o[F]&&(I=I.union(o[F]))}var _=Object.keys(r),N=[],j=Object.create(null);if(t.isNegated())for(_=Object.keys(this.fieldVectors),a=0;a<_.length;a++){P=_[a];var C=R.FieldRef.fromString(P);r[P]=new R.MatchData}for(a=0;a<_.length;a++){var D=(C=R.FieldRef.fromString(_[a])).docRef;if(O.contains(D)&&!I.contains(D)){var A,B=this.fieldVectors[C],z=i[C.fieldName].similarity(B);if(void 0!==(A=j[D]))A.score+=z,A.matchData.combine(r[C]);else{var V={ref:D,score:z,matchData:r[C]};j[D]=V,N.push(V)}}}return N.sort((function(e,t){return t.score-e.score}))},R.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map((function(e){return[e,this.invertedIndex[e]]}),this),t=Object.keys(this.fieldVectors).map((function(e){return[e,this.fieldVectors[e].toJSON()]}),this);return{version:R.version,fields:this.fields,fieldVectors:t,invertedIndex:e,pipeline:this.pipeline.toJSON()}},R.Index.load=function(e){var t={},r={},i=e.fieldVectors,n=Object.create(null),s=e.invertedIndex,o=new R.TokenSet.Builder,a=R.Pipeline.load(e.pipeline);e.version!=R.version&&R.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+R.version+"' does not match serialized index '"+e.version+"'");for(var u=0;u<i.length;u++){var l=(h=i[u])[0],c=h[1];r[l]=new R.Vector(c)}for(u=0;u<s.length;u++){var h,d=(h=s[u])[0],f=h[1];o.insert(d),n[d]=f}return o.finish(),t.fields=e.fields,t.fieldVectors=r,t.invertedIndex=n,t.tokenSet=o.root,t.pipeline=a,new R.Index(t)},R.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=R.tokenizer,this.pipeline=new R.Pipeline,this.searchPipeline=new R.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},R.Builder.prototype.ref=function(e){this._ref=e},R.Builder.prototype.field=function(e,t){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=t||{}},R.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},R.Builder.prototype.k1=function(e){this._k1=e},R.Builder.prototype.add=function(e,t){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=t||{},this.documentCount+=1;for(var n=0;n<i.length;n++){var s=i[n],o=this._fields[s].extractor,a=o?o(e):e[s],u=this.tokenizer(a,{fields:[s]}),l=this.pipeline.run(u),c=new R.FieldRef(r,s),h=Object.create(null);this.fieldTermFrequencies[c]=h,this.fieldLengths[c]=0,this.fieldLengths[c]+=l.length;for(var d=0;d<l.length;d++){var f=l[d];if(null==h[f]&&(h[f]=0),h[f]+=1,null==this.invertedIndex[f]){var p=Object.create(null);p._index=this.termIndex,this.termIndex+=1;for(var y=0;y<i.length;y++)p[i[y]]=Object.create(null);this.invertedIndex[f]=p}null==this.invertedIndex[f][s][r]&&(this.invertedIndex[f][s][r]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var g=this.metadataWhitelist[m],x=f.metadata[g];null==this.invertedIndex[f][s][r][g]&&(this.invertedIndex[f][s][r][g]=[]),this.invertedIndex[f][s][r][g].push(x)}}}},R.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),t=e.length,r={},i={},n=0;n<t;n++){var s=R.FieldRef.fromString(e[n]),o=s.fieldName;i[o]||(i[o]=0),i[o]+=1,r[o]||(r[o]=0),r[o]+=this.fieldLengths[s]}var a=Object.keys(this._fields);for(n=0;n<a.length;n++){var u=a[n];r[u]=r[u]/i[u]}this.averageFieldLength=r},R.Builder.prototype.createFieldVectors=function(){for(var e={},t=Object.keys(this.fieldTermFrequencies),r=t.length,i=Object.create(null),n=0;n<r;n++){for(var s=R.FieldRef.fromString(t[n]),o=s.fieldName,a=this.fieldLengths[s],u=new R.Vector,l=this.fieldTermFrequencies[s],c=Object.keys(l),h=c.length,d=this._fields[o].boost||1,f=this._documents[s.docRef].boost||1,p=0;p<h;p++){var y,m,g,x=c[p],v=l[x],w=this.invertedIndex[x]._index;void 0===i[x]?(y=R.idf(this.invertedIndex[x],this.documentCount),i[x]=y):y=i[x],m=y*((this._k1+1)*v)/(this._k1*(1-this._b+this._b*(a/this.averageFieldLength[o]))+v),m*=d,m*=f,g=Math.round(1e3*m)/1e3,u.insert(w,g)}e[s]=u}this.fieldVectors=e},R.Builder.prototype.createTokenSet=function(){this.tokenSet=R.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},R.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new R.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},R.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},R.MatchData=function(e,t,r){for(var i=Object.create(null),n=Object.keys(r||{}),s=0;s<n.length;s++){var o=n[s];i[o]=r[o].slice()}this.metadata=Object.create(null),void 0!==e&&(this.metadata[e]=Object.create(null),this.metadata[e][t]=i)},R.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),r=0;r<t.length;r++){var i=t[r],n=Object.keys(e.metadata[i]);null==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<n.length;s++){var o=n[s],a=Object.keys(e.metadata[i][o]);null==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var l=a[u];null==this.metadata[i][o][l]?this.metadata[i][o][l]=e.metadata[i][o][l]:this.metadata[i][o][l]=this.metadata[i][o][l].concat(e.metadata[i][o][l])}}}},R.MatchData.prototype.add=function(e,t,r){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=r);if(t in this.metadata[e])for(var i=Object.keys(r),n=0;n<i.length;n++){var s=i[n];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(r[s]):this.metadata[e][t][s]=r[s]}else this.metadata[e][t]=r},R.Query=function(e){this.clauses=[],this.allFields=e},R.Query.wildcard=new String("*"),R.Query.wildcard.NONE=0,R.Query.wildcard.LEADING=1,R.Query.wildcard.TRAILING=2,R.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},R.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=R.Query.wildcard.NONE),e.wildcard&R.Query.wildcard.LEADING&&e.term.charAt(0)!=R.Query.wildcard&&(e.term="*"+e.term),e.wildcard&R.Query.wildcard.TRAILING&&e.term.slice(-1)!=R.Query.wildcard&&(e.term=e.term+"*"),"presence"in e||(e.presence=R.Query.presence.OPTIONAL),this.clauses.push(e),this},R.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=R.Query.presence.PROHIBITED)return!1;return!0},R.Query.prototype.term=function(e,t){if(Array.isArray(e))return e.forEach((function(e){this.term(e,R.utils.clone(t))}),this),this;var r=t||{};return r.term=e.toString(),this.clause(r),this},R.QueryParseError=function(e,t,r){this.name="QueryParseError",this.message=e,this.start=t,this.end=r},R.QueryParseError.prototype=new Error,R.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},R.QueryLexer.prototype.run=function(){for(var e=R.QueryLexer.lexText;e;)e=e(this)},R.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,r=this.pos,i=0;i<this.escapeCharPositions.length;i++)r=this.escapeCharPositions[i],e.push(this.str.slice(t,r)),t=r+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},R.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},R.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},R.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return R.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},R.QueryLexer.prototype.width=function(){return this.pos-this.start},R.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},R.QueryLexer.prototype.backup=function(){this.pos-=1},R.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=R.QueryLexer.EOS&&this.backup()},R.QueryLexer.prototype.more=function(){return this.pos<this.length},R.QueryLexer.EOS="EOS",R.QueryLexer.FIELD="FIELD",R.QueryLexer.TERM="TERM",R.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",R.QueryLexer.BOOST="BOOST",R.QueryLexer.PRESENCE="PRESENCE",R.QueryLexer.lexField=function(e){return e.backup(),e.emit(R.QueryLexer.FIELD),e.ignore(),R.QueryLexer.lexText},R.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(R.QueryLexer.TERM)),e.ignore(),e.more())return R.QueryLexer.lexText},R.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.EDIT_DISTANCE),R.QueryLexer.lexText},R.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(R.QueryLexer.BOOST),R.QueryLexer.lexText},R.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(R.QueryLexer.TERM)},R.QueryLexer.termSeparator=R.tokenizer.separator,R.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==R.QueryLexer.EOS)return R.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return R.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(R.QueryLexer.TERM),R.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(R.QueryLexer.PRESENCE),R.QueryLexer.lexText;if(t.match(R.QueryLexer.termSeparator))return R.QueryLexer.lexTerm}else e.escapeCharacter()}},R.QueryParser=function(e,t){this.lexer=new R.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},R.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=R.QueryParser.parseClause;e;)e=e(this);return this.query},R.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},R.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},R.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},R.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case R.QueryLexer.PRESENCE:return R.QueryParser.parsePresence;case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(r+=" with value '"+t.str+"'"),new R.QueryParseError(r,t.start,t.end)}},R.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=R.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=R.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+t.str+"'";throw new R.QueryParseError(r,t.start,t.end)}var i=e.peekLexeme();if(null==i)throw r="expecting term or field, found nothing",new R.QueryParseError(r,t.start,t.end);switch(i.type){case R.QueryLexer.FIELD:return R.QueryParser.parseField;case R.QueryLexer.TERM:return R.QueryParser.parseTerm;default:throw r="expecting term or field, found '"+i.type+"'",new R.QueryParseError(r,i.start,i.end)}}},R.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var r=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),i="unrecognised field '"+t.str+"', possible fields: "+r;throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.fields=[t.str];var n=e.peekLexeme();if(null==n)throw i="expecting term, found nothing",new R.QueryParseError(i,t.start,t.end);if(n.type===R.QueryLexer.TERM)return R.QueryParser.parseTerm;throw i="expecting term, found '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}},R.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(null!=r)switch(r.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new R.QueryParseError(i,r.start,r.end)}else e.nextClause()}},R.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.editDistance=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},R.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var r=parseInt(t.str,10);if(isNaN(r)){var i="boost must be numeric";throw new R.QueryParseError(i,t.start,t.end)}e.currentClause.boost=r;var n=e.peekLexeme();if(null!=n)switch(n.type){case R.QueryLexer.TERM:return e.nextClause(),R.QueryParser.parseTerm;case R.QueryLexer.FIELD:return e.nextClause(),R.QueryParser.parseField;case R.QueryLexer.EDIT_DISTANCE:return R.QueryParser.parseEditDistance;case R.QueryLexer.BOOST:return R.QueryParser.parseBoost;case R.QueryLexer.PRESENCE:return e.nextClause(),R.QueryParser.parsePresence;default:throw i="Unexpected lexeme type '"+n.type+"'",new R.QueryParseError(i,n.start,n.end)}else e.nextClause()}},void 0===(n="function"==typeof(i=function(){return R})?i.call(t,r,t,e):i)||(e.exports=n)}()}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{"use strict";r.r(i),r.d(i,{default:()=>s});var e=r(1336),t=r.n(e),n=function(){return n=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},n.apply(this,arguments)};const s={init:function(e){e(t())},createIndex:function(e){return t()((function(){var r=this;this.ref("id"),this.field("text"),t().multiLanguage&&t().languages&&this.use(t().multiLanguage.apply(t(),t().languages)),this.metadataWhitelist=["position"],this.pipeline.remove(t().stemmer),this.searchPipeline.remove(t().stemmer),e.forEach((function(e){r.add(n({id:e[0]},e[1]))}))}))},loadIndex:function(e){return t().multiLanguage&&t().languages&&t().multiLanguage.apply(t(),t().languages),t().Index.load(e)},query:function(e,r){return e.query((function(e){e.term(t().tokenizer(r),{boost:100,usePipeline:!0}),e.term(t().tokenizer(r),{boost:10,usePipeline:!1,wildcard:t().Query.wildcard.LEADING|t().Query.wildcard.TRAILING}),e.term(t().tokenizer(r),{boost:1,editDistance:1})}))}}})(),window.__DOCS_LUNR__=i})();
\ No newline at end of file
diff --git a/resources/js/retype.js b/resources/js/retype.js
index bc991da..52a4c01 100644
--- a/resources/js/retype.js
+++ b/resources/js/retype.js
@@ -1,4 +1,4 @@
-/*! Retype v2.3.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
+/*! Retype v2.4.0 | retype.com | Copyright 2022. Object.NET, Inc. All rights reserved. */
 
 /*! For license information please see retype.js.LICENSE.txt */
 (()=>{var e={6184:(e,t,n)=>{"use strict";n.d(t,{ry:()=>he,nP:()=>fe,BL:()=>pe,Vn:()=>me}),function(){if(void 0===window.Reflect||void 0===window.customElements||window.customElements.polyfillWrapFlushCallback)return;const e=HTMLElement;window.HTMLElement=function(){return Reflect.construct(e,[],this.constructor)},HTMLElement.prototype=e.prototype,HTMLElement.prototype.constructor=HTMLElement,Object.setPrototypeOf(HTMLElement,e)}(),function(e){function t(e,t,n){throw new e("Failed to execute 'requestSubmit' on 'HTMLFormElement': "+t+".",n)}"function"!=typeof e.requestSubmit&&(e.requestSubmit=function(e){e?(function(e,n){e instanceof HTMLElement||t(TypeError,"parameter 1 is not of type 'HTMLElement'"),"submit"==e.type||t(TypeError,"The specified element is not a submit button"),e.form==n||t(DOMException,"The specified element is not owned by this form element","NotFoundError")}(e,this),e.click()):((e=document.createElement("input")).type="submit",e.hidden=!0,this.appendChild(e),e.click(),this.removeChild(e))})}(HTMLFormElement.prototype);const r=new WeakMap;function o(e){const t=function(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null,n=t?t.closest("input, button"):null;return"submit"==(null==n?void 0:n.type)?n:null}(e.target);t&&t.form&&r.set(t.form,t)}var i,s,a,l,c,u;!function(){if("submitter"in Event.prototype)return;let e;if("SubmitEvent"in window&&/Apple Computer/.test(navigator.vendor))e=window.SubmitEvent.prototype;else{if("SubmitEvent"in window)return;e=window.Event.prototype}addEventListener("click",o,!0),Object.defineProperty(e,"submitter",{get(){if("submit"==this.type&&this.target instanceof HTMLFormElement)return r.get(this.target)}})}(),function(e){e.eager="eager",e.lazy="lazy"}(i||(i={}));class d extends HTMLElement{constructor(){super(),this.loaded=Promise.resolve(),this.delegate=new d.delegateConstructor(this)}static get observedAttributes(){return["disabled","loading","src"]}connectedCallback(){this.delegate.connect()}disconnectedCallback(){this.delegate.disconnect()}reload(){const{src:e}=this;this.src=null,this.src=e}attributeChangedCallback(e){"loading"==e?this.delegate.loadingStyleChanged():"src"==e?this.delegate.sourceURLChanged():this.delegate.disabledChanged()}get src(){return this.getAttribute("src")}set src(e){e?this.setAttribute("src",e):this.removeAttribute("src")}get loading(){return"lazy"===(this.getAttribute("loading")||"").toLowerCase()?i.lazy:i.eager}set loading(e){e?this.setAttribute("loading",e):this.removeAttribute("loading")}get disabled(){return this.hasAttribute("disabled")}set disabled(e){e?this.setAttribute("disabled",""):this.removeAttribute("disabled")}get autoscroll(){return this.hasAttribute("autoscroll")}set autoscroll(e){e?this.setAttribute("autoscroll",""):this.removeAttribute("autoscroll")}get complete(){return!this.delegate.isLoading}get isActive(){return this.ownerDocument===document&&!this.isPreview}get isPreview(){var e,t;return null===(t=null===(e=this.ownerDocument)||void 0===e?void 0:e.documentElement)||void 0===t?void 0:t.hasAttribute("data-turbo-preview")}}function f(e){return new URL(e.toString(),document.baseURI)}function h(e){let t;return e.hash?e.hash.slice(1):(t=e.href.match(/#(.*)$/))?t[1]:void 0}function p(e,t){return f((null==t?void 0:t.getAttribute("formaction"))||e.getAttribute("action")||e.action)}function m(e,t){return function(e,t){const n=function(e){return(t=e.origin+e.pathname).endsWith("/")?t:t+"/";var t}(t);return e.href===f(n).href||e.href.startsWith(n)}(e,t)&&!!(n=e,(function(e){return function(e){return e.pathname.split("/").slice(1)}(e).slice(-1)[0]}(n).match(/\.[^.]*$/)||[])[0]||"").match(/^(?:|\.(?:htm|html|xhtml))$/);var n}function v(e){const t=h(e);return null!=t?e.href.slice(0,-(t.length+1)):e.href}function g(e){return v(e)}class b{constructor(e){this.response=e}get succeeded(){return this.response.ok}get failed(){return!this.succeeded}get clientError(){return this.statusCode>=400&&this.statusCode<=499}get serverError(){return this.statusCode>=500&&this.statusCode<=599}get redirected(){return this.response.redirected}get location(){return f(this.response.url)}get isHTML(){return this.contentType&&this.contentType.match(/^(?:text\/([^\s;,]+\b)?html|application\/xhtml\+xml)\b/)}get statusCode(){return this.response.status}get contentType(){return this.header("Content-Type")}get responseText(){return this.response.clone().text()}get responseHTML(){return this.isHTML?this.response.clone().text():Promise.resolve(void 0)}header(e){return this.response.headers.get(e)}}function y(e,{target:t,cancelable:n,detail:r}={}){const o=new CustomEvent(e,{cancelable:n,bubbles:!0,detail:r});return t&&t.isConnected?t.dispatchEvent(o):document.documentElement.dispatchEvent(o),o}function w(){return new Promise((e=>requestAnimationFrame((()=>e()))))}function x(e=""){return(new DOMParser).parseFromString(e,"text/html")}function k(e,...t){const n=function(e,t){return e.reduce(((e,n,r)=>e+n+(null==t[r]?"":t[r])),"")}(e,t).replace(/^\n/,"").split("\n"),r=n[0].match(/^\s+/),o=r?r[0].length:0;return n.map((e=>e.slice(o))).join("\n")}function S(){return Array.apply(null,{length:36}).map(((e,t)=>8==t||13==t||18==t||23==t?"-":14==t?"4":19==t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16))).join("")}function E(e,...t){for(const n of t.map((t=>null==t?void 0:t.getAttribute(e))))if("string"==typeof n)return n;return null}function C(...e){for(const t of e)"turbo-frame"==t.localName&&t.setAttribute("busy",""),t.setAttribute("aria-busy","true")}function _(...e){for(const t of e)"turbo-frame"==t.localName&&t.removeAttribute("busy"),t.removeAttribute("aria-busy")}!function(e){e[e.get=0]="get",e[e.post=1]="post",e[e.put=2]="put",e[e.patch=3]="patch",e[e.delete=4]="delete"}(s||(s={}));class T{constructor(e,t,n,r=new URLSearchParams,o=null){this.abortController=new AbortController,this.resolveRequestPromise=e=>{},this.delegate=e,this.method=t,this.headers=this.defaultHeaders,this.body=r,this.url=n,this.target=o}get location(){return this.url}get params(){return this.url.searchParams}get entries(){return this.body?Array.from(this.body.entries()):[]}cancel(){this.abortController.abort()}async perform(){var e,t;const{fetchOptions:n}=this;null===(t=(e=this.delegate).prepareHeadersForRequest)||void 0===t||t.call(e,this.headers,this),await this.allowRequestToBeIntercepted(n);try{this.delegate.requestStarted(this);const e=await fetch(this.url.href,n);return await this.receive(e)}catch(e){if("AbortError"!==e.name)throw this.delegate.requestErrored(this,e),e}finally{this.delegate.requestFinished(this)}}async receive(e){const t=new b(e);return y("turbo:before-fetch-response",{cancelable:!0,detail:{fetchResponse:t},target:this.target}).defaultPrevented?this.delegate.requestPreventedHandlingResponse(this,t):t.succeeded?this.delegate.requestSucceededWithResponse(this,t):this.delegate.requestFailedWithResponse(this,t),t}get fetchOptions(){var e;return{method:s[this.method].toUpperCase(),credentials:"same-origin",headers:this.headers,redirect:"follow",body:this.isIdempotent?null:this.body,signal:this.abortSignal,referrer:null===(e=this.delegate.referrer)||void 0===e?void 0:e.href}}get defaultHeaders(){return{Accept:"text/html, application/xhtml+xml"}}get isIdempotent(){return this.method==s.get}get abortSignal(){return this.abortController.signal}async allowRequestToBeIntercepted(e){const t=new Promise((e=>this.resolveRequestPromise=e));y("turbo:before-fetch-request",{cancelable:!0,detail:{fetchOptions:e,url:this.url,resume:this.resolveRequestPromise},target:this.target}).defaultPrevented&&await t}}class O{constructor(e,t){this.started=!1,this.intersect=e=>{const t=e.slice(-1)[0];(null==t?void 0:t.isIntersecting)&&this.delegate.elementAppearedInViewport(this.element)},this.delegate=e,this.element=t,this.intersectionObserver=new IntersectionObserver(this.intersect)}start(){this.started||(this.started=!0,this.intersectionObserver.observe(this.element))}stop(){this.started&&(this.started=!1,this.intersectionObserver.unobserve(this.element))}}class L{constructor(e){this.templateElement=document.createElement("template"),this.templateElement.innerHTML=e}static wrap(e){return"string"==typeof e?new this(e):e}get fragment(){const e=document.createDocumentFragment();for(const t of this.foreignElements)e.appendChild(document.importNode(t,!0));return e}get foreignElements(){return this.templateChildren.reduce(((e,t)=>"turbo-stream"==t.tagName.toLowerCase()?[...e,t]:e),[])}get templateChildren(){return Array.from(this.templateElement.content.children)}}L.contentType="text/vnd.turbo-stream.html",function(e){e[e.initialized=0]="initialized",e[e.requesting=1]="requesting",e[e.waiting=2]="waiting",e[e.receiving=3]="receiving",e[e.stopping=4]="stopping",e[e.stopped=5]="stopped"}(a||(a={})),function(e){e.urlEncoded="application/x-www-form-urlencoded",e.multipart="multipart/form-data",e.plain="text/plain"}(l||(l={}));class R{constructor(e,t,n,r=!1){this.state=a.initialized,this.delegate=e,this.formElement=t,this.submitter=n,this.formData=function(e,t){const n=new FormData(e),r=null==t?void 0:t.getAttribute("name"),o=null==t?void 0:t.getAttribute("value");return r&&null!=o&&n.get(r)!=o&&n.append(r,o),n}(t,n),this.location=f(this.action),this.method==s.get&&function(e,t){const n=new URLSearchParams;for(const[e,r]of t)r instanceof File||n.append(e,r);e.search=n.toString()}(this.location,[...this.body.entries()]),this.fetchRequest=new T(this,this.method,this.location,this.body,this.formElement),this.mustRedirect=r}static confirmMethod(e,t){return confirm(e)}get method(){var e;return function(e){switch(e.toLowerCase()){case"get":return s.get;case"post":return s.post;case"put":return s.put;case"patch":return s.patch;case"delete":return s.delete}}(((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formmethod"))||this.formElement.getAttribute("method")||"").toLowerCase())||s.get}get action(){var e;const t="string"==typeof this.formElement.action?this.formElement.action:null;return(null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formaction"))||this.formElement.getAttribute("action")||t||""}get body(){return this.enctype==l.urlEncoded||this.method==s.get?new URLSearchParams(this.stringFormData):this.formData}get enctype(){var e;return function(e){switch(e.toLowerCase()){case l.multipart:return l.multipart;case l.plain:return l.plain;default:return l.urlEncoded}}((null===(e=this.submitter)||void 0===e?void 0:e.getAttribute("formenctype"))||this.formElement.enctype)}get isIdempotent(){return this.fetchRequest.isIdempotent}get stringFormData(){return[...this.formData].reduce(((e,[t,n])=>e.concat("string"==typeof n?[[t,n]]:[])),[])}get confirmationMessage(){return this.formElement.getAttribute("data-turbo-confirm")}get needsConfirmation(){return null!==this.confirmationMessage}async start(){const{initialized:e,requesting:t}=a;if(!this.needsConfirmation||R.confirmMethod(this.confirmationMessage,this.formElement))return this.state==e?(this.state=t,this.fetchRequest.perform()):void 0}stop(){const{stopping:e,stopped:t}=a;if(this.state!=e&&this.state!=t)return this.state=e,this.fetchRequest.cancel(),!0}prepareHeadersForRequest(e,t){if(!t.isIdempotent){const t=function(e){if(null!=e){const t=(document.cookie?document.cookie.split("; "):[]).find((t=>t.startsWith(e)));if(t){const e=t.split("=").slice(1).join("=");return e?decodeURIComponent(e):void 0}}}(D("csrf-param"))||D("csrf-token");t&&(e["X-CSRF-Token"]=t),e.Accept=[L.contentType,e.Accept].join(", ")}}requestStarted(e){var t;this.state=a.waiting,null===(t=this.submitter)||void 0===t||t.setAttribute("disabled",""),y("turbo:submit-start",{target:this.formElement,detail:{formSubmission:this}}),this.delegate.formSubmissionStarted(this)}requestPreventedHandlingResponse(e,t){this.result={success:t.succeeded,fetchResponse:t}}requestSucceededWithResponse(e,t){if(t.clientError||t.serverError)this.delegate.formSubmissionFailedWithResponse(this,t);else if(this.requestMustRedirect(e)&&function(e){return 200==e.statusCode&&!e.redirected}(t)){const e=new Error("Form responses must redirect to another location");this.delegate.formSubmissionErrored(this,e)}else this.state=a.receiving,this.result={success:!0,fetchResponse:t},this.delegate.formSubmissionSucceededWithResponse(this,t)}requestFailedWithResponse(e,t){this.result={success:!1,fetchResponse:t},this.delegate.formSubmissionFailedWithResponse(this,t)}requestErrored(e,t){this.result={success:!1,error:t},this.delegate.formSubmissionErrored(this,t)}requestFinished(e){var t;this.state=a.stopped,null===(t=this.submitter)||void 0===t||t.removeAttribute("disabled"),y("turbo:submit-end",{target:this.formElement,detail:Object.assign({formSubmission:this},this.result)}),this.delegate.formSubmissionFinished(this)}requestMustRedirect(e){return!e.isIdempotent&&this.mustRedirect}}function D(e){const t=document.querySelector(`meta[name="${e}"]`);return t&&t.content}class A{constructor(e){this.element=e}get children(){return[...this.element.children]}hasAnchor(e){return null!=this.getElementForAnchor(e)}getElementForAnchor(e){return e?this.element.querySelector(`[id='${e}'], a[name='${e}']`):null}get isConnected(){return this.element.isConnected}get firstAutofocusableElement(){return this.element.querySelector("[autofocus]")}get permanentElements(){return[...this.element.querySelectorAll("[id][data-turbo-permanent]")]}getPermanentElementById(e){return this.element.querySelector(`#${e}[data-turbo-permanent]`)}getPermanentElementMapForSnapshot(e){const t={};for(const n of this.permanentElements){const{id:r}=n,o=e.getPermanentElementById(r);o&&(t[r]=[n,o])}return t}}class I{constructor(e,t){this.submitBubbled=e=>{const t=e.target;if(!e.defaultPrevented&&t instanceof HTMLFormElement&&t.closest("turbo-frame, html")==this.element){const n=e.submitter||void 0;"dialog"!=((null==n?void 0:n.getAttribute("formmethod"))||t.method)&&this.delegate.shouldInterceptFormSubmission(t,n)&&(e.preventDefault(),e.stopImmediatePropagation(),this.delegate.formSubmissionIntercepted(t,n))}},this.delegate=e,this.element=t}start(){this.element.addEventListener("submit",this.submitBubbled)}stop(){this.element.removeEventListener("submit",this.submitBubbled)}}class M{constructor(e,t){this.resolveRenderPromise=e=>{},this.resolveInterceptionPromise=e=>{},this.delegate=e,this.element=t}scrollToAnchor(e){const t=this.snapshot.getElementForAnchor(e);t?(this.scrollToElement(t),this.focusElement(t)):this.scrollToPosition({x:0,y:0})}scrollToAnchorFromLocation(e){this.scrollToAnchor(h(e))}scrollToElement(e){e.scrollIntoView()}focusElement(e){e instanceof HTMLElement&&(e.hasAttribute("tabindex")?e.focus():(e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")))}scrollToPosition({x:e,y:t}){this.scrollRoot.scrollTo(e,t)}scrollToTop(){this.scrollToPosition({x:0,y:0})}get scrollRoot(){return window}async render(e){const{isPreview:t,shouldRender:n,newSnapshot:r}=e;if(n)try{this.renderPromise=new Promise((e=>this.resolveRenderPromise=e)),this.renderer=e,this.prepareToRenderSnapshot(e);const n=new Promise((e=>this.resolveInterceptionPromise=e));this.delegate.allowsImmediateRender(r,this.resolveInterceptionPromise)||await n,await this.renderSnapshot(e),this.delegate.viewRenderedSnapshot(r,t),this.finishRenderingSnapshot(e)}finally{delete this.renderer,this.resolveRenderPromise(void 0),delete this.renderPromise}else this.invalidate()}invalidate(){this.delegate.viewInvalidated()}prepareToRenderSnapshot(e){this.markAsPreview(e.isPreview),e.prepareToRender()}markAsPreview(e){e?this.element.setAttribute("data-turbo-preview",""):this.element.removeAttribute("data-turbo-preview")}async renderSnapshot(e){await e.render()}finishRenderingSnapshot(e){e.finishRendering()}}class F extends M{invalidate(){this.element.innerHTML=""}get snapshot(){return new A(this.element)}}class P{constructor(e,t){this.clickBubbled=e=>{this.respondsToEventTarget(e.target)?this.clickEvent=e:delete this.clickEvent},this.linkClicked=e=>{this.clickEvent&&this.respondsToEventTarget(e.target)&&e.target instanceof Element&&this.delegate.shouldInterceptLinkClick(e.target,e.detail.url)&&(this.clickEvent.preventDefault(),e.preventDefault(),this.delegate.linkClickIntercepted(e.target,e.detail.url)),delete this.clickEvent},this.willVisit=()=>{delete this.clickEvent},this.delegate=e,this.element=t}start(){this.element.addEventListener("click",this.clickBubbled),document.addEventListener("turbo:click",this.linkClicked),document.addEventListener("turbo:before-visit",this.willVisit)}stop(){this.element.removeEventListener("click",this.clickBubbled),document.removeEventListener("turbo:click",this.linkClicked),document.removeEventListener("turbo:before-visit",this.willVisit)}respondsToEventTarget(e){const t=e instanceof Element?e:e instanceof Node?e.parentElement:null;return t&&t.closest("turbo-frame, html")==this.element}}class H{constructor(e,t,n,r=!0){this.currentSnapshot=e,this.newSnapshot=t,this.isPreview=n,this.willRender=r,this.promise=new Promise(((e,t)=>this.resolvingFunctions={resolve:e,reject:t}))}get shouldRender(){return!0}prepareToRender(){}finishRendering(){this.resolvingFunctions&&(this.resolvingFunctions.resolve(),delete this.resolvingFunctions)}createScriptElement(e){if("false"==e.getAttribute("data-turbo-eval"))return e;{const t=document.createElement("script");return this.cspNonce&&(t.nonce=this.cspNonce),t.textContent=e.textContent,t.async=!1,function(e,t){for(const{name:n,value:r}of[...t.attributes])e.setAttribute(n,r)}(t,e),t}}preservingPermanentElements(e){(class{constructor(e){this.permanentElementMap=e}static preservingPermanentElements(e,t){const n=new this(e);n.enter(),t(),n.leave()}enter(){for(const e in this.permanentElementMap){const[,t]=this.permanentElementMap[e];this.replaceNewPermanentElementWithPlaceholder(t)}}leave(){for(const e in this.permanentElementMap){const[t]=this.permanentElementMap[e];this.replaceCurrentPermanentElementWithClone(t),this.replacePlaceholderWithPermanentElement(t)}}replaceNewPermanentElementWithPlaceholder(e){const t=function(e){const t=document.createElement("meta");return t.setAttribute("name","turbo-permanent-placeholder"),t.setAttribute("content",e.id),t}(e);e.replaceWith(t)}replaceCurrentPermanentElementWithClone(e){const t=e.cloneNode(!0);e.replaceWith(t)}replacePlaceholderWithPermanentElement(e){const t=this.getPlaceholderById(e.id);null==t||t.replaceWith(e)}getPlaceholderById(e){return this.placeholders.find((t=>t.content==e))}get placeholders(){return[...document.querySelectorAll("meta[name=turbo-permanent-placeholder][content]")]}}).preservingPermanentElements(this.permanentElementMap,e)}focusFirstAutofocusableElement(){const e=this.connectedSnapshot.firstAutofocusableElement;(function(e){return e&&"function"==typeof e.focus})(e)&&e.focus()}get connectedSnapshot(){return this.newSnapshot.isConnected?this.newSnapshot:this.currentSnapshot}get currentElement(){return this.currentSnapshot.element}get newElement(){return this.newSnapshot.element}get permanentElementMap(){return this.currentSnapshot.getPermanentElementMapForSnapshot(this.newSnapshot)}get cspNonce(){var e;return null===(e=document.head.querySelector('meta[name="csp-nonce"]'))||void 0===e?void 0:e.getAttribute("content")}}class N extends H{get shouldRender(){return!0}async render(){await w(),this.preservingPermanentElements((()=>{this.loadFrameElement()})),this.scrollFrameIntoView(),await w(),this.focusFirstAutofocusableElement(),await w(),this.activateScriptElements()}loadFrameElement(){var e;const t=document.createRange();t.selectNodeContents(this.currentElement),t.deleteContents();const n=this.newElement,r=null===(e=n.ownerDocument)||void 0===e?void 0:e.createRange();r&&(r.selectNodeContents(n),this.currentElement.appendChild(r.extractContents()))}scrollFrameIntoView(){if(this.currentElement.autoscroll||this.newElement.autoscroll){const t=this.currentElement.firstElementChild,n=("end","end"==(e=this.currentElement.getAttribute("data-autoscroll-block"))||"start"==e||"center"==e||"nearest"==e?e:"end");if(t)return t.scrollIntoView({block:n}),!0}var e;return!1}activateScriptElements(){for(const e of this.newScriptElements){const t=this.createScriptElement(e);e.replaceWith(t)}}get newScriptElements(){return this.currentElement.querySelectorAll("script")}}class j{constructor(){this.hiding=!1,this.value=0,this.visible=!1,this.trickle=()=>{this.setValue(this.value+Math.random()/100)},this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement(),this.installStylesheetElement(),this.setValue(0)}static get defaultCSS(){return k`
@@ -24,4 +24,4 @@
 
         ——
         Suppress this warning by adding a "data-turbo-suppress-warning" attribute to: %s
-      `,e.outerHTML)})(),window.Turbo=ve,pe()},2262:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>i,qq:()=>y,Fl:()=>Ge,ZM:()=>qe,cE:()=>x,B:()=>s,nZ:()=>l,X3:()=>Te,PG:()=>Ee,$y:()=>Ce,dq:()=>Me,yT:()=>_e,Xl:()=>Le,EB:()=>c,Jd:()=>C,WL:()=>ze,qj:()=>ye,OT:()=>xe,iH:()=>Fe,lk:()=>_,Um:()=>we,YS:()=>ke,XI:()=>Pe,sT:()=>k,IU:()=>Oe,Vh:()=>Ze,BK:()=>$e,j:()=>T,X$:()=>L,oR:()=>je,SU:()=>We});var r=n(3577);let o;class i{constructor(e=!1){this.active=!0,this.effects=[],this.cleanups=[],!e&&o&&(this.parent=o,this.index=(o.scopes||(o.scopes=[])).push(this)-1)}run(e){if(this.active)try{return o=this,e()}finally{o=this.parent}}on(){o=this}off(){o=this.parent}stop(e){if(this.active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.active=!1}}}function s(e){return new i(e)}function a(e,t=o){t&&t.active&&t.effects.push(e)}function l(){return o}function c(e){o&&o.cleanups.push(e)}const u=e=>{const t=new Set(e);return t.w=0,t.n=0,t},d=e=>(e.w&v)>0,f=e=>(e.n&v)>0,h=new WeakMap;let p,m=0,v=1;const g=Symbol(""),b=Symbol("");class y{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,a(this,n)}run(){if(!this.active)return this.fn();let e=p,t=S;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=p,p=this,S=!0,v=1<<++m,m<=30?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=v})(this):w(this),this.fn()}finally{m<=30&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];d(o)&&!f(o)?o.delete(e):t[n++]=o,o.w&=~v,o.n&=~v}t.length=n}})(this),v=1<<--m,p=this.parent,S=t,this.parent=void 0}}stop(){this.active&&(w(this),this.onStop&&this.onStop(),this.active=!1)}}function w(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function x(e,t){e.effect&&(e=e.effect.fn);const n=new y(e);t&&((0,r.l7)(n,t),t.scope&&a(n,t.scope)),t&&t.lazy||n.run();const o=n.run.bind(n);return o.effect=n,o}function k(e){e.effect.stop()}let S=!0;const E=[];function C(){E.push(S),S=!1}function _(){const e=E.pop();S=void 0===e||e}function T(e,t,n){if(S&&p){let t=h.get(e);t||h.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=u()),O(r)}}function O(e,t){let n=!1;m<=30?f(e)||(e.n|=v,n=!d(e)):n=!e.has(p),n&&(e.add(p),p.deps.push(e))}function L(e,t,n,o,i,s){const a=h.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&(0,r.kJ)(e))a.forEach(((e,t)=>{("length"===t||t>=o)&&l.push(e)}));else switch(void 0!==n&&l.push(a.get(n)),t){case"add":(0,r.kJ)(e)?(0,r.S0)(n)&&l.push(a.get("length")):(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"delete":(0,r.kJ)(e)||(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"set":(0,r._N)(e)&&l.push(a.get(g))}if(1===l.length)l[0]&&R(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);R(u(e))}}function R(e,t){for(const t of(0,r.kJ)(e)?e:[...e])(t!==p||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}const D=(0,r.fY)("__proto__,__v_isRef,__isVue"),A=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(r.yk)),I=j(),M=j(!1,!0),F=j(!0),P=j(!0,!0),H=N();function N(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Oe(this);for(let e=0,t=this.length;e<t;e++)T(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(Oe)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){C();const n=Oe(this)[t].apply(this,e);return _(),n}})),e}function j(e=!1,t=!1){return function(n,o,i){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_isShallow"===o)return t;if("__v_raw"===o&&i===(e?t?be:ge:t?ve:me).get(n))return n;const s=(0,r.kJ)(n);if(!e&&s&&(0,r.RI)(H,o))return Reflect.get(H,o,i);const a=Reflect.get(n,o,i);return((0,r.yk)(o)?A.has(o):D(o))?a:(e||T(n,0,o),t?a:Me(a)?s&&(0,r.S0)(o)?a:a.value:(0,r.Kn)(a)?e?xe(a):ye(a):a)}}const W=z(),B=z(!0);function z(e=!1){return function(t,n,o,i){let s=t[n];if(Ce(s)&&Me(s)&&!Me(o))return!1;if(!e&&!Ce(o)&&(_e(o)||(o=Oe(o),s=Oe(s)),!(0,r.kJ)(t)&&Me(s)&&!Me(o)))return s.value=o,!0;const a=(0,r.kJ)(t)&&(0,r.S0)(n)?Number(n)<t.length:(0,r.RI)(t,n),l=Reflect.set(t,n,o,i);return t===Oe(i)&&(a?(0,r.aU)(o,s)&&L(t,"set",n,o):L(t,"add",n,o)),l}}const V={get:I,set:W,deleteProperty:function(e,t){const n=(0,r.RI)(e,t),o=(e[t],Reflect.deleteProperty(e,t));return o&&n&&L(e,"delete",t,void 0),o},has:function(e,t){const n=Reflect.has(e,t);return(0,r.yk)(t)&&A.has(t)||T(e,0,t),n},ownKeys:function(e){return T(e,0,(0,r.kJ)(e)?"length":g),Reflect.ownKeys(e)}},q={get:F,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},$=(0,r.l7)({},V,{get:M,set:B}),U=(0,r.l7)({},q,{get:P}),Z=e=>e,Y=e=>Reflect.getPrototypeOf(e);function G(e,t,n=!1,r=!1){const o=Oe(e=e.__v_raw),i=Oe(t);t!==i&&!n&&T(o,0,t),!n&&T(o,0,i);const{has:s}=Y(o),a=r?Z:n?De:Re;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function J(e,t=!1){const n=this.__v_raw,r=Oe(n),o=Oe(e);return e!==o&&!t&&T(r,0,e),!t&&T(r,0,o),e===o?n.has(e):n.has(e)||n.has(o)}function K(e,t=!1){return e=e.__v_raw,!t&&T(Oe(e),0,g),Reflect.get(e,"size",e)}function X(e){e=Oe(e);const t=Oe(this);return Y(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function Q(e,t){t=Oe(t);const n=Oe(this),{has:o,get:i}=Y(n);let s=o.call(n,e);s||(e=Oe(e),s=o.call(n,e));const a=i.call(n,e);return n.set(e,t),s?(0,r.aU)(t,a)&&L(n,"set",e,t):L(n,"add",e,t),this}function ee(e){const t=Oe(this),{has:n,get:r}=Y(t);let o=n.call(t,e);o||(e=Oe(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&L(t,"delete",e,void 0),i}function te(){const e=Oe(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function ne(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Oe(i),a=t?Z:e?De:Re;return!e&&T(s,0,g),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function re(e,t,n){return function(...o){const i=this.__v_raw,s=Oe(i),a=(0,r._N)(s),l="entries"===e||e===Symbol.iterator&&a,c="keys"===e&&a,u=i[e](...o),d=n?Z:t?De:Re;return!t&&T(s,0,c?b:g),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function oe(e){return function(...t){return"delete"!==e&&this}}function ie(){const e={get(e){return G(this,e)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!1)},t={get(e){return G(this,e,!1,!0)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!0)},n={get(e){return G(this,e,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!1)},r={get(e){return G(this,e,!0,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=re(o,!1,!1),n[o]=re(o,!0,!1),t[o]=re(o,!1,!0),r[o]=re(o,!0,!0)})),[e,n,t,r]}const[se,ae,le,ce]=ie();function ue(e,t){const n=t?e?ce:le:e?ae:se;return(t,o,i)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.RI)(n,o)&&o in t?n:t,o,i)}const de={get:ue(!1,!1)},fe={get:ue(!1,!0)},he={get:ue(!0,!1)},pe={get:ue(!0,!0)},me=new WeakMap,ve=new WeakMap,ge=new WeakMap,be=new WeakMap;function ye(e){return Ce(e)?e:Se(e,!1,V,de,me)}function we(e){return Se(e,!1,$,fe,ve)}function xe(e){return Se(e,!0,q,he,ge)}function ke(e){return Se(e,!0,U,pe,be)}function Se(e,t,n,o,i){if(!(0,r.Kn)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,r.W7)(l));var l;if(0===a)return e;const c=new Proxy(e,2===a?o:n);return i.set(e,c),c}function Ee(e){return Ce(e)?Ee(e.__v_raw):!(!e||!e.__v_isReactive)}function Ce(e){return!(!e||!e.__v_isReadonly)}function _e(e){return!(!e||!e.__v_isShallow)}function Te(e){return Ee(e)||Ce(e)}function Oe(e){const t=e&&e.__v_raw;return t?Oe(t):e}function Le(e){return(0,r.Nj)(e,"__v_skip",!0),e}const Re=e=>(0,r.Kn)(e)?ye(e):e,De=e=>(0,r.Kn)(e)?xe(e):e;function Ae(e){S&&p&&O((e=Oe(e)).dep||(e.dep=u()))}function Ie(e,t){(e=Oe(e)).dep&&R(e.dep)}function Me(e){return!(!e||!0!==e.__v_isRef)}function Fe(e){return He(e,!1)}function Pe(e){return He(e,!0)}function He(e,t){return Me(e)?e:new Ne(e,t)}class Ne{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Oe(e),this._value=t?e:Re(e)}get value(){return Ae(this),this._value}set value(e){e=this.__v_isShallow?e:Oe(e),(0,r.aU)(e,this._rawValue)&&(this._rawValue=e,this._value=this.__v_isShallow?e:Re(e),Ie(this))}}function je(e){Ie(e)}function We(e){return Me(e)?e.value:e}const Be={get:(e,t,n)=>We(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Me(o)&&!Me(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ze(e){return Ee(e)?e:new Proxy(e,Be)}class Ve{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ae(this)),(()=>Ie(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function qe(e){return new Ve(e)}function $e(e){const t=(0,r.kJ)(e)?new Array(e.length):{};for(const n in e)t[n]=Ze(e,n);return t}class Ue{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}}function Ze(e,t,n){const r=e[t];return Me(r)?r:new Ue(e,t,n)}class Ye{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new y(e,(()=>{this._dirty||(this._dirty=!0,Ie(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Oe(this);return Ae(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function Ge(e,t,n=!1){let o,i;const s=(0,r.mf)(e);return s?(o=e,i=r.dG):(o=e.get,i=e.set),new Ye(o,i,s||!i,n)}Promise.resolve()},6252:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>r.Bj,qq:()=>r.qq,ZM:()=>r.ZM,cE:()=>r.cE,B:()=>r.B,nZ:()=>r.nZ,X3:()=>r.X3,PG:()=>r.PG,$y:()=>r.$y,dq:()=>r.dq,yT:()=>r.yT,Xl:()=>r.Xl,EB:()=>r.EB,WL:()=>r.WL,qj:()=>r.qj,OT:()=>r.OT,iH:()=>r.iH,Um:()=>r.Um,YS:()=>r.YS,XI:()=>r.XI,sT:()=>r.sT,IU:()=>r.IU,Vh:()=>r.Vh,BK:()=>r.BK,oR:()=>r.oR,SU:()=>r.SU,_A:()=>o._A,kC:()=>o.kC,C_:()=>o.C_,vs:()=>o.vs,j5:()=>o.j5,zw:()=>o.zw,hR:()=>o.hR,P$:()=>be,sv:()=>Yt,HY:()=>Ut,Ob:()=>Re,qG:()=>Gt,n4:()=>Q,lR:()=>Nt,xv:()=>Zt,$d:()=>u,KU:()=>c,Ho:()=>vn,ry:()=>xr,Fl:()=>tr,j4:()=>sn,kq:()=>yn,iD:()=>on,_:()=>hn,Eo:()=>Rt,p1:()=>ur,Us:()=>Lt,Nv:()=>_n,uE:()=>bn,Uk:()=>gn,Wm:()=>pn,RC:()=>Te,aZ:()=>Ce,Bz:()=>rr,WY:()=>or,MW:()=>nr,mW:()=>M,FN:()=>Nn,Q6:()=>Ee,F4:()=>mn,h:()=>fr,S3:()=>d,Mr:()=>mr,f3:()=>se,nQ:()=>gr,of:()=>Yn,lA:()=>an,u_:()=>cr,dG:()=>Sn,Y3:()=>C,dl:()=>Ae,wF:()=>We,Jd:()=>qe,Xn:()=>ze,se:()=>Ie,d1:()=>Ge,bv:()=>Be,bT:()=>Ye,Yq:()=>Ze,vl:()=>Ue,Ah:()=>$e,ic:()=>Ve,wg:()=>Xt,Cn:()=>$,JJ:()=>ie,dD:()=>q,qb:()=>L,Y1:()=>Zn,Ko:()=>Cn,WI:()=>Tn,up:()=>Wt,Q2:()=>Vt,LL:()=>zt,eq:()=>wr,U2:()=>we,qZ:()=>nn,ec:()=>H,nK:()=>Se,Uc:()=>hr,G:()=>yr,mx:()=>Ln,C3:()=>cn,l1:()=>ar,Zq:()=>pr,Rr:()=>sr,Y8:()=>ve,i8:()=>br,ZK:()=>s,YP:()=>de,m0:()=>ae,Rh:()=>le,yX:()=>ce,mv:()=>dr,w5:()=>Z,b9:()=>ir,wy:()=>bt,MX:()=>vr,HX:()=>U});var r=n(2262),o=n(3577);const i=[];function s(e,...t){(0,r.Jd)();const n=i.length?i[i.length-1].component:null,o=n&&n.appContext.config.warnHandler,s=function(){let e=i[i.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(o)c(o,n,11,[e+t.join(""),n&&n.proxy,s.map((({vnode:e})=>`at <${er(n,e.type)}>`)).join("\n"),s]);else{const n=[`[Vue warn]: ${e}`,...t];s.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${er(e.component,e.type,r)}`,i=">"+n;return e.props?[o,...a(e.props),i]:[o+i]}(e))})),t}(s)),console.warn(...n)}(0,r.lk)()}function a(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...l(n,e[n]))})),n.length>3&&t.push(" ..."),t}function l(e,t,n){return(0,o.HD)(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:(0,r.dq)(t)?(t=l(e,(0,r.IU)(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):(0,o.mf)(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=(0,r.IU)(t),n?t:[`${e}=`,t])}function c(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){d(e,t,n)}return o}function u(e,t,n,r){if((0,o.mf)(e)){const i=c(e,t,n,r);return i&&(0,o.tI)(i)&&i.catch((e=>{d(e,t,n)})),i}const i=[];for(let o=0;o<e.length;o++)i.push(u(e[o],t,n,r));return i}function d(e,t,n,r=!0){if(t&&t.vnode,t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void c(s,null,10,[e,o,i])}!function(e,t,n,r=!0){console.error(e)}(e,0,0,r)}let f=!1,h=!1;const p=[];let m=0;const v=[];let g=null,b=0;const y=[];let w=null,x=0;const k=Promise.resolve();let S=null,E=null;function C(e){const t=S||k;return e?t.then(this?e.bind(this):e):t}function _(e){p.length&&p.includes(e,f&&e.allowRecurse?m+1:m)||e===E||(null==e.id?p.push(e):p.splice(function(e){let t=m+1,n=p.length;for(;t<n;){const r=t+n>>>1;A(p[r])<e?t=r+1:n=r}return t}(e.id),0,e),T())}function T(){f||h||(h=!0,S=k.then(I))}function O(e,t,n,r){(0,o.kJ)(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?r+1:r)||n.push(e),T()}function L(e){O(e,w,y,x)}function R(e,t=null){if(v.length){for(E=t,g=[...new Set(v)],v.length=0,b=0;b<g.length;b++)g[b]();g=null,b=0,E=null,R(e,t)}}function D(e){if(y.length){const e=[...new Set(y)];if(y.length=0,w)return void w.push(...e);for(w=e,w.sort(((e,t)=>A(e)-A(t))),x=0;x<w.length;x++)w[x]();w=null,x=0}}const A=e=>null==e.id?1/0:e.id;function I(e){h=!1,f=!0,R(e),p.sort(((e,t)=>A(e)-A(t))),o.dG;try{for(m=0;m<p.length;m++){const e=p[m];e&&!1!==e.active&&c(e,null,14)}}finally{m=0,p.length=0,D(),f=!1,S=null,(p.length||v.length||y.length)&&I(e)}}new Set,new Map;let M,F=[],P=!1;function H(e,t){var n,r;M=e,M?(M.enabled=!0,F.forEach((({event:e,args:t})=>M.emit(e,...t))),F=[]):"undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{H(e,t)})),setTimeout((()=>{M||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,P=!0,F=[])}),3e3)):(P=!0,F=[])}function N(e,t,...n){const r=e.vnode.props||o.kT;let i=n;const s=t.startsWith("update:"),a=s&&t.slice(7);if(a&&a in r){const e=`${"modelValue"===a?"model":a}Modifiers`,{number:t,trim:s}=r[e]||o.kT;s?i=n.map((e=>e.trim())):t&&(i=n.map(o.He))}let l,c=r[l=(0,o.hR)(t)]||r[l=(0,o.hR)((0,o._A)(t))];!c&&s&&(c=r[l=(0,o.hR)((0,o.rs)(t))]),c&&u(c,e,6,i);const d=r[l+"Once"];if(d){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,u(d,e,6,i)}}function j(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(void 0!==i)return i;const s=e.emits;let a={},l=!1;if(!(0,o.mf)(e)){const r=e=>{const n=j(e,t,!0);n&&(l=!0,(0,o.l7)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||l?((0,o.kJ)(s)?s.forEach((e=>a[e]=null)):(0,o.l7)(a,s),r.set(e,a),a):(r.set(e,null),null)}function W(e,t){return!(!e||!(0,o.F7)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.RI)(e,t[0].toLowerCase()+t.slice(1))||(0,o.RI)(e,(0,o.rs)(t))||(0,o.RI)(e,t))}let B=null,z=null;function V(e){const t=B;return B=e,z=e&&e.type.__scopeId||null,t}function q(e){z=e}function $(){z=null}const U=e=>Z;function Z(e,t=B,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&nn(-1);const o=V(t),i=e(...n);return V(o),r._d&&nn(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function Y(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[a],slots:l,attrs:c,emit:u,render:f,renderCache:h,data:p,setupState:m,ctx:v,inheritAttrs:g}=e;let b,y;const w=V(e);try{if(4&n.shapeFlag){const e=i||r;b=wn(f.call(e,e,h,s,m,p,v)),y=c}else{const e=t;b=wn(e.length>1?e(s,{attrs:c,slots:l,emit:u}):e(s,null)),y=t.props?c:G(c)}}catch(t){Jt.length=0,d(t,e,1),b=pn(Yt)}let x=b;if(y&&!1!==g){const e=Object.keys(y),{shapeFlag:t}=x;e.length&&7&t&&(a&&e.some(o.tR)&&(y=J(y,a)),x=vn(x,y))}return n.dirs&&(x.dirs=x.dirs?x.dirs.concat(n.dirs):n.dirs),n.transition&&(x.transition=n.transition),b=x,V(w),b}const G=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,o.F7)(n))&&((t||(t={}))[n]=e[n]);return t},J=(e,t)=>{const n={};for(const r in e)(0,o.tR)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function K(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!W(n,i))return!0}return!1}function X({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Q={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,c){null==e?function(e,t,n,r,o,i,s,a,l){const{p:c,o:{createElement:u}}=l,d=u("div"),f=e.suspense=te(e,o,r,t,d,n,i,s,a,l);c(null,f.pendingBranch=e.ssContent,d,null,r,f,i,s),f.deps>0?(ee(e,"onPending"),ee(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,s),oe(f,e.ssFallback)):f.resolve()}(t,n,r,o,i,s,a,l,c):function(e,t,n,r,o,i,s,a,{p:l,um:c,o:{createElement:u}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,ln(f,m)?(l(m,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(l(p,h,n,r,o,null,i,s,a),oe(d,h))):(d.pendingId++,g?(d.isHydrating=!1,d.activeBranch=m):c(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),v?(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(p,h,n,r,o,null,i,s,a),oe(d,h))):p&&ln(f,p)?(l(p,f,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(p&&ln(f,p))l(p,f,n,r,o,d,i,s,a),oe(d,f);else if(ee(t,"onPending"),d.pendingBranch=f,d.pendingId++,l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(h)}),e):0===e&&d.fallback(h)}}(e,t,n,r,o,s,a,l,c)},hydrate:function(e,t,n,r,o,i,s,a,l){const c=t.suspense=te(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,i,s);return 0===c.deps&&c.resolve(),u},create:te,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=ne(r?n.default:n),e.ssFallback=r?ne(n.fallback):pn(Yt)}};function ee(e,t){const n=e.props&&e.props[t];(0,o.mf)(n)&&n()}function te(e,t,n,r,i,s,a,l,c,u,f=!1){const{p:h,m:p,um:m,n:v,o:{parentNode:g,remove:b}}=u,y=(0,o.He)(e.props&&e.props.timeout),w={vnode:e,parent:t,parentComponent:n,isSVG:a,container:r,hiddenContainer:i,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof y?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:a}=w;if(w.isHydrating)w.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===w.pendingId&&p(r,a,t,0)});let{anchor:t}=w;n&&(t=v(n),m(n,s,w,!0)),e||p(r,a,t,0)}oe(w,r),w.pendingBranch=null,w.isInFallback=!1;let l=w.parent,c=!1;for(;l;){if(l.pendingBranch){l.effects.push(...i),c=!0;break}l=l.parent}c||L(i),w.effects=[],ee(t,"onResolve")},fallback(e){if(!w.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=w;ee(t,"onFallback");const s=v(n),a=()=>{w.isInFallback&&(h(null,e,o,s,r,null,i,l,c),oe(w,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=a),w.isInFallback=!0,m(n,r,null,!0),u||a()},move(e,t,n){w.activeBranch&&p(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&v(w.activeBranch),registerDep(e,t){const n=!!w.pendingBranch;n&&w.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{d(t,e,0)})).then((o=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Un(e,o,!1),r&&(i.el=r);const s=!r&&e.subTree.el;t(e,i,g(r||e.subTree.el),r?null:v(e.subTree),w,a,c),s&&b(s),X(e,i.el),n&&0==--w.deps&&w.resolve()}))},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&m(w.activeBranch,n,e,t),w.pendingBranch&&m(w.pendingBranch,n,e,t)}};return w}function ne(e){let t;if((0,o.mf)(e)){const n=tn&&e._c;n&&(e._d=!1,Xt()),e=e(),n&&(e._d=!0,t=Kt,Qt())}if((0,o.kJ)(e)){const t=function(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!an(r))return;if(r.type!==Yt||"v-if"===r.children){if(t)return;t=r}}return t}(e);e=t}return e=wn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function re(e,t){t&&t.pendingBranch?(0,o.kJ)(e)?t.effects.push(...e):t.effects.push(e):L(e)}function oe(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,X(r,o))}function ie(e,t){if(Hn){let n=Hn.provides;const r=Hn.parent&&Hn.parent.provides;r===n&&(n=Hn.provides=Object.create(r)),n[e]=t}}function se(e,t,n=!1){const r=Hn||B;if(r){const i=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&(0,o.mf)(t)?t.call(r.proxy):t}}function ae(e,t){return fe(e,null,t)}function le(e,t){return fe(e,null,{flush:"post"})}function ce(e,t){return fe(e,null,{flush:"sync"})}const ue={};function de(e,t,n){return fe(e,t,n)}function fe(e,t,{immediate:n,deep:i,flush:s,onTrack:a,onTrigger:l}=o.kT){const d=Hn;let f,h,p=!1,m=!1;if((0,r.dq)(e)?(f=()=>e.value,p=(0,r.yT)(e)):(0,r.PG)(e)?(f=()=>e,i=!0):(0,o.kJ)(e)?(m=!0,p=e.some(r.PG),f=()=>e.map((e=>(0,r.dq)(e)?e.value:(0,r.PG)(e)?me(e):(0,o.mf)(e)?c(e,d,2):void 0))):f=(0,o.mf)(e)?t?()=>c(e,d,2):()=>{if(!d||!d.isUnmounted)return h&&h(),u(e,d,3,[y])}:o.dG,t&&i){const e=f;f=()=>me(e())}let y=e=>{h=S.onStop=()=>{c(e,d,4)}};if(qn)return y=o.dG,t?n&&u(t,d,3,[f(),m?[]:void 0,y]):f(),o.dG;let w=m?[]:ue;const x=()=>{if(S.active)if(t){const e=S.run();(i||p||(m?e.some(((e,t)=>(0,o.aU)(e,w[t]))):(0,o.aU)(e,w)))&&(h&&h(),u(t,d,3,[e,w===ue?void 0:w,y]),w=e)}else S.run()};let k;x.allowRecurse=!!t,k="sync"===s?x:"post"===s?()=>Ot(x,d&&d.suspense):()=>{!d||d.isMounted?function(e){O(e,g,v,b)}(x):x()};const S=new r.qq(f,k);return t?n?x():w=S.run():"post"===s?Ot(S.run.bind(S),d&&d.suspense):S.run(),()=>{S.stop(),d&&d.scope&&(0,o.Od)(d.scope.effects,S)}}function he(e,t,n){const r=this.proxy,i=(0,o.HD)(e)?e.includes(".")?pe(r,e):()=>r[e]:e.bind(r,r);let s;(0,o.mf)(t)?s=t:(s=t.handler,n=t);const a=Hn;jn(this);const l=fe(i,s.bind(r),n);return a?jn(a):Wn(),l}function pe(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function me(e,t){if(!(0,o.Kn)(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),(0,r.dq)(e))me(e.value,t);else if((0,o.kJ)(e))for(let n=0;n<e.length;n++)me(e[n],t);else if((0,o.DM)(e)||(0,o._N)(e))e.forEach((e=>{me(e,t)}));else if((0,o.PO)(e))for(const n in e)me(e[n],t);return e}function ve(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Be((()=>{e.isMounted=!0})),qe((()=>{e.isUnmounting=!0})),e}const ge=[Function,Array],be={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ge,onEnter:ge,onAfterEnter:ge,onEnterCancelled:ge,onBeforeLeave:ge,onLeave:ge,onAfterLeave:ge,onLeaveCancelled:ge,onBeforeAppear:ge,onAppear:ge,onAfterAppear:ge,onAppearCancelled:ge},setup(e,{slots:t}){const n=Nn(),o=ve();let i;return()=>{const s=t.default&&Ee(t.default(),!0);if(!s||!s.length)return;const a=(0,r.IU)(e),{mode:l}=a,c=s[0];if(o.isLeaving)return xe(c);const u=ke(c);if(!u)return xe(c);const d=we(u,a,o,n);Se(u,d);const f=n.subTree,h=f&&ke(f);let p=!1;const{getTransitionKey:m}=u.type;if(m){const e=m();void 0===i?i=e:e!==i&&(i=e,p=!0)}if(h&&h.type!==Yt&&(!ln(u,h)||p)){const e=we(h,a,o,n);if(Se(h,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},xe(c);"in-out"===l&&u.type!==Yt&&(e.delayLeave=(e,t,n)=>{ye(o,h)[String(h.key)]=h,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=n})}return c}}};function ye(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function we(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=t,w=String(e.key),x=ye(n,e),k=(e,t)=>{e&&u(e,r,9,t)},S={mode:i,persisted:s,beforeEnter(t){let r=a;if(!n.isMounted){if(!o)return;r=v||a}t._leaveCb&&t._leaveCb(!0);const i=x[w];i&&ln(e,i)&&i.el._leaveCb&&i.el._leaveCb(),k(r,[t])},enter(e){let t=l,r=c,i=d;if(!n.isMounted){if(!o)return;t=g||l,r=b||c,i=y||d}let s=!1;const a=e._enterCb=t=>{s||(s=!0,k(t?i:r,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,a),t.length<=1&&a()):a()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();k(f,[t]);let i=!1;const s=t._leaveCb=n=>{i||(i=!0,r(),k(n?m:p,[t]),t._leaveCb=void 0,x[o]===e&&delete x[o])};x[o]=e,h?(h(t,s),h.length<=1&&s()):s()},clone:e=>we(e,t,n,r)};return S}function xe(e){if(Le(e))return(e=vn(e)).children=null,e}function ke(e){return Le(e)?e.children?e.children[0]:void 0:e}function Se(e,t){6&e.shapeFlag&&e.component?Se(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ee(e,t=!1){let n=[],r=0;for(let o=0;o<e.length;o++){const i=e[o];i.type===Ut?(128&i.patchFlag&&r++,n=n.concat(Ee(i.children,t))):(t||i.type!==Yt)&&n.push(i)}if(r>1)for(let e=0;e<n.length;e++)n[e].patchFlag=-2;return n}function Ce(e){return(0,o.mf)(e)?{setup:e,name:e.name}:e}const _e=e=>!!e.type.__asyncLoader;function Te(e){(0,o.mf)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:s=200,timeout:a,suspensible:l=!0,onError:c}=e;let u,f=null,h=0;const p=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,f=null,p()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),u=t,t))))};return Ce({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const e=Hn;if(u)return()=>Oe(u,e);const t=t=>{f=null,d(t,e,13,!i)};if(l&&e.suspense||qn)return p().then((t=>()=>Oe(t,e))).catch((e=>(t(e),()=>i?pn(i,{error:e}):null)));const o=(0,r.iH)(!1),c=(0,r.iH)(),h=(0,r.iH)(!!s);return s&&setTimeout((()=>{h.value=!1}),s),null!=a&&setTimeout((()=>{if(!o.value&&!c.value){const e=new Error(`Async component timed out after ${a}ms.`);t(e),c.value=e}}),a),p().then((()=>{o.value=!0,e.parent&&Le(e.parent.vnode)&&_(e.parent.update)})).catch((e=>{t(e),c.value=e})),()=>o.value&&u?Oe(u,e):c.value&&i?pn(i,{error:c.value}):n&&!h.value?pn(n):void 0}})}function Oe(e,{vnode:{ref:t,props:n,children:r}}){const o=pn(e,n,r);return o.ref=t,o}const Le=e=>e.type.__isKeepAlive,Re={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Nn(),r=n.ctx;if(!r.renderer)return t.default;const i=new Map,s=new Set;let a=null;const l=n.suspense,{renderer:{p:c,m:u,um:d,o:{createElement:f}}}=r,h=f("div");function p(e){Pe(e),d(e,n,l,!0)}function m(e){i.forEach(((t,n)=>{const r=Qn(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=i.get(e);a&&t.type===a.type?a&&Pe(a):p(t),i.delete(e),s.delete(e)}r.activate=(e,t,n,r,i)=>{const s=e.component;u(e,t,n,0,l),c(s.vnode,e,t,n,s,l,r,e.slotScopeIds,i),Ot((()=>{s.isDeactivated=!1,s.a&&(0,o.ir)(s.a);const t=e.props&&e.props.onVnodeMounted;t&&En(t,s.parent,e)}),l)},r.deactivate=e=>{const t=e.component;u(e,h,null,1,l),Ot((()=>{t.da&&(0,o.ir)(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&En(n,t.parent,e),t.isDeactivated=!0}),l)},de((()=>[e.include,e.exclude]),(([e,t])=>{e&&m((t=>De(e,t))),t&&m((e=>!De(t,e)))}),{flush:"post",deep:!0});let g=null;const b=()=>{null!=g&&i.set(g,He(n.subTree))};return Be(b),Ve(b),qe((()=>{i.forEach((e=>{const{subTree:t,suspense:r}=n,o=He(t);if(e.type!==o.type)p(e);else{Pe(o);const e=o.component.da;e&&Ot(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!an(r)||!(4&r.shapeFlag||128&r.shapeFlag))return a=null,r;let o=He(r);const l=o.type,c=Qn(_e(o)?o.type.__asyncResolved||{}:l),{include:u,exclude:d,max:f}=e;if(u&&(!c||!De(u,c))||d&&c&&De(d,c))return a=o,r;const h=null==o.key?l:o.key,p=i.get(h);return o.el&&(o=vn(o),128&r.shapeFlag&&(r.ssContent=o)),g=h,p?(o.el=p.el,o.component=p.component,o.transition&&Se(o,o.transition),o.shapeFlag|=512,s.delete(h),s.add(h)):(s.add(h),f&&s.size>parseInt(f,10)&&v(s.values().next().value)),o.shapeFlag|=256,a=o,r}}};function De(e,t){return(0,o.kJ)(e)?e.some((e=>De(e,t))):(0,o.HD)(e)?e.split(",").includes(t):!!e.test&&e.test(t)}function Ae(e,t){Me(e,"a",t)}function Ie(e,t){Me(e,"da",t)}function Me(e,t,n=Hn){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Ne(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Le(e.parent.vnode)&&Fe(r,t,n,e),e=e.parent}}function Fe(e,t,n,r){const i=Ne(t,e,r,!0);$e((()=>{(0,o.Od)(r[t],i)}),n)}function Pe(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function He(e){return 128&e.shapeFlag?e.ssContent:e}function Ne(e,t,n=Hn,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;(0,r.Jd)(),jn(n);const i=u(t,n,e,o);return Wn(),(0,r.lk)(),i});return o?i.unshift(s):i.push(s),s}}const je=e=>(t,n=Hn)=>(!qn||"sp"===e)&&Ne(e,t,n),We=je("bm"),Be=je("m"),ze=je("bu"),Ve=je("u"),qe=je("bum"),$e=je("um"),Ue=je("sp"),Ze=je("rtg"),Ye=je("rtc");function Ge(e,t=Hn){Ne("ec",e,t)}let Je=!0;function Ke(e,t,n){u((0,o.kJ)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Xe(e,t,n,r){const i=r.includes(".")?pe(n,r):()=>n[r];if((0,o.HD)(e)){const n=t[e];(0,o.mf)(n)&&de(i,n)}else if((0,o.mf)(e))de(i,e.bind(n));else if((0,o.Kn)(e))if((0,o.kJ)(e))e.forEach((e=>Xe(e,t,n,r)));else{const r=(0,o.mf)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.mf)(r)&&de(i,r,e)}}function Qe(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>et(l,e,s,!0))),et(l,t,s)):l=t,i.set(t,l),l}function et(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&et(e,i,n,!0),o&&o.forEach((t=>et(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=tt[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const tt={data:nt,props:it,emits:it,methods:it,computed:it,beforeCreate:ot,created:ot,beforeMount:ot,mounted:ot,beforeUpdate:ot,updated:ot,beforeDestroy:ot,beforeUnmount:ot,destroyed:ot,unmounted:ot,activated:ot,deactivated:ot,errorCaptured:ot,serverPrefetch:ot,components:it,directives:it,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,o.l7)(Object.create(null),e);for(const r in t)n[r]=ot(e[r],t[r]);return n},provide:nt,inject:function(e,t){return it(rt(e),rt(t))}};function nt(e,t){return t?e?function(){return(0,o.l7)((0,o.mf)(e)?e.call(this,this):e,(0,o.mf)(t)?t.call(this,this):t)}:t:e}function rt(e){if((0,o.kJ)(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ot(e,t){return e?[...new Set([].concat(e,t))]:t}function it(e,t){return e?(0,o.l7)((0,o.l7)(Object.create(null),e),t):t}function st(e,t,n,i){const[s,a]=e.propsOptions;let l,c=!1;if(t)for(let r in t){if((0,o.Gg)(r))continue;const u=t[r];let d;s&&(0,o.RI)(s,d=(0,o._A)(r))?a&&a.includes(d)?(l||(l={}))[d]=u:n[d]=u:W(e.emitsOptions,r)||r in i&&u===i[r]||(i[r]=u,c=!0)}if(a){const t=(0,r.IU)(n),i=l||o.kT;for(let r=0;r<a.length;r++){const l=a[r];n[l]=at(s,t,l,i[l],e,!(0,o.RI)(i,l))}}return c}function at(e,t,n,r,i,s){const a=e[n];if(null!=a){const e=(0,o.RI)(a,"default");if(e&&void 0===r){const e=a.default;if(a.type!==Function&&(0,o.mf)(e)){const{propsDefaults:o}=i;n in o?r=o[n]:(jn(i),r=o[n]=e.call(null,t),Wn())}else r=e}a[0]&&(s&&!e?r=!1:!a[1]||""!==r&&r!==(0,o.rs)(n)||(r=!0))}return r}function lt(e,t,n=!1){const r=t.propsCache,i=r.get(e);if(i)return i;const s=e.props,a={},l=[];let c=!1;if(!(0,o.mf)(e)){const r=e=>{c=!0;const[n,r]=lt(e,t,!0);(0,o.l7)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!s&&!c)return r.set(e,o.Z6),o.Z6;if((0,o.kJ)(s))for(let e=0;e<s.length;e++){const t=(0,o._A)(s[e]);ct(t)&&(a[t]=o.kT)}else if(s)for(const e in s){const t=(0,o._A)(e);if(ct(t)){const n=s[e],r=a[t]=(0,o.kJ)(n)||(0,o.mf)(n)?{type:n}:n;if(r){const e=ft(Boolean,r.type),n=ft(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||(0,o.RI)(r,"default"))&&l.push(t)}}}const u=[a,l];return r.set(e,u),u}function ct(e){return"$"!==e[0]}function ut(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:null===e?"null":""}function dt(e,t){return ut(e)===ut(t)}function ft(e,t){return(0,o.kJ)(t)?t.findIndex((t=>dt(t,e))):(0,o.mf)(t)&&dt(t,e)?0:-1}const ht=e=>"_"===e[0]||"$stable"===e,pt=e=>(0,o.kJ)(e)?e.map(wn):[wn(e)],mt=(e,t,n)=>{const r=Z(((...e)=>pt(t(...e))),n);return r._c=!1,r},vt=(e,t,n)=>{const r=e._ctx;for(const n in e){if(ht(n))continue;const i=e[n];if((0,o.mf)(i))t[n]=mt(0,i,r);else if(null!=i){const e=pt(i);t[n]=()=>e}}},gt=(e,t)=>{const n=pt(t);e.slots.default=()=>n};function bt(e,t){if(null===B)return e;const n=B.proxy,r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,s,a,l=o.kT]=t[e];(0,o.mf)(i)&&(i={mounted:i,updated:i}),i.deep&&me(s),r.push({dir:i,instance:n,value:s,oldValue:void 0,arg:a,modifiers:l})}return e}function yt(e,t,n,o){const i=e.dirs,s=t&&t.dirs;for(let a=0;a<i.length;a++){const l=i[a];s&&(l.oldValue=s[a].value);let c=l.dir[o];c&&((0,r.Jd)(),u(c,n,8,[e.el,l,e,t]),(0,r.lk)())}}function wt(){return{app:null,config:{isNativeTag:o.NO,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let xt=0;function kt(e,t){return function(n,r=null){null==r||(0,o.Kn)(r)||(r=null);const i=wt(),s=new Set;let a=!1;const l=i.app={_uid:xt++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:br,get config(){return i.config},set config(e){},use:(e,...t)=>(s.has(e)||(e&&(0,o.mf)(e.install)?(s.add(e),e.install(l,...t)):(0,o.mf)(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(i.mixins.includes(e)||i.mixins.push(e),l),component:(e,t)=>t?(i.components[e]=t,l):i.components[e],directive:(e,t)=>t?(i.directives[e]=t,l):i.directives[e],mount(o,s,c){if(!a){const u=pn(n,r);return u.appContext=i,s&&t?t(u,o):e(u,o,c),a=!0,l._container=o,o.__vue_app__=l,Kn(u.component)||u.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(i.provides[e]=t,l)};return l}}function St(e,t,n,i,s=!1){if((0,o.kJ)(e))return void e.forEach(((e,r)=>St(e,t&&((0,o.kJ)(t)?t[r]:t),n,i,s)));if(_e(i)&&!s)return;const a=4&i.shapeFlag?Kn(i.component)||i.component.proxy:i.el,l=s?null:a,{i:u,r:d}=e,f=t&&t.r,h=u.refs===o.kT?u.refs={}:u.refs,p=u.setupState;if(null!=f&&f!==d&&((0,o.HD)(f)?(h[f]=null,(0,o.RI)(p,f)&&(p[f]=null)):(0,r.dq)(f)&&(f.value=null)),(0,o.mf)(d))c(d,u,12,[l,h]);else{const t=(0,o.HD)(d),i=(0,r.dq)(d);if(t||i){const i=()=>{if(e.f){const n=t?h[d]:d.value;s?(0,o.kJ)(n)&&(0,o.Od)(n,a):(0,o.kJ)(n)?n.includes(a)||n.push(a):t?h[d]=[a]:(d.value=[a],e.k&&(h[e.k]=d.value))}else t?(h[d]=l,(0,o.RI)(p,d)&&(p[d]=l)):(0,r.dq)(d)&&(d.value=l,e.k&&(h[e.k]=l))};l?(i.id=-1,Ot(i,n)):i()}}}let Et=!1;const Ct=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,_t=e=>8===e.nodeType;function Tt(e){const{mt:t,p:n,o:{patchProp:r,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:c}}=e,u=(n,r,o,a,l,c=!1)=>{const v=_t(n)&&"["===n.data,g=()=>p(n,r,o,a,l,v),{type:b,ref:y,shapeFlag:w}=r,x=n.nodeType;r.el=n;let k=null;switch(b){case Zt:3!==x?k=g():(n.data!==r.children&&(Et=!0,n.data=r.children),k=i(n));break;case Yt:k=8!==x||v?g():i(n);break;case Gt:if(1===x){k=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=k.outerHTML),t===r.staticCount-1&&(r.anchor=k),k=i(k);return k}k=g();break;case Ut:k=v?h(n,r,o,a,l,c):g();break;default:if(1&w)k=1!==x||r.type.toLowerCase()!==n.tagName.toLowerCase()?g():d(n,r,o,a,l,c);else if(6&w){r.slotScopeIds=l;const e=s(n);if(t(r,e,null,o,a,Ct(e),c),k=v?m(n):i(n),_e(r)){let t;v?(t=pn(Ut),t.anchor=k?k.previousSibling:e.lastChild):t=3===n.nodeType?gn(""):pn("div"),t.el=n,r.component.subTree=t}}else 64&w?k=8!==x?g():r.type.hydrate(n,r,o,a,l,c,e,f):128&w&&(k=r.type.hydrate(n,r,o,a,Ct(s(n)),l,c,e,u))}return null!=y&&St(y,null,a,r),k},d=(e,t,n,i,s,l)=>{l=l||!!t.dynamicChildren;const{type:c,props:u,patchFlag:d,shapeFlag:h,dirs:p}=t,m="input"===c&&p||"option"===c;if(m||-1!==d){if(p&&yt(t,null,n,"created"),u)if(m||!l||48&d)for(const t in u)(m&&t.endsWith("value")||(0,o.F7)(t)&&!(0,o.Gg)(t))&&r(e,t,null,u[t],!1,void 0,n);else u.onClick&&r(e,"onClick",null,u.onClick,!1,void 0,n);let c;if((c=u&&u.onVnodeBeforeMount)&&En(c,n,t),p&&yt(t,null,n,"beforeMount"),((c=u&&u.onVnodeMounted)||p)&&re((()=>{c&&En(c,n,t),p&&yt(t,null,n,"mounted")}),i),16&h&&(!u||!u.innerHTML&&!u.textContent)){let r=f(e.firstChild,t,e,n,i,s,l);for(;r;){Et=!0;const e=r;r=r.nextSibling,a(e)}}else 8&h&&e.textContent!==t.children&&(Et=!0,e.textContent=t.children)}return e.nextSibling},f=(e,t,r,o,i,s,a)=>{a=a||!!t.dynamicChildren;const l=t.children,c=l.length;for(let t=0;t<c;t++){const c=a?l[t]:l[t]=wn(l[t]);if(e)e=u(e,c,o,i,s,a);else{if(c.type===Zt&&!c.children)continue;Et=!0,n(null,c,r,null,o,i,Ct(r),s)}}return e},h=(e,t,n,r,o,a)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const d=s(e),h=f(i(e),t,d,n,r,o,a);return h&&_t(h)&&"]"===h.data?i(t.anchor=h):(Et=!0,l(t.anchor=c("]"),d,h),h)},p=(e,t,r,o,l,c)=>{if(Et=!0,t.el=null,c){const t=m(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const u=i(e),d=s(e);return a(e),n(null,t,d,u,r,o,Ct(d),l),u},m=e=>{let t=0;for(;e;)if((e=i(e))&&_t(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),void D();Et=!1,u(t.firstChild,e,null,null,null),D(),Et&&console.error("Hydration completed but contains mismatches.")},u]}const Ot=re;function Lt(e){return Dt(e)}function Rt(e){return Dt(e,Tt)}function Dt(e,t){(0,o.E9)().__VUE__=!0;const{insert:n,remove:i,patchProp:s,createElement:a,createText:l,createComment:c,setText:u,setElementText:d,parentNode:f,nextSibling:h,setScopeId:v=o.dG,cloneNode:g,insertStaticContent:b}=e,y=(e,t,n,r=null,o=null,i=null,s=!1,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!ln(e,t)&&(r=J(e),q(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Zt:w(e,t,n,r);break;case Yt:x(e,t,n,r);break;case Gt:null==e&&k(t,n,r,s);break;case Ut:I(e,t,n,r,o,i,s,a,l);break;default:1&d?S(e,t,n,r,o,i,s,a,l):6&d?M(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&c.process(e,t,n,r,o,i,s,a,l,ee)}null!=u&&o&&St(u,e&&e.ref,i,t||e,!t)},w=(e,t,r,o)=>{if(null==e)n(t.el=l(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},x=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},k=(e,t,n,r)=>{[e.el,e.anchor]=b(e.children,t,n,r,e.el,e.anchor)},S=(e,t,n,r,o,i,s,a,l)=>{s=s||"svg"===t.type,null==e?E(t,n,r,o,i,s,a,l):O(e,t,o,i,s,a,l)},E=(e,t,r,i,l,c,u,f)=>{let h,p;const{type:m,props:v,shapeFlag:b,transition:y,patchFlag:w,dirs:x}=e;if(e.el&&void 0!==g&&-1===w)h=e.el=g(e.el);else{if(h=e.el=a(e.type,c,v&&v.is,v),8&b?d(h,e.children):16&b&&T(e.children,h,null,i,l,c&&"foreignObject"!==m,u,f),x&&yt(e,null,i,"created"),v){for(const t in v)"value"===t||(0,o.Gg)(t)||s(h,t,null,v[t],c,e.children,i,l,G);"value"in v&&s(h,"value",null,v.value),(p=v.onVnodeBeforeMount)&&En(p,i,e)}C(h,e,e.scopeId,u,i)}x&&yt(e,null,i,"beforeMount");const k=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;k&&y.beforeEnter(h),n(h,t,r),((p=v&&v.onVnodeMounted)||k||x)&&Ot((()=>{p&&En(p,i,e),k&&y.enter(h),x&&yt(e,null,i,"mounted")}),l)},C=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t<r.length;t++)v(e,r[t]);if(o&&t===o.subTree){const t=o.vnode;C(e,t,t.scopeId,t.slotScopeIds,o.parent)}},T=(e,t,n,r,o,i,s,a,l=0)=>{for(let c=l;c<e.length;c++){const l=e[c]=a?xn(e[c]):wn(e[c]);y(null,l,t,n,r,o,i,s,a)}},O=(e,t,n,r,i,a,l)=>{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:h}=t;u|=16&e.patchFlag;const p=e.props||o.kT,m=t.props||o.kT;let v;n&&At(n,!1),(v=m.onVnodeBeforeUpdate)&&En(v,n,t,e),h&&yt(t,e,n,"beforeUpdate"),n&&At(n,!0);const g=i&&"foreignObject"!==t.type;if(f?L(e.dynamicChildren,f,c,n,r,g,a):l||j(e,t,c,null,n,r,g,a,!1),u>0){if(16&u)A(c,t,p,m,n,r,i);else if(2&u&&p.class!==m.class&&s(c,"class",null,m.class,i),4&u&&s(c,"style",p.style,m.style,i),8&u){const o=t.dynamicProps;for(let t=0;t<o.length;t++){const a=o[t],l=p[a],u=m[a];u===l&&"value"!==a||s(c,a,l,u,i,e.children,n,r,G)}}1&u&&e.children!==t.children&&d(c,t.children)}else l||null!=f||A(c,t,p,m,n,r,i);((v=m.onVnodeUpdated)||h)&&Ot((()=>{v&&En(v,n,t,e),h&&yt(t,e,n,"updated")}),r)},L=(e,t,n,r,o,i,s)=>{for(let a=0;a<t.length;a++){const l=e[a],c=t[a],u=l.el&&(l.type===Ut||!ln(l,c)||70&l.shapeFlag)?f(l.el):n;y(l,c,u,null,r,o,i,s,!0)}},A=(e,t,n,r,i,a,l)=>{if(n!==r){for(const c in r){if((0,o.Gg)(c))continue;const u=r[c],d=n[c];u!==d&&"value"!==c&&s(e,c,d,u,l,t.children,i,a,G)}if(n!==o.kT)for(const c in n)(0,o.Gg)(c)||c in r||s(e,c,n[c],null,l,t.children,i,a,G);"value"in r&&s(e,"value",n.value,r.value)}},I=(e,t,r,o,i,s,a,c,u)=>{const d=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:h,dynamicChildren:p,slotScopeIds:m}=t;m&&(c=c?c.concat(m):m),null==e?(n(d,r,o),n(f,r,o),T(t.children,r,f,i,s,a,c,u)):h>0&&64&h&&p&&e.dynamicChildren?(L(e.dynamicChildren,p,r,i,s,a,c),(null!=t.key||i&&t===i.subTree)&&It(e,t,!0)):j(e,t,r,f,i,s,a,c,u)},M=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):F(t,n,r,o,i,s,l):P(e,t,l)},F=(e,t,n,r,o,i,s)=>{const a=e.component=Pn(e,r,o);if(Le(e)&&(a.ctx.renderer=ee),$n(a),a.asyncDep){if(o&&o.registerDep(a,H),!e.el){const e=a.subTree=pn(Yt);x(null,e,t,n)}}else H(a,e,t,n,o,i,s)},P=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||K(r,s,c):!!s);if(1024&l)return!0;if(16&l)return r?K(r,s,c):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!W(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void N(r,t,n);r.next=t,function(e){const t=p.indexOf(e);t>m&&p.splice(t,1)}(r.update),r.update()}else t.component=e.component,t.el=e.el,r.vnode=t},H=(e,t,n,i,s,a,l)=>{const c=e.effect=new r.qq((()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:c,vnode:u}=e,d=n;At(e,!1),n?(n.el=u.el,N(e,n,l)):n=u,r&&(0,o.ir)(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&En(t,c,n,u),At(e,!0);const h=Y(e),p=e.subTree;e.subTree=h,y(p,h,f(p.el),J(p),e,s,a),n.el=h.el,null===d&&X(e,h.el),i&&Ot(i,s),(t=n.props&&n.props.onVnodeUpdated)&&Ot((()=>En(t,c,n,u)),s)}else{let r;const{el:l,props:c}=t,{bm:u,m:d,parent:f}=e,h=_e(t);if(At(e,!1),u&&(0,o.ir)(u),!h&&(r=c&&c.onVnodeBeforeMount)&&En(r,f,t),At(e,!0),l&&ne){const n=()=>{e.subTree=Y(e),ne(l,e.subTree,e,s,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const r=e.subTree=Y(e);y(null,r,n,i,e,s,a),t.el=r.el}if(d&&Ot(d,s),!h&&(r=c&&c.onVnodeMounted)){const e=t;Ot((()=>En(r,f,e)),s)}256&t.shapeFlag&&e.a&&Ot(e.a,s),e.isMounted=!0,t=n=i=null}}),(()=>_(e.update)),e.scope),u=e.update=c.run.bind(c);u.id=e.uid,At(e,!0),u()},N=(e,t,n)=>{t.component=e;const i=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,i){const{props:s,attrs:a,vnode:{patchFlag:l}}=e,c=(0,r.IU)(s),[u]=e.propsOptions;let d=!1;if(!(i||l>0)||16&l){let r;st(e,t,s,a)&&(d=!0);for(const i in c)t&&((0,o.RI)(t,i)||(r=(0,o.rs)(i))!==i&&(0,o.RI)(t,r))||(u?!n||void 0===n[i]&&void 0===n[r]||(s[i]=at(u,c,i,void 0,e,!0)):delete s[i]);if(a!==c)for(const e in a)t&&(0,o.RI)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let i=n[r];const l=t[i];if(u)if((0,o.RI)(a,i))l!==a[i]&&(a[i]=l,d=!0);else{const t=(0,o._A)(i);s[t]=at(u,c,t,l,e,!1)}else l!==a[i]&&(a[i]=l,d=!0)}}d&&(0,r.X$)(e,"set","$attrs")}(e,t.props,i,n),((e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,a=o.kT;if(32&r.shapeFlag){const e=t._;e?n&&1===e?s=!1:((0,o.l7)(i,t),n||1!==e||delete i._):(s=!t.$stable,vt(t,i)),a=t}else t&&(gt(e,t),a={default:1});if(s)for(const e in i)ht(e)||e in a||delete i[e]})(e,t.children,n),(0,r.Jd)(),R(void 0,e.update),(0,r.lk)()},j=(e,t,n,r,o,i,s,a,l=!1)=>{const c=e&&e.children,u=e?e.shapeFlag:0,f=t.children,{patchFlag:h,shapeFlag:p}=t;if(h>0){if(128&h)return void z(c,f,n,r,o,i,s,a,l);if(256&h)return void B(c,f,n,r,o,i,s,a,l)}8&p?(16&u&&G(c,o,i),f!==c&&d(n,f)):16&u?16&p?z(c,f,n,r,o,i,s,a,l):G(c,o,i,!0):(8&u&&d(n,""),16&p&&T(f,n,r,o,i,s,a,l))},B=(e,t,n,r,i,s,a,l,c)=>{e=e||o.Z6,t=t||o.Z6;const u=e.length,d=t.length,f=Math.min(u,d);let h;for(h=0;h<f;h++){const r=t[h]=c?xn(t[h]):wn(t[h]);y(e[h],r,n,null,i,s,a,l,c)}u>d?G(e,i,s,!0,!1,f):T(t,n,r,i,s,a,l,c,f)},z=(e,t,n,r,i,s,a,l,c)=>{let u=0;const d=t.length;let f=e.length-1,h=d-1;for(;u<=f&&u<=h;){const r=e[u],o=t[u]=c?xn(t[u]):wn(t[u]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),u++}for(;u<=f&&u<=h;){const r=e[f],o=t[h]=c?xn(t[h]):wn(t[h]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),f--,h--}if(u>f){if(u<=h){const e=h+1,o=e<d?t[e].el:r;for(;u<=h;)y(null,t[u]=c?xn(t[u]):wn(t[u]),n,o,i,s,a,l,c),u++}}else if(u>h)for(;u<=f;)q(e[u],i,s,!0),u++;else{const p=u,m=u,v=new Map;for(u=m;u<=h;u++){const e=t[u]=c?xn(t[u]):wn(t[u]);null!=e.key&&v.set(e.key,u)}let g,b=0;const w=h-m+1;let x=!1,k=0;const S=new Array(w);for(u=0;u<w;u++)S[u]=0;for(u=p;u<=f;u++){const r=e[u];if(b>=w){q(r,i,s,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(g=m;g<=h;g++)if(0===S[g-m]&&ln(r,t[g])){o=g;break}void 0===o?q(r,i,s,!0):(S[o-m]=u+1,o>=k?k=o:x=!0,y(r,t[o],n,null,i,s,a,l,c),b++)}const E=x?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r<l;r++){const l=e[r];if(0!==l){if(o=n[n.length-1],e[o]<l){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)a=i+s>>1,e[n[a]]<l?i=a+1:s=a;l<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,s=n[i-1];i-- >0;)n[i]=s,s=t[s];return n}(S):o.Z6;for(g=E.length-1,u=w-1;u>=0;u--){const e=m+u,o=t[e],f=e+1<d?t[e+1].el:r;0===S[u]?y(null,o,n,f,i,s,a,l,c):x&&(g<0||u!==E[g]?V(o,n,f,2):g--)}}},V=(e,t,r,o,i=null)=>{const{el:s,type:a,transition:l,children:c,shapeFlag:u}=e;if(6&u)V(e.component.subTree,t,r,o);else if(128&u)e.suspense.move(t,r,o);else if(64&u)a.move(e,t,r,ee);else if(a!==Ut)if(a!==Gt)if(2!==o&&1&u&&l)if(0===o)l.beforeEnter(s),n(s,t,r),Ot((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>n(s,t,r),c=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,c):c()}else n(s,t,r);else(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);else{n(s,t,r);for(let e=0;e<c.length;e++)V(c[e],t,r,o);n(e.anchor,t,r)}},q=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:f}=e;if(null!=a&&St(a,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&f,p=!_e(e);let m;if(p&&(m=s&&s.onVnodeBeforeUnmount)&&En(m,t,e),6&u)Z(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&yt(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,ee,r):c&&(i!==Ut||d>0&&64&d)?G(c,t,n,!1,!0):(i===Ut&&384&d||!o&&16&u)&&G(l,t,n),r&&$(e)}(p&&(m=s&&s.onVnodeUnmounted)||h)&&Ot((()=>{m&&En(m,t,e),h&&yt(e,null,t,"unmounted")}),n)},$=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Ut)return void U(n,r);if(t===Gt)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),i(e),e=n;i(t)})(e);const s=()=>{i(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,i=()=>t(n,s);r?r(e.el,s,i):i()}else s()},U=(e,t)=>{let n;for(;e!==t;)n=h(e),i(e),e=n;i(t)},Z=(e,t,n)=>{const{bum:r,scope:i,update:s,subTree:a,um:l}=e;r&&(0,o.ir)(r),i.stop(),s&&(s.active=!1,q(a,e,t,n)),l&&Ot(l,t),Ot((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},G=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)q(e[s],t,n,r,o)},J=e=>6&e.shapeFlag?J(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),Q=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),D(),t._vnode=e},ee={p:y,um:q,m:V,r:$,mt:F,mc:T,pc:j,pbc:L,n:J,o:e};let te,ne;return t&&([te,ne]=t(ee)),{render:Q,hydrate:te,createApp:kt(Q,te)}}function At({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function It(e,t,n=!1){const r=e.children,i=t.children;if((0,o.kJ)(r)&&(0,o.kJ)(i))for(let e=0;e<r.length;e++){const t=r[e];let o=i[e];1&o.shapeFlag&&!o.dynamicChildren&&((o.patchFlag<=0||32===o.patchFlag)&&(o=i[e]=xn(i[e]),o.el=t.el),n||It(t,o))}}const Mt=e=>e&&(e.disabled||""===e.disabled),Ft=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,Pt=(e,t)=>{const n=e&&e.to;if((0,o.HD)(n)){if(t){return t(n)}return null}return n};function Ht(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:a,shapeFlag:l,children:c,props:u}=e,d=2===i;if(d&&r(s,t,n),(!d||Mt(u))&&16&l)for(let e=0;e<c.length;e++)o(c[e],t,n,2);d&&r(a,t,n)}const Nt={__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,c){const{mc:u,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=c,g=Mt(t.props);let{shapeFlag:b,children:y,dynamicChildren:w}=t;if(null==e){const e=t.el=m(""),c=t.anchor=m("");h(e,n,r),h(c,n,r);const d=t.target=Pt(t.props,p),f=t.targetAnchor=m("");d&&(h(f,d),s=s||Ft(d));const v=(e,t)=>{16&b&&u(y,e,t,o,i,s,a,l)};g?v(n,c):d&&v(d,f)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,h=t.targetAnchor=e.targetAnchor,m=Mt(e.props),v=m?n:u,b=m?r:h;if(s=s||Ft(u),w?(f(e.dynamicChildren,w,v,o,i,s,a),It(e,t,!0)):l||d(e,t,v,b,o,i,s,a,!1),g)m||Ht(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=Pt(t.props,p);e&&Ht(t,e,null,c,0)}else m&&Ht(t,u,h,c,1)}},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:a,children:l,anchor:c,targetAnchor:u,target:d,props:f}=e;if(d&&i(u),(s||!Mt(f))&&(i(c),16&a))for(let e=0;e<l.length;e++){const r=l[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:Ht,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:a,querySelector:l}},c){const u=t.target=Pt(t.props,l);if(u){const l=u._lpa||u.firstChild;16&t.shapeFlag&&(Mt(t.props)?(t.anchor=c(s(e),t,a(e),n,r,o,i),t.targetAnchor=l):(t.anchor=s(e),t.targetAnchor=c(l,t,u,n,r,o,i)),u._lpa=t.targetAnchor&&s(t.targetAnchor))}return t.anchor&&s(t.anchor)}},jt="components";function Wt(e,t){return qt(jt,e,!0,t)||e}const Bt=Symbol();function zt(e){return(0,o.HD)(e)?qt(jt,e,!1)||e:e||Bt}function Vt(e){return qt("directives",e)}function qt(e,t,n=!0,r=!1){const i=B||Hn;if(i){const n=i.type;if(e===jt){const e=Qn(n);if(e&&(e===t||e===(0,o._A)(t)||e===(0,o.kC)((0,o._A)(t))))return n}const s=$t(i[e]||n[e],t)||$t(i.appContext[e],t);return!s&&r?n:s}}function $t(e,t){return e&&(e[t]||e[(0,o._A)(t)]||e[(0,o.kC)((0,o._A)(t))])}const Ut=Symbol(void 0),Zt=Symbol(void 0),Yt=Symbol(void 0),Gt=Symbol(void 0),Jt=[];let Kt=null;function Xt(e=!1){Jt.push(Kt=e?null:[])}function Qt(){Jt.pop(),Kt=Jt[Jt.length-1]||null}let en,tn=1;function nn(e){tn+=e}function rn(e){return e.dynamicChildren=tn>0?Kt||o.Z6:null,Qt(),tn>0&&Kt&&Kt.push(e),e}function on(e,t,n,r,o,i){return rn(hn(e,t,n,r,o,i,!0))}function sn(e,t,n,r,o){return rn(pn(e,t,n,r,o,!0))}function an(e){return!!e&&!0===e.__v_isVNode}function ln(e,t){return e.type===t.type&&e.key===t.key}function cn(e){en=e}const un="__vInternal",dn=({key:e})=>null!=e?e:null,fn=({ref:e,ref_key:t,ref_for:n})=>null!=e?(0,o.HD)(e)||(0,r.dq)(e)||(0,o.mf)(e)?{i:B,r:e,k:t,f:!!n}:e:null;function hn(e,t=null,n=null,r=0,i=null,s=(e===Ut?0:1),a=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&dn(t),ref:t&&fn(t),scopeId:z,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null};return l?(kn(c,n),128&s&&e.normalize(c)):n&&(c.shapeFlag|=(0,o.HD)(n)?8:16),tn>0&&!a&&Kt&&(c.patchFlag>0||6&s)&&32!==c.patchFlag&&Kt.push(c),c}const pn=function(e,t=null,n=null,i=0,s=null,a=!1){if(e&&e!==Bt||(e=Yt),an(e)){const r=vn(e,t,!0);return n&&kn(r,n),r}if(l=e,(0,o.mf)(l)&&"__vccOpts"in l&&(e=e.__vccOpts),t){t=mn(t);let{class:e,style:n}=t;e&&!(0,o.HD)(e)&&(t.class=(0,o.C_)(e)),(0,o.Kn)(n)&&((0,r.X3)(n)&&!(0,o.kJ)(n)&&(n=(0,o.l7)({},n)),t.style=(0,o.j5)(n))}var l;return hn(e,t,n,i,s,(0,o.HD)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,o.Kn)(e)?4:(0,o.mf)(e)?2:0,a,!0)};function mn(e){return e?(0,r.X3)(e)||un in e?(0,o.l7)({},e):e:null}function vn(e,t,n=!1){const{props:r,ref:i,patchFlag:s,children:a}=e,l=t?Sn(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&dn(l),ref:t&&t.ref?n&&i?(0,o.kJ)(i)?i.concat(fn(t)):[i,fn(t)]:fn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&vn(e.ssContent),ssFallback:e.ssFallback&&vn(e.ssFallback),el:e.el,anchor:e.anchor}}function gn(e=" ",t=0){return pn(Zt,null,e,t)}function bn(e,t){const n=pn(Gt,null,e);return n.staticCount=t,n}function yn(e="",t=!1){return t?(Xt(),sn(Yt,null,e)):pn(Yt,null,e)}function wn(e){return null==e||"boolean"==typeof e?pn(Yt):(0,o.kJ)(e)?pn(Ut,null,e.slice()):"object"==typeof e?xn(e):pn(Zt,null,String(e))}function xn(e){return null===e.el||e.memo?e:vn(e)}function kn(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.kJ)(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),kn(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||un in t?3===r&&B&&(1===B.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=B}}else(0,o.mf)(t)?(t={default:t,_ctx:B},n=32):(t=String(t),64&r?(n=16,t=[gn(t)]):n=8);e.children=t,e.shapeFlag|=n}function Sn(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=(0,o.C_)([t.class,r.class]));else if("style"===e)t.style=(0,o.j5)([t.style,r.style]);else if((0,o.F7)(e)){const n=t[e],i=r[e];!i||n===i||(0,o.kJ)(n)&&n.includes(i)||(t[e]=n?[].concat(n,i):i)}else""!==e&&(t[e]=r[e])}return t}function En(e,t,n,r=null){u(e,t,7,[n,r])}function Cn(e,t,n,r){let i;const s=n&&n[r];if((0,o.kJ)(e)||(0,o.HD)(e)){i=new Array(e.length);for(let n=0,r=e.length;n<r;n++)i[n]=t(e[n],n,void 0,s&&s[n])}else if("number"==typeof e){i=new Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,s&&s[n])}else if((0,o.Kn)(e))if(e[Symbol.iterator])i=Array.from(e,((e,n)=>t(e,n,void 0,s&&s[n])));else{const n=Object.keys(e);i=new Array(n.length);for(let r=0,o=n.length;r<o;r++){const o=n[r];i[r]=t(e[o],o,r,s&&s[r])}}else i=[];return n&&(n[r]=i),i}function _n(e,t){for(let n=0;n<t.length;n++){const r=t[n];if((0,o.kJ)(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.fn)}return e}function Tn(e,t,n={},r,o){if(B.isCE)return pn("slot","default"===t?null:{name:t},r&&r());let i=e[t];i&&i._c&&(i._d=!1),Xt();const s=i&&On(i(n)),a=sn(Ut,{key:n.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function On(e){return e.some((e=>!an(e)||e.type!==Yt&&!(e.type===Ut&&!On(e.children))))?e:null}function Ln(e){const t={};for(const n in e)t[(0,o.hR)(n)]=e[n];return t}const Rn=e=>e?Bn(e)?Kn(e)||e.proxy:Rn(e.parent):null,Dn=(0,o.l7)(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Rn(e.parent),$root:e=>Rn(e.root),$emit:e=>e.emit,$options:e=>Qe(e),$forceUpdate:e=>()=>_(e.update),$nextTick:e=>C.bind(e.proxy),$watch:e=>he.bind(e)}),An={get({_:e},t){const{ctx:n,setupState:i,data:s,props:a,accessCache:l,type:c,appContext:u}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(i!==o.kT&&(0,o.RI)(i,t))return l[t]=1,i[t];if(s!==o.kT&&(0,o.RI)(s,t))return l[t]=2,s[t];if((d=e.propsOptions[0])&&(0,o.RI)(d,t))return l[t]=3,a[t];if(n!==o.kT&&(0,o.RI)(n,t))return l[t]=4,n[t];Je&&(l[t]=0)}}const f=Dn[t];let h,p;return f?("$attrs"===t&&(0,r.j)(e,"get",t),f(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==o.kT&&(0,o.RI)(n,t)?(l[t]=4,n[t]):(p=u.config.globalProperties,(0,o.RI)(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;if(i!==o.kT&&(0,o.RI)(i,t))i[t]=n;else if(r!==o.kT&&(0,o.RI)(r,t))r[t]=n;else if((0,o.RI)(e.props,t))return!1;return!("$"===t[0]&&t.slice(1)in e||(s[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let l;return!!n[a]||e!==o.kT&&(0,o.RI)(e,a)||t!==o.kT&&(0,o.RI)(t,a)||(l=s[0])&&(0,o.RI)(l,a)||(0,o.RI)(r,a)||(0,o.RI)(Dn,a)||(0,o.RI)(i.config.globalProperties,a)}},In=(0,o.l7)({},An,{get(e,t){if(t!==Symbol.unscopables)return An.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!(0,o.e1)(t)}),Mn=wt();let Fn=0;function Pn(e,t,n){const i=e.type,s=(t?t.appContext:e.appContext)||Mn,a={uid:Fn++,vnode:e,type:i,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new r.Bj(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:lt(i,s),emitsOptions:j(i,s),emit:null,emitted:null,propsDefaults:o.kT,inheritAttrs:i.inheritAttrs,ctx:o.kT,data:o.kT,props:o.kT,attrs:o.kT,slots:o.kT,refs:o.kT,setupState:o.kT,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=N.bind(null,a),e.ce&&e.ce(a),a}let Hn=null;const Nn=()=>Hn||B,jn=e=>{Hn=e,e.scope.on()},Wn=()=>{Hn&&Hn.scope.off(),Hn=null};function Bn(e){return 4&e.vnode.shapeFlag}let zn,Vn,qn=!1;function $n(e,t=!1){qn=t;const{props:n,children:i}=e.vnode,s=Bn(e);!function(e,t,n,i=!1){const s={},a={};(0,o.Nj)(a,un,1),e.propsDefaults=Object.create(null),st(e,t,s,a);for(const t in e.propsOptions[0])t in s||(s[t]=void 0);n?e.props=i?s:(0,r.Um)(s):e.type.props?e.props=s:e.props=a,e.attrs=a}(e,n,s,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,r.IU)(t),(0,o.Nj)(t,"_",n)):vt(t,e.slots={})}else e.slots={},t&&gt(e,t);(0,o.Nj)(e.slots,un,1)})(e,i);const a=s?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,r.Xl)(new Proxy(e.ctx,An));const{setup:i}=n;if(i){const n=e.setupContext=i.length>1?Jn(e):null;jn(e),(0,r.Jd)();const s=c(i,e,0,[e.props,n]);if((0,r.lk)(),Wn(),(0,o.tI)(s)){if(s.then(Wn,Wn),t)return s.then((n=>{Un(e,n,t)})).catch((t=>{d(t,e,0)}));e.asyncDep=s}else Un(e,s,t)}else Gn(e,t)}(e,t):void 0;return qn=!1,a}function Un(e,t,n){(0,o.mf)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Kn)(t)&&(e.setupState=(0,r.WL)(t)),Gn(e,n)}function Zn(e){zn=e,Vn=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,In))}}const Yn=()=>!zn;function Gn(e,t,n){const i=e.type;if(!e.render){if(!t&&zn&&!i.render){const t=i.template;if(t){const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:s,compilerOptions:a}=i,l=(0,o.l7)((0,o.l7)({isCustomElement:n,delimiters:s},r),a);i.render=zn(t,l)}}e.render=i.render||o.dG,Vn&&Vn(e)}jn(e),(0,r.Jd)(),function(e){const t=Qe(e),n=e.proxy,i=e.ctx;Je=!1,t.beforeCreate&&Ke(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:l,watch:c,provide:u,inject:d,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:v,activated:g,deactivated:b,beforeDestroy:y,beforeUnmount:w,destroyed:x,unmounted:k,render:S,renderTracked:E,renderTriggered:C,errorCaptured:_,serverPrefetch:T,expose:O,inheritAttrs:L,components:R,directives:D,filters:A}=t;if(d&&function(e,t,n=o.dG,i=!1){(0,o.kJ)(e)&&(e=rt(e));for(const n in e){const s=e[n];let a;a=(0,o.Kn)(s)?"default"in s?se(s.from||n,s.default,!0):se(s.from||n):se(s),(0,r.dq)(a)&&i?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(d,i,null,e.appContext.config.unwrapInjectedRef),l)for(const e in l){const t=l[e];(0,o.mf)(t)&&(i[e]=t.bind(n))}if(s){const t=s.call(n,n);(0,o.Kn)(t)&&(e.data=(0,r.qj)(t))}if(Je=!0,a)for(const e in a){const t=a[e],r=(0,o.mf)(t)?t.bind(n,n):(0,o.mf)(t.get)?t.get.bind(n,n):o.dG,s=!(0,o.mf)(t)&&(0,o.mf)(t.set)?t.set.bind(n):o.dG,l=tr({get:r,set:s});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(c)for(const e in c)Xe(c[e],i,n,e);if(u){const e=(0,o.mf)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{ie(t,e[t])}))}function I(e,t){(0,o.kJ)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&Ke(f,e,"c"),I(We,h),I(Be,p),I(ze,m),I(Ve,v),I(Ae,g),I(Ie,b),I(Ge,_),I(Ye,E),I(Ze,C),I(qe,w),I($e,k),I(Ue,T),(0,o.kJ)(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.dG&&(e.render=S),null!=L&&(e.inheritAttrs=L),R&&(e.components=R),D&&(e.directives=D)}(e),(0,r.lk)(),Wn()}function Jn(e){let t;return{get attrs(){return t||(t=function(e){return new Proxy(e.attrs,{get:(t,n)=>((0,r.j)(e,"get","$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Kn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,r.WL)((0,r.Xl)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in Dn?Dn[n](e):void 0}))}const Xn=/(?:^|[-_])(\w)/g;function Qn(e){return(0,o.mf)(e)&&e.displayName||e.name}function er(e,t,n=!1){let r=Qn(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?r.replace(Xn,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}const tr=(e,t)=>(0,r.Fl)(e,t,qn);function nr(){return null}function rr(){return null}function or(e){}function ir(e,t){return null}function sr(){return lr().slots}function ar(){return lr().attrs}function lr(){const e=Nn();return e.setupContext||(e.setupContext=Jn(e))}function cr(e,t){const n=(0,o.kJ)(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?(0,o.kJ)(r)||(0,o.mf)(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function ur(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function dr(e){const t=Nn();let n=e();return Wn(),(0,o.tI)(n)&&(n=n.catch((e=>{throw jn(t),e}))),[n,()=>jn(t)]}function fr(e,t,n){const r=arguments.length;return 2===r?(0,o.Kn)(t)&&!(0,o.kJ)(t)?an(t)?pn(e,null,[t]):pn(e,t):pn(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&an(n)&&(n=[n]),pn(e,t,n))}const hr=Symbol(""),pr=()=>{{const e=se(hr);return e||s("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function mr(){}function vr(e,t,n,r){const o=n[r];if(o&&gr(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function gr(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!==t[e])return!1;return tn>0&&Kt&&Kt.push(e),!0}const br="3.2.30",yr={createComponentInstance:Pn,setupComponent:$n,renderComponentRoot:Y,setCurrentRenderingInstance:V,isVNode:an,normalizeVNode:wn},wr=null,xr=null},3577:(e,t,n)=>{"use strict";function r(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.d(t,{Z6:()=>S,kT:()=>k,NO:()=>C,dG:()=>E,m:()=>o,_A:()=>K,kC:()=>ee,Nj:()=>oe,l7:()=>L,Kp:()=>s,E9:()=>ae,aU:()=>ne,RI:()=>A,rs:()=>Q,yA:()=>l,ir:()=>re,kJ:()=>I,wh:()=>Y,mf:()=>H,e1:()=>i,eS:()=>m,S0:()=>U,_N:()=>M,tR:()=>O,Kn:()=>W,F7:()=>T,PO:()=>$,tI:()=>B,Gg:()=>Z,aN:()=>v,DM:()=>F,Pq:()=>a,HD:()=>N,yk:()=>j,WB:()=>g,WV:()=>b,hq:()=>y,fY:()=>r,C_:()=>h,vs:()=>p,j5:()=>c,yL:()=>f,Od:()=>R,zw:()=>w,hR:()=>te,He:()=>ie,W7:()=>q});const o={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},i=r("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function s(e,t=0,n=e.length){let r=e.split(/(\r?\n)/);const o=r.filter(((e,t)=>t%2==1));r=r.filter(((e,t)=>t%2==0));let i=0;const s=[];for(let e=0;e<r.length;e++)if(i+=r[e].length+(o[e]&&o[e].length||0),i>=t){for(let a=e-2;a<=e+2||n>i;a++){if(a<0||a>=r.length)continue;const l=a+1;s.push(`${l}${" ".repeat(Math.max(3-String(l).length,0))}|  ${r[a]}`);const c=r[a].length,u=o[a]&&o[a].length||0;if(a===e){const e=t-(i-(c+u)),r=Math.max(1,n>i?c-e:n-t);s.push("   |  "+" ".repeat(e)+"^".repeat(r))}else if(a>e){if(n>i){const e=Math.max(Math.min(n-i,c),1);s.push("   |  "+"^".repeat(e))}i+=c+u}}break}return s.join("\n")}const a=r("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function l(e){return!!e||""===e}function c(e){if(I(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=N(r)?f(r):c(r);if(o)for(const e in o)t[e]=o[e]}return t}return N(e)||W(e)?e:void 0}const u=/;(?![^(]*\))/g,d=/:(.+)/;function f(e){const t={};return e.split(u).forEach((e=>{if(e){const n=e.split(d);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function h(e){let t="";if(N(e))t=e;else if(I(e))for(let n=0;n<e.length;n++){const r=h(e[n]);r&&(t+=r+" ")}else if(W(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function p(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=h(t)),n&&(e.style=c(n)),e}const m=r("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=r("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),g=r("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr");function b(e,t){if(e===t)return!0;let n=P(e),r=P(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=I(e),r=I(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=b(e[r],t[r]);return n}(e,t);if(n=W(e),r=W(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!b(e[n],t[n]))return!1}}return String(e)===String(t)}function y(e,t){return e.findIndex((e=>b(e,t)))}const w=e=>N(e)?e:null==e?"":I(e)||W(e)&&(e.toString===z||!H(e.toString))?JSON.stringify(e,x,2):String(e),x=(e,t)=>t&&t.__v_isRef?x(e,t.value):M(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:F(t)?{[`Set(${t.size})`]:[...t.values()]}:!W(t)||I(t)||$(t)?t:String(t),k={},S=[],E=()=>{},C=()=>!1,_=/^on[^a-z]/,T=e=>_.test(e),O=e=>e.startsWith("onUpdate:"),L=Object.assign,R=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},D=Object.prototype.hasOwnProperty,A=(e,t)=>D.call(e,t),I=Array.isArray,M=e=>"[object Map]"===V(e),F=e=>"[object Set]"===V(e),P=e=>e instanceof Date,H=e=>"function"==typeof e,N=e=>"string"==typeof e,j=e=>"symbol"==typeof e,W=e=>null!==e&&"object"==typeof e,B=e=>W(e)&&H(e.then)&&H(e.catch),z=Object.prototype.toString,V=e=>z.call(e),q=e=>V(e).slice(8,-1),$=e=>"[object Object]"===V(e),U=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Z=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Y=r("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),G=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},J=/-(\w)/g,K=G((e=>e.replace(J,((e,t)=>t?t.toUpperCase():"")))),X=/\B([A-Z])/g,Q=G((e=>e.replace(X,"-$1").toLowerCase())),ee=G((e=>e.charAt(0).toUpperCase()+e.slice(1))),te=G((e=>e?`on${ee(e)}`:"")),ne=(e,t)=>!Object.is(e,t),re=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},oe=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ie=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let se;const ae=()=>se||(se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{})},1807:e=>{var t=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t},2152:function(e){var t;t=function(){return function(){var e={686:function(e,t,n){"use strict";n.d(t,{default:function(){return x}});var r=n(279),o=n.n(r),i=n(370),s=n.n(i),a=n(817),l=n.n(a);function c(e){try{return document.execCommand(e)}catch(e){return!1}}var u=function(e){var t=l()(e);return c("cut"),t};function d(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[t?"right":"left"]="-9999px";var r=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(r,"px"),n.setAttribute("readonly",""),n.value=e,n}var f=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";if("string"==typeof e){var r=d(e);t.container.appendChild(r),n=l()(r),c("copy"),r.remove()}else n=l()(e),c("copy");return n};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},v(e,t)}function g(e,t){return!t||"object"!==p(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function y(e,t){var n="data-clipboard-".concat(e);if(t.hasAttribute(n))return t.getAttribute(n)}var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(l,e);var t,n,r,o,i,a=(o=l,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(o);if(i){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return g(this,e)});function l(e,t){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),(n=a.call(this)).resolveOptions(t),n.listenClick(e),n}return t=l,n=[{key:"resolveOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=s()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget,n=this.action(t)||"copy",r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.action,n=void 0===t?"copy":t,r=e.container,o=e.target,i=e.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==h(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return i?f(i,{container:r}):o?"cut"===n?u(o):f(o,{container:r}):void 0}({action:n,container:this.container,target:this.target(t),text:this.text(t)});this.emit(r?"success":"error",{action:n,text:r,trigger:t,clearSelection:function(){t&&t.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(e){return y("action",e)}},{key:"defaultTarget",value:function(e){var t=y("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return y("text",e)}},{key:"destroy",value:function(){this.listener.destroy()}}],r=[{key:"copy",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(e,t)}},{key:"cut",value:function(e){return u(e)}},{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}],n&&m(t.prototype,n),r&&m(t,r),l}(o()),x=w},828:function(e){if("undefined"!=typeof Element&&!Element.prototype.matches){var t=Element.prototype;t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector}e.exports=function(e,t){for(;e&&9!==e.nodeType;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}},438:function(e,t,n){var r=n(828);function o(e,t,n,r,o){var s=i.apply(this,arguments);return e.addEventListener(n,s,o),{destroy:function(){e.removeEventListener(n,s,o)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}e.exports=function(e,t,n,r,i){return"function"==typeof e.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,(function(e){return o(e,t,n,r,i)})))}},879:function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},370:function(e,t,n){var r=n(879),o=n(438);e.exports=function(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!r.string(t))throw new TypeError("Second argument must be a String");if(!r.fn(n))throw new TypeError("Third argument must be a Function");if(r.node(e))return function(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}(e,t,n);if(r.nodeList(e))return function(e,t,n){return Array.prototype.forEach.call(e,(function(e){e.addEventListener(t,n)})),{destroy:function(){Array.prototype.forEach.call(e,(function(e){e.removeEventListener(t,n)}))}}}(e,t,n);if(r.string(e))return function(e,t,n){return o(document.body,e,t,n)}(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(e){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),o=document.createRange();o.selectNodeContents(e),r.removeAllRanges(),r.addRange(o),t=r.toString()}return t}},279:function(e){function t(){}t.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var r=this;function o(){r.off(e,o),t.apply(n,arguments)}return o._=t,this.on(e,o,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,o=n.length;r<o;r++)n[r].fn.apply(n[r].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),r=n[e],o=[];if(r&&t)for(var i=0,s=r.length;i<s;i++)r[i].fn!==t&&r[i].fn._!==t&&o.push(r[i]);return o.length?n[e]=o:delete n[e],this}},e.exports=t,e.exports.TinyEmitter=t}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}return n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(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=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n(686)}().default},e.exports=t()},9662:(e,t,n)=>{var r=n(7854),o=n(614),i=n(6330),s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not a function")}},6077:(e,t,n)=>{var r=n(7854),o=n(614),i=r.String,s=r.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw s("Can't set "+i(e)+" as a prototype")}},1223:(e,t,n)=>{var r=n(5112),o=n(30),i=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&i.f(a,s,{configurable:!0,value:o(null)}),e.exports=function(e){a[s][e]=!0}},1530:(e,t,n)=>{"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:(e,t,n)=>{var r=n(7854),o=n(7976),i=r.TypeError;e.exports=function(e,t){if(o(t,e))return e;throw i("Incorrect invocation")}},9670:(e,t,n)=>{var r=n(7854),o=n(111),i=r.String,s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not an object")}},7556:(e,t,n)=>{var r=n(7293);e.exports=r((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},8533:(e,t,n)=>{"use strict";var r=n(2092).forEach,o=n(9341)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},1318:(e,t,n)=>{var r=n(5656),o=n(1400),i=n(6244),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:(e,t,n)=>{var r=n(9974),o=n(1702),i=n(8361),s=n(7908),a=n(6244),l=n(5417),c=o([].push),u=function(e){var t=1==e,n=2==e,o=3==e,u=4==e,d=6==e,f=7==e,h=5==e||d;return function(p,m,v,g){for(var b,y,w=s(p),x=i(w),k=r(m,v),S=a(x),E=0,C=g||l,_=t?C(p,S):n||f?C(p,0):void 0;S>E;E++)if((h||E in x)&&(y=k(b=x[E],E,w),e))if(t)_[E]=y;else if(y)switch(e){case 3:return!0;case 5:return b;case 6:return E;case 2:c(_,b)}else switch(e){case 4:return!1;case 7:c(_,b)}return d?-1:o||u?u:_}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},1194:(e,t,n)=>{var r=n(7293),o=n(5112),i=n(7392),s=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},9341:(e,t,n)=>{"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},3671:(e,t,n)=>{var r=n(7854),o=n(9662),i=n(7908),s=n(8361),a=n(6244),l=r.TypeError,c=function(e){return function(t,n,r,c){o(n);var u=i(t),d=s(u),f=a(u),h=e?f-1:0,p=e?-1:1;if(r<2)for(;;){if(h in d){c=d[h],h+=p;break}if(h+=p,e?h<0:f<=h)throw l("Reduce of empty array with no initial value")}for(;e?h>=0:f>h;h+=p)h in d&&(c=n(c,d[h],h,u));return c}};e.exports={left:c(!1),right:c(!0)}},1589:(e,t,n)=>{var r=n(7854),o=n(1400),i=n(6244),s=n(6135),a=r.Array,l=Math.max;e.exports=function(e,t,n){for(var r=i(e),c=o(t,r),u=o(void 0===n?r:n,r),d=a(l(u-c,0)),f=0;c<u;c++,f++)s(d,f,e[c]);return d.length=f,d}},7475:(e,t,n)=>{var r=n(7854),o=n(3157),i=n(4411),s=n(111),a=n(5112)("species"),l=r.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(i(t)&&(t===l||o(t.prototype))||s(t)&&null===(t=t[a]))&&(t=void 0)),void 0===t?l:t}},5417:(e,t,n)=>{var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},7072:(e,t,n)=>{var r=n(5112)("iterator"),o=!1;try{var i=0,s={next:function(){return{done:!!i++}},return:function(){o=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n}},4326:(e,t,n)=>{var r=n(1702),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},648:(e,t,n)=>{var r=n(7854),o=n(1694),i=n(614),s=n(4326),a=n(5112)("toStringTag"),l=r.Object,c="Arguments"==s(function(){return arguments}());e.exports=o?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=l(e),a))?n:c?s(t):"Object"==(r=s(t))&&i(t.callee)?"Arguments":r}},9320:(e,t,n)=>{"use strict";var r=n(1702),o=n(2248),i=n(2423).getWeakData,s=n(9670),a=n(111),l=n(5787),c=n(408),u=n(2092),d=n(2597),f=n(9909),h=f.set,p=f.getterFor,m=u.find,v=u.findIndex,g=r([].splice),b=0,y=function(e){return e.frozen||(e.frozen=new w)},w=function(){this.entries=[]},x=function(e,t){return m(e.entries,(function(e){return e[0]===t}))};w.prototype={get:function(e){var t=x(this,e);if(t)return t[1]},has:function(e){return!!x(this,e)},set:function(e,t){var n=x(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&g(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var u=e((function(e,o){l(e,f),h(e,{type:t,id:b++,frozen:void 0}),null!=o&&c(o,e[r],{that:e,AS_ENTRIES:n})})),f=u.prototype,m=p(t),v=function(e,t,n){var r=m(e),o=i(s(t),!0);return!0===o?y(r).set(t,n):o[r.id]=n,e};return o(f,{delete:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).delete(e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).has(e):n&&d(n,t.id)}}),o(f,n?{get:function(e){var t=m(this);if(a(e)){var n=i(e);return!0===n?y(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),u}}},7710:(e,t,n)=>{"use strict";var r=n(2109),o=n(7854),i=n(1702),s=n(4705),a=n(1320),l=n(2423),c=n(408),u=n(5787),d=n(614),f=n(111),h=n(7293),p=n(7072),m=n(8003),v=n(9587);e.exports=function(e,t,n){var g=-1!==e.indexOf("Map"),b=-1!==e.indexOf("Weak"),y=g?"set":"add",w=o[e],x=w&&w.prototype,k=w,S={},E=function(e){var t=i(x[e]);a(x,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this})};if(s(e,!d(w)||!(b||x.forEach&&!h((function(){(new w).entries().next()})))))k=n.getConstructor(t,e,g,y),l.enable();else if(s(e,!0)){var C=new k,_=C[y](b?{}:-0,1)!=C,T=h((function(){C.has(1)})),O=p((function(e){new w(e)})),L=!b&&h((function(){for(var e=new w,t=5;t--;)e[y](t,t);return!e.has(-0)}));O||((k=t((function(e,t){u(e,x);var n=v(new w,e,k);return null!=t&&c(t,n[y],{that:n,AS_ENTRIES:g}),n}))).prototype=x,x.constructor=k),(T||L)&&(E("delete"),E("has"),g&&E("get")),(L||_)&&E(y),b&&x.clear&&delete x.clear}return S[e]=k,r({global:!0,forced:k!=w},S),m(k,e),b||n.setStrong(k,e,g),k}},9920:(e,t,n)=>{var r=n(2597),o=n(3887),i=n(1236),s=n(3070);e.exports=function(e,t,n){for(var a=o(t),l=s.f,c=i.f,u=0;u<a.length;u++){var d=a[u];r(e,d)||n&&r(n,d)||l(e,d,c(t,d))}}},8544:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},4994:(e,t,n)=>{"use strict";var r=n(3383).IteratorPrototype,o=n(30),i=n(9114),s=n(8003),a=n(7497),l=function(){return this};e.exports=function(e,t,n,c){var u=t+" Iterator";return e.prototype=o(r,{next:i(+!c,n)}),s(e,u,!1,!0),a[u]=l,e}},8880:(e,t,n)=>{var r=n(9781),o=n(3070),i=n(9114);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},9114:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6135:(e,t,n)=>{"use strict";var r=n(4948),o=n(3070),i=n(9114);e.exports=function(e,t,n){var s=r(t);s in e?o.f(e,s,i(0,n)):e[s]=n}},654:(e,t,n)=>{"use strict";var r=n(2109),o=n(6916),i=n(1913),s=n(6530),a=n(614),l=n(4994),c=n(9518),u=n(7674),d=n(8003),f=n(8880),h=n(1320),p=n(5112),m=n(7497),v=n(3383),g=s.PROPER,b=s.CONFIGURABLE,y=v.IteratorPrototype,w=v.BUGGY_SAFARI_ITERATORS,x=p("iterator"),k="keys",S="values",E="entries",C=function(){return this};e.exports=function(e,t,n,s,p,v,_){l(n,t,s);var T,O,L,R=function(e){if(e===p&&F)return F;if(!w&&e in I)return I[e];switch(e){case k:case S:case E:return function(){return new n(this,e)}}return function(){return new n(this)}},D=t+" Iterator",A=!1,I=e.prototype,M=I[x]||I["@@iterator"]||p&&I[p],F=!w&&M||R(p),P="Array"==t&&I.entries||M;if(P&&(T=c(P.call(new e)))!==Object.prototype&&T.next&&(i||c(T)===y||(u?u(T,y):a(T[x])||h(T,x,C)),d(T,D,!0,!0),i&&(m[D]=C)),g&&p==S&&M&&M.name!==S&&(!i&&b?f(I,"name",S):(A=!0,F=function(){return o(M,this)})),p)if(O={values:R(S),keys:v?F:R(k),entries:R(E)},_)for(L in O)(w||A||!(L in I))&&h(I,L,O[L]);else r({target:t,proto:!0,forced:w||A},O);return i&&!_||I[x]===F||h(I,x,F,{name:p}),m[t]=F,O}},9781:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},317:(e,t,n)=>{var r=n(7854),o=n(111),i=r.document,s=o(i)&&o(i.createElement);e.exports=function(e){return s?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,t,n)=>{var r=n(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},5268:(e,t,n)=>{var r=n(4326),o=n(7854);e.exports="process"==r(o.process)},8113:(e,t,n)=>{var r=n(5005);e.exports=r("navigator","userAgent")||""},7392:(e,t,n)=>{var r,o,i=n(7854),s=n(8113),a=i.process,l=i.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(o=(r=u.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&s&&(!(r=s.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=s.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(e,t,n)=>{var r=n(7854),o=n(1236).f,i=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,h,p=e.target,m=e.global,v=e.stat;if(n=m?r:v?r[p]||a(p,{}):(r[p]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(h=o(n,u))&&h.value:n[u],!c(m?u:p+(v?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&i(f,"sham",!0),s(n,u,f,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,t,n)=>{"use strict";n(4916);var r=n(1702),o=n(1320),i=n(2261),s=n(7293),a=n(5112),l=n(8880),c=a("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var f=a(e),h=!s((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),p=h&&!s((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!p||n){var m=r(/./[f]),v=t(f,""[e],(function(e,t,n,o,s){var a=r(e),l=t.exec;return l===i||l===u.exec?h&&!s?{done:!0,value:m(t,n,o)}:{done:!0,value:a(n,t,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(u,f,v[1])}d&&l(u[f],"sham",!0)}},6677:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.apply,s=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?s.bind(i):function(){return s.apply(i,arguments)})},9974:(e,t,n)=>{var r=n(1702),o=n(9662),i=n(4374),s=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?s(e,t):function(){return e.apply(t,arguments)}}},4374:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},6916:(e,t,n)=>{var r=n(4374),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:(e,t,n)=>{var r=n(9781),o=n(2597),i=Function.prototype,s=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),l=a&&"something"===function(){}.name,c=a&&(!r||r&&s(i,"name").configurable);e.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},1702:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.bind,s=o.call,a=r&&i.bind(s,s);e.exports=r?function(e){return e&&a(e)}:function(e){return e&&function(){return s.apply(e,arguments)}}},5005:(e,t,n)=>{var r=n(7854),o=n(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},1246:(e,t,n)=>{var r=n(648),o=n(8173),i=n(7497),s=n(5112)("iterator");e.exports=function(e){if(null!=e)return o(e,s)||o(e,"@@iterator")||i[r(e)]}},8554:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9662),s=n(9670),a=n(6330),l=n(1246),c=r.TypeError;e.exports=function(e,t){var n=arguments.length<2?l(e):t;if(i(n))return s(o(n,e));throw c(a(e)+" is not iterable")}},8173:(e,t,n)=>{var r=n(9662);e.exports=function(e,t){var n=e[t];return null==n?void 0:r(n)}},647:(e,t,n)=>{var r=n(1702),o=n(7908),i=Math.floor,s=r("".charAt),a=r("".replace),l=r("".slice),c=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,r,d,f){var h=n+e.length,p=r.length,m=u;return void 0!==d&&(d=o(d),m=c),a(f,m,(function(o,a){var c;switch(s(a,0)){case"$":return"$";case"&":return e;case"`":return l(t,0,n);case"'":return l(t,h);case"<":c=d[l(a,1,-1)];break;default:var u=+a;if(0===u)return o;if(u>p){var f=i(u/10);return 0===f?o:f<=p?void 0===r[f-1]?s(a,1):r[f-1]+s(a,1):o}c=r[u-1]}return void 0===c?"":c}))}},7854:(e,t,n)=>{var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:(e,t,n)=>{var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},3501:e=>{e.exports={}},490:(e,t,n)=>{var r=n(5005);e.exports=r("document","documentElement")},4664:(e,t,n)=>{var r=n(9781),o=n(7293),i=n(317);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:(e,t,n)=>{var r=n(7854),o=n(1702),i=n(7293),s=n(4326),a=r.Object,l=o("".split);e.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"==s(e)?l(e,""):a(e)}:a},9587:(e,t,n)=>{var r=n(614),o=n(111),i=n(7674);e.exports=function(e,t,n){var s,a;return i&&r(s=t.constructor)&&s!==n&&o(a=s.prototype)&&a!==n.prototype&&i(e,a),e}},2788:(e,t,n)=>{var r=n(1702),o=n(614),i=n(5465),s=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return s(e)}),e.exports=i.inspectSource},2423:(e,t,n)=>{var r=n(2109),o=n(1702),i=n(3501),s=n(111),a=n(2597),l=n(3070).f,c=n(8006),u=n(1156),d=n(2050),f=n(9711),h=n(6677),p=!1,m=f("meta"),v=0,g=function(e){l(e,m,{value:{objectID:"O"+v++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},p=!0;var e=c.f,t=o([].splice),n={};n[m]=1,e(n).length&&(c.f=function(n){for(var r=e(n),o=0,i=r.length;o<i;o++)if(r[o]===m){t(r,o,1);break}return r},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!s(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,m)){if(!d(e))return"F";if(!t)return"E";g(e)}return e[m].objectID},getWeakData:function(e,t){if(!a(e,m)){if(!d(e))return!0;if(!t)return!1;g(e)}return e[m].weakData},onFreeze:function(e){return h&&p&&d(e)&&!a(e,m)&&g(e),e}};i[m]=!0},9909:(e,t,n)=>{var r,o,i,s=n(8536),a=n(7854),l=n(1702),c=n(111),u=n(8880),d=n(2597),f=n(5465),h=n(6200),p=n(3501),m="Object already initialized",v=a.TypeError,g=a.WeakMap;if(s||f.state){var b=f.state||(f.state=new g),y=l(b.get),w=l(b.has),x=l(b.set);r=function(e,t){if(w(b,e))throw new v(m);return t.facade=e,x(b,e,t),t},o=function(e){return y(b,e)||{}},i=function(e){return w(b,e)}}else{var k=h("state");p[k]=!0,r=function(e,t){if(d(e,k))throw new v(m);return t.facade=e,u(e,k,t),t},o=function(e){return d(e,k)?e[k]:{}},i=function(e){return d(e,k)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw v("Incompatible receiver, "+e+" required");return n}}}},7659:(e,t,n)=>{var r=n(5112),o=n(7497),i=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||s[i]===e)}},3157:(e,t,n)=>{var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,t,n)=>{var r=n(1702),o=n(7293),i=n(614),s=n(648),a=n(5005),l=n(2788),c=function(){},u=[],d=a("Reflect","construct"),f=/^\s*(?:class|function)\b/,h=r(f.exec),p=!f.exec(c),m=function(e){if(!i(e))return!1;try{return d(c,u,e),!0}catch(e){return!1}},v=function(e){if(!i(e))return!1;switch(s(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!h(f,l(e))}catch(e){return!0}};v.sham=!0,e.exports=!d||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?v:m},4705:(e,t,n)=>{var r=n(7293),o=n(614),i=/#|\.prototype\./,s=function(e,t){var n=l[a(e)];return n==u||n!=c&&(o(t)?r(t):!!t)},a=s.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=s.data={},c=s.NATIVE="N",u=s.POLYFILL="P";e.exports=s},111:(e,t,n)=>{var r=n(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},2190:(e,t,n)=>{var r=n(7854),o=n(5005),i=n(614),s=n(7976),a=n(3307),l=r.Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return i(t)&&s(t.prototype,l(e))}},408:(e,t,n)=>{var r=n(7854),o=n(9974),i=n(6916),s=n(9670),a=n(6330),l=n(7659),c=n(6244),u=n(7976),d=n(8554),f=n(1246),h=n(9212),p=r.TypeError,m=function(e,t){this.stopped=e,this.result=t},v=m.prototype;e.exports=function(e,t,n){var r,g,b,y,w,x,k,S=n&&n.that,E=!(!n||!n.AS_ENTRIES),C=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),T=o(t,S),O=function(e){return r&&h(r,"normal",e),new m(!0,e)},L=function(e){return E?(s(e),_?T(e[0],e[1],O):T(e[0],e[1])):_?T(e,O):T(e)};if(C)r=e;else{if(!(g=f(e)))throw p(a(e)+" is not iterable");if(l(g)){for(b=0,y=c(e);y>b;b++)if((w=L(e[b]))&&u(v,w))return w;return new m(!1)}r=d(e,g)}for(x=r.next;!(k=i(x,r)).done;){try{w=L(k.value)}catch(e){h(r,"throw",e)}if("object"==typeof w&&w&&u(v,w))return w}return new m(!1)}},9212:(e,t,n)=>{var r=n(6916),o=n(9670),i=n(8173);e.exports=function(e,t,n){var s,a;o(e);try{if(!(s=i(e,"return"))){if("throw"===t)throw n;return n}s=r(s,e)}catch(e){a=!0,s=e}if("throw"===t)throw n;if(a)throw s;return o(s),n}},3383:(e,t,n)=>{"use strict";var r,o,i,s=n(7293),a=n(614),l=n(30),c=n(9518),u=n(1320),d=n(5112),f=n(1913),h=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=c(c(i)))!==Object.prototype&&(r=o):p=!0),null==r||s((function(){var e={};return r[h].call(e)!==e}))?r={}:f&&(r=l(r)),a(r[h])||u(r,h,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:e=>{e.exports={}},6244:(e,t,n)=>{var r=n(7466);e.exports=function(e){return r(e.length)}},133:(e,t,n)=>{var r=n(7392),o=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2788),s=r.WeakMap;e.exports=o(s)&&/native code/.test(i(s))},3009:(e,t,n)=>{var r=n(7854),o=n(7293),i=n(1702),s=n(1340),a=n(3111).trim,l=n(1361),c=r.parseInt,u=r.Symbol,d=u&&u.iterator,f=/^[+-]?0x/i,h=i(f.exec),p=8!==c(l+"08")||22!==c(l+"0x16")||d&&!o((function(){c(Object(d))}));e.exports=p?function(e,t){var n=a(s(e));return c(n,t>>>0||(h(f,n)?16:10))}:c},1574:(e,t,n)=>{"use strict";var r=n(9781),o=n(1702),i=n(6916),s=n(7293),a=n(1956),l=n(5181),c=n(5296),u=n(7908),d=n(8361),f=Object.assign,h=Object.defineProperty,p=o([].concat);e.exports=!f||s((function(){if(r&&1!==f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=f({},e)[n]||a(f({},t)).join("")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,s=1,f=l.f,h=c.f;o>s;)for(var m,v=d(arguments[s++]),g=f?p(a(v),f(v)):a(v),b=g.length,y=0;b>y;)m=g[y++],r&&!i(h,v,m)||(n[m]=v[m]);return n}:f},30:(e,t,n)=>{var r,o=n(9670),i=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200)("IE_PROTO"),d=function(){},f=function(e){return"<script>"+e+"<\/script>"},h=function(e){e.write(f("")),e.close();var t=e.parentWindow.Object;return e=null,t},p=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}var e,t;p="undefined"!=typeof document?document.domain&&r?h(r):((t=c("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(f("document.F=Object")),e.close(),e.F):h(r);for(var n=s.length;n--;)delete p.prototype[s[n]];return p()};a[u]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(d.prototype=o(e),n=new d,d.prototype=null,n[u]=e):n=p(),void 0===t?n:i.f(n,t)}},6048:(e,t,n)=>{var r=n(9781),o=n(3353),i=n(3070),s=n(9670),a=n(5656),l=n(1956);t.f=r&&!o?Object.defineProperties:function(e,t){s(e);for(var n,r=a(t),o=l(t),c=o.length,u=0;c>u;)i.f(e,n=o[u++],r[n]);return e}},3070:(e,t,n)=>{var r=n(7854),o=n(9781),i=n(4664),s=n(3353),a=n(9670),l=n(4948),c=r.TypeError,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor;t.f=o?s?function(e,t,n){if(a(e),t=l(t),a(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=d(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(a(e),t=l(t),a(n),i)try{return u(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:(e,t,n)=>{var r=n(9781),o=n(6916),i=n(5296),s=n(9114),a=n(5656),l=n(4948),c=n(2597),u=n(4664),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),u)try{return d(e,t)}catch(e){}if(c(e,t))return s(!o(i.f,e,t),e[t])}},1156:(e,t,n)=>{var r=n(4326),o=n(5656),i=n(8006).f,s=n(1589),a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"Window"==r(e)?function(e){try{return i(e)}catch(e){return s(a)}}(e):i(o(e))}},8006:(e,t,n)=>{var r=n(6324),o=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},5181:(e,t)=>{t.f=Object.getOwnPropertySymbols},9518:(e,t,n)=>{var r=n(7854),o=n(2597),i=n(614),s=n(7908),a=n(6200),l=n(8544),c=a("IE_PROTO"),u=r.Object,d=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=s(e);if(o(t,c))return t[c];var n=t.constructor;return i(n)&&t instanceof n?n.prototype:t instanceof u?d:null}},2050:(e,t,n)=>{var r=n(7293),o=n(111),i=n(4326),s=n(7556),a=Object.isExtensible,l=r((function(){a(1)}));e.exports=l||s?function(e){return!!o(e)&&(!s||"ArrayBuffer"!=i(e))&&(!a||a(e))}:a},7976:(e,t,n)=>{var r=n(1702);e.exports=r({}.isPrototypeOf)},6324:(e,t,n)=>{var r=n(1702),o=n(2597),i=n(5656),s=n(1318).indexOf,a=n(3501),l=r([].push);e.exports=function(e,t){var n,r=i(e),c=0,u=[];for(n in r)!o(a,n)&&o(r,n)&&l(u,n);for(;t.length>c;)o(r,n=t[c++])&&(~s(u,n)||l(u,n));return u}},1956:(e,t,n)=>{var r=n(6324),o=n(748);e.exports=Object.keys||function(e){return r(e,o)}},5296:(e,t)=>{"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:(e,t,n)=>{var r=n(1702),o=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return o(n),i(r),t?e(n,r):n.__proto__=r,n}}():void 0)},288:(e,t,n)=>{"use strict";var r=n(1694),o=n(648);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},2140:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(614),s=n(111),a=r.TypeError;e.exports=function(e,t){var n,r;if("string"===t&&i(n=e.toString)&&!s(r=o(n,e)))return r;if(i(n=e.valueOf)&&!s(r=o(n,e)))return r;if("string"!==t&&i(n=e.toString)&&!s(r=o(n,e)))return r;throw a("Can't convert object to primitive value")}},3887:(e,t,n)=>{var r=n(5005),o=n(1702),i=n(8006),s=n(5181),a=n(9670),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=s.f;return n?l(t,n(e)):t}},2248:(e,t,n)=>{var r=n(1320);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},1320:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2597),s=n(8880),a=n(3505),l=n(2788),c=n(9909),u=n(6530).CONFIGURABLE,d=c.get,f=c.enforce,h=String(String).split("String");(e.exports=function(e,t,n,l){var c,d=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,m=!!l&&!!l.noTargetGet,v=l&&void 0!==l.name?l.name:t;o(n)&&("Symbol("===String(v).slice(0,7)&&(v="["+String(v).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!i(n,"name")||u&&n.name!==v)&&s(n,"name",v),(c=f(n)).source||(c.source=h.join("string"==typeof v?v:""))),e!==r?(d?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:s(e,t,n)):p?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return o(this)&&d(this).source||l(this)}))},7651:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9670),s=n(614),a=n(4326),l=n(2261),c=r.TypeError;e.exports=function(e,t){var n=e.exec;if(s(n)){var r=o(n,e,t);return null!==r&&i(r),r}if("RegExp"===a(e))return o(l,e,t);throw c("RegExp#exec called on incompatible receiver")}},2261:(e,t,n)=>{"use strict";var r,o,i=n(6916),s=n(1702),a=n(1340),l=n(7066),c=n(2999),u=n(2309),d=n(30),f=n(9909).get,h=n(9441),p=n(7168),m=u("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,g=v,b=s("".charAt),y=s("".indexOf),w=s("".replace),x=s("".slice),k=(o=/b*/g,i(v,r=/a/,"a"),i(v,o,"a"),0!==r.lastIndex||0!==o.lastIndex),S=c.BROKEN_CARET,E=void 0!==/()??/.exec("")[1];(k||E||S||h||p)&&(g=function(e){var t,n,r,o,s,c,u,h=this,p=f(h),C=a(e),_=p.raw;if(_)return _.lastIndex=h.lastIndex,t=i(g,_,C),h.lastIndex=_.lastIndex,t;var T=p.groups,O=S&&h.sticky,L=i(l,h),R=h.source,D=0,A=C;if(O&&(L=w(L,"y",""),-1===y(L,"g")&&(L+="g"),A=x(C,h.lastIndex),h.lastIndex>0&&(!h.multiline||h.multiline&&"\n"!==b(C,h.lastIndex-1))&&(R="(?: "+R+")",A=" "+A,D++),n=new RegExp("^(?:"+R+")",L)),E&&(n=new RegExp("^"+R+"$(?!\\s)",L)),k&&(r=h.lastIndex),o=i(v,O?n:h,A),O?o?(o.input=x(o.input,D),o[0]=x(o[0],D),o.index=h.lastIndex,h.lastIndex+=o[0].length):h.lastIndex=0:k&&o&&(h.lastIndex=h.global?o.index+o[0].length:r),E&&o&&o.length>1&&i(m,o[0],n,(function(){for(s=1;s<arguments.length-2;s++)void 0===arguments[s]&&(o[s]=void 0)})),o&&T)for(o.groups=c=d(null),s=0;s<T.length;s++)c[(u=T[s])[0]]=o[u[1]];return o}),e.exports=g},7066:(e,t,n)=>{"use strict";var r=n(9670);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},2999:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp,i=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),s=i||r((function(){return!o("a","y").sticky})),a=i||r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));e.exports={BROKEN_CARET:a,MISSED_STICKY:s,UNSUPPORTED_Y:i}},9441:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},7168:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},4488:(e,t,n)=>{var r=n(7854).TypeError;e.exports=function(e){if(null==e)throw r("Can't call method on "+e);return e}},3505:(e,t,n)=>{var r=n(7854),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},8003:(e,t,n)=>{var r=n(3070).f,o=n(2597),i=n(5112)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!o(e,i)&&r(e,i,{configurable:!0,value:t})}},6200:(e,t,n)=>{var r=n(2309),o=n(9711),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},5465:(e,t,n)=>{var r=n(7854),o=n(3505),i="__core-js_shared__",s=r[i]||o(i,{});e.exports=s},2309:(e,t,n)=>{var r=n(1913),o=n(5465);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.21.0",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE",source:"https://github.com/zloirock/core-js"})},8710:(e,t,n)=>{var r=n(1702),o=n(9303),i=n(1340),s=n(4488),a=r("".charAt),l=r("".charCodeAt),c=r("".slice),u=function(e){return function(t,n){var r,u,d=i(s(t)),f=o(n),h=d.length;return f<0||f>=h?e?"":void 0:(r=l(d,f))<55296||r>56319||f+1===h||(u=l(d,f+1))<56320||u>57343?e?a(d,f):r:e?c(d,f,f+2):u-56320+(r-55296<<10)+65536}};e.exports={codeAt:u(!1),charAt:u(!0)}},3111:(e,t,n)=>{var r=n(1702),o=n(4488),i=n(1340),s=n(1361),a=r("".replace),l="["+s+"]",c=RegExp("^"+l+l+"*"),u=RegExp(l+l+"*$"),d=function(e){return function(t){var n=i(o(t));return 1&e&&(n=a(n,c,"")),2&e&&(n=a(n,u,"")),n}};e.exports={start:d(1),end:d(2),trim:d(3)}},1400:(e,t,n)=>{var r=n(9303),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},5656:(e,t,n)=>{var r=n(8361),o=n(4488);e.exports=function(e){return r(o(e))}},9303:e=>{var t=Math.ceil,n=Math.floor;e.exports=function(e){var r=+e;return r!=r||0===r?0:(r>0?n:t)(r)}},7466:(e,t,n)=>{var r=n(9303),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},7908:(e,t,n)=>{var r=n(7854),o=n(4488),i=r.Object;e.exports=function(e){return i(o(e))}},7593:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(111),s=n(2190),a=n(8173),l=n(2140),c=n(5112),u=r.TypeError,d=c("toPrimitive");e.exports=function(e,t){if(!i(e)||s(e))return e;var n,r=a(e,d);if(r){if(void 0===t&&(t="default"),n=o(r,e,t),!i(n)||s(n))return n;throw u("Can't convert object to primitive value")}return void 0===t&&(t="number"),l(e,t)}},4948:(e,t,n)=>{var r=n(7593),o=n(2190);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},1694:(e,t,n)=>{var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},1340:(e,t,n)=>{var r=n(7854),o=n(648),i=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return i(e)}},6330:(e,t,n)=>{var r=n(7854).String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},9711:(e,t,n)=>{var r=n(1702),o=0,i=Math.random(),s=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+s(++o+i,36)}},3307:(e,t,n)=>{var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(e,t,n)=>{var r=n(9781),o=n(7293);e.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},5112:(e,t,n)=>{var r=n(7854),o=n(2309),i=n(2597),s=n(9711),a=n(133),l=n(3307),c=o("wks"),u=r.Symbol,d=u&&u.for,f=l?u:u&&u.withoutSetter||s;e.exports=function(e){if(!i(c,e)||!a&&"string"!=typeof c[e]){var t="Symbol."+e;a&&i(u,e)?c[e]=u[e]:c[e]=l&&d?d(t):f(t)}return c[e]}},1361:e=>{e.exports="\t\n\v\f\r                　\u2028\u2029\ufeff"},7327:(e,t,n)=>{"use strict";var r=n(2109),o=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},9554:(e,t,n)=>{"use strict";var r=n(2109),o=n(8533);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},6992:(e,t,n)=>{"use strict";var r=n(5656),o=n(1223),i=n(7497),s=n(9909),a=n(3070).f,l=n(654),c=n(1913),u=n(9781),d="Array Iterator",f=s.set,h=s.getterFor(d);e.exports=l(Array,"Array",(function(e,t){f(this,{type:d,target:r(e),index:0,kind:t})}),(function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var p=i.Arguments=i.Array;if(o("keys"),o("values"),o("entries"),!c&&u&&"values"!==p.name)try{a(p,"name",{value:"values"})}catch(e){}},5827:(e,t,n)=>{"use strict";var r=n(2109),o=n(3671).left,i=n(9341),s=n(7392),a=n(5268);r({target:"Array",proto:!0,forced:!i("reduce")||!a&&s>79&&s<83},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},8309:(e,t,n)=>{var r=n(9781),o=n(6530).EXISTS,i=n(1702),s=n(3070).f,a=Function.prototype,l=i(a.toString),c=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,u=i(c.exec);r&&!o&&s(a,"name",{configurable:!0,get:function(){try{return u(c,l(this))[1]}catch(e){return""}}})},9601:(e,t,n)=>{var r=n(2109),o=n(1574);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},1539:(e,t,n)=>{var r=n(1694),o=n(1320),i=n(288);r||o(Object.prototype,"toString",i,{unsafe:!0})},1058:(e,t,n)=>{var r=n(2109),o=n(3009);r({global:!0,forced:parseInt!=o},{parseInt:o})},4916:(e,t,n)=>{"use strict";var r=n(2109),o=n(2261);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},8783:(e,t,n)=>{"use strict";var r=n(8710).charAt,o=n(1340),i=n(9909),s=n(654),a="String Iterator",l=i.set,c=i.getterFor(a);s(String,"String",(function(e){l(this,{type:a,string:o(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},4723:(e,t,n)=>{"use strict";var r=n(6916),o=n(7007),i=n(9670),s=n(7466),a=n(1340),l=n(4488),c=n(8173),u=n(1530),d=n(7651);o("match",(function(e,t,n){return[function(t){var n=l(this),o=null==t?void 0:c(t,e);return o?r(o,t,n):new RegExp(t)[e](a(n))},function(e){var r=i(this),o=a(e),l=n(t,r,o);if(l.done)return l.value;if(!r.global)return d(r,o);var c=r.unicode;r.lastIndex=0;for(var f,h=[],p=0;null!==(f=d(r,o));){var m=a(f[0]);h[p]=m,""===m&&(r.lastIndex=u(o,s(r.lastIndex),c)),p++}return 0===p?null:h}]}))},5306:(e,t,n)=>{"use strict";var r=n(2104),o=n(6916),i=n(1702),s=n(7007),a=n(7293),l=n(9670),c=n(614),u=n(9303),d=n(7466),f=n(1340),h=n(4488),p=n(1530),m=n(8173),v=n(647),g=n(7651),b=n(5112)("replace"),y=Math.max,w=Math.min,x=i([].concat),k=i([].push),S=i("".indexOf),E=i("".slice),C="$0"==="a".replace(/./,"$0"),_=!!/./[b]&&""===/./[b]("a","$0");s("replace",(function(e,t,n){var i=_?"$":"$0";return[function(e,n){var r=h(this),i=null==e?void 0:m(e,b);return i?o(i,e,r,n):o(t,f(r),e,n)},function(e,o){var s=l(this),a=f(e);if("string"==typeof o&&-1===S(o,i)&&-1===S(o,"$<")){var h=n(t,s,a,o);if(h.done)return h.value}var m=c(o);m||(o=f(o));var b=s.global;if(b){var C=s.unicode;s.lastIndex=0}for(var _=[];;){var T=g(s,a);if(null===T)break;if(k(_,T),!b)break;""===f(T[0])&&(s.lastIndex=p(a,d(s.lastIndex),C))}for(var O,L="",R=0,D=0;D<_.length;D++){for(var A=f((T=_[D])[0]),I=y(w(u(T.index),a.length),0),M=[],F=1;F<T.length;F++)k(M,void 0===(O=T[F])?O:String(O));var P=T.groups;if(m){var H=x([A],M,I,a);void 0!==P&&k(H,P);var N=f(r(o,void 0,H))}else N=v(A,a,I,M,P,o);I>=R&&(L+=E(a,R,I)+N,R=I+A.length)}return L+E(a,R)}]}),!!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!C||_)},4129:(e,t,n)=>{"use strict";var r,o=n(7854),i=n(1702),s=n(2248),a=n(2423),l=n(7710),c=n(9320),u=n(111),d=n(2050),f=n(9909).enforce,h=n(8536),p=!o.ActiveXObject&&"ActiveXObject"in o,m=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},v=l("WeakMap",m,c);if(h&&p){r=c.getConstructor(m,"WeakMap",!0),a.enable();var g=v.prototype,b=i(g.delete),y=i(g.has),w=i(g.get),x=i(g.set);s(g,{delete:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),b(this,e)||t.frozen.delete(e)}return b(this,e)},has:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)||t.frozen.has(e)}return y(this,e)},get:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)?w(this,e):t.frozen.get(e)}return w(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=f(this);n.frozen||(n.frozen=new r),y(this,e)?x(this,e,t):n.frozen.set(e,t)}else x(this,e,t);return this}})}},4747:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(8533),a=n(8880),l=function(e){if(e&&e.forEach!==s)try{a(e,"forEach",s)}catch(t){e.forEach=s}};for(var c in o)o[c]&&l(r[c]&&r[c].prototype);l(i)},3948:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(6992),a=n(8880),l=n(5112),c=l("iterator"),u=l("toStringTag"),d=s.values,f=function(e,t){if(e){if(e[c]!==d)try{a(e,c,d)}catch(t){e[c]=d}if(e[u]||a(e,u,t),o[t])for(var n in s)if(e[n]!==s[n])try{a(e,n,s[n])}catch(t){e[n]=s[n]}}};for(var h in o)f(r[h]&&r[h].prototype,h);f(i,"DOMTokenList")},9843:(e,t,n)=>{e.exports={ResizeSensor:n(6087),ElementQueries:n(6456)}},6456:function(e,t,n){"use strict";var r,o,i;"undefined"!=typeof window&&window,o=[n(6087)],void 0===(i="function"==typeof(r=function(e){var t=function(){var t,n={},r=[];function o(e){e||(e=document.documentElement);var t=window.getComputedStyle(e,null).fontSize;return parseFloat(t)||16}function i(e,t){var n=t.split(/\d/),r=n[n.length-1];switch(t=parseFloat(t),r){case"px":default:return t;case"em":return t*o(e);case"rem":return t*o();case"vw":return t*document.documentElement.clientWidth/100;case"vh":return t*document.documentElement.clientHeight/100;case"vmin":case"vmax":var i=document.documentElement.clientWidth/100,s=document.documentElement.clientHeight/100;return t*(0,Math["vmin"===r?"min":"max"])(i,s)}}function s(e,t){var r,o,s,a,l,c,u,d;this.element=e;var f=["min-width","min-height","max-width","max-height"];this.call=function(){for(r in s=function(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}(this.element),c={},n[t])n[t].hasOwnProperty(r)&&(o=n[t][r],a=i(this.element,o.value),l="width"===o.property?s.width:s.height,d=o.mode+"-"+o.property,u="","min"===o.mode&&l>=a&&(u+=o.value),"max"===o.mode&&l<=a&&(u+=o.value),c[d]||(c[d]=""),u&&-1===(" "+c[d]+" ").indexOf(" "+u+" ")&&(c[d]+=" "+u));for(var e in f)f.hasOwnProperty(e)&&(c[f[e]]?this.element.setAttribute(f[e],c[f[e]].substr(1)):this.element.removeAttribute(f[e]))}}function a(t,n){t.elementQueriesSetupInformation||(t.elementQueriesSetupInformation=new s(t,n)),t.elementQueriesSensor||(t.elementQueriesSensor=new e(t,(function(){t.elementQueriesSetupInformation.call()})))}function l(e,o,i,s){if(void 0===n[e]){n[e]=[];var a=r.length;t.innerHTML+="\n"+e+" {animation: 0.1s element-queries;}",t.innerHTML+="\n"+e+" > .resize-sensor {min-width: "+a+"px;}",r.push(e)}n[e].push({mode:o,property:i,value:s})}function c(e){var t;if(document.querySelectorAll&&(t=e?e.querySelectorAll.bind(e):document.querySelectorAll.bind(document)),t||"undefined"==typeof $$||(t=$$),t||"undefined"==typeof jQuery||(t=jQuery),!t)throw"No document.querySelectorAll, jQuery or Mootools's $$ found.";return t}function u(t){var n=[],r=[],o=[],i=0,s=-1,a=[];for(var l in t.children)if(t.children.hasOwnProperty(l)&&t.children[l].tagName&&"img"===t.children[l].tagName.toLowerCase()){n.push(t.children[l]);var c=t.children[l].getAttribute("min-width")||t.children[l].getAttribute("data-min-width"),u=t.children[l].getAttribute("data-src")||t.children[l].getAttribute("url");o.push(u);var d={minWidth:c};r.push(d),c?t.children[l].style.display="none":(i=n.length-1,t.children[l].style.display="block")}function f(){var e,l=!1;for(e in n)n.hasOwnProperty(e)&&r[e].minWidth&&t.offsetWidth>r[e].minWidth&&(l=e);if(l||(l=i),s!==l)if(a[l])n[s].style.display="none",n[l].style.display="block",s=l;else{var c=new Image;c.onload=function(){n[l].src=o[l],n[s].style.display="none",n[l].style.display="block",a[l]=!0,s=l},c.src=o[l]}else n[l].src=o[l]}s=i,t.resizeSensorInstance=new e(t,f),f()}var d=/,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:min|max)-(?:width|height)[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim,f=/\[[\s\t]*?(min|max)-(width|height)[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;function h(e){var t,n,r,o;for(e=e.replace(/'/g,'"');null!==(t=d.exec(e));)for(n=t[1]+t[3],r=t[2];null!==(o=f.exec(r));)l(n,o[1],o[2],o[3])}function p(e){var t="";if(e)if("string"==typeof e)-1===(e=e.toLowerCase()).indexOf("min-width")&&-1===e.indexOf("max-width")||h(e);else for(var n=0,r=e.length;n<r;n++)1===e[n].type?-1!==(t=e[n].selectorText||e[n].cssText).indexOf("min-height")||-1!==t.indexOf("max-height")?h(t):-1===t.indexOf("min-width")&&-1===t.indexOf("max-width")||h(t):4===e[n].type?p(e[n].cssRules||e[n].rules):3===e[n].type&&e[n].styleSheet.hasOwnProperty("cssRules")&&p(e[n].styleSheet.cssRules)}var m=!1;this.init=function(){var n="animationstart";void 0!==document.documentElement.style.webkitAnimationName?n="webkitAnimationStart":void 0!==document.documentElement.style.MozAnimationName?n="mozanimationstart":void 0!==document.documentElement.style.OAnimationName&&(n="oanimationstart"),document.body.addEventListener(n,(function(t){var n=t.target,o=n&&window.getComputedStyle(n,null),i=o&&o.getPropertyValue("animation-name");if(i&&-1!==i.indexOf("element-queries")){n.elementQueriesSensor=new e(n,(function(){n.elementQueriesSetupInformation&&n.elementQueriesSetupInformation.call()}));var s=window.getComputedStyle(n.resizeSensor,null).getPropertyValue("min-width");s=parseInt(s.replace("px","")),a(t.target,r[s])}})),m||((t=document.createElement("style")).type="text/css",t.innerHTML="[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}",t.innerHTML+="\n@keyframes element-queries { 0% { visibility: inherit; } }",document.getElementsByTagName("head")[0].appendChild(t),m=!0);for(var o=0,i=document.styleSheets.length;o<i;o++)try{document.styleSheets[o].href&&0===document.styleSheets[o].href.indexOf("file://")&&console.warn("CssElementQueries: unable to parse local css files, "+document.styleSheets[o].href),p(document.styleSheets[o].cssRules||document.styleSheets[o].rules||document.styleSheets[o].cssText)}catch(e){}!function(){for(var e=c()("[data-responsive-image],[responsive-image]"),t=0,n=e.length;t<n;t++)u(e[t])}()},this.findElementQueriesElements=function(e){!function(e){var t=c(e);for(var r in n)if(n.hasOwnProperty(r))for(var o=t(r,e),i=0,s=o.length;i<s;i++)a(o[i],r)}(e)},this.update=function(){this.init()}};t.update=function(){t.instance.update()},t.detach=function(e){e.elementQueriesSetupInformation?(e.elementQueriesSensor.detach(),delete e.elementQueriesSetupInformation,delete e.elementQueriesSensor):e.resizeSensorInstance&&(e.resizeSensorInstance.detach(),delete e.resizeSensorInstance)},t.init=function(){t.instance||(t.instance=new t),t.instance.init()};return t.findElementQueriesElements=function(e){t.instance.findElementQueriesElements(e)},t.listen=function(){!function(e){if(document.addEventListener)document.addEventListener("DOMContentLoaded",e,!1);else if(/KHTML|WebKit|iCab/i.test(navigator.userAgent))var t=setInterval((function(){/loaded|complete/i.test(document.readyState)&&(e(),clearInterval(t))}),10);else window.onload=e}(t.init)},t})?r.apply(t,o):r)||(e.exports=i)},6087:function(e,t,n){"use strict";var r,o;"undefined"!=typeof window&&window,void 0===(o="function"==typeof(r=function(){if("undefined"==typeof window)return null;var e="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||function(t){return e.setTimeout(t,20)},n=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||function(t){e.clearTimeout(t)};function r(e,t){var n=Object.prototype.toString.call(e),r="[object Array]"===n||"[object NodeList]"===n||"[object HTMLCollection]"===n||"[object Object]"===n||"undefined"!=typeof jQuery&&e instanceof jQuery||"undefined"!=typeof Elements&&e instanceof Elements,o=0,i=e.length;if(r)for(;o<i;o++)t(e[o]);else t(e)}function o(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}function i(e,t){Object.keys(t).forEach((function(n){e.style[n]=t[n]}))}var s=function(e,a){var l=0;function c(){var e,t,n=[];this.add=function(e){n.push(e)},this.call=function(r){for(e=0,t=n.length;e<t;e++)n[e].call(this,r)},this.remove=function(r){var o=[];for(e=0,t=n.length;e<t;e++)n[e]!==r&&o.push(n[e]);n=o},this.length=function(){return n.length}}function u(e,n){if(e)if(e.resizedAttached)e.resizedAttached.add(n);else{e.resizedAttached=new c,e.resizedAttached.add(n),e.resizeSensor=document.createElement("div"),e.resizeSensor.dir="ltr",e.resizeSensor.className="resize-sensor";var r={pointerEvents:"none",position:"absolute",left:"0px",top:"0px",right:"0px",bottom:"0px",overflow:"hidden",zIndex:"-1",visibility:"hidden",maxWidth:"100%"},s={position:"absolute",left:"0px",top:"0px",transition:"0s"};i(e.resizeSensor,r);var a=document.createElement("div");a.className="resize-sensor-expand",i(a,r);var u=document.createElement("div");i(u,s),a.appendChild(u);var d=document.createElement("div");d.className="resize-sensor-shrink",i(d,r);var f=document.createElement("div");i(f,s),i(f,{width:"200%",height:"200%"}),d.appendChild(f),e.resizeSensor.appendChild(a),e.resizeSensor.appendChild(d),e.appendChild(e.resizeSensor);var h=window.getComputedStyle(e),p=h?h.getPropertyValue("position"):null;"absolute"!==p&&"relative"!==p&&"fixed"!==p&&"sticky"!==p&&(e.style.position="relative");var m=!1,v=0,g=o(e),b=0,y=0,w=!0;l=0;var x=function(){if(w){if(0===e.offsetWidth&&0===e.offsetHeight)return void(l||(l=t((function(){l=0,x()}))));w=!1}var n,r;n=e.offsetWidth,r=e.offsetHeight,u.style.width=n+10+"px",u.style.height=r+10+"px",a.scrollLeft=n+10,a.scrollTop=r+10,d.scrollLeft=n+10,d.scrollTop=r+10};e.resizeSensor.resetSensor=x;var k=function(){v=0,m&&(b=g.width,y=g.height,e.resizedAttached&&e.resizedAttached.call(g))},S=function(){g=o(e),(m=g.width!==b||g.height!==y)&&!v&&(v=t(k)),x()},E=function(e,t,n){e.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n)};E(a,"scroll",S),E(d,"scroll",S),l=t((function(){l=0,x()}))}}r(e,(function(e){u(e,a)})),this.detach=function(t){l||(n(l),l=0),s.detach(e,t)},this.reset=function(){e.resizeSensor.resetSensor()}};if(s.reset=function(e){r(e,(function(e){e.resizeSensor.resetSensor()}))},s.detach=function(e,t){r(e,(function(e){e&&(e.resizedAttached&&"function"==typeof t&&(e.resizedAttached.remove(t),e.resizedAttached.length())||e.resizeSensor&&(e.contains(e.resizeSensor)&&e.removeChild(e.resizeSensor),delete e.resizeSensor,delete e.resizedAttached))}))},"undefined"!=typeof MutationObserver){var a=new MutationObserver((function(e){for(var t in e)if(e.hasOwnProperty(t))for(var n=e[t].addedNodes,r=0;r<n.length;r++)n[r].resizeSensor&&s.reset(n[r])}));document.addEventListener("DOMContentLoaded",(function(e){a.observe(document.body,{childList:!0,subtree:!0})}))}return s})?r.call(t,n,t,e):r)||(e.exports=o)},1296:(e,t,n)=>{var r=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,s=/^0o[0-7]+$/i,a=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,u=l||c||Function("return this")(),d=Object.prototype.toString,f=Math.max,h=Math.min,p=function(){return u.Date.now()};function m(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(m(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=m(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=i.test(e);return n||s.test(e)?a(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,i,s,a,l,c=0,u=!1,d=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var n=r,i=o;return r=o=void 0,c=t,s=e.apply(i,n)}function y(e){return c=e,a=setTimeout(x,t),u?b(e):s}function w(e){var n=e-l;return void 0===l||n>=t||n<0||d&&e-c>=i}function x(){var e=p();if(w(e))return k(e);a=setTimeout(x,function(e){var n=t-(e-l);return d?h(n,i-(e-c)):n}(e))}function k(e){return a=void 0,g&&r?b(e):(r=o=void 0,s)}function S(){var e=p(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===a)return y(l);if(d)return a=setTimeout(x,t),b(l)}return void 0===a&&(a=setTimeout(x,t)),s}return t=v(t)||0,m(n)&&(u=!!n.leading,i=(d="maxWait"in n)?f(v(n.maxWait)||0,t):i,g="trailing"in n?!!n.trailing:g),S.cancel=function(){void 0!==a&&clearTimeout(a),c=0,r=l=o=a=void 0},S.flush=function(){return void 0===a?s:k(p())},S}},773:(e,t,n)=>{var r,o="__lodash_hash_undefined__",i=/^\[object .+?Constructor\]$/,s="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=s||a||Function("return this")(),c=Array.prototype,u=Function.prototype,d=Object.prototype,f=l["__core-js_shared__"],h=(r=/[^.]+$/.exec(f&&f.keys&&f.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",p=u.toString,m=d.hasOwnProperty,v=d.toString,g=RegExp("^"+p.call(m).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),b=c.splice,y=_(l,"Map"),w=_(Object,"create");function x(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function k(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function S(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function E(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function C(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function _(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return function(e){if(!O(e)||h&&h in e)return!1;var t=function(e){var t=O(e)?v.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?g:i;return t.test(function(e){if(null!=e){try{return p.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}(n)?n:void 0}function T(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var s=e.apply(this,r);return n.cache=i.set(o,s),s};return n.cache=new(T.Cache||S),n}function O(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}x.prototype.clear=function(){this.__data__=w?w(null):{}},x.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},x.prototype.get=function(e){var t=this.__data__;if(w){var n=t[e];return n===o?void 0:n}return m.call(t,e)?t[e]:void 0},x.prototype.has=function(e){var t=this.__data__;return w?void 0!==t[e]:m.call(t,e)},x.prototype.set=function(e,t){return this.__data__[e]=w&&void 0===t?o:t,this},k.prototype.clear=function(){this.__data__=[]},k.prototype.delete=function(e){var t=this.__data__,n=E(t,e);return!(n<0||(n==t.length-1?t.pop():b.call(t,n,1),0))},k.prototype.get=function(e){var t=this.__data__,n=E(t,e);return n<0?void 0:t[n][1]},k.prototype.has=function(e){return E(this.__data__,e)>-1},k.prototype.set=function(e,t){var n=this.__data__,r=E(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},S.prototype.clear=function(){this.__data__={hash:new x,map:new(y||k),string:new x}},S.prototype.delete=function(e){return C(this,e).delete(e)},S.prototype.get=function(e){return C(this,e).get(e)},S.prototype.has=function(e){return C(this,e).has(e)},S.prototype.set=function(e,t){return C(this,e).set(e,t),this},T.Cache=S,e.exports=T},3096:(e,t,n)=>{var r="Expected a function",o=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,u="object"==typeof self&&self&&self.Object===Object&&self,d=c||u||Function("return this")(),f=Object.prototype.toString,h=Math.max,p=Math.min,m=function(){return d.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var n=s.test(e);return n||a.test(e)?l(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var o=!0,i=!0;if("function"!=typeof e)throw new TypeError(r);return v(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),function(e,t,n){var o,i,s,a,l,c,u=0,d=!1,f=!1,b=!0;if("function"!=typeof e)throw new TypeError(r);function y(t){var n=o,r=i;return o=i=void 0,u=t,a=e.apply(r,n)}function w(e){return u=e,l=setTimeout(k,t),d?y(e):a}function x(e){var n=e-c;return void 0===c||n>=t||n<0||f&&e-u>=s}function k(){var e=m();if(x(e))return S(e);l=setTimeout(k,function(e){var n=t-(e-c);return f?p(n,s-(e-u)):n}(e))}function S(e){return l=void 0,b&&o?y(e):(o=i=void 0,a)}function E(){var e=m(),n=x(e);if(o=arguments,i=this,c=e,n){if(void 0===l)return w(c);if(f)return l=setTimeout(k,t),y(c)}return void 0===l&&(l=setTimeout(k,t)),a}return t=g(t)||0,v(n)&&(d=!!n.leading,s=(f="maxWait"in n)?h(g(n.maxWait)||0,t):s,b="trailing"in n?!!n.trailing:b),E.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},E.flush=function(){return void 0===l?a:S(m())},E}(e,t,{leading:o,maxWait:t,trailing:i})}},7924:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ne}),n(9554),n(4747);var r,o=n(1807),i=n.n(o),s=(n(7327),n(6992),n(9601),n(1539),n(1058),n(8783),n(4129),n(3948),n(3096)),a=n.n(s),l=n(1296),c=n.n(l),u=n(773),d=n.n(u),f=[],h="ResizeObserver loop completed with undelivered notifications.";!function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"}(r||(r={}));var p,m=function(e){return Object.freeze(e)},v=function(e,t){this.inlineSize=e,this.blockSize=t,m(this)},g=function(){function e(e,t,n,r){return this.x=e,this.y=t,this.width=n,this.height=r,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,m(this)}return e.prototype.toJSON=function(){var e=this;return{x:e.x,y:e.y,top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.width,height:e.height}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),b=function(e){return e instanceof SVGElement&&"getBBox"in e},y=function(e){if(b(e)){var t=e.getBBox(),n=t.width,r=t.height;return!n&&!r}var o=e,i=o.offsetWidth,s=o.offsetHeight;return!(i||s||e.getClientRects().length)},w=function(e){var t,n;if(e instanceof Element)return!0;var r=null===(n=null===(t=e)||void 0===t?void 0:t.ownerDocument)||void 0===n?void 0:n.defaultView;return!!(r&&e instanceof r.Element)},x="undefined"!=typeof window?window:{},k=new WeakMap,S=/auto|scroll/,E=/^tb|vertical/,C=/msie|trident/i.test(x.navigator&&x.navigator.userAgent),_=function(e){return parseFloat(e||"0")},T=function(e,t,n){return void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=!1),new v((n?t:e)||0,(n?e:t)||0)},O=m({devicePixelContentBoxSize:T(),borderBoxSize:T(),contentBoxSize:T(),contentRect:new g(0,0,0,0)}),L=function(e,t){if(void 0===t&&(t=!1),k.has(e)&&!t)return k.get(e);if(y(e))return k.set(e,O),O;var n=getComputedStyle(e),r=b(e)&&e.ownerSVGElement&&e.getBBox(),o=!C&&"border-box"===n.boxSizing,i=E.test(n.writingMode||""),s=!r&&S.test(n.overflowY||""),a=!r&&S.test(n.overflowX||""),l=r?0:_(n.paddingTop),c=r?0:_(n.paddingRight),u=r?0:_(n.paddingBottom),d=r?0:_(n.paddingLeft),f=r?0:_(n.borderTopWidth),h=r?0:_(n.borderRightWidth),p=r?0:_(n.borderBottomWidth),v=d+c,w=l+u,x=(r?0:_(n.borderLeftWidth))+h,L=f+p,R=a?e.offsetHeight-L-e.clientHeight:0,D=s?e.offsetWidth-x-e.clientWidth:0,A=o?v+x:0,I=o?w+L:0,M=r?r.width:_(n.width)-A-D,F=r?r.height:_(n.height)-I-R,P=M+v+D+x,H=F+w+R+L,N=m({devicePixelContentBoxSize:T(Math.round(M*devicePixelRatio),Math.round(F*devicePixelRatio),i),borderBoxSize:T(P,H,i),contentBoxSize:T(M,F,i),contentRect:new g(d,l,M,F)});return k.set(e,N),N},R=function(e,t,n){var o=L(e,n),i=o.borderBoxSize,s=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case r.DEVICE_PIXEL_CONTENT_BOX:return a;case r.BORDER_BOX:return i;default:return s}},D=function(e){var t=L(e);this.target=e,this.contentRect=t.contentRect,this.borderBoxSize=m([t.borderBoxSize]),this.contentBoxSize=m([t.contentBoxSize]),this.devicePixelContentBoxSize=m([t.devicePixelContentBoxSize])},A=function(e){if(y(e))return 1/0;for(var t=0,n=e.parentNode;n;)t+=1,n=n.parentNode;return t},I=function(){var e=1/0,t=[];f.forEach((function(n){if(0!==n.activeTargets.length){var r=[];n.activeTargets.forEach((function(t){var n=new D(t.target),o=A(t.target);r.push(n),t.lastReportedSize=R(t.target,t.observedBox),o<e&&(e=o)})),t.push((function(){n.callback.call(n.observer,r,n.observer)})),n.activeTargets.splice(0,n.activeTargets.length)}}));for(var n=0,r=t;n<r.length;n++)(0,r[n])();return e},M=function(e){f.forEach((function(t){t.activeTargets.splice(0,t.activeTargets.length),t.skippedTargets.splice(0,t.skippedTargets.length),t.observationTargets.forEach((function(n){n.isActive()&&(A(n.target)>e?t.activeTargets.push(n):t.skippedTargets.push(n))}))}))},F=[],P=0,H={attributes:!0,characterData:!0,childList:!0,subtree:!0},N=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],j=function(e){return void 0===e&&(e=0),Date.now()+e},W=!1,B=new(function(){function e(){var e=this;this.stopped=!0,this.listener=function(){return e.schedule()}}return e.prototype.run=function(e){var t=this;if(void 0===e&&(e=250),!W){W=!0;var n,r=j(e);n=function(){var n=!1;try{n=function(){var e,t=0;for(M(t);f.some((function(e){return e.activeTargets.length>0}));)t=I(),M(t);return f.some((function(e){return e.skippedTargets.length>0}))&&("function"==typeof ErrorEvent?e=new ErrorEvent("error",{message:h}):((e=document.createEvent("Event")).initEvent("error",!1,!1),e.message=h),window.dispatchEvent(e)),t>0}()}finally{if(W=!1,e=r-j(),!P)return;n?t.run(1e3):e>0?t.run(e):t.start()}},function(e){if(!p){var t=0,n=document.createTextNode("");new MutationObserver((function(){return F.splice(0).forEach((function(e){return e()}))})).observe(n,{characterData:!0}),p=function(){n.textContent=""+(t?t--:t++)}}F.push(e),p()}((function(){requestAnimationFrame(n)}))}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var e=this,t=function(){return e.observer&&e.observer.observe(document.body,H)};document.body?t():x.addEventListener("DOMContentLoaded",t)},e.prototype.start=function(){var e=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),N.forEach((function(t){return x.addEventListener(t,e.listener,!0)})))},e.prototype.stop=function(){var e=this;this.stopped||(this.observer&&this.observer.disconnect(),N.forEach((function(t){return x.removeEventListener(t,e.listener,!0)})),this.stopped=!0)},e}()),z=function(e){!P&&e>0&&B.start(),!(P+=e)&&B.stop()},V=function(){function e(e,t){this.target=e,this.observedBox=t||r.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var e,t=R(this.target,this.observedBox,!0);return e=this.target,b(e)||function(e){switch(e.tagName){case"INPUT":if("image"!==e.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(e)||"inline"!==getComputedStyle(e).display||(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),q=function(e,t){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=e,this.callback=t},$=new WeakMap,U=function(e,t){for(var n=0;n<e.length;n+=1)if(e[n].target===t)return n;return-1},Z=function(){function e(){}return e.connect=function(e,t){var n=new q(e,t);$.set(e,n)},e.observe=function(e,t,n){var r=$.get(e),o=0===r.observationTargets.length;U(r.observationTargets,t)<0&&(o&&f.push(r),r.observationTargets.push(new V(t,n&&n.box)),z(1),B.schedule())},e.unobserve=function(e,t){var n=$.get(e),r=U(n.observationTargets,t),o=1===n.observationTargets.length;r>=0&&(o&&f.splice(f.indexOf(n),1),n.observationTargets.splice(r,1),z(-1))},e.disconnect=function(e){var t=this,n=$.get(e);n.observationTargets.slice().forEach((function(n){return t.unobserve(e,n.target)})),n.activeTargets.splice(0,n.activeTargets.length)},e}(),Y=function(){function e(e){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof e)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Z.connect(this,e)}return e.prototype.observe=function(e,t){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.observe(this,e,t)},e.prototype.unobserve=function(e){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.unobserve(this,e)},e.prototype.disconnect=function(){Z.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}(),G=(n(5827),n(8309),n(4916),n(4723),n(5306),function(e){return Array.prototype.reduce.call(e,(function(e,t){var n=t.name.match(/data-simplebar-(.+)/);if(n){var r=n[1].replace(/\W+(.)/g,(function(e,t){return t.toUpperCase()}));switch(t.value){case"true":e[r]=!0;break;case"false":e[r]=!1;break;case void 0:e[r]=!0;break;default:e[r]=t.value}}return e}),{})});function J(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView?e.ownerDocument.defaultView:window}function K(e){return e&&e.ownerDocument?e.ownerDocument:document}var X=null,Q=null;function ee(e){if(null===X){var t=K(e);if(void 0===t)return X=0;var n=t.body,r=t.createElement("div");r.classList.add("simplebar-hide-scrollbar"),n.appendChild(r);var o=r.getBoundingClientRect().right;n.removeChild(r),X=o}return X}i()&&window.addEventListener("resize",(function(){Q!==window.devicePixelRatio&&(Q=window.devicePixelRatio,X=null)}));var te=function(){function e(t,n){var r=this;this.onScroll=function(){var e=J(r.el);r.scrollXTicking||(e.requestAnimationFrame(r.scrollX),r.scrollXTicking=!0),r.scrollYTicking||(e.requestAnimationFrame(r.scrollY),r.scrollYTicking=!0)},this.scrollX=function(){r.axis.x.isOverflowing&&(r.showScrollbar("x"),r.positionScrollbar("x")),r.scrollXTicking=!1},this.scrollY=function(){r.axis.y.isOverflowing&&(r.showScrollbar("y"),r.positionScrollbar("y")),r.scrollYTicking=!1},this.onMouseEnter=function(){r.showScrollbar("x"),r.showScrollbar("y")},this.onMouseMove=function(e){r.mouseX=e.clientX,r.mouseY=e.clientY,(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseMoveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseMoveForAxis("y")},this.onMouseLeave=function(){r.onMouseMove.cancel(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseLeaveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseLeaveForAxis("y"),r.mouseX=-1,r.mouseY=-1},this.onWindowResize=function(){r.scrollbarWidth=r.getScrollbarWidth(),r.hideNativeScrollbar()},this.hideScrollbars=function(){r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.track.rect)||(r.axis.y.scrollbar.el.classList.remove(r.classNames.visible),r.axis.y.isVisible=!1),r.isWithinBounds(r.axis.x.track.rect)||(r.axis.x.scrollbar.el.classList.remove(r.classNames.visible),r.axis.x.isVisible=!1)},this.onPointerEvent=function(e){var t,n;r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&(t=r.isWithinBounds(r.axis.x.track.rect)),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&(n=r.isWithinBounds(r.axis.y.track.rect)),(t||n)&&(e.preventDefault(),e.stopPropagation(),"mousedown"===e.type&&(t&&(r.axis.x.scrollbar.rect=r.axis.x.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.x.scrollbar.rect)?r.onDragStart(e,"x"):r.onTrackClick(e,"x")),n&&(r.axis.y.scrollbar.rect=r.axis.y.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.scrollbar.rect)?r.onDragStart(e,"y"):r.onTrackClick(e,"y"))))},this.drag=function(t){var n=r.axis[r.draggedAxis].track,o=n.rect[r.axis[r.draggedAxis].sizeAttr],i=r.axis[r.draggedAxis].scrollbar,s=r.contentWrapperEl[r.axis[r.draggedAxis].scrollSizeAttr],a=parseInt(r.elStyles[r.axis[r.draggedAxis].sizeAttr],10);t.preventDefault(),t.stopPropagation();var l=(("y"===r.draggedAxis?t.pageY:t.pageX)-n.rect[r.axis[r.draggedAxis].offsetAttr]-r.axis[r.draggedAxis].dragOffset)/(o-i.size)*(s-a);"x"===r.draggedAxis&&(l=r.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l-(o+i.size):l,l=r.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-l:l),r.contentWrapperEl[r.axis[r.draggedAxis].scrollOffsetAttr]=l},this.onEndDrag=function(e){var t=K(r.el),n=J(r.el);e.preventDefault(),e.stopPropagation(),r.el.classList.remove(r.classNames.dragging),t.removeEventListener("mousemove",r.drag,!0),t.removeEventListener("mouseup",r.onEndDrag,!0),r.removePreventClickId=n.setTimeout((function(){t.removeEventListener("click",r.preventClick,!0),t.removeEventListener("dblclick",r.preventClick,!0),r.removePreventClickId=null}))},this.preventClick=function(e){e.preventDefault(),e.stopPropagation()},this.el=t,this.minScrollbarWidth=20,this.options=Object.assign({},e.defaultOptions,{},n),this.classNames=Object.assign({},e.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,e.instances.has(this.el)||(this.recalculate=a()(this.recalculate.bind(this),64),this.onMouseMove=a()(this.onMouseMove.bind(this),64),this.hideScrollbars=c()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=c()(this.onWindowResize.bind(this),64,{leading:!0}),e.getRtlHelpers=d()(e.getRtlHelpers),this.init())}e.getRtlHelpers=function(){var t=document.createElement("div");t.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var n=t.firstElementChild;document.body.appendChild(n);var r=n.firstElementChild;n.scrollLeft=0;var o=e.getOffset(n),i=e.getOffset(r);n.scrollLeft=999;var s=e.getOffset(r);return{isRtlScrollingInverted:o.left!==i.left&&i.left-s.left!=0,isRtlScrollbarInverted:o.left!==i.left}},e.getOffset=function(e){var t=e.getBoundingClientRect(),n=K(e),r=J(e);return{top:t.top+(r.pageYOffset||n.documentElement.scrollTop),left:t.left+(r.pageXOffset||n.documentElement.scrollLeft)}};var t=e.prototype;return t.init=function(){e.instances.set(this.el,this),i()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},t.initDOM=function(){var e=this;if(Array.prototype.filter.call(this.el.children,(function(t){return t.classList.contains(e.classNames.wrapper)})).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var t=document.createElement("div"),n=document.createElement("div");t.classList.add(this.classNames.track),n.classList.add(this.classNames.scrollbar),t.appendChild(n),this.axis.x.track.el=t.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=t.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},t.setAccessibilityAttributes=function(){var e=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",e)},t.initListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),t.addEventListener("resize",this.onWindowResize);var n=!1,r=t.ResizeObserver||Y;this.resizeObserver=new r((function(){n&&e.recalculate()})),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),t.requestAnimationFrame((function(){n=!0})),this.mutationObserver=new t.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},t.recalculate=function(){var e=J(this.el);this.elStyles=e.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var t=this.heightAutoObserverEl.offsetHeight<=1,n=this.heightAutoObserverEl.offsetWidth<=1,r=this.contentEl.offsetWidth,o=this.contentWrapperEl.offsetWidth,i=this.elStyles.overflowX,s=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var a=this.contentEl.scrollHeight,l=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=t?"auto":"100%",this.placeholderEl.style.width=n?r+"px":"auto",this.placeholderEl.style.height=a+"px";var c=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=l>r,this.axis.y.isOverflowing=a>c,this.axis.x.isOverflowing="hidden"!==i&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==s&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var u=this.axis.x.isOverflowing?this.scrollbarWidth:0,d=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&l>o-d,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&a>c-u,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},t.getScrollbarSize=function(e){if(void 0===e&&(e="y"),!this.axis[e].isOverflowing)return 0;var t,n=this.contentEl[this.axis[e].scrollSizeAttr],r=this.axis[e].track.el[this.axis[e].offsetSizeAttr],o=r/n;return t=Math.max(~~(o*r),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(t=Math.min(t,this.options.scrollbarMaxSize)),t},t.positionScrollbar=function(t){if(void 0===t&&(t="y"),this.axis[t].isOverflowing){var n=this.contentWrapperEl[this.axis[t].scrollSizeAttr],r=this.axis[t].track.el[this.axis[t].offsetSizeAttr],o=parseInt(this.elStyles[this.axis[t].sizeAttr],10),i=this.axis[t].scrollbar,s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=(s="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-s:s)/(n-o),l=~~((r-i.size)*a);l="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l+(r-i.size):l,i.el.style.transform="x"===t?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},t.toggleTrackVisibility=function(e){void 0===e&&(e="y");var t=this.axis[e].track.el,n=this.axis[e].scrollbar.el;this.axis[e].isOverflowing||this.axis[e].forceVisible?(t.style.visibility="visible",this.contentWrapperEl.style[this.axis[e].overflowAttr]="scroll"):(t.style.visibility="hidden",this.contentWrapperEl.style[this.axis[e].overflowAttr]="hidden"),this.axis[e].isOverflowing?n.style.display="block":n.style.display="none"},t.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},t.onMouseMoveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.rect=this.axis[e].track.el.getBoundingClientRect(),this.axis[e].scrollbar.rect=this.axis[e].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[e].scrollbar.rect)?this.axis[e].scrollbar.el.classList.add(this.classNames.hover):this.axis[e].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[e].track.rect)?(this.showScrollbar(e),this.axis[e].track.el.classList.add(this.classNames.hover)):this.axis[e].track.el.classList.remove(this.classNames.hover)},t.onMouseLeaveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.el.classList.remove(this.classNames.hover),this.axis[e].scrollbar.el.classList.remove(this.classNames.hover)},t.showScrollbar=function(e){void 0===e&&(e="y");var t=this.axis[e].scrollbar.el;this.axis[e].isVisible||(t.classList.add(this.classNames.visible),this.axis[e].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},t.onDragStart=function(e,t){void 0===t&&(t="y");var n=K(this.el),r=J(this.el),o=this.axis[t].scrollbar,i="y"===t?e.pageY:e.pageX;this.axis[t].dragOffset=i-o.rect[this.axis[t].offsetAttr],this.draggedAxis=t,this.el.classList.add(this.classNames.dragging),n.addEventListener("mousemove",this.drag,!0),n.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(n.addEventListener("click",this.preventClick,!0),n.addEventListener("dblclick",this.preventClick,!0)):(r.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},t.onTrackClick=function(e,t){var n=this;if(void 0===t&&(t="y"),this.options.clickOnTrack){var r=J(this.el);this.axis[t].scrollbar.rect=this.axis[t].scrollbar.el.getBoundingClientRect();var o=this.axis[t].scrollbar.rect[this.axis[t].offsetAttr],i=parseInt(this.elStyles[this.axis[t].sizeAttr],10),s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=("y"===t?this.mouseY-o:this.mouseX-o)<0?-1:1,l=-1===a?s-i:s+i;!function e(){var o,i;-1===a?s>l&&(s-=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((o={})[n.axis[t].offsetAttr]=s,o)),r.requestAnimationFrame(e)):s<l&&(s+=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((i={})[n.axis[t].offsetAttr]=s,i)),r.requestAnimationFrame(e))}()}},t.getContentElement=function(){return this.contentEl},t.getScrollElement=function(){return this.contentWrapperEl},t.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:ee(this.el)}catch(e){return ee(this.el)}},t.removeListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},t.unMount=function(){this.removeListeners(),e.instances.delete(this.el)},t.isWithinBounds=function(e){return this.mouseX>=e.left&&this.mouseX<=e.left+e.width&&this.mouseY>=e.top&&this.mouseY<=e.top+e.height},t.findChild=function(e,t){var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector;return Array.prototype.filter.call(e.children,(function(e){return n.call(e,t)}))[0]},e}();te.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},te.instances=new WeakMap,te.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),(function(e){"init"===e.getAttribute("data-simplebar")||te.instances.has(e)||new te(e,G(e.attributes))}))},te.removeObserver=function(){this.globalObserver.disconnect()},te.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),"undefined"!=typeof MutationObserver&&(this.globalObserver=new MutationObserver(te.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))},te.handleMutations=function(e){e.forEach((function(e){Array.prototype.forEach.call(e.addedNodes,(function(e){1===e.nodeType&&(e.hasAttribute("data-simplebar")?!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes)):Array.prototype.forEach.call(e.querySelectorAll("[data-simplebar]"),(function(e){"init"!==e.getAttribute("data-simplebar")&&!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes))})))})),Array.prototype.forEach.call(e.removedNodes,(function(e){1===e.nodeType&&("init"===e.getAttribute("data-simplebar")?te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount():Array.prototype.forEach.call(e.querySelectorAll('[data-simplebar="init"]'),(function(e){te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount()})))}))}))},te.getOptions=G,i()&&te.initHtmlApi();const ne=te},6395:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DocAnchorTarget:()=>u,DocAnchorTrigger:()=>p,DocBackToTop:()=>g,DocBadge:()=>y,DocCheckbox:()=>E,DocCodeblock:()=>Ge,DocCollapse:()=>Ke,DocDrawer:()=>ot,DocDropdown:()=>lt,DocEmoji:()=>dt,DocHistory:()=>Ht,DocIcon:()=>Bt,DocIconAlignRight:()=>ji,DocIconArrowLeft:()=>zi,DocIconArrowRight:()=>$i,DocIconArrowTop:()=>Yi,DocIconBox:()=>Ki,DocIconButton:()=>Vt,DocIconCheck:()=>es,DocIconCheckCircle:()=>rs,DocIconChevronDown:()=>ss,DocIconChevronRight:()=>cs,DocIconCopy:()=>Ze,DocIconFile:()=>fs,DocIconFilter:()=>ms,DocIconFolder:()=>ys,DocIconHistory:()=>ks,DocIconHome:()=>Cs,DocIconInfo:()=>Os,DocIconLayers:()=>Ds,DocIconLink:()=>Ms,DocIconMenu:()=>Hs,DocIconMinus:()=>Ws,DocIconMoon:()=>Vs,DocIconMoreHorizontal:()=>Us,DocIconPlus:()=>Gs,DocIconSearch:()=>Xs,DocIconShield:()=>ta,DocIconSun:()=>oa,DocIconX:()=>aa,DocLoadingSpinner:()=>$t,DocMember:()=>Fn,DocMemberGroup:()=>Bn,DocOverloadGroup:()=>Vn,DocPanel:()=>Zn,DocPanels:()=>Yn,DocParameter:()=>sr,DocParameters:()=>ur,DocSearchDesktop:()=>_r,DocSearchMobile:()=>Dr,DocSidebar:()=>fo,DocSidebarRight:()=>Io,DocSwitch:()=>No,DocTab:()=>jo,DocTabs:()=>zo,DocThemeSwitch:()=>qo,DocToolbar:()=>Ii,DocToolbarMemberFilterNoResults:()=>Pi});var r=n(4359),o=["id"],i=n(5184),s=n(5543),a=n(2626);const l=(0,r.aZ)({name:"DocAnchorTarget",props:{id:{type:String,required:!0}},setup:function(e){var t=(0,a.oR)().store,n=(0,i.B)().scrollTo,o=(0,r.iH)("#".concat(e.id));function l(){n(o.value,{offset:s.vE,onStart:function(){t.actions.updateScrolledElementId(e.id)}})}(0,r.bv)((function(){window.location.hash&&decodeURIComponent(window.location.hash)===o.value&&setTimeout((function(){t.state.isScrollPositionRestored||(window.scrollTo(0,0),setTimeout(l,200))}),1)}))}});var c=n(3744);const u=(0,c.Z)(l,[["render",function(e,t,n,i,s,a){return(0,r.wg)(),(0,r.iD)("div",{id:e.id},[(0,r.WI)(e.$slots,"default")],8,o)}]]);var d=["href","tabindex","aria-disabled"],f=n(6184);const h=(0,r.aZ)({name:"DocAnchorTrigger",props:{disabled:Boolean,to:{type:String,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,a.oR)().store,l=(0,i.B)().scrollTo;return{onClick:function(t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e.to),n("click"),l(e.to,{offset:(0,s.vE)(),onStart:function(){var t="#"===e.to.charAt(0)?e.to.substr(1):e.to;o.actions.updateScrolledElementId(t)}}))},tabindex:(0,r.Fl)((function(){return e.disabled?"-1":null}))}}}),p=(0,c.Z)(h,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("a",{href:e.to,tabindex:e.tabindex,"aria-disabled":e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.WI)(e.$slots,"default")],8,d)}]]);var m=n(7023);const v=(0,r.aZ)({name:"DocBackToTop",setup:function(){var e=(0,r.iH)(!1),t=(0,i.B)().scrollTo;return(0,m.zX)(window,"scroll",(function(){document.documentElement.scrollTop>350?e.value=!0:e.value=!1})),{onClick:function(){t("body")},show:e}}}),g=(0,c.Z)(v,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-top"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-from-class":"translate-y-4 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"translate-y-4 opacity-0"},{default:(0,r.w5)((function(){return[e.show?((0,r.wg)(),(0,r.iD)("button",{key:0,class:"fixed bottom-6 right-6 w-12 h-12 flex items-center justify-center rounded-full bg-white bg-opacity-70 hover:bg-gray-200 dark:bg-dark-850 dark:hover:bg-dark-450 z-40 focus:outline-none transition duration-300 linear border border-gray-400 border-opacity-50 hover:border-opacity-10 dark:border-dark-450 dark:bg-opacity-70",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(l,{class:"w-7 h-7 text-blue-500 dark:text-blue-400"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})])):(0,r.kq)("",!0)]})),_:1})}]]),b=(0,r.aZ)({name:"DocBadge",props:{type:{type:String,default:""}},setup:function(e){var t=(0,r.Fl)((function(){return e.type.trim()}));return{badgeClasses:(0,r.Fl)((function(){switch(t.value){case"bindable":return"bg-yellow-100 text-yellow-700 dark:bg-yellow-500 dark:text-white";case"required":return"bg-indigo-100 text-indigo-700 dark:bg-indigo-500 dark:text-white";case"internal":return"bg-gray-700 text-white";case"private":case"primary":case"static":return"bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white";case"warning":case"readonly":return"bg-orange-100 text-orange-700 dark:bg-orange-500 dark:text-white";case"chainable":case"public":case"success":return"bg-green-100 text-green-700 dark:bg-green-500 dark:text-white";case"template":case"info":return"bg-teal-100 text-teal-700 dark:bg-teal-500 dark:text-white";case"deprecated":case"removed":case"danger":return"bg-red-100 text-red-700 dark:bg-red-500 dark:text-white";default:return"bg-gray-200 text-gray-900 dark:bg-dark-550 dark:text-dark-250"}}))}}}),y=(0,c.Z)(b,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:(0,r.C_)(["inline-flex items-center justify-center h-6 px-2 text-xs font-medium leading-none whitespace-nowrap rounded",e.badgeClasses])},[(0,r.WI)(e.$slots,"default")],2)}]]);var w={class:"inline-flex py-1.5 cursor-pointer select-none"},x=["value"],k={class:"inline-block ml-2"};const S=(0,r.aZ)({name:"DocCheckbox",props:{value:[Boolean,String],modelValue:[Boolean,Array]},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(e.modelValue),i=(0,r.iH)(!1),s=(0,r.Fl)({get:function(){return o.value},set:function(e){o.value=e,n("update:modelValue",o.value)}}),a=(0,r.Fl)((function(){return Array.isArray(e.modelValue)?e.modelValue.includes(e.value):e.modelValue})),l=(0,r.Fl)((function(){return[{"border-blue-500 bg-blue-500":a.value},{"border-gray-400 bg-gray-100":!a.value},{"shadow-outline":i.value}]}));return(0,r.YP)((function(){return e.modelValue}),(function(e){return o.value=e})),{localValue:o,computedValue:s,isChecked:a,isFocused:i,checkboxClasses:l}}}),E=(0,c.Z)(S,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-check"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("label",w,[(0,r._)("div",{class:(0,r.C_)(["w-4 h-4 mt-px border rounded-sm",e.checkboxClasses])},[(0,r.wy)((0,r.Wm)(l,{width:"14",height:"14",class:"text-white"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},512),[[r.F8,e.isChecked]])],2),(0,r.wy)((0,r._)("input",{"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.computedValue=t}),class:"absolute opacity-0 hidden",style:{"z-index":"-1"},type:"checkbox",value:e.value,onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,x),[[r.e8,e.computedValue]]),(0,r._)("span",k,[(0,r.WI)(e.$slots,"default")])])}]]);var C={class:"absolute top-0 right-0 z-5"},_=["innerHTML"],T=n(7924),O={class:"whitespace-nowrap"},L=n(2152),R=n.n(L),D=function(e){return(0,r.dD)("data-v-cf3656fa"),e=e(),(0,r.Cn)(),e},A={key:0,ref:"tooltip",class:"z-50 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-dark-500 rounded tooltip"},I=D((function(){return(0,r._)("div",{class:"arrow","data-popper-arrow":""},null,-1)}));function M(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function F(e){return e instanceof M(e).Element||e instanceof Element}function P(e){return e instanceof M(e).HTMLElement||e instanceof HTMLElement}function H(e){return"undefined"!=typeof ShadowRoot&&(e instanceof M(e).ShadowRoot||e instanceof ShadowRoot)}var N=Math.max,j=Math.min,W=Math.round;function B(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(P(e)&&t){var i=e.offsetHeight,s=e.offsetWidth;s>0&&(r=W(n.width)/s||1),i>0&&(o=W(n.height)/i||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function z(e){var t=M(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function V(e){return e?(e.nodeName||"").toLowerCase():null}function q(e){return((F(e)?e.ownerDocument:e.document)||window.document).documentElement}function $(e){return B(q(e)).left+z(e).scrollLeft}function U(e){return M(e).getComputedStyle(e)}function Z(e){var t=U(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Y(e,t,n){void 0===n&&(n=!1);var r,o,i=P(t),s=P(t)&&function(e){var t=e.getBoundingClientRect(),n=W(t.width)/e.offsetWidth||1,r=W(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),a=q(t),l=B(e,s),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==V(t)||Z(a))&&(c=(r=t)!==M(r)&&P(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:z(r)),P(t)?((u=B(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):a&&(u.x=$(a))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function G(e){var t=B(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function J(e){return"html"===V(e)?e:e.assignedSlot||e.parentNode||(H(e)?e.host:null)||q(e)}function K(e){return["html","body","#document"].indexOf(V(e))>=0?e.ownerDocument.body:P(e)&&Z(e)?e:K(J(e))}function X(e,t){var n;void 0===t&&(t=[]);var r=K(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=M(r),s=o?[i].concat(i.visualViewport||[],Z(r)?r:[]):r,a=t.concat(s);return o?a:a.concat(X(J(s)))}function Q(e){return["table","td","th"].indexOf(V(e))>=0}function ee(e){return P(e)&&"fixed"!==U(e).position?e.offsetParent:null}function te(e){for(var t=M(e),n=ee(e);n&&Q(n)&&"static"===U(n).position;)n=ee(n);return n&&("html"===V(n)||"body"===V(n)&&"static"===U(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&P(e)&&"fixed"===U(e).position)return null;for(var n=J(e);P(n)&&["html","body"].indexOf(V(n))<0;){var r=U(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var ne="top",re="bottom",oe="right",ie="left",se="auto",ae=[ne,re,oe,ie],le="start",ce="end",ue="viewport",de="popper",fe=ae.reduce((function(e,t){return e.concat([t+"-"+le,t+"-"+ce])}),[]),he=[].concat(ae,[se]).reduce((function(e,t){return e.concat([t,t+"-"+le,t+"-"+ce])}),[]),pe=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function me(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var ve={placement:"bottom",modifiers:[],strategy:"absolute"};function ge(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function be(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?ve:o;return function(e,t,n){void 0===n&&(n=i);var o,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},ve,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:a,setOptions:function(n){var o="function"==typeof n?n(a.options):n;d(),a.options=Object.assign({},i,a.options,o),a.scrollParents={reference:F(e)?X(e):e.contextElement?X(e.contextElement):[],popper:X(t)};var s,c,f=function(e){var t=me(e);return pe.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return a.orderedModifiers=f.filter((function(e){return e.enabled})),a.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:a,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=a.elements,t=e.reference,n=e.popper;if(ge(t,n)){a.rects={reference:Y(t,te(n),"fixed"===a.options.strategy),popper:G(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(e){return a.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var o=a.orderedModifiers[r],i=o.fn,s=o.options,l=void 0===s?{}:s,d=o.name;"function"==typeof i&&(a=i({state:a,options:l,name:d,instance:u})||a)}else a.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(a)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(o())}))}))),s}),destroy:function(){d(),c=!0}};if(!ge(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var ye={passive:!0};function we(e){return e.split("-")[0]}function xe(e){return e.split("-")[1]}function ke(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Se(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?we(o):null,s=o?xe(o):null,a=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case ne:t={x:a,y:n.y-r.height};break;case re:t={x:a,y:n.y+n.height};break;case oe:t={x:n.x+n.width,y:l};break;case ie:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?ke(i):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case le:t[c]=t[c]-(n[u]/2-r[u]/2);break;case ce:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var Ee={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Ce(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=s.x,h=void 0===f?0:f,p=s.y,m=void 0===p?0:p,v="function"==typeof u?u({x:h,y:m}):{x:h,y:m};h=v.x,m=v.y;var g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),y=ie,w=ne,x=window;if(c){var k=te(n),S="clientHeight",E="clientWidth";k===M(n)&&"static"!==U(k=q(n)).position&&"absolute"===a&&(S="scrollHeight",E="scrollWidth"),k=k,(o===ne||(o===ie||o===oe)&&i===ce)&&(w=re,m-=(d&&x.visualViewport?x.visualViewport.height:k[S])-r.height,m*=l?1:-1),o!==ie&&(o!==ne&&o!==re||i!==ce)||(y=oe,h-=(d&&x.visualViewport?x.visualViewport.width:k[E])-r.width,h*=l?1:-1)}var C,_=Object.assign({position:a},c&&Ee),T=!0===u?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:W(t*r)/r||0,y:W(n*r)/r||0}}({x:h,y:m}):{x:h,y:m};return h=T.x,m=T.y,l?Object.assign({},_,((C={})[w]=b?"0":"",C[y]=g?"0":"",C.transform=(x.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",C)):Object.assign({},_,((t={})[w]=b?m+"px":"",t[y]=g?h+"px":"",t.transform="",t))}var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function Te(e){return e.replace(/left|right|bottom|top/g,(function(e){return _e[e]}))}var Oe={start:"end",end:"start"};function Le(e){return e.replace(/start|end/g,(function(e){return Oe[e]}))}function Re(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&H(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function De(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ae(e,t){return t===ue?De(function(e){var t=M(e),n=q(e),r=t.visualViewport,o=n.clientWidth,i=n.clientHeight,s=0,a=0;return r&&(o=r.width,i=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=r.offsetLeft,a=r.offsetTop)),{width:o,height:i,x:s+$(e),y:a}}(e)):F(t)?function(e){var t=B(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):De(function(e){var t,n=q(e),r=z(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=N(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=N(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+$(e),l=-r.scrollTop;return"rtl"===U(o||n).direction&&(a+=N(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:s,x:a,y:l}}(q(e)))}function Ie(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Me(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Fe(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.boundary,s=void 0===i?"clippingParents":i,a=n.rootBoundary,l=void 0===a?ue:a,c=n.elementContext,u=void 0===c?de:c,d=n.altBoundary,f=void 0!==d&&d,h=n.padding,p=void 0===h?0:h,m=Ie("number"!=typeof p?p:Me(p,ae)),v=u===de?"reference":de,g=e.rects.popper,b=e.elements[f?v:u],y=function(e,t,n){var r="clippingParents"===t?function(e){var t=X(J(e)),n=["absolute","fixed"].indexOf(U(e).position)>=0&&P(e)?te(e):e;return F(n)?t.filter((function(e){return F(e)&&Re(e,n)&&"body"!==V(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],s=o.reduce((function(t,n){var r=Ae(e,n);return t.top=N(r.top,t.top),t.right=j(r.right,t.right),t.bottom=j(r.bottom,t.bottom),t.left=N(r.left,t.left),t}),Ae(e,i));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(F(b)?b:b.contextElement||q(e.elements.popper),s,l),w=B(e.elements.reference),x=Se({reference:w,element:g,strategy:"absolute",placement:o}),k=De(Object.assign({},g,x)),S=u===de?k:w,E={top:y.top-S.top+m.top,bottom:S.bottom-y.bottom+m.bottom,left:y.left-S.left+m.left,right:S.right-y.right+m.right},C=e.modifiersData.offset;if(u===de&&C){var _=C[o];Object.keys(E).forEach((function(e){var t=[oe,re].indexOf(e)>=0?1:-1,n=[ne,re].indexOf(e)>=0?"y":"x";E[e]+=_[n]*t}))}return E}function Pe(e,t,n){return N(e,j(t,n))}function He(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Ne(e){return[ne,oe,re,ie].some((function(t){return e[t]>=0}))}var je=be({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,s=r.resize,a=void 0===s||s,l=M(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,ye)})),a&&l.addEventListener("resize",n.update,ye),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,ye)})),a&&l.removeEventListener("resize",n.update,ye)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=Se({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,s=void 0===i||i,a=n.roundOffsets,l=void 0===a||a,c={placement:we(t.placement),variation:xe(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Ce(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ce(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];P(o)&&V(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});P(r)&&V(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,s=he.reduce((function(e,n){return e[n]=function(e,t,n){var r=we(e),o=[ie,ne].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=i[0],a=i[1];return s=s||0,a=(a||0)*o,[ie,oe].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,t.rects,i),e}),{}),a=s[t.placement],l=a.x,c=a.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=void 0===h||h,m=n.allowedAutoPlacements,v=t.options.placement,g=we(v),b=l||(g!==v&&p?function(e){if(we(e)===se)return[];var t=Te(e);return[Le(e),t,Le(t)]}(v):[Te(v)]),y=[v].concat(b).reduce((function(e,n){return e.concat(we(n)===se?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?he:l,u=xe(r),d=u?a?fe:fe.filter((function(e){return xe(e)===u})):ae,f=d.filter((function(e){return c.indexOf(e)>=0}));0===f.length&&(f=d);var h=f.reduce((function(t,n){return t[n]=Fe(e,{placement:n,boundary:o,rootBoundary:i,padding:s})[we(n)],t}),{});return Object.keys(h).sort((function(e,t){return h[e]-h[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,x=t.rects.popper,k=new Map,S=!0,E=y[0],C=0;C<y.length;C++){var _=y[C],T=we(_),O=xe(_)===le,L=[ne,re].indexOf(T)>=0,R=L?"width":"height",D=Fe(t,{placement:_,boundary:u,rootBoundary:d,altBoundary:f,padding:c}),A=L?O?oe:ie:O?re:ne;w[R]>x[R]&&(A=Te(A));var I=Te(A),M=[];if(i&&M.push(D[T]<=0),a&&M.push(D[A]<=0,D[I]<=0),M.every((function(e){return e}))){E=_,S=!1;break}k.set(_,M)}if(S)for(var F=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},P=p?3:1;P>0&&"break"!==F(P);P--);t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,h=void 0===f||f,p=n.tetherOffset,m=void 0===p?0:p,v=Fe(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=we(t.placement),b=xe(t.placement),y=!b,w=ke(g),x="x"===w?"y":"x",k=t.modifiersData.popperOffsets,S=t.rects.reference,E=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,_="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(k){if(i){var L,R="y"===w?ne:ie,D="y"===w?re:oe,A="y"===w?"height":"width",I=k[w],M=I+v[R],F=I-v[D],P=h?-E[A]/2:0,H=b===le?S[A]:E[A],W=b===le?-E[A]:-S[A],B=t.elements.arrow,z=h&&B?G(B):{width:0,height:0},V=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=V[R],$=V[D],U=Pe(0,S[A],z[A]),Z=y?S[A]/2-P-U-q-_.mainAxis:H-U-q-_.mainAxis,Y=y?-S[A]/2+P+U+$+_.mainAxis:W+U+$+_.mainAxis,J=t.elements.arrow&&te(t.elements.arrow),K=J?"y"===w?J.clientTop||0:J.clientLeft||0:0,X=null!=(L=null==T?void 0:T[w])?L:0,Q=I+Y-X,ee=Pe(h?j(M,I+Z-X-K):M,I,h?N(F,Q):F);k[w]=ee,O[w]=ee-I}if(a){var se,ae="x"===w?ne:ie,ce="x"===w?re:oe,ue=k[x],de="y"===x?"height":"width",fe=ue+v[ae],he=ue-v[ce],pe=-1!==[ne,ie].indexOf(g),me=null!=(se=null==T?void 0:T[x])?se:0,ve=pe?fe:ue-S[de]-E[de]-me+_.altAxis,ge=pe?ue+S[de]+E[de]-me-_.altAxis:he,be=h&&pe?function(e,t,n){var r=Pe(e,t,n);return r>n?n:r}(ve,ue,ge):Pe(h?ve:fe,ue,h?ge:he);k[x]=be,O[x]=be-ue}t.modifiersData[r]=O}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,s=n.modifiersData.popperOffsets,a=we(n.placement),l=ke(a),c=[ie,oe].indexOf(a)>=0?"height":"width";if(i&&s){var u=function(e,t){return Ie("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Me(e,ae))}(o.padding,n),d=G(i),f="y"===l?ne:ie,h="y"===l?re:oe,p=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],m=s[l]-n.rects.reference[l],v=te(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,b=p/2-m/2,y=u[f],w=g-d[c]-u[h],x=g/2-d[c]/2+b,k=Pe(y,x,w),S=l;n.modifiersData[r]=((t={})[S]=k,t.centerOffset=k-x,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&Re(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,s=Fe(t,{elementContext:"reference"}),a=Fe(t,{altBoundary:!0}),l=He(s,r),c=He(a,o,i),u=Ne(l),d=Ne(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});const We=(0,r.aZ)({name:"DocTooltip",props:{placement:{type:String,default:"top"},offset:{type:Array,default:function(){return[0,8]}},delay:{type:Number,default:250}},emits:["show","hide"],setup:function(e,t){var n,o=t.emit,i=(0,r.iH)(),s=(0,r.iH)(),a=(0,r.iH)(!1),l=null;return{trigger:i,tooltip:s,isOpen:a,show:function(){clearTimeout(n),n=setTimeout((function(){a.value=!0,(0,r.Y3)((function(){!function(){var t=document.querySelector("body"),n={placement:e.placement,modifiers:[{name:"offset",options:{offset:e.offset}},{name:"preventOverflow",options:{boundary:t}},{name:"flip",options:{boundary:t}}]};if(!i.value||!s.value)throw new Error("Tooltip trigger or tooltip element not found in DOM");l=je(i.value,s.value,n)}(),o("show")}))}),e.delay)},hide:function(){clearTimeout(n),o("hide"),a.value=!1,l&&(l.destroy(),l=null)},update:function(){l&&l.update()}}}}),Be=(0,c.Z)(We,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"trigger","aria-describedby":"tooltip",onMouseenter:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.show&&e.show.apply(e,t)}),onMouseleave:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger",{},void 0,!0)],544),e.isOpen?((0,r.wg)(),(0,r.iD)("div",A,[(0,r.WI)(e.$slots,"default",{},void 0,!0),I],512)):(0,r.kq)("",!0)])}],["__scopeId","data-v-cf3656fa"]]),ze=(0,r.aZ)({name:"DocCopyButton",components:{DocTooltip:Be},props:{copyText:String,tooltipText:{type:String,default:"Copy"},tooltipPlacement:{type:String,default:"top"},tooltipOffset:{type:Array,default:function(){return[0,8]}},buttonClass:{type:String,default:""}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(),o=(0,r.iH)(e.tooltipText),i=null;return(0,r.bv)((function(){(i=new(R())(n.value,{text:function(){return e.copyText}})).on("success",(function(){o.value="Copied!",t.value.update()}))})),(0,r.Jd)((function(){null!==i&&i.destroy()})),{tooltip:t,button:n,btnLabel:o}}}),Ve=(0,c.Z)(ze,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-tooltip");return(0,r.wg)(),(0,r.j4)(a,{ref:"tooltip",placement:e.tooltipPlacement,offset:e.tooltipOffset},{trigger:(0,r.w5)((function(){return[(0,r._)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 transition-colors duration-200 ease-in focus:outline-none",e.buttonClass]),onMouseleave:t[0]||(t[0]=function(t){return e.btnLabel=e.tooltipText})},[(0,r.WI)(e.$slots,"default")],34)]})),default:(0,r.w5)((function(){return[(0,r._)("span",O,(0,r.zw)(e.btnLabel),1)]})),_:3},8,["placement","offset"])}]]);var qe=[(0,r._)("path",{d:"M20 8h-9c-1.65 0-3 1.35-3 3v9c0 1.65 1.35 3 3 3h9c1.65 0 3-1.35 3-3v-9c0-1.65-1.35-3-3-3zm1 12c0 .55-.45 1-1 1h-9c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v9z"},null,-1),(0,r._)("path",{d:"M5 14H4c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v1c0 .55.45 1 1 1s1-.45 1-1V4c0-1.65-1.35-3-3-3H4C2.35 1 1 2.35 1 4v9c0 1.65 1.35 3 3 3h1c.55 0 1-.45 1-1s-.45-1-1-1z"},null,-1)],$e=n(6252);const Ue=(0,$e.aZ)({name:"DocIconCopy"}),Ze=(0,c.Z)(Ue,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qe)}]]),Ye=(0,r.aZ)({name:"DocCodeblock",components:{DocCopyButton:Ve,DocIconCopy:Ze},props:{lineNumbers:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(""),o=(0,r.iH)(""),i=(0,r.iH)(!1);return(0,r.bv)((function(){var r,s,a,l;i.value="string"==typeof(null===(s=null===(r=t.value)||void 0===r?void 0:r.querySelector(".codeblock-title"))||void 0===s?void 0:s.textContent);var c=null===(a=t.value)||void 0===a?void 0:a.querySelector("code[class*='language-']");n.value=(null==c?void 0:c.innerText.trim())||"",e.lineNumbers&&(o.value=function(e){return e.split("\n").map((function(e,t){return"<div>".concat(t+1,"</div>")})).join("")}(n.value)),"PRE"===(null===(l=null==c?void 0:c.parentElement)||void 0===l?void 0:l.nodeName)&&new T.Z(c.parentElement)})),{codeblockRef:t,hasTitle:i,code:n,lineNumbersHtml:o}}}),Ge=(0,c.Z)(Ye,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-copy"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",{ref:"codeblockRef",class:(0,r.C_)(["codeblock relative",{"line-numbers":e.lineNumbers}])},[(0,r._)("div",C,[(0,r.Wm)(c,{"copy-text":e.code,"tooltip-text":"Copy","tooltip-placement":"left","tooltip-offset":[-1,0],class:(0,r.C_)(["mr-1.5",e.hasTitle?"mt-14":"mt-1.5"]),"button-class":"w-10 h-10 text-dark-350 hover:text-white bg-dark-850 dark:bg-dark-800 bg-opacity-50 dark:bg-opacity-50 rounded-full"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]})),_:1},8,["copy-text","class"])]),(0,r.WI)(e.$slots,"default"),e.lineNumbers?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["absolute top-0 w-14 py-4 pr-3 bg-dark-850 dark:bg-dark-800 font-mono leading-normal text-dark-350 text-xs text-right",{"mt-12":e.hasTitle}]),innerHTML:e.lineNumbersHtml},null,10,_)):(0,r.kq)("",!0)],2)}]]),Je=(0,r.aZ)({name:"DocCollapse",props:{modelValue:Boolean,animations:{type:Boolean,default:!0},triggerClass:{type:String,default:null}},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(!1),i=(0,r.iH)();function s(){n("update:modelValue",!e.modelValue)}return(0,r.YP)((function(){return e.modelValue}),(function(e){e?(0,r.Y3)((function(){if(i.value){var e=i.value.scrollHeight;i.value.style.height="".concat(e,"px")}})):i.value&&(i.value.style.height="0px")}),{immediate:!0}),{toggleCollapse:s,onKeydown:function(e){"Enter"===e.key&&s()},toggleMousedown:function(){o.value=!o.value},onFocus:function(e){o.value&&e.target.blur()},content:i}}}),Ke=(0,c.Z)(Je,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{class:(0,r.C_)(["cursor-pointer focus:outline-none focus:bg-gray-200 dark:focus:bg-dark-750",e.triggerClass]),tabindex:"0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleCollapse&&e.toggleCollapse.apply(e,t)}),onMousedown:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onMouseup:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onFocus:t[3]||(t[3]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[4]||(t[4]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger")],34),(0,r._)("div",{ref:"content",class:(0,r.C_)(["collapse-content overflow-hidden",e.animations?"transition-all duration-200 ease-out":null]),style:{height:"0"}},[(0,r.WI)(e.$slots,"default")],2),(0,r.WI)(e.$slots,"footer")])}]]),Xe=(0,r.aZ)({name:"DocOverlay",props:{isOpen:Boolean},emits:["swipe-left","swipe-right","click"],setup:function(e,t){var n=t.emit,o=(0,r.qj)({x:0,y:0});return{onTouchStart:function(e){o.x=e.changedTouches[0].clientX,o.y=e.changedTouches[0].clientY},onTouchEnd:function(e){var t=e.changedTouches[0].clientX-o.x,r=e.changedTouches[0].clientY-o.y;Math.abs(t)>Math.abs(r)&&Math.abs(t)>40&&(t<0&&n("swipe-left",[e,"swipe-left"]),t>0&&n("swipe-right",[e,"swipe-right"]))},onClick:function(e){n("click",[e,"click"])}}}}),Qe=(0,c.Z)(Xe,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed z-30 transition-opacity duration-300 ease-in-out bg-gray-600 dark:bg-dark-900",e.isOpen?"inset-0 opacity-50 dark:bg-opacity-70":"opacity-0"]),onTouchstart:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchStart&&e.onTouchStart.apply(e,t)}),onTouchend:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchEnd&&e.onTouchEnd.apply(e,t)}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,34)}]]);function et(e){(0,m.zX)(window,"resize",(function(t){e(t)}))}function tt(){var e=document.body,t=(0,r.iH)(0),n=e.offsetWidth;(0,r.bv)((function(){return n=e.offsetWidth})),et((function(){return n=e.offsetWidth}));var o=(0,r.iH)(!1);return{enableBodyScroll:function(){o.value&&(e.classList.remove("overflow-hidden","fixed"),e.style.width="",e.style.top="",window.scrollTo(0,t.value),o.value=!1)},disableBodyScroll:function(){o.value||(t.value=window.scrollY,e.style.width="".concat(n,"px"),e.style.top="".concat(-t.value,"px"),e.classList.add("overflow-hidden","fixed"),o.value=!0)},isBodyScrollDisabled:o}}var nt=r.lR;const rt=(0,r.aZ)({name:"DocDrawer",components:{DocOverlay:Qe,Teleport:nt},props:{hideEvent:{type:Array,required:!0}},emits:["show","shown","hide","hidden"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=tt(),a=s.enableBodyScroll,l=s.disableBodyScroll;return{Teleport:nt,isOpen:i,show:function(){n("show"),i.value=!0,l(),(0,r.Y3)((function(){n("shown")}))},hide:function(t){var s;if(n("hide"),!t||!t[0])return i.value=!1,a(),void(0,r.Y3)((function(){n("hidden")}));var l=t[0].target;o.value!==l&&!(null===(s=o.value)||void 0===s?void 0:s.contains(l))&&e.hideEvent.includes(t[1])&&(i.value=!1,a(),(0,r.Y3)((function(){n("hidden")})))}}}}),ot=(0,c.Z)(rt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{ref:"el",class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 h-full transition-transform duration-300 ease-in-out bg-white focus:outline-none dark:bg-dark-850",e.isOpen?"translate-x-0 shadow-2xl":"translate-x-full"]),tabindex:"-1",onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r.WI)(e.$slots,"default"),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,{"is-open":e.isOpen,onSwipeLeft:e.hide,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onSwipeRight","onClick"])]})),_:1}))],34)}]]);var it=["aria-expanded"],st=n(6850);const at=(0,r.aZ)({name:"DocDropdown",props:{buttonClass:{type:String,default:""},align:{type:String,default:"left"},menuWidth:{type:String,default:"12rem"}},setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=(0,r.iH)(!1);return(0,r.YP)(i,(function(){var e=i.value?"open":"close";n(e)})),(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),{isOpen:i,isFocused:s,onButtonClick:function(){i.value=!i.value},dropdown:o,hide:function(){i.value=!1}}}}),lt=(0,c.Z)(at,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:"relative",onKeydown:t[4]||(t[4]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",{class:(0,r.C_)(e.buttonClass),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,onFocus:t[0]||(t[0]=function(t){return e.isFocused=!0}),onBlur:t[1]||(t[1]=function(t){return e.isFocused=!1}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onButtonClick&&e.onButtonClick.apply(e,t)})},[(0,r.WI)(e.$slots,"button-content",{isOpen:e.isOpen,isFocused:e.isFocused})],42,it),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",{class:(0,r.C_)(["absolute z-30 py-2 mt-2 bg-white border border-gray-300 rounded shadow-lg dark:bg-dark-650 dark:border-dark-500","right"===e.align?"right-0":"left-0"]),style:(0,r.j5)({"min-width":e.menuWidth}),onClick:t[3]||(t[3]=(0,r.iM)((function(){}),["stop"]))},[(0,r.WI)(e.$slots,"default")],6),[[r.F8,e.isOpen]])]})),_:3})],544)}]]);var ct=["innerHTML"];const ut=(0,r.aZ)({name:"DocEmoji",props:{emoji:{type:String,required:!0}},setup:function(e){return{emojiHtml:(0,r.Fl)((function(){return"&#x".concat(e.emoji.replace(/-/g,"&#x"))}))}}}),dt=(0,c.Z)(ut,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:"docs-emoji",innerHTML:e.emojiHtml},null,8,ct)}]]);var ft={class:"flex justify-between px-5 py-3 -mt-1 border-b border-gray-200 dark:border-dark-650"},ht={class:"flex text-sm text-gray-500 dark:text-dark-350"},pt=(0,r._)("span",null,"History",-1),mt={key:0,class:"flex flex-col items-center py-6"},vt=[(0,r._)("svg",{class:"mb-2",xmlns:"http://www.w3.org/2000/svg",width:"60",height:"60"},[(0,r._)("circle",{cx:"30",cy:"30",r:"30",fill:"#e1edff"}),(0,r._)("path",{d:"M36.5 20.5h-2v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-6v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-2c-1.65 0-3 1.35-3 3v14c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3v-14c0-1.65-1.35-3-3-3zm-14 2h2v1c0 .55.45 1 1 1s1-.45 1-1v-1h6v1c0 .55.45 1 1 1s1-.45 1-1v-1h2c.55 0 1 .45 1 1v3h-16v-3c0-.55.45-1 1-1zm14 16h-14c-.55 0-1-.45-1-1v-9h16v9c0 .55-.45 1-1 1z",fill:"#8dbbff"})],-1),(0,r._)("div",{class:"text-sm text-gray-500"},"No history items",-1)],gt={key:1,class:"mt-2"},bt=["href","onClick"],yt={class:"flex"},wt=["textContent"],xt={class:"invisible ml-5 text-xs text-gray-600 group-hover:visible dark:text-dark-350"},kt=n(9984),St=n.n(kt);function Et(){var e=(0,r.iH)(null);return(0,r.bv)((function(){e.value=window.__DOCS__})),{pageData:e}}function Ct(e){var t={};return""===e||"?"===e||(e=e.trim().replace(/^(\?|#|&)/,"")).split("&").forEach((function(e){var n=e.split("="),r=n[0],o=n[1];r=decodeURIComponent(r);var i=null==o?null:decodeURIComponent(o);t[r]=i})),t}var _t=(0,r.iH)({path:"/"});function Tt(e,t){if("string"==typeof t)"push"===e?window.history.pushState(null,"",t):"replace"===e&&window.history.replaceState(null,"",t);else{if("object"!=typeof t)throw new Error("Invalid type. Expected a string or a Route object for new route location.");var n=t.path?t.path:window.location.href,r="";t.query&&(r=function(e){if(!Object.keys(e).length)return"";var t=[];return Object.keys(e).forEach((function(n){t.push("".concat(n,"=").concat(e[n]))})),"?"+t.join("&")}(t.query));var o="".concat(n).concat(r).concat(t.hash);"push"===e?window.history.pushState(null,"",o):"replace"===e&&window.history.replaceState(null,"",o)}_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}}var Ot={replace:function(e){return Tt("replace",e)},push:function(e){return Tt("push",e)}};function Lt(){return _t.value.path=window.location.pathname?decodeURIComponent(window.location.pathname):"",_t.value.query=Ct(window.location.search),_t.value.hash=window.location.hash?decodeURIComponent(window.location.hash):"",(0,m.zX)(window,"turbo:visit",(function(){_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}})),{route:_t,Router:Ot}}var Rt=n(4884),Dt=n.n(Rt);function At(e){var t=St().appendDocumentName?St().documentName:"";if(St().trailingSlash||t)return"".concat(e).concat(t);var n=e.slice(0,-1);return St().base.length>1&&n.endsWith(".")&&(n=n.length>1?"../"+n+St().base.slice(0,-1):".."+St().base.slice(0,-1)),n}function It(e,t){var n="/"+St().documentName,r=e;if(St().appendDocumentName?r.endsWith(n)||(r=r.endsWith("/")?r+St().documentName:r+n):r.endsWith(n)&&(r=r.slice(0,-n.length)),St().useRelativePaths&&"file:"===location.protocol.toLowerCase()){var o=null!=t?t:Dt()();if(o){var i=r.split("/");r=i.slice(-o.level-1).join("/")}}else r.startsWith(St().base)?r=r.slice(St().base.length):St().trailingSlash||St().appendDocumentName||r!==St().base.slice(0,-1)||(r="");return r}function Mt(){if(!St().useRelativePaths)return St().base;var e=Dt()();if(!e)return St().base;var t=e.level;return St().appendDocumentName||e.isRoot||(St().trailingSlash?location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeBaseCache||(e.relativeBaseCache=t<=0?!e.isRoot||St().trailingSlash||location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")?"./":"."+St().base:"../".repeat(t)),e.relativeBaseCache}var Ft=function(){return Ft=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Ft.apply(this,arguments)};const Pt=(0,r.aZ)({name:"DocHistory",components:{DocDropdown:lt},setup:function(){var e=(0,r.iH)(),t=St().maxHistoryItems,n=(0,r.iH)([]),o=Et().pageData,i=Lt().route,a=Mt();function l(e){return e&&"/"!==e?a+e:At(a)}return(0,r.bv)((function(){var e;null==(e=(0,s.qn)(St().base,localStorage,"doc_history"))||("version"in e?n.value=e.items:(function(e){if(e.length){var t=o.value;if(t)for(var n=0,r=e;n<r.length;n++){var i=r[n];i.path=It(i.path,t)}}}(e),n.value=e)),function(){var e=o.value;if(e){var r=It(i.value.path,e),a={title:e.title,path:r,timestamp:Date.now(),icon:"doc-icon-".concat(e.icon)};!function(e){var t=n.value.findIndex((function(t){return t.path===e.path}));t>-1&&n.value.splice(t,1)}(a),n.value.unshift(a),n.value.length>t&&n.value.pop();var l={version:1,items:n.value};(0,s.Nh)(St().base,localStorage,"doc_history",l)}}()})),{dropdown:e,history:n,clearHistory:function(){n.value=[],(0,s.Nh)(St().base,localStorage,"doc_history",[])},setTimeVisited:function(){n.value=n.value.map((function(e){return Ft(Ft({},e),{timeAgo:(0,s.Sy)(e.timestamp)})}))},onHistoryItemClick:function(t,n){(0,s.pI)(n)||(n.preventDefault(),(0,f.Vn)(l(t)),e.value.hide())},getFullPath:l}}}),Ht=(0,c.Z)(Pt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-history"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-icon"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.j4)(u,{ref:"dropdown",style:{"margin-right":"-0.625rem"},align:"right","menu-width":"18rem",onOpen:e.setTimeVisited},{"button-content":(0,r.w5)((function(){var t;return[(0,r.Wm)(l,{class:(0,r.C_)([{"bg-gray-300 dark:bg-dark-450":null===(t=e.dropdown)||void 0===t?void 0:t.isOpen},"w-10 h-10 -mb-0.5"]),"icon-size":"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["class"])]})),default:(0,r.w5)((function(){return[(0,r._)("div",ft,[(0,r._)("div",ht,[(0,r.Wm)(c,{width:"15",height:"15",class:"mr-3 mt-0.75"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),pt]),(0,r._)("button",{class:"text-xs text-blue-500 dark:text-blue-400 focus:outline-none hover:text-blue-900 dark:hover:text-blue-200",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.clearHistory&&e.clearHistory.apply(e,t)})}," Clear ")]),e.history.length?((0,r.wg)(),(0,r.iD)("ul",gt,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.history,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.timestamp},[(0,r._)("a",{class:"flex justify-between px-5 py-1.5 text-sm whitespace-nowrap group hover:bg-gray-200 dark:hover:bg-dark-500",href:e.getFullPath(t.path),onClick:function(n){return e.onHistoryItemClick(t.path,n)}},[(0,r._)("span",yt,[(0,r.Wm)(c,{class:"mr-3 mt-0.75",width:"15",height:"15"},{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(t.icon)))]})),_:2},1024),(0,r._)("span",{textContent:(0,r.zw)(t.title)},null,8,wt)]),(0,r._)("span",xt,(0,r.zw)(t.timeAgo),1)],8,bt)])})),128))])):((0,r.wg)(),(0,r.iD)("div",mt,vt))]})),_:1},8,["onOpen"])}]]);var Nt=["width","height"],jt=["fill"];const Wt=(0,r.aZ)({name:"DocIcon",props:{width:{type:[Number,String],default:16},height:{type:[Number,String],default:16},iconColor:{type:String,default:"currentColor"}}}),Bt=(0,c.Z)(Wt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"mb-px",width:e.width,height:e.height,viewBox:"0 0 24 24",role:"presentation"},[(0,r._)("g",{fill:e.iconColor},[(0,r.WI)(e.$slots,"default")],8,jt)],8,Nt)}]]),zt=(0,r.aZ)({name:"DocIconButton",props:{iconSize:{type:[Number,String],default:16},rounded:{type:Boolean,default:!0}},setup:function(){var e=(0,r.iH)();return{button:e,onClick:function(){var t;null===(t=e.value)||void 0===t||t.blur()}}}}),Vt=(0,c.Z)(zt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 overflow-hidden transition-colors duration-200 ease-in hover:bg-gray-200 focus:outline-none focus:bg-gray-300 dark:text-white dark:hover:bg-dark-500 dark:focus:bg-dark-450",e.rounded?"rounded-full":"rounded"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(a,{class:"shrink-0",style:{"margin-bottom":"0"},width:e.iconSize,height:e.iconSize},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default")]})),_:3},8,["width","height"])],2)}]]),qt=(0,r.aZ)({name:"LoadingSpinner",props:{size:{type:Number,default:20}},setup:function(e){return{styles:(0,r.Fl)((function(){return{width:"".concat(e.size,"px"),height:"".concat(e.size,"px"),borderWidth:"".concat(Math.round(e.size/8),"px")}}))}}}),$t=(0,c.Z)(qt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:"spinner inline-block rounded-full border-gray-400 dark:border-dark-450 border-solid animate-spin",style:(0,r.j5)(e.styles)},null,4)}],["__scopeId","data-v-79806448"]]);var Ut={ref:"memberRef",class:"relative pluggable"},Zt={class:"relative z-10 px-5 pb-5"},Yt={class:"absolute inset-0 transition-all duration-200 ease-linear z-5",style:{margin:"-1px"}},Gt=[(0,r._)("div",{class:"absolute inset-0 bg-blue-200 bg-opacity-25 border border-blue-300 dark:bg-dark-550 dark:border-dark-600"},null,-1)],Jt=Symbol("DocsGroupId"),Kt=Symbol("DocsOverloadId");function Xt(e){var t=(0,a.oR)().store,n=(0,r.f3)(Jt),o=(0,r.Fl)((function(){return Object.values(t.state.memberGroups[n]).filter((function(n){return function(e,t,n){var r=e.overloadId===n,o=e.access.split(",").map((function(e){return e.trim()})).every((function(e){var n;return null===(n=t.state.access)||void 0===n?void 0:n.includes(e)})),i=!e.isInherited||e.isInherited===t.state.inherited;return r&&o&&i}(n,t,e)}))}));return{members:o}}var Qt={class:"flex justify-between h-16 px-5"},en={class:"flex items-center truncate"},tn={ref:"memberName",class:"flex items-center group"},nn={class:"font-mono text-sm truncate whitespace-nowrap dark:text-dark-350"},rn={key:0,class:"ml-2"},on={key:1,class:"ml-2 text-gray-600 dark:text-dark-350"},sn={key:2},an={key:3,class:"ml-1"},ln={key:0,class:"flex items-center h-6 px-2 ml-3 text-xs leading-none whitespace-nowrap border border-gray-400 rounded dark:border-dark-650"},cn={class:"flex"},un={class:"z-10 inline-flex bg-white border border-gray-300 rounded shadow-sm dark:bg-dark-650 dark:border-dark-650",style:{padding:"2px"}};const dn=(0,r.aZ)({name:"DocMemberToolbar",components:{DocCopyButton:Ve},props:{id:String,name:String},setup:function(e){return{buttons:(0,r.Fl)((function(){var t=window.location,n=t.origin,r=t.pathname,o="".concat(n).concat(r,"#").concat(e.id);return[{id:1,copyText:e.name,tooltipText:"Copy name",icon:"DocIconCopy"},{id:2,copyText:o,tooltipText:"Copy link",icon:"DocIconLink"}]}))}}}),fn=(0,c.Z)(dn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",un,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.buttons,(function(e){return(0,r.wg)(),(0,r.j4)(l,{key:e.id,"copy-text":e.copyText,"tooltip-text":e.tooltipText,"button-class":"w-7 h-7 hover:bg-gray-200 focus:bg-gray-300 dark:hover:bg-dark-500",onClick:t[0]||(t[0]=(0,r.iM)((function(){}),["stop"]))},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(e.icon)))]})),_:2},1024)]})),_:2},1032,["copy-text","tooltip-text"])})),128))])}]]);var hn={class:"flex items-center"};const pn=(0,r.aZ)({name:"DocMemberAccessBadges",props:{access:{type:Array}},setup:function(e){return{badges:(0,r.Fl)((function(){var t;return null===(t=e.access)||void 0===t?void 0:t.filter((function(e){return"public"!==e}))}))}}}),mn=(0,c.Z)(pn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",hn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.badges,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,class:"ml-3",type:e},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e),1)]})),_:2},1032,["type"])})),128))])}]]),vn=(0,r.aZ)({name:"DocMemberTitle",components:{DocMemberToolbar:fn,DocMemberAccessBadges:mn},props:{isVisible:{type:Boolean,required:!0,default:!1},isIntersecting:Boolean,isWindowScrolling:Boolean,id:String,name:String,overloadId:String,type:String,params:String,returns:String,memberAccess:Array},setup:function(e){var t,n,o=(0,r.Fl)((function(){return e.overloadId?Xt(e.overloadId).members.value.length-1:0})),i=(0,r.Fl)((function(){return e.type&&e.type.split(",").join(" | ")})),s=(0,r.Fl)((function(){return e.params?"(".concat(e.params.trim(),")"):""})),a=(0,r.Fl)((function(){return e.returns&&e.returns.split(",").join(" | ")})),l=(t=(0,r.iH)(),n=(0,r.iH)({}),(0,r.bv)((function(){var e,r=null===(e=t.value)||void 0===e?void 0:e.querySelector("h3");setTimeout((function(){var e=r?"".concat(r.clientWidth,"px"):"0";n.value={width:e,minWidth:"3.75rem",height:"2.625rem"}}),1e3)})),{memberName:t,hoverTriggerStyles:n});return{overloadCount:o,memberType:i,memberParams:s,memberReturnType:a,memberName:l.memberName,hoverTriggerStyles:l.hoverTriggerStyles}}}),gn=(0,c.Z)(vn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-toolbar"),l=(0,r.up)("doc-member-access-badges");return(0,r.wg)(),(0,r.iD)("div",Qt,[(0,r._)("div",en,[(0,r._)("div",tn,[(0,r.WI)(e.$slots,"default"),e.isIntersecting&&!e.isWindowScrolling?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"absolute top-0 rounded-br-full",style:(0,r.j5)(e.hoverTriggerStyles)},[(0,r.Wm)(a,{id:e.id,class:"absolute top-0 left-0 hidden -mt-5 group-hover:inline-flex",name:e.name},null,8,["id","name"])],4)):(0,r.kq)("",!0)],512),(0,r._)("div",nn,[e.memberType?((0,r.wg)(),(0,r.iD)("span",rn,": "+(0,r.zw)(e.memberType),1)):(0,r.kq)("",!0),e.memberParams?((0,r.wg)(),(0,r.iD)("span",on,(0,r.zw)(e.memberParams),1)):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",sn,":")):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",an,(0,r.zw)(e.memberReturnType),1)):(0,r.kq)("",!0)]),e.overloadCount?((0,r.wg)(),(0,r.iD)("div",ln," +"+(0,r.zw)(e.overloadCount)+" more ",1)):(0,r.kq)("",!0)]),(0,r._)("div",cn,[(0,r.Wm)(l,{access:e.memberAccess},null,8,["access"])])])}]]);var bn={class:"mb-5"},yn=(0,r._)("span",{class:"relative z-10 px-2 mb-2 ml-2 text-sm text-gray-600 uppercase bg-white rounded dark:bg-dark-850 dark:text-dark-350"}," Overloads ",-1),wn={class:"max-h-60 pt-4 pb-2 -mt-3.5 mb-6 overflow-x-hidden overflow-y-auto border border-gray-200 rounded dark:border-dark-650"},xn={class:"pl-0"},kn=["onClick"],Sn={class:"font-mono text-sm truncate whitespace-nowrap"};const En=(0,r.aZ)({name:"DocOverloadSelect",components:{DocMemberAccessBadges:mn},setup:function(){var e=Xt((0,r.f3)(Kt)).members;return{members:e,memberLabel:function(e){var t=e.name;return(t+=e.params?" (".concat(e.params,")"):" ()")+(e.returns?": ".concat(e.returns):"")},memberAccess:function(e){return e.access?e.access.split(",").map((function(e){return e.trim()})):[]},memberClasses:function(e){var t="boolean"==typeof e.overloadVisibility&&e.overloadVisibility;return{"bg-blue-100 text-blue-600 font-semibold dark:bg-dark-550 dark:bg-opacity-50":t,"hover:bg-gray-200 dark:hover:bg-dark-500 dark:hover:bg-opacity-50":!t}},onMemberClick:function(t){e.value.forEach((function(e){e.overloadVisibility=e.isOpen=e.id===t.id,function(e){e.animations=!1,setTimeout((function(){e.animations=!0}),100)}(e)}))}}}}),Cn=(0,c.Z)(En,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-access-badges");return(0,r.wy)(((0,r.wg)(),(0,r.iD)("div",bn,[yn,(0,r._)("div",wn,[(0,r._)("ul",xn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.id,class:(0,r.C_)(["flex px-4 py-1 list-none transition-colors duration-150 ease-linear cursor-pointer",e.memberClasses(t)]),onClick:function(n){return e.onMemberClick(t)}},[(0,r._)("div",Sn,(0,r.zw)(e.memberLabel(t)),1),(0,r.Wm)(a,{class:"ml-auto",access:e.memberAccess(t)},null,8,["access"])],10,kn)})),128))])])],512)),[[r.F8,e.members.length>1]])}]]);var _n=(0,r._)("div",{class:"mb-2 text-sm text-gray-600 dark:text-dark-350 uppercase"}," Signature ",-1),Tn={class:"codeblock-wrapper"},On={class:"member-signature language-csharp m-0 px-5 py-4 text-dark-300 text-xs"},Ln={class:"member-signature language-csharp"};const Rn=(0,r.aZ)({name:"DocMemberSignature",props:{signature:String}}),Dn=(0,c.Z)(Rn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-codeblock");return(0,r.wg)(),(0,r.iD)("div",null,[_n,(0,r._)("div",Tn,[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[(0,r._)("pre",On,[(0,r._)("code",Ln,(0,r.zw)(e.signature),1)])]})),_:1})])])}]]);function An(e,t){var n=Object.assign({},{root:null,rootMargin:"0px",threshold:0},t),o=(0,r.iH)(),i=(0,r.iH)([]),s=(0,r.Fl)((function(){return void 0!==e.value&&null!==e.value&&i.value.length>0&&i.value.every((function(e){return e.isIntersecting}))})),a=function(e){i.value=e};return(0,r.bv)((function(){e.value&&(o.value=new IntersectionObserver(a,n),o.value.observe(e.value))})),(0,r.Jd)((function(){var e;null===(e=o.value)||void 0===e||e.disconnect()})),{isIntersecting:s,elements:i}}function In(e,t,n){var o=(0,r.iH)(!1),i=(0,r.Fl)((function(){return n.state.scrolledElementId})),s=(0,r.Fl)((function(){return n.state.isWindowScrolling}));return(0,r.YP)(s,(function(t){t||e===i.value&&(o.value=!0,setTimeout((function(){o.value=!1}),1e3),n.actions.updateScrolledElementId(""))}),{immediate:!0}),{isHighlighted:o}}const Mn=(0,r.aZ)({name:"DocMember",components:{DocAnchorTarget:u,DocCollapse:Ke,DocMemberTitle:gn,DocOverloadSelect:Cn,DocMemberSignature:Dn},props:{id:{type:String,required:!0},name:{type:String,required:!0},isInherited:{type:Boolean,default:!1},access:{type:String,default:"public"},overloadId:String,type:String,params:String,returns:String,signature:String},setup:function(e){var t=(0,r.iH)(),n=(0,a.oR)().store,o=(0,r.f3)(Jt),i=(0,r.Fl)((function(){return n.state.memberGroups[o][e.id].animations}));!function(e,t,n){Object.keys(n).forEach((function(r){r&&e.actions.setMemberData(t,n.id,r,n[r])}))}(n,o,e);var s=function(e,t,n){var o=(0,r.Fl)((function(){var r,o=null===(r=n.state.memberGroups[t][e.id])||void 0===r?void 0:r.isVisible;return void 0===typeof o||o})),i=(0,r.Fl)((function(){return e.access.split(",").map((function(e){return e.trim()}))})),s=(0,r.Fl)((function(){var r=!e.overloadId||n.state.memberGroups[t][e.id].overloadVisibility,o=i.value.every((function(e){var t;return null===(t=n.state.access)||void 0===t?void 0:t.includes(e)})),s=!e.isInherited||e.isInherited===n.state.inherited,a=e.name.toLowerCase().includes(n.state.memberFilter.toLowerCase());return r&&o&&s&&a}));return(0,r.YP)(s,(function(r){n.actions.setMemberData(t,e.id,"isVisible",r)}),{immediate:!0}),{isVisible:o,memberAccess:i}}(e,o,n),l=s.isVisible,c=s.memberAccess,u=function(e,t,n,o){var i=(0,r.Fl)({get:function(){var r=n.state.memberGroups[t];return!(!r||!r[e])&&r[e].isOpen},set:function(r){n.actions.setMemberData(t,e,"isOpen",r)}}),s=(0,r.Fl)((function(){return n.state.scrolledElementId}));return(0,r.YP)(s,(function(r){e===r&&n.actions.setMemberData(t,e,"isOpen",!0)})),(0,r.YP)(i,(function(e){if(e){var t=o.value;t&&t.classList.contains("pluggable")&&(0,r.Y3)((function(){t.dispatchEvent(new Event("onPluginReady"))}))}})),{isOpen:i}}(e.id,o,n,t).isOpen;return{isOpen:u,isVisible:l,animations:i,memberAccess:c,isHighlighted:In(e.id,0,n).isHighlighted,memberRef:t,isIntersecting:An(t).isIntersecting,isWindowScrolling:(0,r.Fl)((function(){return n.state.isWindowScrolling}))}}}),Fn=(0,c.Z)(Mn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-target"),l=(0,r.up)("doc-member-title"),c=(0,r.up)("doc-overload-select"),u=(0,r.up)("doc-member-signature"),d=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.iD)("div",Ut,[(0,r.Wm)(a,{id:e.id,class:"absolute top-5 left-0 right-0 bottom-0",style:{"z-index":"-1"}},null,8,["id"]),(0,r.wy)((0,r.Wm)(d,{modelValue:e.isOpen,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isOpen=t}),class:"relative -mt-px border dark:border-dark-650 doc-member",animations:e.animations},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(l,{id:e.id,class:"relative z-10",name:e.name,"overload-id":e.overloadId,type:e.type,params:e.params,returns:e.returns,"member-access":e.memberAccess,"is-visible":e.isVisible,"is-intersecting":e.isIntersecting,"is-window-scrolling":e.isWindowScrolling},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"name")]})),_:3},8,["id","name","overload-id","type","params","returns","member-access","is-visible","is-intersecting","is-window-scrolling"])]})),footer:(0,r.w5)((function(){return[e.isIntersecting?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",Yt,Gt,512),[[r.F8,e.isHighlighted]])]})),_:1})):(0,r.kq)("",!0)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Zt,[e.isOpen?((0,r.wg)(),(0,r.iD)(r.HY,{key:0},[e.overloadId?((0,r.wg)(),(0,r.j4)(c,{key:0})):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default"),t[0]||((0,r.qZ)(-1),t[0]=e.signature?((0,r.wg)(),(0,r.j4)(u,{key:1,class:"mb-5",signature:e.signature},null,8,["signature"])):(0,r.kq)("",!0),(0,r.qZ)(1),t[0]),(0,r.WI)(e.$slots,"parameters")],64)):(0,r.kq)("",!0)])]})),_:3},8,["modelValue","animations"]),[[r.F8,e.isVisible]])],512)}]]);var Pn={class:"mb-6 doc-member-group"},Hn={key:0,class:"flex items-center justify-between"},Nn={class:"group"},jn=(0,r.Uk)(" # ");const Wn=(0,r.aZ)({name:"MemberGroup",props:{id:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Jt,e.id);var t=(0,a.oR)().store;return{visibleMemberCount:(0,r.Fl)((function(){return t.getters.getVisibleGroupMembers(e.id).length}))}}}),Bn=(0,c.Z)(Wn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger"),l=(0,r.up)("doc-anchor-target");return(0,r.wg)(),(0,r.iD)("div",Pn,[e.visibleMemberCount>0?((0,r.wg)(),(0,r.iD)("div",Hn,[(0,r.Wm)(l,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("h2",Nn,[(0,r.Wm)(a,{class:"float-left mt-2 -ml-6 text-lg font-normal text-blue-500 opacity-0 group-hover:opacity-100",to:"#".concat(e.id)},{default:(0,r.w5)((function(){return[jn]})),_:1},8,["to"]),(0,r.WI)(e.$slots,"title")])]})),_:3},8,["id"])])):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default")])}]]),zn=(0,r.aZ)({name:"DocOverloadGroup",props:{overloadId:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Kt,e.overloadId);var t=Lt().route,n=Xt(e.overloadId).members;(0,r.m0)((function(){n.value.forEach((function(e,r){e.overloadVisibility=0===r,t.value.hash==="#".concat(e.id)&&0!==r&&(n.value[0].overloadVisibility=!1,e.overloadVisibility=!0)}))}))}}),Vn=(0,c.Z)(zn,[["render",function(e,t,n,o,i,s){return(0,r.WI)(e.$slots,"default")}]]);var qn=["href"],$n={class:"docs-panel-content px-5 pb-5"};const Un=(0,r.aZ)({name:"DocPanel",props:{id:{type:String,required:!0},collapsed:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(!e.collapsed),n=Lt().route;return(0,r.bv)((function(){n.value.hash&&n.value.hash==="#".concat(e.id)&&(t.value=!0)})),{isExpanded:t,onClick:function(e){(0,s.pI)(e)?e.stopPropagation():e.preventDefault()}}}}),Zn=(0,c.Z)(Un,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-right"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-anchor-target"),u=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.j4)(u,{modelValue:e.isExpanded,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isExpanded=t}),"trigger-class":"relative py-4 pl-5 font-medium text-gray-900 pr-14 dark:text-white",class:"mb-6 border rounded-md dark:border-dark-650"},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(c,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("div",null,[(0,r.WI)(e.$slots,"title")]),(0,r._)("div",{class:(0,r.C_)(["absolute inline-flex items-center justify-center text-blue-500 transition duration-200 ease-out origin-center rounded-full w-7 h-7 right-3 top-4 hover:bg-gray-200 dark:hover:bg-dark-500 z-5",{"rotate-90":e.isExpanded}])},[(0,r.Wm)(l,{width:"22",height:"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})],2)]})),_:3},8,["id"]),(0,r._)("a",{href:"#".concat(e.id),class:"absolute inset-0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,8,qn)]})),default:(0,r.w5)((function(){return[(0,r._)("div",$n,[(0,r.WI)(e.$slots,"default")])]})),_:3},8,["modelValue"])}]]),Yn=(0,r.aZ)({name:"DocPanels",setup:function(e,t){var n,o=t.slots,i=(null===(n=o.default)||void 0===n?void 0:n.call(o))||[],s=(0,r.Fl)((function(){return i.map((function(e){var t,n;return(0,r.h)(Zn,{id:null===(t=e.props)||void 0===t?void 0:t.id,collapsed:null===(n=e.props)||void 0===n?void 0:n.collapsed},{title:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.title()},default:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.default()}})}))}));return function(){return(0,r.h)("div",{class:"docs-panels mb-6 border rounded-md dark:border-dark-650"},s.value)}}});var Gn={class:"relative pl-4 mb-5"},Jn={class:"relative mb-1"},Kn=(0,r._)("span",{class:"absolute -ml-4"},"⚬",-1),Xn={class:"font-semibold"},Qn={key:0},er=(0,r._)("span",{class:"font-semibold"},":",-1),tr={key:0,class:"mx-1 text-sm"},nr={key:1,class:"text-sm text-gray-600"},rr={key:0,class:"text-sm"},or=(0,r._)("span",{class:"font-medium text-gray-900"},"Default value:",-1);const ir=(0,r.aZ)({name:"DocParamater",props:{name:{type:String,required:!0},type:{type:String,default:""},optional:{type:Boolean,default:!1},defaultValue:{type:String,default:""}}}),sr=(0,c.Z)(ir,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",Gn,[(0,r._)("div",Jn,[Kn,(0,r._)("span",Xn,(0,r.zw)(e.name),1),e.type?((0,r.wg)(),(0,r.iD)("span",Qn,[er,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.type),1)]})),_:1}),e.optional?((0,r.wg)(),(0,r.iD)("span",tr,"•")):(0,r.kq)("",!0),e.optional?((0,r.wg)(),(0,r.iD)("span",nr,"optional")):(0,r.kq)("",!0)])):(0,r.kq)("",!0)]),(0,r.WI)(e.$slots,"default"),e.defaultValue?((0,r.wg)(),(0,r.iD)("div",rr,[(0,r._)("div",null,[or,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.defaultValue),1)]})),_:1})])])):(0,r.kq)("",!0)])}]]);var ar={class:"p-5 bg-gray-100 rounded parameters dark:bg-dark-800"},lr=(0,r._)("div",{class:"mb-4 text-sm text-gray-600 uppercase dark:text-dark-350"}," Parameters ",-1);const cr=(0,r.aZ)({name:"DocParameters"}),ur=(0,c.Z)(cr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",ar,[lr,(0,r.WI)(e.$slots,"default")])}]]);var dr=n(8816),fr={class:"relative"},hr={class:"absolute flex items-center justify-center h-full pl-3"},pr=["placeholder"];const mr=(0,r.aZ)({name:"SearchInput",emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.f3)(dr.xf),i=(0,a.oR)().store,s=(0,r.Fl)({get:function(){return i.state.searchQuery},set:function(e){return i.actions.updateSearchQuery(e)}}),l=(0,r.iH)();return{input:l,focus:function(){var e;null===(e=l.value)||void 0===e||e.focus()},config:St(),query:s,search:o,onKeydown:function(e){"Enter"===e.code&&n("select"),null==o||o.onKeydown(e)},onFocus:function(){o&&(o.isFocused=!0,o.results.length&&(o.isOpen=!0))}}}}),vr=(0,c.Z)(mr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-search"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-icon-x"),u=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",fr,[(0,r._)("div",hr,[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]),(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-10 pl-8 leading-10 text-left text-gray-600 transition-colors duration-200 ease-in bg-gray-200 border border-transparent rounded sm:text-sm hover:bg-white hover:border-gray-300 focus:outline-none focus:border-gray-500 focus:bg-white dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",style:{padding:"0.625rem 0.75rem 0.625rem 2rem"},type:"text",autocomplete:"off",spellcheck:"false","aria-label":"Search",placeholder:e.config.search.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},null,40,pr),[[r.nr,e.query]]),e.query?((0,r.wg)(),(0,r.j4)(u,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-2 mr-2 hover:bg-gray-200",tabindex:"-1",onClick:(0,r.iM)(e.search.clear,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]);var gr=["href","onClick"],br={class:"w-full"},yr=["innerHTML"],wr=["innerHTML"],xr=["innerHTML"],kr={key:1,class:"text-sm px-5 py-4 mb-3"};const Sr=(0,r.aZ)({name:"DocSearchResults",props:{isMobile:Boolean},emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.f3)(dr.xf),a=Mt();function l(e){return e.startsWith("#")?At(a)+e:a+e}var c=St().search.noResultsFoundMsg;return(0,r.YP)((function(){return o.value}),(function(e){e&&new T.Z(e)})),{rootEl:o,searchApi:i,onResultClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),i.navigateToResult(l(e.path)),n("select"))},getFullPath:l,noResultsText:c}}}),Er=(0,c.Z)(Sr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-active-class":"transition duration-300 ease-out overflow-hidden","enter-from-class":"-translate-y-2 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-100 ease-in overflow-hidden","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[e.searchApi.isFocused&&e.searchApi.isOpen?((0,r.wg)(),(0,r.iD)("div",{key:0,ref:"rootEl",class:(0,r.C_)(["z-30 w-full overflow-y-auto rounded bg-white",e.isMobile?"dark:bg-dark-850":"dark:bg-dark-650 dark:border-dark-500"])},[(0,r._)("ul",null,[e.searchApi.results.length?((0,r.wg)(!0),(0,r.iD)(r.HY,{key:0},(0,r.Ko)(e.searchApi.results,(function(t,n){return(0,r.wg)(),(0,r.iD)("li",{key:t.id},[(0,r._)("a",{class:(0,r.C_)(["flex justify-between m-3 mt-0 py-4 px-4 rounded-md group hover:bg-gray-200 dark:hover:bg-dark-450 focus:outline-none overflow-x-clip",n===e.searchApi.focusIndex?"bg-gray-200 dark:bg-dark-450":"bg-gray-100 dark:bg-dark-550"]),href:e.getFullPath(t.path),tabindex:"-1",onClick:function(n){return e.onResultClick(t,n)}},[(0,r._)("div",br,[t.heading?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"mb-2 font-semibold text-gray-900 dark:text-white",innerHTML:t.heading},null,8,yr)):(0,r.kq)("",!0),(0,r._)("div",{class:"text-sm",innerHTML:t.text},null,8,wr),(0,r._)("div",{class:"mt-2 text-xs font-medium text-gray-900 dark:text-white break-words",innerHTML:t.page},null,8,xr)])],10,gr)])})),128)):((0,r.wg)(),(0,r.iD)("li",kr,(0,r.zw)(e.noResultsText),1))])],2)):(0,r.kq)("",!0)]})),_:1})}]]),Cr=(0,r.aZ)({name:"DocSearchDesktop",components:{DocSearchInput:vr,DocSearchResults:Er},setup:function(){var e=(0,r.iH)(),t=(0,dr.Rx)(e);(0,r.JJ)(dr.xf,t);var n=(0,r.iH)();return(0,m.zX)(window,"keydown",(function(e){var t,r=e;r.target===document.body&&St().search.hotkeys.includes(r.key)&&(r.preventDefault(),null===(t=n.value)||void 0===t||t.focus())})),{rootEl:e,onRootClick:function(){var e;null===(e=t.input)||void 0===e||e.focus(),t.isFocused=!0},searchInput:n,searchApi:t}}}),_r=(0,c.Z)(Cr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-search-results");return(0,r.wg)(),(0,r.iD)("div",{ref:"rootEl",class:(0,r.C_)(["absolute hidden transition-all duration-300 ease-out right-25 lg:flex lg:flex-col lg:ml-auto",e.searchApi.isFocused?"w-[42rem]":"w-40"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onRootClick&&e.onRootClick.apply(e,t)}),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.searchApi.isFocused=!1}),["tab"]))},[(0,r.Wm)(a,{ref:"searchInput",class:(0,r.C_)(["self-end transition-all duration-300 ease-out",e.searchApi.isFocused?"w-96":"w-40"])},null,8,["class"]),(0,r.Wm)(l,{class:"absolute max-h-[32rem] pt-3 mt-2 border flex border-gray-300 shadow-lg dark:border-dark-650"})],34)}]]);var Tr={ref:"searchRoot",class:"flex flex-col h-full"},Or={class:"flex items-center justify-between shrink-0 h-16 bg-white md:h-20 dark:bg-dark-850"},Lr=r.lR;const Rr=(0,r.aZ)({name:"DocSearchMobile",components:{Teleport:Lr,DocSearchInput:vr,DocSearchResults:Er},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,dr.Rx)(t);return(0,r.JJ)(dr.xf,n),{Teleport:Lr,docDrawer:e,searchRoot:t,show:function(){e.value.show()},onShown:function(){var e;null===(e=n.input)||void 0===e||e.focus()},onHidden:function(){var e;null===(e=n.input)||void 0===e||e.blur()},hideDrawer:function(){null==e||e.value.hide()},searchApi:n}}}),Dr=(0,c.Z)(Rr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-icon-arrow-right"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-search-results"),d=(0,r.up)("doc-icon-search"),f=(0,r.up)("doc-drawer");return(0,r.wg)(),(0,r.j4)(f,{ref:"docDrawer",class:"md:w-104","hide-event":["swipe-right","click"],onShown:e.onShown,onHidden:e.onHidden},{default:(0,r.w5)((function(){return[(0,r._)("div",Tr,[(0,r._)("div",Or,[(0,r.Wm)(a,{class:"ml-3 w-full",onSelect:e.hideDrawer},null,8,["onSelect"]),(0,r.Wm)(c,{class:"w-10 h-10 ml-3",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hideDrawer},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1},8,["onClick"])]),(0,r.Wm)(u,{class:"pb-6",style:{"max-height":"100%"},"is-mobile":!0,onSelect:e.hideDrawer},null,8,["onSelect"])],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-mobile-search-button"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-10 h-10 lg:hidden","icon-size":"20",onClick:(0,r.iM)(e.show,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1}))]})),_:1},8,["onShown","onHidden"])}]]);var Ar={class:"flex items-center shrink-0 h-16 px-6 -ml-6 bg-white border-b border-gray-200 md:hidden dark:bg-dark-800 dark:border-dark-650"},Ir={ref:"sidebarFooter"},Mr={key:0,ref:"sidebarLinksEl",class:"overflow-y-auto h-full"},Fr=n(1296),Pr=n.n(Fr);function Hr(e){return"object"==typeof e&&null!=e&&1===e.nodeType}function Nr(e,t){return(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e}function jr(e,t){if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){var n=getComputedStyle(e,null);return Nr(n.overflowY,t)||Nr(n.overflowX,t)||function(e){var t=function(e){if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}}(e);return!!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)}(e)}return!1}function Wr(e,t,n,r,o,i,s,a){return i<e&&s>t||i>e&&s<t?0:i<=e&&a<=n||s>=t&&a>=n?i-e-r:s>t&&a<n||i<e&&a>n?s-t+o:0}function Br(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,s=t.boundary,a=t.skipOverflowHiddenElements,l="function"==typeof s?s:function(e){return e!==s};if(!Hr(e))throw new TypeError("Invalid target");for(var c=document.scrollingElement||document.documentElement,u=[],d=e;Hr(d)&&l(d);){if((d=d.parentElement)===c){u.push(d);break}null!=d&&d===document.body&&jr(d)&&!jr(document.documentElement)||null!=d&&jr(d,a)&&u.push(d)}for(var f=n.visualViewport?n.visualViewport.width:innerWidth,h=n.visualViewport?n.visualViewport.height:innerHeight,p=window.scrollX||pageXOffset,m=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),g=v.height,b=v.width,y=v.top,w=v.right,x=v.bottom,k=v.left,S="start"===o||"nearest"===o?y:"end"===o?x:y+g/2,E="center"===i?k+b/2:"end"===i?w:k,C=[],_=0;_<u.length;_++){var T=u[_],O=T.getBoundingClientRect(),L=O.height,R=O.width,D=O.top,A=O.right,I=O.bottom,M=O.left;if("if-needed"===r&&y>=0&&k>=0&&x<=h&&w<=f&&y>=D&&x<=I&&k>=M&&w<=A)return C;var F=getComputedStyle(T),P=parseInt(F.borderLeftWidth,10),H=parseInt(F.borderTopWidth,10),N=parseInt(F.borderRightWidth,10),j=parseInt(F.borderBottomWidth,10),W=0,B=0,z="offsetWidth"in T?T.offsetWidth-T.clientWidth-P-N:0,V="offsetHeight"in T?T.offsetHeight-T.clientHeight-H-j:0;if(c===T)W="start"===o?S:"end"===o?S-h:"nearest"===o?Wr(m,m+h,h,H,j,m+S,m+S+g,g):S-h/2,B="start"===i?E:"center"===i?E-f/2:"end"===i?E-f:Wr(p,p+f,f,P,N,p+E,p+E+b,b),W=Math.max(0,W+m),B=Math.max(0,B+p);else{W="start"===o?S-D-H:"end"===o?S-I+j+V:"nearest"===o?Wr(D,I,L,H,j+V,S,S+g,g):S-(D+L/2)+V/2,B="start"===i?E-M-P:"center"===i?E-(M+R/2)+z/2:"end"===i?E-A+N+z:Wr(M,A,R,P,N+z,E,E+b,b);var q=T.scrollLeft,$=T.scrollTop;S+=$-(W=Math.max(0,Math.min($+W,T.scrollHeight-L+V))),E+=q-(B=Math.max(0,Math.min(q+B,T.scrollWidth-R+z)))}C.push({el:T,top:W,left:B})}return C}function zr(e){return e===Object(e)&&0!==Object.keys(e).length}var Vr=["href"],qr={class:"flex shrink-0 items-center justify-center w-6 h-6 mr-2"},$r=["innerHTML"],Ur=["src"],Zr=["textContent"],Yr={key:1,class:"absolute right-0 h-full bg-blue-500 dark:bg-blue-400 w-px"},Gr={class:"ml-4 transition-all duration-200 ease-out"},Jr=n(2376),Kr=n(2110),Xr=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},Qr=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}};const eo=(0,r.aZ)({name:"DocSidebarLink",props:{item:{type:Object,required:!0},depth:{type:Number,default:0},isFiltered:{type:Boolean,default:!1,required:!0}},setup:function(e){var t=(0,r.iH)(),n=(0,r.Fl)((function(){return e.item.children&&e.item.children.length>0||e.item.hash})),o=(0,r.Fl)((function(){return!(!e.item.icon&&!e.item.emoji)})),i=function(){if(!St().useRelativePaths)return"/";var e=Dt()();if(!e)return"/";var t=e.level;return St().appendDocumentName||e.isRoot||(St().trailingSlash?location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeRootCache||(e.relativeRootCache=t<=0?!e.isRoot||St().trailingSlash||location.pathname.endsWith("/"+St().documentName)||location.pathname.endsWith("/")?"./":"."+St().base:"../".repeat(t)),e.relativeRootCache}(),l=Mt(),c=St().appendDocumentName?St().documentName:"",u=(0,r.Fl)((function(){return e.item.clickable?e.item.url?e.item.url.startsWith(St().base)?l+e.item.url.slice(St().base.length):e.item.url:e.item.path&&"/"!==e.item.path?!St().trailingSlash&&c&&e.item.path?"".concat(l).concat(e.item.path,"/").concat(c):"".concat(l).concat(e.item.path).concat(c):At(l):null})),d=(0,r.Fl)((function(){return e.item.icon&&!e.item.icon.startsWith("<")&&-1==e.item.icon.indexOf("://")?l+e.item.icon:e.item.icon})),f=Lt().route,h=(0,r.Fl)((function(){if(e.item.url)return!1;var t=i+It(f.value.path),n=u.value;return null!=n&&null!=t&&(n.length===t.length&&n===t||n.length===t.length+1&&"/"!==t[t.length-1]&&"/"===n[n.length-1]&&n.startsWith(t)||n.length+1===t.length&&"/"===t[t.length-1]&&"/"!==n[n.length-1]&&t.startsWith(n))})),p=(0,a.oR)().store,m=(0,r.Fl)((function(){return p.state.sidebarLookup})),v=m.value.get(e.item.path);(e.isFiltered||e.item.open)&&E();var g=(0,Jr.i)(),b=g.result,y=g.error,w=g.loading,x=g.execute,k="".concat(location.origin).concat(Kr.as);function S(){return Xr(this,void 0,void 0,(function(){return Qr(this,(function(t){switch(t.label){case 0:return[4,x("".concat(k,"/").concat(e.item.hash,".json"))];case 1:if(t.sent(),y.value)throw new Error("Error fetching sidebar navigation items. ".concat(y.value));return(0,s.rw)(m.value,b.value,St().trailingSlash),[2]}}))}))}function E(t){var n;return Xr(this,void 0,void 0,(function(){var r;return Qr(this,(function(o){switch(o.label){case 0:return(r=t||v)?!e.item.hash||(null===(n=e.item.children)||void 0===n?void 0:n.length)?[3,2]:[4,S()]:[2];case 1:o.sent(),o.label=2;case 2:return p.actions.updateSidebarLookupItem(r,"expanded",!0),[2]}}))}))}function C(){v&&p.actions.updateSidebarLookupItem(v,"expanded",!1)}function _(){v&&v.expanded?C():E()}function T(){var t;h.value&&(n.value&&E(),null===(t=e.item.parentNodes)||void 0===t||t.forEach((function(e){E(m.value.get(e))})))}(0,r.YP)((function(){return e.isFiltered}),(function(e){e?E(v):(C(),T())}));var O=(0,r.iH)(!1);return(0,r.bv)((function(){h.value&&t.value&&p.actions.setActiveSidebarEl(t.value),T(),(0,r.Y3)((function(){O.value=!0}))})),{sidebarLinkRef:t,isGroup:n,hasCustomIcon:o,href:u,icon:d,isActive:h,onLinkClick:function(e){if(!(0,s.pI)(e)){if(h.value)e.preventDefault();else if((null==v?void 0:v.expanded)&&u.value)return;_()}},toggle:_,loading:w,transitionsEnabled:O,onEnter:function(e){O.value&&(e.style.height="0"),(0,r.Y3)((function(){e.style.height="".concat(e.scrollHeight,"px")}))},onAfterEnter:function(e){(0,r.Y3)((function(){e.style.height="auto"}))},onBeforeLeave:function(e){e.style.height="".concat(e.scrollHeight,"px")},onLeave:function(e){e.style.height="0px"}}}}),to=(0,c.Z)(eo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-emoji"),c=(0,r.up)("doc-icon-folder"),u=(0,r.up)("doc-loading-spinner"),d=(0,r.up)("doc-icon-chevron-right"),f=(0,r.up)("doc-sidebar-link");return(0,r.wg)(),(0,r.iD)("li",null,[(0,r._)("div",{class:(0,r.C_)(["relative flex items-center justify-between break-normal pl-3 pr-4 select-none rounded-l transition-colors ease-out duration-150",{"text-blue-500 dark:text-blue-400 bg-blue-100 dark:bg-dark-650 rounded-l":e.isActive,"text-gray-900 dark:text-dark-250 hover:text-blue-500 dark:hover:text-blue-400":!e.isActive}])},[(0,r._)("a",{ref:"sidebarLinkRef",class:"flex flex-1 items-center cursor-pointer",href:e.href,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onLinkClick&&e.onLinkClick.apply(e,t)})},[(0,r._)("span",qr,[e.item.icon&&e.item.icon.startsWith("<")?((0,r.wg)(),(0,r.j4)(a,{key:0,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r._)("g",{innerHTML:e.item.icon},null,8,$r)]})),_:1})):e.item.icon?((0,r.wg)(),(0,r.iD)("img",{key:1,src:e.icon,class:"w-4.5"},null,8,Ur)):e.item.emoji?((0,r.wg)(),(0,r.j4)(l,{key:2,emoji:e.item.emoji},null,8,["emoji"])):!e.item.icon&&0===e.depth&&e.isGroup?((0,r.wg)(),(0,r.j4)(a,{key:3,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1})):(0,r.kq)("",!0)]),(0,r._)("span",{class:"text-sm py-1.5",textContent:(0,r.zw)(e.item.label)},null,8,Zr)],8,Vr),e.isGroup?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["flex items-center justify-center w-7 h-7 rounded-full transition-colors ease-linear duration-150 group shrink-0",{"hover:bg-blue-200 hover:bg-opacity-50":e.isActive&&!e.loading,"hover:bg-gray-200 dark:hover:bg-dark-500":!e.loading}])},[e.loading?((0,r.wg)(),(0,r.j4)(u,{key:0,size:16})):((0,r.wg)(),(0,r.iD)("button",{key:1,class:(0,r.C_)(["text-gray-400 dark:text-dark-400 group-hover:text-blue-500 dark:group-hover:text-blue-400 focus:outline-none",{"rotate-90":e.item.expanded,"transition-transform ease-out duration-200":e.transitionsEnabled}]),onClick:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)})},[(0,r.Wm)(a,{class:"w-5 h-5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1})],2))],2)):(0,r.kq)("",!0),e.isActive?((0,r.wg)(),(0,r.iD)("span",Yr)):(0,r.kq)("",!0)],2),e.isGroup?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-active-class":"overflow-hidden","leave-active-class":"overflow-hidden",onEnter:e.onEnter,onAfterEnter:e.onAfterEnter,onBeforeLeave:e.onBeforeLeave,onLeave:e.onLeave},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("ul",Gr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t){return(0,r.wg)(),(0,r.j4)(f,{key:t.path,item:t,depth:e.depth+1,"is-filtered":e.isFiltered},null,8,["item","depth","is-filtered"])})),128))],512),[[r.F8,e.isGroup&&e.item.expanded]])]})),_:1},8,["onEnter","onAfterEnter","onBeforeLeave","onLeave"])):(0,r.kq)("",!0)])}]]),no=(0,r.aZ)({name:"DocSidebarLinks",components:{DocSidebarLink:to},props:{items:{type:Array,required:!0},isFiltered:{type:Boolean,required:!0}},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,r.iH)(0),o=(0,r.iH)(),i=(0,a.oR)().store,s=(0,r.Fl)((function(){return i.state.sidebarActiveEl})),l=An(s,{threshold:1}).elements,c=Pr()((function(){var e,r,o=(null===(e=t.value)||void 0===e?void 0:e.scrollTop)||0;i.state.sidebarScroll!==o&&(n.value=(null===(r=t.value)||void 0===r?void 0:r.scrollTop)||0,i.actions.setSidebarScroll(n.value))}),200);return(0,r.bv)((function(){var n,r;o.value=e.value&&new T.Z(e.value),t.value=null===(n=o.value)||void 0===n?void 0:n.getScrollElement(),null===(r=o.value)||void 0===r||r.getScrollElement().addEventListener("scroll",c),t.value&&(t.value.scrollTop=i.state.sidebarScroll),setTimeout((function(){!l.value.some((function(e){return e.isIntersecting}))&&s.value&&function(e,t){var n=e.isConnected||e.ownerDocument.documentElement.contains(e);if(zr(t)&&"function"==typeof t.behavior)return t.behavior(n?Br(e,t):[]);if(n){var r=function(e){return!1===e?{block:"end",inline:"nearest"}:zr(e)?e:{block:"start",inline:"nearest"}}(t);(function(e,t){void 0===t&&(t="auto");var n="scrollBehavior"in document.body.style;e.forEach((function(e){var r=e.el,o=e.top,i=e.left;r.scroll&&n?r.scroll({top:o,left:i,behavior:t}):(r.scrollTop=o,r.scrollLeft=i)}))})(Br(e,r),r.behavior)}}(s.value,{behavior:"smooth",block:"center",boundary:t.value})}),200)})),(0,r.Jd)((function(){var e;null===(e=t.value)||void 0===e||e.removeEventListener("scroll",c)})),{sidebarLinksEl:e}}}),ro=(0,c.Z)(no,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-sidebar-link");return e.items.length?((0,r.wg)(),(0,r.iD)("ul",Mr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.items,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.path,item:t,"is-filtered":e.isFiltered},null,8,["item","is-filtered"])})),128))],512)):(0,r.kq)("",!0)}]]);var oo={class:"relative flex items-center w-full"},io=["value","placeholder"];const so=(0,r.aZ)({name:"DocSidebarFilter",props:{modelValue:String,isOpen:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=St().sidebarFilterPlaceholder||"Filter by title",s=Pr()((function(e){n("update:modelValue",e.target.value)}),200);return(0,r.YP)((function(){return e.isOpen}),(function(){var e;null===(e=o.value)||void 0===e||e.blur()})),{input:o,placeholder:i,clear:function(){var e;n("update:modelValue",""),null===(e=o.value)||void 0===e||e.focus()},onInput:s}}}),ao=(0,c.Z)(so,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",oo,[(0,r._)("input",{ref:"input",value:e.modelValue,class:"w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:border-dark-450 dark:focus:bg-dark-450 dark:hover:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onInput:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onInput&&e.onInput.apply(e,t)})},null,40,io),e.modelValue?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1 text-gray-600 hover:text-gray-900",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])])}]]);var lo=function(){return lo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},lo.apply(this,arguments)},co=r.lR;const uo=(0,r.aZ)({name:"DocSidebar",components:{Teleport:co,DocSidebarLinks:ro,DocSidebarFilter:ao,DocOverlay:Qe},setup:function(){var e=(0,r.iH)(!1),t=(0,a.oR)().store,n=(0,r.iH)();!function(e){var t=(0,r.iH)();function n(){e.state.sidebarLookup.forEach((function(t){e.actions.updateSidebarLookupItem(t,"expanded",!1)})),e.actions.setSidebarScroll(0)}(0,r.bv)((function(){t.value=document.querySelector("#docs-site-logo"),t.value&&t.value.addEventListener("click",n)})),(0,r.Jd)((function(){var e;t.value&&(null===(e=t.value)||void 0===e||e.removeEventListener("click",n))}))}(t),function(e){var t=(0,r.Fl)((function(){return e.state.sidebarLookup}));e.state.initialPageLoad&&function(){if(e.state.sidebar.id&&e.state.sidebar.id===St().id)r=new Map,(o=function(e){e.forEach((function(e){e.children&&(r.set(e.path,e),o(e.children))}))})(e.state.sidebar.data),e.actions.setSidebarLookupData(r);else{var n=(0,s.am)(t.value,St().sidebar,St().trailingSlash);e.actions.setSidebarData({id:St().id,data:n})}var r,o}()}(t);var o=function(e){var t=(0,r.iH)(""),n=(0,r.iH)(!1),o=(0,r.Fl)((function(){return e.state.sidebar})),i=(0,r.Fl)((function(){var e=t.value.toLowerCase();return n.value=!!e,function(e){var t=function(n,r){if(!r.visible)return n;if(r.children){var o=r.children.reduce(t,[]);(o.length||r.clickable&&(!e||r.searchLabel.includes(e)))&&n.push(lo(lo({},r),{children:o}))}else e&&!r.searchLabel.includes(e)||n.push(r);return n};return o.value.data.reduce(t,[])}(e)}));return{query:t,isFiltered:n,filteredItems:i}}(t),i=o.query,l=o.isFiltered,c=o.filteredItems,u=tt(),d=u.enableBodyScroll,f=u.disableBodyScroll;return{Teleport:co,sidebarFooter:n,isOpen:e,show:function(){e.value=!0,f()},hide:function(){e.value=!1,d()},filteredItems:c,isFiltered:l,query:i,showSidebarFilter:St().showSidebarFilter}}}),fo=(0,c.Z)(uo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-left"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-filter"),u=(0,r.up)("doc-sidebar-links"),d=(0,r.up)("doc-icon-menu"),f=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("aside",{class:(0,r.C_)(["fixed top-0 z-40 flex flex-col shrink-0 w-4/5 duration-300 ease-in-out bg-gray-100 border-gray-200 sidebar md:top-20 sm:w-1/2 md:w-75 md:z-0 md:border-r md:h-screen md:sticky md:transition-transform dark:bg-dark-800 dark:border-dark-650",{"shadow-2xl md:shadow-none":e.isOpen}]),style:(0,r.j5)({transform:e.isOpen?"translateX(0)":""})},[(0,r._)("div",Ar,[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full ml-0.5","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0)]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.query=t}),class:"absolute top-0 left-0 right-0 z-5 bg-gray-100 dark:bg-dark-800 h-16 px-6 hidden md:flex items-center","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"flex-1 pl-3 mt-4 md:mt-16 mb-4",items:e.filteredItems,"is-filtered":e.isFiltered},null,8,["items","is-filtered"]),(0,r._)("div",Ir,[(0,r.WI)(e.$slots,"sidebar-footer")],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-sidebar-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"24",onClick:e.show},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1})),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(f,{"is-open":e.isOpen,onSwipeLeft:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onClick"])]})),_:1}))],6)}]]);var ho={id:"docs-sidebar-right",ref:"content",class:"w-full h-full overflow-auto"},po={key:0,class:"flex items-center justify-between h-16 mb-4 border-b lg:border-none lg:h-auto dark:border-dark-650"},mo={class:"px-5 text-gray-500 dark:text-dark-400"};const vo=(0,r.aZ)({name:"DocSidebarRightToggle",emits:["click"]}),go=(0,c.Z)(vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-align-right"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(l,{class:"w-10 h-10 -mr-2.5 md:-mr-12 bg-white dark:bg-dark-850 bg-opacity-80 dark:bg-opacity-80 text-gray-600 hover:text-gray-800 lg:hidden","icon-size":"20",onClick:t[0]||(t[0]=function(t){return e.$emit("click")})},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})}]]);var bo={key:0},yo=n(9843);const wo=(0,r.aZ)({name:"DocToc",emits:["link-click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)([]);!function(e){var t,n,o=-1,i=-1,a=document.getElementById("docs-content"),l=null!==(t=null==a?void 0:a.offsetTop)&&void 0!==t?t:24,c=(0,s.vE)();function u(){var t=e.value;if(t&&t.length){var n=(document.documentElement.scrollTop||document.body.scrollTop)+l,r=function(e,t,n){var r=0,o=n.length-1;if(t>=r&&t<=o)if(e>=n[t].el.offsetTop){if(r=t+1,t===o||e<n[r].el.offsetTop)return t}else if(o=t-1,t>0&&e>=n[o].el.offsetTop)return o;for(;r<=o;){var i=o+r>>1,s=e-n[i].el.offsetTop;if(s>0)r=i+1;else{if(!(s<0)){r=i;break}o=i-1}}return r>o?o:r}(n,o,t),s=function(e,t,n,r){var o=Math.max(0,n),i=r.length-1;if(n===i)return i;if(t>=o&&t<=i)if(e>=r[t].el.offsetTop){if(o=t+1,t===i||e<r[o].el.offsetTop)return t}else if(i=t-1,t>0&&e>=r[i].el.offsetTop)return i;if(i<=n)return n;for(;o<=i;){var s=i+o>>1,a=e-r[s].el.offsetTop;if(a>0)o=s+1;else{if(!(a<0)){o=s;break}i=s-1}}return o>i?i:o}(n+Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)+c-2*l,i,r,t);r<0?s>=0&&(r=0):s<r&&(s=r),r<0?o>=0&&d(t,o,i,!1):o<0?d(t,r,s,!0):s<o||r>i?(d(t,r,s,!0),d(t,o,i,!1)):r<=o?s<=i?(d(t,r,o-1,!0),d(t,s+1,i,!1)):(d(t,r,o-1,!0),d(t,i,s,!0)):s<=i?(d(t,o,r-1,!1),d(t,s+1,i,!1)):(d(t,i,s,!0),d(t,o,r-1,!1)),o=r,i=s}}function d(e,t,n,r){for(var o=t;o<=n;++o)e[o].isActive=r}(0,m.Up)(window,"scroll",u,3,300),(0,m.Up)(window,"resize",u,3,300),a&&(n=new yo.ResizeSensor(a,(0,m.BK)(u,3,300))),(0,r.Jd)((function(){n&&(n.detach(),n=void 0)}))}(o);var i=(0,a.oR)().store;return(0,r.bv)((function(){var e;o.value=(e=[],document.querySelectorAll("#docs-content h2, #docs-content h3").forEach((function(t){var n,r,o="H2"===t.tagName?2:3,i=(null===(n=t.querySelector("a"))||void 0===n?void 0:n.href.split("#")[1])||"",s=(null===(r=t.querySelector("span"))||void 0===r?void 0:r.textContent)||"";if(i.length>0&&s.length>0){var a=decodeURIComponent(i);e.push({el:t,level:o,slug:a,title:s,isActive:!1})}})),e),i.state.sidebarRightHasContent=o.value.length>0})),{tocData:o,classList:function(e){return[{"pl-10":3===e.level},e.isActive?"text-blue-500 dark:text-blue-400":"hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400"]},onClick:function(){n("link-click")}}}}),xo=(0,c.Z)(wo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return e.tocData&&e.tocData.length?((0,r.wg)(),(0,r.iD)("ul",bo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.tocData,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.slug},[(0,r.Wm)(a,{class:(0,r.C_)(["relative block px-5 py-1 toc-link",e.classList(t)]),to:"#".concat(t.slug),onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(t.title)+" ",1),(0,r._)("div",{style:{width:"1px"},class:(0,r.C_)({"absolute top-0 left-0 h-full bg-blue-500 dark:bg-blue-400":t.isActive})},null,2)]})),_:2},1032,["class","to","onClick"])])})),128))])):(0,r.kq)("",!0)}]]);var ko={key:0,class:"px-5 text-sm"},So={key:0,class:"mt-3 mb-2 text-gray-600 uppercase dark:text-dark-400"},Eo=["href"],Co={key:2,class:"font-semibold text-gray-900 dark:text-blue-400"},_o={key:1};const To=(0,r.aZ)({name:"DocRelatedClassItem",props:{item:{type:Object,default:function(){return{}}},depth:{type:Number,default:0}},setup:function(e){return{hasChildren:(0,r.Fl)((function(){return void 0!==e.item.children&&e.item.children.length>0})),marginLeft:(0,r.Fl)((function(){var t=e.depth>1?.5:0;return"".concat((e.depth-1)*t,"rem")})),showIcon:(0,r.Fl)((function(){return!0!==e.item.isGroup&&void 0!==e.item.children&&e.item.children.length>0})),onItemClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e))}}}}),Oo=(0,c.Z)(To,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return(0,r.wg)(),(0,r.iD)("li",{class:(0,r.C_)(["relative",{"pl-1":e.depth>1,"mb-4":0===e.depth}])},[(0,r._)("div",{class:"flex items-center truncate",style:(0,r.j5)({marginLeft:e.marginLeft,minHeight:"1.875rem"})},[e.item.isGroup?((0,r.wg)(),(0,r.iD)("h6",So,(0,r.zw)(e.item.title),1)):e.item.href?((0,r.wg)(),(0,r.iD)("a",{key:1,class:"truncate transition-colors duration-100 ease-linear cursor-pointer hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400",href:e.item.href,onClick:t[0]||(t[0]=function(t){return e.onItemClick(e.item.href,t)})},(0,r.zw)(e.item.label),9,Eo)):((0,r.wg)(),(0,r.iD)("div",Co,(0,r.zw)(e.item.label),1))],4),e.showIcon?((0,r.wg)(),(0,r.iD)("span",{key:0,class:"absolute w-2 h-3 border-b border-l border-gray-600",style:(0,r.j5)({marginLeft:e.marginLeft,marginTop:"0.375rem"})},null,4)):(0,r.kq)("",!0),e.hasChildren?((0,r.wg)(),(0,r.iD)("ul",_o,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t,n){return(0,r.wg)(),(0,r.j4)(a,{key:n,item:t,depth:e.depth+1},null,8,["item","depth"])})),128))])):(0,r.kq)("",!0)],2)}]]),Lo=(0,r.aZ)({name:"DocRelatedClasses",components:{DocRelatedClassItem:Oo},setup:function(){var e=Et().pageData;return{relatedClasses:(0,r.Fl)((function(){var t;return(null===(t=e.value)||void 0===t?void 0:t.relatedClasses)||[]}))}}}),Ro=(0,c.Z)(Lo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return e.relatedClasses.length?((0,r.wg)(),(0,r.iD)("ul",ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.relatedClasses,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,item:e},null,8,["item"])})),128))])):(0,r.kq)("",!0)}]]);var Do=r.lR;const Ao=(0,r.aZ)({name:"DocSidebarRight",components:{Teleport:Do,DocToc:xo,DocOverlay:Qe,DocSidebarRightToggle:go,DocRelatedClasses:Ro},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(!1),n=(0,r.iH)(!1),o=Et().pageData,i=(0,a.oR)().store,s=(0,r.Fl)((function(){return o.value?o.value.relatedClasses?"DocRelatedClasses":"DocToc":null})),l=(0,r.Fl)((function(){return"DocToc"===s.value?"Contents":"DocRelatedClasses"===s.value?"Related Classes":null})),c=(0,r.Fl)((function(){return{"translate-x-0 shadow-2xl":t.value,"translate-x-full":!t.value,"lg:top-40":"DocRelatedClasses"===s.value,"lg:top-20":"DocToc"===s.value}})),u=(0,r.Fl)((function(){return{height:"DocRelatedClasses"===s.value?"calc(100vh - 10rem)":"calc(100vh - 5rem"}}));return(0,r.bv)((function(){n.value=!0,e.value&&new T.Z(e.value)})),{Teleport:Do,content:e,isOpen:t,isMounted:n,store:i,show:function(){t.value=!0},hide:function(){t.value=!1},currentComponent:s,title:l,classes:c,styles:u}}}),Io=(0,c.Z)(Ao,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-right"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-right-toggle"),u=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 text-sm transition-transform duration-300 ease-in-out bg-white border-gray-200 sidebar-right sm:w-1/2 md:w-104 lg:z-0 lg:sticky lg:w-64 lg:shrink-0 lg:transform-none lg:border-l lg:shadow-none lg:pt-6 focus:outline-none dark:bg-dark-800 lg:dark:bg-dark-850 dark:border-dark-650",e.classes]),style:(0,r.j5)(e.styles),onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",ho,[e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.iD)("div",po,[(0,r._)("h6",mo,(0,r.zw)(e.title),1),(0,r.Wm)(l,{class:"w-10 h-10 ml-3 lg:hidden",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])])):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.currentComponent),{onLinkClick:e.hide},null,8,["onLinkClick"]))],512),e.isMounted&&e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{key:0,to:"#docs-sidebar-right-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"absolute right-0",onClick:e.show},null,8,["onClick"])]})),_:1})):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(u,{"is-open":e.isOpen,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeRight","onClick"])]})),_:1}))],38)}],["__scopeId","data-v-3955b324"]]);var Mo=["aria-checked"],Fo=["checked"],Po={class:"inline-flex items-center"};const Ho=(0,r.aZ)({name:"DocSwitch",props:{modelValue:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit;return{isFocused:(0,r.iH)(!1),toggle:function(){n("update:modelValue",!e.modelValue)}}}}),No=(0,c.Z)(Ho,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("label",{class:"relative inline-block cursor-pointer whitespace-nowrap",role:"switch","aria-checked":e.modelValue},[(0,r._)("input",{type:"checkbox",class:"absolute opacity-0",style:{"z-index":"-1"},checked:e.modelValue,onChange:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)}),onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,Fo),(0,r._)("div",Po,[(0,r._)("div",{class:(0,r.C_)(["w-6 h-2 transition-colors duration-100 ease-linear rounded-full",e.modelValue?"bg-blue-500 dark:bg-blue-400":"bg-gray-400 dark:bg-dark-400"])},null,2),(0,r._)("div",{class:(0,r.C_)(["absolute w-4 h-4 transition-transform duration-100 ease-linear bg-white border border-gray-500 rounded-full",{"shadow-outline":e.isFocused}]),style:(0,r.j5)({transform:e.modelValue?"translateX(8px)":null})},null,6)]),(0,r.WI)(e.$slots,"default")],8,Mo)}]]),jo=(0,$e.aZ)({name:"DocTab",props:{id:{type:String,required:!0},active:Boolean},setup:function(e,t){var n=t.slots;return function(){return(0,$e.h)((function(){var e;return null===(e=n.default)||void 0===e?void 0:e.call(n)}))}}});var Wo=n(2262);const Bo=(0,$e.aZ)({name:"DocTabs",components:{DocAnchorTarget:u},setup:function(e,t){var n,r,o,i,a=t.slots,l=(0,Wo.iH)(),c=(0,Wo.iH)(""),d=(null===(n=a.default)||void 0===n?void 0:n.call(a))||[],f={};c.value=(null===(o=null===(r=d.find((function(e){var t,n;return""===(null===(t=e.props)||void 0===t?void 0:t.active)||(null===(n=e.props)||void 0===n?void 0:n.active)})))||void 0===r?void 0:r.props)||void 0===o?void 0:o.id)||(null===(i=d[0].props)||void 0===i?void 0:i.id);var h=d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id;return"#".concat(n)})),p=Lt().route;function m(){if(p.value.hash&&h.includes(p.value.hash)){var e=p.value.hash.substr(1);if(c.value!==e)return c.value=e,!0}return!1}function v(){var e=c.value;if(!f[e]){f[e]=!0;var t=(0,$e.m0)((function(){var e;null===(e=l.value)||void 0===e||e.dispatchEvent(new Event("onPluginReady")),t()}),{flush:"post"})}}m(),f[c.value]=!0,(0,$e.YP)(p,(function(){m()&&v()}));var g=(0,$e.Fl)((function(){return d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id,r=c.value===n;return(0,$e.h)(u,{id:n},(function(){var t,o;return(0,$e.h)("a",{href:"#".concat(n),class:{"no-link block px-5 py-4 cursor-pointer border-b-2 font-medium":!0,"text-gray-500 dark:text-dark-350 hover:text-blue-500 dark:hover:text-blue-400 border-transparent hover:border-gray-300 dark:hover:border-dark-450":!r,"text-blue-500 dark:text-blue-400 border-blue-500":r},onClick:function(e){(0,s.pI)(e)||(e.preventDefault(),c.value!==n&&(c.value=n,v()))}},null===(o=(t=e.children).title)||void 0===o?void 0:o.call(t))}))}))})),b=(0,$e.Fl)((function(){return d.map((function(e){var t;if(c.value===(null===(t=e.props)||void 0===t?void 0:t.id))return(0,$e.h)((function(){return(0,$e.h)("div",{class:"tab-content"},e)}))}))}));return function(){return(0,$e.h)("div",{ref:l,class:"mb-6 pluggable"},[(0,$e.h)("div",{class:"flex border dark:border-dark-650 -mb-px rounded-t"},g.value),(0,$e.h)("div",{class:"p-5 border dark:border-dark-650 rounded-b-md"},b.value)])}}}),zo=Bo,Vo=(0,r.aZ)({name:"DocThemeSwitch",setup:function(){var e=(0,r.iH)(null),t=(0,r.Fl)((function(){return"dark"===e.value}));function n(t){document.documentElement.classList.add("no-transitions"),setTimeout((function(){document.documentElement.classList.remove("no-transitions")}),50),t?(document.documentElement.classList.add("dark"),e.value="dark"):(document.documentElement.classList.remove("dark"),e.value="light")}e.value=(0,s.qn)(St().base,localStorage,"doc_theme"),e.value||(e.value=document.documentElement.classList.contains("dark")?"dark":"light");var o,i=(0,r.iH)();return(0,r.bv)((function(){i.value=window.matchMedia("(prefers-color-scheme: dark)"),o=function(e){(0,s.qn)(St().base,localStorage,"doc_theme")||n(e.matches)},i.value.addEventListener("change",o)})),(0,r.Jd)((function(){var e;null===(e=i.value)||void 0===e||e.removeEventListener("change",o)})),{isDark:t,toggleColorMode:n,onSwitchClick:function(){n("light"===e.value),(0,s.Nh)(St().base,localStorage,"doc_theme",e.value)}}}}),qo=(0,c.Z)(Vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-sun"),l=(0,r.up)("doc-icon-moon"),c=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(c,{class:(0,r.C_)(["w-10 h-10",{"-mb-0.5":!e.isDark}]),"icon-size":"20",onClick:e.onSwitchClick},{default:(0,r.w5)((function(){return[e.isDark?((0,r.wg)(),(0,r.j4)(a,{key:0})):((0,r.wg)(),(0,r.j4)(l,{key:1}))]})),_:1},8,["class","onClick"])}]]);var $o={id:"docs-toolbar",class:"sticky z-20 flex items-center justify-between h-16 px-6 bg-white border-b border-gray-200 md:h-20 md:pl-16 md:top-20 top-16 dark:bg-dark-850 dark:border-dark-650"},Uo={class:"relative"},Zo={ref:"visibleLinksDiv",class:"flex whitespace-nowrap"},Yo={class:"block"},Go=["innerHTML"],Jo={ref:"more",class:"mr-3 more-dropdown"},Ko={class:"flex flex-col"},Xo={class:"flex items-center h-5 px-2 text-xs font-semibold text-white bg-blue-500 dark:bg-blue-400 rounded-full md:text-2xs"};const Qo=(0,r.aZ)({name:"DocToolbarMemberCount"}),ei=(0,c.Z)(Qo,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",Xo,[(0,r.WI)(e.$slots,"default")])}]]);var ti=["aria-expanded","aria-disabled","disabled"],ni={class:"absolute left-0 z-20"},ri={ref:"dropdownBottom",class:"h-2"},oi={key:0,class:"absolute bottom-0 right-0 z-50 flex items-center h-6 px-2 mb-4 mr-8 text-xs leading-none text-center text-gray-500 bg-white rounded-full shadow-md dark:bg-dark-550 dark:text-dark-200"},ii=function(){return ii=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},ii.apply(this,arguments)};const si=(0,r.aZ)({name:"ToolbarLinkDropdownContent",components:{DocAnchorTrigger:p},props:{groupId:{type:String,required:!0},members:{type:Array,required:!0},isSingleColumn:{type:Boolean,required:!0},linkWidth:{type:Number,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(3),i=(0,r.iH)(0),s=(0,r.Fl)((function(){return ii({maxHeight:"calc(100vh - 11rem)",minWidth:"".concat(e.linkWidth,"px")},!e.isSingleColumn&&{width:"".concat(i.value,"px")})})),a=(0,r.Fl)((function(){var t=Math.ceil(e.members.length/o.value);return{gridTemplateColumns:"repeat(".concat(o.value,", 1fr)"),gridTemplateRows:"repeat(".concat(t,", 1fr)")}})),l=tt(),c=l.enableBodyScroll,u=l.disableBodyScroll;function d(){var e=document.querySelector("#docs-content");i.value=e?e.clientWidth:0}et((function(){!function(){var e=window.innerWidth;o.value=e<1124&&e>1024||e<900?2:3}(),d()})),(0,r.bv)(d);var f=function(){var e=(0,r.iH)();return{dropdownBottom:e,isIntersecting:An(e).isIntersecting}}(),h=f.dropdownBottom,p=f.isIntersecting;return{memberGridStyles:a,mmemberGridWrapperStyles:s,enableBodyScroll:c,disableBodyScroll:u,onClick:function(){c(),n("click")},dropdownBottom:h,isIntersecting:p}}}),ai=(0,c.Z)(si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"gridWrapper",class:"px-2 pt-2 mt-2 overflow-y-auto bg-white border border-gray-300 rounded shadow-lg member-links-dropdown dark:bg-dark-650 dark:border-dark-500",style:(0,r.j5)(e.mmemberGridWrapperStyles),onMouseenter:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.disableBodyScroll&&e.disableBodyScroll.apply(e,t)}),onMouseleave:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.enableBodyScroll&&e.enableBodyScroll.apply(e,t)})},[(0,r._)("div",{class:(0,r.C_)({"sm:grid grid-flow-col":!e.isSingleColumn}),style:(0,r.j5)(e.memberGridStyles)},[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(n){return(0,r.wg)(),(0,r.j4)(a,{key:n.id,to:"#".concat(n.id),onClick:t[0]||(t[0]=function(t){return e.onClick()})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.name),1)]})),_:2},1032,["to"])})),128))],6),(0,r._)("div",ri,null,512)],36),e.isIntersecting?(0,r.kq)("",!0):((0,r.wg)(),(0,r.iD)("span",oi," More... "))])}],["__scopeId","data-v-ca01e68c"]]),li=(0,r.aZ)({name:"DocToolbarLinkDropdown",components:{DocToolbarMemberCount:ei,DocToolbarLinkDropdownContent:ai},props:{value:Boolean,inDropdown:Boolean,isSingleColumn:Boolean,disabled:Boolean,groupId:String,count:Number,members:Array,linkWidth:Number},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1);return(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),(0,r.YP)(i,(function(e){n("update:modelValue",e)})),{dropdown:o,toggleDropdown:function(){i.value=!i.value},onBodyClick:st.w,isOpen:i}}}),ci=(0,c.Z)(li,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-down"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-toolbar-member-count"),u=(0,r.up)("doc-toolbar-link-dropdown-content");return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:(0,r.C_)({hidden:e.inDropdown})},[(0,r._)("button",{class:(0,r.C_)(["relative z-20 flex items-center justify-center w-6 h-full px-0 border-l border-white rounded-r focus:outline-none focus:bg-gray-400 hover:bg-gray-300 dark:border-dark-850 dark:hover:bg-dark-450 dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isOpen,"bg-gray-200 dark:bg-dark-550":!e.isOpen}]),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,"aria-disabled":e.disabled,disabled:e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleDropdown&&e.toggleDropdown.apply(e,t)})},[(0,r.Wm)(l,{class:"dark:text-white",width:"13",height:"13"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r.Wm)(c,{class:"absolute top-0 right-0 -mt-3 -mr-2"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1})],10,ti),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",ni,[(0,r.Wm)(u,{members:e.members,"is-single-column":e.isSingleColumn,"group-id":e.groupId,"link-width":e.linkWidth,onClick:t[1]||(t[1]=function(t){return e.isOpen=!1})},null,8,["members","is-single-column","group-id","link-width"])],512),[[r.F8,e.isOpen]])]})),_:1})],2)}]]),ui=(0,r.aZ)({name:"DocToolbarLink",components:{DocToolbarLinkDropdown:ci,DocToolbarMemberCount:ei,DocAnchorTrigger:p},props:{link:{type:Object,required:!0},inDropdown:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,a.oR)().store,i=(0,r.Fl)((function(){return o.getters.getVisibleGroupMembers(e.link.id)})),s=(0,r.Fl)((function(){return i.value.length})),l=(0,r.Fl)((function(){return s.value<=12})),c=(0,r.Fl)((function(){return 0===s.value})),u=(0,r.Fl)((function(){return 0===s.value?"":"#".concat(e.link.id)})),d=(0,r.Fl)((function(){return t.value?t.value.clientWidth:0}));return{linkEl:t,linkWidth:d,isSingleColumn:l,isDropdownOpen:n,disabled:c,href:u,count:s,members:i}}}),di=(0,c.Z)(ui,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-member-count"),l=(0,r.up)("doc-anchor-trigger"),c=(0,r.up)("doc-toolbar-link-dropdown");return(0,r.wg)(),(0,r.iD)("div",{ref:"linkEl",class:(0,r.C_)(["inline-flex h-8 text-sm leading-none",{"mr-3":!e.inDropdown,relative:e.isSingleColumn}]),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.isDropdownOpen=!1}),["esc"]))},[(0,r.Wm)(l,{class:(0,r.C_)(["flex items-center justify-between grow px-3 font-medium text-gray-900 focus:bg-gray-400 focus:outline-none dark:text-white dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"px-5 hover:bg-gray-200 dark:hover:bg-dark-500":e.inDropdown,"rounded-l hover:bg-gray-300 dark:hover:bg-dark-450":!e.inDropdown,"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isDropdownOpen,"bg-gray-200 dark:bg-dark-550":!e.isDropdownOpen&&!e.inDropdown}]),to:e.href,disabled:e.disabled},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default"),(0,r.Wm)(a,{class:(0,r.C_)({hidden:!e.inDropdown})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1},8,["class"])]})),_:3},8,["class","to","disabled"]),(0,r.Wm)(c,{modelValue:e.isDropdownOpen,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.isDropdownOpen=t}),"in-dropdown":e.inDropdown,"is-single-column":e.isSingleColumn,disabled:e.disabled,count:e.count,members:e.members,"group-id":e.link.id,"link-width":e.linkWidth},null,8,["modelValue","in-dropdown","is-single-column","disabled","count","members","group-id","link-width"])],34)}]]);const fi=(0,r.aZ)({name:"DocToolbarLinks",components:{DocToolbarLink:di},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(0),n=function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=St().toolbarLinks,o=(0,r.iH)([]),i=(0,r.iH)([]),s=(0,r.iH)([]);(0,r.bv)((function(){o.value=n.slice()}));var a=function(){var e;return null===(e=t.value)||void 0===e?void 0:e.clientWidth},l=function(){var e,t,n,c=(t=document.querySelector("#docs-toolbar"),n=window.innerWidth<960?48:88,(t?t.clientWidth-n:0)-((null===(e=document.querySelector("#docs-filters"))||void 0===e?void 0:e.clientWidth)||0));if(a()>c&&o.value.length){s.value.push(a());var u=o.value.pop();u&&i.value.unshift(u)}else if(c>s.value[s.value.length-1]){var d=i.value[0];i.value.splice(0,1),o.value.push(d),s.value.pop()}(0,r.Y3)((function(){a()>c&&o.value.length&&l()}))};return{more:e,visibleLinksDiv:t,visibleLinks:o,invisibleLinks:i,updateNavLinks:l}}(),o=n.more,i=n.visibleLinksDiv,s=n.visibleLinks,a=n.invisibleLinks,l=n.updateNavLinks,c=(0,r.Fl)((function(){return s.value.length<=1&&t.value<960?"left":"right"}));function u(){t.value=window.innerWidth}return(0,r.bv)((function(){u(),l()})),et((function(){u(),l()})),{dropdown:e,more:o,visibleLinksDiv:i,visibleLinks:s,invisibleLinks:a,dropdownAlignment:c,onClick:function(){e.value.hide()}}}}),hi=(0,c.Z)(fi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-link"),l=(0,r.up)("doc-icon-more-horizontal"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",Uo,[(0,r._)("div",Zo,[(0,r._)("div",Yo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.visibleLinks,(function(e){return(0,r.wg)(),(0,r.j4)(a,{key:e.id,link:e,"in-dropdown":!1},{default:(0,r.w5)((function(){return[(0,r._)("span",{innerHTML:e.shortLabel?e.shortLabel:e.label},null,8,Go)]})),_:2},1032,["link"])})),128))]),(0,r.wy)((0,r._)("div",Jo,[(0,r.Wm)(u,{ref:"dropdown",class:"inline-block",align:e.dropdownAlignment},{"button-content":(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-8 h-8 bg-gray-200 hover:bg-gray-300 dark:bg-dark-550 dark:hover:bg-dark-450",rounded:!1},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1})]})),default:(0,r.w5)((function(){return[(0,r._)("div",Ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.invisibleLinks,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.id,link:t,"in-dropdown":!0,onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r._)("span",null,(0,r.zw)(t.label),1)]})),_:2},1032,["link","onClick"])})),128))])]})),_:1},8,["align"])],512),[[r.F8,e.invisibleLinks.length]])],512)])}]]);var pi={id:"docs-filters"},mi={class:"items-center hidden lg:flex"},vi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},gi=(0,r._)("span",{class:"hidden sm:inline"},"Filters",-1),bi={class:"pt-2 pb-3"},yi={class:"px-5 pb-4 border-b dark:border-dark-500"},wi={class:"px-5 pt-4"},xi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},ki=(0,r._)("span",null,"Access",-1),Si={class:"pt-1"};const Ei=(0,r.aZ)({name:"DocToolbarAccess",setup:function(){var e=(0,a.oR)().store;return{access:St().access,selected:(0,r.Fl)({get:function(){return e.state.access},set:function(t){return e.actions.updateAccess(t)}}),isDirty:(0,r.Fl)((function(){return e.getters.isAccessDirty()}))}}}),Ci=(0,c.Z)(Ei,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-shield"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-checkbox"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r.Wm)(u,{class:"hidden lg:block",align:"right","menu-width":"9rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative text-gray-900 bg-white border btn focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isDirty?((0,r.wg)(),(0,r.iD)("span",xi)):(0,r.kq)("",!0),(0,r.Wm)(l,{class:"mr-1 -ml-1",width:"14",height:"14",style:{"margin-bottom":"0"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),ki],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Si,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"flex px-5 hover:bg-gray-200 dark:hover:bg-dark-500"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])]})),_:1}),((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"py-0.5 lg:hidden"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])}]]);var _i={class:"relative",style:{width:"12.4375rem"}},Ti=["placeholder"];const Oi=(0,r.aZ)({name:"DocToolbarMemberFilter",setup:function(){var e=(0,a.oR)().store,t=(0,r.iH)(),n=St().toolbarFilterPlaceholder||"Filter",o=(0,r.Fl)({get:function(){return e.state.memberFilter},set:Pr()((function(t){e.actions.updateMemberFilter(t)}),400)});function i(){var e;null===(e=t.value)||void 0===e||e.select()}return(0,r.bv)((function(){var e;window.innerWidth>960&&(null===(e=t.value)||void 0===e||e.focus(),i())})),function(e){var t=Lt(),n=t.route,o=t.Router;n.value.query&&n.value.query.q&&(e.value=n.value.query.q),(0,r.YP)(e,(function(e){var t=e?{q:e}:{};n.value.query=t,o.replace(n.value)}))}(o),{input:t,query:o,placeholder:n,select:i,clear:function(){var e;o.value="",null===(e=t.value)||void 0===e||e.focus()}}}}),Li=(0,c.Z)(Oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",_i,[(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-8 px-3 leading-8 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.select&&e.select.apply(e,t)})},null,40,Ti),[[r.nr,e.query,void 0,{trim:!0}]]),e.query?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]),Ri=(0,r.aZ)({name:"DocToolbarFilters",components:{DocToolbarAccess:Ci,DocToolbarMemberFilter:Li},setup:function(){var e=(0,a.oR)().store;return{isFiltersDirty:(0,r.Fl)((function(){return e.getters.isFiltersDirty()}))}}}),Di=(0,c.Z)(Ri,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-access"),l=(0,r.up)("doc-toolbar-member-filter"),c=(0,r.up)("doc-icon-filter"),u=(0,r.up)("doc-icon"),d=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",pi,[(0,r._)("div",mi,[(0,r.Wm)(a,{class:"ml-3"}),(0,r.Wm)(l,{class:"ml-3"})]),(0,r.Wm)(d,{class:"lg:hidden",align:"right","menu-width":"13rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative inline-flex items-center justify-center w-8 h-8 p-0 text-sm font-medium leading-none text-gray-900 whitespace-nowrap bg-white border rounded cursor-pointer select-none sm:w-auto sm:px-3 focus:outline-none focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 transition-colors duration-200 ease-out",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isFiltersDirty?((0,r.wg)(),(0,r.iD)("span",vi)):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"mb-0 sm:mr-1",width:"14",height:"14"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1}),gi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",bi,[(0,r._)("div",yi,[(0,r.Wm)(l)]),(0,r._)("div",wi,[(0,r.Wm)(a)])])]})),_:1})])}]]),Ai=(0,r.aZ)({name:"DocToolbar",components:{DocToolbarLinks:hi,DocToolbarFilters:Di},setup:function(){return{checkState:(0,r.iH)(!0),selected:(0,r.iH)([])}}}),Ii=(0,c.Z)(Ai,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-links"),l=(0,r.up)("doc-toolbar-filters");return(0,r.wg)(),(0,r.iD)("div",$o,[(0,r.Wm)(a,{class:"grow-0"}),(0,r.Wm)(l)])}]]);var Mi={key:0,class:"w-full px-4 py-3 text-center text-red-800 bg-red-100 rounded dark:bg-red-400 dark:text-white"};const Fi=(0,r.aZ)({name:"DocToolbarMemberFilterNoResults",setup:function(){var e=(0,a.oR)().store,t=(0,r.Fl)((function(){return e.state.memberFilter})),n=(0,r.Fl)((function(){var t=0;return St().toolbarLinks.forEach((function(n){t+=e.getters.getVisibleGroupMembers(n.id).length})),t})),o=(0,r.Fl)((function(){return 0===n.value})),i=(0,r.Fl)((function(){return St().filterNotFoundMsg.replace("{query}",t.value)}));return{query:t,noResults:o,notFoundMsg:i}}}),Pi=(0,c.Z)(Fi,[["render",function(e,t,n,o,i,s){return e.query&&e.noResults?((0,r.wg)(),(0,r.iD)("div",Mi,(0,r.zw)(e.notFoundMsg),1)):(0,r.kq)("",!0)}]]);var Hi={d:"M21 9H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1zM3 7h18c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1zM21 13H3c-.55 0-1 .45-1 1s.45 1 1 1h18c.55 0 1-.45 1-1s-.45-1-1-1zM21 17H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1z"};const Ni=(0,$e.aZ)({name:"DocIconAlignRight"}),ji=(0,c.Z)(Ni,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Hi)}]]);var Wi={d:"M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"};const Bi=(0,$e.aZ)({name:"DocIconArrowLeft"}),zi=(0,c.Z)(Bi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Wi)}]]);var Vi={d:"M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z"};const qi=(0,$e.aZ)({name:"DocIconArrowRight"}),$i=(0,c.Z)(qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Vi)}]]);var Ui={d:"M19.71 11.29l-7-7a1 1 0 00-1.42 0l-7 7A.996.996 0 105.7 12.7L11 7.41V19c0 .55.45 1 1 1s1-.45 1-1V7.41l5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29c.39-.39.39-1.03 0-1.42z"};const Zi=(0,$e.aZ)({name:"DocIconArrowTop"}),Yi=(0,c.Z)(Zi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ui)}]]);var Gi={d:"M21.67 6.68c-.02-.07-.03-.15-.07-.22a.967.967 0 00-.25-.28c-.24-.3-.51-.58-.85-.78l-7-4c-.93-.53-2.08-.54-3 0l-7 4c-.35.2-.62.48-.86.79-.09.08-.17.16-.24.27-.03.07-.05.14-.07.21C2.13 7.08 2 7.53 2 8v8c0 1.07.58 2.06 1.5 2.6l7 4c.32.18.66.28 1.01.34.15.09.31.15.49.15s.34-.06.49-.15c.35-.06.69-.15 1.01-.34l7-4c.92-.54 1.5-1.53 1.5-2.6V8c0-.47-.13-.91-.33-1.32zM11.5 3.14c.15-.09.33-.14.5-.14.17 0 .35.05.5.14l6.46 3.69L12 10.85 5.04 6.83l6.46-3.69zm-7 13.73c-.31-.18-.5-.52-.5-.87V8.54l7 4.05v7.99l-6.5-3.71zm15-.01L13 20.58v-7.99l7-4.05V16c0 .35-.19.69-.5.86z"};const Ji=(0,$e.aZ)({name:"DocIconBox"}),Ki=(0,c.Z)(Ji,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Gi)}]]);var Xi={d:"M9 18.5c-.38 0-.77-.15-1.06-.44l-5-5a1.49 1.49 0 010-2.12 1.49 1.49 0 012.12 0L9 14.88l9.94-9.94a1.49 1.49 0 012.12 0c.59.59.59 1.54 0 2.12l-11 11c-.29.29-.68.44-1.06.44z"};const Qi=(0,$e.aZ)({name:"DocIconCheck"}),es=(0,c.Z)(Qi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Xi)}]]);var ts=[(0,r._)("path",{d:"M21 9.09c-.55 0-1 .45-1 1v.92c0 4.96-4.04 8.99-9 8.99-4.97 0-9-4.04-9-9s4.04-9 9-9c1.27 0 2.5.26 3.66.78.51.22 1.1 0 1.32-.51.23-.5 0-1.1-.51-1.32C14.06.32 12.56 0 11.01 0H11C4.94 0 0 4.93 0 10.99 0 17.06 4.93 22 10.99 22H11c6.06 0 11-4.93 11-10.99v-.92c0-.56-.45-1-1-1z"},null,-1),(0,r._)("path",{d:"M8.71 9.31a.996.996 0 10-1.41 1.41l3 3c.19.19.44.29.71.29.27 0 .52-.11.71-.29l10-10.01a.996.996 0 10-1.41-1.41L11 11.6 8.71 9.31z"},null,-1)];const ns=(0,$e.aZ)({name:"DocIconCheckCircle"}),rs=(0,c.Z)(ns,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ts)}]]);var os={d:"M12 16c-.26 0-.51-.1-.71-.29l-6-6A.996.996 0 116.7 8.3l5.3 5.29 5.29-5.29a.996.996 0 111.41 1.41l-6 6c-.19.19-.44.29-.7.29z"};const is=(0,$e.aZ)({name:"DocIconChevronDown"}),ss=(0,c.Z)(is,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",os)}]]);var as={d:"M15.71 11.29l-6-6A.996.996 0 108.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l6-6c.39-.39.39-1.03 0-1.42z"};const ls=(0,$e.aZ)({name:"DocIconChevronRight"}),cs=(0,c.Z)(ls,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",as)}]]);var us={d:"M20.92 8.62a.875.875 0 00-.22-.32l-7-7A.995.995 0 0013 1H6C4.35 1 3 2.35 3 4v16c0 1.65 1.35 3 3 3h12c1.65 0 3-1.35 3-3V9c0-.13-.03-.26-.08-.38zM14 4.41L17.59 8H14V4.41zM18 21H6c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h6v6c0 .55.45 1 1 1h6v10c0 .55-.45 1-1 1z"};const ds=(0,$e.aZ)({name:"DocIconFile"}),fs=(0,c.Z)(ds,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",us)}]]);var hs={d:"M14 22c-.15 0-.31-.04-.45-.11l-4-2A.988.988 0 019 19v-6.17L1.24 3.65a.995.995 0 01-.14-1.07c.16-.35.51-.58.9-.58h20c.39 0 .74.23.91.58s.11.77-.14 1.07L15 12.83V21a.999.999 0 01-1 1zm-3-3.62l2 1v-6.92c0-.24.08-.47.24-.65L19.84 4H4.16l6.61 7.81c.15.18.24.41.24.65v5.92z"};const ps=(0,$e.aZ)({name:"DocIconFilter"}),ms=(0,c.Z)(ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",hs)}]]);var vs=(0,r._)("path",{d:"M20 22H4c-1.65 0-3-1.35-3-3V5c0-1.65 1.35-3 3-3h5c.33 0 .65.17.83.45L11.54 5H20c1.65 0 3 1.35 3 3v11c0 1.65-1.35 3-3 3zM4 4c-.55 0-1 .45-1 1v14c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V8c0-.55-.45-1-1-1h-9c-.33 0-.65-.17-.83-.45L8.46 4H4z"},null,-1),gs=(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1);const bs=(0,$e.aZ)({name:"DocIconFolder"}),ys=(0,c.Z)(bs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)(r.HY,null,[vs,gs],64)}]]);var ws=[(0,r._)("path",{d:"M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"},null,-1),(0,r._)("path",{d:"M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"},null,-1)];const xs=(0,$e.aZ)({name:"DocIconHistory"}),ks=(0,c.Z)(xs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ws)}]]);var Ss={d:"M21.61 8.21l-9-7c-.36-.28-.87-.28-1.23 0l-9 7C2.14 8.4 2 8.69 2 9v11c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3V9c0-.31-.14-.6-.39-.79zM14 21h-4v-8h4v8zm6-1c0 .55-.45 1-1 1h-3v-9c0-.55-.45-1-1-1H9c-.55 0-1 .45-1 1v9H5c-.55 0-1-.45-1-1V9.49l8-6.22 8 6.22V20z"};const Es=(0,$e.aZ)({name:"DocIconHome"}),Cs=(0,c.Z)(Es,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ss)}]]);var _s=[(0,r._)("path",{d:"M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"},null,-1),(0,r._)("path",{d:"M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"},null,-1),(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1)];const Ts=(0,$e.aZ)({name:"DocIconInfo"}),Os=(0,c.Z)(Ts,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,_s)}]]);var Ls=[(0,r._)("path",{d:"M.55 6.89l10 5c.14.07.3.11.45.11s.31-.04.45-.11l10-5c.34-.16.55-.51.55-.89s-.21-.73-.55-.89l-10-5a.995.995 0 00-.89 0l-10 5C.21 5.27 0 5.62 0 6s.21.73.55.89zM11 2.12L18.76 6 11 9.88 3.24 6 11 2.12zM20.55 15.11L11 19.88 1.45 15.1c-.49-.25-1.09-.05-1.34.45s-.05 1.09.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1),(0,r._)("path",{d:"M20.55 10.11L11 14.88 1.45 10.1a.993.993 0 00-1.34.45.993.993 0 00.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1)];const Rs=(0,$e.aZ)({name:"DocIconLayers"}),Ds=(0,c.Z)(Rs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ls)}]]);var As=[(0,r._)("path",{d:"M21.11 2.75a5.98 5.98 0 00-8.35.01l-1.72 1.71a.996.996 0 101.41 1.41l1.71-1.7c1.56-1.5 4-1.5 5.56 0 1.59 1.53 1.63 4.07.11 5.64l-3 3c-.13.13-.28.26-.43.38a4.003 4.003 0 01-5.6-.81c-.33-.44-.96-.53-1.4-.2-.44.33-.53.96-.2 1.4a5.999 5.999 0 004.81 2.4c1.25 0 2.51-.39 3.58-1.19.23-.17.45-.36.65-.56l3.01-3.01a5.991 5.991 0 00-.14-8.48z"},null,-1),(0,r._)("path",{d:"M11.53 18.11l-1.7 1.7c-1.56 1.5-4 1.5-5.56 0-1.59-1.53-1.63-4.07-.11-5.64l3-3c.14-.14.28-.26.43-.38a3.997 3.997 0 015.6.8c.33.44.96.53 1.4.2.44-.33.53-.96.2-1.4a5.93 5.93 0 00-3.95-2.34c-1.58-.22-3.15.18-4.44 1.14-.23.17-.44.36-.65.56l-3.01 3.01c-2.3 2.38-2.23 6.19.15 8.48a5.956 5.956 0 004.16 1.69c1.5 0 3.01-.57 4.19-1.7l1.71-1.71c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0z"},null,-1)];const Is=(0,$e.aZ)({name:"DocIconLink"}),Ms=(0,c.Z)(Is,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,As)}]]);var Fs={d:"M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"};const Ps=(0,$e.aZ)({name:"DocIconMenu"}),Hs=(0,c.Z)(Ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Fs)}]]);var Ns={d:"M19 13H5c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1s-.45 1-1 1z"};const js=(0,$e.aZ)({name:"DocIconMinus"}),Ws=(0,c.Z)(js,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ns)}]]);var Bs=[(0,r._)("path",{d:"M11 22C4.93 22 0 17.07 0 11S4.93 0 11 0s11 4.93 11 11-4.93 11-11 11zm0-20c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9z"},null,-1),(0,r._)("path",{d:"M16.5 11c0 3.05-2.46 5.51-5.49 5.51-2.16 0-4.02-1.25-4.92-3.05-.11-.22.08-.49.32-.43 1.15.28 2.43.2 3.71-.42 1.88-.9 3.07-2.89 3.06-4.97 0-.42-.05-.83-.15-1.22-.06-.24.21-.43.43-.32 1.79.88 3.04 2.74 3.04 4.9z"},null,-1)];const zs=(0,$e.aZ)({name:"DocIconMoon"}),Vs=(0,c.Z)(zs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Bs)}]]);var qs=[(0,r._)("circle",{cx:"12",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"19",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"5",cy:"12",r:"2"},null,-1)];const $s=(0,$e.aZ)({name:"DocIconMoreHorizontal"}),Us=(0,c.Z)($s,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qs)}]]);var Zs={d:"M19 11h-6V5c0-.55-.45-1-1-1s-1 .45-1 1v6H5c-.55 0-1 .45-1 1s.45 1 1 1h6v6c0 .55.45 1 1 1s1-.45 1-1v-6h6c.55 0 1-.45 1-1s-.45-1-1-1z"};const Ys=(0,$e.aZ)({name:"DocIconPlus"}),Gs=(0,c.Z)(Ys,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Zs)}]]);var Js={d:"M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z"};const Ks=(0,$e.aZ)({name:"DocIconSearch"}),Xs=(0,c.Z)(Ks,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Js)}]]);var Qs={d:"M12 23c-.15 0-.31-.04-.45-.11C11.2 22.72 3 18.54 3 12V5c0-.42.26-.79.65-.94l8-3c.23-.08.48-.08.7 0l8 3c.39.15.65.52.65.94v7c0 6.54-8.2 10.72-8.55 10.89-.14.07-.3.11-.45.11zM5 5.69V12c0 4.55 5.39 7.95 7 8.86 1.61-.92 7-4.33 7-8.86V5.69l-7-2.63-7 2.63z"};const ea=(0,$e.aZ)({name:"DocIconShield"}),ta=(0,c.Z)(ea,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Qs)}]]);var na={d:"M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zM12 4c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1s-1 .45-1 1v2c0 .55.45 1 1 1zM12 20c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1zM4.93 6.35c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41L4.93 3.51a.996.996 0 10-1.41 1.41l1.41 1.43zM19.07 17.65a.996.996 0 10-1.41 1.41l1.42 1.42c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41l-1.43-1.42zM4 12c0-.55-.45-1-1-1H1c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1zM23 11h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1s-.45-1-1-1zM4.93 17.65l-1.42 1.42a.996.996 0 00.71 1.7c.26 0 .51-.1.71-.29l1.42-1.42c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0zM18.36 6.64c.26 0 .51-.1.71-.29l1.42-1.42a.996.996 0 10-1.41-1.41l-1.42 1.42a.996.996 0 00.7 1.7z"};const ra=(0,$e.aZ)({name:"DocIconSun"}),oa=(0,c.Z)(ra,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",na)}]]);var ia={d:"M13.41 12l5.29-5.29a.996.996 0 10-1.41-1.41L12 10.59l-5.29-5.3A.996.996 0 105.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l5.29-5.3 5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29a.996.996 0 000-1.41l-5.3-5.3z"};const sa=(0,$e.aZ)({name:"DocIconX"}),aa=(0,c.Z)(sa,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ia)}]])},6850:(e,t,n)=>{"use strict";n.d(t,{w:()=>o});var r=n(7023);function o(e){(0,r.zX)(document.body,"click",(function(t){e(t)}))}},7023:(e,t,n)=>{"use strict";n.d(t,{zX:()=>o,Up:()=>i,BK:()=>s});var r=n(4359);function o(e,t,n){var o=function(){return e.removeEventListener(t,n)};return(0,r.bv)((function(){e&&e.addEventListener(t,n)})),(0,r.Jd)(o),o}function i(e,t,n,r,i){return o(e,t,s(n,r,i))}function s(e,t,n){var r,o=0,i=-1;return function(){++o%t==0?e():(i=o,r||(r=setTimeout((function(){var t=i>=o;o=0,i=-1,r=void 0,t&&e()}),n,null)))}}},2376:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var r=n(4359);function o(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,r.iH)(null);return{result:t,loading:n,error:o,execute:function(r,i){return s=this,a=void 0,c=function(){var s,a,l,c;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(u){switch(u.label){case 0:return u.trys.push([0,6,7,8]),n.value=!0,[4,fetch(r,i)];case 1:if(!(s=u.sent()).ok)throw new Error(s.statusText);return e?[4,e(s)]:[3,3];case 2:return l=u.sent(),[3,5];case 3:return[4,s.json()];case 4:l=u.sent(),u.label=5;case 5:return a=l,t.value=a,[3,8];case 6:return c=u.sent(),o.value=c,[3,8];case 7:return n.value=!1,[7];case 8:return[2]}}))},new((l=void 0)||(l=Promise))((function(e,t){function n(e){try{o(c.next(e))}catch(e){t(e)}}function r(e){try{o(c.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof l?o:new l((function(e){e(o)}))).then(n,r)}o((c=c.apply(s,a||[])).next())}));var s,a,l,c}}}},5701:(e,t,n)=>{"use strict";n.d(t,{Ke:()=>i,Mu:()=>s,ft:()=>a});var r=n(7648),o=n(4359),i=(0,r.MT)("retype","store"),s=Symbol("DocsIdbStore");function a(){return{idbStore:(0,o.f3)(s)}}},8816:(e,t,n)=>{"use strict";n.d(t,{xf:()=>k,v2:()=>T,Rx:()=>O});var r=n(4359),o=n(7648),i=n(1296),s=n.n(i),a=n(6184),l=n(9984),c=n.n(l);const u=()=>window.__DOCS_LUNR__;var d=n.n(u),f=n(5701),h=n(6850),p=n(5184),m=n(2626),v=n(5543),g=n(2376),b=n(2110),y=n(7755),w=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},x=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},k=Symbol("DocsSearch"),S=(0,f.ft)().idbStore,E=!1;function C(e,t){var n;return w(this,void 0,void 0,(function(){var r,o,i;return x(this,(function(s){switch(s.label){case 0:return r={map:null,index:null},e.length&&t?(r.map=function(e,t){var n=0,r=0,o=new Map,i=c().appendDocumentName?c().documentName:"";return function e(t,s,a){t.forEach((function(t){var l=a?a+" > "+t.label:t.label;t.clickable&&(s[r].forEach((function(e){var r,s,a,u=e.i||(null===(r=e.l)||void 0===r?void 0:r.toLowerCase().replace(/[\s\-.]+/g,"-"));if(u&&(e.l||(null===(s=e.p)||void 0===s?void 0:s.length))){var d=u&&"#"!==u?"#"+u:"",f="/"===t.path?"".concat(i).concat(d):!c().trailingSlash&&i&&t.path?"".concat(t.path,"/").concat(i).concat(d):"".concat(t.path).concat(i).concat(d);e.l&&o.set((++n).toString(),{path:f,text:e.l,page:l}),(null===(a=e.p)||void 0===a?void 0:a.length)&&e.p.forEach((function(t){o.set((++n).toString(),{path:f,text:t,heading:e.l,page:l})}))}})),r++),t.children&&e(t.children,s,l)}))}(e,t,""),o}(e,t),null==r.map?[3,2]:[4,(0,y.T)("lunr-js",d())]):[2,r];case 1:(o=s.sent())&&(i=[],null===(n=r.map)||void 0===n||n.forEach((function(e,t){return i.push([t,e])})),r.index=o.createIndex(i)),s.label=2;case 2:return[2,r]}}))}))}function _(){return"/"===c().base?"search":c().base+"search"}function T(){return w(this,void 0,void 0,(function(){var e;return x(this,(function(t){switch(t.label){case 0:return e=_(),[4,(0,o.IV)(e,S)];case 1:return t.sent(),E=!0,[2]}}))}))}function O(e){var t=this,n=(0,m.oR)().store,i=(0,r.iH)(null),l=(0,r.iH)(null),u=(0,r.Fl)((function(){return n.state.searchQuery})),f=(0,r.iH)([]),k=(0,r.iH)(!1),T=(0,r.iH)(!1),O=(0,r.iH)(0),L=(0,r.Fl)((function(){var t;return null===(t=e.value)||void 0===t?void 0:t.querySelector("input")}));function R(e){var t,n,r,o,s;return w(this,void 0,void 0,(function(){var a,u,h,p,m,v,g,b;return x(this,(function(w){switch(w.label){case 0:return l.value&&i.value?e?e.length>=c().search.minChars?(a=[],[4,(0,y.T)("lunr-js",d())]):[3,2]:(f.value=[],[2]):[2];case 1:for((u=w.sent())&&(h=e.toLowerCase().trim(),a=u.query(l.value,h)),p=[],m=0;m<c().search.maxResults&&a[m];m++)(v=i.value.get(a[m].ref))&&(g=D(null===(t=a[m].matchData)||void 0===t?void 0:t.metadata),b=A(null!==(n=v.text)&&void 0!==n?n:"",g),p.push({id:a[m].ref,path:null!==(r=v.path)&&void 0!==r?r:"",heading:null!==(o=v.heading)&&void 0!==o?o:"",page:null!==(s=v.page)&&void 0!==s?s:"",text:b}));f.value=p,w.label=2;case 2:return[2]}}))}))}function D(e){var t,n,r,o=[],i=e;if(i)for(var s in i){var a=null===(n=null===(t=i[s])||void 0===t?void 0:t.text)||void 0===n?void 0:n.position;if(null==a?void 0:a.length)for(var l=0;l<a.length;++l)2===(null===(r=a[l])||void 0===r?void 0:r.length)&&a[l][1]>0&&o.push([a[l][0],a[l][0]+a[l][1]])}return o}function A(e,t,n){if(void 0===n&&(n=24),!t.length){var r=e.trim().split(/\s+/).filter((function(e){return e}));return r.length>n&&(r=r.slice(0,n)).push("..."),r.join(" ")}t.sort((function(e,t){return e[0]-t[0]}));for(var o=t.length-2;o>=0;--o)t[o][1]>=t[o+1][0]&&(t[o][1]=Math.max(t[o][1],t[o+1][1]),t.splice(o+1,1));var i=[],s=0,a=-1,l=-1;for(o=0;o<t.length;++o){var c=t[o][0],u=t[o][1],d=e.slice(s,c);if(d){var f=d.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,f)}-1===a?(a=i.length,l=i.length):l=i.length,i.push(['<span class="text-blue-500 dark:text-blue-400 font-semibold">'.concat(e.slice(c,u),"</span>"),!0]),s=u}if(s<e.length){var h=e.slice(s);if(h){var p=h.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,p)}}for(var m=0,v=1+l-a,g=i.length-1;v<n;){if(a>0&&(m%2==0||l>=g))--a;else{if(!(l<g))break;++l}++m,++v}v>n&&(l-=v-n);var b=i.slice(a,l+1).map((function(e){return e[0]}));return a>0&&b.splice(0,0,"..."),l<i.length-1&&b.push("..."),b.join(" ")}(0,r.YP)(u,s()((function(e){return w(this,void 0,void 0,(function(){return x(this,(function(t){switch(t.label){case 0:return[4,R(e)];case 1:return t.sent(),e.length>=c().search.minChars||f.value.length>0?k.value=!0:(k.value=!1,O.value=0),[2]}}))}))}),50)),(0,h.w)((function(t){var n,r=t.target;e.value===r||(null===(n=e.value)||void 0===n?void 0:n.contains(r))||(T.value=!1)}));var I=(0,p.B)().scrollTo;function M(e){var t;if(k.value=!1,T.value=!1,O.value=0,setTimeout((function(){var e;null===(e=L.value)||void 0===e||e.blur()}),100),e){(0,a.Vn)(e);var o=null===(t=e.split("/").pop())||void 0===t?void 0:t.substring(1);if(o&&document.getElementById(o)){if(o.split("-").length>1){var i=!1;for(var s in n.state.memberGroups){if(i)break;for(var l in n.state.memberGroups[s])if(o===l){n.state.memberGroups[s][l].isOpen=!0,i=!0;break}}}(0,r.Y3)((function(){I("#".concat(o),{offset:v.vE,onDone:function(){n.actions.updateScrolledElementId(o)}})}))}}}function F(){var t,n=null===(t=e.value)||void 0===t?void 0:t.querySelector("ul"),r=null==n?void 0:n.children.item(O.value);null==r||r.scrollIntoView({block:"nearest"})}var P=c().preloadSearch?(0,g.i)((function(e){return w(t,void 0,void 0,(function(){var t,n,r;return x(this,(function(o){switch(o.label){case 0:return"file:"===location.protocol.toLowerCase()?[2,void 0]:[4,e.text()];case 1:return t=o.sent(),n=t.indexOf("="),r=t.slice(n+1).trim().slice(0,-1),[2,JSON.parse(r)]}}))}))})):(0,g.i)(),H=P.execute,N=P.error,j=P.result,W=c().preloadSearch?"js":"json",B=c().cacheBustingToken&&"none"!=c().cacheBustingStrategy?"path"==c().cacheBustingStrategy?"".concat(location.origin).concat(b.uj,".").concat(c().cacheBustingToken,".").concat(W):"".concat(location.origin).concat(b.uj,".").concat(W,"?v=").concat(c().cacheBustingToken):"".concat(location.origin).concat(b.uj,".").concat(W),z=(0,r.Fl)((function(){return n.state.sidebar})),V=_();(0,r.YP)(T,(function(e){e&&(function(){w(this,void 0,void 0,(function(){var e,t,n,r,s,a,u;return x(this,(function(f){switch(f.label){case 0:return[4,(0,o.U2)(V,S)];case 1:return(e=f.sent())&&e.id===c().id?(i.value||(i.value=e.map),l.value?[3,3]:[4,(0,y.T)("lunr-js",d())]):[3,4];case 2:(t=f.sent())&&(n=JSON.parse(e.index),l.value=t.loadIndex(n)),f.label=3;case 3:return[3,10];case 4:return[4,(0,o.IV)(V,S)];case 5:return f.sent(),r=void 0,!E&&c().preloadSearch?[3,7]:[4,H(B)];case 6:if(f.sent(),N.value)throw new Error("Error fetching search data. ".concat(N.value));r=j.value,f.label=7;case 7:return r||(r=window.__DOCS_SEARCH__),E=!1,[4,C(z.value.data,r)];case 8:return s=f.sent(),a=s.index,u=s.map,i.value=u,l.value=a,[4,(0,o.t8)(V,{index:JSON.stringify(a),map:u,id:c().id},S)];case 9:f.sent(),f.label=10;case 10:return[2]}}))}))}(),F())}));var q=(0,r.qj)({input:L,isOpen:k,isFocused:T,results:f,focusIndex:O,clear:function(){var e;n.actions.updateSearchQuery(""),null===(e=L.value)||void 0===e||e.focus()},onKeydown:function(e){if(f.value.length)switch(e.code){case"ArrowDown":e.preventDefault(),O.value<f.value.length-1&&(O.value++,F());break;case"ArrowUp":e.preventDefault(),O.value>0&&(O.value--,F());break;case"Enter":e.preventDefault(),M(f.value[O.value].path);break;case"Escape":k.value=!1,n.actions.updateSearchQuery("")}},navigateToResult:M});return q}},5184:(e,t,n)=>{"use strict";function r(){var e={duration:500,offset:0},t=null;return{scrollTo:function(n,r){var o,i=Object.assign({},e,r),s=decodeURI(n),a=null!==(o=document.getElementById(n.startsWith("#")?s.slice(1):n))&&void 0!==o?o:document.querySelector(s);if(!a)throw new Error("Invalid target");var l="function"==typeof i.offset?i.offset():i.offset,c=a.getBoundingClientRect().top,u=window.scrollY||window.pageYOffset,d=c+u-u+l;i.onStart&&"function"==typeof i.onStart&&i.onStart(),window.requestAnimationFrame((function e(n){t||(t=n);var r=n-t,o=function(e,t,n,r){return-n*(e/=r)*(e-2)+t}(r,u,d,i.duration);window.scrollTo(0,o),r<i.duration?window.requestAnimationFrame(e):(i.onDone&&"function"==typeof i.onDone&&i.onDone(),t=null)}))}}}n.d(t,{B:()=>r})},2110:(e,t,n)=>{"use strict";n.d(t,{as:()=>s,uj:()=>a,bT:()=>l,u:()=>c});var r=n(9984),o=n.n(r),i="resources",s="".concat(o().base).concat(i,"/nav"),a="".concat(o().base).concat(i,"/js/search"),l=new Uint8Array([83,72,65,45,50,53,54]),c=new Uint8Array([82,83,65,83,83,65,45,80,75,67,83,49,45,118,49,95,53])},7755:(e,t,n)=>{"use strict";function r(e,t,n){var o=t();if(o&&o.default)n(o.default);else if(e){var i=document.getElementById(e);i&&i.addEventListener("load",(function(){return r(null,t,n)}))}}function o(e,t){return new Promise((function(n,o){try{r(e,t,(function(e){n(e)}))}catch(e){o(e)}}))}n.d(t,{b:()=>r,T:()=>o})},2626:(e,t,n)=>{"use strict";n.d(t,{$Q:()=>c,h:()=>d,oR:()=>f});var r=n(9984),o=n.n(r),i=n(4359),s=n(5543),a=n(872);(0,i.aZ)({name:"DocStoreDebug",setup:function(){var e=(0,i.iH)(!1),t=(0,i.Fl)((function(){return d.state})),n=(0,i.Fl)((function(){return{"top-0 max-w-md p-5 text-sm":e.value,"px-3 flex items-center text-xs mr-0 mb-0":!e.value}}));return{state:t,isOpen:e,classes:n,toggle:function(){e.value=!e.value}}}});var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)},c=Symbol("DocsStore"),u={inherited:!0,access:o().access.map((function(e){return e.value}))},d={state:(0,i.qj)({initialPageLoad:!0,unloading:!1,inherited:u.inherited,isWindowScrolling:!1,isScrollPositionRestored:!1,memberFilter:"",scrolledElementId:"",searchQuery:"",sidebarRightHasContent:!1,sidebarScroll:0,sidebarActiveEl:void 0,sidebar:{id:"",data:[]},sidebarLookup:new Map,memberGroups:(0,a.s)(),access:u.access}),actions:{setMemberData:function(e,t,n,r){d.state.memberGroups[e][t]||(d.state.memberGroups[e][t]={isOpen:!1,isVisible:!0,animations:!0,access:"public",name:"UnknownMember"}),d.state.memberGroups[e][t][n]=r},resetMemberData:function(){Object.keys(d.state.memberGroups).forEach((function(e){d.state.memberGroups[e]={}}))},updateAccess:function(e){d.state.access=e,(0,s.Nh)(o().base,localStorage,"doc_access",e)},setInherited:function(e){d.state.inherited=e},toggleInherited:function(){d.state.inherited=!d.state.inherited,(0,s.Nh)(o().base,localStorage,"doc_inherited",d.state.inherited)},updateMemberFilter:function(e){d.state.memberFilter=e},updateScrolledElementId:function(e){d.state.scrolledElementId=e},updateSearchQuery:function(e){d.state.searchQuery=e},setSidebarData:function(e){d.state.sidebar=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",e)},setSidebarLookupData:function(e){d.state.sidebarLookup=e},setSidebarScroll:function(e){d.state.sidebarScroll=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar_scroll",e)},setActiveSidebarEl:function(e){d.state.sidebarActiveEl=e},setWindowScrollingState:function(e){d.state.isWindowScrolling=e},updateSidebarLookupItem:function(e,t,n){e[t]=n;var r=(0,s.qn)(o().base,sessionStorage,"doc_sidebar");r&&(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",l(l({},r),d.state.sidebar))}},getters:{isAccessDirty:function(){return u.access.length!==d.state.access.length},isFiltersDirty:function(){return u.access.length!==d.state.access.length||u.inherited!==d.state.inherited||""!==d.state.memberFilter},getVisibleGroupMembers:function(e){return Object.values(d.state.memberGroups[e]).filter((function(e){return!0===e.isVisible}))}}};function f(){return{store:(0,i.f3)(c)}}},872:(e,t,n)=>{"use strict";n.d(t,{s:()=>s,g:()=>a});var r=n(9984),o=n.n(r),i=n(5543);function s(){var e={};return o().toolbarLinks.forEach((function(t){e[t.id]={}})),e}function a(e){if(e.state.initialPageLoad){var t=(0,i.qn)(o().base,sessionStorage,"doc_sidebar_scroll");null!==t&&e.actions.setSidebarScroll(t);var n=(0,i.qn)(o().base,sessionStorage,"doc_sidebar");null!==n&&e.actions.setSidebarData(n);var r=(0,i.qn)(o().base,localStorage,"doc_inherited");null!==r&&e.actions.setInherited(r);var s=(0,i.qn)(o().base,localStorage,"doc_access");null!==s&&e.actions.updateAccess(s)}}},5543:(e,t,n)=>{"use strict";n.d(t,{qn:()=>o,Nh:()=>i,vE:()=>s,Sy:()=>a,am:()=>l,rw:()=>d,pI:()=>h});var r=function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};function o(e,t,n){var r=c(e,n),o=t.getItem(r);return o&&"null"!==o?"{"===o[0]||"["===o[0]||'"'===o[0]||"true"===o||"false"===o?JSON.parse(o):o:null}function i(e,t,n,r){var o=c(e,n),i="string"!=typeof r?JSON.stringify(r):r;t.setItem(o,i)}function s(){var e=document.getElementById("docs-site-header"),t=document.getElementById("docs-toolbar"),n=20;return n+=e?e.offsetHeight:0,-(n+=t?t.offsetHeight:0)}function a(e){var t,n,r={y:31536e3,mo:2592e3,d:86400,h:3600,m:60,s:1},o=Math.floor((Date.now()-e)/1e3);return Object.keys(r).some((function(e){return t=Math.floor(o/r[e]),n=e,t>=1})),0===t?"just now":"".concat(t).concat(n," ago")}function l(e,t,n,r,o){if(void 0===r&&(r=""),void 0===o&&(o=[]),!t||!t.length)return[];var i=[];return t.forEach((function(t){var s,a=u(e,t,n,r,o);(null===(s=a.parentNodes)||void 0===s?void 0:s.length)&&a.parentNodes.splice(-1,1),i.push(a)})),i}function c(e,t){return e&&"/"!==e?e+t:t}function u(e,t,n,o,i){void 0===o&&(o=""),void 0===i&&(i=[]);var s={};s.path=n?t.n.startsWith("/")?"".concat(t.n.slice(1),"/"):"".concat(o).concat(t.n,"/"):t.n.startsWith("/")?"".concat(t.n.slice(1)):!o||o.endsWith("/")?"".concat(o).concat(t.n):"".concat(o,"/").concat(t.n),s.parentNodes=i.length?r(r([],i,!0),[s.path],!1):[s.path];var a=t.i||t.h;return a&&e.set(s.path,s),s.clickable=!1!==t.c,s.visible=!1!==t.v,t.s&&(s.icon=t.s),t.e&&(s.emoji=t.e),t.h&&(s.hash=t.h),s.label=t.l||t.n,t.u&&(s.url=t.u),s.searchLabel=s.label.toLowerCase(),t.o&&(s.open=t.o),a&&(s.children=l(e,t.i,n,s.path,s.parentNodes)),s}function d(e,t,n,r){void 0===r&&(r=""),t&&t.length&&t.forEach((function(t){var o=n?"".concat(r).concat(t.n,"/"):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n);if(e.get(o))d(e,t.i,n,o);else{var i=e.get(r);if(!i)throw new Error("Unexpected state. The parent node must exist at this point.");var s=u(e,t,n,r);if(i.children){var a=function(e,t){var n=0,r=e.length-1;if(r<n)return 0;for(;;){var o=Math.floor((n+r)/2),i=f(e[o].label,t.label);if(i<0){if((n=o+1)>r)return n}else{if(!(i>0))return o;if((r=o-1)<n)return o}}}(i.children,s);i.children.splice(a,0,s)}}}))}function f(e,t){if(null==t)return 1;if(null==e)return-1;var n=e.toUpperCase(),r=t.toUpperCase();return n>r?1:n<r?-1:0}function h(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}},3744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},4359:(e,t,n)=>{"use strict";n.d(t,{HY:()=>o.HY,lR:()=>o.lR,uT:()=>I,Fl:()=>o.Fl,ri:()=>Oe,j4:()=>o.j4,kq:()=>o.kq,iD:()=>o.iD,_:()=>o._,Uk:()=>o.Uk,Wm:()=>o.Wm,aZ:()=>o.aZ,h:()=>o.h,f3:()=>o.f3,Y3:()=>o.Y3,C_:()=>o.C_,j5:()=>o.j5,Jd:()=>o.Jd,bv:()=>o.bv,wg:()=>o.wg,Cn:()=>o.Cn,JJ:()=>o.JJ,dD:()=>o.dD,qj:()=>o.qj,iH:()=>o.iH,Ko:()=>o.Ko,WI:()=>o.WI,up:()=>o.up,LL:()=>o.LL,qZ:()=>o.qZ,zw:()=>o.zw,e8:()=>ie,nr:()=>oe,F8:()=>ye,YP:()=>o.YP,m0:()=>o.m0,w5:()=>o.w5,wy:()=>o.wy,D2:()=>be,iM:()=>ve});var r={};n.r(r),n.d(r,{BaseTransition:()=>o.P$,Comment:()=>o.sv,EffectScope:()=>o.Bj,Fragment:()=>o.HY,KeepAlive:()=>o.Ob,ReactiveEffect:()=>o.qq,Static:()=>o.qG,Suspense:()=>o.n4,Teleport:()=>o.lR,Text:()=>o.xv,Transition:()=>I,TransitionGroup:()=>K,VueElement:()=>_,callWithAsyncErrorHandling:()=>o.$d,callWithErrorHandling:()=>o.KU,camelize:()=>o._A,capitalize:()=>o.kC,cloneVNode:()=>o.Ho,compatUtils:()=>o.ry,computed:()=>o.Fl,createApp:()=>Oe,createBlock:()=>o.j4,createCommentVNode:()=>o.kq,createElementBlock:()=>o.iD,createElementVNode:()=>o._,createHydrationRenderer:()=>o.Eo,createPropsRestProxy:()=>o.p1,createRenderer:()=>o.Us,createSSRApp:()=>Le,createSlots:()=>o.Nv,createStaticVNode:()=>o.uE,createTextVNode:()=>o.Uk,createVNode:()=>o.Wm,customRef:()=>o.ZM,defineAsyncComponent:()=>o.RC,defineComponent:()=>o.aZ,defineCustomElement:()=>S,defineEmits:()=>o.Bz,defineExpose:()=>o.WY,defineProps:()=>o.MW,defineSSRCustomElement:()=>E,devtools:()=>o.mW,effect:()=>o.cE,effectScope:()=>o.B,getCurrentInstance:()=>o.FN,getCurrentScope:()=>o.nZ,getTransitionRawChildren:()=>o.Q6,guardReactiveProps:()=>o.F4,h:()=>o.h,handleError:()=>o.S3,hydrate:()=>Te,initCustomFormatter:()=>o.Mr,initDirectivesForSSR:()=>Ae,inject:()=>o.f3,isMemoSame:()=>o.nQ,isProxy:()=>o.X3,isReactive:()=>o.PG,isReadonly:()=>o.$y,isRef:()=>o.dq,isRuntimeOnly:()=>o.of,isShallow:()=>o.yT,isVNode:()=>o.lA,markRaw:()=>o.Xl,mergeDefaults:()=>o.u_,mergeProps:()=>o.dG,nextTick:()=>o.Y3,normalizeClass:()=>o.C_,normalizeProps:()=>o.vs,normalizeStyle:()=>o.j5,onActivated:()=>o.dl,onBeforeMount:()=>o.wF,onBeforeUnmount:()=>o.Jd,onBeforeUpdate:()=>o.Xn,onDeactivated:()=>o.se,onErrorCaptured:()=>o.d1,onMounted:()=>o.bv,onRenderTracked:()=>o.bT,onRenderTriggered:()=>o.Yq,onScopeDispose:()=>o.EB,onServerPrefetch:()=>o.vl,onUnmounted:()=>o.Ah,onUpdated:()=>o.ic,openBlock:()=>o.wg,popScopeId:()=>o.Cn,provide:()=>o.JJ,proxyRefs:()=>o.WL,pushScopeId:()=>o.dD,queuePostFlushCb:()=>o.qb,reactive:()=>o.qj,readonly:()=>o.OT,ref:()=>o.iH,registerRuntimeCompiler:()=>o.Y1,render:()=>_e,renderList:()=>o.Ko,renderSlot:()=>o.WI,resolveComponent:()=>o.up,resolveDirective:()=>o.Q2,resolveDynamicComponent:()=>o.LL,resolveFilter:()=>o.eq,resolveTransitionHooks:()=>o.U2,setBlockTracking:()=>o.qZ,setDevtoolsHook:()=>o.ec,setTransitionHooks:()=>o.nK,shallowReactive:()=>o.Um,shallowReadonly:()=>o.YS,shallowRef:()=>o.XI,ssrContextKey:()=>o.Uc,ssrUtils:()=>o.G,stop:()=>o.sT,toDisplayString:()=>o.zw,toHandlerKey:()=>o.hR,toHandlers:()=>o.mx,toRaw:()=>o.IU,toRef:()=>o.Vh,toRefs:()=>o.BK,transformVNodeArgs:()=>o.C3,triggerRef:()=>o.oR,unref:()=>o.SU,useAttrs:()=>o.l1,useCssModule:()=>T,useCssVars:()=>O,useSSRContext:()=>o.Zq,useSlots:()=>o.Rr,useTransitionState:()=>o.Y8,vModelCheckbox:()=>ie,vModelDynamic:()=>fe,vModelRadio:()=>ae,vModelSelect:()=>le,vModelText:()=>oe,vShow:()=>ye,version:()=>o.i8,warn:()=>o.ZK,watch:()=>o.YP,watchEffect:()=>o.m0,watchPostEffect:()=>o.Rh,watchSyncEffect:()=>o.yX,withAsyncContext:()=>o.mv,withCtx:()=>o.w5,withDefaults:()=>o.b9,withDirectives:()=>o.wy,withKeys:()=>be,withMemo:()=>o.MX,withModifiers:()=>ve,withScopeId:()=>o.HX});var o=n(6252),i=n(3577),s=n(2262);const a="undefined"!=typeof document?document:null,l=a&&a.createElement("template"),c={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?a.createElementNS("http://www.w3.org/2000/svg",e):a.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>a.createTextNode(e),createComment:e=>a.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>a.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{l.innerHTML=r?`<svg>${e}</svg>`:e;const o=l.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},u=/\s*!important$/;function d(e,t,n){if((0,i.kJ)(n))n.forEach((n=>d(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=h[t];if(n)return n;let r=(0,i._A)(t);if("filter"!==r&&r in e)return h[t]=r;r=(0,i.kC)(r);for(let n=0;n<f.length;n++){const o=f[n]+r;if(o in e)return h[t]=o}return t}(e,t);u.test(n)?e.setProperty((0,i.rs)(r),n.replace(u,""),"important"):e[r]=n}}const f=["Webkit","Moz","ms"],h={},p="http://www.w3.org/1999/xlink";let m=Date.now,v=!1;if("undefined"!=typeof window){m()>document.createEvent("Event").timeStamp&&(m=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);v=!!(e&&Number(e[1])<=53)}let g=0;const b=Promise.resolve(),y=()=>{g=0};function w(e,t,n,r){e.addEventListener(t,n,r)}const x=/(?:Once|Passive|Capture)$/,k=/^on[a-z]/;function S(e,t){const n=(0,o.aZ)(e);class r extends _{constructor(e){super(n,e,t)}}return r.def=n,r}const E=e=>S(e,Te),C="undefined"!=typeof HTMLElement?HTMLElement:class{};class _ extends C{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):this.attachShadow({mode:"open"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,(0,o.Y3)((()=>{this._connected||(_e(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=e=>{const{props:t,styles:n}=e,r=!(0,i.kJ)(t),o=t?r?Object.keys(t):t:[];let s;if(r)for(const e in this._props){const n=t[e];(n===Number||n&&n.type===Number)&&(this._props[e]=(0,i.He)(this._props[e]),(s||(s=Object.create(null)))[e]=!0)}this._numberProps=s;for(const e of Object.keys(this))"_"!==e[0]&&this._setProp(e,this[e],!0,!1);for(const e of o.map(i._A))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}});this._applyStyles(n),this._update()},t=this._def.__asyncLoader;t?t().then(e):e(this._def)}_setAttr(e){let t=this.getAttribute(e);this._numberProps&&this._numberProps[e]&&(t=(0,i.He)(t)),this._setProp((0,i._A)(e),t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute((0,i.rs)(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute((0,i.rs)(e),t+""):t||this.removeAttribute((0,i.rs)(e))))}_update(){_e(this._createVNode(),this.shadowRoot)}_createVNode(){const e=(0,o.Wm)(this._def,(0,i.l7)({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0,e.emit=(e,...t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof _){e.parent=t._instance;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function T(e="$style"){{const t=(0,o.FN)();if(!t)return i.kT;const n=t.type.__cssModules;if(!n)return i.kT;return n[e]||i.kT}}function O(e){const t=(0,o.FN)();if(!t)return;const n=()=>L(t.subTree,e(t.proxy));(0,o.Rh)(n),(0,o.bv)((()=>{const e=new MutationObserver(n);e.observe(t.subTree.el.parentNode,{childList:!0}),(0,o.Ah)((()=>e.disconnect()))}))}function L(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{L(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)R(e.el,t);else if(e.type===o.HY)e.children.forEach((e=>L(e,t)));else if(e.type===o.qG){let{el:n,anchor:r}=e;for(;n&&(R(n,t),n!==r);)n=n.nextSibling}}function R(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const D="transition",A="animation",I=(e,{slots:t})=>(0,o.h)(o.P$,N(e),t);I.displayName="Transition";const M={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},F=I.props=(0,i.l7)({},o.P$.props,M),P=(e,t=[])=>{(0,i.kJ)(e)?e.forEach((e=>e(...t))):e&&e(...t)},H=e=>!!e&&((0,i.kJ)(e)?e.some((e=>e.length>1)):e.length>1);function N(e){const t={};for(const n in e)n in M||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=s,appearActiveClass:u=a,appearToClass:d=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=function(e){if(null==e)return null;if((0,i.Kn)(e))return[j(e.enter),j(e.leave)];{const t=j(e);return[t,t]}}(o),v=m&&m[0],g=m&&m[1],{onBeforeEnter:b,onEnter:y,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:S=b,onAppear:E=y,onAppearCancelled:C=w}=t,_=(e,t,n)=>{B(e,t?d:l),B(e,t?u:a),n&&n()},T=(e,t)=>{B(e,p),B(e,h),t&&t()},O=e=>(t,n)=>{const o=e?E:y,i=()=>_(t,e,n);P(o,[t,i]),z((()=>{B(t,e?c:s),W(t,e?d:l),H(o)||q(t,r,v,i)}))};return(0,i.l7)(t,{onBeforeEnter(e){P(b,[e]),W(e,s),W(e,a)},onBeforeAppear(e){P(S,[e]),W(e,c),W(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){const n=()=>T(e,t);W(e,f),Y(),W(e,h),z((()=>{B(e,f),W(e,p),H(x)||q(e,r,g,n)})),P(x,[e,n])},onEnterCancelled(e){_(e,!1),P(w,[e])},onAppearCancelled(e){_(e,!0),P(C,[e])},onLeaveCancelled(e){T(e),P(k,[e])}})}function j(e){return(0,i.He)(e)}function W(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function B(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function z(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let V=0;function q(e,t,n,r){const o=e._endId=++V,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=$(e,t);if(!s)return r();const c=s+"end";let u=0;const d=()=>{e.removeEventListener(c,f),i()},f=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,f)}function $(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r("transitionDelay"),i=r("transitionDuration"),s=U(o,i),a=r("animationDelay"),l=r("animationDuration"),c=U(a,l);let u=null,d=0,f=0;return t===D?s>0&&(u=D,d=s,f=i.length):t===A?c>0&&(u=A,d=c,f=l.length):(d=Math.max(s,c),u=d>0?s>c?D:A:null,f=u?u===D?i.length:l.length:0),{type:u,timeout:d,propCount:f,hasTransform:u===D&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function U(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>Z(t)+Z(e[n]))))}function Z(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Y(){return document.body.offsetHeight}const G=new WeakMap,J=new WeakMap,K={name:"TransitionGroup",props:(0,i.l7)({},F,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,o.FN)(),r=(0,o.Y8)();let i,a;return(0,o.ic)((()=>{if(!i.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=$(r);return o.removeChild(r),i}(i[0].el,n.vnode.el,t))return;i.forEach(X),i.forEach(Q);const r=i.filter(ee);Y(),r.forEach((e=>{const n=e.el,r=n.style;W(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,B(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const l=(0,s.IU)(e),c=N(l);let u=l.tag||o.HY;i=a,a=t.default?(0,o.Q6)(t.default()):[];for(let e=0;e<a.length;e++){const t=a[e];null!=t.key&&(0,o.nK)(t,(0,o.U2)(t,c,r,n))}if(i)for(let e=0;e<i.length;e++){const t=i[e];(0,o.nK)(t,(0,o.U2)(t,c,r,n)),G.set(t,t.el.getBoundingClientRect())}return(0,o.Wm)(u,null,a)}}};function X(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function Q(e){J.set(e,e.el.getBoundingClientRect())}function ee(e){const t=G.get(e),n=J.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const te=e=>{const t=e.props["onUpdate:modelValue"];return(0,i.kJ)(t)?e=>(0,i.ir)(t,e):t};function ne(e){e.target.composing=!0}function re(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent("input",!0,!0),e.dispatchEvent(n)}(t))}const oe={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=te(o);const s=r||o.props&&"number"===o.props.type;w(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n?r=r.trim():s&&(r=(0,i.He)(r)),e._assign(r)})),n&&w(e,"change",(()=>{e.value=e.value.trim()})),t||(w(e,"compositionstart",ne),w(e,"compositionend",re),w(e,"change",re))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},s){if(e._assign=te(s),e.composing)return;if(document.activeElement===e){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&(0,i.He)(e.value)===t)return}const a=null==t?"":t;e.value!==a&&(e.value=a)}},ie={deep:!0,created(e,t,n){e._assign=te(n),w(e,"change",(()=>{const t=e._modelValue,n=ue(e),r=e.checked,o=e._assign;if((0,i.kJ)(t)){const e=(0,i.hq)(t,n),s=-1!==e;if(r&&!s)o(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),o(n)}}else if((0,i.DM)(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(de(e,r))}))},mounted:se,beforeUpdate(e,t,n){e._assign=te(n),se(e,t,n)}};function se(e,{value:t,oldValue:n},r){e._modelValue=t,(0,i.kJ)(t)?e.checked=(0,i.hq)(t,r.props.value)>-1:(0,i.DM)(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=(0,i.WV)(t,de(e,!0)))}const ae={created(e,{value:t},n){e.checked=(0,i.WV)(t,n.props.value),e._assign=te(n),w(e,"change",(()=>{e._assign(ue(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=te(r),t!==n&&(e.checked=(0,i.WV)(t,r.props.value))}},le={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=(0,i.DM)(t);w(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,i.He)(ue(e)):ue(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=te(r)},mounted(e,{value:t}){ce(e,t)},beforeUpdate(e,t,n){e._assign=te(n)},updated(e,{value:t}){ce(e,t)}};function ce(e,t){const n=e.multiple;if(!n||(0,i.kJ)(t)||(0,i.DM)(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],s=ue(o);if(n)(0,i.kJ)(t)?o.selected=(0,i.hq)(t,s)>-1:o.selected=t.has(s);else if((0,i.WV)(ue(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ue(e){return"_value"in e?e._value:e.value}function de(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fe={created(e,t,n){he(e,t,n,null,"created")},mounted(e,t,n){he(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){he(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){he(e,t,n,r,"updated")}};function he(e,t,n,r,o){let i;switch(e.tagName){case"SELECT":i=le;break;case"TEXTAREA":i=oe;break;default:switch(n.props&&n.props.type){case"checkbox":i=ie;break;case"radio":i=ae;break;default:i=oe}}const s=i[o];s&&s(e,t,n,r)}const pe=["ctrl","shift","alt","meta"],me={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>pe.some((n=>e[`${n}Key`]&&!t.includes(n)))},ve=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=me[t[e]];if(r&&r(n,t))return}return e(n,...r)},ge={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},be=(e,t)=>n=>{if(!("key"in n))return;const r=(0,i.rs)(n.key);return t.some((e=>e===r||ge[e]===r))?e(n):void 0},ye={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):we(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),we(e,!0),r.enter(e)):r.leave(e,(()=>{we(e,!1)})):we(e,t))},beforeUnmount(e,{value:t}){we(e,t)}};function we(e,t){e.style.display=t?e._vod:"none"}const xe=(0,i.l7)({patchProp:(e,t,n,r,s=!1,a,l,c,u)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,s):"style"===t?function(e,t,n){const r=e.style,o=(0,i.HD)(n);if(n&&!o){for(const e in n)d(r,e,n[e]);if(t&&!(0,i.HD)(t))for(const e in t)null==n[e]&&d(r,e,"")}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):(0,i.F7)(t)?(0,i.tR)(t)||function(e,t,n,r,s=null){const a=e._vei||(e._vei={}),l=a[t];if(r&&l)l.value=r;else{const[n,c]=function(e){let t;if(x.test(e)){let n;for(t={};n=e.match(x);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[(0,i.rs)(e.slice(2)),t]}(t);if(r){const l=a[t]=function(e,t){const n=e=>{const r=e.timeStamp||m();(v||r>=n.attached-1)&&(0,o.$d)(function(e,t){if((0,i.kJ)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=g||(b.then(y),g=m()),n}(r,s);w(e,n,l,c)}else l&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,l,c),a[t]=void 0)}}(e,t,0,r,l):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&k.test(t)&&(0,i.mf)(n)):"spellcheck"!==t&&"draggable"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!k.test(t)||!(0,i.HD)(n))&&t in e))))}(e,t,r,s))?function(e,t,n,r,o,s,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,o,s),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}if(""===n||null==n){const r=typeof e[t];if("boolean"===r)return void(e[t]=(0,i.yA)(n));if(null==n&&"string"===r)return e[t]="",void e.removeAttribute(t);if("number"===r){try{e[t]=0}catch(e){}return void e.removeAttribute(t)}}try{e[t]=n}catch(e){}}(e,t,r,a,l,c,u):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(p,t.slice(6,t.length)):e.setAttributeNS(p,t,n);else{const r=(0,i.Pq)(t);null==n||r&&!(0,i.yA)(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},c);let ke,Se=!1;function Ee(){return ke||(ke=(0,o.Us)(xe))}function Ce(){return ke=Se?ke:(0,o.Eo)(xe),Se=!0,ke}const _e=(...e)=>{Ee().render(...e)},Te=(...e)=>{Ce().hydrate(...e)},Oe=(...e)=>{const t=Ee().createApp(...e),{mount:n}=t;return t.mount=e=>{const r=Re(e);if(!r)return;const o=t._component;(0,i.mf)(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},Le=(...e)=>{const t=Ce().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Re(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Re(e){return(0,i.HD)(e)?document.querySelector(e):e}let De=!1;const Ae=()=>{De||(De=!0,oe.getSSRProps=({value:e})=>({value:e}),ae.getSSRProps=({value:e},t)=>{if(t.props&&(0,i.WV)(t.props.value,e))return{checked:!0}},ie.getSSRProps=({value:e},t)=>{if((0,i.kJ)(e)){if(t.props&&(0,i.hq)(e,t.props.value)>-1)return{checked:!0}}else if((0,i.DM)(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},ye.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Ie(e){throw e}function Me(e){}function Fe(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const Pe=Symbol(""),He=Symbol(""),Ne=Symbol(""),je=Symbol(""),We=Symbol(""),Be=Symbol(""),ze=Symbol(""),Ve=Symbol(""),qe=Symbol(""),$e=Symbol(""),Ue=Symbol(""),Ze=Symbol(""),Ye=Symbol(""),Ge=Symbol(""),Je=Symbol(""),Ke=Symbol(""),Xe=Symbol(""),Qe=Symbol(""),et=Symbol(""),tt=Symbol(""),nt=Symbol(""),rt=Symbol(""),ot=Symbol(""),it=Symbol(""),st=Symbol(""),at=Symbol(""),lt=Symbol(""),ct=Symbol(""),ut=Symbol(""),dt=Symbol(""),ft=Symbol(""),ht=Symbol(""),pt=Symbol(""),mt=Symbol(""),vt=Symbol(""),gt=Symbol(""),bt=Symbol(""),yt=Symbol(""),wt=Symbol(""),xt={[Pe]:"Fragment",[He]:"Teleport",[Ne]:"Suspense",[je]:"KeepAlive",[We]:"BaseTransition",[Be]:"openBlock",[ze]:"createBlock",[Ve]:"createElementBlock",[qe]:"createVNode",[$e]:"createElementVNode",[Ue]:"createCommentVNode",[Ze]:"createTextVNode",[Ye]:"createStaticVNode",[Ge]:"resolveComponent",[Je]:"resolveDynamicComponent",[Ke]:"resolveDirective",[Xe]:"resolveFilter",[Qe]:"withDirectives",[et]:"renderList",[tt]:"renderSlot",[nt]:"createSlots",[rt]:"toDisplayString",[ot]:"mergeProps",[it]:"normalizeClass",[st]:"normalizeStyle",[at]:"normalizeProps",[lt]:"guardReactiveProps",[ct]:"toHandlers",[ut]:"camelize",[dt]:"capitalize",[ft]:"toHandlerKey",[ht]:"setBlockTracking",[pt]:"pushScopeId",[mt]:"popScopeId",[vt]:"withCtx",[gt]:"unref",[bt]:"isRef",[yt]:"withMemo",[wt]:"isMemoSame"},kt={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function St(e,t,n,r,o,i,s,a=!1,l=!1,c=!1,u=kt){return e&&(a?(e.helper(Be),e.helper(Xt(e.inSSR,c))):e.helper(Kt(e.inSSR,c)),s&&e.helper(Qe)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Et(e,t=kt){return{type:17,loc:t,elements:e}}function Ct(e,t=kt){return{type:15,loc:t,properties:e}}function _t(e,t){return{type:16,loc:kt,key:(0,i.HD)(e)?Tt(e,!0):e,value:t}}function Tt(e,t=!1,n=kt,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ot(e,t=kt){return{type:8,loc:t,children:e}}function Lt(e,t=[],n=kt){return{type:14,loc:n,callee:e,arguments:t}}function Rt(e,t,n=!1,r=!1,o=kt){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Dt(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:kt}}const At=e=>4===e.type&&e.isStatic,It=(e,t)=>e===t||e===(0,i.rs)(t);function Mt(e){return It(e,"Teleport")?He:It(e,"Suspense")?Ne:It(e,"KeepAlive")?je:It(e,"BaseTransition")?We:void 0}const Ft=/^\d|[^\$\w]/,Pt=e=>!Ft.test(e),Ht=/[A-Za-z_$\xA0-\uFFFF]/,Nt=/[\.\?\w$\xA0-\uFFFF]/,jt=/\s+[.[]\s*|\s*[.[]\s+/g,Wt=e=>{e=e.trim().replace(jt,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const a=e.charAt(s);switch(t){case 0:if("["===a)n.push(t),t=1,r++;else if("("===a)n.push(t),t=2,o++;else if(!(0===s?Ht:Nt).test(a))return!1;break;case 1:"'"===a||'"'===a||"`"===a?(n.push(t),t=3,i=a):"["===a?r++:"]"===a&&(--r||(t=n.pop()));break;case 2:if("'"===a||'"'===a||"`"===a)n.push(t),t=3,i=a;else if("("===a)o++;else if(")"===a){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:a===i&&(t=n.pop(),i=null)}}return!r&&!o};function Bt(e,t,n){const r={source:e.source.slice(t,t+n),start:zt(e.start,e.source,t),end:e.end};return null!=n&&(r.end=zt(e.start,e.source,t+n)),r}function zt(e,t,n=t.length){return Vt((0,i.l7)({},e),t,n)}function Vt(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function qt(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&((0,i.HD)(t)?o.name===t:t.test(o.name)))return o}}function $t(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Ut(i.arg,t))return i}}function Ut(e,t){return!(!e||!At(e)||e.content!==t)}function Zt(e){return 5===e.type||2===e.type}function Yt(e){return 7===e.type&&"slot"===e.name}function Gt(e){return 1===e.type&&3===e.tagType}function Jt(e){return 1===e.type&&2===e.tagType}function Kt(e,t){return e||t?qe:$e}function Xt(e,t){return e||t?ze:Ve}const Qt=new Set([at,lt]);function en(e,t=[]){if(e&&!(0,i.HD)(e)&&14===e.type){const n=e.callee;if(!(0,i.HD)(n)&&Qt.has(n))return en(e.arguments[0],t.concat(e))}return[e,t]}function tn(e,t,n){let r,o,s=13===e.type?e.props:e.arguments[2],a=[];if(s&&!(0,i.HD)(s)&&14===s.type){const e=en(s);s=e[0],a=e[1],o=a[a.length-1]}if(null==s||(0,i.HD)(s))r=Ct([t]);else if(14===s.type){const e=s.arguments[0];(0,i.HD)(e)||15!==e.type?s.callee===ct?r=Lt(n.helper(ot),[Ct([t]),s]):s.arguments.unshift(Ct([t])):e.properties.unshift(t),!r&&(r=s)}else if(15===s.type){let e=!1;if(4===t.key.type){const n=t.key.content;e=s.properties.some((e=>4===e.key.type&&e.key.content===n))}e||s.properties.unshift(t),r=s}else r=Lt(n.helper(ot),[Ct([t]),s]),o&&o.callee===lt&&(o=a[a.length-2]);13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function nn(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function rn(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Kt(r,e.isComponent)),t(Be),t(Xt(r,e.isComponent)))}function on(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function sn(e,t){const n=on("MODE",t),r=on(e,t);return 3===n?!0===r:!1!==r}function an(e,t,n,...r){return sn(e,t)}const ln=/&(gt|lt|amp|apos|quot);/g,cn={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},un={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:i.NO,isPreTag:i.NO,isCustomElement:i.NO,decodeEntities:e=>e.replace(ln,((e,t)=>cn[t])),onError:Ie,onWarn:Me,comments:!1};function dn(e,t,n){const r=_n(n),o=r?r.ns:0,s=[];for(;!An(e,t,n);){const a=e.source;let l;if(0===t||1===t)if(!e.inVPre&&Tn(a,e.options.delimiters[0]))l=xn(e,t);else if(0===t&&"<"===a[0])if(1===a.length)Dn(e,5,1);else if("!"===a[1])Tn(a,"\x3c!--")?l=pn(e):Tn(a,"<!DOCTYPE")?l=mn(e):Tn(a,"<![CDATA[")?0!==o?l=hn(e,n):(Dn(e,1),l=mn(e)):(Dn(e,11),l=mn(e));else if("/"===a[1])if(2===a.length)Dn(e,5,2);else{if(">"===a[2]){Dn(e,14,2),On(e,3);continue}if(/[a-z]/i.test(a[2])){Dn(e,23),bn(e,1,r);continue}Dn(e,12,2),l=mn(e)}else/[a-z]/i.test(a[1])?(l=vn(e,n),sn("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&gn(e.name)))&&(l=l.children)):"?"===a[1]?(Dn(e,21,1),l=mn(e)):Dn(e,12,1);if(l||(l=kn(e,t)),(0,i.kJ)(l))for(let e=0;e<l.length;e++)fn(s,l[e]);else fn(s,l)}let a=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<s.length;n++){const r=s[n];if(e.inPre||2!==r.type)3!==r.type||e.options.comments||(a=!0,s[n]=null);else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=s[n-1],o=s[n+1];!e||!o||t&&(3===e.type||3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(a=!0,s[n]=null):r.content=" "}}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=s[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return a?s.filter(Boolean):s}function fn(e,t){if(2===t.type){const n=_n(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function hn(e,t){On(e,9);const n=dn(e,3,t);return 0===e.source.length?Dn(e,6):On(e,3),n}function pn(e){const t=En(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Dn(e,0),r[1]&&Dn(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)On(e,i-o+1),i+4<t.length&&Dn(e,16),o=i+1;On(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),On(e,e.source.length),Dn(e,7);return{type:3,content:n,loc:Cn(e,t)}}function mn(e){const t=En(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),On(e,e.source.length)):(r=e.source.slice(n,o),On(e,o+1)),{type:3,content:r,loc:Cn(e,t)}}function vn(e,t){const n=e.inPre,r=e.inVPre,o=_n(t),i=bn(e,0,o),s=e.inPre&&!n,a=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),a&&(e.inVPre=!1),i;t.push(i);const l=e.options.getTextMode(i,o),c=dn(e,l,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&an("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Cn(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,In(e.source,i.tag))bn(e,1,o);else if(Dn(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Tn(t.loc.source,"\x3c!--")&&Dn(e,8)}return i.loc=Cn(e,i.loc.start),s&&(e.inPre=!1),a&&(e.inVPre=!1),i}const gn=(0,i.fY)("if,else,else-if,for,slot");function bn(e,t,n){const r=En(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=o[1],a=e.options.getNamespace(s,n);On(e,o[0].length),Ln(e);const l=En(e),c=e.source;e.options.isPreTag(s)&&(e.inPre=!0);let u=yn(e,t);0===t&&!e.inVPre&&u.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,(0,i.l7)(e,l),e.source=c,u=yn(e,t).filter((e=>"v-pre"!==e.name)));let d=!1;if(0===e.source.length?Dn(e,9):(d=Tn(e.source,"/>"),1===t&&d&&Dn(e,4),On(e,d?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===s?f=2:"template"===s?u.some((e=>7===e.type&&gn(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Mt(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Ut(r.arg,"is")&&an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(s,u,e)&&(f=1)),{type:1,ns:a,tag:s,tagType:f,props:u,isSelfClosing:d,children:[],loc:Cn(e,r),codegenNode:void 0}}function yn(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Tn(e.source,">")&&!Tn(e.source,"/>");){if(Tn(e.source,"/")){Dn(e,22),On(e,1),Ln(e);continue}1===t&&Dn(e,3);const o=wn(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Dn(e,15),Ln(e)}return n}function wn(e,t){const n=En(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Dn(e,2),t.add(r),"="===r[0]&&Dn(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Dn(e,17,n.index)}let o;On(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Ln(e),On(e,1),Ln(e),o=function(e){const t=En(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){On(e,1);const t=e.source.indexOf(r);-1===t?n=Sn(e,e.source.length,4):(n=Sn(e,t,4),On(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Dn(e,18,o.index);n=Sn(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Cn(e,t)}}(e),o||Dn(e,13));const i=Cn(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let s,a=Tn(r,"."),l=t[1]||(a||Tn(r,":")?"bind":Tn(r,"@")?"on":"slot");if(t[2]){const o="slot"===l,i=r.lastIndexOf(t[2]),a=Cn(e,Rn(e,n,i),Rn(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Dn(e,27),c=c.slice(1))):o&&(c+=t[3]||""),s={type:4,content:c,isStatic:u,constType:u?3:0,loc:a}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=zt(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===l&&s&&c.includes("sync")&&an("COMPILER_V_BIND_SYNC",e,0,s.loc.source)&&(l="model",c.splice(c.indexOf("sync"),1)),{type:7,name:l,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:s,modifiers:c,loc:i}}return!e.inVPre&&Tn(r,"v-")&&Dn(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function xn(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Dn(e,25);const i=En(e);On(e,n.length);const s=En(e),a=En(e),l=o-n.length,c=e.source.slice(0,l),u=Sn(e,l,t),d=u.trim(),f=u.indexOf(d);return f>0&&Vt(s,c,f),Vt(a,c,l-(u.length-d.length-f)),On(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:d,loc:Cn(e,s,a)},loc:Cn(e,i)}}function kn(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=En(e);return{type:2,content:Sn(e,r,t),loc:Cn(e,o)}}function Sn(e,t,n){const r=e.source.slice(0,t);return On(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function En(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Cn(e,t,n){return{start:t,end:n=n||En(e),source:e.originalSource.slice(t.offset,n.offset)}}function _n(e){return e[e.length-1]}function Tn(e,t){return e.startsWith(t)}function On(e,t){const{source:n}=e;Vt(e,n,t),e.source=n.slice(t)}function Ln(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&On(e,t[0].length)}function Rn(e,t,n){return zt(t,e.originalSource.slice(t.offset,n),n)}function Dn(e,t,n,r=En(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Fe(t,{start:r,end:r,source:""}))}function An(e,t,n){const r=e.source;switch(t){case 0:if(Tn(r,"</"))for(let e=n.length-1;e>=0;--e)if(In(r,n[e].tag))return!0;break;case 1:case 2:{const e=_n(n);if(e&&In(r,e.tag))return!0;break}case 3:if(Tn(r,"]]>"))return!0}return!r}function In(e,t){return Tn(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Mn(e,t){Pn(e,t,Fn(e,e.children[0]))}function Fn(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Jt(t)}function Pn(e,t,n=!1){const{children:r}=e,o=r.length;let s=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Hn(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),s++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=zn(e);if((!n||512===n||1===n)&&Wn(o,t)>=2){const n=Bn(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}else 12===o.type&&Hn(o.content,t)>=2&&(o.codegenNode=t.hoist(o.codegenNode),s++);if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Pn(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Pn(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Pn(o.branches[e],t,1===o.branches[e].children.length)}s&&t.transformHoist&&t.transformHoist(r,t,e),s&&s===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&(0,i.kJ)(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(Et(e.codegenNode.children)))}function Hn(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(zn(o))return n.set(e,0),0;{let r=3;const i=Wn(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Hn(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Hn(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}return o.isBlock&&(t.removeHelper(Be),t.removeHelper(Xt(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(Kt(t.inSSR,o.isComponent))),n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Hn(e.content,t);case 4:return e.constType;case 8:let s=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if((0,i.HD)(r)||(0,i.yk)(r))continue;const o=Hn(r,t);if(0===o)return 0;o<s&&(s=o)}return s}}const Nn=new Set([it,st,at,lt]);function jn(e,t){if(14===e.type&&!(0,i.HD)(e.callee)&&Nn.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Hn(n,t);if(14===n.type)return jn(n,t)}return 0}function Wn(e,t){let n=3;const r=Bn(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Hn(o,t);if(0===s)return s;let a;if(s<n&&(n=s),a=4===i.type?Hn(i,t):14===i.type?jn(i,t):0,0===a)return a;a<n&&(n=a)}}return n}function Bn(e){const t=e.codegenNode;if(13===t.type)return t.props}function zn(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Vn(e,t){const n=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:s=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=i.dG,isCustomElement:u=i.dG,expressionPlugins:d=[],scopeId:f=null,slotted:h=!0,ssr:p=!1,inSSR:m=!1,ssrCssVars:v="",bindingMetadata:g=i.kT,inline:b=!1,isTS:y=!1,onError:w=Ie,onWarn:x=Me,compatConfig:k}){const S=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),E={selfName:S&&(0,i.kC)((0,i._A)(S[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:s,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:f,slotted:h,ssr:p,inSSR:m,ssrCssVars:v,bindingMetadata:g,inline:b,isTS:y,onError:w,onWarn:x,compatConfig:k,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=E.helpers.get(e)||0;return E.helpers.set(e,t+1),e},removeHelper(e){const t=E.helpers.get(e);if(t){const n=t-1;n?E.helpers.set(e,n):E.helpers.delete(e)}},helperString:e=>`_${xt[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){(0,i.HD)(e)&&(e=Tt(e)),E.hoists.push(e);const t=Tt(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:kt}}(E.cached++,e,t)};return E.filters=new Set,E}(e,t);qn(e,n),t.hoistStatic&&Mn(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Fn(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&rn(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;i.m[64],e.codegenNode=St(t,n(Pe),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function qn(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const s=n[o](e,t);if(s&&((0,i.kJ)(s)?r.push(...s):r.push(s)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Ue);break;case 5:t.ssr||t.helper(rt);break;case 9:for(let n=0;n<e.branches.length;n++)qn(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];(0,i.HD)(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,qn(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function $n(e,t){const n=(0,i.HD)(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Yt))return;const i=[];for(let s=0;s<o.length;s++){const a=o[s];if(7===a.type&&n(a.name)){o.splice(s,1),s--;const n=t(e,a,r);n&&i.push(n)}}return i}}}const Un="/*#__PURE__*/";function Zn(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?Xe:"component"===t?Ge:Ke);for(let n=0;n<e.length;n++){let a=e[n];const l=a.endsWith("__self");l&&(a=a.slice(0,-6)),r(`const ${nn(a,t)} = ${s}(${JSON.stringify(a)}${l?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Yn(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),Gn(e,t,n),n&&t.deindent(),t.push("]")}function Gn(e,t,n=!1,r=!0){const{push:o,newline:s}=t;for(let a=0;a<e.length;a++){const l=e[a];(0,i.HD)(l)?o(l):(0,i.kJ)(l)?Yn(l,t):Jn(l,t),a<e.length-1&&(n?(r&&o(","),s()):r&&o(", "))}}function Jn(e,t){if((0,i.HD)(e))t.push(e);else if((0,i.yk)(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:Jn(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:Kn(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(rt)}(`),Jn(e.content,t),n(")")}(e,t);break;case 8:Xn(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(Ue)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:d,disableTracking:f,isComponent:h}=e;u&&n(r(Qe)+"("),d&&n(`(${r(Be)}(${f?"true":""}), `),o&&n(Un);n(r(d?Xt(t.inSSR,h):Kt(t.inSSR,h))+"(",e),Gn(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,a,l,c]),t),n(")"),d&&n(")"),u&&(n(", "),Jn(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,s=(0,i.HD)(e.callee)?e.callee:r(e.callee);o&&n(Un),n(s+"(",e),Gn(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];Qn(r,t),n(": "),Jn(o,t),e<s.length-1&&(n(","),i())}a&&o(),n(a?"}":" }")}(e,t);break;case 17:!function(e,t){Yn(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:s,returns:a,body:l,newline:c,isSlot:u}=e;u&&n(`_${xt[vt]}(`),n("(",e),(0,i.kJ)(s)?Gn(s,t):s&&Jn(s,t),n(") => "),(c||l)&&(n("{"),r()),a?(c&&n("return "),(0,i.kJ)(a)?Yn(a,t):Jn(a,t)):l&&Jn(l,t),(c||l)&&(o(),n("}")),u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:c}=t;if(4===n.type){const e=!Pt(n.content);e&&s("("),Kn(n,t),e&&s(")")}else s("("),Jn(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),Jn(r,t),t.indentLevel--,i&&c(),i||s(" "),s(": ");const u=19===o.type;u||t.indentLevel++,Jn(o,t),u||t.indentLevel--,i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(ht)}(-1),`),s()),n(`_cache[${e.index}] = `),Jn(e.value,t),e.isVNode&&(n(","),s(),n(`${r(ht)}(1),`),s(),n(`_cache[${e.index}]`),i()),n(")")}(e,t);break;case 21:Gn(e.body,t,!0,!1)}}function Kn(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Xn(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];(0,i.HD)(r)?t.push(r):Jn(r,t)}}function Qn(e,t){const{push:n}=t;8===e.type?(n("["),Xn(e,t),n("]")):e.isStatic?n(Pt(e.content)?e.content:JSON.stringify(e.content),e):n(`[${e.content}]`,e)}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments,typeof,void".split(",").join("\\b|\\b")+"\\b");const er=$n(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Fe(28,t.loc)),t.exp=Tt("true",!1,r)}if("if"===t.name){const o=tr(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Fe(30,e.loc)),n.removeNode();const o=tr(e,t);s.branches.push(o);const i=r&&r(s,o,!1);qn(o,n),i&&i(),n.currentNode=null}else n.onError(Fe(30,e.loc));break}n.removeNode(s)}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=nr(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=nr(t,s+e.branches.length-1,n)}}}))));function tr(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||qt(e,"for")?[e]:e.children,userKey:$t(e,"key")}}function nr(e,t,n){return e.condition?Dt(e.condition,rr(e,t,n),Lt(n.helper(Ue),['""',"true"])):rr(e,t,n)}function rr(e,t,n){const{helper:r}=n,o=_t("key",Tt(`${t}`,!1,kt,2)),{children:s}=e,a=s[0];if(1!==s.length||1!==a.type){if(1===s.length&&11===a.type){const e=a.codegenNode;return tn(e,o,n),e}{let t=64;return i.m[64],St(n,r(Pe),Ct([o]),s,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=a.codegenNode,t=14===(l=e).type&&l.callee===yt?l.arguments[1].returns:l;return 13===t.type&&rn(t,n),tn(t,o,n),e}var l}const or=$n("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Fe(31,t.loc));const o=lr(t.exp);if(!o)return void n.onError(Fe(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:c,key:u,index:d}=o,f={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:d,parseResult:o,children:Gt(e)?e.children:[e]};n.replaceNode(f),a.vFor++;const h=r&&r(f);return()=>{a.vFor--,h&&h()}}(e,t,n,(t=>{const i=Lt(r(et),[t.source]),s=Gt(e),a=qt(e,"memo"),l=$t(e,"key"),c=l&&(6===l.type?Tt(l.value.content,!0):l.exp),u=l?_t("key",c):null,d=4===t.source.type&&t.source.constType>0,f=d?64:l?128:256;return t.codegenNode=St(n,r(Pe),void 0,i,f+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let l;const{children:f}=t,h=1!==f.length||1!==f[0].type,p=Jt(e)?e:s&&1===e.children.length&&Jt(e.children[0])?e.children[0]:null;if(p?(l=p.codegenNode,s&&u&&tn(l,u,n)):h?l=St(n,r(Pe),u?Ct([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(l=f[0].codegenNode,s&&u&&tn(l,u,n),l.isBlock!==!d&&(l.isBlock?(o(Be),o(Xt(n.inSSR,l.isComponent))):o(Kt(n.inSSR,l.isComponent))),l.isBlock=!d,l.isBlock?(r(Be),r(Xt(n.inSSR,l.isComponent))):r(Kt(n.inSSR,l.isComponent))),a){const e=Rt(ur(t.parseResult,[Tt("_cached")]));e.body={type:21,body:[Ot(["const _memo = (",a.exp,")"]),Ot(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(wt)}(_cached, _memo)) return _cached`]),Ot(["const _item = ",l]),Tt("_item.memo = _memo"),Tt("return _item")],loc:kt},i.arguments.push(e,Tt("_cache"),Tt(String(n.cached++)))}else i.arguments.push(Rt(ur(t.parseResult),l,!0))}}))})),ir=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,sr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ar=/^\(|\)$/g;function lr(e,t){const n=e.loc,r=e.content,o=r.match(ir);if(!o)return;const[,i,s]=o,a={source:cr(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let l=i.trim().replace(ar,"").trim();const c=i.indexOf(l),u=l.match(sr);if(u){l=l.replace(sr,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+l.length),a.key=cr(n,e,t)),u[2]){const o=u[2].trim();o&&(a.index=cr(n,o,r.indexOf(o,a.key?t+e.length:c+l.length)))}}return l&&(a.value=cr(n,l,c)),a}function cr(e,t,n){return Tt(t,!1,Bt(e,n,t.length))}function ur({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Tt("_".repeat(t+1),!1)))}([e,t,n,...r])}const dr=Tt("undefined",!1),fr=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=qt(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},hr=(e,t,n)=>Rt(e,t,!1,!0,t.length?t[0].loc:n);function pr(e,t,n=hr){t.helper(vt);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=qt(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!At(e)&&(a=!0),i.push(_t(e||Tt("default",!0),n(t,r,o)))}let c=!1,u=!1;const d=[],f=new Set;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!Gt(o)||!(h=qt(o,"slot",!0))){3!==o.type&&d.push(o);continue}if(l){t.onError(Fe(37,h.loc));break}c=!0;const{children:p,loc:m}=o,{arg:v=Tt("default",!0),exp:g,loc:b}=h;let y;At(v)?y=v?v.content:"default":a=!0;const w=n(g,p,m);let x,k,S;if(x=qt(o,"if"))a=!0,s.push(Dt(x.exp,mr(v,w),dr));else if(k=qt(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&Gt(n)&&qt(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=k.exp?Dt(k.exp,mr(v,w),dr):mr(v,w)}else t.onError(Fe(30,k.loc))}else if(S=qt(o,"for")){a=!0;const e=S.parseResult||lr(S.exp);e?s.push(Lt(t.helper(et),[e.source,Rt(ur(e),mr(v,w),!0)])):t.onError(Fe(32,S.loc))}else{if(y){if(f.has(y)){t.onError(Fe(38,b));continue}f.add(y),"default"===y&&(u=!0)}i.push(_t(v,w))}}if(!l){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),_t("default",i)};c?d.length&&d.some((e=>gr(e)))&&(u?t.onError(Fe(39,d[0].loc)):i.push(e(void 0,d))):i.push(e(void 0,r))}const h=a?2:vr(e.children)?3:1;let p=Ct(i.concat(_t("_",Tt(h+"",!1))),o);return s.length&&(p=Lt(t.helper(nt),[p,Et(s)])),{slots:p,hasDynamicSlots:a}}function mr(e,t){return Ct([_t("name",e),_t("fn",t)])}function vr(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||vr(n.children))return!0;break;case 9:if(vr(n.branches))return!0;break;case 10:case 11:if(vr(n.children))return!0}}return!1}function gr(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():gr(e.content))}const br=new WeakMap,yr=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let s,a,l,c,u,d,f=o?function(e,t,n=!1){let{tag:r}=e;const o=Sr(r),i=$t(e,"is");if(i)if(o||sn("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Tt(i.value.content,!0):i.exp;if(e)return Lt(t.helper(Je),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&qt(e,"is");if(s&&s.exp)return Lt(t.helper(Je),[s.exp]);const a=Mt(r)||t.isBuiltInComponent(r);return a?(n||t.helper(a),a):(t.helper(Ge),t.components.add(r),nn(r,"component"))}(e,t):`"${n}"`,h=0,p=(0,i.Kn)(f)&&f.callee===Je||f===He||f===Ne||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=wr(e,t);s=n.props,h=n.patchFlag,u=n.dynamicPropNames;const r=n.directives;d=r&&r.length?Et(r.map((e=>function(e,t){const n=[],r=br.get(e);r?n.push(t.helperString(r)):(t.helper(Ke),t.directives.add(e.name),n.push(nn(e.name,"directive")));const{loc:o}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Tt("true",!1,o);n.push(Ct(e.modifiers.map((e=>_t(e,t))),o))}return Et(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(f===je&&(p=!0,h|=1024),o&&f!==He&&f!==je){const{slots:n,hasDynamicSlots:r}=pr(e,t);a=n,r&&(h|=1024)}else if(1===e.children.length&&f!==He){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Hn(n,t)&&(h|=1),a=o||2===r?n:e.children}else a=e.children;0!==h&&(l=String(h),u&&u.length&&(c=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(u))),e.codegenNode=St(t,f,s,a,l,c,d,!!p,!1,o,e.loc)};function wr(e,t,n=e.props,r=!1){const{tag:o,loc:s,children:a}=e,l=1===e.tagType;let c=[];const u=[],d=[],f=a.length>0;let h=!1,p=0,m=!1,v=!1,g=!1,b=!1,y=!1,w=!1;const x=[],k=({key:e,value:n})=>{if(At(e)){const r=e.content,o=(0,i.F7)(r);if(l||!o||"onclick"===r.toLowerCase()||"onUpdate:modelValue"===r||(0,i.Gg)(r)||(b=!0),o&&(0,i.Gg)(r)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&Hn(n,t)>0)return;"ref"===r?m=!0:"class"===r?v=!0:"style"===r?g=!0:"key"===r||x.includes(r)||x.push(r),!l||"class"!==r&&"style"!==r||x.includes(r)||x.push(r)}else y=!0};for(let a=0;a<n.length;a++){const p=n[a];if(6===p.type){const{loc:e,name:n,value:r}=p;let i=!0;if("ref"===n&&(m=!0,t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true")))),"is"===n&&(Sr(o)||r&&r.content.startsWith("vue:")||sn("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(_t(Tt(n,!0,Bt(e,0,n.length)),Tt(r?r.content:"",i,r?r.loc:e)))}else{const{name:n,arg:a,exp:m,loc:v}=p,g="bind"===n,b="on"===n;if("slot"===n){l||t.onError(Fe(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||g&&Ut(a,"is")&&(Sr(o)||sn("COMPILER_IS_ON_ELEMENT",t)))continue;if(b&&r)continue;if((g&&Ut(a,"key")||b&&f&&Ut(a,"vue:before-update"))&&(h=!0),g&&Ut(a,"ref")&&t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true"))),!a&&(g||b)){if(y=!0,m)if(c.length&&(u.push(Ct(xr(c),s)),c=[]),g){if(sn("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(m);continue}u.push(m)}else u.push({type:14,loc:v,callee:t.helper(ct),arguments:[m]});else t.onError(Fe(g?34:35,v));continue}const w=t.directiveTransforms[n];if(w){const{props:n,needRuntime:o}=w(p,e,t);!r&&n.forEach(k),c.push(...n),o&&(d.push(p),(0,i.yk)(o)&&br.set(p,o))}else(0,i.wh)(n)||(d.push(p),f&&(h=!0))}}let S;if(u.length?(c.length&&u.push(Ct(xr(c),s)),S=u.length>1?Lt(t.helper(ot),u,s):u[0]):c.length&&(S=Ct(xr(c),s)),y?p|=16:(v&&!l&&(p|=2),g&&!l&&(p|=4),x.length&&(p|=8),b&&(p|=32)),h||0!==p&&32!==p||!(m||w||d.length>0)||(p|=512),!t.inSSR&&S)switch(S.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<S.properties.length;t++){const o=S.properties[t].key;At(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=S.properties[e],i=S.properties[n];r?S=Lt(t.helper(at),[S]):(o&&!At(o.value)&&(o.value=Lt(t.helper(it),[o.value])),!i||At(i.value)||!g&&17!==i.value.type||(i.value=Lt(t.helper(st),[i.value])));break;case 14:break;default:S=Lt(t.helper(at),[Lt(t.helper(lt),[S])])}return{props:S,directives:d,patchFlag:p,dynamicPropNames:x,shouldUseBlock:h}}function xr(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const s=o.key.content,a=t.get(s);a?("style"===s||"class"===s||(0,i.F7)(s))&&kr(a,o):(t.set(s,o),n.push(o))}return n}function kr(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=Et([e.value,t.value],e.loc)}function Sr(e){return"component"===e||"Component"===e}const Er=/-(\w)/g,Cr=(e=>{const t=Object.create(null);return e=>t[e]||(t[e]=(e=>e.replace(Er,((e,t)=>t?t.toUpperCase():"")))(e))})(),_r=(e,t)=>{if(Jt(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Cr(n.name),o.push(n))):"bind"===n.name&&Ut(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&At(n.arg)&&(n.arg.content=Cr(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=wr(e,t,o);n=r,i.length&&t.onError(Fe(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=Rt([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=Lt(t.helper(tt),s,r)}},Tr=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Or=(e,t,n,r)=>{const{loc:o,modifiers:s,arg:a}=e;let l;if(e.exp||s.length||n.onError(Fe(35,o)),4===a.type)if(a.isStatic){let e=a.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),l=Tt((0,i.hR)((0,i._A)(e)),!0,a.loc)}else l=Ot([`${n.helperString(ft)}(`,a,")"]);else l=a,l.children.unshift(`${n.helperString(ft)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let u=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const e=Wt(c.content),t=!(e||Tr.test(c.content)),n=c.content.includes(";");(t||u&&e)&&(c=Ot([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let d={props:[_t(l,c||Tt("() => {}",!1,o))]};return r&&(d=r(d)),u&&(d.props[0].value=n.cache(d.props[0].value)),d.props.forEach((e=>e.key.isHandlerKey=!0)),d},Lr=(e,t,n)=>{const{exp:r,modifiers:o,loc:s}=e,a=e.arg;return 4!==a.type?(a.children.unshift("("),a.children.push(') || ""')):a.isStatic||(a.content=`${a.content} || ""`),o.includes("camel")&&(4===a.type?a.isStatic?a.content=(0,i._A)(a.content):a.content=`${n.helperString(ut)}(${a.content})`:(a.children.unshift(`${n.helperString(ut)}(`),a.children.push(")"))),n.inSSR||(o.includes("prop")&&Rr(a,"."),o.includes("attr")&&Rr(a,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Fe(34,s)),{props:[_t(a,Tt("",!0,s))]}):{props:[_t(a,r)]}},Rr=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Dr=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Zt(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Zt(i)){r=void 0;break}r||(r=n[e]={type:8,loc:t.loc,children:[t]}),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Zt(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Hn(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Lt(t.helper(Ze),o)}}}}},Ar=new WeakSet,Ir=(e,t)=>{if(1===e.type&&qt(e,"once",!0)){if(Ar.has(e)||t.inVOnce)return;return Ar.add(e),t.inVOnce=!0,t.helper(ht),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Mr=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Fe(41,e.loc)),Fr();const i=r.loc.source,s=4===r.type?r.content:i;if(n.bindingMetadata[i],!s.trim()||!Wt(s))return n.onError(Fe(42,r.loc)),Fr();const a=o||Tt("modelValue",!0),l=o?At(o)?`onUpdate:${o.content}`:Ot(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=Ot([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const u=[_t(a,e.exp),_t(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Pt(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?At(o)?`${o.content}Modifiers`:Ot([o,' + "Modifiers"']):"modelModifiers";u.push(_t(n,Tt(`{ ${t} }`,!1,e.loc,2)))}return Fr(u)};function Fr(e=[]){return{props:e}}const Pr=/[\w).+\-_$\]]/,Hr=(e,t)=>{sn("COMPILER_FILTER",t)&&(5===e.type&&Nr(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&Nr(e.exp,t)})))};function Nr(e,t){if(4===e.type)jr(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?jr(r,t):8===r.type?Nr(e,t):5===r.type&&Nr(r.content,t))}}function jr(e,t){const n=e.content;let r,o,i,s,a=!1,l=!1,c=!1,u=!1,d=0,f=0,h=0,p=0,m=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),a)39===r&&92!==o&&(a=!1);else if(l)34===r&&92!==o&&(l=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||d||f||h){switch(r){case 34:l=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:h++;break;case 41:h--;break;case 91:f++;break;case 93:f--;break;case 123:d++;break;case 125:d--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Pr.test(e)||(u=!0)}}else void 0===s?(p=i+1,s=n.slice(0,i).trim()):v();function v(){m.push(n.slice(p,i).trim()),p=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==p&&v(),m.length){for(i=0;i<m.length;i++)s=Wr(s,m[i],t);e.content=s}}function Wr(e,t,n){n.helper(Xe);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${nn(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${nn(o,"filter")}(${e}${")"!==i?","+i:i}`}}const Br=new WeakSet,zr=(e,t)=>{if(1===e.type){const n=qt(e,"memo");if(!n||Br.has(e))return;return Br.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&rn(r,t),e.codegenNode=Lt(t.helper(yt),[n.exp,Rt(void 0,r),"_cache",String(t.cached++)]))}}};function Vr(e,t={}){const n=t.onError||Ie,r="module"===t.mode;!0===t.prefixIdentifiers?n(Fe(46)):r&&n(Fe(47)),t.cacheHandlers&&n(Fe(48)),t.scopeId&&!r&&n(Fe(49));const o=(0,i.HD)(e)?function(e,t={}){const n=function(e,t){const n=(0,i.l7)({},un);let r;for(r in t)n[r]=void 0===t[r]?un[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=En(n);return function(e,t=kt){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(dn(n,0,[]),Cn(n,r))}(e,t):e,[s,a]=[[Ir,er,zr,or,Hr,_r,yr,fr,Dr],{on:Or,bind:Lr,model:Mr}];return Vn(o,(0,i.l7)({},t,{prefixIdentifiers:!1,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},a,t.directiveTransforms||{})})),function(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:f=!1}){const h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:f,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${xt[e]}`,push(e,t){h.code+=e},indent(){p(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:p(--h.indentLevel)},newline(){p(h.indentLevel)}};function p(e){h.push("\n"+"  ".repeat(e))}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:c,ssr:u}=n,d=e.helpers.length>0,f=!i&&"module"!==r;if(function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=e=>`${xt[e]}: _${xt[e]}`;e.helpers.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)&&o(`const { ${[qe,$e,Ue,Ze,Ye].filter((t=>e.helpers.includes(t))).map(u).join(", ")} } = _Vue\n`),function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),Jn(i,t),r())}t.pure=!1}(e.hoists,t),i(),o("return ")}(e,n),o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),f&&(o("with (_ctx) {"),s(),d&&(o(`const { ${e.helpers.map((e=>`${xt[e]}: _${xt[e]}`)).join(", ")} } = _Vue`),o("\n"),l())),e.components.length&&(Zn(e.components,"component",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Zn(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Zn(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),l()),u||o("return "),e.codegenNode?Jn(e.codegenNode,n):o("null"),f&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(o,(0,i.l7)({},t,{prefixIdentifiers:!1}))}const qr=Symbol(""),$r=Symbol(""),Ur=Symbol(""),Zr=Symbol(""),Yr=Symbol(""),Gr=Symbol(""),Jr=Symbol(""),Kr=Symbol(""),Xr=Symbol(""),Qr=Symbol("");var eo;let to;eo={[qr]:"vModelRadio",[$r]:"vModelCheckbox",[Ur]:"vModelText",[Zr]:"vModelSelect",[Yr]:"vModelDynamic",[Gr]:"withModifiers",[Jr]:"withKeys",[Kr]:"vShow",[Xr]:"Transition",[Qr]:"TransitionGroup"},Object.getOwnPropertySymbols(eo).forEach((e=>{xt[e]=eo[e]}));const no=(0,i.fY)("style,iframe,script,noscript",!0),ro={isVoidTag:i.WB,isNativeTag:e=>(0,i.eS)(e)||(0,i.aN)(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return to||(to=document.createElement("div")),t?(to.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,to.children[0].getAttribute("foo")):(to.innerHTML=e,to.textContent)},isBuiltInComponent:e=>It(e,"Transition")?Xr:It(e,"TransitionGroup")?Qr:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(no(e))return 2}return 0}},oo=(e,t)=>{const n=(0,i.yL)(e);return Tt(JSON.stringify(n),!1,t,3)};function io(e,t){return Fe(e,t)}const so=(0,i.fY)("passive,once,capture"),ao=(0,i.fY)("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),lo=(0,i.fY)("left,right"),co=(0,i.fY)("onkeyup,onkeydown,onkeypress",!0),uo=(e,t)=>At(e)&&"onclick"===e.content.toLowerCase()?Tt(t,!0):4!==e.type?Ot(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fo=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(io(60,e.loc)),t.removeNode())},ho=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Tt("style",!0,t.loc),exp:oo(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],po={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(50,o)),t.children.length&&(n.onError(io(51,o)),t.children.length=0),{props:[_t(Tt("innerHTML",!0,o),r||Tt("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(52,o)),t.children.length&&(n.onError(io(53,o)),t.children.length=0),{props:[_t(Tt("textContent",!0),r?Lt(n.helperString(rt),[r],o):Tt("",!0))]}},model:(e,t,n)=>{const r=Mr(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(io(55,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Ur,a=!1;if("input"===o||i){const r=$t(t,"type");if(r){if(7===r.type)s=Yr;else if(r.value)switch(r.value.content){case"radio":s=qr;break;case"checkbox":s=$r;break;case"file":a=!0,n.onError(io(56,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Yr)}else"select"===o&&(s=Zr);a||(r.needRuntime=n.helper(s))}else n.onError(io(54,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Or(e,0,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:s}=t.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const a=t[r];"native"===a&&an("COMPILER_V_ON_NATIVE",n)||so(a)?s.push(a):lo(a)?At(e)?co(e.content)?o.push(a):i.push(a):(o.push(a),i.push(a)):ao(a)?i.push(a):o.push(a)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(l.includes("right")&&(o=uo(o,"onContextmenu")),l.includes("middle")&&(o=uo(o,"onMouseup")),l.length&&(s=Lt(n.helper(Gr),[s,JSON.stringify(l)])),!a.length||At(o)&&!co(o.content)||(s=Lt(n.helper(Jr),[s,JSON.stringify(a)])),c.length){const e=c.map(i.kC).join("");o=At(o)?Tt(`${o.content}${e}`,!0):Ot(["(",o,`) + "${e}"`])}return{props:[_t(o,s)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(58,o)),{props:[],needRuntime:n.helper(Kr)}}},mo=Object.create(null);(0,o.Y1)((function(e,t){if(!(0,i.HD)(e)){if(!e.nodeType)return i.dG;e=e.innerHTML}const n=e,o=mo[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:s}=function(e,t={}){return Vr(e,(0,i.l7)({},ro,t,{nodeTransforms:[fo,...ho,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},po,t.directiveTransforms||{}),transformHoist:null}))}(e,(0,i.l7)({hoistStatic:!0,onError:void 0,onWarn:i.dG},t)),a=new Function("Vue",s)(r);return a._rc=!0,mo[n]=a}))},4515:(e,t,n)=>{var r={"./index.ts":6395};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=4515},4884:e=>{"use strict";e.exports=()=>window.__DOCS__},9984:e=>{"use strict";e.exports=__DOCS_CONFIG__},7648:(e,t,n)=>{"use strict";n.d(t,{MT:()=>o,IV:()=>c,U2:()=>a,t8:()=>l});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function o(e,t){const n=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(e){var t=function(){return indexedDB.databases().finally(e)};o=setInterval(t,100),t()})).finally((function(){return clearInterval(o)})):Promise.resolve()).then((()=>{const n=indexedDB.open(e);return n.onupgradeneeded=()=>n.result.createObjectStore(t),r(n)}));var o;return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}let i;function s(){return i||(i=o("keyval-store","keyval")),i}function a(e,t=s()){return t("readonly",(t=>r(t.get(e))))}function l(e,t,n=s()){return n("readwrite",(n=>(n.put(t,e),r(n.transaction))))}function c(e,t=s()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.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.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),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})},(()=>{"use strict";var e=n(4359),t=n(2626),r=n(872),o=n(5701),i=n(9984),s=n.n(i),a=n(2110);function l(e){setTimeout((function(){e(function(){var e;if("number"==typeof s().flags)e=s().flags;else{if(!c())return!1;if("number"!=typeof s().flags)return!1;e=s().flags}var n=h(f("73696465626172"),f("444F432D53494445424152"),f("646F63732D706F77657265642D6279"),document.children),r=0===n.length&&t.h.state.unloading;if(n.length>0)for(var o=0;o<n.length;++o){var i=n[o],a=null==i?void 0:i.firstChild,l=null==i?void 0:i.querySelector("svg");if(!(i&&a&&l&&i.getAttribute(f("68726566"))===f("68747470733A2F2F7265747970652E636F6D2F")&&a.innerHTML===f("506F7765726564206279")&&l.getAttribute(f("7769647468"))===f("3936")&&l.getAttribute(f("686569676874"))===f("3230")&&1045===l.innerHTML.replace(/\s+/g,"").split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return e^23*t}),0)))return!1;r||i&&(i.offsetWidth||i.offsetHeight||i.getClientRects().length)&&(r=!0)}return r||(1&e)*(2&e)>0}())}),10)}function c(){var e,t=d();if(!t)return!1;for(var n=parseInt(t.checksum.slice(0,-5)||"0"),r=[s().id,t.fingerprint,".",t.signature,s().base,s().host,n.toString()],o=0,i=s().sidebar;o<i.length;o++){var a=i[o];r.push(null!==(e=a.l)&&void 0!==e?e:a.n)}for(var l=0,c=0,u=r;c<u.length;c++)for(var f=u[c],h=0;h<f.length;++h)l^=f.charCodeAt(h);return l===parseInt(t.checksum.slice(-5))&&(s().flags=n,!0)}function u(t,n,r){if(!n){var o="5B464154414C5D3A20436F".concat(727275,"7074656420776"),i=function(){t&&t.unmount();var e="56273697".concat(4652063,"6F6E66696775726174696F6E"),n=document.getElementById(f("646F63732D617070"));n&&(n.innerHTML="",window[f("636F6E736F6C65")][f("6572726F72")](f(o+e)))};r?(0,e.Y3)((function(){return i()})):i()}}function d(){var e=null===s()||void 0===s()?void 0:s().key;if(!e||"string"!=typeof e)return null;var t=e.indexOf(".");if(t<=0)return null;var n=e.lastIndexOf(".");if(n<=t)return null;for(var r={fingerprint:e.slice(0,t),signature:e.slice(t+1,n),checksum:e.slice(n+1)},o=r.signature.length%4;o>0;--o)r.signature+="=";return r}function f(e){for(var t="",n=0;n<e.length;n+=2)t+=String.fromCharCode(parseInt(e.substr(n,2),16));return t}function h(e,t,n,r,o,i){null!=i||(i=[]);for(var s=0;s<r.length;++s){var a=r[s];if("A"===a.nodeName&&a.classList.contains(n)&&a instanceof HTMLElement)i.push(a);else{var l=a.children.length?a.children:"TEMPLATE"===a.nodeName&&a instanceof HTMLTemplateElement&&a.content.children?a.content.children:null;(null==l?void 0:l.length)&&h(e,t,n,l,o,i)}}return i}var p=n(4884),m=n.n(p);const v=()=>window.__DOCS_MERMAID__;var g=n.n(v);const b=()=>window.__DOCS_PRISM__;var y=n.n(b);const w=()=>window.__DOCS_KATEX__;var x,k,S,E,C,_,T=n.n(w),O=n(6184),L=n(7023),R=n(5184),D=n(5543),A=n(8816),I=n(7755),M=n(7924);(0,O.BL)(),"file:"===location.protocol.toLowerCase()&&(O.nP.drive=!1,O.nP.navigator.proposeVisit=function(e){window.location.href=e.toString()});var F="reloadPosition=";null!==(x=window.retype)&&void 0!==x||(window.retype={}),null!==(k=(S=window.retype).reload)&&void 0!==k||(S.reload=function(e,t){if(e){var n=location.pathname.endsWith("/")||/[.]html?$/i.test(location.pathname)?location.pathname:location.pathname+"/";document.cookie="".concat(F).concat(window.scrollX,",").concat(window.scrollY,";path=").concat(n,";max-age=5"),window.location.reload()}else{C=[window.scrollX,window.scrollY],_=window.location.hash;var r=window.location.href,o=_?window.location.pathname+window.location.search:r;(0,O.Vn)(o,{action:"replace"}),t&&(0,A.v2)()}}),document.addEventListener("turbo:load",(function(){var i,f,h;if(t.h.state.initialPageLoad){if(!c())return void u(E,!1);(function(){var e,t,n,r,o;return t=this,n=void 0,o=function(){var t,n,r,o,i,l,c,u,f,h,p,m,v,g,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(y){switch(y.label){case 0:if(!(t=d()))return[2,!1];for(n=parseInt(t.checksum.slice(0,-5)||"0"),r=atob(t.signature),o=[],g=0;g<r.length;++g)o.push(r.charCodeAt(g));for(i=[s().id,s().base,s().host,n.toString()],l=0,c=s().sidebar;l<c.length;l++)u=c[l],i.push(null!==(e=u.l)&&void 0!==e?e:u.n);return i.push(t.fingerprint),f=i.join(""),h=new TextEncoder,p=new TextDecoder,[4,crypto.subtle.digest("SHA-256",h.encode(f))];case 1:for(m=y.sent(),v=[48,71,48,115,103,125,49,133,75,132,137,14,25,65,99,18,116,124,42,116,85,72,11,45,125,183,150,91,96,33,111,30,32,103,88,212,96,188,182,160,83,67,148,88,185,171,117,178,221,234,50,86,254,60,165,240,3,106,69,30,235,147,143,222,64,97,80,223,163,20,180,16,45,166,117,156,157,202,217,232,216,165,93,4,176,78,44,97,133,2,3,1,0,1],g=a.u.length+a.bT.length;g>0;--g)v[g%v.length]^=a.u[g%a.u.length]^a.bT[g%a.bT.length];return[4,crypto.subtle.importKey("spki",new Uint8Array(v),{name:p.decode(a.u),hash:p.decode(a.bT)},!1,["verify"])];case 2:return b=y.sent(),[4,crypto.subtle.verify(b.algorithm,b,new Uint8Array(o),m)];case 3:return[2,y.sent()]}}))},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(t,n||[])).next())}))})().then((function(e){return u(E,e,!0)}))}else E.unmount();(function(){E=(0,e.ri)((0,e.aZ)({name:"DocApp",compilerOptions:{delimiters:["\0\0","\0\0"]},setup:function(){var n=(0,t.oR)().store;(0,r.g)(n),n.actions.resetMemberData();var o=function(){var t=(0,e.iH)(!1),n=null;return(0,L.zX)(window,"scroll",(function(){t.value=!0,null!==n&&clearTimeout(n),n=setTimeout((function(){t.value=!1}),100)})),{isScrolling:t}}().isScrolling;(0,e.YP)(o,(function(e){n.state.isWindowScrolling=e}),{immediate:!0}),(0,e.bv)((function(){(0,e.Y3)((function(){n.state.initialPageLoad=!1}))})),function(){var e=(0,t.oR)().store,n=(0,R.B)().scrollTo;(0,L.zX)(window,"popstate",(function(){var t;if(window.location.hash){var r=decodeURIComponent(window.location.hash);(null!==(t=document.getElementById(r.slice(1)))&&void 0!==t?t:document.querySelector(r))&&n(r,{offset:D.vE,onStart:function(){e.actions.updateScrolledElementId(r.substr(1))}})}}))}()}})),E.provide(t.$Q,t.h),E.provide(o.Mu,o.Ke);var i=n(4515);i.keys().forEach((function(e){var t=i(e);Object.keys(t).forEach((function(e){E.component(e,t[e])}))}));var s=document.getElementById("docs-app");if(s&&s.parentElement){var a=s.parentElement;s.querySelectorAll("script, style").forEach((function(e){e.remove(),a.appendChild(e)}))}E.mount("#docs-app")})(),l((function(e){return u(E,e)})),(null===(f=null===(i=window.retype)||void 0===i?void 0:i.editor)||void 0===f?void 0:f.initView)&&window.retype.editor.initView();var p=m()();(null==p?void 0:p.hasPrism)&&(0,I.b)("prism-js",y(),(function(e){return null==e?void 0:e.initPrism()})),(null==p?void 0:p.hasMermaid)&&(0,I.b)("mermaid-js",g(),(function(e){return null==e?void 0:e.initMermaid()})),(null==p?void 0:p.hasMath)&&(0,I.b)("katex-js",T(),(function(e){return null==e?void 0:e.initKatex()})),document.querySelectorAll(".scrollbar").forEach((function(e){e.classList.remove("overflow-hidden"),new M.Z(e)})),_&&(history.replaceState(history.state,document.title,window.location.pathname+_+window.location.search),_=null);var v=!1;if(C)window.scrollTo.apply(window,C),C=null,v=!0;else if(t.h.state.initialPageLoad){var b=null===(h=document.cookie.split(";").find((function(e){return e.trim().startsWith(F)})))||void 0===h?void 0:h.trim();if(b){var w=b.slice(F.length).split(",");w&&2==w.length&&/^\d+$/.test(w[0])&&/^\d+$/.test(w[1])&&(t.h.state.isScrollPositionRestored=!0,setTimeout((function(){t.h.state.isScrollPositionRestored=!1}),3e3),window.scrollTo(Number.parseInt(w[0]),Number.parseInt(w[1])),v=!0)}}v&&O.ry.currentVisit&&(O.ry.currentVisit.scrolled=!0),t.h.actions.updateMemberFilter(""),t.h.actions.updateSearchQuery("")})),window.addEventListener("beforeunload",(function(){t.h.state.unloading=!0}))})()})();
\ No newline at end of file
+      `,e.outerHTML)})(),window.Turbo=ve,pe()},2262:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>i,qq:()=>y,Fl:()=>Ge,ZM:()=>qe,cE:()=>x,B:()=>s,nZ:()=>l,X3:()=>Te,PG:()=>Ee,$y:()=>Ce,dq:()=>Me,yT:()=>_e,Xl:()=>Le,EB:()=>c,Jd:()=>C,WL:()=>ze,qj:()=>ye,OT:()=>xe,iH:()=>Fe,lk:()=>_,Um:()=>we,YS:()=>ke,XI:()=>Pe,sT:()=>k,IU:()=>Oe,Vh:()=>Ze,BK:()=>$e,j:()=>T,X$:()=>L,oR:()=>je,SU:()=>We});var r=n(3577);let o;class i{constructor(e=!1){this.active=!0,this.effects=[],this.cleanups=[],!e&&o&&(this.parent=o,this.index=(o.scopes||(o.scopes=[])).push(this)-1)}run(e){if(this.active)try{return o=this,e()}finally{o=this.parent}}on(){o=this}off(){o=this.parent}stop(e){if(this.active){let t,n;for(t=0,n=this.effects.length;t<n;t++)this.effects[t].stop();for(t=0,n=this.cleanups.length;t<n;t++)this.cleanups[t]();if(this.scopes)for(t=0,n=this.scopes.length;t<n;t++)this.scopes[t].stop(!0);if(this.parent&&!e){const e=this.parent.scopes.pop();e&&e!==this&&(this.parent.scopes[this.index]=e,e.index=this.index)}this.active=!1}}}function s(e){return new i(e)}function a(e,t=o){t&&t.active&&t.effects.push(e)}function l(){return o}function c(e){o&&o.cleanups.push(e)}const u=e=>{const t=new Set(e);return t.w=0,t.n=0,t},d=e=>(e.w&v)>0,f=e=>(e.n&v)>0,h=new WeakMap;let p,m=0,v=1;const g=Symbol(""),b=Symbol("");class y{constructor(e,t=null,n){this.fn=e,this.scheduler=t,this.active=!0,this.deps=[],this.parent=void 0,a(this,n)}run(){if(!this.active)return this.fn();let e=p,t=S;for(;e;){if(e===this)return;e=e.parent}try{return this.parent=p,p=this,S=!0,v=1<<++m,m<=30?(({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=v})(this):w(this),this.fn()}finally{m<=30&&(e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];d(o)&&!f(o)?o.delete(e):t[n++]=o,o.w&=~v,o.n&=~v}t.length=n}})(this),v=1<<--m,p=this.parent,S=t,this.parent=void 0}}stop(){this.active&&(w(this),this.onStop&&this.onStop(),this.active=!1)}}function w(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}function x(e,t){e.effect&&(e=e.effect.fn);const n=new y(e);t&&((0,r.l7)(n,t),t.scope&&a(n,t.scope)),t&&t.lazy||n.run();const o=n.run.bind(n);return o.effect=n,o}function k(e){e.effect.stop()}let S=!0;const E=[];function C(){E.push(S),S=!1}function _(){const e=E.pop();S=void 0===e||e}function T(e,t,n){if(S&&p){let t=h.get(e);t||h.set(e,t=new Map);let r=t.get(n);r||t.set(n,r=u()),O(r)}}function O(e,t){let n=!1;m<=30?f(e)||(e.n|=v,n=!d(e)):n=!e.has(p),n&&(e.add(p),p.deps.push(e))}function L(e,t,n,o,i,s){const a=h.get(e);if(!a)return;let l=[];if("clear"===t)l=[...a.values()];else if("length"===n&&(0,r.kJ)(e))a.forEach(((e,t)=>{("length"===t||t>=o)&&l.push(e)}));else switch(void 0!==n&&l.push(a.get(n)),t){case"add":(0,r.kJ)(e)?(0,r.S0)(n)&&l.push(a.get("length")):(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"delete":(0,r.kJ)(e)||(l.push(a.get(g)),(0,r._N)(e)&&l.push(a.get(b)));break;case"set":(0,r._N)(e)&&l.push(a.get(g))}if(1===l.length)l[0]&&R(l[0]);else{const e=[];for(const t of l)t&&e.push(...t);R(u(e))}}function R(e,t){for(const t of(0,r.kJ)(e)?e:[...e])(t!==p||t.allowRecurse)&&(t.scheduler?t.scheduler():t.run())}const D=(0,r.fY)("__proto__,__v_isRef,__isVue"),A=new Set(Object.getOwnPropertyNames(Symbol).map((e=>Symbol[e])).filter(r.yk)),I=j(),M=j(!1,!0),F=j(!0),P=j(!0,!0),H=N();function N(){const e={};return["includes","indexOf","lastIndexOf"].forEach((t=>{e[t]=function(...e){const n=Oe(this);for(let e=0,t=this.length;e<t;e++)T(n,0,e+"");const r=n[t](...e);return-1===r||!1===r?n[t](...e.map(Oe)):r}})),["push","pop","shift","unshift","splice"].forEach((t=>{e[t]=function(...e){C();const n=Oe(this)[t].apply(this,e);return _(),n}})),e}function j(e=!1,t=!1){return function(n,o,i){if("__v_isReactive"===o)return!e;if("__v_isReadonly"===o)return e;if("__v_isShallow"===o)return t;if("__v_raw"===o&&i===(e?t?be:ge:t?ve:me).get(n))return n;const s=(0,r.kJ)(n);if(!e&&s&&(0,r.RI)(H,o))return Reflect.get(H,o,i);const a=Reflect.get(n,o,i);return((0,r.yk)(o)?A.has(o):D(o))?a:(e||T(n,0,o),t?a:Me(a)?s&&(0,r.S0)(o)?a:a.value:(0,r.Kn)(a)?e?xe(a):ye(a):a)}}const W=z(),B=z(!0);function z(e=!1){return function(t,n,o,i){let s=t[n];if(Ce(s)&&Me(s)&&!Me(o))return!1;if(!e&&!Ce(o)&&(_e(o)||(o=Oe(o),s=Oe(s)),!(0,r.kJ)(t)&&Me(s)&&!Me(o)))return s.value=o,!0;const a=(0,r.kJ)(t)&&(0,r.S0)(n)?Number(n)<t.length:(0,r.RI)(t,n),l=Reflect.set(t,n,o,i);return t===Oe(i)&&(a?(0,r.aU)(o,s)&&L(t,"set",n,o):L(t,"add",n,o)),l}}const V={get:I,set:W,deleteProperty:function(e,t){const n=(0,r.RI)(e,t),o=(e[t],Reflect.deleteProperty(e,t));return o&&n&&L(e,"delete",t,void 0),o},has:function(e,t){const n=Reflect.has(e,t);return(0,r.yk)(t)&&A.has(t)||T(e,0,t),n},ownKeys:function(e){return T(e,0,(0,r.kJ)(e)?"length":g),Reflect.ownKeys(e)}},q={get:F,set:(e,t)=>!0,deleteProperty:(e,t)=>!0},$=(0,r.l7)({},V,{get:M,set:B}),U=(0,r.l7)({},q,{get:P}),Z=e=>e,Y=e=>Reflect.getPrototypeOf(e);function G(e,t,n=!1,r=!1){const o=Oe(e=e.__v_raw),i=Oe(t);t!==i&&!n&&T(o,0,t),!n&&T(o,0,i);const{has:s}=Y(o),a=r?Z:n?De:Re;return s.call(o,t)?a(e.get(t)):s.call(o,i)?a(e.get(i)):void(e!==o&&e.get(t))}function J(e,t=!1){const n=this.__v_raw,r=Oe(n),o=Oe(e);return e!==o&&!t&&T(r,0,e),!t&&T(r,0,o),e===o?n.has(e):n.has(e)||n.has(o)}function K(e,t=!1){return e=e.__v_raw,!t&&T(Oe(e),0,g),Reflect.get(e,"size",e)}function X(e){e=Oe(e);const t=Oe(this);return Y(t).has.call(t,e)||(t.add(e),L(t,"add",e,e)),this}function Q(e,t){t=Oe(t);const n=Oe(this),{has:o,get:i}=Y(n);let s=o.call(n,e);s||(e=Oe(e),s=o.call(n,e));const a=i.call(n,e);return n.set(e,t),s?(0,r.aU)(t,a)&&L(n,"set",e,t):L(n,"add",e,t),this}function ee(e){const t=Oe(this),{has:n,get:r}=Y(t);let o=n.call(t,e);o||(e=Oe(e),o=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return o&&L(t,"delete",e,void 0),i}function te(){const e=Oe(this),t=0!==e.size,n=e.clear();return t&&L(e,"clear",void 0,void 0),n}function ne(e,t){return function(n,r){const o=this,i=o.__v_raw,s=Oe(i),a=t?Z:e?De:Re;return!e&&T(s,0,g),i.forEach(((e,t)=>n.call(r,a(e),a(t),o)))}}function re(e,t,n){return function(...o){const i=this.__v_raw,s=Oe(i),a=(0,r._N)(s),l="entries"===e||e===Symbol.iterator&&a,c="keys"===e&&a,u=i[e](...o),d=n?Z:t?De:Re;return!t&&T(s,0,c?b:g),{next(){const{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:l?[d(e[0]),d(e[1])]:d(e),done:t}},[Symbol.iterator](){return this}}}}function oe(e){return function(...t){return"delete"!==e&&this}}function ie(){const e={get(e){return G(this,e)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!1)},t={get(e){return G(this,e,!1,!0)},get size(){return K(this)},has:J,add:X,set:Q,delete:ee,clear:te,forEach:ne(!1,!0)},n={get(e){return G(this,e,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!1)},r={get(e){return G(this,e,!0,!0)},get size(){return K(this,!0)},has(e){return J.call(this,e,!0)},add:oe("add"),set:oe("set"),delete:oe("delete"),clear:oe("clear"),forEach:ne(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach((o=>{e[o]=re(o,!1,!1),n[o]=re(o,!0,!1),t[o]=re(o,!1,!0),r[o]=re(o,!0,!0)})),[e,n,t,r]}const[se,ae,le,ce]=ie();function ue(e,t){const n=t?e?ce:le:e?ae:se;return(t,o,i)=>"__v_isReactive"===o?!e:"__v_isReadonly"===o?e:"__v_raw"===o?t:Reflect.get((0,r.RI)(n,o)&&o in t?n:t,o,i)}const de={get:ue(!1,!1)},fe={get:ue(!1,!0)},he={get:ue(!0,!1)},pe={get:ue(!0,!0)},me=new WeakMap,ve=new WeakMap,ge=new WeakMap,be=new WeakMap;function ye(e){return Ce(e)?e:Se(e,!1,V,de,me)}function we(e){return Se(e,!1,$,fe,ve)}function xe(e){return Se(e,!0,q,he,ge)}function ke(e){return Se(e,!0,U,pe,be)}function Se(e,t,n,o,i){if(!(0,r.Kn)(e))return e;if(e.__v_raw&&(!t||!e.__v_isReactive))return e;const s=i.get(e);if(s)return s;const a=(l=e).__v_skip||!Object.isExtensible(l)?0:function(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}((0,r.W7)(l));var l;if(0===a)return e;const c=new Proxy(e,2===a?o:n);return i.set(e,c),c}function Ee(e){return Ce(e)?Ee(e.__v_raw):!(!e||!e.__v_isReactive)}function Ce(e){return!(!e||!e.__v_isReadonly)}function _e(e){return!(!e||!e.__v_isShallow)}function Te(e){return Ee(e)||Ce(e)}function Oe(e){const t=e&&e.__v_raw;return t?Oe(t):e}function Le(e){return(0,r.Nj)(e,"__v_skip",!0),e}const Re=e=>(0,r.Kn)(e)?ye(e):e,De=e=>(0,r.Kn)(e)?xe(e):e;function Ae(e){S&&p&&O((e=Oe(e)).dep||(e.dep=u()))}function Ie(e,t){(e=Oe(e)).dep&&R(e.dep)}function Me(e){return!(!e||!0!==e.__v_isRef)}function Fe(e){return He(e,!1)}function Pe(e){return He(e,!0)}function He(e,t){return Me(e)?e:new Ne(e,t)}class Ne{constructor(e,t){this.__v_isShallow=t,this.dep=void 0,this.__v_isRef=!0,this._rawValue=t?e:Oe(e),this._value=t?e:Re(e)}get value(){return Ae(this),this._value}set value(e){e=this.__v_isShallow?e:Oe(e),(0,r.aU)(e,this._rawValue)&&(this._rawValue=e,this._value=this.__v_isShallow?e:Re(e),Ie(this))}}function je(e){Ie(e)}function We(e){return Me(e)?e.value:e}const Be={get:(e,t,n)=>We(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Me(o)&&!Me(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function ze(e){return Ee(e)?e:new Proxy(e,Be)}class Ve{constructor(e){this.dep=void 0,this.__v_isRef=!0;const{get:t,set:n}=e((()=>Ae(this)),(()=>Ie(this)));this._get=t,this._set=n}get value(){return this._get()}set value(e){this._set(e)}}function qe(e){return new Ve(e)}function $e(e){const t=(0,r.kJ)(e)?new Array(e.length):{};for(const n in e)t[n]=Ze(e,n);return t}class Ue{constructor(e,t,n){this._object=e,this._key=t,this._defaultValue=n,this.__v_isRef=!0}get value(){const e=this._object[this._key];return void 0===e?this._defaultValue:e}set value(e){this._object[this._key]=e}}function Ze(e,t,n){const r=e[t];return Me(r)?r:new Ue(e,t,n)}class Ye{constructor(e,t,n,r){this._setter=t,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new y(e,(()=>{this._dirty||(this._dirty=!0,Ie(this))})),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=n}get value(){const e=Oe(this);return Ae(e),!e._dirty&&e._cacheable||(e._dirty=!1,e._value=e.effect.run()),e._value}set value(e){this._setter(e)}}function Ge(e,t,n=!1){let o,i;const s=(0,r.mf)(e);return s?(o=e,i=r.dG):(o=e.get,i=e.set),new Ye(o,i,s||!i,n)}Promise.resolve()},6252:(e,t,n)=>{"use strict";n.d(t,{Bj:()=>r.Bj,qq:()=>r.qq,ZM:()=>r.ZM,cE:()=>r.cE,B:()=>r.B,nZ:()=>r.nZ,X3:()=>r.X3,PG:()=>r.PG,$y:()=>r.$y,dq:()=>r.dq,yT:()=>r.yT,Xl:()=>r.Xl,EB:()=>r.EB,WL:()=>r.WL,qj:()=>r.qj,OT:()=>r.OT,iH:()=>r.iH,Um:()=>r.Um,YS:()=>r.YS,XI:()=>r.XI,sT:()=>r.sT,IU:()=>r.IU,Vh:()=>r.Vh,BK:()=>r.BK,oR:()=>r.oR,SU:()=>r.SU,_A:()=>o._A,kC:()=>o.kC,C_:()=>o.C_,vs:()=>o.vs,j5:()=>o.j5,zw:()=>o.zw,hR:()=>o.hR,P$:()=>be,sv:()=>Yt,HY:()=>Ut,Ob:()=>Re,qG:()=>Gt,n4:()=>Q,lR:()=>Nt,xv:()=>Zt,$d:()=>u,KU:()=>c,Ho:()=>vn,ry:()=>xr,Fl:()=>tr,j4:()=>sn,kq:()=>yn,iD:()=>on,_:()=>hn,Eo:()=>Rt,p1:()=>ur,Us:()=>Lt,Nv:()=>_n,uE:()=>bn,Uk:()=>gn,Wm:()=>pn,RC:()=>Te,aZ:()=>Ce,Bz:()=>rr,WY:()=>or,MW:()=>nr,mW:()=>M,FN:()=>Nn,Q6:()=>Ee,F4:()=>mn,h:()=>fr,S3:()=>d,Mr:()=>mr,f3:()=>se,nQ:()=>gr,of:()=>Yn,lA:()=>an,u_:()=>cr,dG:()=>Sn,Y3:()=>C,dl:()=>Ae,wF:()=>We,Jd:()=>qe,Xn:()=>ze,se:()=>Ie,d1:()=>Ge,bv:()=>Be,bT:()=>Ye,Yq:()=>Ze,vl:()=>Ue,Ah:()=>$e,ic:()=>Ve,wg:()=>Xt,Cn:()=>$,JJ:()=>ie,dD:()=>q,qb:()=>L,Y1:()=>Zn,Ko:()=>Cn,WI:()=>Tn,up:()=>Wt,Q2:()=>Vt,LL:()=>zt,eq:()=>wr,U2:()=>we,qZ:()=>nn,ec:()=>H,nK:()=>Se,Uc:()=>hr,G:()=>yr,mx:()=>Ln,C3:()=>cn,l1:()=>ar,Zq:()=>pr,Rr:()=>sr,Y8:()=>ve,i8:()=>br,ZK:()=>s,YP:()=>de,m0:()=>ae,Rh:()=>le,yX:()=>ce,mv:()=>dr,w5:()=>Z,b9:()=>ir,wy:()=>bt,MX:()=>vr,HX:()=>U});var r=n(2262),o=n(3577);const i=[];function s(e,...t){(0,r.Jd)();const n=i.length?i[i.length-1].component:null,o=n&&n.appContext.config.warnHandler,s=function(){let e=i[i.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}();if(o)c(o,n,11,[e+t.join(""),n&&n.proxy,s.map((({vnode:e})=>`at <${er(n,e.type)}>`)).join("\n"),s]);else{const n=[`[Vue warn]: ${e}`,...t];s.length&&n.push("\n",...function(e){const t=[];return e.forEach(((e,n)=>{t.push(...0===n?[]:["\n"],...function({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=!!e.component&&null==e.component.parent,o=` at <${er(e.component,e.type,r)}`,i=">"+n;return e.props?[o,...a(e.props),i]:[o+i]}(e))})),t}(s)),console.warn(...n)}(0,r.lk)()}function a(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach((n=>{t.push(...l(n,e[n]))})),n.length>3&&t.push(" ..."),t}function l(e,t,n){return(0,o.HD)(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):"number"==typeof t||"boolean"==typeof t||null==t?n?t:[`${e}=${t}`]:(0,r.dq)(t)?(t=l(e,(0,r.IU)(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):(0,o.mf)(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=(0,r.IU)(t),n?t:[`${e}=`,t])}function c(e,t,n,r){let o;try{o=r?e(...r):e()}catch(e){d(e,t,n)}return o}function u(e,t,n,r){if((0,o.mf)(e)){const i=c(e,t,n,r);return i&&(0,o.tI)(i)&&i.catch((e=>{d(e,t,n)})),i}const i=[];for(let o=0;o<e.length;o++)i.push(u(e[o],t,n,r));return i}function d(e,t,n,r=!0){if(t&&t.vnode,t){let r=t.parent;const o=t.proxy,i=n;for(;r;){const t=r.ec;if(t)for(let n=0;n<t.length;n++)if(!1===t[n](e,o,i))return;r=r.parent}const s=t.appContext.config.errorHandler;if(s)return void c(s,null,10,[e,o,i])}!function(e,t,n,r=!0){console.error(e)}(e,0,0,r)}let f=!1,h=!1;const p=[];let m=0;const v=[];let g=null,b=0;const y=[];let w=null,x=0;const k=Promise.resolve();let S=null,E=null;function C(e){const t=S||k;return e?t.then(this?e.bind(this):e):t}function _(e){p.length&&p.includes(e,f&&e.allowRecurse?m+1:m)||e===E||(null==e.id?p.push(e):p.splice(function(e){let t=m+1,n=p.length;for(;t<n;){const r=t+n>>>1;A(p[r])<e?t=r+1:n=r}return t}(e.id),0,e),T())}function T(){f||h||(h=!0,S=k.then(I))}function O(e,t,n,r){(0,o.kJ)(e)?n.push(...e):t&&t.includes(e,e.allowRecurse?r+1:r)||n.push(e),T()}function L(e){O(e,w,y,x)}function R(e,t=null){if(v.length){for(E=t,g=[...new Set(v)],v.length=0,b=0;b<g.length;b++)g[b]();g=null,b=0,E=null,R(e,t)}}function D(e){if(y.length){const e=[...new Set(y)];if(y.length=0,w)return void w.push(...e);for(w=e,w.sort(((e,t)=>A(e)-A(t))),x=0;x<w.length;x++)w[x]();w=null,x=0}}const A=e=>null==e.id?1/0:e.id;function I(e){h=!1,f=!0,R(e),p.sort(((e,t)=>A(e)-A(t))),o.dG;try{for(m=0;m<p.length;m++){const e=p[m];e&&!1!==e.active&&c(e,null,14)}}finally{m=0,p.length=0,D(),f=!1,S=null,(p.length||v.length||y.length)&&I(e)}}new Set,new Map;let M,F=[],P=!1;function H(e,t){var n,r;M=e,M?(M.enabled=!0,F.forEach((({event:e,args:t})=>M.emit(e,...t))),F=[]):"undefined"!=typeof window&&window.HTMLElement&&!(null===(r=null===(n=window.navigator)||void 0===n?void 0:n.userAgent)||void 0===r?void 0:r.includes("jsdom"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push((e=>{H(e,t)})),setTimeout((()=>{M||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,P=!0,F=[])}),3e3)):(P=!0,F=[])}function N(e,t,...n){const r=e.vnode.props||o.kT;let i=n;const s=t.startsWith("update:"),a=s&&t.slice(7);if(a&&a in r){const e=`${"modelValue"===a?"model":a}Modifiers`,{number:t,trim:s}=r[e]||o.kT;s?i=n.map((e=>e.trim())):t&&(i=n.map(o.He))}let l,c=r[l=(0,o.hR)(t)]||r[l=(0,o.hR)((0,o._A)(t))];!c&&s&&(c=r[l=(0,o.hR)((0,o.rs)(t))]),c&&u(c,e,6,i);const d=r[l+"Once"];if(d){if(e.emitted){if(e.emitted[l])return}else e.emitted={};e.emitted[l]=!0,u(d,e,6,i)}}function j(e,t,n=!1){const r=t.emitsCache,i=r.get(e);if(void 0!==i)return i;const s=e.emits;let a={},l=!1;if(!(0,o.mf)(e)){const r=e=>{const n=j(e,t,!0);n&&(l=!0,(0,o.l7)(a,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return s||l?((0,o.kJ)(s)?s.forEach((e=>a[e]=null)):(0,o.l7)(a,s),r.set(e,a),a):(r.set(e,null),null)}function W(e,t){return!(!e||!(0,o.F7)(t))&&(t=t.slice(2).replace(/Once$/,""),(0,o.RI)(e,t[0].toLowerCase()+t.slice(1))||(0,o.RI)(e,(0,o.rs)(t))||(0,o.RI)(e,t))}let B=null,z=null;function V(e){const t=B;return B=e,z=e&&e.type.__scopeId||null,t}function q(e){z=e}function $(){z=null}const U=e=>Z;function Z(e,t=B,n){if(!t)return e;if(e._n)return e;const r=(...n)=>{r._d&&nn(-1);const o=V(t),i=e(...n);return V(o),r._d&&nn(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function Y(e){const{type:t,vnode:n,proxy:r,withProxy:i,props:s,propsOptions:[a],slots:l,attrs:c,emit:u,render:f,renderCache:h,data:p,setupState:m,ctx:v,inheritAttrs:g}=e;let b,y;const w=V(e);try{if(4&n.shapeFlag){const e=i||r;b=wn(f.call(e,e,h,s,m,p,v)),y=c}else{const e=t;b=wn(e.length>1?e(s,{attrs:c,slots:l,emit:u}):e(s,null)),y=t.props?c:G(c)}}catch(t){Jt.length=0,d(t,e,1),b=pn(Yt)}let x=b;if(y&&!1!==g){const e=Object.keys(y),{shapeFlag:t}=x;e.length&&7&t&&(a&&e.some(o.tR)&&(y=J(y,a)),x=vn(x,y))}return n.dirs&&(x.dirs=x.dirs?x.dirs.concat(n.dirs):n.dirs),n.transition&&(x.transition=n.transition),b=x,V(w),b}const G=e=>{let t;for(const n in e)("class"===n||"style"===n||(0,o.F7)(n))&&((t||(t={}))[n]=e[n]);return t},J=(e,t)=>{const n={};for(const r in e)(0,o.tR)(r)&&r.slice(9)in t||(n[r]=e[r]);return n};function K(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const i=r[o];if(t[i]!==e[i]&&!W(n,i))return!0}return!1}function X({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Q={name:"Suspense",__isSuspense:!0,process(e,t,n,r,o,i,s,a,l,c){null==e?function(e,t,n,r,o,i,s,a,l){const{p:c,o:{createElement:u}}=l,d=u("div"),f=e.suspense=te(e,o,r,t,d,n,i,s,a,l);c(null,f.pendingBranch=e.ssContent,d,null,r,f,i,s),f.deps>0?(ee(e,"onPending"),ee(e,"onFallback"),c(null,e.ssFallback,t,n,r,null,i,s),oe(f,e.ssFallback)):f.resolve()}(t,n,r,o,i,s,a,l,c):function(e,t,n,r,o,i,s,a,{p:l,um:c,o:{createElement:u}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,h=t.ssFallback,{activeBranch:p,pendingBranch:m,isInFallback:v,isHydrating:g}=d;if(m)d.pendingBranch=f,ln(f,m)?(l(m,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():v&&(l(p,h,n,r,o,null,i,s,a),oe(d,h))):(d.pendingId++,g?(d.isHydrating=!1,d.activeBranch=m):c(m,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=u("div"),v?(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0?d.resolve():(l(p,h,n,r,o,null,i,s,a),oe(d,h))):p&&ln(f,p)?(l(p,f,n,r,o,d,i,s,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0&&d.resolve()));else if(p&&ln(f,p))l(p,f,n,r,o,d,i,s,a),oe(d,f);else if(ee(t,"onPending"),d.pendingBranch=f,d.pendingId++,l(null,f,d.hiddenContainer,null,o,d,i,s,a),d.deps<=0)d.resolve();else{const{timeout:e,pendingId:t}=d;e>0?setTimeout((()=>{d.pendingId===t&&d.fallback(h)}),e):0===e&&d.fallback(h)}}(e,t,n,r,o,s,a,l,c)},hydrate:function(e,t,n,r,o,i,s,a,l){const c=t.suspense=te(t,r,n,e.parentNode,document.createElement("div"),null,o,i,s,a,!0),u=l(e,c.pendingBranch=t.ssContent,n,c,i,s);return 0===c.deps&&c.resolve(),u},create:te,normalize:function(e){const{shapeFlag:t,children:n}=e,r=32&t;e.ssContent=ne(r?n.default:n),e.ssFallback=r?ne(n.fallback):pn(Yt)}};function ee(e,t){const n=e.props&&e.props[t];(0,o.mf)(n)&&n()}function te(e,t,n,r,i,s,a,l,c,u,f=!1){const{p:h,m:p,um:m,n:v,o:{parentNode:g,remove:b}}=u,y=(0,o.He)(e.props&&e.props.timeout),w={vnode:e,parent:t,parentComponent:n,isSVG:a,container:r,hiddenContainer:i,anchor:s,deps:0,pendingId:0,timeout:"number"==typeof y?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(e=!1){const{vnode:t,activeBranch:n,pendingBranch:r,pendingId:o,effects:i,parentComponent:s,container:a}=w;if(w.isHydrating)w.isHydrating=!1;else if(!e){const e=n&&r.transition&&"out-in"===r.transition.mode;e&&(n.transition.afterLeave=()=>{o===w.pendingId&&p(r,a,t,0)});let{anchor:t}=w;n&&(t=v(n),m(n,s,w,!0)),e||p(r,a,t,0)}oe(w,r),w.pendingBranch=null,w.isInFallback=!1;let l=w.parent,c=!1;for(;l;){if(l.pendingBranch){l.effects.push(...i),c=!0;break}l=l.parent}c||L(i),w.effects=[],ee(t,"onResolve")},fallback(e){if(!w.pendingBranch)return;const{vnode:t,activeBranch:n,parentComponent:r,container:o,isSVG:i}=w;ee(t,"onFallback");const s=v(n),a=()=>{w.isInFallback&&(h(null,e,o,s,r,null,i,l,c),oe(w,e))},u=e.transition&&"out-in"===e.transition.mode;u&&(n.transition.afterLeave=a),w.isInFallback=!0,m(n,r,null,!0),u||a()},move(e,t,n){w.activeBranch&&p(w.activeBranch,e,t,n),w.container=e},next:()=>w.activeBranch&&v(w.activeBranch),registerDep(e,t){const n=!!w.pendingBranch;n&&w.deps++;const r=e.vnode.el;e.asyncDep.catch((t=>{d(t,e,0)})).then((o=>{if(e.isUnmounted||w.isUnmounted||w.pendingId!==e.suspenseId)return;e.asyncResolved=!0;const{vnode:i}=e;Un(e,o,!1),r&&(i.el=r);const s=!r&&e.subTree.el;t(e,i,g(r||e.subTree.el),r?null:v(e.subTree),w,a,c),s&&b(s),X(e,i.el),n&&0==--w.deps&&w.resolve()}))},unmount(e,t){w.isUnmounted=!0,w.activeBranch&&m(w.activeBranch,n,e,t),w.pendingBranch&&m(w.pendingBranch,n,e,t)}};return w}function ne(e){let t;if((0,o.mf)(e)){const n=tn&&e._c;n&&(e._d=!1,Xt()),e=e(),n&&(e._d=!0,t=Kt,Qt())}if((0,o.kJ)(e)){const t=function(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(!an(r))return;if(r.type!==Yt||"v-if"===r.children){if(t)return;t=r}}return t}(e);e=t}return e=wn(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter((t=>t!==e))),e}function re(e,t){t&&t.pendingBranch?(0,o.kJ)(e)?t.effects.push(...e):t.effects.push(e):L(e)}function oe(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,X(r,o))}function ie(e,t){if(Hn){let n=Hn.provides;const r=Hn.parent&&Hn.parent.provides;r===n&&(n=Hn.provides=Object.create(r)),n[e]=t}}function se(e,t,n=!1){const r=Hn||B;if(r){const i=null==r.parent?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return n&&(0,o.mf)(t)?t.call(r.proxy):t}}function ae(e,t){return fe(e,null,t)}function le(e,t){return fe(e,null,{flush:"post"})}function ce(e,t){return fe(e,null,{flush:"sync"})}const ue={};function de(e,t,n){return fe(e,t,n)}function fe(e,t,{immediate:n,deep:i,flush:s,onTrack:a,onTrigger:l}=o.kT){const d=Hn;let f,h,p=!1,m=!1;if((0,r.dq)(e)?(f=()=>e.value,p=(0,r.yT)(e)):(0,r.PG)(e)?(f=()=>e,i=!0):(0,o.kJ)(e)?(m=!0,p=e.some(r.PG),f=()=>e.map((e=>(0,r.dq)(e)?e.value:(0,r.PG)(e)?me(e):(0,o.mf)(e)?c(e,d,2):void 0))):f=(0,o.mf)(e)?t?()=>c(e,d,2):()=>{if(!d||!d.isUnmounted)return h&&h(),u(e,d,3,[y])}:o.dG,t&&i){const e=f;f=()=>me(e())}let y=e=>{h=S.onStop=()=>{c(e,d,4)}};if(qn)return y=o.dG,t?n&&u(t,d,3,[f(),m?[]:void 0,y]):f(),o.dG;let w=m?[]:ue;const x=()=>{if(S.active)if(t){const e=S.run();(i||p||(m?e.some(((e,t)=>(0,o.aU)(e,w[t]))):(0,o.aU)(e,w)))&&(h&&h(),u(t,d,3,[e,w===ue?void 0:w,y]),w=e)}else S.run()};let k;x.allowRecurse=!!t,k="sync"===s?x:"post"===s?()=>Ot(x,d&&d.suspense):()=>{!d||d.isMounted?function(e){O(e,g,v,b)}(x):x()};const S=new r.qq(f,k);return t?n?x():w=S.run():"post"===s?Ot(S.run.bind(S),d&&d.suspense):S.run(),()=>{S.stop(),d&&d.scope&&(0,o.Od)(d.scope.effects,S)}}function he(e,t,n){const r=this.proxy,i=(0,o.HD)(e)?e.includes(".")?pe(r,e):()=>r[e]:e.bind(r,r);let s;(0,o.mf)(t)?s=t:(s=t.handler,n=t);const a=Hn;jn(this);const l=fe(i,s.bind(r),n);return a?jn(a):Wn(),l}function pe(e,t){const n=t.split(".");return()=>{let t=e;for(let e=0;e<n.length&&t;e++)t=t[n[e]];return t}}function me(e,t){if(!(0,o.Kn)(e)||e.__v_skip)return e;if((t=t||new Set).has(e))return e;if(t.add(e),(0,r.dq)(e))me(e.value,t);else if((0,o.kJ)(e))for(let n=0;n<e.length;n++)me(e[n],t);else if((0,o.DM)(e)||(0,o._N)(e))e.forEach((e=>{me(e,t)}));else if((0,o.PO)(e))for(const n in e)me(e[n],t);return e}function ve(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Be((()=>{e.isMounted=!0})),qe((()=>{e.isUnmounting=!0})),e}const ge=[Function,Array],be={name:"BaseTransition",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ge,onEnter:ge,onAfterEnter:ge,onEnterCancelled:ge,onBeforeLeave:ge,onLeave:ge,onAfterLeave:ge,onLeaveCancelled:ge,onBeforeAppear:ge,onAppear:ge,onAfterAppear:ge,onAppearCancelled:ge},setup(e,{slots:t}){const n=Nn(),o=ve();let i;return()=>{const s=t.default&&Ee(t.default(),!0);if(!s||!s.length)return;const a=(0,r.IU)(e),{mode:l}=a,c=s[0];if(o.isLeaving)return xe(c);const u=ke(c);if(!u)return xe(c);const d=we(u,a,o,n);Se(u,d);const f=n.subTree,h=f&&ke(f);let p=!1;const{getTransitionKey:m}=u.type;if(m){const e=m();void 0===i?i=e:e!==i&&(i=e,p=!0)}if(h&&h.type!==Yt&&(!ln(u,h)||p)){const e=we(h,a,o,n);if(Se(h,e),"out-in"===l)return o.isLeaving=!0,e.afterLeave=()=>{o.isLeaving=!1,n.update()},xe(c);"in-out"===l&&u.type!==Yt&&(e.delayLeave=(e,t,n)=>{ye(o,h)[String(h.key)]=h,e._leaveCb=()=>{t(),e._leaveCb=void 0,delete d.delayedLeave},d.delayedLeave=n})}return c}}};function ye(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function we(e,t,n,r){const{appear:o,mode:i,persisted:s=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:c,onEnterCancelled:d,onBeforeLeave:f,onLeave:h,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:v,onAppear:g,onAfterAppear:b,onAppearCancelled:y}=t,w=String(e.key),x=ye(n,e),k=(e,t)=>{e&&u(e,r,9,t)},S={mode:i,persisted:s,beforeEnter(t){let r=a;if(!n.isMounted){if(!o)return;r=v||a}t._leaveCb&&t._leaveCb(!0);const i=x[w];i&&ln(e,i)&&i.el._leaveCb&&i.el._leaveCb(),k(r,[t])},enter(e){let t=l,r=c,i=d;if(!n.isMounted){if(!o)return;t=g||l,r=b||c,i=y||d}let s=!1;const a=e._enterCb=t=>{s||(s=!0,k(t?i:r,[e]),S.delayedLeave&&S.delayedLeave(),e._enterCb=void 0)};t?(t(e,a),t.length<=1&&a()):a()},leave(t,r){const o=String(e.key);if(t._enterCb&&t._enterCb(!0),n.isUnmounting)return r();k(f,[t]);let i=!1;const s=t._leaveCb=n=>{i||(i=!0,r(),k(n?m:p,[t]),t._leaveCb=void 0,x[o]===e&&delete x[o])};x[o]=e,h?(h(t,s),h.length<=1&&s()):s()},clone:e=>we(e,t,n,r)};return S}function xe(e){if(Le(e))return(e=vn(e)).children=null,e}function ke(e){return Le(e)?e.children?e.children[0]:void 0:e}function Se(e,t){6&e.shapeFlag&&e.component?Se(e.component.subTree,t):128&e.shapeFlag?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ee(e,t=!1){let n=[],r=0;for(let o=0;o<e.length;o++){const i=e[o];i.type===Ut?(128&i.patchFlag&&r++,n=n.concat(Ee(i.children,t))):(t||i.type!==Yt)&&n.push(i)}if(r>1)for(let e=0;e<n.length;e++)n[e].patchFlag=-2;return n}function Ce(e){return(0,o.mf)(e)?{setup:e,name:e.name}:e}const _e=e=>!!e.type.__asyncLoader;function Te(e){(0,o.mf)(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:i,delay:s=200,timeout:a,suspensible:l=!0,onError:c}=e;let u,f=null,h=0;const p=()=>{let e;return f||(e=f=t().catch((e=>{if(e=e instanceof Error?e:new Error(String(e)),c)return new Promise(((t,n)=>{c(e,(()=>t((h++,f=null,p()))),(()=>n(e)),h+1)}));throw e})).then((t=>e!==f&&f?f:(t&&(t.__esModule||"Module"===t[Symbol.toStringTag])&&(t=t.default),u=t,t))))};return Ce({name:"AsyncComponentWrapper",__asyncLoader:p,get __asyncResolved(){return u},setup(){const e=Hn;if(u)return()=>Oe(u,e);const t=t=>{f=null,d(t,e,13,!i)};if(l&&e.suspense||qn)return p().then((t=>()=>Oe(t,e))).catch((e=>(t(e),()=>i?pn(i,{error:e}):null)));const o=(0,r.iH)(!1),c=(0,r.iH)(),h=(0,r.iH)(!!s);return s&&setTimeout((()=>{h.value=!1}),s),null!=a&&setTimeout((()=>{if(!o.value&&!c.value){const e=new Error(`Async component timed out after ${a}ms.`);t(e),c.value=e}}),a),p().then((()=>{o.value=!0,e.parent&&Le(e.parent.vnode)&&_(e.parent.update)})).catch((e=>{t(e),c.value=e})),()=>o.value&&u?Oe(u,e):c.value&&i?pn(i,{error:c.value}):n&&!h.value?pn(n):void 0}})}function Oe(e,{vnode:{ref:t,props:n,children:r}}){const o=pn(e,n,r);return o.ref=t,o}const Le=e=>e.type.__isKeepAlive,Re={name:"KeepAlive",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const n=Nn(),r=n.ctx;if(!r.renderer)return t.default;const i=new Map,s=new Set;let a=null;const l=n.suspense,{renderer:{p:c,m:u,um:d,o:{createElement:f}}}=r,h=f("div");function p(e){Pe(e),d(e,n,l,!0)}function m(e){i.forEach(((t,n)=>{const r=Qn(t.type);!r||e&&e(r)||v(n)}))}function v(e){const t=i.get(e);a&&t.type===a.type?a&&Pe(a):p(t),i.delete(e),s.delete(e)}r.activate=(e,t,n,r,i)=>{const s=e.component;u(e,t,n,0,l),c(s.vnode,e,t,n,s,l,r,e.slotScopeIds,i),Ot((()=>{s.isDeactivated=!1,s.a&&(0,o.ir)(s.a);const t=e.props&&e.props.onVnodeMounted;t&&En(t,s.parent,e)}),l)},r.deactivate=e=>{const t=e.component;u(e,h,null,1,l),Ot((()=>{t.da&&(0,o.ir)(t.da);const n=e.props&&e.props.onVnodeUnmounted;n&&En(n,t.parent,e),t.isDeactivated=!0}),l)},de((()=>[e.include,e.exclude]),(([e,t])=>{e&&m((t=>De(e,t))),t&&m((e=>!De(t,e)))}),{flush:"post",deep:!0});let g=null;const b=()=>{null!=g&&i.set(g,He(n.subTree))};return Be(b),Ve(b),qe((()=>{i.forEach((e=>{const{subTree:t,suspense:r}=n,o=He(t);if(e.type!==o.type)p(e);else{Pe(o);const e=o.component.da;e&&Ot(e,r)}}))})),()=>{if(g=null,!t.default)return null;const n=t.default(),r=n[0];if(n.length>1)return a=null,n;if(!an(r)||!(4&r.shapeFlag||128&r.shapeFlag))return a=null,r;let o=He(r);const l=o.type,c=Qn(_e(o)?o.type.__asyncResolved||{}:l),{include:u,exclude:d,max:f}=e;if(u&&(!c||!De(u,c))||d&&c&&De(d,c))return a=o,r;const h=null==o.key?l:o.key,p=i.get(h);return o.el&&(o=vn(o),128&r.shapeFlag&&(r.ssContent=o)),g=h,p?(o.el=p.el,o.component=p.component,o.transition&&Se(o,o.transition),o.shapeFlag|=512,s.delete(h),s.add(h)):(s.add(h),f&&s.size>parseInt(f,10)&&v(s.values().next().value)),o.shapeFlag|=256,a=o,r}}};function De(e,t){return(0,o.kJ)(e)?e.some((e=>De(e,t))):(0,o.HD)(e)?e.split(",").includes(t):!!e.test&&e.test(t)}function Ae(e,t){Me(e,"a",t)}function Ie(e,t){Me(e,"da",t)}function Me(e,t,n=Hn){const r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Ne(t,r,n),n){let e=n.parent;for(;e&&e.parent;)Le(e.parent.vnode)&&Fe(r,t,n,e),e=e.parent}}function Fe(e,t,n,r){const i=Ne(t,e,r,!0);$e((()=>{(0,o.Od)(r[t],i)}),n)}function Pe(e){let t=e.shapeFlag;256&t&&(t-=256),512&t&&(t-=512),e.shapeFlag=t}function He(e){return 128&e.shapeFlag?e.ssContent:e}function Ne(e,t,n=Hn,o=!1){if(n){const i=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;(0,r.Jd)(),jn(n);const i=u(t,n,e,o);return Wn(),(0,r.lk)(),i});return o?i.unshift(s):i.push(s),s}}const je=e=>(t,n=Hn)=>(!qn||"sp"===e)&&Ne(e,t,n),We=je("bm"),Be=je("m"),ze=je("bu"),Ve=je("u"),qe=je("bum"),$e=je("um"),Ue=je("sp"),Ze=je("rtg"),Ye=je("rtc");function Ge(e,t=Hn){Ne("ec",e,t)}let Je=!0;function Ke(e,t,n){u((0,o.kJ)(e)?e.map((e=>e.bind(t.proxy))):e.bind(t.proxy),t,n)}function Xe(e,t,n,r){const i=r.includes(".")?pe(n,r):()=>n[r];if((0,o.HD)(e)){const n=t[e];(0,o.mf)(n)&&de(i,n)}else if((0,o.mf)(e))de(i,e.bind(n));else if((0,o.Kn)(e))if((0,o.kJ)(e))e.forEach((e=>Xe(e,t,n,r)));else{const r=(0,o.mf)(e.handler)?e.handler.bind(n):t[e.handler];(0,o.mf)(r)&&de(i,r,e)}}function Qe(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:i,config:{optionMergeStrategies:s}}=e.appContext,a=i.get(t);let l;return a?l=a:o.length||n||r?(l={},o.length&&o.forEach((e=>et(l,e,s,!0))),et(l,t,s)):l=t,i.set(t,l),l}function et(e,t,n,r=!1){const{mixins:o,extends:i}=t;i&&et(e,i,n,!0),o&&o.forEach((t=>et(e,t,n,!0)));for(const o in t)if(r&&"expose"===o);else{const r=tt[o]||n&&n[o];e[o]=r?r(e[o],t[o]):t[o]}return e}const tt={data:nt,props:it,emits:it,methods:it,computed:it,beforeCreate:ot,created:ot,beforeMount:ot,mounted:ot,beforeUpdate:ot,updated:ot,beforeDestroy:ot,beforeUnmount:ot,destroyed:ot,unmounted:ot,activated:ot,deactivated:ot,errorCaptured:ot,serverPrefetch:ot,components:it,directives:it,watch:function(e,t){if(!e)return t;if(!t)return e;const n=(0,o.l7)(Object.create(null),e);for(const r in t)n[r]=ot(e[r],t[r]);return n},provide:nt,inject:function(e,t){return it(rt(e),rt(t))}};function nt(e,t){return t?e?function(){return(0,o.l7)((0,o.mf)(e)?e.call(this,this):e,(0,o.mf)(t)?t.call(this,this):t)}:t:e}function rt(e){if((0,o.kJ)(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function ot(e,t){return e?[...new Set([].concat(e,t))]:t}function it(e,t){return e?(0,o.l7)((0,o.l7)(Object.create(null),e),t):t}function st(e,t,n,i){const[s,a]=e.propsOptions;let l,c=!1;if(t)for(let r in t){if((0,o.Gg)(r))continue;const u=t[r];let d;s&&(0,o.RI)(s,d=(0,o._A)(r))?a&&a.includes(d)?(l||(l={}))[d]=u:n[d]=u:W(e.emitsOptions,r)||r in i&&u===i[r]||(i[r]=u,c=!0)}if(a){const t=(0,r.IU)(n),i=l||o.kT;for(let r=0;r<a.length;r++){const l=a[r];n[l]=at(s,t,l,i[l],e,!(0,o.RI)(i,l))}}return c}function at(e,t,n,r,i,s){const a=e[n];if(null!=a){const e=(0,o.RI)(a,"default");if(e&&void 0===r){const e=a.default;if(a.type!==Function&&(0,o.mf)(e)){const{propsDefaults:o}=i;n in o?r=o[n]:(jn(i),r=o[n]=e.call(null,t),Wn())}else r=e}a[0]&&(s&&!e?r=!1:!a[1]||""!==r&&r!==(0,o.rs)(n)||(r=!0))}return r}function lt(e,t,n=!1){const r=t.propsCache,i=r.get(e);if(i)return i;const s=e.props,a={},l=[];let c=!1;if(!(0,o.mf)(e)){const r=e=>{c=!0;const[n,r]=lt(e,t,!0);(0,o.l7)(a,n),r&&l.push(...r)};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}if(!s&&!c)return r.set(e,o.Z6),o.Z6;if((0,o.kJ)(s))for(let e=0;e<s.length;e++){const t=(0,o._A)(s[e]);ct(t)&&(a[t]=o.kT)}else if(s)for(const e in s){const t=(0,o._A)(e);if(ct(t)){const n=s[e],r=a[t]=(0,o.kJ)(n)||(0,o.mf)(n)?{type:n}:n;if(r){const e=ft(Boolean,r.type),n=ft(String,r.type);r[0]=e>-1,r[1]=n<0||e<n,(e>-1||(0,o.RI)(r,"default"))&&l.push(t)}}}const u=[a,l];return r.set(e,u),u}function ct(e){return"$"!==e[0]}function ut(e){const t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:null===e?"null":""}function dt(e,t){return ut(e)===ut(t)}function ft(e,t){return(0,o.kJ)(t)?t.findIndex((t=>dt(t,e))):(0,o.mf)(t)&&dt(t,e)?0:-1}const ht=e=>"_"===e[0]||"$stable"===e,pt=e=>(0,o.kJ)(e)?e.map(wn):[wn(e)],mt=(e,t,n)=>{const r=Z(((...e)=>pt(t(...e))),n);return r._c=!1,r},vt=(e,t,n)=>{const r=e._ctx;for(const n in e){if(ht(n))continue;const i=e[n];if((0,o.mf)(i))t[n]=mt(0,i,r);else if(null!=i){const e=pt(i);t[n]=()=>e}}},gt=(e,t)=>{const n=pt(t);e.slots.default=()=>n};function bt(e,t){if(null===B)return e;const n=B.proxy,r=e.dirs||(e.dirs=[]);for(let e=0;e<t.length;e++){let[i,s,a,l=o.kT]=t[e];(0,o.mf)(i)&&(i={mounted:i,updated:i}),i.deep&&me(s),r.push({dir:i,instance:n,value:s,oldValue:void 0,arg:a,modifiers:l})}return e}function yt(e,t,n,o){const i=e.dirs,s=t&&t.dirs;for(let a=0;a<i.length;a++){const l=i[a];s&&(l.oldValue=s[a].value);let c=l.dir[o];c&&((0,r.Jd)(),u(c,n,8,[e.el,l,e,t]),(0,r.lk)())}}function wt(){return{app:null,config:{isNativeTag:o.NO,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let xt=0;function kt(e,t){return function(n,r=null){null==r||(0,o.Kn)(r)||(r=null);const i=wt(),s=new Set;let a=!1;const l=i.app={_uid:xt++,_component:n,_props:r,_container:null,_context:i,_instance:null,version:br,get config(){return i.config},set config(e){},use:(e,...t)=>(s.has(e)||(e&&(0,o.mf)(e.install)?(s.add(e),e.install(l,...t)):(0,o.mf)(e)&&(s.add(e),e(l,...t))),l),mixin:e=>(i.mixins.includes(e)||i.mixins.push(e),l),component:(e,t)=>t?(i.components[e]=t,l):i.components[e],directive:(e,t)=>t?(i.directives[e]=t,l):i.directives[e],mount(o,s,c){if(!a){const u=pn(n,r);return u.appContext=i,s&&t?t(u,o):e(u,o,c),a=!0,l._container=o,o.__vue_app__=l,Kn(u.component)||u.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide:(e,t)=>(i.provides[e]=t,l)};return l}}function St(e,t,n,i,s=!1){if((0,o.kJ)(e))return void e.forEach(((e,r)=>St(e,t&&((0,o.kJ)(t)?t[r]:t),n,i,s)));if(_e(i)&&!s)return;const a=4&i.shapeFlag?Kn(i.component)||i.component.proxy:i.el,l=s?null:a,{i:u,r:d}=e,f=t&&t.r,h=u.refs===o.kT?u.refs={}:u.refs,p=u.setupState;if(null!=f&&f!==d&&((0,o.HD)(f)?(h[f]=null,(0,o.RI)(p,f)&&(p[f]=null)):(0,r.dq)(f)&&(f.value=null)),(0,o.mf)(d))c(d,u,12,[l,h]);else{const t=(0,o.HD)(d),i=(0,r.dq)(d);if(t||i){const i=()=>{if(e.f){const n=t?h[d]:d.value;s?(0,o.kJ)(n)&&(0,o.Od)(n,a):(0,o.kJ)(n)?n.includes(a)||n.push(a):t?h[d]=[a]:(d.value=[a],e.k&&(h[e.k]=d.value))}else t?(h[d]=l,(0,o.RI)(p,d)&&(p[d]=l)):(0,r.dq)(d)&&(d.value=l,e.k&&(h[e.k]=l))};l?(i.id=-1,Ot(i,n)):i()}}}let Et=!1;const Ct=e=>/svg/.test(e.namespaceURI)&&"foreignObject"!==e.tagName,_t=e=>8===e.nodeType;function Tt(e){const{mt:t,p:n,o:{patchProp:r,nextSibling:i,parentNode:s,remove:a,insert:l,createComment:c}}=e,u=(n,r,o,a,l,c=!1)=>{const v=_t(n)&&"["===n.data,g=()=>p(n,r,o,a,l,v),{type:b,ref:y,shapeFlag:w}=r,x=n.nodeType;r.el=n;let k=null;switch(b){case Zt:3!==x?k=g():(n.data!==r.children&&(Et=!0,n.data=r.children),k=i(n));break;case Yt:k=8!==x||v?g():i(n);break;case Gt:if(1===x){k=n;const e=!r.children.length;for(let t=0;t<r.staticCount;t++)e&&(r.children+=k.outerHTML),t===r.staticCount-1&&(r.anchor=k),k=i(k);return k}k=g();break;case Ut:k=v?h(n,r,o,a,l,c):g();break;default:if(1&w)k=1!==x||r.type.toLowerCase()!==n.tagName.toLowerCase()?g():d(n,r,o,a,l,c);else if(6&w){r.slotScopeIds=l;const e=s(n);if(t(r,e,null,o,a,Ct(e),c),k=v?m(n):i(n),_e(r)){let t;v?(t=pn(Ut),t.anchor=k?k.previousSibling:e.lastChild):t=3===n.nodeType?gn(""):pn("div"),t.el=n,r.component.subTree=t}}else 64&w?k=8!==x?g():r.type.hydrate(n,r,o,a,l,c,e,f):128&w&&(k=r.type.hydrate(n,r,o,a,Ct(s(n)),l,c,e,u))}return null!=y&&St(y,null,a,r),k},d=(e,t,n,i,s,l)=>{l=l||!!t.dynamicChildren;const{type:c,props:u,patchFlag:d,shapeFlag:h,dirs:p}=t,m="input"===c&&p||"option"===c;if(m||-1!==d){if(p&&yt(t,null,n,"created"),u)if(m||!l||48&d)for(const t in u)(m&&t.endsWith("value")||(0,o.F7)(t)&&!(0,o.Gg)(t))&&r(e,t,null,u[t],!1,void 0,n);else u.onClick&&r(e,"onClick",null,u.onClick,!1,void 0,n);let c;if((c=u&&u.onVnodeBeforeMount)&&En(c,n,t),p&&yt(t,null,n,"beforeMount"),((c=u&&u.onVnodeMounted)||p)&&re((()=>{c&&En(c,n,t),p&&yt(t,null,n,"mounted")}),i),16&h&&(!u||!u.innerHTML&&!u.textContent)){let r=f(e.firstChild,t,e,n,i,s,l);for(;r;){Et=!0;const e=r;r=r.nextSibling,a(e)}}else 8&h&&e.textContent!==t.children&&(Et=!0,e.textContent=t.children)}return e.nextSibling},f=(e,t,r,o,i,s,a)=>{a=a||!!t.dynamicChildren;const l=t.children,c=l.length;for(let t=0;t<c;t++){const c=a?l[t]:l[t]=wn(l[t]);if(e)e=u(e,c,o,i,s,a);else{if(c.type===Zt&&!c.children)continue;Et=!0,n(null,c,r,null,o,i,Ct(r),s)}}return e},h=(e,t,n,r,o,a)=>{const{slotScopeIds:u}=t;u&&(o=o?o.concat(u):u);const d=s(e),h=f(i(e),t,d,n,r,o,a);return h&&_t(h)&&"]"===h.data?i(t.anchor=h):(Et=!0,l(t.anchor=c("]"),d,h),h)},p=(e,t,r,o,l,c)=>{if(Et=!0,t.el=null,c){const t=m(e);for(;;){const n=i(e);if(!n||n===t)break;a(n)}}const u=i(e),d=s(e);return a(e),n(null,t,d,u,r,o,Ct(d),l),u},m=e=>{let t=0;for(;e;)if((e=i(e))&&_t(e)&&("["===e.data&&t++,"]"===e.data)){if(0===t)return i(e);t--}return e};return[(e,t)=>{if(!t.hasChildNodes())return n(null,e,t),void D();Et=!1,u(t.firstChild,e,null,null,null),D(),Et&&console.error("Hydration completed but contains mismatches.")},u]}const Ot=re;function Lt(e){return Dt(e)}function Rt(e){return Dt(e,Tt)}function Dt(e,t){(0,o.E9)().__VUE__=!0;const{insert:n,remove:i,patchProp:s,createElement:a,createText:l,createComment:c,setText:u,setElementText:d,parentNode:f,nextSibling:h,setScopeId:v=o.dG,cloneNode:g,insertStaticContent:b}=e,y=(e,t,n,r=null,o=null,i=null,s=!1,a=null,l=!!t.dynamicChildren)=>{if(e===t)return;e&&!ln(e,t)&&(r=J(e),q(e,o,i,!0),e=null),-2===t.patchFlag&&(l=!1,t.dynamicChildren=null);const{type:c,ref:u,shapeFlag:d}=t;switch(c){case Zt:w(e,t,n,r);break;case Yt:x(e,t,n,r);break;case Gt:null==e&&k(t,n,r,s);break;case Ut:I(e,t,n,r,o,i,s,a,l);break;default:1&d?S(e,t,n,r,o,i,s,a,l):6&d?M(e,t,n,r,o,i,s,a,l):(64&d||128&d)&&c.process(e,t,n,r,o,i,s,a,l,ee)}null!=u&&o&&St(u,e&&e.ref,i,t||e,!t)},w=(e,t,r,o)=>{if(null==e)n(t.el=l(t.children),r,o);else{const n=t.el=e.el;t.children!==e.children&&u(n,t.children)}},x=(e,t,r,o)=>{null==e?n(t.el=c(t.children||""),r,o):t.el=e.el},k=(e,t,n,r)=>{[e.el,e.anchor]=b(e.children,t,n,r,e.el,e.anchor)},S=(e,t,n,r,o,i,s,a,l)=>{s=s||"svg"===t.type,null==e?E(t,n,r,o,i,s,a,l):O(e,t,o,i,s,a,l)},E=(e,t,r,i,l,c,u,f)=>{let h,p;const{type:m,props:v,shapeFlag:b,transition:y,patchFlag:w,dirs:x}=e;if(e.el&&void 0!==g&&-1===w)h=e.el=g(e.el);else{if(h=e.el=a(e.type,c,v&&v.is,v),8&b?d(h,e.children):16&b&&T(e.children,h,null,i,l,c&&"foreignObject"!==m,u,f),x&&yt(e,null,i,"created"),v){for(const t in v)"value"===t||(0,o.Gg)(t)||s(h,t,null,v[t],c,e.children,i,l,G);"value"in v&&s(h,"value",null,v.value),(p=v.onVnodeBeforeMount)&&En(p,i,e)}C(h,e,e.scopeId,u,i)}x&&yt(e,null,i,"beforeMount");const k=(!l||l&&!l.pendingBranch)&&y&&!y.persisted;k&&y.beforeEnter(h),n(h,t,r),((p=v&&v.onVnodeMounted)||k||x)&&Ot((()=>{p&&En(p,i,e),k&&y.enter(h),x&&yt(e,null,i,"mounted")}),l)},C=(e,t,n,r,o)=>{if(n&&v(e,n),r)for(let t=0;t<r.length;t++)v(e,r[t]);if(o&&t===o.subTree){const t=o.vnode;C(e,t,t.scopeId,t.slotScopeIds,o.parent)}},T=(e,t,n,r,o,i,s,a,l=0)=>{for(let c=l;c<e.length;c++){const l=e[c]=a?xn(e[c]):wn(e[c]);y(null,l,t,n,r,o,i,s,a)}},O=(e,t,n,r,i,a,l)=>{const c=t.el=e.el;let{patchFlag:u,dynamicChildren:f,dirs:h}=t;u|=16&e.patchFlag;const p=e.props||o.kT,m=t.props||o.kT;let v;n&&At(n,!1),(v=m.onVnodeBeforeUpdate)&&En(v,n,t,e),h&&yt(t,e,n,"beforeUpdate"),n&&At(n,!0);const g=i&&"foreignObject"!==t.type;if(f?L(e.dynamicChildren,f,c,n,r,g,a):l||j(e,t,c,null,n,r,g,a,!1),u>0){if(16&u)A(c,t,p,m,n,r,i);else if(2&u&&p.class!==m.class&&s(c,"class",null,m.class,i),4&u&&s(c,"style",p.style,m.style,i),8&u){const o=t.dynamicProps;for(let t=0;t<o.length;t++){const a=o[t],l=p[a],u=m[a];u===l&&"value"!==a||s(c,a,l,u,i,e.children,n,r,G)}}1&u&&e.children!==t.children&&d(c,t.children)}else l||null!=f||A(c,t,p,m,n,r,i);((v=m.onVnodeUpdated)||h)&&Ot((()=>{v&&En(v,n,t,e),h&&yt(t,e,n,"updated")}),r)},L=(e,t,n,r,o,i,s)=>{for(let a=0;a<t.length;a++){const l=e[a],c=t[a],u=l.el&&(l.type===Ut||!ln(l,c)||70&l.shapeFlag)?f(l.el):n;y(l,c,u,null,r,o,i,s,!0)}},A=(e,t,n,r,i,a,l)=>{if(n!==r){for(const c in r){if((0,o.Gg)(c))continue;const u=r[c],d=n[c];u!==d&&"value"!==c&&s(e,c,d,u,l,t.children,i,a,G)}if(n!==o.kT)for(const c in n)(0,o.Gg)(c)||c in r||s(e,c,n[c],null,l,t.children,i,a,G);"value"in r&&s(e,"value",n.value,r.value)}},I=(e,t,r,o,i,s,a,c,u)=>{const d=t.el=e?e.el:l(""),f=t.anchor=e?e.anchor:l("");let{patchFlag:h,dynamicChildren:p,slotScopeIds:m}=t;m&&(c=c?c.concat(m):m),null==e?(n(d,r,o),n(f,r,o),T(t.children,r,f,i,s,a,c,u)):h>0&&64&h&&p&&e.dynamicChildren?(L(e.dynamicChildren,p,r,i,s,a,c),(null!=t.key||i&&t===i.subTree)&&It(e,t,!0)):j(e,t,r,f,i,s,a,c,u)},M=(e,t,n,r,o,i,s,a,l)=>{t.slotScopeIds=a,null==e?512&t.shapeFlag?o.ctx.activate(t,n,r,s,l):F(t,n,r,o,i,s,l):P(e,t,l)},F=(e,t,n,r,o,i,s)=>{const a=e.component=Pn(e,r,o);if(Le(e)&&(a.ctx.renderer=ee),$n(a),a.asyncDep){if(o&&o.registerDep(a,H),!e.el){const e=a.subTree=pn(Yt);x(null,e,t,n)}}else H(a,e,t,n,o,i,s)},P=(e,t,n)=>{const r=t.component=e.component;if(function(e,t,n){const{props:r,children:o,component:i}=e,{props:s,children:a,patchFlag:l}=t,c=i.emitsOptions;if(t.dirs||t.transition)return!0;if(!(n&&l>=0))return!(!o&&!a||a&&a.$stable)||r!==s&&(r?!s||K(r,s,c):!!s);if(1024&l)return!0;if(16&l)return r?K(r,s,c):!!s;if(8&l){const e=t.dynamicProps;for(let t=0;t<e.length;t++){const n=e[t];if(s[n]!==r[n]&&!W(c,n))return!0}}return!1}(e,t,n)){if(r.asyncDep&&!r.asyncResolved)return void N(r,t,n);r.next=t,function(e){const t=p.indexOf(e);t>m&&p.splice(t,1)}(r.update),r.update()}else t.component=e.component,t.el=e.el,r.vnode=t},H=(e,t,n,i,s,a,l)=>{const c=e.effect=new r.qq((()=>{if(e.isMounted){let t,{next:n,bu:r,u:i,parent:c,vnode:u}=e,d=n;At(e,!1),n?(n.el=u.el,N(e,n,l)):n=u,r&&(0,o.ir)(r),(t=n.props&&n.props.onVnodeBeforeUpdate)&&En(t,c,n,u),At(e,!0);const h=Y(e),p=e.subTree;e.subTree=h,y(p,h,f(p.el),J(p),e,s,a),n.el=h.el,null===d&&X(e,h.el),i&&Ot(i,s),(t=n.props&&n.props.onVnodeUpdated)&&Ot((()=>En(t,c,n,u)),s)}else{let r;const{el:l,props:c}=t,{bm:u,m:d,parent:f}=e,h=_e(t);if(At(e,!1),u&&(0,o.ir)(u),!h&&(r=c&&c.onVnodeBeforeMount)&&En(r,f,t),At(e,!0),l&&ne){const n=()=>{e.subTree=Y(e),ne(l,e.subTree,e,s,null)};h?t.type.__asyncLoader().then((()=>!e.isUnmounted&&n())):n()}else{const r=e.subTree=Y(e);y(null,r,n,i,e,s,a),t.el=r.el}if(d&&Ot(d,s),!h&&(r=c&&c.onVnodeMounted)){const e=t;Ot((()=>En(r,f,e)),s)}256&t.shapeFlag&&e.a&&Ot(e.a,s),e.isMounted=!0,t=n=i=null}}),(()=>_(e.update)),e.scope),u=e.update=c.run.bind(c);u.id=e.uid,At(e,!0),u()},N=(e,t,n)=>{t.component=e;const i=e.vnode.props;e.vnode=t,e.next=null,function(e,t,n,i){const{props:s,attrs:a,vnode:{patchFlag:l}}=e,c=(0,r.IU)(s),[u]=e.propsOptions;let d=!1;if(!(i||l>0)||16&l){let r;st(e,t,s,a)&&(d=!0);for(const i in c)t&&((0,o.RI)(t,i)||(r=(0,o.rs)(i))!==i&&(0,o.RI)(t,r))||(u?!n||void 0===n[i]&&void 0===n[r]||(s[i]=at(u,c,i,void 0,e,!0)):delete s[i]);if(a!==c)for(const e in a)t&&(0,o.RI)(t,e)||(delete a[e],d=!0)}else if(8&l){const n=e.vnode.dynamicProps;for(let r=0;r<n.length;r++){let i=n[r];const l=t[i];if(u)if((0,o.RI)(a,i))l!==a[i]&&(a[i]=l,d=!0);else{const t=(0,o._A)(i);s[t]=at(u,c,t,l,e,!1)}else l!==a[i]&&(a[i]=l,d=!0)}}d&&(0,r.X$)(e,"set","$attrs")}(e,t.props,i,n),((e,t,n)=>{const{vnode:r,slots:i}=e;let s=!0,a=o.kT;if(32&r.shapeFlag){const e=t._;e?n&&1===e?s=!1:((0,o.l7)(i,t),n||1!==e||delete i._):(s=!t.$stable,vt(t,i)),a=t}else t&&(gt(e,t),a={default:1});if(s)for(const e in i)ht(e)||e in a||delete i[e]})(e,t.children,n),(0,r.Jd)(),R(void 0,e.update),(0,r.lk)()},j=(e,t,n,r,o,i,s,a,l=!1)=>{const c=e&&e.children,u=e?e.shapeFlag:0,f=t.children,{patchFlag:h,shapeFlag:p}=t;if(h>0){if(128&h)return void z(c,f,n,r,o,i,s,a,l);if(256&h)return void B(c,f,n,r,o,i,s,a,l)}8&p?(16&u&&G(c,o,i),f!==c&&d(n,f)):16&u?16&p?z(c,f,n,r,o,i,s,a,l):G(c,o,i,!0):(8&u&&d(n,""),16&p&&T(f,n,r,o,i,s,a,l))},B=(e,t,n,r,i,s,a,l,c)=>{e=e||o.Z6,t=t||o.Z6;const u=e.length,d=t.length,f=Math.min(u,d);let h;for(h=0;h<f;h++){const r=t[h]=c?xn(t[h]):wn(t[h]);y(e[h],r,n,null,i,s,a,l,c)}u>d?G(e,i,s,!0,!1,f):T(t,n,r,i,s,a,l,c,f)},z=(e,t,n,r,i,s,a,l,c)=>{let u=0;const d=t.length;let f=e.length-1,h=d-1;for(;u<=f&&u<=h;){const r=e[u],o=t[u]=c?xn(t[u]):wn(t[u]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),u++}for(;u<=f&&u<=h;){const r=e[f],o=t[h]=c?xn(t[h]):wn(t[h]);if(!ln(r,o))break;y(r,o,n,null,i,s,a,l,c),f--,h--}if(u>f){if(u<=h){const e=h+1,o=e<d?t[e].el:r;for(;u<=h;)y(null,t[u]=c?xn(t[u]):wn(t[u]),n,o,i,s,a,l,c),u++}}else if(u>h)for(;u<=f;)q(e[u],i,s,!0),u++;else{const p=u,m=u,v=new Map;for(u=m;u<=h;u++){const e=t[u]=c?xn(t[u]):wn(t[u]);null!=e.key&&v.set(e.key,u)}let g,b=0;const w=h-m+1;let x=!1,k=0;const S=new Array(w);for(u=0;u<w;u++)S[u]=0;for(u=p;u<=f;u++){const r=e[u];if(b>=w){q(r,i,s,!0);continue}let o;if(null!=r.key)o=v.get(r.key);else for(g=m;g<=h;g++)if(0===S[g-m]&&ln(r,t[g])){o=g;break}void 0===o?q(r,i,s,!0):(S[o-m]=u+1,o>=k?k=o:x=!0,y(r,t[o],n,null,i,s,a,l,c),b++)}const E=x?function(e){const t=e.slice(),n=[0];let r,o,i,s,a;const l=e.length;for(r=0;r<l;r++){const l=e[r];if(0!==l){if(o=n[n.length-1],e[o]<l){t[r]=o,n.push(r);continue}for(i=0,s=n.length-1;i<s;)a=i+s>>1,e[n[a]]<l?i=a+1:s=a;l<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,s=n[i-1];i-- >0;)n[i]=s,s=t[s];return n}(S):o.Z6;for(g=E.length-1,u=w-1;u>=0;u--){const e=m+u,o=t[e],f=e+1<d?t[e+1].el:r;0===S[u]?y(null,o,n,f,i,s,a,l,c):x&&(g<0||u!==E[g]?V(o,n,f,2):g--)}}},V=(e,t,r,o,i=null)=>{const{el:s,type:a,transition:l,children:c,shapeFlag:u}=e;if(6&u)V(e.component.subTree,t,r,o);else if(128&u)e.suspense.move(t,r,o);else if(64&u)a.move(e,t,r,ee);else if(a!==Ut)if(a!==Gt)if(2!==o&&1&u&&l)if(0===o)l.beforeEnter(s),n(s,t,r),Ot((()=>l.enter(s)),i);else{const{leave:e,delayLeave:o,afterLeave:i}=l,a=()=>n(s,t,r),c=()=>{e(s,(()=>{a(),i&&i()}))};o?o(s,a,c):c()}else n(s,t,r);else(({el:e,anchor:t},r,o)=>{let i;for(;e&&e!==t;)i=h(e),n(e,r,o),e=i;n(t,r,o)})(e,t,r);else{n(s,t,r);for(let e=0;e<c.length;e++)V(c[e],t,r,o);n(e.anchor,t,r)}},q=(e,t,n,r=!1,o=!1)=>{const{type:i,props:s,ref:a,children:l,dynamicChildren:c,shapeFlag:u,patchFlag:d,dirs:f}=e;if(null!=a&&St(a,null,n,e,!0),256&u)return void t.ctx.deactivate(e);const h=1&u&&f,p=!_e(e);let m;if(p&&(m=s&&s.onVnodeBeforeUnmount)&&En(m,t,e),6&u)Z(e.component,n,r);else{if(128&u)return void e.suspense.unmount(n,r);h&&yt(e,null,t,"beforeUnmount"),64&u?e.type.remove(e,t,n,o,ee,r):c&&(i!==Ut||d>0&&64&d)?G(c,t,n,!1,!0):(i===Ut&&384&d||!o&&16&u)&&G(l,t,n),r&&$(e)}(p&&(m=s&&s.onVnodeUnmounted)||h)&&Ot((()=>{m&&En(m,t,e),h&&yt(e,null,t,"unmounted")}),n)},$=e=>{const{type:t,el:n,anchor:r,transition:o}=e;if(t===Ut)return void U(n,r);if(t===Gt)return void(({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),i(e),e=n;i(t)})(e);const s=()=>{i(n),o&&!o.persisted&&o.afterLeave&&o.afterLeave()};if(1&e.shapeFlag&&o&&!o.persisted){const{leave:t,delayLeave:r}=o,i=()=>t(n,s);r?r(e.el,s,i):i()}else s()},U=(e,t)=>{let n;for(;e!==t;)n=h(e),i(e),e=n;i(t)},Z=(e,t,n)=>{const{bum:r,scope:i,update:s,subTree:a,um:l}=e;r&&(0,o.ir)(r),i.stop(),s&&(s.active=!1,q(a,e,t,n)),l&&Ot(l,t),Ot((()=>{e.isUnmounted=!0}),t),t&&t.pendingBranch&&!t.isUnmounted&&e.asyncDep&&!e.asyncResolved&&e.suspenseId===t.pendingId&&(t.deps--,0===t.deps&&t.resolve())},G=(e,t,n,r=!1,o=!1,i=0)=>{for(let s=i;s<e.length;s++)q(e[s],t,n,r,o)},J=e=>6&e.shapeFlag?J(e.component.subTree):128&e.shapeFlag?e.suspense.next():h(e.anchor||e.el),Q=(e,t,n)=>{null==e?t._vnode&&q(t._vnode,null,null,!0):y(t._vnode||null,e,t,null,null,null,n),D(),t._vnode=e},ee={p:y,um:q,m:V,r:$,mt:F,mc:T,pc:j,pbc:L,n:J,o:e};let te,ne;return t&&([te,ne]=t(ee)),{render:Q,hydrate:te,createApp:kt(Q,te)}}function At({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function It(e,t,n=!1){const r=e.children,i=t.children;if((0,o.kJ)(r)&&(0,o.kJ)(i))for(let e=0;e<r.length;e++){const t=r[e];let o=i[e];1&o.shapeFlag&&!o.dynamicChildren&&((o.patchFlag<=0||32===o.patchFlag)&&(o=i[e]=xn(i[e]),o.el=t.el),n||It(t,o))}}const Mt=e=>e&&(e.disabled||""===e.disabled),Ft=e=>"undefined"!=typeof SVGElement&&e instanceof SVGElement,Pt=(e,t)=>{const n=e&&e.to;if((0,o.HD)(n)){if(t){return t(n)}return null}return n};function Ht(e,t,n,{o:{insert:r},m:o},i=2){0===i&&r(e.targetAnchor,t,n);const{el:s,anchor:a,shapeFlag:l,children:c,props:u}=e,d=2===i;if(d&&r(s,t,n),(!d||Mt(u))&&16&l)for(let e=0;e<c.length;e++)o(c[e],t,n,2);d&&r(a,t,n)}const Nt={__isTeleport:!0,process(e,t,n,r,o,i,s,a,l,c){const{mc:u,pc:d,pbc:f,o:{insert:h,querySelector:p,createText:m,createComment:v}}=c,g=Mt(t.props);let{shapeFlag:b,children:y,dynamicChildren:w}=t;if(null==e){const e=t.el=m(""),c=t.anchor=m("");h(e,n,r),h(c,n,r);const d=t.target=Pt(t.props,p),f=t.targetAnchor=m("");d&&(h(f,d),s=s||Ft(d));const v=(e,t)=>{16&b&&u(y,e,t,o,i,s,a,l)};g?v(n,c):d&&v(d,f)}else{t.el=e.el;const r=t.anchor=e.anchor,u=t.target=e.target,h=t.targetAnchor=e.targetAnchor,m=Mt(e.props),v=m?n:u,b=m?r:h;if(s=s||Ft(u),w?(f(e.dynamicChildren,w,v,o,i,s,a),It(e,t,!0)):l||d(e,t,v,b,o,i,s,a,!1),g)m||Ht(t,n,r,c,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const e=t.target=Pt(t.props,p);e&&Ht(t,e,null,c,0)}else m&&Ht(t,u,h,c,1)}},remove(e,t,n,r,{um:o,o:{remove:i}},s){const{shapeFlag:a,children:l,anchor:c,targetAnchor:u,target:d,props:f}=e;if(d&&i(u),(s||!Mt(f))&&(i(c),16&a))for(let e=0;e<l.length;e++){const r=l[e];o(r,t,n,!0,!!r.dynamicChildren)}},move:Ht,hydrate:function(e,t,n,r,o,i,{o:{nextSibling:s,parentNode:a,querySelector:l}},c){const u=t.target=Pt(t.props,l);if(u){const l=u._lpa||u.firstChild;16&t.shapeFlag&&(Mt(t.props)?(t.anchor=c(s(e),t,a(e),n,r,o,i),t.targetAnchor=l):(t.anchor=s(e),t.targetAnchor=c(l,t,u,n,r,o,i)),u._lpa=t.targetAnchor&&s(t.targetAnchor))}return t.anchor&&s(t.anchor)}},jt="components";function Wt(e,t){return qt(jt,e,!0,t)||e}const Bt=Symbol();function zt(e){return(0,o.HD)(e)?qt(jt,e,!1)||e:e||Bt}function Vt(e){return qt("directives",e)}function qt(e,t,n=!0,r=!1){const i=B||Hn;if(i){const n=i.type;if(e===jt){const e=Qn(n);if(e&&(e===t||e===(0,o._A)(t)||e===(0,o.kC)((0,o._A)(t))))return n}const s=$t(i[e]||n[e],t)||$t(i.appContext[e],t);return!s&&r?n:s}}function $t(e,t){return e&&(e[t]||e[(0,o._A)(t)]||e[(0,o.kC)((0,o._A)(t))])}const Ut=Symbol(void 0),Zt=Symbol(void 0),Yt=Symbol(void 0),Gt=Symbol(void 0),Jt=[];let Kt=null;function Xt(e=!1){Jt.push(Kt=e?null:[])}function Qt(){Jt.pop(),Kt=Jt[Jt.length-1]||null}let en,tn=1;function nn(e){tn+=e}function rn(e){return e.dynamicChildren=tn>0?Kt||o.Z6:null,Qt(),tn>0&&Kt&&Kt.push(e),e}function on(e,t,n,r,o,i){return rn(hn(e,t,n,r,o,i,!0))}function sn(e,t,n,r,o){return rn(pn(e,t,n,r,o,!0))}function an(e){return!!e&&!0===e.__v_isVNode}function ln(e,t){return e.type===t.type&&e.key===t.key}function cn(e){en=e}const un="__vInternal",dn=({key:e})=>null!=e?e:null,fn=({ref:e,ref_key:t,ref_for:n})=>null!=e?(0,o.HD)(e)||(0,r.dq)(e)||(0,o.mf)(e)?{i:B,r:e,k:t,f:!!n}:e:null;function hn(e,t=null,n=null,r=0,i=null,s=(e===Ut?0:1),a=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&dn(t),ref:t&&fn(t),scopeId:z,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null};return l?(kn(c,n),128&s&&e.normalize(c)):n&&(c.shapeFlag|=(0,o.HD)(n)?8:16),tn>0&&!a&&Kt&&(c.patchFlag>0||6&s)&&32!==c.patchFlag&&Kt.push(c),c}const pn=function(e,t=null,n=null,i=0,s=null,a=!1){if(e&&e!==Bt||(e=Yt),an(e)){const r=vn(e,t,!0);return n&&kn(r,n),r}if(l=e,(0,o.mf)(l)&&"__vccOpts"in l&&(e=e.__vccOpts),t){t=mn(t);let{class:e,style:n}=t;e&&!(0,o.HD)(e)&&(t.class=(0,o.C_)(e)),(0,o.Kn)(n)&&((0,r.X3)(n)&&!(0,o.kJ)(n)&&(n=(0,o.l7)({},n)),t.style=(0,o.j5)(n))}var l;return hn(e,t,n,i,s,(0,o.HD)(e)?1:(e=>e.__isSuspense)(e)?128:(e=>e.__isTeleport)(e)?64:(0,o.Kn)(e)?4:(0,o.mf)(e)?2:0,a,!0)};function mn(e){return e?(0,r.X3)(e)||un in e?(0,o.l7)({},e):e:null}function vn(e,t,n=!1){const{props:r,ref:i,patchFlag:s,children:a}=e,l=t?Sn(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&dn(l),ref:t&&t.ref?n&&i?(0,o.kJ)(i)?i.concat(fn(t)):[i,fn(t)]:fn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ut?-1===s?16:16|s:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&vn(e.ssContent),ssFallback:e.ssFallback&&vn(e.ssFallback),el:e.el,anchor:e.anchor}}function gn(e=" ",t=0){return pn(Zt,null,e,t)}function bn(e,t){const n=pn(Gt,null,e);return n.staticCount=t,n}function yn(e="",t=!1){return t?(Xt(),sn(Yt,null,e)):pn(Yt,null,e)}function wn(e){return null==e||"boolean"==typeof e?pn(Yt):(0,o.kJ)(e)?pn(Ut,null,e.slice()):"object"==typeof e?xn(e):pn(Zt,null,String(e))}function xn(e){return null===e.el||e.memo?e:vn(e)}function kn(e,t){let n=0;const{shapeFlag:r}=e;if(null==t)t=null;else if((0,o.kJ)(t))n=16;else if("object"==typeof t){if(65&r){const n=t.default;return void(n&&(n._c&&(n._d=!1),kn(e,n()),n._c&&(n._d=!0)))}{n=32;const r=t._;r||un in t?3===r&&B&&(1===B.slots._?t._=1:(t._=2,e.patchFlag|=1024)):t._ctx=B}}else(0,o.mf)(t)?(t={default:t,_ctx:B},n=32):(t=String(t),64&r?(n=16,t=[gn(t)]):n=8);e.children=t,e.shapeFlag|=n}function Sn(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const e in r)if("class"===e)t.class!==r.class&&(t.class=(0,o.C_)([t.class,r.class]));else if("style"===e)t.style=(0,o.j5)([t.style,r.style]);else if((0,o.F7)(e)){const n=t[e],i=r[e];!i||n===i||(0,o.kJ)(n)&&n.includes(i)||(t[e]=n?[].concat(n,i):i)}else""!==e&&(t[e]=r[e])}return t}function En(e,t,n,r=null){u(e,t,7,[n,r])}function Cn(e,t,n,r){let i;const s=n&&n[r];if((0,o.kJ)(e)||(0,o.HD)(e)){i=new Array(e.length);for(let n=0,r=e.length;n<r;n++)i[n]=t(e[n],n,void 0,s&&s[n])}else if("number"==typeof e){i=new Array(e);for(let n=0;n<e;n++)i[n]=t(n+1,n,void 0,s&&s[n])}else if((0,o.Kn)(e))if(e[Symbol.iterator])i=Array.from(e,((e,n)=>t(e,n,void 0,s&&s[n])));else{const n=Object.keys(e);i=new Array(n.length);for(let r=0,o=n.length;r<o;r++){const o=n[r];i[r]=t(e[o],o,r,s&&s[r])}}else i=[];return n&&(n[r]=i),i}function _n(e,t){for(let n=0;n<t.length;n++){const r=t[n];if((0,o.kJ)(r))for(let t=0;t<r.length;t++)e[r[t].name]=r[t].fn;else r&&(e[r.name]=r.fn)}return e}function Tn(e,t,n={},r,o){if(B.isCE)return pn("slot","default"===t?null:{name:t},r&&r());let i=e[t];i&&i._c&&(i._d=!1),Xt();const s=i&&On(i(n)),a=sn(Ut,{key:n.key||`_${t}`},s||(r?r():[]),s&&1===e._?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),i&&i._c&&(i._d=!0),a}function On(e){return e.some((e=>!an(e)||e.type!==Yt&&!(e.type===Ut&&!On(e.children))))?e:null}function Ln(e){const t={};for(const n in e)t[(0,o.hR)(n)]=e[n];return t}const Rn=e=>e?Bn(e)?Kn(e)||e.proxy:Rn(e.parent):null,Dn=(0,o.l7)(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Rn(e.parent),$root:e=>Rn(e.root),$emit:e=>e.emit,$options:e=>Qe(e),$forceUpdate:e=>()=>_(e.update),$nextTick:e=>C.bind(e.proxy),$watch:e=>he.bind(e)}),An={get({_:e},t){const{ctx:n,setupState:i,data:s,props:a,accessCache:l,type:c,appContext:u}=e;let d;if("$"!==t[0]){const r=l[t];if(void 0!==r)switch(r){case 1:return i[t];case 2:return s[t];case 4:return n[t];case 3:return a[t]}else{if(i!==o.kT&&(0,o.RI)(i,t))return l[t]=1,i[t];if(s!==o.kT&&(0,o.RI)(s,t))return l[t]=2,s[t];if((d=e.propsOptions[0])&&(0,o.RI)(d,t))return l[t]=3,a[t];if(n!==o.kT&&(0,o.RI)(n,t))return l[t]=4,n[t];Je&&(l[t]=0)}}const f=Dn[t];let h,p;return f?("$attrs"===t&&(0,r.j)(e,"get",t),f(e)):(h=c.__cssModules)&&(h=h[t])?h:n!==o.kT&&(0,o.RI)(n,t)?(l[t]=4,n[t]):(p=u.config.globalProperties,(0,o.RI)(p,t)?p[t]:void 0)},set({_:e},t,n){const{data:r,setupState:i,ctx:s}=e;if(i!==o.kT&&(0,o.RI)(i,t))i[t]=n;else if(r!==o.kT&&(0,o.RI)(r,t))r[t]=n;else if((0,o.RI)(e.props,t))return!1;return!("$"===t[0]&&t.slice(1)in e||(s[t]=n,0))},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:i,propsOptions:s}},a){let l;return!!n[a]||e!==o.kT&&(0,o.RI)(e,a)||t!==o.kT&&(0,o.RI)(t,a)||(l=s[0])&&(0,o.RI)(l,a)||(0,o.RI)(r,a)||(0,o.RI)(Dn,a)||(0,o.RI)(i.config.globalProperties,a)}},In=(0,o.l7)({},An,{get(e,t){if(t!==Symbol.unscopables)return An.get(e,t,e)},has:(e,t)=>"_"!==t[0]&&!(0,o.e1)(t)}),Mn=wt();let Fn=0;function Pn(e,t,n){const i=e.type,s=(t?t.appContext:e.appContext)||Mn,a={uid:Fn++,vnode:e,type:i,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new r.Bj(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:lt(i,s),emitsOptions:j(i,s),emit:null,emitted:null,propsDefaults:o.kT,inheritAttrs:i.inheritAttrs,ctx:o.kT,data:o.kT,props:o.kT,attrs:o.kT,slots:o.kT,refs:o.kT,setupState:o.kT,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=N.bind(null,a),e.ce&&e.ce(a),a}let Hn=null;const Nn=()=>Hn||B,jn=e=>{Hn=e,e.scope.on()},Wn=()=>{Hn&&Hn.scope.off(),Hn=null};function Bn(e){return 4&e.vnode.shapeFlag}let zn,Vn,qn=!1;function $n(e,t=!1){qn=t;const{props:n,children:i}=e.vnode,s=Bn(e);!function(e,t,n,i=!1){const s={},a={};(0,o.Nj)(a,un,1),e.propsDefaults=Object.create(null),st(e,t,s,a);for(const t in e.propsOptions[0])t in s||(s[t]=void 0);n?e.props=i?s:(0,r.Um)(s):e.type.props?e.props=s:e.props=a,e.attrs=a}(e,n,s,t),((e,t)=>{if(32&e.vnode.shapeFlag){const n=t._;n?(e.slots=(0,r.IU)(t),(0,o.Nj)(t,"_",n)):vt(t,e.slots={})}else e.slots={},t&&gt(e,t);(0,o.Nj)(e.slots,un,1)})(e,i);const a=s?function(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=(0,r.Xl)(new Proxy(e.ctx,An));const{setup:i}=n;if(i){const n=e.setupContext=i.length>1?Jn(e):null;jn(e),(0,r.Jd)();const s=c(i,e,0,[e.props,n]);if((0,r.lk)(),Wn(),(0,o.tI)(s)){if(s.then(Wn,Wn),t)return s.then((n=>{Un(e,n,t)})).catch((t=>{d(t,e,0)}));e.asyncDep=s}else Un(e,s,t)}else Gn(e,t)}(e,t):void 0;return qn=!1,a}function Un(e,t,n){(0,o.mf)(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:(0,o.Kn)(t)&&(e.setupState=(0,r.WL)(t)),Gn(e,n)}function Zn(e){zn=e,Vn=e=>{e.render._rc&&(e.withProxy=new Proxy(e.ctx,In))}}const Yn=()=>!zn;function Gn(e,t,n){const i=e.type;if(!e.render){if(!t&&zn&&!i.render){const t=i.template;if(t){const{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:s,compilerOptions:a}=i,l=(0,o.l7)((0,o.l7)({isCustomElement:n,delimiters:s},r),a);i.render=zn(t,l)}}e.render=i.render||o.dG,Vn&&Vn(e)}jn(e),(0,r.Jd)(),function(e){const t=Qe(e),n=e.proxy,i=e.ctx;Je=!1,t.beforeCreate&&Ke(t.beforeCreate,e,"bc");const{data:s,computed:a,methods:l,watch:c,provide:u,inject:d,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:v,activated:g,deactivated:b,beforeDestroy:y,beforeUnmount:w,destroyed:x,unmounted:k,render:S,renderTracked:E,renderTriggered:C,errorCaptured:_,serverPrefetch:T,expose:O,inheritAttrs:L,components:R,directives:D,filters:A}=t;if(d&&function(e,t,n=o.dG,i=!1){(0,o.kJ)(e)&&(e=rt(e));for(const n in e){const s=e[n];let a;a=(0,o.Kn)(s)?"default"in s?se(s.from||n,s.default,!0):se(s.from||n):se(s),(0,r.dq)(a)&&i?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e}):t[n]=a}}(d,i,null,e.appContext.config.unwrapInjectedRef),l)for(const e in l){const t=l[e];(0,o.mf)(t)&&(i[e]=t.bind(n))}if(s){const t=s.call(n,n);(0,o.Kn)(t)&&(e.data=(0,r.qj)(t))}if(Je=!0,a)for(const e in a){const t=a[e],r=(0,o.mf)(t)?t.bind(n,n):(0,o.mf)(t.get)?t.get.bind(n,n):o.dG,s=!(0,o.mf)(t)&&(0,o.mf)(t.set)?t.set.bind(n):o.dG,l=tr({get:r,set:s});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>l.value,set:e=>l.value=e})}if(c)for(const e in c)Xe(c[e],i,n,e);if(u){const e=(0,o.mf)(u)?u.call(n):u;Reflect.ownKeys(e).forEach((t=>{ie(t,e[t])}))}function I(e,t){(0,o.kJ)(t)?t.forEach((t=>e(t.bind(n)))):t&&e(t.bind(n))}if(f&&Ke(f,e,"c"),I(We,h),I(Be,p),I(ze,m),I(Ve,v),I(Ae,g),I(Ie,b),I(Ge,_),I(Ye,E),I(Ze,C),I(qe,w),I($e,k),I(Ue,T),(0,o.kJ)(O))if(O.length){const t=e.exposed||(e.exposed={});O.forEach((e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t})}))}else e.exposed||(e.exposed={});S&&e.render===o.dG&&(e.render=S),null!=L&&(e.inheritAttrs=L),R&&(e.components=R),D&&(e.directives=D)}(e),(0,r.lk)(),Wn()}function Jn(e){let t;return{get attrs(){return t||(t=function(e){return new Proxy(e.attrs,{get:(t,n)=>((0,r.j)(e,"get","$attrs"),t[n])})}(e))},slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Kn(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy((0,r.WL)((0,r.Xl)(e.exposed)),{get:(t,n)=>n in t?t[n]:n in Dn?Dn[n](e):void 0}))}const Xn=/(?:^|[-_])(\w)/g;function Qn(e){return(0,o.mf)(e)&&e.displayName||e.name}function er(e,t,n=!1){let r=Qn(t);if(!r&&t.__file){const e=t.__file.match(/([^/\\]+)\.\w+$/);e&&(r=e[1])}if(!r&&e&&e.parent){const n=e=>{for(const n in e)if(e[n]===t)return n};r=n(e.components||e.parent.type.components)||n(e.appContext.components)}return r?r.replace(Xn,(e=>e.toUpperCase())).replace(/[-_]/g,""):n?"App":"Anonymous"}const tr=(e,t)=>(0,r.Fl)(e,t,qn);function nr(){return null}function rr(){return null}function or(e){}function ir(e,t){return null}function sr(){return lr().slots}function ar(){return lr().attrs}function lr(){const e=Nn();return e.setupContext||(e.setupContext=Jn(e))}function cr(e,t){const n=(0,o.kJ)(e)?e.reduce(((e,t)=>(e[t]={},e)),{}):e;for(const e in t){const r=n[e];r?(0,o.kJ)(r)||(0,o.mf)(r)?n[e]={type:r,default:t[e]}:r.default=t[e]:null===r&&(n[e]={default:t[e]})}return n}function ur(e,t){const n={};for(const r in e)t.includes(r)||Object.defineProperty(n,r,{enumerable:!0,get:()=>e[r]});return n}function dr(e){const t=Nn();let n=e();return Wn(),(0,o.tI)(n)&&(n=n.catch((e=>{throw jn(t),e}))),[n,()=>jn(t)]}function fr(e,t,n){const r=arguments.length;return 2===r?(0,o.Kn)(t)&&!(0,o.kJ)(t)?an(t)?pn(e,null,[t]):pn(e,t):pn(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):3===r&&an(n)&&(n=[n]),pn(e,t,n))}const hr=Symbol(""),pr=()=>{{const e=se(hr);return e||s("Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build."),e}};function mr(){}function vr(e,t,n,r){const o=n[r];if(o&&gr(o,e))return o;const i=t();return i.memo=e.slice(),n[r]=i}function gr(e,t){const n=e.memo;if(n.length!=t.length)return!1;for(let e=0;e<n.length;e++)if(n[e]!==t[e])return!1;return tn>0&&Kt&&Kt.push(e),!0}const br="3.2.30",yr={createComponentInstance:Pn,setupComponent:$n,renderComponentRoot:Y,setCurrentRenderingInstance:V,isVNode:an,normalizeVNode:wn},wr=null,xr=null},3577:(e,t,n)=>{"use strict";function r(e,t){const n=Object.create(null),r=e.split(",");for(let e=0;e<r.length;e++)n[r[e]]=!0;return t?e=>!!n[e.toLowerCase()]:e=>!!n[e]}n.d(t,{Z6:()=>S,kT:()=>k,NO:()=>C,dG:()=>E,m:()=>o,_A:()=>K,kC:()=>ee,Nj:()=>oe,l7:()=>L,Kp:()=>s,E9:()=>ae,aU:()=>ne,RI:()=>A,rs:()=>Q,yA:()=>l,ir:()=>re,kJ:()=>I,wh:()=>Y,mf:()=>H,e1:()=>i,eS:()=>m,S0:()=>U,_N:()=>M,tR:()=>O,Kn:()=>W,F7:()=>T,PO:()=>$,tI:()=>B,Gg:()=>Z,aN:()=>v,DM:()=>F,Pq:()=>a,HD:()=>N,yk:()=>j,WB:()=>g,WV:()=>b,hq:()=>y,fY:()=>r,C_:()=>h,vs:()=>p,j5:()=>c,yL:()=>f,Od:()=>R,zw:()=>w,hR:()=>te,He:()=>ie,W7:()=>q});const o={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},i=r("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");function s(e,t=0,n=e.length){let r=e.split(/(\r?\n)/);const o=r.filter(((e,t)=>t%2==1));r=r.filter(((e,t)=>t%2==0));let i=0;const s=[];for(let e=0;e<r.length;e++)if(i+=r[e].length+(o[e]&&o[e].length||0),i>=t){for(let a=e-2;a<=e+2||n>i;a++){if(a<0||a>=r.length)continue;const l=a+1;s.push(`${l}${" ".repeat(Math.max(3-String(l).length,0))}|  ${r[a]}`);const c=r[a].length,u=o[a]&&o[a].length||0;if(a===e){const e=t-(i-(c+u)),r=Math.max(1,n>i?c-e:n-t);s.push("   |  "+" ".repeat(e)+"^".repeat(r))}else if(a>e){if(n>i){const e=Math.max(Math.min(n-i,c),1);s.push("   |  "+"^".repeat(e))}i+=c+u}}break}return s.join("\n")}const a=r("itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly");function l(e){return!!e||""===e}function c(e){if(I(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=N(r)?f(r):c(r);if(o)for(const e in o)t[e]=o[e]}return t}return N(e)||W(e)?e:void 0}const u=/;(?![^(]*\))/g,d=/:(.+)/;function f(e){const t={};return e.split(u).forEach((e=>{if(e){const n=e.split(d);n.length>1&&(t[n[0].trim()]=n[1].trim())}})),t}function h(e){let t="";if(N(e))t=e;else if(I(e))for(let n=0;n<e.length;n++){const r=h(e[n]);r&&(t+=r+" ")}else if(W(e))for(const n in e)e[n]&&(t+=n+" ");return t.trim()}function p(e){if(!e)return null;let{class:t,style:n}=e;return t&&!N(t)&&(e.class=h(t)),n&&(e.style=c(n)),e}const m=r("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=r("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),g=r("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr");function b(e,t){if(e===t)return!0;let n=P(e),r=P(t);if(n||r)return!(!n||!r)&&e.getTime()===t.getTime();if(n=I(e),r=I(t),n||r)return!(!n||!r)&&function(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=b(e[r],t[r]);return n}(e,t);if(n=W(e),r=W(t),n||r){if(!n||!r)return!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e){const r=e.hasOwnProperty(n),o=t.hasOwnProperty(n);if(r&&!o||!r&&o||!b(e[n],t[n]))return!1}}return String(e)===String(t)}function y(e,t){return e.findIndex((e=>b(e,t)))}const w=e=>N(e)?e:null==e?"":I(e)||W(e)&&(e.toString===z||!H(e.toString))?JSON.stringify(e,x,2):String(e),x=(e,t)=>t&&t.__v_isRef?x(e,t.value):M(t)?{[`Map(${t.size})`]:[...t.entries()].reduce(((e,[t,n])=>(e[`${t} =>`]=n,e)),{})}:F(t)?{[`Set(${t.size})`]:[...t.values()]}:!W(t)||I(t)||$(t)?t:String(t),k={},S=[],E=()=>{},C=()=>!1,_=/^on[^a-z]/,T=e=>_.test(e),O=e=>e.startsWith("onUpdate:"),L=Object.assign,R=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},D=Object.prototype.hasOwnProperty,A=(e,t)=>D.call(e,t),I=Array.isArray,M=e=>"[object Map]"===V(e),F=e=>"[object Set]"===V(e),P=e=>e instanceof Date,H=e=>"function"==typeof e,N=e=>"string"==typeof e,j=e=>"symbol"==typeof e,W=e=>null!==e&&"object"==typeof e,B=e=>W(e)&&H(e.then)&&H(e.catch),z=Object.prototype.toString,V=e=>z.call(e),q=e=>V(e).slice(8,-1),$=e=>"[object Object]"===V(e),U=e=>N(e)&&"NaN"!==e&&"-"!==e[0]&&""+parseInt(e,10)===e,Z=r(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Y=r("bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo"),G=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},J=/-(\w)/g,K=G((e=>e.replace(J,((e,t)=>t?t.toUpperCase():"")))),X=/\B([A-Z])/g,Q=G((e=>e.replace(X,"-$1").toLowerCase())),ee=G((e=>e.charAt(0).toUpperCase()+e.slice(1))),te=G((e=>e?`on${ee(e)}`:"")),ne=(e,t)=>!Object.is(e,t),re=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},oe=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},ie=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let se;const ae=()=>se||(se="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{})},1807:e=>{var t=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=t},2152:function(e){var t;t=function(){return function(){var e={686:function(e,t,n){"use strict";n.d(t,{default:function(){return x}});var r=n(279),o=n.n(r),i=n(370),s=n.n(i),a=n(817),l=n.n(a);function c(e){try{return document.execCommand(e)}catch(e){return!1}}var u=function(e){var t=l()(e);return c("cut"),t};function d(e){var t="rtl"===document.documentElement.getAttribute("dir"),n=document.createElement("textarea");n.style.fontSize="12pt",n.style.border="0",n.style.padding="0",n.style.margin="0",n.style.position="absolute",n.style[t?"right":"left"]="-9999px";var r=window.pageYOffset||document.documentElement.scrollTop;return n.style.top="".concat(r,"px"),n.setAttribute("readonly",""),n.value=e,n}var f=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body},n="";if("string"==typeof e){var r=d(e);t.container.appendChild(r),n=l()(r),c("copy"),r.remove()}else n=l()(e),c("copy");return n};function h(e){return h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},h(e)}function p(e){return p="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},p(e)}function m(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function v(e,t){return v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},v(e,t)}function g(e,t){return!t||"object"!==p(t)&&"function"!=typeof t?function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e):t}function b(e){return b=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},b(e)}function y(e,t){var n="data-clipboard-".concat(e);if(t.hasAttribute(n))return t.getAttribute(n)}var w=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(l,e);var t,n,r,o,i,a=(o=l,i=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],(function(){}))),!0}catch(e){return!1}}(),function(){var e,t=b(o);if(i){var n=b(this).constructor;e=Reflect.construct(t,arguments,n)}else e=t.apply(this,arguments);return g(this,e)});function l(e,t){var n;return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,l),(n=a.call(this)).resolveOptions(t),n.listenClick(e),n}return t=l,n=[{key:"resolveOptions",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===p(e.container)?e.container:document.body}},{key:"listenClick",value:function(e){var t=this;this.listener=s()(e,"click",(function(e){return t.onClick(e)}))}},{key:"onClick",value:function(e){var t=e.delegateTarget||e.currentTarget,n=this.action(t)||"copy",r=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.action,n=void 0===t?"copy":t,r=e.container,o=e.target,i=e.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==o){if(!o||"object"!==h(o)||1!==o.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&o.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(o.hasAttribute("readonly")||o.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return i?f(i,{container:r}):o?"cut"===n?u(o):f(o,{container:r}):void 0}({action:n,container:this.container,target:this.target(t),text:this.text(t)});this.emit(r?"success":"error",{action:n,text:r,trigger:t,clearSelection:function(){t&&t.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(e){return y("action",e)}},{key:"defaultTarget",value:function(e){var t=y("target",e);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(e){return y("text",e)}},{key:"destroy",value:function(){this.listener.destroy()}}],r=[{key:"copy",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{container:document.body};return f(e,t)}},{key:"cut",value:function(e){return u(e)}},{key:"isSupported",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof e?[e]:e,n=!!document.queryCommandSupported;return t.forEach((function(e){n=n&&!!document.queryCommandSupported(e)})),n}}],n&&m(t.prototype,n),r&&m(t,r),l}(o()),x=w},828:function(e){if("undefined"!=typeof Element&&!Element.prototype.matches){var t=Element.prototype;t.matches=t.matchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector||t.webkitMatchesSelector}e.exports=function(e,t){for(;e&&9!==e.nodeType;){if("function"==typeof e.matches&&e.matches(t))return e;e=e.parentNode}}},438:function(e,t,n){var r=n(828);function o(e,t,n,r,o){var s=i.apply(this,arguments);return e.addEventListener(n,s,o),{destroy:function(){e.removeEventListener(n,s,o)}}}function i(e,t,n,o){return function(n){n.delegateTarget=r(n.target,t),n.delegateTarget&&o.call(e,n)}}e.exports=function(e,t,n,r,i){return"function"==typeof e.addEventListener?o.apply(null,arguments):"function"==typeof n?o.bind(null,document).apply(null,arguments):("string"==typeof e&&(e=document.querySelectorAll(e)),Array.prototype.map.call(e,(function(e){return o(e,t,n,r,i)})))}},879:function(e,t){t.node=function(e){return void 0!==e&&e instanceof HTMLElement&&1===e.nodeType},t.nodeList=function(e){var n=Object.prototype.toString.call(e);return void 0!==e&&("[object NodeList]"===n||"[object HTMLCollection]"===n)&&"length"in e&&(0===e.length||t.node(e[0]))},t.string=function(e){return"string"==typeof e||e instanceof String},t.fn=function(e){return"[object Function]"===Object.prototype.toString.call(e)}},370:function(e,t,n){var r=n(879),o=n(438);e.exports=function(e,t,n){if(!e&&!t&&!n)throw new Error("Missing required arguments");if(!r.string(t))throw new TypeError("Second argument must be a String");if(!r.fn(n))throw new TypeError("Third argument must be a Function");if(r.node(e))return function(e,t,n){return e.addEventListener(t,n),{destroy:function(){e.removeEventListener(t,n)}}}(e,t,n);if(r.nodeList(e))return function(e,t,n){return Array.prototype.forEach.call(e,(function(e){e.addEventListener(t,n)})),{destroy:function(){Array.prototype.forEach.call(e,(function(e){e.removeEventListener(t,n)}))}}}(e,t,n);if(r.string(e))return function(e,t,n){return o(document.body,e,t,n)}(e,t,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}},817:function(e){e.exports=function(e){var t;if("SELECT"===e.nodeName)e.focus(),t=e.value;else if("INPUT"===e.nodeName||"TEXTAREA"===e.nodeName){var n=e.hasAttribute("readonly");n||e.setAttribute("readonly",""),e.select(),e.setSelectionRange(0,e.value.length),n||e.removeAttribute("readonly"),t=e.value}else{e.hasAttribute("contenteditable")&&e.focus();var r=window.getSelection(),o=document.createRange();o.selectNodeContents(e),r.removeAllRanges(),r.addRange(o),t=r.toString()}return t}},279:function(e){function t(){}t.prototype={on:function(e,t,n){var r=this.e||(this.e={});return(r[e]||(r[e]=[])).push({fn:t,ctx:n}),this},once:function(e,t,n){var r=this;function o(){r.off(e,o),t.apply(n,arguments)}return o._=t,this.on(e,o,n)},emit:function(e){for(var t=[].slice.call(arguments,1),n=((this.e||(this.e={}))[e]||[]).slice(),r=0,o=n.length;r<o;r++)n[r].fn.apply(n[r].ctx,t);return this},off:function(e,t){var n=this.e||(this.e={}),r=n[e],o=[];if(r&&t)for(var i=0,s=r.length;i<s;i++)r[i].fn!==t&&r[i].fn._!==t&&o.push(r[i]);return o.length?n[e]=o:delete n[e],this}},e.exports=t,e.exports.TinyEmitter=t}},t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{}};return e[r](o,o.exports,n),o.exports}return n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(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=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n(686)}().default},e.exports=t()},9662:(e,t,n)=>{var r=n(7854),o=n(614),i=n(6330),s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not a function")}},6077:(e,t,n)=>{var r=n(7854),o=n(614),i=r.String,s=r.TypeError;e.exports=function(e){if("object"==typeof e||o(e))return e;throw s("Can't set "+i(e)+" as a prototype")}},1223:(e,t,n)=>{var r=n(5112),o=n(30),i=n(3070),s=r("unscopables"),a=Array.prototype;null==a[s]&&i.f(a,s,{configurable:!0,value:o(null)}),e.exports=function(e){a[s][e]=!0}},1530:(e,t,n)=>{"use strict";var r=n(8710).charAt;e.exports=function(e,t,n){return t+(n?r(e,t).length:1)}},5787:(e,t,n)=>{var r=n(7854),o=n(7976),i=r.TypeError;e.exports=function(e,t){if(o(t,e))return e;throw i("Incorrect invocation")}},9670:(e,t,n)=>{var r=n(7854),o=n(111),i=r.String,s=r.TypeError;e.exports=function(e){if(o(e))return e;throw s(i(e)+" is not an object")}},7556:(e,t,n)=>{var r=n(7293);e.exports=r((function(){if("function"==typeof ArrayBuffer){var e=new ArrayBuffer(8);Object.isExtensible(e)&&Object.defineProperty(e,"a",{value:8})}}))},8533:(e,t,n)=>{"use strict";var r=n(2092).forEach,o=n(9341)("forEach");e.exports=o?[].forEach:function(e){return r(this,e,arguments.length>1?arguments[1]:void 0)}},1318:(e,t,n)=>{var r=n(5656),o=n(1400),i=n(6244),s=function(e){return function(t,n,s){var a,l=r(t),c=i(l),u=o(s,c);if(e&&n!=n){for(;c>u;)if((a=l[u++])!=a)return!0}else for(;c>u;u++)if((e||u in l)&&l[u]===n)return e||u||0;return!e&&-1}};e.exports={includes:s(!0),indexOf:s(!1)}},2092:(e,t,n)=>{var r=n(9974),o=n(1702),i=n(8361),s=n(7908),a=n(6244),l=n(5417),c=o([].push),u=function(e){var t=1==e,n=2==e,o=3==e,u=4==e,d=6==e,f=7==e,h=5==e||d;return function(p,m,v,g){for(var b,y,w=s(p),x=i(w),k=r(m,v),S=a(x),E=0,C=g||l,_=t?C(p,S):n||f?C(p,0):void 0;S>E;E++)if((h||E in x)&&(y=k(b=x[E],E,w),e))if(t)_[E]=y;else if(y)switch(e){case 3:return!0;case 5:return b;case 6:return E;case 2:c(_,b)}else switch(e){case 4:return!1;case 7:c(_,b)}return d?-1:o||u?u:_}};e.exports={forEach:u(0),map:u(1),filter:u(2),some:u(3),every:u(4),find:u(5),findIndex:u(6),filterReject:u(7)}},1194:(e,t,n)=>{var r=n(7293),o=n(5112),i=n(7392),s=o("species");e.exports=function(e){return i>=51||!r((function(){var t=[];return(t.constructor={})[s]=function(){return{foo:1}},1!==t[e](Boolean).foo}))}},9341:(e,t,n)=>{"use strict";var r=n(7293);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))}},3671:(e,t,n)=>{var r=n(7854),o=n(9662),i=n(7908),s=n(8361),a=n(6244),l=r.TypeError,c=function(e){return function(t,n,r,c){o(n);var u=i(t),d=s(u),f=a(u),h=e?f-1:0,p=e?-1:1;if(r<2)for(;;){if(h in d){c=d[h],h+=p;break}if(h+=p,e?h<0:f<=h)throw l("Reduce of empty array with no initial value")}for(;e?h>=0:f>h;h+=p)h in d&&(c=n(c,d[h],h,u));return c}};e.exports={left:c(!1),right:c(!0)}},1589:(e,t,n)=>{var r=n(7854),o=n(1400),i=n(6244),s=n(6135),a=r.Array,l=Math.max;e.exports=function(e,t,n){for(var r=i(e),c=o(t,r),u=o(void 0===n?r:n,r),d=a(l(u-c,0)),f=0;c<u;c++,f++)s(d,f,e[c]);return d.length=f,d}},7475:(e,t,n)=>{var r=n(7854),o=n(3157),i=n(4411),s=n(111),a=n(5112)("species"),l=r.Array;e.exports=function(e){var t;return o(e)&&(t=e.constructor,(i(t)&&(t===l||o(t.prototype))||s(t)&&null===(t=t[a]))&&(t=void 0)),void 0===t?l:t}},5417:(e,t,n)=>{var r=n(7475);e.exports=function(e,t){return new(r(e))(0===t?0:t)}},7072:(e,t,n)=>{var r=n(5112)("iterator"),o=!1;try{var i=0,s={next:function(){return{done:!!i++}},return:function(){o=!0}};s[r]=function(){return this},Array.from(s,(function(){throw 2}))}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i={};i[r]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n}},4326:(e,t,n)=>{var r=n(1702),o=r({}.toString),i=r("".slice);e.exports=function(e){return i(o(e),8,-1)}},648:(e,t,n)=>{var r=n(7854),o=n(1694),i=n(614),s=n(4326),a=n(5112)("toStringTag"),l=r.Object,c="Arguments"==s(function(){return arguments}());e.exports=o?s:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=l(e),a))?n:c?s(t):"Object"==(r=s(t))&&i(t.callee)?"Arguments":r}},9320:(e,t,n)=>{"use strict";var r=n(1702),o=n(2248),i=n(2423).getWeakData,s=n(9670),a=n(111),l=n(5787),c=n(408),u=n(2092),d=n(2597),f=n(9909),h=f.set,p=f.getterFor,m=u.find,v=u.findIndex,g=r([].splice),b=0,y=function(e){return e.frozen||(e.frozen=new w)},w=function(){this.entries=[]},x=function(e,t){return m(e.entries,(function(e){return e[0]===t}))};w.prototype={get:function(e){var t=x(this,e);if(t)return t[1]},has:function(e){return!!x(this,e)},set:function(e,t){var n=x(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=v(this.entries,(function(t){return t[0]===e}));return~t&&g(this.entries,t,1),!!~t}},e.exports={getConstructor:function(e,t,n,r){var u=e((function(e,o){l(e,f),h(e,{type:t,id:b++,frozen:void 0}),null!=o&&c(o,e[r],{that:e,AS_ENTRIES:n})})),f=u.prototype,m=p(t),v=function(e,t,n){var r=m(e),o=i(s(t),!0);return!0===o?y(r).set(t,n):o[r.id]=n,e};return o(f,{delete:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).delete(e):n&&d(n,t.id)&&delete n[t.id]},has:function(e){var t=m(this);if(!a(e))return!1;var n=i(e);return!0===n?y(t).has(e):n&&d(n,t.id)}}),o(f,n?{get:function(e){var t=m(this);if(a(e)){var n=i(e);return!0===n?y(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return v(this,e,t)}}:{add:function(e){return v(this,e,!0)}}),u}}},7710:(e,t,n)=>{"use strict";var r=n(2109),o=n(7854),i=n(1702),s=n(4705),a=n(1320),l=n(2423),c=n(408),u=n(5787),d=n(614),f=n(111),h=n(7293),p=n(7072),m=n(8003),v=n(9587);e.exports=function(e,t,n){var g=-1!==e.indexOf("Map"),b=-1!==e.indexOf("Weak"),y=g?"set":"add",w=o[e],x=w&&w.prototype,k=w,S={},E=function(e){var t=i(x[e]);a(x,e,"add"==e?function(e){return t(this,0===e?0:e),this}:"delete"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:"get"==e?function(e){return b&&!f(e)?void 0:t(this,0===e?0:e)}:"has"==e?function(e){return!(b&&!f(e))&&t(this,0===e?0:e)}:function(e,n){return t(this,0===e?0:e,n),this})};if(s(e,!d(w)||!(b||x.forEach&&!h((function(){(new w).entries().next()})))))k=n.getConstructor(t,e,g,y),l.enable();else if(s(e,!0)){var C=new k,_=C[y](b?{}:-0,1)!=C,T=h((function(){C.has(1)})),O=p((function(e){new w(e)})),L=!b&&h((function(){for(var e=new w,t=5;t--;)e[y](t,t);return!e.has(-0)}));O||((k=t((function(e,t){u(e,x);var n=v(new w,e,k);return null!=t&&c(t,n[y],{that:n,AS_ENTRIES:g}),n}))).prototype=x,x.constructor=k),(T||L)&&(E("delete"),E("has"),g&&E("get")),(L||_)&&E(y),b&&x.clear&&delete x.clear}return S[e]=k,r({global:!0,forced:k!=w},S),m(k,e),b||n.setStrong(k,e,g),k}},9920:(e,t,n)=>{var r=n(2597),o=n(3887),i=n(1236),s=n(3070);e.exports=function(e,t,n){for(var a=o(t),l=s.f,c=i.f,u=0;u<a.length;u++){var d=a[u];r(e,d)||n&&r(n,d)||l(e,d,c(t,d))}}},8544:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype}))},4994:(e,t,n)=>{"use strict";var r=n(3383).IteratorPrototype,o=n(30),i=n(9114),s=n(8003),a=n(7497),l=function(){return this};e.exports=function(e,t,n,c){var u=t+" Iterator";return e.prototype=o(r,{next:i(+!c,n)}),s(e,u,!1,!0),a[u]=l,e}},8880:(e,t,n)=>{var r=n(9781),o=n(3070),i=n(9114);e.exports=r?function(e,t,n){return o.f(e,t,i(1,n))}:function(e,t,n){return e[t]=n,e}},9114:e=>{e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},6135:(e,t,n)=>{"use strict";var r=n(4948),o=n(3070),i=n(9114);e.exports=function(e,t,n){var s=r(t);s in e?o.f(e,s,i(0,n)):e[s]=n}},654:(e,t,n)=>{"use strict";var r=n(2109),o=n(6916),i=n(1913),s=n(6530),a=n(614),l=n(4994),c=n(9518),u=n(7674),d=n(8003),f=n(8880),h=n(1320),p=n(5112),m=n(7497),v=n(3383),g=s.PROPER,b=s.CONFIGURABLE,y=v.IteratorPrototype,w=v.BUGGY_SAFARI_ITERATORS,x=p("iterator"),k="keys",S="values",E="entries",C=function(){return this};e.exports=function(e,t,n,s,p,v,_){l(n,t,s);var T,O,L,R=function(e){if(e===p&&F)return F;if(!w&&e in I)return I[e];switch(e){case k:case S:case E:return function(){return new n(this,e)}}return function(){return new n(this)}},D=t+" Iterator",A=!1,I=e.prototype,M=I[x]||I["@@iterator"]||p&&I[p],F=!w&&M||R(p),P="Array"==t&&I.entries||M;if(P&&(T=c(P.call(new e)))!==Object.prototype&&T.next&&(i||c(T)===y||(u?u(T,y):a(T[x])||h(T,x,C)),d(T,D,!0,!0),i&&(m[D]=C)),g&&p==S&&M&&M.name!==S&&(!i&&b?f(I,"name",S):(A=!0,F=function(){return o(M,this)})),p)if(O={values:R(S),keys:v?F:R(k),entries:R(E)},_)for(L in O)(w||A||!(L in I))&&h(I,L,O[L]);else r({target:t,proto:!0,forced:w||A},O);return i&&!_||I[x]===F||h(I,x,F,{name:p}),m[t]=F,O}},9781:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},317:(e,t,n)=>{var r=n(7854),o=n(111),i=r.document,s=o(i)&&o(i.createElement);e.exports=function(e){return s?i.createElement(e):{}}},8324:e=>{e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},8509:(e,t,n)=>{var r=n(317)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},5268:(e,t,n)=>{var r=n(4326),o=n(7854);e.exports="process"==r(o.process)},8113:(e,t,n)=>{var r=n(5005);e.exports=r("navigator","userAgent")||""},7392:(e,t,n)=>{var r,o,i=n(7854),s=n(8113),a=i.process,l=i.Deno,c=a&&a.versions||l&&l.version,u=c&&c.v8;u&&(o=(r=u.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&s&&(!(r=s.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=s.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},748:e=>{e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},2109:(e,t,n)=>{var r=n(7854),o=n(1236).f,i=n(8880),s=n(1320),a=n(3505),l=n(9920),c=n(4705);e.exports=function(e,t){var n,u,d,f,h,p=e.target,m=e.global,v=e.stat;if(n=m?r:v?r[p]||a(p,{}):(r[p]||{}).prototype)for(u in t){if(f=t[u],d=e.noTargetGet?(h=o(n,u))&&h.value:n[u],!c(m?u:p+(v?".":"#")+u,e.forced)&&void 0!==d){if(typeof f==typeof d)continue;l(f,d)}(e.sham||d&&d.sham)&&i(f,"sham",!0),s(n,u,f,e)}}},7293:e=>{e.exports=function(e){try{return!!e()}catch(e){return!0}}},7007:(e,t,n)=>{"use strict";n(4916);var r=n(1702),o=n(1320),i=n(2261),s=n(7293),a=n(5112),l=n(8880),c=a("species"),u=RegExp.prototype;e.exports=function(e,t,n,d){var f=a(e),h=!s((function(){var t={};return t[f]=function(){return 7},7!=""[e](t)})),p=h&&!s((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[c]=function(){return n},n.flags="",n[f]=/./[f]),n.exec=function(){return t=!0,null},n[f](""),!t}));if(!h||!p||n){var m=r(/./[f]),v=t(f,""[e],(function(e,t,n,o,s){var a=r(e),l=t.exec;return l===i||l===u.exec?h&&!s?{done:!0,value:m(t,n,o)}:{done:!0,value:a(n,t,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(u,f,v[1])}d&&l(u[f],"sham",!0)}},6677:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){return Object.isExtensible(Object.preventExtensions({}))}))},2104:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.apply,s=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?s.bind(i):function(){return s.apply(i,arguments)})},9974:(e,t,n)=>{var r=n(1702),o=n(9662),i=n(4374),s=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:i?s(e,t):function(){return e.apply(t,arguments)}}},4374:(e,t,n)=>{var r=n(7293);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},6916:(e,t,n)=>{var r=n(4374),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},6530:(e,t,n)=>{var r=n(9781),o=n(2597),i=Function.prototype,s=r&&Object.getOwnPropertyDescriptor,a=o(i,"name"),l=a&&"something"===function(){}.name,c=a&&(!r||r&&s(i,"name").configurable);e.exports={EXISTS:a,PROPER:l,CONFIGURABLE:c}},1702:(e,t,n)=>{var r=n(4374),o=Function.prototype,i=o.bind,s=o.call,a=r&&i.bind(s,s);e.exports=r?function(e){return e&&a(e)}:function(e){return e&&function(){return s.apply(e,arguments)}}},5005:(e,t,n)=>{var r=n(7854),o=n(614),i=function(e){return o(e)?e:void 0};e.exports=function(e,t){return arguments.length<2?i(r[e]):r[e]&&r[e][t]}},1246:(e,t,n)=>{var r=n(648),o=n(8173),i=n(7497),s=n(5112)("iterator");e.exports=function(e){if(null!=e)return o(e,s)||o(e,"@@iterator")||i[r(e)]}},8554:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9662),s=n(9670),a=n(6330),l=n(1246),c=r.TypeError;e.exports=function(e,t){var n=arguments.length<2?l(e):t;if(i(n))return s(o(n,e));throw c(a(e)+" is not iterable")}},8173:(e,t,n)=>{var r=n(9662);e.exports=function(e,t){var n=e[t];return null==n?void 0:r(n)}},647:(e,t,n)=>{var r=n(1702),o=n(7908),i=Math.floor,s=r("".charAt),a=r("".replace),l=r("".slice),c=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,u=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,r,d,f){var h=n+e.length,p=r.length,m=u;return void 0!==d&&(d=o(d),m=c),a(f,m,(function(o,a){var c;switch(s(a,0)){case"$":return"$";case"&":return e;case"`":return l(t,0,n);case"'":return l(t,h);case"<":c=d[l(a,1,-1)];break;default:var u=+a;if(0===u)return o;if(u>p){var f=i(u/10);return 0===f?o:f<=p?void 0===r[f-1]?s(a,1):r[f-1]+s(a,1):o}c=r[u-1]}return void 0===c?"":c}))}},7854:(e,t,n)=>{var r=function(e){return e&&e.Math==Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||Function("return this")()},2597:(e,t,n)=>{var r=n(1702),o=n(7908),i=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return i(o(e),t)}},3501:e=>{e.exports={}},490:(e,t,n)=>{var r=n(5005);e.exports=r("document","documentElement")},4664:(e,t,n)=>{var r=n(9781),o=n(7293),i=n(317);e.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},8361:(e,t,n)=>{var r=n(7854),o=n(1702),i=n(7293),s=n(4326),a=r.Object,l=o("".split);e.exports=i((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"==s(e)?l(e,""):a(e)}:a},9587:(e,t,n)=>{var r=n(614),o=n(111),i=n(7674);e.exports=function(e,t,n){var s,a;return i&&r(s=t.constructor)&&s!==n&&o(a=s.prototype)&&a!==n.prototype&&i(e,a),e}},2788:(e,t,n)=>{var r=n(1702),o=n(614),i=n(5465),s=r(Function.toString);o(i.inspectSource)||(i.inspectSource=function(e){return s(e)}),e.exports=i.inspectSource},2423:(e,t,n)=>{var r=n(2109),o=n(1702),i=n(3501),s=n(111),a=n(2597),l=n(3070).f,c=n(8006),u=n(1156),d=n(2050),f=n(9711),h=n(6677),p=!1,m=f("meta"),v=0,g=function(e){l(e,m,{value:{objectID:"O"+v++,weakData:{}}})},b=e.exports={enable:function(){b.enable=function(){},p=!0;var e=c.f,t=o([].splice),n={};n[m]=1,e(n).length&&(c.f=function(n){for(var r=e(n),o=0,i=r.length;o<i;o++)if(r[o]===m){t(r,o,1);break}return r},r({target:"Object",stat:!0,forced:!0},{getOwnPropertyNames:u.f}))},fastKey:function(e,t){if(!s(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!a(e,m)){if(!d(e))return"F";if(!t)return"E";g(e)}return e[m].objectID},getWeakData:function(e,t){if(!a(e,m)){if(!d(e))return!0;if(!t)return!1;g(e)}return e[m].weakData},onFreeze:function(e){return h&&p&&d(e)&&!a(e,m)&&g(e),e}};i[m]=!0},9909:(e,t,n)=>{var r,o,i,s=n(8536),a=n(7854),l=n(1702),c=n(111),u=n(8880),d=n(2597),f=n(5465),h=n(6200),p=n(3501),m="Object already initialized",v=a.TypeError,g=a.WeakMap;if(s||f.state){var b=f.state||(f.state=new g),y=l(b.get),w=l(b.has),x=l(b.set);r=function(e,t){if(w(b,e))throw new v(m);return t.facade=e,x(b,e,t),t},o=function(e){return y(b,e)||{}},i=function(e){return w(b,e)}}else{var k=h("state");p[k]=!0,r=function(e,t){if(d(e,k))throw new v(m);return t.facade=e,u(e,k,t),t},o=function(e){return d(e,k)?e[k]:{}},i=function(e){return d(e,k)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!c(t)||(n=o(t)).type!==e)throw v("Incompatible receiver, "+e+" required");return n}}}},7659:(e,t,n)=>{var r=n(5112),o=n(7497),i=r("iterator"),s=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||s[i]===e)}},3157:(e,t,n)=>{var r=n(4326);e.exports=Array.isArray||function(e){return"Array"==r(e)}},614:e=>{e.exports=function(e){return"function"==typeof e}},4411:(e,t,n)=>{var r=n(1702),o=n(7293),i=n(614),s=n(648),a=n(5005),l=n(2788),c=function(){},u=[],d=a("Reflect","construct"),f=/^\s*(?:class|function)\b/,h=r(f.exec),p=!f.exec(c),m=function(e){if(!i(e))return!1;try{return d(c,u,e),!0}catch(e){return!1}},v=function(e){if(!i(e))return!1;switch(s(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return p||!!h(f,l(e))}catch(e){return!0}};v.sham=!0,e.exports=!d||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?v:m},4705:(e,t,n)=>{var r=n(7293),o=n(614),i=/#|\.prototype\./,s=function(e,t){var n=l[a(e)];return n==u||n!=c&&(o(t)?r(t):!!t)},a=s.normalize=function(e){return String(e).replace(i,".").toLowerCase()},l=s.data={},c=s.NATIVE="N",u=s.POLYFILL="P";e.exports=s},111:(e,t,n)=>{var r=n(614);e.exports=function(e){return"object"==typeof e?null!==e:r(e)}},1913:e=>{e.exports=!1},2190:(e,t,n)=>{var r=n(7854),o=n(5005),i=n(614),s=n(7976),a=n(3307),l=r.Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=o("Symbol");return i(t)&&s(t.prototype,l(e))}},408:(e,t,n)=>{var r=n(7854),o=n(9974),i=n(6916),s=n(9670),a=n(6330),l=n(7659),c=n(6244),u=n(7976),d=n(8554),f=n(1246),h=n(9212),p=r.TypeError,m=function(e,t){this.stopped=e,this.result=t},v=m.prototype;e.exports=function(e,t,n){var r,g,b,y,w,x,k,S=n&&n.that,E=!(!n||!n.AS_ENTRIES),C=!(!n||!n.IS_ITERATOR),_=!(!n||!n.INTERRUPTED),T=o(t,S),O=function(e){return r&&h(r,"normal",e),new m(!0,e)},L=function(e){return E?(s(e),_?T(e[0],e[1],O):T(e[0],e[1])):_?T(e,O):T(e)};if(C)r=e;else{if(!(g=f(e)))throw p(a(e)+" is not iterable");if(l(g)){for(b=0,y=c(e);y>b;b++)if((w=L(e[b]))&&u(v,w))return w;return new m(!1)}r=d(e,g)}for(x=r.next;!(k=i(x,r)).done;){try{w=L(k.value)}catch(e){h(r,"throw",e)}if("object"==typeof w&&w&&u(v,w))return w}return new m(!1)}},9212:(e,t,n)=>{var r=n(6916),o=n(9670),i=n(8173);e.exports=function(e,t,n){var s,a;o(e);try{if(!(s=i(e,"return"))){if("throw"===t)throw n;return n}s=r(s,e)}catch(e){a=!0,s=e}if("throw"===t)throw n;if(a)throw s;return o(s),n}},3383:(e,t,n)=>{"use strict";var r,o,i,s=n(7293),a=n(614),l=n(30),c=n(9518),u=n(1320),d=n(5112),f=n(1913),h=d("iterator"),p=!1;[].keys&&("next"in(i=[].keys())?(o=c(c(i)))!==Object.prototype&&(r=o):p=!0),null==r||s((function(){var e={};return r[h].call(e)!==e}))?r={}:f&&(r=l(r)),a(r[h])||u(r,h,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:p}},7497:e=>{e.exports={}},6244:(e,t,n)=>{var r=n(7466);e.exports=function(e){return r(e.length)}},133:(e,t,n)=>{var r=n(7392),o=n(7293);e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},8536:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2788),s=r.WeakMap;e.exports=o(s)&&/native code/.test(i(s))},3009:(e,t,n)=>{var r=n(7854),o=n(7293),i=n(1702),s=n(1340),a=n(3111).trim,l=n(1361),c=r.parseInt,u=r.Symbol,d=u&&u.iterator,f=/^[+-]?0x/i,h=i(f.exec),p=8!==c(l+"08")||22!==c(l+"0x16")||d&&!o((function(){c(Object(d))}));e.exports=p?function(e,t){var n=a(s(e));return c(n,t>>>0||(h(f,n)?16:10))}:c},1574:(e,t,n)=>{"use strict";var r=n(9781),o=n(1702),i=n(6916),s=n(7293),a=n(1956),l=n(5181),c=n(5296),u=n(7908),d=n(8361),f=Object.assign,h=Object.defineProperty,p=o([].concat);e.exports=!f||s((function(){if(r&&1!==f({b:1},f(h({},"a",{enumerable:!0,get:function(){h(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!=f({},e)[n]||a(f({},t)).join("")!=o}))?function(e,t){for(var n=u(e),o=arguments.length,s=1,f=l.f,h=c.f;o>s;)for(var m,v=d(arguments[s++]),g=f?p(a(v),f(v)):a(v),b=g.length,y=0;b>y;)m=g[y++],r&&!i(h,v,m)||(n[m]=v[m]);return n}:f},30:(e,t,n)=>{var r,o=n(9670),i=n(6048),s=n(748),a=n(3501),l=n(490),c=n(317),u=n(6200)("IE_PROTO"),d=function(){},f=function(e){return"<script>"+e+"<\/script>"},h=function(e){e.write(f("")),e.close();var t=e.parentWindow.Object;return e=null,t},p=function(){try{r=new ActiveXObject("htmlfile")}catch(e){}var e,t;p="undefined"!=typeof document?document.domain&&r?h(r):((t=c("iframe")).style.display="none",l.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(f("document.F=Object")),e.close(),e.F):h(r);for(var n=s.length;n--;)delete p.prototype[s[n]];return p()};a[u]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(d.prototype=o(e),n=new d,d.prototype=null,n[u]=e):n=p(),void 0===t?n:i.f(n,t)}},6048:(e,t,n)=>{var r=n(9781),o=n(3353),i=n(3070),s=n(9670),a=n(5656),l=n(1956);t.f=r&&!o?Object.defineProperties:function(e,t){s(e);for(var n,r=a(t),o=l(t),c=o.length,u=0;c>u;)i.f(e,n=o[u++],r[n]);return e}},3070:(e,t,n)=>{var r=n(7854),o=n(9781),i=n(4664),s=n(3353),a=n(9670),l=n(4948),c=r.TypeError,u=Object.defineProperty,d=Object.getOwnPropertyDescriptor;t.f=o?s?function(e,t,n){if(a(e),t=l(t),a(n),"function"==typeof e&&"prototype"===t&&"value"in n&&"writable"in n&&!n.writable){var r=d(e,t);r&&r.writable&&(e[t]=n.value,n={configurable:"configurable"in n?n.configurable:r.configurable,enumerable:"enumerable"in n?n.enumerable:r.enumerable,writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(a(e),t=l(t),a(n),i)try{return u(e,t,n)}catch(e){}if("get"in n||"set"in n)throw c("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},1236:(e,t,n)=>{var r=n(9781),o=n(6916),i=n(5296),s=n(9114),a=n(5656),l=n(4948),c=n(2597),u=n(4664),d=Object.getOwnPropertyDescriptor;t.f=r?d:function(e,t){if(e=a(e),t=l(t),u)try{return d(e,t)}catch(e){}if(c(e,t))return s(!o(i.f,e,t),e[t])}},1156:(e,t,n)=>{var r=n(4326),o=n(5656),i=n(8006).f,s=n(1589),a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];e.exports.f=function(e){return a&&"Window"==r(e)?function(e){try{return i(e)}catch(e){return s(a)}}(e):i(o(e))}},8006:(e,t,n)=>{var r=n(6324),o=n(748).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},5181:(e,t)=>{t.f=Object.getOwnPropertySymbols},9518:(e,t,n)=>{var r=n(7854),o=n(2597),i=n(614),s=n(7908),a=n(6200),l=n(8544),c=a("IE_PROTO"),u=r.Object,d=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=s(e);if(o(t,c))return t[c];var n=t.constructor;return i(n)&&t instanceof n?n.prototype:t instanceof u?d:null}},2050:(e,t,n)=>{var r=n(7293),o=n(111),i=n(4326),s=n(7556),a=Object.isExtensible,l=r((function(){a(1)}));e.exports=l||s?function(e){return!!o(e)&&(!s||"ArrayBuffer"!=i(e))&&(!a||a(e))}:a},7976:(e,t,n)=>{var r=n(1702);e.exports=r({}.isPrototypeOf)},6324:(e,t,n)=>{var r=n(1702),o=n(2597),i=n(5656),s=n(1318).indexOf,a=n(3501),l=r([].push);e.exports=function(e,t){var n,r=i(e),c=0,u=[];for(n in r)!o(a,n)&&o(r,n)&&l(u,n);for(;t.length>c;)o(r,n=t[c++])&&(~s(u,n)||l(u,n));return u}},1956:(e,t,n)=>{var r=n(6324),o=n(748);e.exports=Object.keys||function(e){return r(e,o)}},5296:(e,t)=>{"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7674:(e,t,n)=>{var r=n(1702),o=n(9670),i=n(6077);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set))(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return o(n),i(r),t?e(n,r):n.__proto__=r,n}}():void 0)},288:(e,t,n)=>{"use strict";var r=n(1694),o=n(648);e.exports=r?{}.toString:function(){return"[object "+o(this)+"]"}},2140:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(614),s=n(111),a=r.TypeError;e.exports=function(e,t){var n,r;if("string"===t&&i(n=e.toString)&&!s(r=o(n,e)))return r;if(i(n=e.valueOf)&&!s(r=o(n,e)))return r;if("string"!==t&&i(n=e.toString)&&!s(r=o(n,e)))return r;throw a("Can't convert object to primitive value")}},3887:(e,t,n)=>{var r=n(5005),o=n(1702),i=n(8006),s=n(5181),a=n(9670),l=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=i.f(a(e)),n=s.f;return n?l(t,n(e)):t}},2248:(e,t,n)=>{var r=n(1320);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},1320:(e,t,n)=>{var r=n(7854),o=n(614),i=n(2597),s=n(8880),a=n(3505),l=n(2788),c=n(9909),u=n(6530).CONFIGURABLE,d=c.get,f=c.enforce,h=String(String).split("String");(e.exports=function(e,t,n,l){var c,d=!!l&&!!l.unsafe,p=!!l&&!!l.enumerable,m=!!l&&!!l.noTargetGet,v=l&&void 0!==l.name?l.name:t;o(n)&&("Symbol("===String(v).slice(0,7)&&(v="["+String(v).replace(/^Symbol\(([^)]*)\)/,"$1")+"]"),(!i(n,"name")||u&&n.name!==v)&&s(n,"name",v),(c=f(n)).source||(c.source=h.join("string"==typeof v?v:""))),e!==r?(d?!m&&e[t]&&(p=!0):delete e[t],p?e[t]=n:s(e,t,n)):p?e[t]=n:a(t,n)})(Function.prototype,"toString",(function(){return o(this)&&d(this).source||l(this)}))},7651:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(9670),s=n(614),a=n(4326),l=n(2261),c=r.TypeError;e.exports=function(e,t){var n=e.exec;if(s(n)){var r=o(n,e,t);return null!==r&&i(r),r}if("RegExp"===a(e))return o(l,e,t);throw c("RegExp#exec called on incompatible receiver")}},2261:(e,t,n)=>{"use strict";var r,o,i=n(6916),s=n(1702),a=n(1340),l=n(7066),c=n(2999),u=n(2309),d=n(30),f=n(9909).get,h=n(9441),p=n(7168),m=u("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,g=v,b=s("".charAt),y=s("".indexOf),w=s("".replace),x=s("".slice),k=(o=/b*/g,i(v,r=/a/,"a"),i(v,o,"a"),0!==r.lastIndex||0!==o.lastIndex),S=c.BROKEN_CARET,E=void 0!==/()??/.exec("")[1];(k||E||S||h||p)&&(g=function(e){var t,n,r,o,s,c,u,h=this,p=f(h),C=a(e),_=p.raw;if(_)return _.lastIndex=h.lastIndex,t=i(g,_,C),h.lastIndex=_.lastIndex,t;var T=p.groups,O=S&&h.sticky,L=i(l,h),R=h.source,D=0,A=C;if(O&&(L=w(L,"y",""),-1===y(L,"g")&&(L+="g"),A=x(C,h.lastIndex),h.lastIndex>0&&(!h.multiline||h.multiline&&"\n"!==b(C,h.lastIndex-1))&&(R="(?: "+R+")",A=" "+A,D++),n=new RegExp("^(?:"+R+")",L)),E&&(n=new RegExp("^"+R+"$(?!\\s)",L)),k&&(r=h.lastIndex),o=i(v,O?n:h,A),O?o?(o.input=x(o.input,D),o[0]=x(o[0],D),o.index=h.lastIndex,h.lastIndex+=o[0].length):h.lastIndex=0:k&&o&&(h.lastIndex=h.global?o.index+o[0].length:r),E&&o&&o.length>1&&i(m,o[0],n,(function(){for(s=1;s<arguments.length-2;s++)void 0===arguments[s]&&(o[s]=void 0)})),o&&T)for(o.groups=c=d(null),s=0;s<T.length;s++)c[(u=T[s])[0]]=o[u[1]];return o}),e.exports=g},7066:(e,t,n)=>{"use strict";var r=n(9670);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},2999:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp,i=r((function(){var e=o("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),s=i||r((function(){return!o("a","y").sticky})),a=i||r((function(){var e=o("^r","gy");return e.lastIndex=2,null!=e.exec("str")}));e.exports={BROKEN_CARET:a,MISSED_STICKY:s,UNSUPPORTED_Y:i}},9441:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o(".","s");return!(e.dotAll&&e.exec("\n")&&"s"===e.flags)}))},7168:(e,t,n)=>{var r=n(7293),o=n(7854).RegExp;e.exports=r((function(){var e=o("(?<a>b)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$<a>c")}))},4488:(e,t,n)=>{var r=n(7854).TypeError;e.exports=function(e){if(null==e)throw r("Can't call method on "+e);return e}},3505:(e,t,n)=>{var r=n(7854),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},8003:(e,t,n)=>{var r=n(3070).f,o=n(2597),i=n(5112)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!o(e,i)&&r(e,i,{configurable:!0,value:t})}},6200:(e,t,n)=>{var r=n(2309),o=n(9711),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},5465:(e,t,n)=>{var r=n(7854),o=n(3505),i="__core-js_shared__",s=r[i]||o(i,{});e.exports=s},2309:(e,t,n)=>{var r=n(1913),o=n(5465);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.21.0",mode:r?"pure":"global",copyright:"© 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.21.0/LICENSE",source:"https://github.com/zloirock/core-js"})},8710:(e,t,n)=>{var r=n(1702),o=n(9303),i=n(1340),s=n(4488),a=r("".charAt),l=r("".charCodeAt),c=r("".slice),u=function(e){return function(t,n){var r,u,d=i(s(t)),f=o(n),h=d.length;return f<0||f>=h?e?"":void 0:(r=l(d,f))<55296||r>56319||f+1===h||(u=l(d,f+1))<56320||u>57343?e?a(d,f):r:e?c(d,f,f+2):u-56320+(r-55296<<10)+65536}};e.exports={codeAt:u(!1),charAt:u(!0)}},3111:(e,t,n)=>{var r=n(1702),o=n(4488),i=n(1340),s=n(1361),a=r("".replace),l="["+s+"]",c=RegExp("^"+l+l+"*"),u=RegExp(l+l+"*$"),d=function(e){return function(t){var n=i(o(t));return 1&e&&(n=a(n,c,"")),2&e&&(n=a(n,u,"")),n}};e.exports={start:d(1),end:d(2),trim:d(3)}},1400:(e,t,n)=>{var r=n(9303),o=Math.max,i=Math.min;e.exports=function(e,t){var n=r(e);return n<0?o(n+t,0):i(n,t)}},5656:(e,t,n)=>{var r=n(8361),o=n(4488);e.exports=function(e){return r(o(e))}},9303:e=>{var t=Math.ceil,n=Math.floor;e.exports=function(e){var r=+e;return r!=r||0===r?0:(r>0?n:t)(r)}},7466:(e,t,n)=>{var r=n(9303),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},7908:(e,t,n)=>{var r=n(7854),o=n(4488),i=r.Object;e.exports=function(e){return i(o(e))}},7593:(e,t,n)=>{var r=n(7854),o=n(6916),i=n(111),s=n(2190),a=n(8173),l=n(2140),c=n(5112),u=r.TypeError,d=c("toPrimitive");e.exports=function(e,t){if(!i(e)||s(e))return e;var n,r=a(e,d);if(r){if(void 0===t&&(t="default"),n=o(r,e,t),!i(n)||s(n))return n;throw u("Can't convert object to primitive value")}return void 0===t&&(t="number"),l(e,t)}},4948:(e,t,n)=>{var r=n(7593),o=n(2190);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},1694:(e,t,n)=>{var r={};r[n(5112)("toStringTag")]="z",e.exports="[object z]"===String(r)},1340:(e,t,n)=>{var r=n(7854),o=n(648),i=r.String;e.exports=function(e){if("Symbol"===o(e))throw TypeError("Cannot convert a Symbol value to a string");return i(e)}},6330:(e,t,n)=>{var r=n(7854).String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},9711:(e,t,n)=>{var r=n(1702),o=0,i=Math.random(),s=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+s(++o+i,36)}},3307:(e,t,n)=>{var r=n(133);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},3353:(e,t,n)=>{var r=n(9781),o=n(7293);e.exports=r&&o((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},5112:(e,t,n)=>{var r=n(7854),o=n(2309),i=n(2597),s=n(9711),a=n(133),l=n(3307),c=o("wks"),u=r.Symbol,d=u&&u.for,f=l?u:u&&u.withoutSetter||s;e.exports=function(e){if(!i(c,e)||!a&&"string"!=typeof c[e]){var t="Symbol."+e;a&&i(u,e)?c[e]=u[e]:c[e]=l&&d?d(t):f(t)}return c[e]}},1361:e=>{e.exports="\t\n\v\f\r                　\u2028\u2029\ufeff"},7327:(e,t,n)=>{"use strict";var r=n(2109),o=n(2092).filter;r({target:"Array",proto:!0,forced:!n(1194)("filter")},{filter:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}})},9554:(e,t,n)=>{"use strict";var r=n(2109),o=n(8533);r({target:"Array",proto:!0,forced:[].forEach!=o},{forEach:o})},6992:(e,t,n)=>{"use strict";var r=n(5656),o=n(1223),i=n(7497),s=n(9909),a=n(3070).f,l=n(654),c=n(1913),u=n(9781),d="Array Iterator",f=s.set,h=s.getterFor(d);e.exports=l(Array,"Array",(function(e,t){f(this,{type:d,target:r(e),index:0,kind:t})}),(function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");var p=i.Arguments=i.Array;if(o("keys"),o("values"),o("entries"),!c&&u&&"values"!==p.name)try{a(p,"name",{value:"values"})}catch(e){}},5827:(e,t,n)=>{"use strict";var r=n(2109),o=n(3671).left,i=n(9341),s=n(7392),a=n(5268);r({target:"Array",proto:!0,forced:!i("reduce")||!a&&s>79&&s<83},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},8309:(e,t,n)=>{var r=n(9781),o=n(6530).EXISTS,i=n(1702),s=n(3070).f,a=Function.prototype,l=i(a.toString),c=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,u=i(c.exec);r&&!o&&s(a,"name",{configurable:!0,get:function(){try{return u(c,l(this))[1]}catch(e){return""}}})},9601:(e,t,n)=>{var r=n(2109),o=n(1574);r({target:"Object",stat:!0,forced:Object.assign!==o},{assign:o})},1539:(e,t,n)=>{var r=n(1694),o=n(1320),i=n(288);r||o(Object.prototype,"toString",i,{unsafe:!0})},1058:(e,t,n)=>{var r=n(2109),o=n(3009);r({global:!0,forced:parseInt!=o},{parseInt:o})},4916:(e,t,n)=>{"use strict";var r=n(2109),o=n(2261);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},8783:(e,t,n)=>{"use strict";var r=n(8710).charAt,o=n(1340),i=n(9909),s=n(654),a="String Iterator",l=i.set,c=i.getterFor(a);s(String,"String",(function(e){l(this,{type:a,string:o(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?{value:void 0,done:!0}:(e=r(n,o),t.index+=e.length,{value:e,done:!1})}))},4723:(e,t,n)=>{"use strict";var r=n(6916),o=n(7007),i=n(9670),s=n(7466),a=n(1340),l=n(4488),c=n(8173),u=n(1530),d=n(7651);o("match",(function(e,t,n){return[function(t){var n=l(this),o=null==t?void 0:c(t,e);return o?r(o,t,n):new RegExp(t)[e](a(n))},function(e){var r=i(this),o=a(e),l=n(t,r,o);if(l.done)return l.value;if(!r.global)return d(r,o);var c=r.unicode;r.lastIndex=0;for(var f,h=[],p=0;null!==(f=d(r,o));){var m=a(f[0]);h[p]=m,""===m&&(r.lastIndex=u(o,s(r.lastIndex),c)),p++}return 0===p?null:h}]}))},5306:(e,t,n)=>{"use strict";var r=n(2104),o=n(6916),i=n(1702),s=n(7007),a=n(7293),l=n(9670),c=n(614),u=n(9303),d=n(7466),f=n(1340),h=n(4488),p=n(1530),m=n(8173),v=n(647),g=n(7651),b=n(5112)("replace"),y=Math.max,w=Math.min,x=i([].concat),k=i([].push),S=i("".indexOf),E=i("".slice),C="$0"==="a".replace(/./,"$0"),_=!!/./[b]&&""===/./[b]("a","$0");s("replace",(function(e,t,n){var i=_?"$":"$0";return[function(e,n){var r=h(this),i=null==e?void 0:m(e,b);return i?o(i,e,r,n):o(t,f(r),e,n)},function(e,o){var s=l(this),a=f(e);if("string"==typeof o&&-1===S(o,i)&&-1===S(o,"$<")){var h=n(t,s,a,o);if(h.done)return h.value}var m=c(o);m||(o=f(o));var b=s.global;if(b){var C=s.unicode;s.lastIndex=0}for(var _=[];;){var T=g(s,a);if(null===T)break;if(k(_,T),!b)break;""===f(T[0])&&(s.lastIndex=p(a,d(s.lastIndex),C))}for(var O,L="",R=0,D=0;D<_.length;D++){for(var A=f((T=_[D])[0]),I=y(w(u(T.index),a.length),0),M=[],F=1;F<T.length;F++)k(M,void 0===(O=T[F])?O:String(O));var P=T.groups;if(m){var H=x([A],M,I,a);void 0!==P&&k(H,P);var N=f(r(o,void 0,H))}else N=v(A,a,I,M,P,o);I>=R&&(L+=E(a,R,I)+N,R=I+A.length)}return L+E(a,R)}]}),!!a((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")}))||!C||_)},4129:(e,t,n)=>{"use strict";var r,o=n(7854),i=n(1702),s=n(2248),a=n(2423),l=n(7710),c=n(9320),u=n(111),d=n(2050),f=n(9909).enforce,h=n(8536),p=!o.ActiveXObject&&"ActiveXObject"in o,m=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},v=l("WeakMap",m,c);if(h&&p){r=c.getConstructor(m,"WeakMap",!0),a.enable();var g=v.prototype,b=i(g.delete),y=i(g.has),w=i(g.get),x=i(g.set);s(g,{delete:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),b(this,e)||t.frozen.delete(e)}return b(this,e)},has:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)||t.frozen.has(e)}return y(this,e)},get:function(e){if(u(e)&&!d(e)){var t=f(this);return t.frozen||(t.frozen=new r),y(this,e)?w(this,e):t.frozen.get(e)}return w(this,e)},set:function(e,t){if(u(e)&&!d(e)){var n=f(this);n.frozen||(n.frozen=new r),y(this,e)?x(this,e,t):n.frozen.set(e,t)}else x(this,e,t);return this}})}},4747:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(8533),a=n(8880),l=function(e){if(e&&e.forEach!==s)try{a(e,"forEach",s)}catch(t){e.forEach=s}};for(var c in o)o[c]&&l(r[c]&&r[c].prototype);l(i)},3948:(e,t,n)=>{var r=n(7854),o=n(8324),i=n(8509),s=n(6992),a=n(8880),l=n(5112),c=l("iterator"),u=l("toStringTag"),d=s.values,f=function(e,t){if(e){if(e[c]!==d)try{a(e,c,d)}catch(t){e[c]=d}if(e[u]||a(e,u,t),o[t])for(var n in s)if(e[n]!==s[n])try{a(e,n,s[n])}catch(t){e[n]=s[n]}}};for(var h in o)f(r[h]&&r[h].prototype,h);f(i,"DOMTokenList")},9843:(e,t,n)=>{e.exports={ResizeSensor:n(6087),ElementQueries:n(6456)}},6456:function(e,t,n){"use strict";var r,o,i;"undefined"!=typeof window&&window,o=[n(6087)],void 0===(i="function"==typeof(r=function(e){var t=function(){var t,n={},r=[];function o(e){e||(e=document.documentElement);var t=window.getComputedStyle(e,null).fontSize;return parseFloat(t)||16}function i(e,t){var n=t.split(/\d/),r=n[n.length-1];switch(t=parseFloat(t),r){case"px":default:return t;case"em":return t*o(e);case"rem":return t*o();case"vw":return t*document.documentElement.clientWidth/100;case"vh":return t*document.documentElement.clientHeight/100;case"vmin":case"vmax":var i=document.documentElement.clientWidth/100,s=document.documentElement.clientHeight/100;return t*(0,Math["vmin"===r?"min":"max"])(i,s)}}function s(e,t){var r,o,s,a,l,c,u,d;this.element=e;var f=["min-width","min-height","max-width","max-height"];this.call=function(){for(r in s=function(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}(this.element),c={},n[t])n[t].hasOwnProperty(r)&&(o=n[t][r],a=i(this.element,o.value),l="width"===o.property?s.width:s.height,d=o.mode+"-"+o.property,u="","min"===o.mode&&l>=a&&(u+=o.value),"max"===o.mode&&l<=a&&(u+=o.value),c[d]||(c[d]=""),u&&-1===(" "+c[d]+" ").indexOf(" "+u+" ")&&(c[d]+=" "+u));for(var e in f)f.hasOwnProperty(e)&&(c[f[e]]?this.element.setAttribute(f[e],c[f[e]].substr(1)):this.element.removeAttribute(f[e]))}}function a(t,n){t.elementQueriesSetupInformation||(t.elementQueriesSetupInformation=new s(t,n)),t.elementQueriesSensor||(t.elementQueriesSensor=new e(t,(function(){t.elementQueriesSetupInformation.call()})))}function l(e,o,i,s){if(void 0===n[e]){n[e]=[];var a=r.length;t.innerHTML+="\n"+e+" {animation: 0.1s element-queries;}",t.innerHTML+="\n"+e+" > .resize-sensor {min-width: "+a+"px;}",r.push(e)}n[e].push({mode:o,property:i,value:s})}function c(e){var t;if(document.querySelectorAll&&(t=e?e.querySelectorAll.bind(e):document.querySelectorAll.bind(document)),t||"undefined"==typeof $$||(t=$$),t||"undefined"==typeof jQuery||(t=jQuery),!t)throw"No document.querySelectorAll, jQuery or Mootools's $$ found.";return t}function u(t){var n=[],r=[],o=[],i=0,s=-1,a=[];for(var l in t.children)if(t.children.hasOwnProperty(l)&&t.children[l].tagName&&"img"===t.children[l].tagName.toLowerCase()){n.push(t.children[l]);var c=t.children[l].getAttribute("min-width")||t.children[l].getAttribute("data-min-width"),u=t.children[l].getAttribute("data-src")||t.children[l].getAttribute("url");o.push(u);var d={minWidth:c};r.push(d),c?t.children[l].style.display="none":(i=n.length-1,t.children[l].style.display="block")}function f(){var e,l=!1;for(e in n)n.hasOwnProperty(e)&&r[e].minWidth&&t.offsetWidth>r[e].minWidth&&(l=e);if(l||(l=i),s!==l)if(a[l])n[s].style.display="none",n[l].style.display="block",s=l;else{var c=new Image;c.onload=function(){n[l].src=o[l],n[s].style.display="none",n[l].style.display="block",a[l]=!0,s=l},c.src=o[l]}else n[l].src=o[l]}s=i,t.resizeSensorInstance=new e(t,f),f()}var d=/,?[\s\t]*([^,\n]*?)((?:\[[\s\t]*?(?:min|max)-(?:width|height)[\s\t]*?[~$\^]?=[\s\t]*?"[^"]*?"[\s\t]*?])+)([^,\n\s\{]*)/gim,f=/\[[\s\t]*?(min|max)-(width|height)[\s\t]*?[~$\^]?=[\s\t]*?"([^"]*?)"[\s\t]*?]/gim;function h(e){var t,n,r,o;for(e=e.replace(/'/g,'"');null!==(t=d.exec(e));)for(n=t[1]+t[3],r=t[2];null!==(o=f.exec(r));)l(n,o[1],o[2],o[3])}function p(e){var t="";if(e)if("string"==typeof e)-1===(e=e.toLowerCase()).indexOf("min-width")&&-1===e.indexOf("max-width")||h(e);else for(var n=0,r=e.length;n<r;n++)1===e[n].type?-1!==(t=e[n].selectorText||e[n].cssText).indexOf("min-height")||-1!==t.indexOf("max-height")?h(t):-1===t.indexOf("min-width")&&-1===t.indexOf("max-width")||h(t):4===e[n].type?p(e[n].cssRules||e[n].rules):3===e[n].type&&e[n].styleSheet.hasOwnProperty("cssRules")&&p(e[n].styleSheet.cssRules)}var m=!1;this.init=function(){var n="animationstart";void 0!==document.documentElement.style.webkitAnimationName?n="webkitAnimationStart":void 0!==document.documentElement.style.MozAnimationName?n="mozanimationstart":void 0!==document.documentElement.style.OAnimationName&&(n="oanimationstart"),document.body.addEventListener(n,(function(t){var n=t.target,o=n&&window.getComputedStyle(n,null),i=o&&o.getPropertyValue("animation-name");if(i&&-1!==i.indexOf("element-queries")){n.elementQueriesSensor=new e(n,(function(){n.elementQueriesSetupInformation&&n.elementQueriesSetupInformation.call()}));var s=window.getComputedStyle(n.resizeSensor,null).getPropertyValue("min-width");s=parseInt(s.replace("px","")),a(t.target,r[s])}})),m||((t=document.createElement("style")).type="text/css",t.innerHTML="[responsive-image] > img, [data-responsive-image] {overflow: hidden; padding: 0; } [responsive-image] > img, [data-responsive-image] > img {width: 100%;}",t.innerHTML+="\n@keyframes element-queries { 0% { visibility: inherit; } }",document.getElementsByTagName("head")[0].appendChild(t),m=!0);for(var o=0,i=document.styleSheets.length;o<i;o++)try{document.styleSheets[o].href&&0===document.styleSheets[o].href.indexOf("file://")&&console.warn("CssElementQueries: unable to parse local css files, "+document.styleSheets[o].href),p(document.styleSheets[o].cssRules||document.styleSheets[o].rules||document.styleSheets[o].cssText)}catch(e){}!function(){for(var e=c()("[data-responsive-image],[responsive-image]"),t=0,n=e.length;t<n;t++)u(e[t])}()},this.findElementQueriesElements=function(e){!function(e){var t=c(e);for(var r in n)if(n.hasOwnProperty(r))for(var o=t(r,e),i=0,s=o.length;i<s;i++)a(o[i],r)}(e)},this.update=function(){this.init()}};t.update=function(){t.instance.update()},t.detach=function(e){e.elementQueriesSetupInformation?(e.elementQueriesSensor.detach(),delete e.elementQueriesSetupInformation,delete e.elementQueriesSensor):e.resizeSensorInstance&&(e.resizeSensorInstance.detach(),delete e.resizeSensorInstance)},t.init=function(){t.instance||(t.instance=new t),t.instance.init()};return t.findElementQueriesElements=function(e){t.instance.findElementQueriesElements(e)},t.listen=function(){!function(e){if(document.addEventListener)document.addEventListener("DOMContentLoaded",e,!1);else if(/KHTML|WebKit|iCab/i.test(navigator.userAgent))var t=setInterval((function(){/loaded|complete/i.test(document.readyState)&&(e(),clearInterval(t))}),10);else window.onload=e}(t.init)},t})?r.apply(t,o):r)||(e.exports=i)},6087:function(e,t,n){"use strict";var r,o;"undefined"!=typeof window&&window,void 0===(o="function"==typeof(r=function(){if("undefined"==typeof window)return null;var e="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),t=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||function(t){return e.setTimeout(t,20)},n=e.cancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelAnimationFrame||function(t){e.clearTimeout(t)};function r(e,t){var n=Object.prototype.toString.call(e),r="[object Array]"===n||"[object NodeList]"===n||"[object HTMLCollection]"===n||"[object Object]"===n||"undefined"!=typeof jQuery&&e instanceof jQuery||"undefined"!=typeof Elements&&e instanceof Elements,o=0,i=e.length;if(r)for(;o<i;o++)t(e[o]);else t(e)}function o(e){if(!e.getBoundingClientRect)return{width:e.offsetWidth,height:e.offsetHeight};var t=e.getBoundingClientRect();return{width:Math.round(t.width),height:Math.round(t.height)}}function i(e,t){Object.keys(t).forEach((function(n){e.style[n]=t[n]}))}var s=function(e,a){var l=0;function c(){var e,t,n=[];this.add=function(e){n.push(e)},this.call=function(r){for(e=0,t=n.length;e<t;e++)n[e].call(this,r)},this.remove=function(r){var o=[];for(e=0,t=n.length;e<t;e++)n[e]!==r&&o.push(n[e]);n=o},this.length=function(){return n.length}}function u(e,n){if(e)if(e.resizedAttached)e.resizedAttached.add(n);else{e.resizedAttached=new c,e.resizedAttached.add(n),e.resizeSensor=document.createElement("div"),e.resizeSensor.dir="ltr",e.resizeSensor.className="resize-sensor";var r={pointerEvents:"none",position:"absolute",left:"0px",top:"0px",right:"0px",bottom:"0px",overflow:"hidden",zIndex:"-1",visibility:"hidden",maxWidth:"100%"},s={position:"absolute",left:"0px",top:"0px",transition:"0s"};i(e.resizeSensor,r);var a=document.createElement("div");a.className="resize-sensor-expand",i(a,r);var u=document.createElement("div");i(u,s),a.appendChild(u);var d=document.createElement("div");d.className="resize-sensor-shrink",i(d,r);var f=document.createElement("div");i(f,s),i(f,{width:"200%",height:"200%"}),d.appendChild(f),e.resizeSensor.appendChild(a),e.resizeSensor.appendChild(d),e.appendChild(e.resizeSensor);var h=window.getComputedStyle(e),p=h?h.getPropertyValue("position"):null;"absolute"!==p&&"relative"!==p&&"fixed"!==p&&"sticky"!==p&&(e.style.position="relative");var m=!1,v=0,g=o(e),b=0,y=0,w=!0;l=0;var x=function(){if(w){if(0===e.offsetWidth&&0===e.offsetHeight)return void(l||(l=t((function(){l=0,x()}))));w=!1}var n,r;n=e.offsetWidth,r=e.offsetHeight,u.style.width=n+10+"px",u.style.height=r+10+"px",a.scrollLeft=n+10,a.scrollTop=r+10,d.scrollLeft=n+10,d.scrollTop=r+10};e.resizeSensor.resetSensor=x;var k=function(){v=0,m&&(b=g.width,y=g.height,e.resizedAttached&&e.resizedAttached.call(g))},S=function(){g=o(e),(m=g.width!==b||g.height!==y)&&!v&&(v=t(k)),x()},E=function(e,t,n){e.attachEvent?e.attachEvent("on"+t,n):e.addEventListener(t,n)};E(a,"scroll",S),E(d,"scroll",S),l=t((function(){l=0,x()}))}}r(e,(function(e){u(e,a)})),this.detach=function(t){l||(n(l),l=0),s.detach(e,t)},this.reset=function(){e.resizeSensor.resetSensor()}};if(s.reset=function(e){r(e,(function(e){e.resizeSensor.resetSensor()}))},s.detach=function(e,t){r(e,(function(e){e&&(e.resizedAttached&&"function"==typeof t&&(e.resizedAttached.remove(t),e.resizedAttached.length())||e.resizeSensor&&(e.contains(e.resizeSensor)&&e.removeChild(e.resizeSensor),delete e.resizeSensor,delete e.resizedAttached))}))},"undefined"!=typeof MutationObserver){var a=new MutationObserver((function(e){for(var t in e)if(e.hasOwnProperty(t))for(var n=e[t].addedNodes,r=0;r<n.length;r++)n[r].resizeSensor&&s.reset(n[r])}));document.addEventListener("DOMContentLoaded",(function(e){a.observe(document.body,{childList:!0,subtree:!0})}))}return s})?r.call(t,n,t,e):r)||(e.exports=o)},1296:(e,t,n)=>{var r=/^\s+|\s+$/g,o=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,s=/^0o[0-7]+$/i,a=parseInt,l="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,c="object"==typeof self&&self&&self.Object===Object&&self,u=l||c||Function("return this")(),d=Object.prototype.toString,f=Math.max,h=Math.min,p=function(){return u.Date.now()};function m(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function v(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==d.call(e)}(e))return NaN;if(m(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=m(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=i.test(e);return n||s.test(e)?a(e.slice(2),n?2:8):o.test(e)?NaN:+e}e.exports=function(e,t,n){var r,o,i,s,a,l,c=0,u=!1,d=!1,g=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var n=r,i=o;return r=o=void 0,c=t,s=e.apply(i,n)}function y(e){return c=e,a=setTimeout(x,t),u?b(e):s}function w(e){var n=e-l;return void 0===l||n>=t||n<0||d&&e-c>=i}function x(){var e=p();if(w(e))return k(e);a=setTimeout(x,function(e){var n=t-(e-l);return d?h(n,i-(e-c)):n}(e))}function k(e){return a=void 0,g&&r?b(e):(r=o=void 0,s)}function S(){var e=p(),n=w(e);if(r=arguments,o=this,l=e,n){if(void 0===a)return y(l);if(d)return a=setTimeout(x,t),b(l)}return void 0===a&&(a=setTimeout(x,t)),s}return t=v(t)||0,m(n)&&(u=!!n.leading,i=(d="maxWait"in n)?f(v(n.maxWait)||0,t):i,g="trailing"in n?!!n.trailing:g),S.cancel=function(){void 0!==a&&clearTimeout(a),c=0,r=l=o=a=void 0},S.flush=function(){return void 0===a?s:k(p())},S}},773:(e,t,n)=>{var r,o="__lodash_hash_undefined__",i=/^\[object .+?Constructor\]$/,s="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=s||a||Function("return this")(),c=Array.prototype,u=Function.prototype,d=Object.prototype,f=l["__core-js_shared__"],h=(r=/[^.]+$/.exec(f&&f.keys&&f.keys.IE_PROTO||""))?"Symbol(src)_1."+r:"",p=u.toString,m=d.hasOwnProperty,v=d.toString,g=RegExp("^"+p.call(m).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),b=c.splice,y=_(l,"Map"),w=_(Object,"create");function x(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function k(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function S(e){var t=-1,n=e?e.length:0;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function E(e,t){for(var n,r,o=e.length;o--;)if((n=e[o][0])===(r=t)||n!=n&&r!=r)return o;return-1}function C(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function _(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return function(e){if(!O(e)||h&&h in e)return!1;var t=function(e){var t=O(e)?v.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e)?g:i;return t.test(function(e){if(null!=e){try{return p.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}(n)?n:void 0}function T(e,t){if("function"!=typeof e||t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],i=n.cache;if(i.has(o))return i.get(o);var s=e.apply(this,r);return n.cache=i.set(o,s),s};return n.cache=new(T.Cache||S),n}function O(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}x.prototype.clear=function(){this.__data__=w?w(null):{}},x.prototype.delete=function(e){return this.has(e)&&delete this.__data__[e]},x.prototype.get=function(e){var t=this.__data__;if(w){var n=t[e];return n===o?void 0:n}return m.call(t,e)?t[e]:void 0},x.prototype.has=function(e){var t=this.__data__;return w?void 0!==t[e]:m.call(t,e)},x.prototype.set=function(e,t){return this.__data__[e]=w&&void 0===t?o:t,this},k.prototype.clear=function(){this.__data__=[]},k.prototype.delete=function(e){var t=this.__data__,n=E(t,e);return!(n<0||(n==t.length-1?t.pop():b.call(t,n,1),0))},k.prototype.get=function(e){var t=this.__data__,n=E(t,e);return n<0?void 0:t[n][1]},k.prototype.has=function(e){return E(this.__data__,e)>-1},k.prototype.set=function(e,t){var n=this.__data__,r=E(n,e);return r<0?n.push([e,t]):n[r][1]=t,this},S.prototype.clear=function(){this.__data__={hash:new x,map:new(y||k),string:new x}},S.prototype.delete=function(e){return C(this,e).delete(e)},S.prototype.get=function(e){return C(this,e).get(e)},S.prototype.has=function(e){return C(this,e).has(e)},S.prototype.set=function(e,t){return C(this,e).set(e,t),this},T.Cache=S,e.exports=T},3096:(e,t,n)=>{var r="Expected a function",o=/^\s+|\s+$/g,i=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,l=parseInt,c="object"==typeof n.g&&n.g&&n.g.Object===Object&&n.g,u="object"==typeof self&&self&&self.Object===Object&&self,d=c||u||Function("return this")(),f=Object.prototype.toString,h=Math.max,p=Math.min,m=function(){return d.Date.now()};function v(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function g(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==f.call(e)}(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(o,"");var n=s.test(e);return n||a.test(e)?l(e.slice(2),n?2:8):i.test(e)?NaN:+e}e.exports=function(e,t,n){var o=!0,i=!0;if("function"!=typeof e)throw new TypeError(r);return v(n)&&(o="leading"in n?!!n.leading:o,i="trailing"in n?!!n.trailing:i),function(e,t,n){var o,i,s,a,l,c,u=0,d=!1,f=!1,b=!0;if("function"!=typeof e)throw new TypeError(r);function y(t){var n=o,r=i;return o=i=void 0,u=t,a=e.apply(r,n)}function w(e){return u=e,l=setTimeout(k,t),d?y(e):a}function x(e){var n=e-c;return void 0===c||n>=t||n<0||f&&e-u>=s}function k(){var e=m();if(x(e))return S(e);l=setTimeout(k,function(e){var n=t-(e-c);return f?p(n,s-(e-u)):n}(e))}function S(e){return l=void 0,b&&o?y(e):(o=i=void 0,a)}function E(){var e=m(),n=x(e);if(o=arguments,i=this,c=e,n){if(void 0===l)return w(c);if(f)return l=setTimeout(k,t),y(c)}return void 0===l&&(l=setTimeout(k,t)),a}return t=g(t)||0,v(n)&&(d=!!n.leading,s=(f="maxWait"in n)?h(g(n.maxWait)||0,t):s,b="trailing"in n?!!n.trailing:b),E.cancel=function(){void 0!==l&&clearTimeout(l),u=0,o=c=i=l=void 0},E.flush=function(){return void 0===l?a:S(m())},E}(e,t,{leading:o,maxWait:t,trailing:i})}},7924:(e,t,n)=>{"use strict";n.d(t,{Z:()=>ne}),n(9554),n(4747);var r,o=n(1807),i=n.n(o),s=(n(7327),n(6992),n(9601),n(1539),n(1058),n(8783),n(4129),n(3948),n(3096)),a=n.n(s),l=n(1296),c=n.n(l),u=n(773),d=n.n(u),f=[],h="ResizeObserver loop completed with undelivered notifications.";!function(e){e.BORDER_BOX="border-box",e.CONTENT_BOX="content-box",e.DEVICE_PIXEL_CONTENT_BOX="device-pixel-content-box"}(r||(r={}));var p,m=function(e){return Object.freeze(e)},v=function(e,t){this.inlineSize=e,this.blockSize=t,m(this)},g=function(){function e(e,t,n,r){return this.x=e,this.y=t,this.width=n,this.height=r,this.top=this.y,this.left=this.x,this.bottom=this.top+this.height,this.right=this.left+this.width,m(this)}return e.prototype.toJSON=function(){var e=this;return{x:e.x,y:e.y,top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.width,height:e.height}},e.fromRect=function(t){return new e(t.x,t.y,t.width,t.height)},e}(),b=function(e){return e instanceof SVGElement&&"getBBox"in e},y=function(e){if(b(e)){var t=e.getBBox(),n=t.width,r=t.height;return!n&&!r}var o=e,i=o.offsetWidth,s=o.offsetHeight;return!(i||s||e.getClientRects().length)},w=function(e){var t,n;if(e instanceof Element)return!0;var r=null===(n=null===(t=e)||void 0===t?void 0:t.ownerDocument)||void 0===n?void 0:n.defaultView;return!!(r&&e instanceof r.Element)},x="undefined"!=typeof window?window:{},k=new WeakMap,S=/auto|scroll/,E=/^tb|vertical/,C=/msie|trident/i.test(x.navigator&&x.navigator.userAgent),_=function(e){return parseFloat(e||"0")},T=function(e,t,n){return void 0===e&&(e=0),void 0===t&&(t=0),void 0===n&&(n=!1),new v((n?t:e)||0,(n?e:t)||0)},O=m({devicePixelContentBoxSize:T(),borderBoxSize:T(),contentBoxSize:T(),contentRect:new g(0,0,0,0)}),L=function(e,t){if(void 0===t&&(t=!1),k.has(e)&&!t)return k.get(e);if(y(e))return k.set(e,O),O;var n=getComputedStyle(e),r=b(e)&&e.ownerSVGElement&&e.getBBox(),o=!C&&"border-box"===n.boxSizing,i=E.test(n.writingMode||""),s=!r&&S.test(n.overflowY||""),a=!r&&S.test(n.overflowX||""),l=r?0:_(n.paddingTop),c=r?0:_(n.paddingRight),u=r?0:_(n.paddingBottom),d=r?0:_(n.paddingLeft),f=r?0:_(n.borderTopWidth),h=r?0:_(n.borderRightWidth),p=r?0:_(n.borderBottomWidth),v=d+c,w=l+u,x=(r?0:_(n.borderLeftWidth))+h,L=f+p,R=a?e.offsetHeight-L-e.clientHeight:0,D=s?e.offsetWidth-x-e.clientWidth:0,A=o?v+x:0,I=o?w+L:0,M=r?r.width:_(n.width)-A-D,F=r?r.height:_(n.height)-I-R,P=M+v+D+x,H=F+w+R+L,N=m({devicePixelContentBoxSize:T(Math.round(M*devicePixelRatio),Math.round(F*devicePixelRatio),i),borderBoxSize:T(P,H,i),contentBoxSize:T(M,F,i),contentRect:new g(d,l,M,F)});return k.set(e,N),N},R=function(e,t,n){var o=L(e,n),i=o.borderBoxSize,s=o.contentBoxSize,a=o.devicePixelContentBoxSize;switch(t){case r.DEVICE_PIXEL_CONTENT_BOX:return a;case r.BORDER_BOX:return i;default:return s}},D=function(e){var t=L(e);this.target=e,this.contentRect=t.contentRect,this.borderBoxSize=m([t.borderBoxSize]),this.contentBoxSize=m([t.contentBoxSize]),this.devicePixelContentBoxSize=m([t.devicePixelContentBoxSize])},A=function(e){if(y(e))return 1/0;for(var t=0,n=e.parentNode;n;)t+=1,n=n.parentNode;return t},I=function(){var e=1/0,t=[];f.forEach((function(n){if(0!==n.activeTargets.length){var r=[];n.activeTargets.forEach((function(t){var n=new D(t.target),o=A(t.target);r.push(n),t.lastReportedSize=R(t.target,t.observedBox),o<e&&(e=o)})),t.push((function(){n.callback.call(n.observer,r,n.observer)})),n.activeTargets.splice(0,n.activeTargets.length)}}));for(var n=0,r=t;n<r.length;n++)(0,r[n])();return e},M=function(e){f.forEach((function(t){t.activeTargets.splice(0,t.activeTargets.length),t.skippedTargets.splice(0,t.skippedTargets.length),t.observationTargets.forEach((function(n){n.isActive()&&(A(n.target)>e?t.activeTargets.push(n):t.skippedTargets.push(n))}))}))},F=[],P=0,H={attributes:!0,characterData:!0,childList:!0,subtree:!0},N=["resize","load","transitionend","animationend","animationstart","animationiteration","keyup","keydown","mouseup","mousedown","mouseover","mouseout","blur","focus"],j=function(e){return void 0===e&&(e=0),Date.now()+e},W=!1,B=new(function(){function e(){var e=this;this.stopped=!0,this.listener=function(){return e.schedule()}}return e.prototype.run=function(e){var t=this;if(void 0===e&&(e=250),!W){W=!0;var n,r=j(e);n=function(){var n=!1;try{n=function(){var e,t=0;for(M(t);f.some((function(e){return e.activeTargets.length>0}));)t=I(),M(t);return f.some((function(e){return e.skippedTargets.length>0}))&&("function"==typeof ErrorEvent?e=new ErrorEvent("error",{message:h}):((e=document.createEvent("Event")).initEvent("error",!1,!1),e.message=h),window.dispatchEvent(e)),t>0}()}finally{if(W=!1,e=r-j(),!P)return;n?t.run(1e3):e>0?t.run(e):t.start()}},function(e){if(!p){var t=0,n=document.createTextNode("");new MutationObserver((function(){return F.splice(0).forEach((function(e){return e()}))})).observe(n,{characterData:!0}),p=function(){n.textContent=""+(t?t--:t++)}}F.push(e),p()}((function(){requestAnimationFrame(n)}))}},e.prototype.schedule=function(){this.stop(),this.run()},e.prototype.observe=function(){var e=this,t=function(){return e.observer&&e.observer.observe(document.body,H)};document.body?t():x.addEventListener("DOMContentLoaded",t)},e.prototype.start=function(){var e=this;this.stopped&&(this.stopped=!1,this.observer=new MutationObserver(this.listener),this.observe(),N.forEach((function(t){return x.addEventListener(t,e.listener,!0)})))},e.prototype.stop=function(){var e=this;this.stopped||(this.observer&&this.observer.disconnect(),N.forEach((function(t){return x.removeEventListener(t,e.listener,!0)})),this.stopped=!0)},e}()),z=function(e){!P&&e>0&&B.start(),!(P+=e)&&B.stop()},V=function(){function e(e,t){this.target=e,this.observedBox=t||r.CONTENT_BOX,this.lastReportedSize={inlineSize:0,blockSize:0}}return e.prototype.isActive=function(){var e,t=R(this.target,this.observedBox,!0);return e=this.target,b(e)||function(e){switch(e.tagName){case"INPUT":if("image"!==e.type)break;case"VIDEO":case"AUDIO":case"EMBED":case"OBJECT":case"CANVAS":case"IFRAME":case"IMG":return!0}return!1}(e)||"inline"!==getComputedStyle(e).display||(this.lastReportedSize=t),this.lastReportedSize.inlineSize!==t.inlineSize||this.lastReportedSize.blockSize!==t.blockSize},e}(),q=function(e,t){this.activeTargets=[],this.skippedTargets=[],this.observationTargets=[],this.observer=e,this.callback=t},$=new WeakMap,U=function(e,t){for(var n=0;n<e.length;n+=1)if(e[n].target===t)return n;return-1},Z=function(){function e(){}return e.connect=function(e,t){var n=new q(e,t);$.set(e,n)},e.observe=function(e,t,n){var r=$.get(e),o=0===r.observationTargets.length;U(r.observationTargets,t)<0&&(o&&f.push(r),r.observationTargets.push(new V(t,n&&n.box)),z(1),B.schedule())},e.unobserve=function(e,t){var n=$.get(e),r=U(n.observationTargets,t),o=1===n.observationTargets.length;r>=0&&(o&&f.splice(f.indexOf(n),1),n.observationTargets.splice(r,1),z(-1))},e.disconnect=function(e){var t=this,n=$.get(e);n.observationTargets.slice().forEach((function(n){return t.unobserve(e,n.target)})),n.activeTargets.splice(0,n.activeTargets.length)},e}(),Y=function(){function e(e){if(0===arguments.length)throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");if("function"!=typeof e)throw new TypeError("Failed to construct 'ResizeObserver': The callback provided as parameter 1 is not a function.");Z.connect(this,e)}return e.prototype.observe=function(e,t){if(0===arguments.length)throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'observe' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.observe(this,e,t)},e.prototype.unobserve=function(e){if(0===arguments.length)throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': 1 argument required, but only 0 present.");if(!w(e))throw new TypeError("Failed to execute 'unobserve' on 'ResizeObserver': parameter 1 is not of type 'Element");Z.unobserve(this,e)},e.prototype.disconnect=function(){Z.disconnect(this)},e.toString=function(){return"function ResizeObserver () { [polyfill code] }"},e}(),G=(n(5827),n(8309),n(4916),n(4723),n(5306),function(e){return Array.prototype.reduce.call(e,(function(e,t){var n=t.name.match(/data-simplebar-(.+)/);if(n){var r=n[1].replace(/\W+(.)/g,(function(e,t){return t.toUpperCase()}));switch(t.value){case"true":e[r]=!0;break;case"false":e[r]=!1;break;case void 0:e[r]=!0;break;default:e[r]=t.value}}return e}),{})});function J(e){return e&&e.ownerDocument&&e.ownerDocument.defaultView?e.ownerDocument.defaultView:window}function K(e){return e&&e.ownerDocument?e.ownerDocument:document}var X=null,Q=null;function ee(e){if(null===X){var t=K(e);if(void 0===t)return X=0;var n=t.body,r=t.createElement("div");r.classList.add("simplebar-hide-scrollbar"),n.appendChild(r);var o=r.getBoundingClientRect().right;n.removeChild(r),X=o}return X}i()&&window.addEventListener("resize",(function(){Q!==window.devicePixelRatio&&(Q=window.devicePixelRatio,X=null)}));var te=function(){function e(t,n){var r=this;this.onScroll=function(){var e=J(r.el);r.scrollXTicking||(e.requestAnimationFrame(r.scrollX),r.scrollXTicking=!0),r.scrollYTicking||(e.requestAnimationFrame(r.scrollY),r.scrollYTicking=!0)},this.scrollX=function(){r.axis.x.isOverflowing&&(r.showScrollbar("x"),r.positionScrollbar("x")),r.scrollXTicking=!1},this.scrollY=function(){r.axis.y.isOverflowing&&(r.showScrollbar("y"),r.positionScrollbar("y")),r.scrollYTicking=!1},this.onMouseEnter=function(){r.showScrollbar("x"),r.showScrollbar("y")},this.onMouseMove=function(e){r.mouseX=e.clientX,r.mouseY=e.clientY,(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseMoveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseMoveForAxis("y")},this.onMouseLeave=function(){r.onMouseMove.cancel(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&r.onMouseLeaveForAxis("x"),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&r.onMouseLeaveForAxis("y"),r.mouseX=-1,r.mouseY=-1},this.onWindowResize=function(){r.scrollbarWidth=r.getScrollbarWidth(),r.hideNativeScrollbar()},this.hideScrollbars=function(){r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.track.rect)||(r.axis.y.scrollbar.el.classList.remove(r.classNames.visible),r.axis.y.isVisible=!1),r.isWithinBounds(r.axis.x.track.rect)||(r.axis.x.scrollbar.el.classList.remove(r.classNames.visible),r.axis.x.isVisible=!1)},this.onPointerEvent=function(e){var t,n;r.axis.x.track.rect=r.axis.x.track.el.getBoundingClientRect(),r.axis.y.track.rect=r.axis.y.track.el.getBoundingClientRect(),(r.axis.x.isOverflowing||r.axis.x.forceVisible)&&(t=r.isWithinBounds(r.axis.x.track.rect)),(r.axis.y.isOverflowing||r.axis.y.forceVisible)&&(n=r.isWithinBounds(r.axis.y.track.rect)),(t||n)&&(e.preventDefault(),e.stopPropagation(),"mousedown"===e.type&&(t&&(r.axis.x.scrollbar.rect=r.axis.x.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.x.scrollbar.rect)?r.onDragStart(e,"x"):r.onTrackClick(e,"x")),n&&(r.axis.y.scrollbar.rect=r.axis.y.scrollbar.el.getBoundingClientRect(),r.isWithinBounds(r.axis.y.scrollbar.rect)?r.onDragStart(e,"y"):r.onTrackClick(e,"y"))))},this.drag=function(t){var n=r.axis[r.draggedAxis].track,o=n.rect[r.axis[r.draggedAxis].sizeAttr],i=r.axis[r.draggedAxis].scrollbar,s=r.contentWrapperEl[r.axis[r.draggedAxis].scrollSizeAttr],a=parseInt(r.elStyles[r.axis[r.draggedAxis].sizeAttr],10);t.preventDefault(),t.stopPropagation();var l=(("y"===r.draggedAxis?t.pageY:t.pageX)-n.rect[r.axis[r.draggedAxis].offsetAttr]-r.axis[r.draggedAxis].dragOffset)/(o-i.size)*(s-a);"x"===r.draggedAxis&&(l=r.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l-(o+i.size):l,l=r.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-l:l),r.contentWrapperEl[r.axis[r.draggedAxis].scrollOffsetAttr]=l},this.onEndDrag=function(e){var t=K(r.el),n=J(r.el);e.preventDefault(),e.stopPropagation(),r.el.classList.remove(r.classNames.dragging),t.removeEventListener("mousemove",r.drag,!0),t.removeEventListener("mouseup",r.onEndDrag,!0),r.removePreventClickId=n.setTimeout((function(){t.removeEventListener("click",r.preventClick,!0),t.removeEventListener("dblclick",r.preventClick,!0),r.removePreventClickId=null}))},this.preventClick=function(e){e.preventDefault(),e.stopPropagation()},this.el=t,this.minScrollbarWidth=20,this.options=Object.assign({},e.defaultOptions,{},n),this.classNames=Object.assign({},e.defaultOptions.classNames,{},this.options.classNames),this.axis={x:{scrollOffsetAttr:"scrollLeft",sizeAttr:"width",scrollSizeAttr:"scrollWidth",offsetSizeAttr:"offsetWidth",offsetAttr:"left",overflowAttr:"overflowX",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}},y:{scrollOffsetAttr:"scrollTop",sizeAttr:"height",scrollSizeAttr:"scrollHeight",offsetSizeAttr:"offsetHeight",offsetAttr:"top",overflowAttr:"overflowY",dragOffset:0,isOverflowing:!0,isVisible:!1,forceVisible:!1,track:{},scrollbar:{}}},this.removePreventClickId=null,e.instances.has(this.el)||(this.recalculate=a()(this.recalculate.bind(this),64),this.onMouseMove=a()(this.onMouseMove.bind(this),64),this.hideScrollbars=c()(this.hideScrollbars.bind(this),this.options.timeout),this.onWindowResize=c()(this.onWindowResize.bind(this),64,{leading:!0}),e.getRtlHelpers=d()(e.getRtlHelpers),this.init())}e.getRtlHelpers=function(){var t=document.createElement("div");t.innerHTML='<div class="hs-dummy-scrollbar-size"><div style="height: 200%; width: 200%; margin: 10px 0;"></div></div>';var n=t.firstElementChild;document.body.appendChild(n);var r=n.firstElementChild;n.scrollLeft=0;var o=e.getOffset(n),i=e.getOffset(r);n.scrollLeft=999;var s=e.getOffset(r);return{isRtlScrollingInverted:o.left!==i.left&&i.left-s.left!=0,isRtlScrollbarInverted:o.left!==i.left}},e.getOffset=function(e){var t=e.getBoundingClientRect(),n=K(e),r=J(e);return{top:t.top+(r.pageYOffset||n.documentElement.scrollTop),left:t.left+(r.pageXOffset||n.documentElement.scrollLeft)}};var t=e.prototype;return t.init=function(){e.instances.set(this.el,this),i()&&(this.initDOM(),this.setAccessibilityAttributes(),this.scrollbarWidth=this.getScrollbarWidth(),this.recalculate(),this.initListeners())},t.initDOM=function(){var e=this;if(Array.prototype.filter.call(this.el.children,(function(t){return t.classList.contains(e.classNames.wrapper)})).length)this.wrapperEl=this.el.querySelector("."+this.classNames.wrapper),this.contentWrapperEl=this.options.scrollableNode||this.el.querySelector("."+this.classNames.contentWrapper),this.contentEl=this.options.contentNode||this.el.querySelector("."+this.classNames.contentEl),this.offsetEl=this.el.querySelector("."+this.classNames.offset),this.maskEl=this.el.querySelector("."+this.classNames.mask),this.placeholderEl=this.findChild(this.wrapperEl,"."+this.classNames.placeholder),this.heightAutoObserverWrapperEl=this.el.querySelector("."+this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl=this.el.querySelector("."+this.classNames.heightAutoObserverEl),this.axis.x.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.horizontal),this.axis.y.track.el=this.findChild(this.el,"."+this.classNames.track+"."+this.classNames.vertical);else{for(this.wrapperEl=document.createElement("div"),this.contentWrapperEl=document.createElement("div"),this.offsetEl=document.createElement("div"),this.maskEl=document.createElement("div"),this.contentEl=document.createElement("div"),this.placeholderEl=document.createElement("div"),this.heightAutoObserverWrapperEl=document.createElement("div"),this.heightAutoObserverEl=document.createElement("div"),this.wrapperEl.classList.add(this.classNames.wrapper),this.contentWrapperEl.classList.add(this.classNames.contentWrapper),this.offsetEl.classList.add(this.classNames.offset),this.maskEl.classList.add(this.classNames.mask),this.contentEl.classList.add(this.classNames.contentEl),this.placeholderEl.classList.add(this.classNames.placeholder),this.heightAutoObserverWrapperEl.classList.add(this.classNames.heightAutoObserverWrapperEl),this.heightAutoObserverEl.classList.add(this.classNames.heightAutoObserverEl);this.el.firstChild;)this.contentEl.appendChild(this.el.firstChild);this.contentWrapperEl.appendChild(this.contentEl),this.offsetEl.appendChild(this.contentWrapperEl),this.maskEl.appendChild(this.offsetEl),this.heightAutoObserverWrapperEl.appendChild(this.heightAutoObserverEl),this.wrapperEl.appendChild(this.heightAutoObserverWrapperEl),this.wrapperEl.appendChild(this.maskEl),this.wrapperEl.appendChild(this.placeholderEl),this.el.appendChild(this.wrapperEl)}if(!this.axis.x.track.el||!this.axis.y.track.el){var t=document.createElement("div"),n=document.createElement("div");t.classList.add(this.classNames.track),n.classList.add(this.classNames.scrollbar),t.appendChild(n),this.axis.x.track.el=t.cloneNode(!0),this.axis.x.track.el.classList.add(this.classNames.horizontal),this.axis.y.track.el=t.cloneNode(!0),this.axis.y.track.el.classList.add(this.classNames.vertical),this.el.appendChild(this.axis.x.track.el),this.el.appendChild(this.axis.y.track.el)}this.axis.x.scrollbar.el=this.axis.x.track.el.querySelector("."+this.classNames.scrollbar),this.axis.y.scrollbar.el=this.axis.y.track.el.querySelector("."+this.classNames.scrollbar),this.options.autoHide||(this.axis.x.scrollbar.el.classList.add(this.classNames.visible),this.axis.y.scrollbar.el.classList.add(this.classNames.visible)),this.el.setAttribute("data-simplebar","init")},t.setAccessibilityAttributes=function(){var e=this.options.ariaLabel||"scrollable content";this.contentWrapperEl.setAttribute("tabindex","0"),this.contentWrapperEl.setAttribute("role","region"),this.contentWrapperEl.setAttribute("aria-label",e)},t.initListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.addEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.addEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.addEventListener("mousemove",this.onMouseMove),this.el.addEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl.addEventListener("scroll",this.onScroll),t.addEventListener("resize",this.onWindowResize);var n=!1,r=t.ResizeObserver||Y;this.resizeObserver=new r((function(){n&&e.recalculate()})),this.resizeObserver.observe(this.el),this.resizeObserver.observe(this.contentEl),t.requestAnimationFrame((function(){n=!0})),this.mutationObserver=new t.MutationObserver(this.recalculate),this.mutationObserver.observe(this.contentEl,{childList:!0,subtree:!0,characterData:!0})},t.recalculate=function(){var e=J(this.el);this.elStyles=e.getComputedStyle(this.el),this.isRtl="rtl"===this.elStyles.direction;var t=this.heightAutoObserverEl.offsetHeight<=1,n=this.heightAutoObserverEl.offsetWidth<=1,r=this.contentEl.offsetWidth,o=this.contentWrapperEl.offsetWidth,i=this.elStyles.overflowX,s=this.elStyles.overflowY;this.contentEl.style.padding=this.elStyles.paddingTop+" "+this.elStyles.paddingRight+" "+this.elStyles.paddingBottom+" "+this.elStyles.paddingLeft,this.wrapperEl.style.margin="-"+this.elStyles.paddingTop+" -"+this.elStyles.paddingRight+" -"+this.elStyles.paddingBottom+" -"+this.elStyles.paddingLeft;var a=this.contentEl.scrollHeight,l=this.contentEl.scrollWidth;this.contentWrapperEl.style.height=t?"auto":"100%",this.placeholderEl.style.width=n?r+"px":"auto",this.placeholderEl.style.height=a+"px";var c=this.contentWrapperEl.offsetHeight;this.axis.x.isOverflowing=l>r,this.axis.y.isOverflowing=a>c,this.axis.x.isOverflowing="hidden"!==i&&this.axis.x.isOverflowing,this.axis.y.isOverflowing="hidden"!==s&&this.axis.y.isOverflowing,this.axis.x.forceVisible="x"===this.options.forceVisible||!0===this.options.forceVisible,this.axis.y.forceVisible="y"===this.options.forceVisible||!0===this.options.forceVisible,this.hideNativeScrollbar();var u=this.axis.x.isOverflowing?this.scrollbarWidth:0,d=this.axis.y.isOverflowing?this.scrollbarWidth:0;this.axis.x.isOverflowing=this.axis.x.isOverflowing&&l>o-d,this.axis.y.isOverflowing=this.axis.y.isOverflowing&&a>c-u,this.axis.x.scrollbar.size=this.getScrollbarSize("x"),this.axis.y.scrollbar.size=this.getScrollbarSize("y"),this.axis.x.scrollbar.el.style.width=this.axis.x.scrollbar.size+"px",this.axis.y.scrollbar.el.style.height=this.axis.y.scrollbar.size+"px",this.positionScrollbar("x"),this.positionScrollbar("y"),this.toggleTrackVisibility("x"),this.toggleTrackVisibility("y")},t.getScrollbarSize=function(e){if(void 0===e&&(e="y"),!this.axis[e].isOverflowing)return 0;var t,n=this.contentEl[this.axis[e].scrollSizeAttr],r=this.axis[e].track.el[this.axis[e].offsetSizeAttr],o=r/n;return t=Math.max(~~(o*r),this.options.scrollbarMinSize),this.options.scrollbarMaxSize&&(t=Math.min(t,this.options.scrollbarMaxSize)),t},t.positionScrollbar=function(t){if(void 0===t&&(t="y"),this.axis[t].isOverflowing){var n=this.contentWrapperEl[this.axis[t].scrollSizeAttr],r=this.axis[t].track.el[this.axis[t].offsetSizeAttr],o=parseInt(this.elStyles[this.axis[t].sizeAttr],10),i=this.axis[t].scrollbar,s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=(s="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollingInverted?-s:s)/(n-o),l=~~((r-i.size)*a);l="x"===t&&this.isRtl&&e.getRtlHelpers().isRtlScrollbarInverted?l+(r-i.size):l,i.el.style.transform="x"===t?"translate3d("+l+"px, 0, 0)":"translate3d(0, "+l+"px, 0)"}},t.toggleTrackVisibility=function(e){void 0===e&&(e="y");var t=this.axis[e].track.el,n=this.axis[e].scrollbar.el;this.axis[e].isOverflowing||this.axis[e].forceVisible?(t.style.visibility="visible",this.contentWrapperEl.style[this.axis[e].overflowAttr]="scroll"):(t.style.visibility="hidden",this.contentWrapperEl.style[this.axis[e].overflowAttr]="hidden"),this.axis[e].isOverflowing?n.style.display="block":n.style.display="none"},t.hideNativeScrollbar=function(){this.offsetEl.style[this.isRtl?"left":"right"]=this.axis.y.isOverflowing||this.axis.y.forceVisible?"-"+this.scrollbarWidth+"px":0,this.offsetEl.style.bottom=this.axis.x.isOverflowing||this.axis.x.forceVisible?"-"+this.scrollbarWidth+"px":0},t.onMouseMoveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.rect=this.axis[e].track.el.getBoundingClientRect(),this.axis[e].scrollbar.rect=this.axis[e].scrollbar.el.getBoundingClientRect(),this.isWithinBounds(this.axis[e].scrollbar.rect)?this.axis[e].scrollbar.el.classList.add(this.classNames.hover):this.axis[e].scrollbar.el.classList.remove(this.classNames.hover),this.isWithinBounds(this.axis[e].track.rect)?(this.showScrollbar(e),this.axis[e].track.el.classList.add(this.classNames.hover)):this.axis[e].track.el.classList.remove(this.classNames.hover)},t.onMouseLeaveForAxis=function(e){void 0===e&&(e="y"),this.axis[e].track.el.classList.remove(this.classNames.hover),this.axis[e].scrollbar.el.classList.remove(this.classNames.hover)},t.showScrollbar=function(e){void 0===e&&(e="y");var t=this.axis[e].scrollbar.el;this.axis[e].isVisible||(t.classList.add(this.classNames.visible),this.axis[e].isVisible=!0),this.options.autoHide&&this.hideScrollbars()},t.onDragStart=function(e,t){void 0===t&&(t="y");var n=K(this.el),r=J(this.el),o=this.axis[t].scrollbar,i="y"===t?e.pageY:e.pageX;this.axis[t].dragOffset=i-o.rect[this.axis[t].offsetAttr],this.draggedAxis=t,this.el.classList.add(this.classNames.dragging),n.addEventListener("mousemove",this.drag,!0),n.addEventListener("mouseup",this.onEndDrag,!0),null===this.removePreventClickId?(n.addEventListener("click",this.preventClick,!0),n.addEventListener("dblclick",this.preventClick,!0)):(r.clearTimeout(this.removePreventClickId),this.removePreventClickId=null)},t.onTrackClick=function(e,t){var n=this;if(void 0===t&&(t="y"),this.options.clickOnTrack){var r=J(this.el);this.axis[t].scrollbar.rect=this.axis[t].scrollbar.el.getBoundingClientRect();var o=this.axis[t].scrollbar.rect[this.axis[t].offsetAttr],i=parseInt(this.elStyles[this.axis[t].sizeAttr],10),s=this.contentWrapperEl[this.axis[t].scrollOffsetAttr],a=("y"===t?this.mouseY-o:this.mouseX-o)<0?-1:1,l=-1===a?s-i:s+i;!function e(){var o,i;-1===a?s>l&&(s-=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((o={})[n.axis[t].offsetAttr]=s,o)),r.requestAnimationFrame(e)):s<l&&(s+=n.options.clickOnTrackSpeed,n.contentWrapperEl.scrollTo(((i={})[n.axis[t].offsetAttr]=s,i)),r.requestAnimationFrame(e))}()}},t.getContentElement=function(){return this.contentEl},t.getScrollElement=function(){return this.contentWrapperEl},t.getScrollbarWidth=function(){try{return"none"===getComputedStyle(this.contentWrapperEl,"::-webkit-scrollbar").display||"scrollbarWidth"in document.documentElement.style||"-ms-overflow-style"in document.documentElement.style?0:ee(this.el)}catch(e){return ee(this.el)}},t.removeListeners=function(){var e=this,t=J(this.el);this.options.autoHide&&this.el.removeEventListener("mouseenter",this.onMouseEnter),["mousedown","click","dblclick"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,!0)})),["touchstart","touchend","touchmove"].forEach((function(t){e.el.removeEventListener(t,e.onPointerEvent,{capture:!0,passive:!0})})),this.el.removeEventListener("mousemove",this.onMouseMove),this.el.removeEventListener("mouseleave",this.onMouseLeave),this.contentWrapperEl&&this.contentWrapperEl.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onWindowResize),this.mutationObserver&&this.mutationObserver.disconnect(),this.resizeObserver&&this.resizeObserver.disconnect(),this.recalculate.cancel(),this.onMouseMove.cancel(),this.hideScrollbars.cancel(),this.onWindowResize.cancel()},t.unMount=function(){this.removeListeners(),e.instances.delete(this.el)},t.isWithinBounds=function(e){return this.mouseX>=e.left&&this.mouseX<=e.left+e.width&&this.mouseY>=e.top&&this.mouseY<=e.top+e.height},t.findChild=function(e,t){var n=e.matches||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector;return Array.prototype.filter.call(e.children,(function(e){return n.call(e,t)}))[0]},e}();te.defaultOptions={autoHide:!0,forceVisible:!1,clickOnTrack:!0,clickOnTrackSpeed:40,classNames:{contentEl:"simplebar-content",contentWrapper:"simplebar-content-wrapper",offset:"simplebar-offset",mask:"simplebar-mask",wrapper:"simplebar-wrapper",placeholder:"simplebar-placeholder",scrollbar:"simplebar-scrollbar",track:"simplebar-track",heightAutoObserverWrapperEl:"simplebar-height-auto-observer-wrapper",heightAutoObserverEl:"simplebar-height-auto-observer",visible:"simplebar-visible",horizontal:"simplebar-horizontal",vertical:"simplebar-vertical",hover:"simplebar-hover",dragging:"simplebar-dragging"},scrollbarMinSize:25,scrollbarMaxSize:0,timeout:1e3},te.instances=new WeakMap,te.initDOMLoadedElements=function(){document.removeEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.removeEventListener("load",this.initDOMLoadedElements),Array.prototype.forEach.call(document.querySelectorAll("[data-simplebar]"),(function(e){"init"===e.getAttribute("data-simplebar")||te.instances.has(e)||new te(e,G(e.attributes))}))},te.removeObserver=function(){this.globalObserver.disconnect()},te.initHtmlApi=function(){this.initDOMLoadedElements=this.initDOMLoadedElements.bind(this),"undefined"!=typeof MutationObserver&&(this.globalObserver=new MutationObserver(te.handleMutations),this.globalObserver.observe(document,{childList:!0,subtree:!0})),"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(this.initDOMLoadedElements):(document.addEventListener("DOMContentLoaded",this.initDOMLoadedElements),window.addEventListener("load",this.initDOMLoadedElements))},te.handleMutations=function(e){e.forEach((function(e){Array.prototype.forEach.call(e.addedNodes,(function(e){1===e.nodeType&&(e.hasAttribute("data-simplebar")?!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes)):Array.prototype.forEach.call(e.querySelectorAll("[data-simplebar]"),(function(e){"init"!==e.getAttribute("data-simplebar")&&!te.instances.has(e)&&document.documentElement.contains(e)&&new te(e,G(e.attributes))})))})),Array.prototype.forEach.call(e.removedNodes,(function(e){1===e.nodeType&&("init"===e.getAttribute("data-simplebar")?te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount():Array.prototype.forEach.call(e.querySelectorAll('[data-simplebar="init"]'),(function(e){te.instances.has(e)&&!document.documentElement.contains(e)&&te.instances.get(e).unMount()})))}))}))},te.getOptions=G,i()&&te.initHtmlApi();const ne=te},1528:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DocAnchorTarget:()=>u,DocAnchorTrigger:()=>p,DocBackToTop:()=>g,DocBadge:()=>y,DocCheckbox:()=>E,DocCodeblock:()=>Ge,DocCollapse:()=>Ke,DocDrawer:()=>ot,DocDropdown:()=>lt,DocEmoji:()=>dt,DocHistory:()=>It,DocIcon:()=>Ht,DocIconAlignRight:()=>Fi,DocIconArrowLeft:()=>Ni,DocIconArrowRight:()=>Bi,DocIconArrowTop:()=>qi,DocIconBox:()=>Zi,DocIconButton:()=>jt,DocIconCheck:()=>Ji,DocIconCheckCircle:()=>Qi,DocIconChevronDown:()=>ns,DocIconChevronRight:()=>is,DocIconCopy:()=>Ze,DocIconFile:()=>ls,DocIconFilter:()=>ds,DocIconFolder:()=>ms,DocIconHistory:()=>bs,DocIconHome:()=>xs,DocIconInfo:()=>Es,DocIconLayers:()=>Ts,DocIconLink:()=>Rs,DocIconMenu:()=>Is,DocIconMinus:()=>Ps,DocIconMoon:()=>js,DocIconMoreHorizontal:()=>zs,DocIconPlus:()=>$s,DocIconSearch:()=>Ys,DocIconShield:()=>Ks,DocIconSun:()=>ea,DocIconX:()=>ra,DocLoadingSpinner:()=>Bt,DocMember:()=>Dn,DocMemberGroup:()=>Hn,DocOverloadGroup:()=>jn,DocPanel:()=>Vn,DocPanels:()=>qn,DocParameter:()=>nr,DocParameters:()=>sr,DocSearchDesktop:()=>kr,DocSearchMobile:()=>Tr,DocSidebar:()=>ao,DocSidebarRight:()=>Lo,DocSwitch:()=>Mo,DocTab:()=>Fo,DocTabs:()=>No,DocThemeSwitch:()=>Wo,DocToolbar:()=>Li,DocToolbarMemberFilterNoResults:()=>Ai});var r=n(4359),o=["id"],i=n(5184),s=n(5543),a=n(2626);const l=(0,r.aZ)({name:"DocAnchorTarget",props:{id:{type:String,required:!0}},setup:function(e){var t=(0,a.oR)().store,n=(0,i.B)().scrollTo,o=(0,r.iH)("#".concat(e.id));function l(){n(o.value,{offset:s.vE,onStart:function(){t.actions.updateScrolledElementId(e.id)}})}(0,r.bv)((function(){window.location.hash&&decodeURIComponent(window.location.hash)===o.value&&setTimeout((function(){t.state.isScrollPositionRestored||(window.scrollTo(0,0),setTimeout(l,200))}),1)}))}});var c=n(3744);const u=(0,c.Z)(l,[["render",function(e,t,n,i,s,a){return(0,r.wg)(),(0,r.iD)("div",{id:e.id},[(0,r.WI)(e.$slots,"default")],8,o)}]]);var d=["href","tabindex","aria-disabled"],f=n(6184);const h=(0,r.aZ)({name:"DocAnchorTrigger",props:{disabled:Boolean,to:{type:String,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,a.oR)().store,l=(0,i.B)().scrollTo;return{onClick:function(t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e.to),n("click"),l(e.to,{offset:(0,s.vE)(),onStart:function(){var t="#"===e.to.charAt(0)?e.to.substr(1):e.to;o.actions.updateScrolledElementId(t)}}))},tabindex:(0,r.Fl)((function(){return e.disabled?"-1":null}))}}}),p=(0,c.Z)(h,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("a",{href:e.to,tabindex:e.tabindex,"aria-disabled":e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.WI)(e.$slots,"default")],8,d)}]]);var m=n(7023);const v=(0,r.aZ)({name:"DocBackToTop",setup:function(){var e=(0,r.iH)(!1),t=(0,i.B)().scrollTo;return(0,m.zX)(window,"scroll",(function(){document.documentElement.scrollTop>350?e.value=!0:e.value=!1})),{onClick:function(){t("body")},show:e}}}),g=(0,c.Z)(v,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-top"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-from-class":"translate-y-4 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"translate-y-4 opacity-0"},{default:(0,r.w5)((function(){return[e.show?((0,r.wg)(),(0,r.iD)("button",{key:0,class:"fixed bottom-6 right-6 w-12 h-12 flex items-center justify-center rounded-full bg-white bg-opacity-70 hover:bg-gray-200 dark:bg-dark-850 dark:hover:bg-dark-450 z-40 focus:outline-none transition duration-300 linear border border-gray-400 border-opacity-50 hover:border-opacity-10 dark:border-dark-450 dark:bg-opacity-70",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(l,{class:"w-7 h-7 text-blue-500 dark:text-blue-400"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})])):(0,r.kq)("",!0)]})),_:1})}]]),b=(0,r.aZ)({name:"DocBadge",props:{type:{type:String,default:""}},setup:function(e){var t=(0,r.Fl)((function(){return e.type.trim()}));return{badgeClasses:(0,r.Fl)((function(){switch(t.value){case"bindable":return"bg-yellow-100 text-yellow-700 dark:bg-yellow-500 dark:text-white";case"required":return"bg-indigo-100 text-indigo-700 dark:bg-indigo-500 dark:text-white";case"internal":return"bg-gray-700 text-white";case"private":case"primary":case"static":return"bg-blue-100 text-blue-700 dark:bg-blue-400 dark:text-white";case"warning":case"readonly":return"bg-orange-100 text-orange-700 dark:bg-orange-500 dark:text-white";case"chainable":case"public":case"success":return"bg-green-100 text-green-700 dark:bg-green-500 dark:text-white";case"template":case"info":return"bg-teal-100 text-teal-700 dark:bg-teal-500 dark:text-white";case"deprecated":case"removed":case"danger":return"bg-red-100 text-red-700 dark:bg-red-500 dark:text-white";default:return"bg-gray-200 text-gray-900 dark:bg-dark-550 dark:text-dark-250"}}))}}}),y=(0,c.Z)(b,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:(0,r.C_)(["inline-flex items-center justify-center h-6 px-2 text-xs font-medium leading-none whitespace-nowrap rounded",e.badgeClasses])},[(0,r.WI)(e.$slots,"default")],2)}]]);var w={class:"inline-flex py-1.5 cursor-pointer select-none"},x=["value"],k={class:"inline-block ml-2"};const S=(0,r.aZ)({name:"DocCheckbox",props:{value:[Boolean,String],modelValue:[Boolean,Array]},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(e.modelValue),i=(0,r.iH)(!1),s=(0,r.Fl)({get:function(){return o.value},set:function(e){o.value=e,n("update:modelValue",o.value)}}),a=(0,r.Fl)((function(){return Array.isArray(e.modelValue)?e.modelValue.includes(e.value):e.modelValue})),l=(0,r.Fl)((function(){return[{"border-blue-500 bg-blue-500":a.value},{"border-gray-400 bg-gray-100":!a.value},{"shadow-outline":i.value}]}));return(0,r.YP)((function(){return e.modelValue}),(function(e){return o.value=e})),{localValue:o,computedValue:s,isChecked:a,isFocused:i,checkboxClasses:l}}}),E=(0,c.Z)(S,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-check"),l=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("label",w,[(0,r._)("div",{class:(0,r.C_)(["w-4 h-4 mt-px border rounded-sm",e.checkboxClasses])},[(0,r.wy)((0,r.Wm)(l,{width:"14",height:"14",class:"text-white"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},512),[[r.F8,e.isChecked]])],2),(0,r.wy)((0,r._)("input",{"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.computedValue=t}),class:"absolute opacity-0 hidden",style:{"z-index":"-1"},type:"checkbox",value:e.value,onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,x),[[r.e8,e.computedValue]]),(0,r._)("span",k,[(0,r.WI)(e.$slots,"default")])])}]]);var C={class:"absolute top-0 right-0 z-5"},_=["innerHTML"],T=n(7924),O={class:"whitespace-nowrap"},L=n(2152),R=n.n(L),D=function(e){return(0,r.dD)("data-v-cf3656fa"),e=e(),(0,r.Cn)(),e},A={key:0,ref:"tooltip",class:"z-50 px-2 py-1 text-xs text-white bg-gray-900 dark:bg-dark-500 rounded tooltip"},I=D((function(){return(0,r._)("div",{class:"arrow","data-popper-arrow":""},null,-1)}));function M(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function F(e){return e instanceof M(e).Element||e instanceof Element}function P(e){return e instanceof M(e).HTMLElement||e instanceof HTMLElement}function H(e){return"undefined"!=typeof ShadowRoot&&(e instanceof M(e).ShadowRoot||e instanceof ShadowRoot)}var N=Math.max,j=Math.min,W=Math.round;function B(e,t){void 0===t&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(P(e)&&t){var i=e.offsetHeight,s=e.offsetWidth;s>0&&(r=W(n.width)/s||1),i>0&&(o=W(n.height)/i||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function z(e){var t=M(e);return{scrollLeft:t.pageXOffset,scrollTop:t.pageYOffset}}function V(e){return e?(e.nodeName||"").toLowerCase():null}function q(e){return((F(e)?e.ownerDocument:e.document)||window.document).documentElement}function $(e){return B(q(e)).left+z(e).scrollLeft}function U(e){return M(e).getComputedStyle(e)}function Z(e){var t=U(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Y(e,t,n){void 0===n&&(n=!1);var r,o,i=P(t),s=P(t)&&function(e){var t=e.getBoundingClientRect(),n=W(t.width)/e.offsetWidth||1,r=W(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(t),a=q(t),l=B(e,s),c={scrollLeft:0,scrollTop:0},u={x:0,y:0};return(i||!i&&!n)&&(("body"!==V(t)||Z(a))&&(c=(r=t)!==M(r)&&P(r)?{scrollLeft:(o=r).scrollLeft,scrollTop:o.scrollTop}:z(r)),P(t)?((u=B(t,!0)).x+=t.clientLeft,u.y+=t.clientTop):a&&(u.x=$(a))),{x:l.left+c.scrollLeft-u.x,y:l.top+c.scrollTop-u.y,width:l.width,height:l.height}}function G(e){var t=B(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function J(e){return"html"===V(e)?e:e.assignedSlot||e.parentNode||(H(e)?e.host:null)||q(e)}function K(e){return["html","body","#document"].indexOf(V(e))>=0?e.ownerDocument.body:P(e)&&Z(e)?e:K(J(e))}function X(e,t){var n;void 0===t&&(t=[]);var r=K(e),o=r===(null==(n=e.ownerDocument)?void 0:n.body),i=M(r),s=o?[i].concat(i.visualViewport||[],Z(r)?r:[]):r,a=t.concat(s);return o?a:a.concat(X(J(s)))}function Q(e){return["table","td","th"].indexOf(V(e))>=0}function ee(e){return P(e)&&"fixed"!==U(e).position?e.offsetParent:null}function te(e){for(var t=M(e),n=ee(e);n&&Q(n)&&"static"===U(n).position;)n=ee(n);return n&&("html"===V(n)||"body"===V(n)&&"static"===U(n).position)?t:n||function(e){var t=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");if(-1!==navigator.userAgent.indexOf("Trident")&&P(e)&&"fixed"===U(e).position)return null;for(var n=J(e);P(n)&&["html","body"].indexOf(V(n))<0;){var r=U(n);if("none"!==r.transform||"none"!==r.perspective||"paint"===r.contain||-1!==["transform","perspective"].indexOf(r.willChange)||t&&"filter"===r.willChange||t&&r.filter&&"none"!==r.filter)return n;n=n.parentNode}return null}(e)||t}var ne="top",re="bottom",oe="right",ie="left",se="auto",ae=[ne,re,oe,ie],le="start",ce="end",ue="viewport",de="popper",fe=ae.reduce((function(e,t){return e.concat([t+"-"+le,t+"-"+ce])}),[]),he=[].concat(ae,[se]).reduce((function(e,t){return e.concat([t,t+"-"+le,t+"-"+ce])}),[]),pe=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function me(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}var ve={placement:"bottom",modifiers:[],strategy:"absolute"};function ge(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function be(e){void 0===e&&(e={});var t=e,n=t.defaultModifiers,r=void 0===n?[]:n,o=t.defaultOptions,i=void 0===o?ve:o;return function(e,t,n){void 0===n&&(n=i);var o,s,a={placement:"bottom",orderedModifiers:[],options:Object.assign({},ve,i),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},l=[],c=!1,u={state:a,setOptions:function(n){var o="function"==typeof n?n(a.options):n;d(),a.options=Object.assign({},i,a.options,o),a.scrollParents={reference:F(e)?X(e):e.contextElement?X(e.contextElement):[],popper:X(t)};var s,c,f=function(e){var t=me(e);return pe.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(r,a.options.modifiers),c=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(c).map((function(e){return c[e]}))));return a.orderedModifiers=f.filter((function(e){return e.enabled})),a.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:a,name:t,instance:u,options:r});l.push(i||function(){})}})),u.update()},forceUpdate:function(){if(!c){var e=a.elements,t=e.reference,n=e.popper;if(ge(t,n)){a.rects={reference:Y(t,te(n),"fixed"===a.options.strategy),popper:G(n)},a.reset=!1,a.placement=a.options.placement,a.orderedModifiers.forEach((function(e){return a.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<a.orderedModifiers.length;r++)if(!0!==a.reset){var o=a.orderedModifiers[r],i=o.fn,s=o.options,l=void 0===s?{}:s,d=o.name;"function"==typeof i&&(a=i({state:a,options:l,name:d,instance:u})||a)}else a.reset=!1,r=-1}}},update:(o=function(){return new Promise((function(e){u.forceUpdate(),e(a)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(o())}))}))),s}),destroy:function(){d(),c=!0}};if(!ge(e,t))return u;function d(){l.forEach((function(e){return e()})),l=[]}return u.setOptions(n).then((function(e){!c&&n.onFirstUpdate&&n.onFirstUpdate(e)})),u}}var ye={passive:!0};function we(e){return e.split("-")[0]}function xe(e){return e.split("-")[1]}function ke(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function Se(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?we(o):null,s=o?xe(o):null,a=n.x+n.width/2-r.width/2,l=n.y+n.height/2-r.height/2;switch(i){case ne:t={x:a,y:n.y-r.height};break;case re:t={x:a,y:n.y+n.height};break;case oe:t={x:n.x+n.width,y:l};break;case ie:t={x:n.x-r.width,y:l};break;default:t={x:n.x,y:n.y}}var c=i?ke(i):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case le:t[c]=t[c]-(n[u]/2-r[u]/2);break;case ce:t[c]=t[c]+(n[u]/2-r[u]/2)}}return t}var Ee={top:"auto",right:"auto",bottom:"auto",left:"auto"};function Ce(e){var t,n=e.popper,r=e.popperRect,o=e.placement,i=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,c=e.adaptive,u=e.roundOffsets,d=e.isFixed,f=s.x,h=void 0===f?0:f,p=s.y,m=void 0===p?0:p,v="function"==typeof u?u({x:h,y:m}):{x:h,y:m};h=v.x,m=v.y;var g=s.hasOwnProperty("x"),b=s.hasOwnProperty("y"),y=ie,w=ne,x=window;if(c){var k=te(n),S="clientHeight",E="clientWidth";k===M(n)&&"static"!==U(k=q(n)).position&&"absolute"===a&&(S="scrollHeight",E="scrollWidth"),k=k,(o===ne||(o===ie||o===oe)&&i===ce)&&(w=re,m-=(d&&x.visualViewport?x.visualViewport.height:k[S])-r.height,m*=l?1:-1),o!==ie&&(o!==ne&&o!==re||i!==ce)||(y=oe,h-=(d&&x.visualViewport?x.visualViewport.width:k[E])-r.width,h*=l?1:-1)}var C,_=Object.assign({position:a},c&&Ee),T=!0===u?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:W(t*r)/r||0,y:W(n*r)/r||0}}({x:h,y:m}):{x:h,y:m};return h=T.x,m=T.y,l?Object.assign({},_,((C={})[w]=b?"0":"",C[y]=g?"0":"",C.transform=(x.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",C)):Object.assign({},_,((t={})[w]=b?m+"px":"",t[y]=g?h+"px":"",t.transform="",t))}var _e={left:"right",right:"left",bottom:"top",top:"bottom"};function Te(e){return e.replace(/left|right|bottom|top/g,(function(e){return _e[e]}))}var Oe={start:"end",end:"start"};function Le(e){return e.replace(/start|end/g,(function(e){return Oe[e]}))}function Re(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&H(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function De(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function Ae(e,t){return t===ue?De(function(e){var t=M(e),n=q(e),r=t.visualViewport,o=n.clientWidth,i=n.clientHeight,s=0,a=0;return r&&(o=r.width,i=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=r.offsetLeft,a=r.offsetTop)),{width:o,height:i,x:s+$(e),y:a}}(e)):F(t)?function(e){var t=B(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}(t):De(function(e){var t,n=q(e),r=z(e),o=null==(t=e.ownerDocument)?void 0:t.body,i=N(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=N(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+$(e),l=-r.scrollTop;return"rtl"===U(o||n).direction&&(a+=N(n.clientWidth,o?o.clientWidth:0)-i),{width:i,height:s,x:a,y:l}}(q(e)))}function Ie(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function Me(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function Fe(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=void 0===r?e.placement:r,i=n.boundary,s=void 0===i?"clippingParents":i,a=n.rootBoundary,l=void 0===a?ue:a,c=n.elementContext,u=void 0===c?de:c,d=n.altBoundary,f=void 0!==d&&d,h=n.padding,p=void 0===h?0:h,m=Ie("number"!=typeof p?p:Me(p,ae)),v=u===de?"reference":de,g=e.rects.popper,b=e.elements[f?v:u],y=function(e,t,n){var r="clippingParents"===t?function(e){var t=X(J(e)),n=["absolute","fixed"].indexOf(U(e).position)>=0&&P(e)?te(e):e;return F(n)?t.filter((function(e){return F(e)&&Re(e,n)&&"body"!==V(e)})):[]}(e):[].concat(t),o=[].concat(r,[n]),i=o[0],s=o.reduce((function(t,n){var r=Ae(e,n);return t.top=N(r.top,t.top),t.right=j(r.right,t.right),t.bottom=j(r.bottom,t.bottom),t.left=N(r.left,t.left),t}),Ae(e,i));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}(F(b)?b:b.contextElement||q(e.elements.popper),s,l),w=B(e.elements.reference),x=Se({reference:w,element:g,strategy:"absolute",placement:o}),k=De(Object.assign({},g,x)),S=u===de?k:w,E={top:y.top-S.top+m.top,bottom:S.bottom-y.bottom+m.bottom,left:y.left-S.left+m.left,right:S.right-y.right+m.right},C=e.modifiersData.offset;if(u===de&&C){var _=C[o];Object.keys(E).forEach((function(e){var t=[oe,re].indexOf(e)>=0?1:-1,n=[ne,re].indexOf(e)>=0?"y":"x";E[e]+=_[n]*t}))}return E}function Pe(e,t,n){return N(e,j(t,n))}function He(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Ne(e){return[ne,oe,re,ie].some((function(t){return e[t]>=0}))}var je=be({defaultModifiers:[{name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,i=void 0===o||o,s=r.resize,a=void 0===s||s,l=M(t.elements.popper),c=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&c.forEach((function(e){e.addEventListener("scroll",n.update,ye)})),a&&l.addEventListener("resize",n.update,ye),function(){i&&c.forEach((function(e){e.removeEventListener("scroll",n.update,ye)})),a&&l.removeEventListener("resize",n.update,ye)}},data:{}},{name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=Se({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},{name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,s=void 0===i||i,a=n.roundOffsets,l=void 0===a||a,c={placement:we(t.placement),variation:xe(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,Ce(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ce(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}},{name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];P(o)&&V(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{},i=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});P(r)&&V(r)&&(Object.assign(r.style,i),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},{name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,s=he.reduce((function(e,n){return e[n]=function(e,t,n){var r=we(e),o=[ie,ne].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,s=i[0],a=i[1];return s=s||0,a=(a||0)*o,[ie,oe].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}(n,t.rects,i),e}),{}),a=s[t.placement],l=a.x,c=a.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=s}},{name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=void 0===h||h,m=n.allowedAutoPlacements,v=t.options.placement,g=we(v),b=l||(g!==v&&p?function(e){if(we(e)===se)return[];var t=Te(e);return[Le(e),t,Le(t)]}(v):[Te(v)]),y=[v].concat(b).reduce((function(e,n){return e.concat(we(n)===se?function(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?he:l,u=xe(r),d=u?a?fe:fe.filter((function(e){return xe(e)===u})):ae,f=d.filter((function(e){return c.indexOf(e)>=0}));0===f.length&&(f=d);var h=f.reduce((function(t,n){return t[n]=Fe(e,{placement:n,boundary:o,rootBoundary:i,padding:s})[we(n)],t}),{});return Object.keys(h).sort((function(e,t){return h[e]-h[t]}))}(t,{placement:n,boundary:u,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,x=t.rects.popper,k=new Map,S=!0,E=y[0],C=0;C<y.length;C++){var _=y[C],T=we(_),O=xe(_)===le,L=[ne,re].indexOf(T)>=0,R=L?"width":"height",D=Fe(t,{placement:_,boundary:u,rootBoundary:d,altBoundary:f,padding:c}),A=L?O?oe:ie:O?re:ne;w[R]>x[R]&&(A=Te(A));var I=Te(A),M=[];if(i&&M.push(D[T]<=0),a&&M.push(D[A]<=0,D[I]<=0),M.every((function(e){return e}))){E=_,S=!1;break}k.set(_,M)}if(S)for(var F=function(e){var t=y.find((function(t){var n=k.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},P=p?3:1;P>0&&"break"!==F(P);P--);t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}},{name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,i=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,d=n.padding,f=n.tether,h=void 0===f||f,p=n.tetherOffset,m=void 0===p?0:p,v=Fe(t,{boundary:l,rootBoundary:c,padding:d,altBoundary:u}),g=we(t.placement),b=xe(t.placement),y=!b,w=ke(g),x="x"===w?"y":"x",k=t.modifiersData.popperOffsets,S=t.rects.reference,E=t.rects.popper,C="function"==typeof m?m(Object.assign({},t.rects,{placement:t.placement})):m,_="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),T=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,O={x:0,y:0};if(k){if(i){var L,R="y"===w?ne:ie,D="y"===w?re:oe,A="y"===w?"height":"width",I=k[w],M=I+v[R],F=I-v[D],P=h?-E[A]/2:0,H=b===le?S[A]:E[A],W=b===le?-E[A]:-S[A],B=t.elements.arrow,z=h&&B?G(B):{width:0,height:0},V=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},q=V[R],$=V[D],U=Pe(0,S[A],z[A]),Z=y?S[A]/2-P-U-q-_.mainAxis:H-U-q-_.mainAxis,Y=y?-S[A]/2+P+U+$+_.mainAxis:W+U+$+_.mainAxis,J=t.elements.arrow&&te(t.elements.arrow),K=J?"y"===w?J.clientTop||0:J.clientLeft||0:0,X=null!=(L=null==T?void 0:T[w])?L:0,Q=I+Y-X,ee=Pe(h?j(M,I+Z-X-K):M,I,h?N(F,Q):F);k[w]=ee,O[w]=ee-I}if(a){var se,ae="x"===w?ne:ie,ce="x"===w?re:oe,ue=k[x],de="y"===x?"height":"width",fe=ue+v[ae],he=ue-v[ce],pe=-1!==[ne,ie].indexOf(g),me=null!=(se=null==T?void 0:T[x])?se:0,ve=pe?fe:ue-S[de]-E[de]-me+_.altAxis,ge=pe?ue+S[de]+E[de]-me-_.altAxis:he,be=h&&pe?function(e,t,n){var r=Pe(e,t,n);return r>n?n:r}(ve,ue,ge):Pe(h?ve:fe,ue,h?ge:he);k[x]=be,O[x]=be-ue}t.modifiersData[r]=O}},requiresIfExists:["offset"]},{name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,s=n.modifiersData.popperOffsets,a=we(n.placement),l=ke(a),c=[ie,oe].indexOf(a)>=0?"height":"width";if(i&&s){var u=function(e,t){return Ie("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:Me(e,ae))}(o.padding,n),d=G(i),f="y"===l?ne:ie,h="y"===l?re:oe,p=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],m=s[l]-n.rects.reference[l],v=te(i),g=v?"y"===l?v.clientHeight||0:v.clientWidth||0:0,b=p/2-m/2,y=u[f],w=g-d[c]-u[h],x=g/2-d[c]/2+b,k=Pe(y,x,w),S=l;n.modifiersData[r]=((t={})[S]=k,t.centerOffset=k-x,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&Re(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},{name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,s=Fe(t,{elementContext:"reference"}),a=Fe(t,{altBoundary:!0}),l=He(s,r),c=He(a,o,i),u=Ne(l),d=Ne(c);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":u,"data-popper-escaped":d})}}]});const We=(0,r.aZ)({name:"DocTooltip",props:{placement:{type:String,default:"top"},offset:{type:Array,default:function(){return[0,8]}},delay:{type:Number,default:250}},emits:["show","hide"],setup:function(e,t){var n,o=t.emit,i=(0,r.iH)(),s=(0,r.iH)(),a=(0,r.iH)(!1),l=null;return{trigger:i,tooltip:s,isOpen:a,show:function(){clearTimeout(n),n=setTimeout((function(){a.value=!0,(0,r.Y3)((function(){!function(){var t=document.querySelector("body"),n={placement:e.placement,modifiers:[{name:"offset",options:{offset:e.offset}},{name:"preventOverflow",options:{boundary:t}},{name:"flip",options:{boundary:t}}]};if(!i.value||!s.value)throw new Error("Tooltip trigger or tooltip element not found in DOM");l=je(i.value,s.value,n)}(),o("show")}))}),e.delay)},hide:function(){clearTimeout(n),o("hide"),a.value=!1,l&&(l.destroy(),l=null)},update:function(){l&&l.update()}}}}),Be=(0,c.Z)(We,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"trigger","aria-describedby":"tooltip",onMouseenter:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.show&&e.show.apply(e,t)}),onMouseleave:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger",{},void 0,!0)],544),e.isOpen?((0,r.wg)(),(0,r.iD)("div",A,[(0,r.WI)(e.$slots,"default",{},void 0,!0),I],512)):(0,r.kq)("",!0)])}],["__scopeId","data-v-cf3656fa"]]),ze=(0,r.aZ)({name:"DocCopyButton",components:{DocTooltip:Be},props:{copyText:String,tooltipText:{type:String,default:"Copy"},tooltipPlacement:{type:String,default:"top"},tooltipOffset:{type:Array,default:function(){return[0,8]}},buttonClass:{type:String,default:""}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(),o=(0,r.iH)(e.tooltipText),i=null;return(0,r.bv)((function(){(i=new(R())(n.value,{text:function(){return e.copyText}})).on("success",(function(){o.value="Copied!",t.value.update()}))})),(0,r.Jd)((function(){null!==i&&i.destroy()})),{tooltip:t,button:n,btnLabel:o}}}),Ve=(0,c.Z)(ze,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-tooltip");return(0,r.wg)(),(0,r.j4)(a,{ref:"tooltip",placement:e.tooltipPlacement,offset:e.tooltipOffset},{trigger:(0,r.w5)((function(){return[(0,r._)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 transition-colors duration-200 ease-in focus:outline-none",e.buttonClass]),onMouseleave:t[0]||(t[0]=function(t){return e.btnLabel=e.tooltipText})},[(0,r.WI)(e.$slots,"default")],34)]})),default:(0,r.w5)((function(){return[(0,r._)("span",O,(0,r.zw)(e.btnLabel),1)]})),_:3},8,["placement","offset"])}]]);var qe=[(0,r._)("path",{d:"M20 8h-9c-1.65 0-3 1.35-3 3v9c0 1.65 1.35 3 3 3h9c1.65 0 3-1.35 3-3v-9c0-1.65-1.35-3-3-3zm1 12c0 .55-.45 1-1 1h-9c-.55 0-1-.45-1-1v-9c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v9z"},null,-1),(0,r._)("path",{d:"M5 14H4c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h9c.55 0 1 .45 1 1v1c0 .55.45 1 1 1s1-.45 1-1V4c0-1.65-1.35-3-3-3H4C2.35 1 1 2.35 1 4v9c0 1.65 1.35 3 3 3h1c.55 0 1-.45 1-1s-.45-1-1-1z"},null,-1)],$e=n(6252);const Ue=(0,$e.aZ)({name:"DocIconCopy"}),Ze=(0,c.Z)(Ue,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,qe)}]]),Ye=(0,r.aZ)({name:"DocCodeblock",components:{DocCopyButton:Ve,DocIconCopy:Ze},props:{lineNumbers:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(""),o=(0,r.iH)(""),i=(0,r.iH)(!1);return(0,r.bv)((function(){var r,s,a,l;i.value="string"==typeof(null===(s=null===(r=t.value)||void 0===r?void 0:r.querySelector(".codeblock-title"))||void 0===s?void 0:s.textContent);var c=null===(a=t.value)||void 0===a?void 0:a.querySelector("code[class*='language-']");n.value=(null==c?void 0:c.innerText.trim())||"",e.lineNumbers&&(o.value=function(e){return e.split("\n").map((function(e,t){return"<div>".concat(t+1,"</div>")})).join("")}(n.value)),"PRE"===(null===(l=null==c?void 0:c.parentElement)||void 0===l?void 0:l.nodeName)&&new T.Z(c.parentElement)})),{codeblockRef:t,hasTitle:i,code:n,lineNumbersHtml:o}}}),Ge=(0,c.Z)(Ye,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-copy"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",{ref:"codeblockRef",class:(0,r.C_)(["codeblock relative",{"line-numbers":e.lineNumbers}])},[(0,r._)("div",C,[(0,r.Wm)(c,{"copy-text":e.code,"tooltip-text":"Copy","tooltip-placement":"left","tooltip-offset":[-1,0],class:(0,r.C_)(["mr-1.5",e.hasTitle?"mt-14":"mt-1.5"]),"button-class":"w-10 h-10 text-dark-350 hover:text-white bg-dark-850 dark:bg-dark-800 bg-opacity-50 dark:bg-opacity-50 rounded-full"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]})),_:1},8,["copy-text","class"])]),(0,r.WI)(e.$slots,"default"),e.lineNumbers?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["absolute top-0 w-14 py-4 pr-3 bg-dark-850 dark:bg-dark-800 font-mono leading-normal text-dark-350 text-xs text-right",{"mt-12":e.hasTitle}]),innerHTML:e.lineNumbersHtml},null,10,_)):(0,r.kq)("",!0)],2)}]]),Je=(0,r.aZ)({name:"DocCollapse",props:{modelValue:Boolean,animations:{type:Boolean,default:!0},triggerClass:{type:String,default:null}},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(!1),i=(0,r.iH)();function s(){n("update:modelValue",!e.modelValue)}return(0,r.YP)((function(){return e.modelValue}),(function(e){e?(0,r.Y3)((function(){if(i.value){var e=i.value.scrollHeight;i.value.style.height="".concat(e,"px")}})):i.value&&(i.value.style.height="0px")}),{immediate:!0}),{toggleCollapse:s,onKeydown:function(e){"Enter"===e.key&&s()},toggleMousedown:function(){o.value=!o.value},onFocus:function(e){o.value&&e.target.blur()},content:i}}}),Ke=(0,c.Z)(Je,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{class:(0,r.C_)(["cursor-pointer focus:outline-none focus:bg-gray-200 dark:focus:bg-dark-750",e.triggerClass]),tabindex:"0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleCollapse&&e.toggleCollapse.apply(e,t)}),onMousedown:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onMouseup:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleMousedown&&e.toggleMousedown.apply(e,t)}),onFocus:t[3]||(t[3]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[4]||(t[4]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},[(0,r.WI)(e.$slots,"trigger")],34),(0,r._)("div",{ref:"content",class:(0,r.C_)(["collapse-content overflow-hidden",e.animations?"transition-all duration-200 ease-out":null]),style:{height:"0"}},[(0,r.WI)(e.$slots,"default")],2),(0,r.WI)(e.$slots,"footer")])}]]),Xe=(0,r.aZ)({name:"DocOverlay",props:{isOpen:Boolean},emits:["swipe-left","swipe-right","click"],setup:function(e,t){var n=t.emit,o=(0,r.qj)({x:0,y:0});return{onTouchStart:function(e){o.x=e.changedTouches[0].clientX,o.y=e.changedTouches[0].clientY},onTouchEnd:function(e){var t=e.changedTouches[0].clientX-o.x,r=e.changedTouches[0].clientY-o.y;Math.abs(t)>Math.abs(r)&&Math.abs(t)>40&&(t<0&&n("swipe-left",[e,"swipe-left"]),t>0&&n("swipe-right",[e,"swipe-right"]))},onClick:function(e){n("click",[e,"click"])}}}}),Qe=(0,c.Z)(Xe,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed z-30 transition-opacity duration-300 ease-in-out bg-gray-600 dark:bg-dark-900",e.isOpen?"inset-0 opacity-50 dark:bg-opacity-70":"opacity-0"]),onTouchstart:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchStart&&e.onTouchStart.apply(e,t)}),onTouchend:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onTouchEnd&&e.onTouchEnd.apply(e,t)}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,34)}]]);function et(e){(0,m.zX)(window,"resize",(function(t){e(t)}))}function tt(){var e=document.body,t=(0,r.iH)(0),n=e.offsetWidth;(0,r.bv)((function(){return n=e.offsetWidth})),et((function(){return n=e.offsetWidth}));var o=(0,r.iH)(!1);return{enableBodyScroll:function(){o.value&&(e.classList.remove("overflow-hidden","fixed"),e.style.width="",e.style.top="",window.scrollTo(0,t.value),o.value=!1)},disableBodyScroll:function(){o.value||(t.value=window.scrollY,e.style.width="".concat(n,"px"),e.style.top="".concat(-t.value,"px"),e.classList.add("overflow-hidden","fixed"),o.value=!0)},isBodyScrollDisabled:o}}var nt=r.lR;const rt=(0,r.aZ)({name:"DocDrawer",components:{DocOverlay:Qe,Teleport:nt},props:{hideEvent:{type:Array,required:!0}},emits:["show","shown","hide","hidden"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=tt(),a=s.enableBodyScroll,l=s.disableBodyScroll;return{Teleport:nt,isOpen:i,show:function(){n("show"),i.value=!0,l(),(0,r.Y3)((function(){n("shown")}))},hide:function(t){var s;if(n("hide"),!t||!t[0])return i.value=!1,a(),void(0,r.Y3)((function(){n("hidden")}));var l=t[0].target;o.value!==l&&!(null===(s=o.value)||void 0===s?void 0:s.contains(l))&&e.hideEvent.includes(t[1])&&(i.value=!1,a(),(0,r.Y3)((function(){n("hidden")})))}}}}),ot=(0,c.Z)(rt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{ref:"el",class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 h-full transition-transform duration-300 ease-in-out bg-white focus:outline-none dark:bg-dark-850",e.isOpen?"translate-x-0 shadow-2xl":"translate-x-full"]),tabindex:"-1",onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r.WI)(e.$slots,"default"),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,{"is-open":e.isOpen,onSwipeLeft:e.hide,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onSwipeRight","onClick"])]})),_:1}))],34)}]]);var it=["aria-expanded"],st=n(6850);const at=(0,r.aZ)({name:"DocDropdown",props:{buttonClass:{type:String,default:""},align:{type:String,default:"left"},menuWidth:{type:String,default:"12rem"}},setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1),s=(0,r.iH)(!1);return(0,r.YP)(i,(function(){var e=i.value?"open":"close";n(e)})),(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),{isOpen:i,isFocused:s,onButtonClick:function(){i.value=!i.value},dropdown:o,hide:function(){i.value=!1}}}}),lt=(0,c.Z)(at,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:"relative",onKeydown:t[4]||(t[4]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",{class:(0,r.C_)(e.buttonClass),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,onFocus:t[0]||(t[0]=function(t){return e.isFocused=!0}),onBlur:t[1]||(t[1]=function(t){return e.isFocused=!1}),onClick:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onButtonClick&&e.onButtonClick.apply(e,t)})},[(0,r.WI)(e.$slots,"button-content",{isOpen:e.isOpen,isFocused:e.isFocused})],42,it),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",{class:(0,r.C_)(["absolute z-30 py-2 mt-2 bg-white border border-gray-300 rounded shadow-lg dark:bg-dark-650 dark:border-dark-500","right"===e.align?"right-0":"left-0"]),style:(0,r.j5)({"min-width":e.menuWidth}),onClick:t[3]||(t[3]=(0,r.iM)((function(){}),["stop"]))},[(0,r.WI)(e.$slots,"default")],6),[[r.F8,e.isOpen]])]})),_:3})],544)}]]);var ct=["innerHTML"];const ut=(0,r.aZ)({name:"DocEmoji",props:{emoji:{type:String,required:!0}},setup:function(e){return{emojiHtml:(0,r.Fl)((function(){return"&#x".concat(e.emoji.replace(/-/g,"&#x"))}))}}}),dt=(0,c.Z)(ut,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",{class:"docs-emoji",innerHTML:e.emojiHtml},null,8,ct)}]]);var ft={class:"flex justify-between px-5 py-3 -mt-1 border-b border-gray-200 dark:border-dark-650"},ht={class:"flex text-sm text-gray-500 dark:text-dark-350"},pt=(0,r._)("span",null,"History",-1),mt={key:0,class:"flex flex-col items-center py-6"},vt=[(0,r._)("svg",{class:"mb-2",xmlns:"http://www.w3.org/2000/svg",width:"60",height:"60"},[(0,r._)("circle",{cx:"30",cy:"30",r:"30",fill:"#e1edff"}),(0,r._)("path",{d:"M36.5 20.5h-2v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-6v-1c0-.55-.45-1-1-1s-1 .45-1 1v1h-2c-1.65 0-3 1.35-3 3v14c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3v-14c0-1.65-1.35-3-3-3zm-14 2h2v1c0 .55.45 1 1 1s1-.45 1-1v-1h6v1c0 .55.45 1 1 1s1-.45 1-1v-1h2c.55 0 1 .45 1 1v3h-16v-3c0-.55.45-1 1-1zm14 16h-14c-.55 0-1-.45-1-1v-9h16v9c0 .55-.45 1-1 1z",fill:"#8dbbff"})],-1),(0,r._)("div",{class:"text-sm text-gray-500"},"No history items",-1)],gt={key:1,class:"mt-2"},bt=["href","onClick"],yt={class:"flex"},wt=["textContent"],xt={class:"invisible ml-5 text-xs text-gray-600 group-hover:visible dark:text-dark-350"},kt=n(9984),St=n.n(kt);function Et(){var e=(0,r.iH)(null);return(0,r.bv)((function(){e.value=window.__DOCS__})),{pageData:e}}function Ct(e){var t={};return""===e||"?"===e||(e=e.trim().replace(/^(\?|#|&)/,"")).split("&").forEach((function(e){var n=e.split("="),r=n[0],o=n[1];r=decodeURIComponent(r);var i=null==o?null:decodeURIComponent(o);t[r]=i})),t}var _t=(0,r.iH)({path:"/"});function Tt(e,t){if("string"==typeof t)"push"===e?window.history.pushState(null,"",t):"replace"===e&&window.history.replaceState(null,"",t);else{if("object"!=typeof t)throw new Error("Invalid type. Expected a string or a Route object for new route location.");var n=t.path?t.path:window.location.href,r="";t.query&&(r=function(e){if(!Object.keys(e).length)return"";var t=[];return Object.keys(e).forEach((function(n){t.push("".concat(n,"=").concat(e[n]))})),"?"+t.join("&")}(t.query));var o="".concat(n).concat(r).concat(t.hash);"push"===e?window.history.pushState(null,"",o):"replace"===e&&window.history.replaceState(null,"",o)}_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}}var Ot={replace:function(e){return Tt("replace",e)},push:function(e){return Tt("push",e)}};function Lt(){return _t.value.path=window.location.pathname?decodeURIComponent(window.location.pathname):"",_t.value.query=Ct(window.location.search),_t.value.hash=window.location.hash?decodeURIComponent(window.location.hash):"",(0,m.zX)(window,"turbo:visit",(function(){_t.value={path:window.location.pathname?decodeURIComponent(window.location.pathname):"",query:Ct(window.location.search),hash:window.location.hash?decodeURIComponent(window.location.hash):""}})),{route:_t,Router:Ot}}var Rt=n(830),Dt=function(){return Dt=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},Dt.apply(this,arguments)};const At=(0,r.aZ)({name:"DocHistory",components:{DocDropdown:lt},setup:function(){var e=(0,r.iH)(),t=St().maxHistoryItems,n=(0,r.iH)([]),o=Et().pageData,i=Lt().route,a=(0,Rt.Rs)();function l(e){return e&&"/"!==e?a+e:(0,Rt.wE)(a)}return(0,r.bv)((function(){var e;null==(e=(0,s.qn)(St().base,localStorage,"doc_history"))||("version"in e?n.value=e.items:(function(e){if(e.length){var t=o.value;if(t)for(var n=0,r=e;n<r.length;n++){var i=r[n];i.path=(0,Rt.cD)(i.path,t)}}}(e),n.value=e)),function(){var e=o.value;if(e){var r=(0,Rt.cD)(i.value.path,e),a={title:e.title,path:r,timestamp:Date.now(),icon:"doc-icon-".concat(e.icon)};!function(e){var t=n.value.findIndex((function(t){return t.path===e.path}));t>-1&&n.value.splice(t,1)}(a),n.value.unshift(a),n.value.length>t&&n.value.pop();var l={version:1,items:n.value};(0,s.Nh)(St().base,localStorage,"doc_history",l)}}()})),{dropdown:e,history:n,clearHistory:function(){n.value=[],(0,s.Nh)(St().base,localStorage,"doc_history",[])},setTimeVisited:function(){n.value=n.value.map((function(e){return Dt(Dt({},e),{timeAgo:(0,s.Sy)(e.timestamp)})}))},onHistoryItemClick:function(t,n){(0,s.pI)(n)||(n.preventDefault(),(0,f.Vn)(l(t)),e.value.hide())},getFullPath:l}}}),It=(0,c.Z)(At,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-history"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-icon"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.j4)(u,{ref:"dropdown",style:{"margin-right":"-0.625rem"},align:"right","menu-width":"18rem",onOpen:e.setTimeVisited},{"button-content":(0,r.w5)((function(){var t;return[(0,r.Wm)(l,{class:(0,r.C_)([{"bg-gray-300 dark:bg-dark-450":null===(t=e.dropdown)||void 0===t?void 0:t.isOpen},"w-10 h-10 -mb-0.5"]),"icon-size":"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["class"])]})),default:(0,r.w5)((function(){return[(0,r._)("div",ft,[(0,r._)("div",ht,[(0,r.Wm)(c,{width:"15",height:"15",class:"mr-3 mt-0.75"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),pt]),(0,r._)("button",{class:"text-xs text-blue-500 dark:text-blue-400 focus:outline-none hover:text-blue-900 dark:hover:text-blue-200",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.clearHistory&&e.clearHistory.apply(e,t)})}," Clear ")]),e.history.length?((0,r.wg)(),(0,r.iD)("ul",gt,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.history,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.timestamp},[(0,r._)("a",{class:"flex justify-between px-5 py-1.5 text-sm whitespace-nowrap group hover:bg-gray-200 dark:hover:bg-dark-500",href:e.getFullPath(t.path),onClick:function(n){return e.onHistoryItemClick(t.path,n)}},[(0,r._)("span",yt,[(0,r.Wm)(c,{class:"mr-3 mt-0.75",width:"15",height:"15"},{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(t.icon)))]})),_:2},1024),(0,r._)("span",{textContent:(0,r.zw)(t.title)},null,8,wt)]),(0,r._)("span",xt,(0,r.zw)(t.timeAgo),1)],8,bt)])})),128))])):((0,r.wg)(),(0,r.iD)("div",mt,vt))]})),_:1},8,["onOpen"])}]]);var Mt=["width","height"],Ft=["fill"];const Pt=(0,r.aZ)({name:"DocIcon",props:{width:{type:[Number,String],default:16},height:{type:[Number,String],default:16},iconColor:{type:String,default:"currentColor"}}}),Ht=(0,c.Z)(Pt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("svg",{xmlns:"http://www.w3.org/2000/svg",class:"mb-px",width:e.width,height:e.height,viewBox:"0 0 24 24",role:"presentation"},[(0,r._)("g",{fill:e.iconColor},[(0,r.WI)(e.$slots,"default")],8,Ft)],8,Mt)}]]),Nt=(0,r.aZ)({name:"DocIconButton",props:{iconSize:{type:[Number,String],default:16},rounded:{type:Boolean,default:!0}},setup:function(){var e=(0,r.iH)();return{button:e,onClick:function(){var t;null===(t=e.value)||void 0===t||t.blur()}}}}),jt=(0,c.Z)(Nt,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon");return(0,r.wg)(),(0,r.iD)("button",{ref:"button",class:(0,r.C_)(["flex items-center justify-center shrink-0 overflow-hidden transition-colors duration-200 ease-in hover:bg-gray-200 focus:outline-none focus:bg-gray-300 dark:text-white dark:hover:bg-dark-500 dark:focus:bg-dark-450",e.rounded?"rounded-full":"rounded"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},[(0,r.Wm)(a,{class:"shrink-0",style:{"margin-bottom":"0"},width:e.iconSize,height:e.iconSize},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default")]})),_:3},8,["width","height"])],2)}]]),Wt=(0,r.aZ)({name:"LoadingSpinner",props:{size:{type:Number,default:20}},setup:function(e){return{styles:(0,r.Fl)((function(){return{width:"".concat(e.size,"px"),height:"".concat(e.size,"px"),borderWidth:"".concat(Math.round(e.size/8),"px")}}))}}}),Bt=(0,c.Z)(Wt,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",{class:"spinner inline-block rounded-full border-gray-400 dark:border-dark-450 border-solid animate-spin",style:(0,r.j5)(e.styles)},null,4)}],["__scopeId","data-v-79806448"]]);var zt={ref:"memberRef",class:"relative pluggable"},Vt={class:"relative z-10 px-5 pb-5"},qt={class:"absolute inset-0 transition-all duration-200 ease-linear z-5",style:{margin:"-1px"}},$t=[(0,r._)("div",{class:"absolute inset-0 bg-blue-200 bg-opacity-25 border border-blue-300 dark:bg-dark-550 dark:border-dark-600"},null,-1)],Ut=Symbol("DocsGroupId"),Zt=Symbol("DocsOverloadId");function Yt(e){var t=(0,a.oR)().store,n=(0,r.f3)(Ut),o=(0,r.Fl)((function(){return Object.values(t.state.memberGroups[n]).filter((function(n){return function(e,t,n){var r=e.overloadId===n,o=e.access.split(",").map((function(e){return e.trim()})).every((function(e){var n;return null===(n=t.state.access)||void 0===n?void 0:n.includes(e)})),i=!e.isInherited||e.isInherited===t.state.inherited;return r&&o&&i}(n,t,e)}))}));return{members:o}}var Gt={class:"flex justify-between h-16 px-5"},Jt={class:"flex items-center truncate"},Kt={ref:"memberName",class:"flex items-center group"},Xt={class:"font-mono text-sm truncate whitespace-nowrap dark:text-dark-350"},Qt={key:0,class:"ml-2"},en={key:1,class:"ml-2 text-gray-600 dark:text-dark-350"},tn={key:2},nn={key:3,class:"ml-1"},rn={key:0,class:"flex items-center h-6 px-2 ml-3 text-xs leading-none whitespace-nowrap border border-gray-400 rounded dark:border-dark-650"},on={class:"flex"},sn={class:"z-10 inline-flex bg-white border border-gray-300 rounded shadow-sm dark:bg-dark-650 dark:border-dark-650",style:{padding:"2px"}};const an=(0,r.aZ)({name:"DocMemberToolbar",components:{DocCopyButton:Ve},props:{id:String,name:String},setup:function(e){return{buttons:(0,r.Fl)((function(){var t=window.location,n=t.origin,r=t.pathname,o="".concat(n).concat(r,"#").concat(e.id);return[{id:1,copyText:e.name,tooltipText:"Copy name",icon:"DocIconCopy"},{id:2,copyText:o,tooltipText:"Copy link",icon:"DocIconLink"}]}))}}}),ln=(0,c.Z)(an,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-copy-button");return(0,r.wg)(),(0,r.iD)("div",sn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.buttons,(function(e){return(0,r.wg)(),(0,r.j4)(l,{key:e.id,"copy-text":e.copyText,"tooltip-text":e.tooltipText,"button-class":"w-7 h-7 hover:bg-gray-200 focus:bg-gray-300 dark:hover:bg-dark-500",onClick:t[0]||(t[0]=(0,r.iM)((function(){}),["stop"]))},{default:(0,r.w5)((function(){return[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[((0,r.wg)(),(0,r.j4)((0,r.LL)(e.icon)))]})),_:2},1024)]})),_:2},1032,["copy-text","tooltip-text"])})),128))])}]]);var cn={class:"flex items-center"};const un=(0,r.aZ)({name:"DocMemberAccessBadges",props:{access:{type:Array}},setup:function(e){return{badges:(0,r.Fl)((function(){var t;return null===(t=e.access)||void 0===t?void 0:t.filter((function(e){return"public"!==e}))}))}}}),dn=(0,c.Z)(un,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",cn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.badges,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,class:"ml-3",type:e},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e),1)]})),_:2},1032,["type"])})),128))])}]]),fn=(0,r.aZ)({name:"DocMemberTitle",components:{DocMemberToolbar:ln,DocMemberAccessBadges:dn},props:{isVisible:{type:Boolean,required:!0,default:!1},isIntersecting:Boolean,isWindowScrolling:Boolean,id:String,name:String,overloadId:String,type:String,params:String,returns:String,memberAccess:Array},setup:function(e){var t,n,o=(0,r.Fl)((function(){return e.overloadId?Yt(e.overloadId).members.value.length-1:0})),i=(0,r.Fl)((function(){return e.type&&e.type.split(",").join(" | ")})),s=(0,r.Fl)((function(){return e.params?"(".concat(e.params.trim(),")"):""})),a=(0,r.Fl)((function(){return e.returns&&e.returns.split(",").join(" | ")})),l=(t=(0,r.iH)(),n=(0,r.iH)({}),(0,r.bv)((function(){var e,r=null===(e=t.value)||void 0===e?void 0:e.querySelector("h3");setTimeout((function(){var e=r?"".concat(r.clientWidth,"px"):"0";n.value={width:e,minWidth:"3.75rem",height:"2.625rem"}}),1e3)})),{memberName:t,hoverTriggerStyles:n});return{overloadCount:o,memberType:i,memberParams:s,memberReturnType:a,memberName:l.memberName,hoverTriggerStyles:l.hoverTriggerStyles}}}),hn=(0,c.Z)(fn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-toolbar"),l=(0,r.up)("doc-member-access-badges");return(0,r.wg)(),(0,r.iD)("div",Gt,[(0,r._)("div",Jt,[(0,r._)("div",Kt,[(0,r.WI)(e.$slots,"default"),e.isIntersecting&&!e.isWindowScrolling?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"absolute top-0 rounded-br-full",style:(0,r.j5)(e.hoverTriggerStyles)},[(0,r.Wm)(a,{id:e.id,class:"absolute top-0 left-0 hidden -mt-5 group-hover:inline-flex",name:e.name},null,8,["id","name"])],4)):(0,r.kq)("",!0)],512),(0,r._)("div",Xt,[e.memberType?((0,r.wg)(),(0,r.iD)("span",Qt,": "+(0,r.zw)(e.memberType),1)):(0,r.kq)("",!0),e.memberParams?((0,r.wg)(),(0,r.iD)("span",en,(0,r.zw)(e.memberParams),1)):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",tn,":")):(0,r.kq)("",!0),e.memberReturnType?((0,r.wg)(),(0,r.iD)("span",nn,(0,r.zw)(e.memberReturnType),1)):(0,r.kq)("",!0)]),e.overloadCount?((0,r.wg)(),(0,r.iD)("div",rn," +"+(0,r.zw)(e.overloadCount)+" more ",1)):(0,r.kq)("",!0)]),(0,r._)("div",on,[(0,r.Wm)(l,{access:e.memberAccess},null,8,["access"])])])}]]);var pn={class:"mb-5"},mn=(0,r._)("span",{class:"relative z-10 px-2 mb-2 ml-2 text-sm text-gray-600 uppercase bg-white rounded dark:bg-dark-850 dark:text-dark-350"}," Overloads ",-1),vn={class:"max-h-60 pt-4 pb-2 -mt-3.5 mb-6 overflow-x-hidden overflow-y-auto border border-gray-200 rounded dark:border-dark-650"},gn={class:"pl-0"},bn=["onClick"],yn={class:"font-mono text-sm truncate whitespace-nowrap"};const wn=(0,r.aZ)({name:"DocOverloadSelect",components:{DocMemberAccessBadges:dn},setup:function(){var e=Yt((0,r.f3)(Zt)).members;return{members:e,memberLabel:function(e){var t=e.name;return(t+=e.params?" (".concat(e.params,")"):" ()")+(e.returns?": ".concat(e.returns):"")},memberAccess:function(e){return e.access?e.access.split(",").map((function(e){return e.trim()})):[]},memberClasses:function(e){var t="boolean"==typeof e.overloadVisibility&&e.overloadVisibility;return{"bg-blue-100 text-blue-600 font-semibold dark:bg-dark-550 dark:bg-opacity-50":t,"hover:bg-gray-200 dark:hover:bg-dark-500 dark:hover:bg-opacity-50":!t}},onMemberClick:function(t){e.value.forEach((function(e){e.overloadVisibility=e.isOpen=e.id===t.id,function(e){e.animations=!1,setTimeout((function(){e.animations=!0}),100)}(e)}))}}}}),xn=(0,c.Z)(wn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-member-access-badges");return(0,r.wy)(((0,r.wg)(),(0,r.iD)("div",pn,[mn,(0,r._)("div",vn,[(0,r._)("ul",gn,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.id,class:(0,r.C_)(["flex px-4 py-1 list-none transition-colors duration-150 ease-linear cursor-pointer",e.memberClasses(t)]),onClick:function(n){return e.onMemberClick(t)}},[(0,r._)("div",yn,(0,r.zw)(e.memberLabel(t)),1),(0,r.Wm)(a,{class:"ml-auto",access:e.memberAccess(t)},null,8,["access"])],10,bn)})),128))])])],512)),[[r.F8,e.members.length>1]])}]]);var kn=(0,r._)("div",{class:"mb-2 text-sm text-gray-600 dark:text-dark-350 uppercase"}," Signature ",-1),Sn={class:"codeblock-wrapper"},En={class:"member-signature language-csharp m-0 px-5 py-4 text-dark-300 text-xs"},Cn={class:"member-signature language-csharp"};const _n=(0,r.aZ)({name:"DocMemberSignature",props:{signature:String}}),Tn=(0,c.Z)(_n,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-codeblock");return(0,r.wg)(),(0,r.iD)("div",null,[kn,(0,r._)("div",Sn,[(0,r.Wm)(a,null,{default:(0,r.w5)((function(){return[(0,r._)("pre",En,[(0,r._)("code",Cn,(0,r.zw)(e.signature),1)])]})),_:1})])])}]]);function On(e,t){var n=Object.assign({},{root:null,rootMargin:"0px",threshold:0},t),o=(0,r.iH)(),i=(0,r.iH)([]),s=(0,r.Fl)((function(){return void 0!==e.value&&null!==e.value&&i.value.length>0&&i.value.every((function(e){return e.isIntersecting}))})),a=function(e){i.value=e};return(0,r.bv)((function(){e.value&&(o.value=new IntersectionObserver(a,n),o.value.observe(e.value))})),(0,r.Jd)((function(){var e;null===(e=o.value)||void 0===e||e.disconnect()})),{isIntersecting:s,elements:i}}function Ln(e,t,n){var o=(0,r.iH)(!1),i=(0,r.Fl)((function(){return n.state.scrolledElementId})),s=(0,r.Fl)((function(){return n.state.isWindowScrolling}));return(0,r.YP)(s,(function(t){t||e===i.value&&(o.value=!0,setTimeout((function(){o.value=!1}),1e3),n.actions.updateScrolledElementId(""))}),{immediate:!0}),{isHighlighted:o}}const Rn=(0,r.aZ)({name:"DocMember",components:{DocAnchorTarget:u,DocCollapse:Ke,DocMemberTitle:hn,DocOverloadSelect:xn,DocMemberSignature:Tn},props:{id:{type:String,required:!0},name:{type:String,required:!0},isInherited:{type:Boolean,default:!1},access:{type:String,default:"public"},overloadId:String,type:String,params:String,returns:String,signature:String},setup:function(e){var t=(0,r.iH)(),n=(0,a.oR)().store,o=(0,r.f3)(Ut),i=(0,r.Fl)((function(){return n.state.memberGroups[o][e.id].animations}));!function(e,t,n){Object.keys(n).forEach((function(r){r&&e.actions.setMemberData(t,n.id,r,n[r])}))}(n,o,e);var s=function(e,t,n){var o=(0,r.Fl)((function(){var r,o=null===(r=n.state.memberGroups[t][e.id])||void 0===r?void 0:r.isVisible;return void 0===typeof o||o})),i=(0,r.Fl)((function(){return e.access.split(",").map((function(e){return e.trim()}))})),s=(0,r.Fl)((function(){var r=!e.overloadId||n.state.memberGroups[t][e.id].overloadVisibility,o=i.value.every((function(e){var t;return null===(t=n.state.access)||void 0===t?void 0:t.includes(e)})),s=!e.isInherited||e.isInherited===n.state.inherited,a=e.name.toLowerCase().includes(n.state.memberFilter.toLowerCase());return r&&o&&s&&a}));return(0,r.YP)(s,(function(r){n.actions.setMemberData(t,e.id,"isVisible",r)}),{immediate:!0}),{isVisible:o,memberAccess:i}}(e,o,n),l=s.isVisible,c=s.memberAccess,u=function(e,t,n,o){var i=(0,r.Fl)({get:function(){var r=n.state.memberGroups[t];return!(!r||!r[e])&&r[e].isOpen},set:function(r){n.actions.setMemberData(t,e,"isOpen",r)}}),s=(0,r.Fl)((function(){return n.state.scrolledElementId}));return(0,r.YP)(s,(function(r){e===r&&n.actions.setMemberData(t,e,"isOpen",!0)})),(0,r.YP)(i,(function(e){if(e){var t=o.value;t&&t.classList.contains("pluggable")&&(0,r.Y3)((function(){t.dispatchEvent(new Event("onPluginReady"))}))}})),{isOpen:i}}(e.id,o,n,t).isOpen;return{isOpen:u,isVisible:l,animations:i,memberAccess:c,isHighlighted:Ln(e.id,0,n).isHighlighted,memberRef:t,isIntersecting:On(t).isIntersecting,isWindowScrolling:(0,r.Fl)((function(){return n.state.isWindowScrolling}))}}}),Dn=(0,c.Z)(Rn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-target"),l=(0,r.up)("doc-member-title"),c=(0,r.up)("doc-overload-select"),u=(0,r.up)("doc-member-signature"),d=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.iD)("div",zt,[(0,r.Wm)(a,{id:e.id,class:"absolute top-5 left-0 right-0 bottom-0",style:{"z-index":"-1"}},null,8,["id"]),(0,r.wy)((0,r.Wm)(d,{modelValue:e.isOpen,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isOpen=t}),class:"relative -mt-px border dark:border-dark-650 doc-member",animations:e.animations},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(l,{id:e.id,class:"relative z-10",name:e.name,"overload-id":e.overloadId,type:e.type,params:e.params,returns:e.returns,"member-access":e.memberAccess,"is-visible":e.isVisible,"is-intersecting":e.isIntersecting,"is-window-scrolling":e.isWindowScrolling},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"name")]})),_:3},8,["id","name","overload-id","type","params","returns","member-access","is-visible","is-intersecting","is-window-scrolling"])]})),footer:(0,r.w5)((function(){return[e.isIntersecting?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-from-class":"opacity-0","enter-to-class":"opacity-100","leave-from-class":"opacity-100","leave-to-class":"opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",qt,$t,512),[[r.F8,e.isHighlighted]])]})),_:1})):(0,r.kq)("",!0)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Vt,[e.isOpen?((0,r.wg)(),(0,r.iD)(r.HY,{key:0},[e.overloadId?((0,r.wg)(),(0,r.j4)(c,{key:0})):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default"),t[0]||((0,r.qZ)(-1),t[0]=e.signature?((0,r.wg)(),(0,r.j4)(u,{key:1,class:"mb-5",signature:e.signature},null,8,["signature"])):(0,r.kq)("",!0),(0,r.qZ)(1),t[0]),(0,r.WI)(e.$slots,"parameters")],64)):(0,r.kq)("",!0)])]})),_:3},8,["modelValue","animations"]),[[r.F8,e.isVisible]])],512)}]]);var An={class:"mb-6 doc-member-group"},In={key:0,class:"flex items-center justify-between"},Mn={class:"group"},Fn=(0,r.Uk)(" # ");const Pn=(0,r.aZ)({name:"MemberGroup",props:{id:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Ut,e.id);var t=(0,a.oR)().store;return{visibleMemberCount:(0,r.Fl)((function(){return t.getters.getVisibleGroupMembers(e.id).length}))}}}),Hn=(0,c.Z)(Pn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger"),l=(0,r.up)("doc-anchor-target");return(0,r.wg)(),(0,r.iD)("div",An,[e.visibleMemberCount>0?((0,r.wg)(),(0,r.iD)("div",In,[(0,r.Wm)(l,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("h2",Mn,[(0,r.Wm)(a,{class:"float-left mt-2 -ml-6 text-lg font-normal text-blue-500 opacity-0 group-hover:opacity-100",to:"#".concat(e.id)},{default:(0,r.w5)((function(){return[Fn]})),_:1},8,["to"]),(0,r.WI)(e.$slots,"title")])]})),_:3},8,["id"])])):(0,r.kq)("",!0),(0,r.WI)(e.$slots,"default")])}]]),Nn=(0,r.aZ)({name:"DocOverloadGroup",props:{overloadId:{type:String,required:!0}},setup:function(e){(0,r.JJ)(Zt,e.overloadId);var t=Lt().route,n=Yt(e.overloadId).members;(0,r.m0)((function(){n.value.forEach((function(e,r){e.overloadVisibility=0===r,t.value.hash==="#".concat(e.id)&&0!==r&&(n.value[0].overloadVisibility=!1,e.overloadVisibility=!0)}))}))}}),jn=(0,c.Z)(Nn,[["render",function(e,t,n,o,i,s){return(0,r.WI)(e.$slots,"default")}]]);var Wn=["href"],Bn={class:"docs-panel-content px-5 pb-5"};const zn=(0,r.aZ)({name:"DocPanel",props:{id:{type:String,required:!0},collapsed:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(!e.collapsed),n=Lt().route;return(0,r.bv)((function(){n.value.hash&&n.value.hash==="#".concat(e.id)&&(t.value=!0)})),{isExpanded:t,onClick:function(e){(0,s.pI)(e)?e.stopPropagation():e.preventDefault()}}}}),Vn=(0,c.Z)(zn,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-right"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-anchor-target"),u=(0,r.up)("doc-collapse");return(0,r.wg)(),(0,r.j4)(u,{modelValue:e.isExpanded,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.isExpanded=t}),"trigger-class":"relative py-4 pl-5 font-medium text-gray-900 pr-14 dark:text-white",class:"mb-6 border rounded-md dark:border-dark-650"},{trigger:(0,r.w5)((function(){return[(0,r.Wm)(c,{id:e.id},{default:(0,r.w5)((function(){return[(0,r._)("div",null,[(0,r.WI)(e.$slots,"title")]),(0,r._)("div",{class:(0,r.C_)(["absolute inline-flex items-center justify-center text-blue-500 transition duration-200 ease-out origin-center rounded-full w-7 h-7 right-3 top-4 hover:bg-gray-200 dark:hover:bg-dark-500 z-5",{"rotate-90":e.isExpanded}])},[(0,r.Wm)(l,{width:"22",height:"22"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})],2)]})),_:3},8,["id"]),(0,r._)("a",{href:"#".concat(e.id),class:"absolute inset-0",onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onClick&&e.onClick.apply(e,t)})},null,8,Wn)]})),default:(0,r.w5)((function(){return[(0,r._)("div",Bn,[(0,r.WI)(e.$slots,"default")])]})),_:3},8,["modelValue"])}]]),qn=(0,r.aZ)({name:"DocPanels",setup:function(e,t){var n,o=t.slots,i=(null===(n=o.default)||void 0===n?void 0:n.call(o))||[],s=(0,r.Fl)((function(){return i.map((function(e){var t,n;return(0,r.h)(Vn,{id:null===(t=e.props)||void 0===t?void 0:t.id,collapsed:null===(n=e.props)||void 0===n?void 0:n.collapsed},{title:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.title()},default:function(){var t;return null===(t=e.children)||void 0===t?void 0:t.default()}})}))}));return function(){return(0,r.h)("div",{class:"docs-panels mb-6 border rounded-md dark:border-dark-650"},s.value)}}});var $n={class:"relative pl-4 mb-5"},Un={class:"relative mb-1"},Zn=(0,r._)("span",{class:"absolute -ml-4"},"⚬",-1),Yn={class:"font-semibold"},Gn={key:0},Jn=(0,r._)("span",{class:"font-semibold"},":",-1),Kn={key:0,class:"mx-1 text-sm"},Xn={key:1,class:"text-sm text-gray-600"},Qn={key:0,class:"text-sm"},er=(0,r._)("span",{class:"font-medium text-gray-900"},"Default value:",-1);const tr=(0,r.aZ)({name:"DocParamater",props:{name:{type:String,required:!0},type:{type:String,default:""},optional:{type:Boolean,default:!1},defaultValue:{type:String,default:""}}}),nr=(0,c.Z)(tr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-badge");return(0,r.wg)(),(0,r.iD)("div",$n,[(0,r._)("div",Un,[Zn,(0,r._)("span",Yn,(0,r.zw)(e.name),1),e.type?((0,r.wg)(),(0,r.iD)("span",Gn,[Jn,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.type),1)]})),_:1}),e.optional?((0,r.wg)(),(0,r.iD)("span",Kn,"•")):(0,r.kq)("",!0),e.optional?((0,r.wg)(),(0,r.iD)("span",Xn,"optional")):(0,r.kq)("",!0)])):(0,r.kq)("",!0)]),(0,r.WI)(e.$slots,"default"),e.defaultValue?((0,r.wg)(),(0,r.iD)("div",Qn,[(0,r._)("div",null,[er,(0,r.Wm)(a,{class:"ml-1"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.defaultValue),1)]})),_:1})])])):(0,r.kq)("",!0)])}]]);var rr={class:"p-5 bg-gray-100 rounded parameters dark:bg-dark-800"},or=(0,r._)("div",{class:"mb-4 text-sm text-gray-600 uppercase dark:text-dark-350"}," Parameters ",-1);const ir=(0,r.aZ)({name:"DocParameters"}),sr=(0,c.Z)(ir,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("div",rr,[or,(0,r.WI)(e.$slots,"default")])}]]);var ar=n(8816),lr={class:"relative"},cr={class:"absolute flex items-center justify-center h-full pl-3"},ur=["placeholder"];const dr=(0,r.aZ)({name:"SearchInput",emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.f3)(ar.xf),i=(0,a.oR)().store,s=(0,r.Fl)({get:function(){return i.state.searchQuery},set:function(e){return i.actions.updateSearchQuery(e)}}),l=(0,r.iH)();return{input:l,focus:function(){var e;null===(e=l.value)||void 0===e||e.focus()},config:St(),query:s,search:o,onKeydown:function(e){"Enter"===e.code&&n("select"),null==o||o.onKeydown(e)},onFocus:function(){o&&(o.isFocused=!0,o.results.length&&(o.isOpen=!0))}}}}),fr=(0,c.Z)(dr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-search"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-icon-x"),u=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",lr,[(0,r._)("div",cr,[(0,r.Wm)(l,null,{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})]),(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-10 pl-8 leading-10 text-left text-gray-600 transition-colors duration-200 ease-in bg-gray-200 border border-transparent rounded sm:text-sm hover:bg-white hover:border-gray-300 focus:outline-none focus:border-gray-500 focus:bg-white dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",style:{padding:"0.625rem 0.75rem 0.625rem 2rem"},type:"text",autocomplete:"off",spellcheck:"false","aria-label":"Search",placeholder:e.config.search.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onFocus&&e.onFocus.apply(e,t)}),onKeydown:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onKeydown&&e.onKeydown.apply(e,t)})},null,40,ur),[[r.nr,e.query]]),e.query?((0,r.wg)(),(0,r.j4)(u,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-2 mr-2 hover:bg-gray-200",tabindex:"-1",onClick:(0,r.iM)(e.search.clear,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]);var hr=["href","onClick"],pr={class:"w-full"},mr=["innerHTML"],vr=["innerHTML"],gr=["innerHTML"],br={key:1,class:"text-sm px-5 py-4 mb-3"};const yr=(0,r.aZ)({name:"DocSearchResults",props:{isMobile:Boolean},emits:["select"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.f3)(ar.xf),a=(0,Rt.Rs)(),l=St().search.noResultsFoundMsg;return(0,r.YP)((function(){return o.value}),(function(e){e&&new T.Z(e)})),{rootEl:o,searchApi:i,onResultClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),i.navigateToResult(e.path,a),n("select"))},getFullPath:function(e){return i.getResultFullPath(e,a)},noResultsText:l}}}),wr=(0,c.Z)(yr,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.j4)(r.uT,{"enter-active-class":"transition duration-300 ease-out overflow-hidden","enter-from-class":"-translate-y-2 opacity-0","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-100 ease-in overflow-hidden","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[e.searchApi.isFocused&&e.searchApi.isOpen?((0,r.wg)(),(0,r.iD)("div",{key:0,ref:"rootEl",class:(0,r.C_)(["z-30 w-full overflow-y-auto rounded bg-white",e.isMobile?"dark:bg-dark-850":"dark:bg-dark-650 dark:border-dark-500"])},[(0,r._)("ul",null,[e.searchApi.results.length?((0,r.wg)(!0),(0,r.iD)(r.HY,{key:0},(0,r.Ko)(e.searchApi.results,(function(t,n){return(0,r.wg)(),(0,r.iD)("li",{key:t.id},[(0,r._)("a",{class:(0,r.C_)(["flex justify-between m-3 mt-0 py-4 px-4 rounded-md group hover:bg-gray-200 dark:hover:bg-dark-450 focus:outline-none overflow-x-clip",n===e.searchApi.focusIndex?"bg-gray-200 dark:bg-dark-450":"bg-gray-100 dark:bg-dark-550"]),href:e.getFullPath(t.path),tabindex:"-1",onClick:function(n){return e.onResultClick(t,n)}},[(0,r._)("div",pr,[t.heading?((0,r.wg)(),(0,r.iD)("div",{key:0,class:"mb-2 font-semibold text-gray-900 dark:text-white",innerHTML:t.heading},null,8,mr)):(0,r.kq)("",!0),(0,r._)("div",{class:"text-sm",innerHTML:t.text},null,8,vr),(0,r._)("div",{class:"mt-2 text-xs font-medium text-gray-900 dark:text-white break-words",innerHTML:t.page},null,8,gr)])],10,hr)])})),128)):((0,r.wg)(),(0,r.iD)("li",br,(0,r.zw)(e.noResultsText),1))])],2)):(0,r.kq)("",!0)]})),_:1})}]]),xr=(0,r.aZ)({name:"DocSearchDesktop",components:{DocSearchInput:fr,DocSearchResults:wr},setup:function(){var e=(0,r.iH)(),t=(0,ar.Rx)(e);(0,r.JJ)(ar.xf,t);var n=(0,r.iH)();return(0,m.zX)(window,"keydown",(function(e){var t,r=e;r.target===document.body&&St().search.hotkeys.includes(r.key)&&(r.preventDefault(),null===(t=n.value)||void 0===t||t.focus())})),{rootEl:e,onRootClick:function(){var e;null===(e=t.input)||void 0===e||e.focus(),t.isFocused=!0},searchInput:n,searchApi:t}}}),kr=(0,c.Z)(xr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-search-results");return(0,r.wg)(),(0,r.iD)("div",{ref:"rootEl",class:(0,r.C_)(["absolute hidden transition-all duration-300 ease-out right-25 lg:flex lg:flex-col lg:ml-auto",e.searchApi.isFocused?"w-[42rem]":"w-40"]),onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onRootClick&&e.onRootClick.apply(e,t)}),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.searchApi.isFocused=!1}),["tab"]))},[(0,r.Wm)(a,{ref:"searchInput",class:(0,r.C_)(["self-end transition-all duration-300 ease-out",e.searchApi.isFocused?"w-96":"w-40"])},null,8,["class"]),(0,r.Wm)(l,{class:"absolute max-h-[32rem] pt-3 mt-2 border flex border-gray-300 shadow-lg dark:border-dark-650"})],34)}]]);var Sr={ref:"searchRoot",class:"flex flex-col h-full"},Er={class:"flex items-center justify-between shrink-0 h-16 bg-white md:h-20 dark:bg-dark-850"},Cr=r.lR;const _r=(0,r.aZ)({name:"DocSearchMobile",components:{Teleport:Cr,DocSearchInput:fr,DocSearchResults:wr},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,ar.Rx)(t);return(0,r.JJ)(ar.xf,n),{Teleport:Cr,docDrawer:e,searchRoot:t,show:function(){e.value.show()},onShown:function(){var e;null===(e=n.input)||void 0===e||e.focus()},onHidden:function(){var e;null===(e=n.input)||void 0===e||e.blur()},hideDrawer:function(){null==e||e.value.hide()},searchApi:n}}}),Tr=(0,c.Z)(_r,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-search-input"),l=(0,r.up)("doc-icon-arrow-right"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-search-results"),d=(0,r.up)("doc-icon-search"),f=(0,r.up)("doc-drawer");return(0,r.wg)(),(0,r.j4)(f,{ref:"docDrawer",class:"md:w-104","hide-event":["swipe-right","click"],onShown:e.onShown,onHidden:e.onHidden},{default:(0,r.w5)((function(){return[(0,r._)("div",Sr,[(0,r._)("div",Er,[(0,r.Wm)(a,{class:"ml-3 w-full",onSelect:e.hideDrawer},null,8,["onSelect"]),(0,r.Wm)(c,{class:"w-10 h-10 ml-3",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hideDrawer},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1},8,["onClick"])]),(0,r.Wm)(u,{class:"pb-6",style:{"max-height":"100%"},"is-mobile":!0,onSelect:e.hideDrawer},null,8,["onSelect"])],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-mobile-search-button"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-10 h-10 lg:hidden","icon-size":"20",onClick:(0,r.iM)(e.show,["stop"])},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1}))]})),_:1},8,["onShown","onHidden"])}]]);var Or={class:"flex items-center shrink-0 h-16 px-6 -ml-6 bg-white border-b border-gray-200 md:hidden dark:bg-dark-800 dark:border-dark-650"},Lr={ref:"sidebarFooter"},Rr={key:0,ref:"sidebarLinksEl",class:"overflow-y-auto h-full"},Dr=n(1296),Ar=n.n(Dr);function Ir(e){return"object"==typeof e&&null!=e&&1===e.nodeType}function Mr(e,t){return(!t||"hidden"!==e)&&"visible"!==e&&"clip"!==e}function Fr(e,t){if(e.clientHeight<e.scrollHeight||e.clientWidth<e.scrollWidth){var n=getComputedStyle(e,null);return Mr(n.overflowY,t)||Mr(n.overflowX,t)||function(e){var t=function(e){if(!e.ownerDocument||!e.ownerDocument.defaultView)return null;try{return e.ownerDocument.defaultView.frameElement}catch(e){return null}}(e);return!!t&&(t.clientHeight<e.scrollHeight||t.clientWidth<e.scrollWidth)}(e)}return!1}function Pr(e,t,n,r,o,i,s,a){return i<e&&s>t||i>e&&s<t?0:i<=e&&a<=n||s>=t&&a>=n?i-e-r:s>t&&a<n||i<e&&a>n?s-t+o:0}function Hr(e,t){var n=window,r=t.scrollMode,o=t.block,i=t.inline,s=t.boundary,a=t.skipOverflowHiddenElements,l="function"==typeof s?s:function(e){return e!==s};if(!Ir(e))throw new TypeError("Invalid target");for(var c=document.scrollingElement||document.documentElement,u=[],d=e;Ir(d)&&l(d);){if((d=d.parentElement)===c){u.push(d);break}null!=d&&d===document.body&&Fr(d)&&!Fr(document.documentElement)||null!=d&&Fr(d,a)&&u.push(d)}for(var f=n.visualViewport?n.visualViewport.width:innerWidth,h=n.visualViewport?n.visualViewport.height:innerHeight,p=window.scrollX||pageXOffset,m=window.scrollY||pageYOffset,v=e.getBoundingClientRect(),g=v.height,b=v.width,y=v.top,w=v.right,x=v.bottom,k=v.left,S="start"===o||"nearest"===o?y:"end"===o?x:y+g/2,E="center"===i?k+b/2:"end"===i?w:k,C=[],_=0;_<u.length;_++){var T=u[_],O=T.getBoundingClientRect(),L=O.height,R=O.width,D=O.top,A=O.right,I=O.bottom,M=O.left;if("if-needed"===r&&y>=0&&k>=0&&x<=h&&w<=f&&y>=D&&x<=I&&k>=M&&w<=A)return C;var F=getComputedStyle(T),P=parseInt(F.borderLeftWidth,10),H=parseInt(F.borderTopWidth,10),N=parseInt(F.borderRightWidth,10),j=parseInt(F.borderBottomWidth,10),W=0,B=0,z="offsetWidth"in T?T.offsetWidth-T.clientWidth-P-N:0,V="offsetHeight"in T?T.offsetHeight-T.clientHeight-H-j:0;if(c===T)W="start"===o?S:"end"===o?S-h:"nearest"===o?Pr(m,m+h,h,H,j,m+S,m+S+g,g):S-h/2,B="start"===i?E:"center"===i?E-f/2:"end"===i?E-f:Pr(p,p+f,f,P,N,p+E,p+E+b,b),W=Math.max(0,W+m),B=Math.max(0,B+p);else{W="start"===o?S-D-H:"end"===o?S-I+j+V:"nearest"===o?Pr(D,I,L,H,j+V,S,S+g,g):S-(D+L/2)+V/2,B="start"===i?E-M-P:"center"===i?E-(M+R/2)+z/2:"end"===i?E-A+N+z:Pr(M,A,R,P,N+z,E,E+b,b);var q=T.scrollLeft,$=T.scrollTop;S+=$-(W=Math.max(0,Math.min($+W,T.scrollHeight-L+V))),E+=q-(B=Math.max(0,Math.min(q+B,T.scrollWidth-R+z)))}C.push({el:T,top:W,left:B})}return C}function Nr(e){return e===Object(e)&&0!==Object.keys(e).length}var jr=["href"],Wr={class:"flex shrink-0 items-center justify-center w-6 h-6 mr-2"},Br=["innerHTML"],zr=["src"],Vr=["textContent"],qr={key:1,class:"absolute right-0 h-full bg-blue-500 dark:bg-blue-400 w-px"},$r={class:"ml-4 transition-all duration-200 ease-out"},Ur=n(2376),Zr=n(2110),Yr=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},Gr=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}};const Jr=(0,r.aZ)({name:"DocSidebarLink",props:{item:{type:Object,required:!0},depth:{type:Number,default:0},isFiltered:{type:Boolean,default:!1,required:!0}},setup:function(e){var t=(0,r.iH)(),n=(0,r.Fl)((function(){return e.item.children&&e.item.children.length>0||e.item.hash})),o=(0,r.Fl)((function(){return!(!e.item.icon&&!e.item.emoji)})),i=(0,Rt.sy)(),l=(0,Rt.Rs)(),c=St().appendDocumentName?St().documentName:"",u=(0,r.Fl)((function(){return e.item.clickable?e.item.url?e.item.url.startsWith(St().base)?l+e.item.url.slice(St().base.length):e.item.url:e.item.path&&"/"!==e.item.path?!St().trailingSlash&&c&&e.item.path?"".concat(l).concat(e.item.path,"/").concat(c):"".concat(l).concat(e.item.path).concat(c):(0,Rt.wE)(l):null})),d=(0,r.Fl)((function(){return e.item.icon&&!e.item.icon.startsWith("<")&&-1==e.item.icon.indexOf("://")?l+e.item.icon:e.item.icon})),f=Lt().route,h=(0,r.Fl)((function(){if(e.item.url)return!1;var t=i+(0,Rt.cD)(f.value.path),n=u.value;return null!=n&&null!=t&&(n.length===t.length&&n===t||n.length===t.length+1&&"/"!==t[t.length-1]&&"/"===n[n.length-1]&&n.startsWith(t)||n.length+1===t.length&&"/"===t[t.length-1]&&"/"!==n[n.length-1]&&t.startsWith(n))})),p=(0,a.oR)().store,m=(0,r.Fl)((function(){return p.state.sidebarLookup})),v=m.value.get(e.item.path);(e.isFiltered||e.item.open)&&E();var g=(0,Ur.i)(),b=g.result,y=g.error,w=g.loading,x=g.execute,k="".concat(location.origin).concat(Zr.as);function S(){return Yr(this,void 0,void 0,(function(){return Gr(this,(function(t){switch(t.label){case 0:return[4,x("".concat(k,"/").concat(e.item.hash,".json"))];case 1:if(t.sent(),y.value)throw new Error("Error fetching sidebar navigation items. ".concat(y.value));return(0,s.rw)(m.value,b.value,St().trailingSlash),[2]}}))}))}function E(t){var n;return Yr(this,void 0,void 0,(function(){var r;return Gr(this,(function(o){switch(o.label){case 0:return(r=t||v)?!e.item.hash||(null===(n=e.item.children)||void 0===n?void 0:n.length)?[3,2]:[4,S()]:[2];case 1:o.sent(),o.label=2;case 2:return p.actions.updateSidebarLookupItem(r,"expanded",!0),[2]}}))}))}function C(){v&&p.actions.updateSidebarLookupItem(v,"expanded",!1)}function _(){v&&v.expanded?C():E()}function T(){var t;h.value&&(n.value&&E(),null===(t=e.item.parentNodes)||void 0===t||t.forEach((function(e){E(m.value.get(e))})))}(0,r.YP)((function(){return e.isFiltered}),(function(e){e?E(v):(C(),T())}));var O=(0,r.iH)(!1);return(0,r.bv)((function(){h.value&&t.value&&p.actions.setActiveSidebarEl(t.value),T(),(0,r.Y3)((function(){O.value=!0}))})),{sidebarLinkRef:t,isGroup:n,hasCustomIcon:o,href:u,icon:d,isActive:h,onLinkClick:function(e){if(!(0,s.pI)(e)){if(h.value)e.preventDefault();else if((null==v?void 0:v.expanded)&&u.value)return;_()}},toggle:_,loading:w,transitionsEnabled:O,onEnter:function(e){O.value&&(e.style.height="0"),(0,r.Y3)((function(){e.style.height="".concat(e.scrollHeight,"px")}))},onAfterEnter:function(e){(0,r.Y3)((function(){e.style.height="auto"}))},onBeforeLeave:function(e){e.style.height="".concat(e.scrollHeight,"px")},onLeave:function(e){e.style.height="0px"}}}}),Kr=(0,c.Z)(Jr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon"),l=(0,r.up)("doc-emoji"),c=(0,r.up)("doc-icon-folder"),u=(0,r.up)("doc-loading-spinner"),d=(0,r.up)("doc-icon-chevron-right"),f=(0,r.up)("doc-sidebar-link");return(0,r.wg)(),(0,r.iD)("li",null,[(0,r._)("div",{class:(0,r.C_)(["relative flex items-center justify-between break-normal pl-3 pr-4 select-none rounded-l transition-colors ease-out duration-150",{"text-blue-500 dark:text-blue-400 bg-blue-100 dark:bg-dark-650 rounded-l":e.isActive,"text-gray-900 dark:text-dark-250 hover:text-blue-500 dark:hover:text-blue-400":!e.isActive}])},[(0,r._)("a",{ref:"sidebarLinkRef",class:"flex flex-1 items-center cursor-pointer",href:e.href,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onLinkClick&&e.onLinkClick.apply(e,t)})},[(0,r._)("span",Wr,[e.item.icon&&e.item.icon.startsWith("<")?((0,r.wg)(),(0,r.j4)(a,{key:0,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r._)("g",{innerHTML:e.item.icon},null,8,Br)]})),_:1})):e.item.icon?((0,r.wg)(),(0,r.iD)("img",{key:1,src:e.icon,class:"w-4.5"},null,8,zr)):e.item.emoji?((0,r.wg)(),(0,r.j4)(l,{key:2,emoji:e.item.emoji},null,8,["emoji"])):!e.item.icon&&0===e.depth&&e.isGroup?((0,r.wg)(),(0,r.j4)(a,{key:3,class:"w-4.5 h-4.5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1})):(0,r.kq)("",!0)]),(0,r._)("span",{class:"text-sm py-1.5",textContent:(0,r.zw)(e.item.label)},null,8,Vr)],8,jr),e.isGroup?((0,r.wg)(),(0,r.iD)("div",{key:0,class:(0,r.C_)(["flex items-center justify-center w-7 h-7 rounded-full transition-colors ease-linear duration-150 group shrink-0",{"hover:bg-blue-200 hover:bg-opacity-50":e.isActive&&!e.loading,"hover:bg-gray-200 dark:hover:bg-dark-500":!e.loading}])},[e.loading?((0,r.wg)(),(0,r.j4)(u,{key:0,size:16})):((0,r.wg)(),(0,r.iD)("button",{key:1,class:(0,r.C_)(["text-gray-400 dark:text-dark-400 group-hover:text-blue-500 dark:group-hover:text-blue-400 focus:outline-none",{"rotate-90":e.item.expanded,"transition-transform ease-out duration-200":e.transitionsEnabled}]),onClick:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)})},[(0,r.Wm)(a,{class:"w-5 h-5"},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1})],2))],2)):(0,r.kq)("",!0),e.isActive?((0,r.wg)(),(0,r.iD)("span",qr)):(0,r.kq)("",!0)],2),e.isGroup?((0,r.wg)(),(0,r.j4)(r.uT,{key:0,"enter-active-class":"overflow-hidden","leave-active-class":"overflow-hidden",onEnter:e.onEnter,onAfterEnter:e.onAfterEnter,onBeforeLeave:e.onBeforeLeave,onLeave:e.onLeave},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("ul",$r,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t){return(0,r.wg)(),(0,r.j4)(f,{key:t.path,item:t,depth:e.depth+1,"is-filtered":e.isFiltered},null,8,["item","depth","is-filtered"])})),128))],512),[[r.F8,e.isGroup&&e.item.expanded]])]})),_:1},8,["onEnter","onAfterEnter","onBeforeLeave","onLeave"])):(0,r.kq)("",!0)])}]]),Xr=(0,r.aZ)({name:"DocSidebarLinks",components:{DocSidebarLink:Kr},props:{items:{type:Array,required:!0},isFiltered:{type:Boolean,required:!0}},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=(0,r.iH)(0),o=(0,r.iH)(),i=(0,a.oR)().store,s=(0,r.Fl)((function(){return i.state.sidebarActiveEl})),l=On(s,{threshold:1}).elements,c=Ar()((function(){var e,r,o=(null===(e=t.value)||void 0===e?void 0:e.scrollTop)||0;i.state.sidebarScroll!==o&&(n.value=(null===(r=t.value)||void 0===r?void 0:r.scrollTop)||0,i.actions.setSidebarScroll(n.value))}),200);return(0,r.bv)((function(){var n,r;o.value=e.value&&new T.Z(e.value),t.value=null===(n=o.value)||void 0===n?void 0:n.getScrollElement(),null===(r=o.value)||void 0===r||r.getScrollElement().addEventListener("scroll",c),t.value&&(t.value.scrollTop=i.state.sidebarScroll),setTimeout((function(){!l.value.some((function(e){return e.isIntersecting}))&&s.value&&function(e,t){var n=e.isConnected||e.ownerDocument.documentElement.contains(e);if(Nr(t)&&"function"==typeof t.behavior)return t.behavior(n?Hr(e,t):[]);if(n){var r=function(e){return!1===e?{block:"end",inline:"nearest"}:Nr(e)?e:{block:"start",inline:"nearest"}}(t);(function(e,t){void 0===t&&(t="auto");var n="scrollBehavior"in document.body.style;e.forEach((function(e){var r=e.el,o=e.top,i=e.left;r.scroll&&n?r.scroll({top:o,left:i,behavior:t}):(r.scrollTop=o,r.scrollLeft=i)}))})(Hr(e,r),r.behavior)}}(s.value,{behavior:"smooth",block:"center",boundary:t.value})}),200)})),(0,r.Jd)((function(){var e;null===(e=t.value)||void 0===e||e.removeEventListener("scroll",c)})),{sidebarLinksEl:e}}}),Qr=(0,c.Z)(Xr,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-sidebar-link");return e.items.length?((0,r.wg)(),(0,r.iD)("ul",Rr,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.items,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.path,item:t,"is-filtered":e.isFiltered},null,8,["item","is-filtered"])})),128))],512)):(0,r.kq)("",!0)}]]);var eo={class:"relative flex items-center w-full"},to=["value","placeholder"];const no=(0,r.aZ)({name:"DocSidebarFilter",props:{modelValue:String,isOpen:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=St().sidebarFilterPlaceholder||"Filter by title",s=Ar()((function(e){n("update:modelValue",e.target.value)}),200);return(0,r.YP)((function(){return e.isOpen}),(function(){var e;null===(e=o.value)||void 0===e||e.blur()})),{input:o,placeholder:i,clear:function(){var e;n("update:modelValue",""),null===(e=o.value)||void 0===e||e.focus()},onInput:s}}}),ro=(0,c.Z)(no,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",eo,[(0,r._)("input",{ref:"input",value:e.modelValue,class:"w-full h-8 px-3 py-2 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:focus:border-dark-450 dark:focus:bg-dark-450 dark:hover:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onInput:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.onInput&&e.onInput.apply(e,t)})},null,40,to),e.modelValue?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1 text-gray-600 hover:text-gray-900",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])])}]]);var oo=function(){return oo=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},oo.apply(this,arguments)},io=r.lR;const so=(0,r.aZ)({name:"DocSidebar",components:{Teleport:io,DocSidebarLinks:Qr,DocSidebarFilter:ro,DocOverlay:Qe},setup:function(){var e=(0,r.iH)(!1),t=(0,a.oR)().store,n=(0,r.iH)();!function(e){var t=(0,r.iH)();function n(){e.state.sidebarLookup.forEach((function(t){e.actions.updateSidebarLookupItem(t,"expanded",!1)})),e.actions.setSidebarScroll(0)}(0,r.bv)((function(){t.value=document.querySelector("#docs-site-logo"),t.value&&t.value.addEventListener("click",n)})),(0,r.Jd)((function(){var e;t.value&&(null===(e=t.value)||void 0===e||e.removeEventListener("click",n))}))}(t),function(e){var t=(0,r.Fl)((function(){return e.state.sidebarLookup}));e.state.initialPageLoad&&function(){if(e.state.sidebar.id&&e.state.sidebar.id===St().id)r=new Map,(o=function(e){e.forEach((function(e){e.children&&(r.set(e.path,e),o(e.children))}))})(e.state.sidebar.data),e.actions.setSidebarLookupData(r);else{var n=(0,s.am)(t.value,St().sidebar,St().trailingSlash);e.actions.setSidebarData({id:St().id,data:n})}var r,o}()}(t);var o=function(e){var t=(0,r.iH)(""),n=(0,r.iH)(!1),o=(0,r.Fl)((function(){return e.state.sidebar})),i=(0,r.Fl)((function(){var e=t.value.toLowerCase();return n.value=!!e,function(e){var t=function(n,r){if(!r.visible)return n;if(r.children){var o=r.children.reduce(t,[]);(o.length||r.clickable&&(!e||r.searchLabel.includes(e)))&&n.push(oo(oo({},r),{children:o}))}else e&&!r.searchLabel.includes(e)||n.push(r);return n};return o.value.data.reduce(t,[])}(e)}));return{query:t,isFiltered:n,filteredItems:i}}(t),i=o.query,l=o.isFiltered,c=o.filteredItems,u=tt(),d=u.enableBodyScroll,f=u.disableBodyScroll;return{Teleport:io,sidebarFooter:n,isOpen:e,show:function(){e.value=!0,f()},hide:function(){e.value=!1,d()},filteredItems:c,isFiltered:l,query:i,showSidebarFilter:St().showSidebarFilter}}}),ao=(0,c.Z)(so,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-left"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-filter"),u=(0,r.up)("doc-sidebar-links"),d=(0,r.up)("doc-icon-menu"),f=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("aside",{class:(0,r.C_)(["fixed top-0 z-40 flex flex-col shrink-0 w-4/5 duration-300 ease-in-out bg-gray-100 border-gray-200 sidebar md:top-20 sm:w-1/2 md:w-75 md:z-0 md:border-r md:h-screen md:sticky md:transition-transform dark:bg-dark-800 dark:border-dark-650",{"shadow-2xl md:shadow-none":e.isOpen}]),style:(0,r.j5)({transform:e.isOpen?"translateX(0)":""})},[(0,r._)("div",Or,[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full ml-0.5","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0)]),e.showSidebarFilter?((0,r.wg)(),(0,r.j4)(c,{key:0,modelValue:e.query,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.query=t}),class:"absolute top-0 left-0 right-0 z-5 bg-gray-100 dark:bg-dark-800 h-16 px-6 hidden md:flex items-center","is-open":e.isOpen},null,8,["modelValue","is-open"])):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"flex-1 pl-3 mt-4 md:mt-16 mb-4",items:e.filteredItems,"is-filtered":e.isFiltered},null,8,["items","is-filtered"]),(0,r._)("div",Lr,[(0,r.WI)(e.$slots,"sidebar-footer")],512),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-sidebar-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(l,{class:"w-10 h-10 ml-3.5 md:hidden","icon-size":"24",onClick:e.show},{default:(0,r.w5)((function(){return[(0,r.Wm)(d)]})),_:1},8,["onClick"])]})),_:1})),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(f,{"is-open":e.isOpen,onSwipeLeft:e.hide,onClick:e.hide},null,8,["is-open","onSwipeLeft","onClick"])]})),_:1}))],6)}]]);var lo={id:"docs-sidebar-right",ref:"content",class:"w-full h-full overflow-auto"},co={key:0,class:"flex items-center justify-between h-16 mb-4 border-b lg:border-none lg:h-auto dark:border-dark-650"},uo={class:"px-5 text-gray-500 dark:text-dark-400"};const fo=(0,r.aZ)({name:"DocSidebarRightToggle",emits:["click"]}),ho=(0,c.Z)(fo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-align-right"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(l,{class:"w-10 h-10 -mr-2.5 md:-mr-12 bg-white dark:bg-dark-850 bg-opacity-80 dark:bg-opacity-80 text-gray-600 hover:text-gray-800 lg:hidden","icon-size":"20",onClick:t[0]||(t[0]=function(t){return e.$emit("click")})},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1})}]]);var po={key:0},mo=n(9843);const vo=(0,r.aZ)({name:"DocToc",emits:["link-click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)([]);!function(e){var t,n,o=-1,i=-1,a=document.getElementById("docs-content"),l=null!==(t=null==a?void 0:a.offsetTop)&&void 0!==t?t:24,c=(0,s.vE)();function u(){var t=e.value;if(t&&t.length){var n=(document.documentElement.scrollTop||document.body.scrollTop)+l,r=function(e,t,n){var r=0,o=n.length-1;if(t>=r&&t<=o)if(e>=n[t].el.offsetTop){if(r=t+1,t===o||e<n[r].el.offsetTop)return t}else if(o=t-1,t>0&&e>=n[o].el.offsetTop)return o;for(;r<=o;){var i=o+r>>1,s=e-n[i].el.offsetTop;if(s>0)r=i+1;else{if(!(s<0)){r=i;break}o=i-1}}return r>o?o:r}(n,o,t),s=function(e,t,n,r){var o=Math.max(0,n),i=r.length-1;if(n===i)return i;if(t>=o&&t<=i)if(e>=r[t].el.offsetTop){if(o=t+1,t===i||e<r[o].el.offsetTop)return t}else if(i=t-1,t>0&&e>=r[i].el.offsetTop)return i;if(i<=n)return n;for(;o<=i;){var s=i+o>>1,a=e-r[s].el.offsetTop;if(a>0)o=s+1;else{if(!(a<0)){o=s;break}i=s-1}}return o>i?i:o}(n+Math.max(document.documentElement.clientHeight||0,window.innerHeight||0)+c-2*l,i,r,t);r<0?s>=0&&(r=0):s<r&&(s=r),r<0?o>=0&&d(t,o,i,!1):o<0?d(t,r,s,!0):s<o||r>i?(d(t,r,s,!0),d(t,o,i,!1)):r<=o?s<=i?(d(t,r,o-1,!0),d(t,s+1,i,!1)):(d(t,r,o-1,!0),d(t,i,s,!0)):s<=i?(d(t,o,r-1,!1),d(t,s+1,i,!1)):(d(t,i,s,!0),d(t,o,r-1,!1)),o=r,i=s}}function d(e,t,n,r){for(var o=t;o<=n;++o)e[o].isActive=r}(0,m.Up)(window,"scroll",u,3,300),(0,m.Up)(window,"resize",u,3,300),a&&(n=new mo.ResizeSensor(a,(0,m.BK)(u,3,300))),(0,r.Jd)((function(){n&&(n.detach(),n=void 0)}))}(o);var i=(0,a.oR)().store;return(0,r.bv)((function(){var e;o.value=(e=[],document.querySelectorAll("#docs-content h2, #docs-content h3").forEach((function(t){var n,r,o="H2"===t.tagName?2:3,i=(null===(n=t.querySelector("a"))||void 0===n?void 0:n.href.split("#")[1])||"",s=(null===(r=t.querySelector("span"))||void 0===r?void 0:r.textContent)||"";if(i.length>0&&s.length>0){var a=decodeURIComponent(i);e.push({el:t,level:o,slug:a,title:s,isActive:!1})}})),e),i.state.sidebarRightHasContent=o.value.length>0})),{tocData:o,classList:function(e){return[{"pl-10":3===e.level},e.isActive?"text-blue-500 dark:text-blue-400":"hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400"]},onClick:function(){n("link-click")}}}}),go=(0,c.Z)(vo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return e.tocData&&e.tocData.length?((0,r.wg)(),(0,r.iD)("ul",po,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.tocData,(function(t){return(0,r.wg)(),(0,r.iD)("li",{key:t.slug},[(0,r.Wm)(a,{class:(0,r.C_)(["relative block px-5 py-1 toc-link",e.classList(t)]),to:"#".concat(t.slug),onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(t.title)+" ",1),(0,r._)("div",{style:{width:"1px"},class:(0,r.C_)({"absolute top-0 left-0 h-full bg-blue-500 dark:bg-blue-400":t.isActive})},null,2)]})),_:2},1032,["class","to","onClick"])])})),128))])):(0,r.kq)("",!0)}]]);var bo={key:0,class:"px-5 text-sm"},yo={key:0,class:"mt-3 mb-2 text-gray-600 uppercase dark:text-dark-400"},wo=["href"],xo={key:2,class:"font-semibold text-gray-900 dark:text-blue-400"},ko={key:1};const So=(0,r.aZ)({name:"DocRelatedClassItem",props:{item:{type:Object,default:function(){return{}}},depth:{type:Number,default:0}},setup:function(e){return{hasChildren:(0,r.Fl)((function(){return void 0!==e.item.children&&e.item.children.length>0})),marginLeft:(0,r.Fl)((function(){var t=e.depth>1?.5:0;return"".concat((e.depth-1)*t,"rem")})),showIcon:(0,r.Fl)((function(){return!0!==e.item.isGroup&&void 0!==e.item.children&&e.item.children.length>0})),onItemClick:function(e,t){(0,s.pI)(t)||(t.preventDefault(),(0,f.Vn)(e))}}}}),Eo=(0,c.Z)(So,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return(0,r.wg)(),(0,r.iD)("li",{class:(0,r.C_)(["relative",{"pl-1":e.depth>1,"mb-4":0===e.depth}])},[(0,r._)("div",{class:"flex items-center truncate",style:(0,r.j5)({marginLeft:e.marginLeft,minHeight:"1.875rem"})},[e.item.isGroup?((0,r.wg)(),(0,r.iD)("h6",yo,(0,r.zw)(e.item.title),1)):e.item.href?((0,r.wg)(),(0,r.iD)("a",{key:1,class:"truncate transition-colors duration-100 ease-linear cursor-pointer hover:text-blue-500 dark:text-dark-300 dark:hover:text-blue-400",href:e.item.href,onClick:t[0]||(t[0]=function(t){return e.onItemClick(e.item.href,t)})},(0,r.zw)(e.item.label),9,wo)):((0,r.wg)(),(0,r.iD)("div",xo,(0,r.zw)(e.item.label),1))],4),e.showIcon?((0,r.wg)(),(0,r.iD)("span",{key:0,class:"absolute w-2 h-3 border-b border-l border-gray-600",style:(0,r.j5)({marginLeft:e.marginLeft,marginTop:"0.375rem"})},null,4)):(0,r.kq)("",!0),e.hasChildren?((0,r.wg)(),(0,r.iD)("ul",ko,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.item.children,(function(t,n){return(0,r.wg)(),(0,r.j4)(a,{key:n,item:t,depth:e.depth+1},null,8,["item","depth"])})),128))])):(0,r.kq)("",!0)],2)}]]),Co=(0,r.aZ)({name:"DocRelatedClasses",components:{DocRelatedClassItem:Eo},setup:function(){var e=Et().pageData;return{relatedClasses:(0,r.Fl)((function(){var t;return(null===(t=e.value)||void 0===t?void 0:t.relatedClasses)||[]}))}}}),_o=(0,c.Z)(Co,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-related-class-item");return e.relatedClasses.length?((0,r.wg)(),(0,r.iD)("ul",bo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.relatedClasses,(function(e,t){return(0,r.wg)(),(0,r.j4)(a,{key:t,item:e},null,8,["item"])})),128))])):(0,r.kq)("",!0)}]]);var To=r.lR;const Oo=(0,r.aZ)({name:"DocSidebarRight",components:{Teleport:To,DocToc:go,DocOverlay:Qe,DocSidebarRightToggle:ho,DocRelatedClasses:_o},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(!1),n=(0,r.iH)(!1),o=Et().pageData,i=(0,a.oR)().store,s=(0,r.Fl)((function(){return o.value?o.value.relatedClasses?"DocRelatedClasses":"DocToc":null})),l=(0,r.Fl)((function(){return"DocToc"===s.value?"Contents":"DocRelatedClasses"===s.value?"Related Classes":null})),c=(0,r.Fl)((function(){return{"translate-x-0 shadow-2xl":t.value,"translate-x-full":!t.value,"lg:top-40":"DocRelatedClasses"===s.value,"lg:top-20":"DocToc"===s.value}})),u=(0,r.Fl)((function(){return{height:"DocRelatedClasses"===s.value?"calc(100vh - 10rem)":"calc(100vh - 5rem"}}));return(0,r.bv)((function(){n.value=!0,e.value&&new T.Z(e.value)})),{Teleport:To,content:e,isOpen:t,isMounted:n,store:i,show:function(){t.value=!0},hide:function(){t.value=!1},currentComponent:s,title:l,classes:c,styles:u}}}),Lo=(0,c.Z)(Oo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-arrow-right"),l=(0,r.up)("doc-icon-button"),c=(0,r.up)("doc-sidebar-right-toggle"),u=(0,r.up)("doc-overlay");return(0,r.wg)(),(0,r.iD)("div",{class:(0,r.C_)(["fixed top-0 bottom-0 right-0 z-40 w-4/5 text-sm transition-transform duration-300 ease-in-out bg-white border-gray-200 sidebar-right sm:w-1/2 md:w-104 lg:z-0 lg:sticky lg:w-64 lg:shrink-0 lg:transform-none lg:border-l lg:shadow-none lg:pt-6 focus:outline-none dark:bg-dark-800 lg:dark:bg-dark-850 dark:border-dark-650",e.classes]),style:(0,r.j5)(e.styles),onKeyup:t[0]||(t[0]=(0,r.D2)((function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.hide&&e.hide.apply(e,t)}),["esc"]))},[(0,r._)("div",lo,[e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.iD)("div",co,[(0,r._)("h6",uo,(0,r.zw)(e.title),1),(0,r.Wm)(l,{class:"w-10 h-10 ml-3 lg:hidden",style:{"margin-right":"0.875rem"},"icon-size":"22",onClick:e.hide},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])])):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.currentComponent),{onLinkClick:e.hide},null,8,["onLinkClick"]))],512),e.isMounted&&e.store.state.sidebarRightHasContent?((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{key:0,to:"#docs-sidebar-right-toggle"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"absolute right-0",onClick:e.show},null,8,["onClick"])]})),_:1})):(0,r.kq)("",!0),((0,r.wg)(),(0,r.j4)((0,r.LL)(e.Teleport),{to:"#docs-overlay-target"},{default:(0,r.w5)((function(){return[(0,r.Wm)(u,{"is-open":e.isOpen,onSwipeRight:e.hide,onClick:e.hide},null,8,["is-open","onSwipeRight","onClick"])]})),_:1}))],38)}],["__scopeId","data-v-3955b324"]]);var Ro=["aria-checked"],Do=["checked"],Ao={class:"inline-flex items-center"};const Io=(0,r.aZ)({name:"DocSwitch",props:{modelValue:Boolean},emits:["update:modelValue"],setup:function(e,t){var n=t.emit;return{isFocused:(0,r.iH)(!1),toggle:function(){n("update:modelValue",!e.modelValue)}}}}),Mo=(0,c.Z)(Io,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("label",{class:"relative inline-block cursor-pointer whitespace-nowrap",role:"switch","aria-checked":e.modelValue},[(0,r._)("input",{type:"checkbox",class:"absolute opacity-0",style:{"z-index":"-1"},checked:e.modelValue,onChange:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggle&&e.toggle.apply(e,t)}),onFocus:t[1]||(t[1]=function(t){return e.isFocused=!0}),onBlur:t[2]||(t[2]=function(t){return e.isFocused=!1})},null,40,Do),(0,r._)("div",Ao,[(0,r._)("div",{class:(0,r.C_)(["w-6 h-2 transition-colors duration-100 ease-linear rounded-full",e.modelValue?"bg-blue-500 dark:bg-blue-400":"bg-gray-400 dark:bg-dark-400"])},null,2),(0,r._)("div",{class:(0,r.C_)(["absolute w-4 h-4 transition-transform duration-100 ease-linear bg-white border border-gray-500 rounded-full",{"shadow-outline":e.isFocused}]),style:(0,r.j5)({transform:e.modelValue?"translateX(8px)":null})},null,6)]),(0,r.WI)(e.$slots,"default")],8,Ro)}]]),Fo=(0,$e.aZ)({name:"DocTab",props:{id:{type:String,required:!0},active:Boolean},setup:function(e,t){var n=t.slots;return function(){return(0,$e.h)((function(){var e;return null===(e=n.default)||void 0===e?void 0:e.call(n)}))}}});var Po=n(2262);const Ho=(0,$e.aZ)({name:"DocTabs",components:{DocAnchorTarget:u},setup:function(e,t){var n,r,o,i,a=t.slots,l=(0,Po.iH)(),c=(0,Po.iH)(""),d=(null===(n=a.default)||void 0===n?void 0:n.call(a))||[],f={};c.value=(null===(o=null===(r=d.find((function(e){var t,n;return""===(null===(t=e.props)||void 0===t?void 0:t.active)||(null===(n=e.props)||void 0===n?void 0:n.active)})))||void 0===r?void 0:r.props)||void 0===o?void 0:o.id)||(null===(i=d[0].props)||void 0===i?void 0:i.id);var h=d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id;return"#".concat(n)})),p=Lt().route;function m(){if(p.value.hash&&h.includes(p.value.hash)){var e=p.value.hash.substr(1);if(c.value!==e)return c.value=e,!0}return!1}function v(){var e=c.value;if(!f[e]){f[e]=!0;var t=(0,$e.m0)((function(){var e;null===(e=l.value)||void 0===e||e.dispatchEvent(new Event("onPluginReady")),t()}),{flush:"post"})}}m(),f[c.value]=!0,(0,$e.YP)(p,(function(){m()&&v()}));var g=(0,$e.Fl)((function(){return d.map((function(e){var t,n=null===(t=e.props)||void 0===t?void 0:t.id,r=c.value===n;return(0,$e.h)(u,{id:n},(function(){var t,o;return(0,$e.h)("a",{href:"#".concat(n),class:{"no-link block px-5 py-4 cursor-pointer border-b-2 font-medium":!0,"text-gray-500 dark:text-dark-350 hover:text-blue-500 dark:hover:text-blue-400 border-transparent hover:border-gray-300 dark:hover:border-dark-450":!r,"text-blue-500 dark:text-blue-400 border-blue-500":r},onClick:function(e){(0,s.pI)(e)||(e.preventDefault(),c.value!==n&&(c.value=n,v()))}},null===(o=(t=e.children).title)||void 0===o?void 0:o.call(t))}))}))})),b=(0,$e.Fl)((function(){return d.map((function(e){var t;if(c.value===(null===(t=e.props)||void 0===t?void 0:t.id))return(0,$e.h)((function(){return(0,$e.h)("div",{class:"tab-content"},e)}))}))}));return function(){return(0,$e.h)("div",{ref:l,class:"mb-6 pluggable"},[(0,$e.h)("div",{class:"flex border dark:border-dark-650 -mb-px rounded-t"},g.value),(0,$e.h)("div",{class:"p-5 border dark:border-dark-650 rounded-b-md"},b.value)])}}}),No=Ho,jo=(0,r.aZ)({name:"DocThemeSwitch",setup:function(){var e=(0,r.iH)(null),t=(0,r.Fl)((function(){return"dark"===e.value}));function n(t){document.documentElement.classList.add("no-transitions"),setTimeout((function(){document.documentElement.classList.remove("no-transitions")}),50),t?(document.documentElement.classList.add("dark"),e.value="dark"):(document.documentElement.classList.remove("dark"),e.value="light")}e.value=(0,s.qn)(St().base,localStorage,"doc_theme"),e.value||(e.value=document.documentElement.classList.contains("dark")?"dark":"light");var o,i=(0,r.iH)();return(0,r.bv)((function(){i.value=window.matchMedia("(prefers-color-scheme: dark)"),o=function(e){(0,s.qn)(St().base,localStorage,"doc_theme")||n(e.matches)},i.value.addEventListener("change",o)})),(0,r.Jd)((function(){var e;null===(e=i.value)||void 0===e||e.removeEventListener("change",o)})),{isDark:t,toggleColorMode:n,onSwitchClick:function(){n("light"===e.value),(0,s.Nh)(St().base,localStorage,"doc_theme",e.value)}}}}),Wo=(0,c.Z)(jo,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-sun"),l=(0,r.up)("doc-icon-moon"),c=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.j4)(c,{class:(0,r.C_)(["w-10 h-10",{"-mb-0.5":!e.isDark}]),"icon-size":"20",onClick:e.onSwitchClick},{default:(0,r.w5)((function(){return[e.isDark?((0,r.wg)(),(0,r.j4)(a,{key:0})):((0,r.wg)(),(0,r.j4)(l,{key:1}))]})),_:1},8,["class","onClick"])}]]);var Bo={id:"docs-toolbar",class:"sticky z-20 flex items-center justify-between h-16 px-6 bg-white border-b border-gray-200 md:h-20 md:pl-16 md:top-20 top-16 dark:bg-dark-850 dark:border-dark-650"},zo={class:"relative"},Vo={ref:"visibleLinksDiv",class:"flex whitespace-nowrap"},qo={class:"block"},$o=["innerHTML"],Uo={ref:"more",class:"mr-3 more-dropdown"},Zo={class:"flex flex-col"},Yo={class:"flex items-center h-5 px-2 text-xs font-semibold text-white bg-blue-500 dark:bg-blue-400 rounded-full md:text-2xs"};const Go=(0,r.aZ)({name:"DocToolbarMemberCount"}),Jo=(0,c.Z)(Go,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("span",Yo,[(0,r.WI)(e.$slots,"default")])}]]);var Ko=["aria-expanded","aria-disabled","disabled"],Xo={class:"absolute left-0 z-20"},Qo={ref:"dropdownBottom",class:"h-2"},ei={key:0,class:"absolute bottom-0 right-0 z-50 flex items-center h-6 px-2 mb-4 mr-8 text-xs leading-none text-center text-gray-500 bg-white rounded-full shadow-md dark:bg-dark-550 dark:text-dark-200"},ti=function(){return ti=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},ti.apply(this,arguments)};const ni=(0,r.aZ)({name:"ToolbarLinkDropdownContent",components:{DocAnchorTrigger:p},props:{groupId:{type:String,required:!0},members:{type:Array,required:!0},isSingleColumn:{type:Boolean,required:!0},linkWidth:{type:Number,required:!0}},emits:["click"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(3),i=(0,r.iH)(0),s=(0,r.Fl)((function(){return ti({maxHeight:"calc(100vh - 11rem)",minWidth:"".concat(e.linkWidth,"px")},!e.isSingleColumn&&{width:"".concat(i.value,"px")})})),a=(0,r.Fl)((function(){var t=Math.ceil(e.members.length/o.value);return{gridTemplateColumns:"repeat(".concat(o.value,", 1fr)"),gridTemplateRows:"repeat(".concat(t,", 1fr)")}})),l=tt(),c=l.enableBodyScroll,u=l.disableBodyScroll;function d(){var e=document.querySelector("#docs-content");i.value=e?e.clientWidth:0}et((function(){!function(){var e=window.innerWidth;o.value=e<1124&&e>1024||e<900?2:3}(),d()})),(0,r.bv)(d);var f=function(){var e=(0,r.iH)();return{dropdownBottom:e,isIntersecting:On(e).isIntersecting}}(),h=f.dropdownBottom,p=f.isIntersecting;return{memberGridStyles:a,mmemberGridWrapperStyles:s,enableBodyScroll:c,disableBodyScroll:u,onClick:function(){c(),n("click")},dropdownBottom:h,isIntersecting:p}}}),ri=(0,c.Z)(ni,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-anchor-trigger");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r._)("div",{ref:"gridWrapper",class:"px-2 pt-2 mt-2 overflow-y-auto bg-white border border-gray-300 rounded shadow-lg member-links-dropdown dark:bg-dark-650 dark:border-dark-500",style:(0,r.j5)(e.mmemberGridWrapperStyles),onMouseenter:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.disableBodyScroll&&e.disableBodyScroll.apply(e,t)}),onMouseleave:t[2]||(t[2]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.enableBodyScroll&&e.enableBodyScroll.apply(e,t)})},[(0,r._)("div",{class:(0,r.C_)({"sm:grid grid-flow-col":!e.isSingleColumn}),style:(0,r.j5)(e.memberGridStyles)},[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.members,(function(n){return(0,r.wg)(),(0,r.j4)(a,{key:n.id,to:"#".concat(n.id),onClick:t[0]||(t[0]=function(t){return e.onClick()})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.name),1)]})),_:2},1032,["to"])})),128))],6),(0,r._)("div",Qo,null,512)],36),e.isIntersecting?(0,r.kq)("",!0):((0,r.wg)(),(0,r.iD)("span",ei," More... "))])}],["__scopeId","data-v-ca01e68c"]]),oi=(0,r.aZ)({name:"DocToolbarLinkDropdown",components:{DocToolbarMemberCount:Jo,DocToolbarLinkDropdownContent:ri},props:{value:Boolean,inDropdown:Boolean,isSingleColumn:Boolean,disabled:Boolean,groupId:String,count:Number,members:Array,linkWidth:Number},emits:["update:modelValue"],setup:function(e,t){var n=t.emit,o=(0,r.iH)(),i=(0,r.iH)(!1);return(0,st.w)((function(e){var t,n=e.target;o.value===n||(null===(t=o.value)||void 0===t?void 0:t.contains(n))||(i.value=!1)})),(0,r.YP)(i,(function(e){n("update:modelValue",e)})),{dropdown:o,toggleDropdown:function(){i.value=!i.value},onBodyClick:st.w,isOpen:i}}}),ii=(0,c.Z)(oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-chevron-down"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-toolbar-member-count"),u=(0,r.up)("doc-toolbar-link-dropdown-content");return(0,r.wg)(),(0,r.iD)("div",{ref:"dropdown",class:(0,r.C_)({hidden:e.inDropdown})},[(0,r._)("button",{class:(0,r.C_)(["relative z-20 flex items-center justify-center w-6 h-full px-0 border-l border-white rounded-r focus:outline-none focus:bg-gray-400 hover:bg-gray-300 dark:border-dark-850 dark:hover:bg-dark-450 dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isOpen,"bg-gray-200 dark:bg-dark-550":!e.isOpen}]),role:"button","aria-has-popup":"true","aria-expanded":e.isOpen,"aria-disabled":e.disabled,disabled:e.disabled,onClick:t[0]||(t[0]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.toggleDropdown&&e.toggleDropdown.apply(e,t)})},[(0,r.Wm)(l,{class:"dark:text-white",width:"13",height:"13"},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),(0,r.Wm)(c,{class:"absolute top-0 right-0 -mt-3 -mr-2"},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1})],10,Ko),(0,r.Wm)(r.uT,{"enter-active-class":"transition duration-100 ease-out","enter-from-class":"-translate-y-2 opacity-30","enter-to-class":"translate-y-0 opacity-100","leave-active-class":"transition duration-75 ease-linear","leave-from-class":"translate-y-0 opacity-100","leave-to-class":"-translate-y-2 opacity-0"},{default:(0,r.w5)((function(){return[(0,r.wy)((0,r._)("div",Xo,[(0,r.Wm)(u,{members:e.members,"is-single-column":e.isSingleColumn,"group-id":e.groupId,"link-width":e.linkWidth,onClick:t[1]||(t[1]=function(t){return e.isOpen=!1})},null,8,["members","is-single-column","group-id","link-width"])],512),[[r.F8,e.isOpen]])]})),_:1})],2)}]]),si=(0,r.aZ)({name:"DocToolbarLink",components:{DocToolbarLinkDropdown:ii,DocToolbarMemberCount:Jo,DocAnchorTrigger:p},props:{link:{type:Object,required:!0},inDropdown:{type:Boolean,default:!1}},setup:function(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,a.oR)().store,i=(0,r.Fl)((function(){return o.getters.getVisibleGroupMembers(e.link.id)})),s=(0,r.Fl)((function(){return i.value.length})),l=(0,r.Fl)((function(){return s.value<=12})),c=(0,r.Fl)((function(){return 0===s.value})),u=(0,r.Fl)((function(){return 0===s.value?"":"#".concat(e.link.id)})),d=(0,r.Fl)((function(){return t.value?t.value.clientWidth:0}));return{linkEl:t,linkWidth:d,isSingleColumn:l,isDropdownOpen:n,disabled:c,href:u,count:s,members:i}}}),ai=(0,c.Z)(si,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-member-count"),l=(0,r.up)("doc-anchor-trigger"),c=(0,r.up)("doc-toolbar-link-dropdown");return(0,r.wg)(),(0,r.iD)("div",{ref:"linkEl",class:(0,r.C_)(["inline-flex h-8 text-sm leading-none",{"mr-3":!e.inDropdown,relative:e.isSingleColumn}]),onKeydown:t[1]||(t[1]=(0,r.D2)((function(t){return e.isDropdownOpen=!1}),["esc"]))},[(0,r.Wm)(l,{class:(0,r.C_)(["flex items-center justify-between grow px-3 font-medium text-gray-900 focus:bg-gray-400 focus:outline-none dark:text-white dark:focus:bg-dark-450 transition-colors duration-200 ease-out",{"px-5 hover:bg-gray-200 dark:hover:bg-dark-500":e.inDropdown,"rounded-l hover:bg-gray-300 dark:hover:bg-dark-450":!e.inDropdown,"opacity-30 cursor-default pointer-events-none":e.disabled,"bg-gray-400 dark:bg-dark-450":e.isDropdownOpen,"bg-gray-200 dark:bg-dark-550":!e.isDropdownOpen&&!e.inDropdown}]),to:e.href,disabled:e.disabled},{default:(0,r.w5)((function(){return[(0,r.WI)(e.$slots,"default"),(0,r.Wm)(a,{class:(0,r.C_)({hidden:!e.inDropdown})},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(e.count),1)]})),_:1},8,["class"])]})),_:3},8,["class","to","disabled"]),(0,r.Wm)(c,{modelValue:e.isDropdownOpen,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.isDropdownOpen=t}),"in-dropdown":e.inDropdown,"is-single-column":e.isSingleColumn,disabled:e.disabled,count:e.count,members:e.members,"group-id":e.link.id,"link-width":e.linkWidth},null,8,["modelValue","in-dropdown","is-single-column","disabled","count","members","group-id","link-width"])],34)}]]);const li=(0,r.aZ)({name:"DocToolbarLinks",components:{DocToolbarLink:ai},setup:function(){var e=(0,r.iH)(),t=(0,r.iH)(0),n=function(){var e=(0,r.iH)(),t=(0,r.iH)(),n=St().toolbarLinks,o=(0,r.iH)([]),i=(0,r.iH)([]),s=(0,r.iH)([]);(0,r.bv)((function(){o.value=n.slice()}));var a=function(){var e;return null===(e=t.value)||void 0===e?void 0:e.clientWidth},l=function(){var e,t,n,c=(t=document.querySelector("#docs-toolbar"),n=window.innerWidth<960?48:88,(t?t.clientWidth-n:0)-((null===(e=document.querySelector("#docs-filters"))||void 0===e?void 0:e.clientWidth)||0));if(a()>c&&o.value.length){s.value.push(a());var u=o.value.pop();u&&i.value.unshift(u)}else if(c>s.value[s.value.length-1]){var d=i.value[0];i.value.splice(0,1),o.value.push(d),s.value.pop()}(0,r.Y3)((function(){a()>c&&o.value.length&&l()}))};return{more:e,visibleLinksDiv:t,visibleLinks:o,invisibleLinks:i,updateNavLinks:l}}(),o=n.more,i=n.visibleLinksDiv,s=n.visibleLinks,a=n.invisibleLinks,l=n.updateNavLinks,c=(0,r.Fl)((function(){return s.value.length<=1&&t.value<960?"left":"right"}));function u(){t.value=window.innerWidth}return(0,r.bv)((function(){u(),l()})),et((function(){u(),l()})),{dropdown:e,more:o,visibleLinksDiv:i,visibleLinks:s,invisibleLinks:a,dropdownAlignment:c,onClick:function(){e.value.hide()}}}}),ci=(0,c.Z)(li,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-link"),l=(0,r.up)("doc-icon-more-horizontal"),c=(0,r.up)("doc-icon-button"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",zo,[(0,r._)("div",Vo,[(0,r._)("div",qo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.visibleLinks,(function(e){return(0,r.wg)(),(0,r.j4)(a,{key:e.id,link:e,"in-dropdown":!1},{default:(0,r.w5)((function(){return[(0,r._)("span",{innerHTML:e.shortLabel?e.shortLabel:e.label},null,8,$o)]})),_:2},1032,["link"])})),128))]),(0,r.wy)((0,r._)("div",Uo,[(0,r.Wm)(u,{ref:"dropdown",class:"inline-block",align:e.dropdownAlignment},{"button-content":(0,r.w5)((function(){return[(0,r.Wm)(c,{class:"w-8 h-8 bg-gray-200 hover:bg-gray-300 dark:bg-dark-550 dark:hover:bg-dark-450",rounded:!1},{default:(0,r.w5)((function(){return[(0,r.Wm)(l)]})),_:1})]})),default:(0,r.w5)((function(){return[(0,r._)("div",Zo,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.invisibleLinks,(function(t){return(0,r.wg)(),(0,r.j4)(a,{key:t.id,link:t,"in-dropdown":!0,onClick:e.onClick},{default:(0,r.w5)((function(){return[(0,r._)("span",null,(0,r.zw)(t.label),1)]})),_:2},1032,["link","onClick"])})),128))])]})),_:1},8,["align"])],512),[[r.F8,e.invisibleLinks.length]])],512)])}]]);var ui={id:"docs-filters"},di={class:"items-center hidden lg:flex"},fi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},hi=(0,r._)("span",{class:"hidden sm:inline"},"Filters",-1),pi={class:"pt-2 pb-3"},mi={class:"px-5 pb-4 border-b dark:border-dark-500"},vi={class:"px-5 pt-4"},gi={key:0,class:"absolute top-0 right-0 w-4 h-4 -mt-2 -mr-2 bg-orange-500 border-4 border-white rounded-full dark:border-dark-850"},bi=(0,r._)("span",null,"Access",-1),yi={class:"pt-1"};const wi=(0,r.aZ)({name:"DocToolbarAccess",setup:function(){var e=(0,a.oR)().store;return{access:St().access,selected:(0,r.Fl)({get:function(){return e.state.access},set:function(t){return e.actions.updateAccess(t)}}),isDirty:(0,r.Fl)((function(){return e.getters.isAccessDirty()}))}}}),xi=(0,c.Z)(wi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-shield"),l=(0,r.up)("doc-icon"),c=(0,r.up)("doc-checkbox"),u=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",null,[(0,r.Wm)(u,{class:"hidden lg:block",align:"right","menu-width":"9rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative text-gray-900 bg-white border btn focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isDirty?((0,r.wg)(),(0,r.iD)("span",gi)):(0,r.kq)("",!0),(0,r.Wm)(l,{class:"mr-1 -ml-1",width:"14",height:"14",style:{"margin-bottom":"0"}},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1}),bi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",yi,[((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"flex px-5 hover:bg-gray-200 dark:hover:bg-dark-500"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[0]||(t[0]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])]})),_:1}),((0,r.wg)(!0),(0,r.iD)(r.HY,null,(0,r.Ko)(e.access,(function(n){return(0,r.wg)(),(0,r.iD)("div",{key:n.value,class:"py-0.5 lg:hidden"},[(0,r.Wm)(c,{modelValue:e.selected,"onUpdate:modelValue":t[1]||(t[1]=function(t){return e.selected=t}),class:"text-xs",value:n.value},{default:(0,r.w5)((function(){return[(0,r.Uk)((0,r.zw)(n.label),1)]})),_:2},1032,["modelValue","value"])])})),128))])}]]);var ki={class:"relative",style:{width:"12.4375rem"}},Si=["placeholder"];const Ei=(0,r.aZ)({name:"DocToolbarMemberFilter",setup:function(){var e=(0,a.oR)().store,t=(0,r.iH)(),n=St().toolbarFilterPlaceholder||"Filter",o=(0,r.Fl)({get:function(){return e.state.memberFilter},set:Ar()((function(t){e.actions.updateMemberFilter(t)}),400)});function i(){var e;null===(e=t.value)||void 0===e||e.select()}return(0,r.bv)((function(){var e;window.innerWidth>960&&(null===(e=t.value)||void 0===e||e.focus(),i())})),function(e){var t=Lt(),n=t.route,o=t.Router;n.value.query&&n.value.query.q&&(e.value=n.value.query.q),(0,r.YP)(e,(function(e){var t=e?{q:e}:{};n.value.query=t,o.replace(n.value)}))}(o),{input:t,query:o,placeholder:n,select:i,clear:function(){var e;o.value="",null===(e=t.value)||void 0===e||e.focus()}}}}),Ci=(0,c.Z)(Ei,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-icon-x"),l=(0,r.up)("doc-icon-button");return(0,r.wg)(),(0,r.iD)("div",ki,[(0,r.wy)((0,r._)("input",{ref:"input","onUpdate:modelValue":t[0]||(t[0]=function(t){return e.query=t}),class:"w-full h-8 px-3 leading-8 transition-colors duration-200 ease-linear bg-white border border-gray-200 rounded shadow-none md:text-sm focus:outline-none focus:border-gray-600 dark:bg-dark-550 dark:border-dark-600 dark:hover:bg-dark-450 dark:hover:border-dark-450 dark:focus:bg-dark-450 dark:focus:border-dark-450 dark:text-white placeholder-gray-400 dark:placeholder-dark-400",type:"text",placeholder:e.placeholder,onFocus:t[1]||(t[1]=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return e.select&&e.select.apply(e,t)})},null,40,Si),[[r.nr,e.query,void 0,{trim:!0}]]),e.query?((0,r.wg)(),(0,r.j4)(l,{key:0,ref:"closeBtn",class:"absolute top-0 right-0 w-6 h-6 mt-1 mr-1",onClick:e.clear},{default:(0,r.w5)((function(){return[(0,r.Wm)(a)]})),_:1},8,["onClick"])):(0,r.kq)("",!0)])}]]),_i=(0,r.aZ)({name:"DocToolbarFilters",components:{DocToolbarAccess:xi,DocToolbarMemberFilter:Ci},setup:function(){var e=(0,a.oR)().store;return{isFiltersDirty:(0,r.Fl)((function(){return e.getters.isFiltersDirty()}))}}}),Ti=(0,c.Z)(_i,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-access"),l=(0,r.up)("doc-toolbar-member-filter"),c=(0,r.up)("doc-icon-filter"),u=(0,r.up)("doc-icon"),d=(0,r.up)("doc-dropdown");return(0,r.wg)(),(0,r.iD)("div",ui,[(0,r._)("div",di,[(0,r.Wm)(a,{class:"ml-3"}),(0,r.Wm)(l,{class:"ml-3"})]),(0,r.Wm)(d,{class:"lg:hidden",align:"right","menu-width":"13rem"},{"button-content":(0,r.w5)((function(t){var n=t.isOpen,o=t.isFocused;return[(0,r._)("button",{class:(0,r.C_)(["relative inline-flex items-center justify-center w-8 h-8 p-0 text-sm font-medium leading-none text-gray-900 whitespace-nowrap bg-white border rounded cursor-pointer select-none sm:w-auto sm:px-3 focus:outline-none focus:border-gray-600 dark:border-dark-650 dark:text-white dark:hover:bg-dark-450 transition-colors duration-200 ease-out",n||o?"border-gray-600 dark:bg-dark-450":"border-gray-400 dark:bg-dark-550"])},[e.isFiltersDirty?((0,r.wg)(),(0,r.iD)("span",fi)):(0,r.kq)("",!0),(0,r.Wm)(u,{class:"mb-0 sm:mr-1",width:"14",height:"14"},{default:(0,r.w5)((function(){return[(0,r.Wm)(c)]})),_:1}),hi],2)]})),default:(0,r.w5)((function(){return[(0,r._)("div",pi,[(0,r._)("div",mi,[(0,r.Wm)(l)]),(0,r._)("div",vi,[(0,r.Wm)(a)])])]})),_:1})])}]]),Oi=(0,r.aZ)({name:"DocToolbar",components:{DocToolbarLinks:ci,DocToolbarFilters:Ti},setup:function(){return{checkState:(0,r.iH)(!0),selected:(0,r.iH)([])}}}),Li=(0,c.Z)(Oi,[["render",function(e,t,n,o,i,s){var a=(0,r.up)("doc-toolbar-links"),l=(0,r.up)("doc-toolbar-filters");return(0,r.wg)(),(0,r.iD)("div",Bo,[(0,r.Wm)(a,{class:"grow-0"}),(0,r.Wm)(l)])}]]);var Ri={key:0,class:"w-full px-4 py-3 text-center text-red-800 bg-red-100 rounded dark:bg-red-400 dark:text-white"};const Di=(0,r.aZ)({name:"DocToolbarMemberFilterNoResults",setup:function(){var e=(0,a.oR)().store,t=(0,r.Fl)((function(){return e.state.memberFilter})),n=(0,r.Fl)((function(){var t=0;return St().toolbarLinks.forEach((function(n){t+=e.getters.getVisibleGroupMembers(n.id).length})),t})),o=(0,r.Fl)((function(){return 0===n.value})),i=(0,r.Fl)((function(){return St().filterNotFoundMsg.replace("{query}",t.value)}));return{query:t,noResults:o,notFoundMsg:i}}}),Ai=(0,c.Z)(Di,[["render",function(e,t,n,o,i,s){return e.query&&e.noResults?((0,r.wg)(),(0,r.iD)("div",Ri,(0,r.zw)(e.notFoundMsg),1)):(0,r.kq)("",!0)}]]);var Ii={d:"M21 9H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1zM3 7h18c.55 0 1-.45 1-1s-.45-1-1-1H3c-.55 0-1 .45-1 1s.45 1 1 1zM21 13H3c-.55 0-1 .45-1 1s.45 1 1 1h18c.55 0 1-.45 1-1s-.45-1-1-1zM21 17H7c-.55 0-1 .45-1 1s.45 1 1 1h14c.55 0 1-.45 1-1s-.45-1-1-1z"};const Mi=(0,$e.aZ)({name:"DocIconAlignRight"}),Fi=(0,c.Z)(Mi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ii)}]]);var Pi={d:"M19 11H7.41l5.29-5.29a.996.996 0 10-1.41-1.41l-7 7a1 1 0 000 1.42l7 7a1.024 1.024 0 001.42-.01.996.996 0 000-1.41L7.41 13H19c.55 0 1-.45 1-1s-.45-1-1-1z"};const Hi=(0,$e.aZ)({name:"DocIconArrowLeft"}),Ni=(0,c.Z)(Hi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Pi)}]]);var ji={d:"M19.92 12.38a1 1 0 00-.22-1.09l-7-7a.996.996 0 10-1.41 1.41l5.3 5.3H5c-.55 0-1 .45-1 1s.45 1 1 1h11.59l-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l7-7c.09-.09.16-.21.21-.33z"};const Wi=(0,$e.aZ)({name:"DocIconArrowRight"}),Bi=(0,c.Z)(Wi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ji)}]]);var zi={d:"M19.71 11.29l-7-7a1 1 0 00-1.42 0l-7 7A.996.996 0 105.7 12.7L11 7.41V19c0 .55.45 1 1 1s1-.45 1-1V7.41l5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29c.39-.39.39-1.03 0-1.42z"};const Vi=(0,$e.aZ)({name:"DocIconArrowTop"}),qi=(0,c.Z)(Vi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",zi)}]]);var $i={d:"M21.67 6.68c-.02-.07-.03-.15-.07-.22a.967.967 0 00-.25-.28c-.24-.3-.51-.58-.85-.78l-7-4c-.93-.53-2.08-.54-3 0l-7 4c-.35.2-.62.48-.86.79-.09.08-.17.16-.24.27-.03.07-.05.14-.07.21C2.13 7.08 2 7.53 2 8v8c0 1.07.58 2.06 1.5 2.6l7 4c.32.18.66.28 1.01.34.15.09.31.15.49.15s.34-.06.49-.15c.35-.06.69-.15 1.01-.34l7-4c.92-.54 1.5-1.53 1.5-2.6V8c0-.47-.13-.91-.33-1.32zM11.5 3.14c.15-.09.33-.14.5-.14.17 0 .35.05.5.14l6.46 3.69L12 10.85 5.04 6.83l6.46-3.69zm-7 13.73c-.31-.18-.5-.52-.5-.87V8.54l7 4.05v7.99l-6.5-3.71zm15-.01L13 20.58v-7.99l7-4.05V16c0 .35-.19.69-.5.86z"};const Ui=(0,$e.aZ)({name:"DocIconBox"}),Zi=(0,c.Z)(Ui,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",$i)}]]);var Yi={d:"M9 18.5c-.38 0-.77-.15-1.06-.44l-5-5a1.49 1.49 0 010-2.12 1.49 1.49 0 012.12 0L9 14.88l9.94-9.94a1.49 1.49 0 012.12 0c.59.59.59 1.54 0 2.12l-11 11c-.29.29-.68.44-1.06.44z"};const Gi=(0,$e.aZ)({name:"DocIconCheck"}),Ji=(0,c.Z)(Gi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Yi)}]]);var Ki=[(0,r._)("path",{d:"M21 9.09c-.55 0-1 .45-1 1v.92c0 4.96-4.04 8.99-9 8.99-4.97 0-9-4.04-9-9s4.04-9 9-9c1.27 0 2.5.26 3.66.78.51.22 1.1 0 1.32-.51.23-.5 0-1.1-.51-1.32C14.06.32 12.56 0 11.01 0H11C4.94 0 0 4.93 0 10.99 0 17.06 4.93 22 10.99 22H11c6.06 0 11-4.93 11-10.99v-.92c0-.56-.45-1-1-1z"},null,-1),(0,r._)("path",{d:"M8.71 9.31a.996.996 0 10-1.41 1.41l3 3c.19.19.44.29.71.29.27 0 .52-.11.71-.29l10-10.01a.996.996 0 10-1.41-1.41L11 11.6 8.71 9.31z"},null,-1)];const Xi=(0,$e.aZ)({name:"DocIconCheckCircle"}),Qi=(0,c.Z)(Xi,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ki)}]]);var es={d:"M12 16c-.26 0-.51-.1-.71-.29l-6-6A.996.996 0 116.7 8.3l5.3 5.29 5.29-5.29a.996.996 0 111.41 1.41l-6 6c-.19.19-.44.29-.7.29z"};const ts=(0,$e.aZ)({name:"DocIconChevronDown"}),ns=(0,c.Z)(ts,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",es)}]]);var rs={d:"M15.71 11.29l-6-6A.996.996 0 108.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l6-6c.39-.39.39-1.03 0-1.42z"};const os=(0,$e.aZ)({name:"DocIconChevronRight"}),is=(0,c.Z)(os,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",rs)}]]);var ss={d:"M20.92 8.62a.875.875 0 00-.22-.32l-7-7A.995.995 0 0013 1H6C4.35 1 3 2.35 3 4v16c0 1.65 1.35 3 3 3h12c1.65 0 3-1.35 3-3V9c0-.13-.03-.26-.08-.38zM14 4.41L17.59 8H14V4.41zM18 21H6c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h6v6c0 .55.45 1 1 1h6v10c0 .55-.45 1-1 1z"};const as=(0,$e.aZ)({name:"DocIconFile"}),ls=(0,c.Z)(as,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ss)}]]);var cs={d:"M14 22c-.15 0-.31-.04-.45-.11l-4-2A.988.988 0 019 19v-6.17L1.24 3.65a.995.995 0 01-.14-1.07c.16-.35.51-.58.9-.58h20c.39 0 .74.23.91.58s.11.77-.14 1.07L15 12.83V21a.999.999 0 01-1 1zm-3-3.62l2 1v-6.92c0-.24.08-.47.24-.65L19.84 4H4.16l6.61 7.81c.15.18.24.41.24.65v5.92z"};const us=(0,$e.aZ)({name:"DocIconFilter"}),ds=(0,c.Z)(us,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",cs)}]]);var fs=(0,r._)("path",{d:"M20 22H4c-1.65 0-3-1.35-3-3V5c0-1.65 1.35-3 3-3h5c.33 0 .65.17.83.45L11.54 5H20c1.65 0 3 1.35 3 3v11c0 1.65-1.35 3-3 3zM4 4c-.55 0-1 .45-1 1v14c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V8c0-.55-.45-1-1-1h-9c-.33 0-.65-.17-.83-.45L8.46 4H4z"},null,-1),hs=(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1);const ps=(0,$e.aZ)({name:"DocIconFolder"}),ms=(0,c.Z)(ps,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)(r.HY,null,[fs,hs],64)}]]);var vs=[(0,r._)("path",{d:"M12.01 6.01c-.55 0-1 .45-1 1V12a1 1 0 00.4.8l3 2.22a.985.985 0 001.39-.2.996.996 0 00-.21-1.4l-2.6-1.92V7.01c.02-.55-.43-1-.98-1z"},null,-1),(0,r._)("path",{d:"M12.01 1.91c-5.33 0-9.69 4.16-10.05 9.4l-.29-.26a.997.997 0 10-1.34 1.48l1.97 1.79c.19.17.43.26.67.26s.48-.09.67-.26l1.97-1.79a.997.997 0 10-1.34-1.48l-.31.28c.34-4.14 3.82-7.41 8.05-7.41 4.46 0 8.08 3.63 8.08 8.09s-3.63 8.08-8.08 8.08c-2.18 0-4.22-.85-5.75-2.4a.996.996 0 10-1.42 1.4 10.02 10.02 0 007.17 2.99c5.56 0 10.08-4.52 10.08-10.08.01-5.56-4.52-10.09-10.08-10.09z"},null,-1)];const gs=(0,$e.aZ)({name:"DocIconHistory"}),bs=(0,c.Z)(gs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,vs)}]]);var ys={d:"M21.61 8.21l-9-7c-.36-.28-.87-.28-1.23 0l-9 7C2.14 8.4 2 8.69 2 9v11c0 1.65 1.35 3 3 3h14c1.65 0 3-1.35 3-3V9c0-.31-.14-.6-.39-.79zM14 21h-4v-8h4v8zm6-1c0 .55-.45 1-1 1h-3v-9c0-.55-.45-1-1-1H9c-.55 0-1 .45-1 1v9H5c-.55 0-1-.45-1-1V9.49l8-6.22 8 6.22V20z"};const ws=(0,$e.aZ)({name:"DocIconHome"}),xs=(0,c.Z)(ws,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ys)}]]);var ks=[(0,r._)("path",{d:"M12 1C5.93 1 1 5.93 1 12s4.93 11 11 11 11-4.93 11-11S18.07 1 12 1zm0 20c-4.96 0-9-4.04-9-9s4.04-9 9-9 9 4.04 9 9-4.04 9-9 9z"},null,-1),(0,r._)("path",{d:"M12 11c-.55 0-1 .45-1 1v4c0 .55.45 1 1 1s1-.45 1-1v-4c0-.55-.45-1-1-1zM12.01 7c-.56 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z"},null,-1),(0,r._)("path",{fill:"none",d:"M0 0h24v24H0z"},null,-1)];const Ss=(0,$e.aZ)({name:"DocIconInfo"}),Es=(0,c.Z)(Ss,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,ks)}]]);var Cs=[(0,r._)("path",{d:"M.55 6.89l10 5c.14.07.3.11.45.11s.31-.04.45-.11l10-5c.34-.16.55-.51.55-.89s-.21-.73-.55-.89l-10-5a.995.995 0 00-.89 0l-10 5C.21 5.27 0 5.62 0 6s.21.73.55.89zM11 2.12L18.76 6 11 9.88 3.24 6 11 2.12zM20.55 15.11L11 19.88 1.45 15.1c-.49-.25-1.09-.05-1.34.45s-.05 1.09.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1),(0,r._)("path",{d:"M20.55 10.11L11 14.88 1.45 10.1a.993.993 0 00-1.34.45.993.993 0 00.45 1.34l10 5a.956.956 0 00.89 0l10-5c.49-.25.69-.85.45-1.34-.25-.49-.85-.69-1.35-.44z"},null,-1)];const _s=(0,$e.aZ)({name:"DocIconLayers"}),Ts=(0,c.Z)(_s,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Cs)}]]);var Os=[(0,r._)("path",{d:"M21.11 2.75a5.98 5.98 0 00-8.35.01l-1.72 1.71a.996.996 0 101.41 1.41l1.71-1.7c1.56-1.5 4-1.5 5.56 0 1.59 1.53 1.63 4.07.11 5.64l-3 3c-.13.13-.28.26-.43.38a4.003 4.003 0 01-5.6-.81c-.33-.44-.96-.53-1.4-.2-.44.33-.53.96-.2 1.4a5.999 5.999 0 004.81 2.4c1.25 0 2.51-.39 3.58-1.19.23-.17.45-.36.65-.56l3.01-3.01a5.991 5.991 0 00-.14-8.48z"},null,-1),(0,r._)("path",{d:"M11.53 18.11l-1.7 1.7c-1.56 1.5-4 1.5-5.56 0-1.59-1.53-1.63-4.07-.11-5.64l3-3c.14-.14.28-.26.43-.38a3.997 3.997 0 015.6.8c.33.44.96.53 1.4.2.44-.33.53-.96.2-1.4a5.93 5.93 0 00-3.95-2.34c-1.58-.22-3.15.18-4.44 1.14-.23.17-.44.36-.65.56l-3.01 3.01c-2.3 2.38-2.23 6.19.15 8.48a5.956 5.956 0 004.16 1.69c1.5 0 3.01-.57 4.19-1.7l1.71-1.71c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0z"},null,-1)];const Ls=(0,$e.aZ)({name:"DocIconLink"}),Rs=(0,c.Z)(Ls,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Os)}]]);var Ds={d:"M2 4h20v2H2zM2 11h20v2H2zM2 18h20v2H2z"};const As=(0,$e.aZ)({name:"DocIconMenu"}),Is=(0,c.Z)(As,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ds)}]]);var Ms={d:"M19 13H5c-.55 0-1-.45-1-1s.45-1 1-1h14c.55 0 1 .45 1 1s-.45 1-1 1z"};const Fs=(0,$e.aZ)({name:"DocIconMinus"}),Ps=(0,c.Z)(Fs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Ms)}]]);var Hs=[(0,r._)("path",{d:"M11 22C4.93 22 0 17.07 0 11S4.93 0 11 0s11 4.93 11 11-4.93 11-11 11zm0-20c-4.96 0-9 4.04-9 9s4.04 9 9 9 9-4.04 9-9-4.04-9-9-9z"},null,-1),(0,r._)("path",{d:"M16.5 11c0 3.05-2.46 5.51-5.49 5.51-2.16 0-4.02-1.25-4.92-3.05-.11-.22.08-.49.32-.43 1.15.28 2.43.2 3.71-.42 1.88-.9 3.07-2.89 3.06-4.97 0-.42-.05-.83-.15-1.22-.06-.24.21-.43.43-.32 1.79.88 3.04 2.74 3.04 4.9z"},null,-1)];const Ns=(0,$e.aZ)({name:"DocIconMoon"}),js=(0,c.Z)(Ns,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Hs)}]]);var Ws=[(0,r._)("circle",{cx:"12",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"19",cy:"12",r:"2"},null,-1),(0,r._)("circle",{cx:"5",cy:"12",r:"2"},null,-1)];const Bs=(0,$e.aZ)({name:"DocIconMoreHorizontal"}),zs=(0,c.Z)(Bs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("g",null,Ws)}]]);var Vs={d:"M19 11h-6V5c0-.55-.45-1-1-1s-1 .45-1 1v6H5c-.55 0-1 .45-1 1s.45 1 1 1h6v6c0 .55.45 1 1 1s1-.45 1-1v-6h6c.55 0 1-.45 1-1s-.45-1-1-1z"};const qs=(0,$e.aZ)({name:"DocIconPlus"}),$s=(0,c.Z)(qs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Vs)}]]);var Us={d:"M21.71 20.29l-3.68-3.68A8.963 8.963 0 0020 11c0-4.96-4.04-9-9-9s-9 4.04-9 9 4.04 9 9 9c2.12 0 4.07-.74 5.61-1.97l3.68 3.68c.2.19.45.29.71.29s.51-.1.71-.29c.39-.39.39-1.03 0-1.42zM4 11c0-3.86 3.14-7 7-7s7 3.14 7 7c0 1.92-.78 3.66-2.04 4.93-.01.01-.02.01-.02.01-.01.01-.01.01-.01.02A6.98 6.98 0 0111 18c-3.86 0-7-3.14-7-7z"};const Zs=(0,$e.aZ)({name:"DocIconSearch"}),Ys=(0,c.Z)(Zs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Us)}]]);var Gs={d:"M12 23c-.15 0-.31-.04-.45-.11C11.2 22.72 3 18.54 3 12V5c0-.42.26-.79.65-.94l8-3c.23-.08.48-.08.7 0l8 3c.39.15.65.52.65.94v7c0 6.54-8.2 10.72-8.55 10.89-.14.07-.3.11-.45.11zM5 5.69V12c0 4.55 5.39 7.95 7 8.86 1.61-.92 7-4.33 7-8.86V5.69l-7-2.63-7 2.63z"};const Js=(0,$e.aZ)({name:"DocIconShield"}),Ks=(0,c.Z)(Js,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Gs)}]]);var Xs={d:"M12 6c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm0 10c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zM12 4c.55 0 1-.45 1-1V1c0-.55-.45-1-1-1s-1 .45-1 1v2c0 .55.45 1 1 1zM12 20c-.55 0-1 .45-1 1v2c0 .55.45 1 1 1s1-.45 1-1v-2c0-.55-.45-1-1-1zM4.93 6.35c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41L4.93 3.51a.996.996 0 10-1.41 1.41l1.41 1.43zM19.07 17.65a.996.996 0 10-1.41 1.41l1.42 1.42c.2.2.45.29.71.29s.51-.1.71-.29a.996.996 0 000-1.41l-1.43-1.42zM4 12c0-.55-.45-1-1-1H1c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1zM23 11h-2c-.55 0-1 .45-1 1s.45 1 1 1h2c.55 0 1-.45 1-1s-.45-1-1-1zM4.93 17.65l-1.42 1.42a.996.996 0 00.71 1.7c.26 0 .51-.1.71-.29l1.42-1.42c.39-.39.39-1.02 0-1.41s-1.03-.39-1.42 0zM18.36 6.64c.26 0 .51-.1.71-.29l1.42-1.42a.996.996 0 10-1.41-1.41l-1.42 1.42a.996.996 0 00.7 1.7z"};const Qs=(0,$e.aZ)({name:"DocIconSun"}),ea=(0,c.Z)(Qs,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",Xs)}]]);var ta={d:"M13.41 12l5.29-5.29a.996.996 0 10-1.41-1.41L12 10.59l-5.29-5.3A.996.996 0 105.3 6.7l5.29 5.3-5.29 5.29a.996.996 0 000 1.41c.19.2.44.3.7.3s.51-.1.71-.29l5.29-5.3 5.29 5.29c.2.2.45.3.71.3s.51-.1.71-.29a.996.996 0 000-1.41l-5.3-5.3z"};const na=(0,$e.aZ)({name:"DocIconX"}),ra=(0,c.Z)(na,[["render",function(e,t,n,o,i,s){return(0,r.wg)(),(0,r.iD)("path",ta)}]])},6850:(e,t,n)=>{"use strict";n.d(t,{w:()=>o});var r=n(7023);function o(e){(0,r.zX)(document.body,"click",(function(t){e(t)}))}},7023:(e,t,n)=>{"use strict";n.d(t,{zX:()=>o,Up:()=>i,BK:()=>s});var r=n(4359);function o(e,t,n){var o=function(){return e.removeEventListener(t,n)};return(0,r.bv)((function(){e&&e.addEventListener(t,n)})),(0,r.Jd)(o),o}function i(e,t,n,r,i){return o(e,t,s(n,r,i))}function s(e,t,n){var r,o=0,i=-1;return function(){++o%t==0?e():(i=o,r||(r=setTimeout((function(){var t=i>=o;o=0,i=-1,r=void 0,t&&e()}),n,null)))}}},2376:(e,t,n)=>{"use strict";n.d(t,{i:()=>o});var r=n(4359);function o(e){var t=(0,r.iH)(),n=(0,r.iH)(!1),o=(0,r.iH)(null);return{result:t,loading:n,error:o,execute:function(r,i){return s=this,a=void 0,c=function(){var s,a,l,c;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(u){switch(u.label){case 0:return u.trys.push([0,6,7,8]),n.value=!0,[4,fetch(r,i)];case 1:if(!(s=u.sent()).ok)throw new Error(s.statusText);return e?[4,e(s)]:[3,3];case 2:return l=u.sent(),[3,5];case 3:return[4,s.json()];case 4:l=u.sent(),u.label=5;case 5:return a=l,t.value=a,[3,8];case 6:return c=u.sent(),o.value=c,[3,8];case 7:return n.value=!1,[7];case 8:return[2]}}))},new((l=void 0)||(l=Promise))((function(e,t){function n(e){try{o(c.next(e))}catch(e){t(e)}}function r(e){try{o(c.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof l?o:new l((function(e){e(o)}))).then(n,r)}o((c=c.apply(s,a||[])).next())}));var s,a,l,c}}}},5701:(e,t,n)=>{"use strict";n.d(t,{Ke:()=>i,Mu:()=>s,ft:()=>a});var r=n(7648),o=n(4359),i=(0,r.MT)("retype","store"),s=Symbol("DocsIdbStore");function a(){return{idbStore:(0,o.f3)(s)}}},8816:(e,t,n)=>{"use strict";n.d(t,{xf:()=>S,v2:()=>O,Rx:()=>L});var r=n(4359),o=n(7648),i=n(1296),s=n.n(i),a=n(6184),l=n(9984),c=n.n(l);const u=()=>window.__DOCS_LUNR__;var d=n.n(u),f=n(5701),h=n(6850),p=n(5184),m=n(2626),v=n(5543),g=n(830),b=n(2376),y=n(2110),w=n(7755),x=function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function s(e){try{l(r.next(e))}catch(e){i(e)}}function a(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(s,a)}l((r=r.apply(e,t||[])).next())}))},k=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},S=Symbol("DocsSearch"),E=(0,f.ft)().idbStore,C=!1;function _(e,t){var n;return x(this,void 0,void 0,(function(){var r,o,i;return k(this,(function(s){switch(s.label){case 0:return r={map:null,index:null},e.length&&t?(r.map=function(e,t){var n=0,r=0,o=new Map,i=c().appendDocumentName?c().documentName:"";return function e(t,s,a){t.forEach((function(t){var l=a?a+" > "+t.label:t.label;t.clickable&&(s[r].forEach((function(e){var r,s,a,u=e.i||(null===(r=e.l)||void 0===r?void 0:r.toLowerCase().replace(/[\s\-.]+/g,"-"));if(u&&(e.l||(null===(s=e.p)||void 0===s?void 0:s.length))){var d=u&&"#"!==u?"#"+u:"",f="/"===t.path?"".concat(i).concat(d):!c().trailingSlash&&i&&t.path?"".concat(t.path,"/").concat(i).concat(d):"".concat(t.path).concat(i).concat(d);e.l&&o.set((++n).toString(),{path:f,text:e.l,page:l}),(null===(a=e.p)||void 0===a?void 0:a.length)&&e.p.forEach((function(t){o.set((++n).toString(),{path:f,text:t,heading:e.l,page:l})}))}})),r++),t.children&&e(t.children,s,l)}))}(e,t,""),o}(e,t),null==r.map?[3,2]:[4,(0,w.T)("lunr-js",d())]):[2,r];case 1:(o=s.sent())&&(i=[],null===(n=r.map)||void 0===n||n.forEach((function(e,t){return i.push([t,e])})),r.index=o.createIndex(i)),s.label=2;case 2:return[2,r]}}))}))}function T(){return"/"===c().base?"search":c().base+"search"}function O(){return x(this,void 0,void 0,(function(){var e;return k(this,(function(t){switch(t.label){case 0:return e=T(),[4,(0,o.IV)(e,E)];case 1:return t.sent(),C=!0,[2]}}))}))}function L(e){var t=this,n=(0,m.oR)().store,i=(0,r.iH)(null),l=(0,r.iH)(null),u=(0,r.Fl)((function(){return n.state.searchQuery})),f=(0,r.iH)([]),S=(0,r.iH)(!1),O=(0,r.iH)(!1),L=(0,r.iH)(0),R=(0,r.Fl)((function(){var t;return null===(t=e.value)||void 0===t?void 0:t.querySelector("input")}));function D(e){var t,n,r,o,s;return x(this,void 0,void 0,(function(){var a,u,h,p,m,v,g,b;return k(this,(function(y){switch(y.label){case 0:return l.value&&i.value?e?e.length>=c().search.minChars?(a=[],[4,(0,w.T)("lunr-js",d())]):[3,2]:(f.value=[],[2]):[2];case 1:for((u=y.sent())&&(h=e.toLowerCase().trim(),a=u.query(l.value,h)),p=[],m=0;m<c().search.maxResults&&a[m];m++)(v=i.value.get(a[m].ref))&&(g=A(null===(t=a[m].matchData)||void 0===t?void 0:t.metadata),b=I(null!==(n=v.text)&&void 0!==n?n:"",g),p.push({id:a[m].ref,path:null!==(r=v.path)&&void 0!==r?r:"",heading:null!==(o=v.heading)&&void 0!==o?o:"",page:null!==(s=v.page)&&void 0!==s?s:"",text:b}));f.value=p,y.label=2;case 2:return[2]}}))}))}function A(e){var t,n,r,o=[],i=e;if(i)for(var s in i){var a=null===(n=null===(t=i[s])||void 0===t?void 0:t.text)||void 0===n?void 0:n.position;if(null==a?void 0:a.length)for(var l=0;l<a.length;++l)2===(null===(r=a[l])||void 0===r?void 0:r.length)&&a[l][1]>0&&o.push([a[l][0],a[l][0]+a[l][1]])}return o}function I(e,t,n){if(void 0===n&&(n=24),!t.length){var r=e.trim().split(/\s+/).filter((function(e){return e}));return r.length>n&&(r=r.slice(0,n)).push("..."),r.join(" ")}t.sort((function(e,t){return e[0]-t[0]}));for(var o=t.length-2;o>=0;--o)t[o][1]>=t[o+1][0]&&(t[o][1]=Math.max(t[o][1],t[o+1][1]),t.splice(o+1,1));var i=[],s=0,a=-1,l=-1;for(o=0;o<t.length;++o){var c=t[o][0],u=t[o][1],d=e.slice(s,c);if(d){var f=d.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,f)}-1===a?(a=i.length,l=i.length):l=i.length,i.push(['<span class="text-blue-500 dark:text-blue-400 font-semibold">'.concat(e.slice(c,u),"</span>"),!0]),s=u}if(s<e.length){var h=e.slice(s);if(h){var p=h.trim().split(/\s+/).filter((function(e){return e})).map((function(e){return[e,!1]}));i.push.apply(i,p)}}for(var m=0,v=1+l-a,g=i.length-1;v<n;){if(a>0&&(m%2==0||l>=g))--a;else{if(!(l<g))break;++l}++m,++v}v>n&&(l-=v-n);var b=i.slice(a,l+1).map((function(e){return e[0]}));return a>0&&b.splice(0,0,"..."),l<i.length-1&&b.push("..."),b.join(" ")}(0,r.YP)(u,s()((function(e){return x(this,void 0,void 0,(function(){return k(this,(function(t){switch(t.label){case 0:return[4,D(e)];case 1:return t.sent(),e.length>=c().search.minChars||f.value.length>0?S.value=!0:(S.value=!1,L.value=0),[2]}}))}))}),50)),(0,h.w)((function(t){var n,r=t.target;e.value===r||(null===(n=e.value)||void 0===n?void 0:n.contains(r))||(O.value=!1)}));var M=(0,p.B)().scrollTo;function F(e,t){var o;if(S.value=!1,O.value=!1,L.value=0,setTimeout((function(){var e;null===(e=R.value)||void 0===e||e.blur()}),100),e){var i=P(e,t);(0,a.Vn)(i);var s=null===(o=i.split("/").pop())||void 0===o?void 0:o.substring(1);if(s&&document.getElementById(s)){if(s.split("-").length>1){var l=!1;for(var c in n.state.memberGroups){if(l)break;for(var u in n.state.memberGroups[c])if(s===u){n.state.memberGroups[c][u].isOpen=!0,l=!0;break}}}(0,r.Y3)((function(){M("#".concat(s),{offset:v.vE,onDone:function(){n.actions.updateScrolledElementId(s)}})}))}}}function P(e,t){return t=null!=t?t:(0,g.Rs)(),e.startsWith("#")?(0,g.wE)(t)+e:t+e}function H(){var t,n=null===(t=e.value)||void 0===t?void 0:t.querySelector("ul"),r=null==n?void 0:n.children.item(L.value);null==r||r.scrollIntoView({block:"nearest"})}var N=c().preloadSearch?(0,b.i)((function(e){return x(t,void 0,void 0,(function(){var t,n,r;return k(this,(function(o){switch(o.label){case 0:return"file:"===location.protocol.toLowerCase()?[2,void 0]:[4,e.text()];case 1:return t=o.sent(),n=t.indexOf("="),r=t.slice(n+1).trim().slice(0,-1),[2,JSON.parse(r)]}}))}))})):(0,b.i)(),j=N.execute,W=N.error,B=N.result,z=c().preloadSearch?"js":"json",V=c().cacheBustingToken&&"none"!=c().cacheBustingStrategy?"path"==c().cacheBustingStrategy?"".concat(location.origin).concat(y.uj,".").concat(c().cacheBustingToken,".").concat(z):"".concat(location.origin).concat(y.uj,".").concat(z,"?v=").concat(c().cacheBustingToken):"".concat(location.origin).concat(y.uj,".").concat(z),q=(0,r.Fl)((function(){return n.state.sidebar})),$=T();(0,r.YP)(O,(function(e){e&&(function(){x(this,void 0,void 0,(function(){var e,t,n,r,s,a,u;return k(this,(function(f){switch(f.label){case 0:return[4,(0,o.U2)($,E)];case 1:return(e=f.sent())&&e.id===c().id?(i.value||(i.value=e.map),l.value?[3,3]:[4,(0,w.T)("lunr-js",d())]):[3,4];case 2:(t=f.sent())&&(n=JSON.parse(e.index),l.value=t.loadIndex(n)),f.label=3;case 3:return[3,10];case 4:return[4,(0,o.IV)($,E)];case 5:return f.sent(),r=void 0,!C&&c().preloadSearch?[3,7]:[4,j(V)];case 6:if(f.sent(),W.value)throw new Error("Error fetching search data. ".concat(W.value));r=B.value,f.label=7;case 7:return r||(r=window.__DOCS_SEARCH__),C=!1,[4,_(q.value.data,r)];case 8:return s=f.sent(),a=s.index,u=s.map,i.value=u,l.value=a,[4,(0,o.t8)($,{index:JSON.stringify(a),map:u,id:c().id},E)];case 9:f.sent(),f.label=10;case 10:return[2]}}))}))}(),H())}));var U=(0,r.qj)({input:R,isOpen:S,isFocused:O,results:f,focusIndex:L,clear:function(){var e;n.actions.updateSearchQuery(""),null===(e=R.value)||void 0===e||e.focus()},onKeydown:function(e){if(f.value.length)switch(e.code){case"ArrowDown":e.preventDefault(),L.value<f.value.length-1&&(L.value++,H());break;case"ArrowUp":e.preventDefault(),L.value>0&&(L.value--,H());break;case"Enter":e.preventDefault(),F(f.value[L.value].path);break;case"Escape":S.value=!1,n.actions.updateSearchQuery("")}},navigateToResult:F,getResultFullPath:P});return U}},5184:(e,t,n)=>{"use strict";function r(){var e={duration:500,offset:0},t=null;return{scrollTo:function(n,r){var o,i=Object.assign({},e,r),s=decodeURI(n),a=null!==(o=document.getElementById(n.startsWith("#")?s.slice(1):n))&&void 0!==o?o:document.querySelector(s);if(!a)throw new Error("Invalid target");var l="function"==typeof i.offset?i.offset():i.offset,c=a.getBoundingClientRect().top,u=window.scrollY||window.pageYOffset,d=c+u-u+l;i.onStart&&"function"==typeof i.onStart&&i.onStart(),window.requestAnimationFrame((function e(n){t||(t=n);var r=n-t,o=function(e,t,n,r){return-n*(e/=r)*(e-2)+t}(r,u,d,i.duration);window.scrollTo(0,o),r<i.duration?window.requestAnimationFrame(e):(i.onDone&&"function"==typeof i.onDone&&i.onDone(),t=null)}))}}}n.d(t,{B:()=>r})},2110:(e,t,n)=>{"use strict";n.d(t,{as:()=>s,uj:()=>a,bT:()=>l,u:()=>c});var r=n(9984),o=n.n(r),i="resources",s="".concat(o().base).concat(i,"/nav"),a="".concat(o().base).concat(i,"/js/search"),l=new Uint8Array([83,72,65,45,50,53,54]),c=new Uint8Array([82,83,65,83,83,65,45,80,75,67,83,49,45,118,49,95,53])},7755:(e,t,n)=>{"use strict";function r(e,t,n){var o=t();if(o&&o.default)n(o.default);else if(e){var i=document.getElementById(e);i&&i.addEventListener("load",(function(){return r(null,t,n)}))}}function o(e,t){return new Promise((function(n,o){try{r(e,t,(function(e){n(e)}))}catch(e){o(e)}}))}n.d(t,{b:()=>r,T:()=>o})},2626:(e,t,n)=>{"use strict";n.d(t,{$Q:()=>c,h:()=>d,oR:()=>f});var r=n(9984),o=n.n(r),i=n(4359),s=n(5543),a=n(872);(0,i.aZ)({name:"DocStoreDebug",setup:function(){var e=(0,i.iH)(!1),t=(0,i.Fl)((function(){return d.state})),n=(0,i.Fl)((function(){return{"top-0 max-w-md p-5 text-sm":e.value,"px-3 flex items-center text-xs mr-0 mb-0":!e.value}}));return{state:t,isOpen:e,classes:n,toggle:function(){e.value=!e.value}}}});var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},l.apply(this,arguments)},c=Symbol("DocsStore"),u={inherited:!0,access:o().access.map((function(e){return e.value}))},d={state:(0,i.qj)({initialPageLoad:!0,unloading:!1,inherited:u.inherited,isWindowScrolling:!1,isScrollPositionRestored:!1,memberFilter:"",scrolledElementId:"",searchQuery:"",sidebarRightHasContent:!1,sidebarScroll:0,sidebarActiveEl:void 0,sidebar:{id:"",data:[]},sidebarLookup:new Map,memberGroups:(0,a.s)(),access:u.access}),actions:{setMemberData:function(e,t,n,r){d.state.memberGroups[e][t]||(d.state.memberGroups[e][t]={isOpen:!1,isVisible:!0,animations:!0,access:"public",name:"UnknownMember"}),d.state.memberGroups[e][t][n]=r},resetMemberData:function(){Object.keys(d.state.memberGroups).forEach((function(e){d.state.memberGroups[e]={}}))},updateAccess:function(e){d.state.access=e,(0,s.Nh)(o().base,localStorage,"doc_access",e)},setInherited:function(e){d.state.inherited=e},toggleInherited:function(){d.state.inherited=!d.state.inherited,(0,s.Nh)(o().base,localStorage,"doc_inherited",d.state.inherited)},updateMemberFilter:function(e){d.state.memberFilter=e},updateScrolledElementId:function(e){d.state.scrolledElementId=e},updateSearchQuery:function(e){d.state.searchQuery=e},setSidebarData:function(e){d.state.sidebar=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",e)},setSidebarLookupData:function(e){d.state.sidebarLookup=e},setSidebarScroll:function(e){d.state.sidebarScroll=e,(0,s.Nh)(o().base,sessionStorage,"doc_sidebar_scroll",e)},setActiveSidebarEl:function(e){d.state.sidebarActiveEl=e},setWindowScrollingState:function(e){d.state.isWindowScrolling=e},updateSidebarLookupItem:function(e,t,n){e[t]=n;var r=(0,s.qn)(o().base,sessionStorage,"doc_sidebar");r&&(0,s.Nh)(o().base,sessionStorage,"doc_sidebar",l(l({},r),d.state.sidebar))}},getters:{isAccessDirty:function(){return u.access.length!==d.state.access.length},isFiltersDirty:function(){return u.access.length!==d.state.access.length||u.inherited!==d.state.inherited||""!==d.state.memberFilter},getVisibleGroupMembers:function(e){return Object.values(d.state.memberGroups[e]).filter((function(e){return!0===e.isVisible}))}}};function f(){return{store:(0,i.f3)(c)}}},872:(e,t,n)=>{"use strict";n.d(t,{s:()=>s,g:()=>a});var r=n(9984),o=n.n(r),i=n(5543);function s(){var e={};return o().toolbarLinks.forEach((function(t){e[t.id]={}})),e}function a(e){if(e.state.initialPageLoad){var t=(0,i.qn)(o().base,sessionStorage,"doc_sidebar_scroll");null!==t&&e.actions.setSidebarScroll(t);var n=(0,i.qn)(o().base,sessionStorage,"doc_sidebar");null!==n&&e.actions.setSidebarData(n);var r=(0,i.qn)(o().base,localStorage,"doc_inherited");null!==r&&e.actions.setInherited(r);var s=(0,i.qn)(o().base,localStorage,"doc_access");null!==s&&e.actions.updateAccess(s)}}},5543:(e,t,n)=>{"use strict";n.d(t,{qn:()=>o,Nh:()=>i,vE:()=>s,Sy:()=>a,am:()=>l,rw:()=>d,pI:()=>h});var r=function(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))};function o(e,t,n){var r=c(e,n),o=t.getItem(r);return o&&"null"!==o?"{"===o[0]||"["===o[0]||'"'===o[0]||"true"===o||"false"===o?JSON.parse(o):o:null}function i(e,t,n,r){var o=c(e,n),i="string"!=typeof r?JSON.stringify(r):r;t.setItem(o,i)}function s(){var e=document.getElementById("docs-site-header"),t=document.getElementById("docs-toolbar"),n=20;return n+=e?e.offsetHeight:0,-(n+=t?t.offsetHeight:0)}function a(e){var t,n,r={y:31536e3,mo:2592e3,d:86400,h:3600,m:60,s:1},o=Math.floor((Date.now()-e)/1e3);return Object.keys(r).some((function(e){return t=Math.floor(o/r[e]),n=e,t>=1})),0===t?"just now":"".concat(t).concat(n," ago")}function l(e,t,n,r,o){if(void 0===r&&(r=""),void 0===o&&(o=[]),!t||!t.length)return[];var i=[];return t.forEach((function(t){var s,a=u(e,t,n,r,o);(null===(s=a.parentNodes)||void 0===s?void 0:s.length)&&a.parentNodes.splice(-1,1),i.push(a)})),i}function c(e,t){return e&&"/"!==e?e+t:t}function u(e,t,n,o,i){void 0===o&&(o=""),void 0===i&&(i=[]);var s={};s.path=n?t.n.startsWith("/")?"".concat(t.n.slice(1),"/"):"".concat(o).concat(t.n,"/"):t.n.startsWith("/")?"".concat(t.n.slice(1)):!o||o.endsWith("/")?"".concat(o).concat(t.n):"".concat(o,"/").concat(t.n),s.parentNodes=i.length?r(r([],i,!0),[s.path],!1):[s.path];var a=t.i||t.h;return a&&e.set(s.path,s),s.clickable=!1!==t.c,s.visible=!1!==t.v,t.s&&(s.icon=t.s),t.e&&(s.emoji=t.e),t.h&&(s.hash=t.h),s.label=t.l||t.n,t.u&&(s.url=t.u),s.searchLabel=s.label.toLowerCase(),t.o&&(s.open=t.o),a&&(s.children=l(e,t.i,n,s.path,s.parentNodes)),s}function d(e,t,n,r){void 0===r&&(r=""),t&&t.length&&t.forEach((function(t){var o=n?"".concat(r).concat(t.n,"/"):!r||r.endsWith("/")?"".concat(r).concat(t.n):"".concat(r,"/").concat(t.n);if(e.get(o))d(e,t.i,n,o);else{var i=e.get(r);if(!i)throw new Error("Unexpected state. The parent node must exist at this point.");var s=u(e,t,n,r);if(i.children){var a=function(e,t){var n=0,r=e.length-1;if(r<n)return 0;for(;;){var o=Math.floor((n+r)/2),i=f(e[o].label,t.label);if(i<0){if((n=o+1)>r)return n}else{if(!(i>0))return o;if((r=o-1)<n)return o}}}(i.children,s);i.children.splice(a,0,s)}}}))}function f(e,t){if(null==t)return 1;if(null==e)return-1;var n=e.toUpperCase(),r=t.toUpperCase();return n>r?1:n<r?-1:0}function h(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}},830:(e,t,n)=>{"use strict";n.d(t,{wE:()=>a,cD:()=>l,Rs:()=>c,sy:()=>u});var r=n(9984),o=n.n(r),i=n(4884),s=n.n(i);function a(e){var t=o().appendDocumentName?o().documentName:"";if(o().trailingSlash||t)return"".concat(e).concat(t);var n=e.slice(0,-1);return o().base.length>1&&n.endsWith(".")&&(n=n.length>1?"../"+n+o().base.slice(0,-1):".."+o().base.slice(0,-1)),n}function l(e,t){var n="/"+o().documentName,r=e;if(o().appendDocumentName?r.endsWith(n)||(r=r.endsWith("/")?r+o().documentName:r+n):r.endsWith(n)&&(r=r.slice(0,-n.length)),o().useRelativePaths&&"file:"===location.protocol.toLowerCase()){var i=null!=t?t:s()();if(i){var a=r.split("/");r=a.slice(-i.level-1).join("/")}}else r.startsWith(o().base)?r=r.slice(o().base.length):o().trailingSlash||o().appendDocumentName||r!==o().base.slice(0,-1)||(r="");return r}function c(){if(!o().useRelativePaths)return o().base;var e=s()();if(!e)return o().base;var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeBaseCache||(e.relativeBaseCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeBaseCache}function u(){if(!o().useRelativePaths)return"/";var e=s()();if(!e)return"/";var t=e.level;return o().appendDocumentName||e.isRoot||(o().trailingSlash?location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")||--t:(location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/"))&&++t),e.relativeRootCache||(e.relativeRootCache=t<=0?!e.isRoot||o().trailingSlash||location.pathname.endsWith("/"+o().documentName)||location.pathname.endsWith("/")?"./":"."+o().base:"../".repeat(t)),e.relativeRootCache}},3744:(e,t)=>{"use strict";t.Z=(e,t)=>{const n=e.__vccOpts||e;for(const[e,r]of t)n[e]=r;return n}},4359:(e,t,n)=>{"use strict";n.d(t,{HY:()=>o.HY,lR:()=>o.lR,uT:()=>I,Fl:()=>o.Fl,ri:()=>Oe,j4:()=>o.j4,kq:()=>o.kq,iD:()=>o.iD,_:()=>o._,Uk:()=>o.Uk,Wm:()=>o.Wm,aZ:()=>o.aZ,h:()=>o.h,f3:()=>o.f3,Y3:()=>o.Y3,C_:()=>o.C_,j5:()=>o.j5,Jd:()=>o.Jd,bv:()=>o.bv,wg:()=>o.wg,Cn:()=>o.Cn,JJ:()=>o.JJ,dD:()=>o.dD,qj:()=>o.qj,iH:()=>o.iH,Ko:()=>o.Ko,WI:()=>o.WI,up:()=>o.up,LL:()=>o.LL,qZ:()=>o.qZ,zw:()=>o.zw,e8:()=>ie,nr:()=>oe,F8:()=>ye,YP:()=>o.YP,m0:()=>o.m0,w5:()=>o.w5,wy:()=>o.wy,D2:()=>be,iM:()=>ve});var r={};n.r(r),n.d(r,{BaseTransition:()=>o.P$,Comment:()=>o.sv,EffectScope:()=>o.Bj,Fragment:()=>o.HY,KeepAlive:()=>o.Ob,ReactiveEffect:()=>o.qq,Static:()=>o.qG,Suspense:()=>o.n4,Teleport:()=>o.lR,Text:()=>o.xv,Transition:()=>I,TransitionGroup:()=>K,VueElement:()=>_,callWithAsyncErrorHandling:()=>o.$d,callWithErrorHandling:()=>o.KU,camelize:()=>o._A,capitalize:()=>o.kC,cloneVNode:()=>o.Ho,compatUtils:()=>o.ry,computed:()=>o.Fl,createApp:()=>Oe,createBlock:()=>o.j4,createCommentVNode:()=>o.kq,createElementBlock:()=>o.iD,createElementVNode:()=>o._,createHydrationRenderer:()=>o.Eo,createPropsRestProxy:()=>o.p1,createRenderer:()=>o.Us,createSSRApp:()=>Le,createSlots:()=>o.Nv,createStaticVNode:()=>o.uE,createTextVNode:()=>o.Uk,createVNode:()=>o.Wm,customRef:()=>o.ZM,defineAsyncComponent:()=>o.RC,defineComponent:()=>o.aZ,defineCustomElement:()=>S,defineEmits:()=>o.Bz,defineExpose:()=>o.WY,defineProps:()=>o.MW,defineSSRCustomElement:()=>E,devtools:()=>o.mW,effect:()=>o.cE,effectScope:()=>o.B,getCurrentInstance:()=>o.FN,getCurrentScope:()=>o.nZ,getTransitionRawChildren:()=>o.Q6,guardReactiveProps:()=>o.F4,h:()=>o.h,handleError:()=>o.S3,hydrate:()=>Te,initCustomFormatter:()=>o.Mr,initDirectivesForSSR:()=>Ae,inject:()=>o.f3,isMemoSame:()=>o.nQ,isProxy:()=>o.X3,isReactive:()=>o.PG,isReadonly:()=>o.$y,isRef:()=>o.dq,isRuntimeOnly:()=>o.of,isShallow:()=>o.yT,isVNode:()=>o.lA,markRaw:()=>o.Xl,mergeDefaults:()=>o.u_,mergeProps:()=>o.dG,nextTick:()=>o.Y3,normalizeClass:()=>o.C_,normalizeProps:()=>o.vs,normalizeStyle:()=>o.j5,onActivated:()=>o.dl,onBeforeMount:()=>o.wF,onBeforeUnmount:()=>o.Jd,onBeforeUpdate:()=>o.Xn,onDeactivated:()=>o.se,onErrorCaptured:()=>o.d1,onMounted:()=>o.bv,onRenderTracked:()=>o.bT,onRenderTriggered:()=>o.Yq,onScopeDispose:()=>o.EB,onServerPrefetch:()=>o.vl,onUnmounted:()=>o.Ah,onUpdated:()=>o.ic,openBlock:()=>o.wg,popScopeId:()=>o.Cn,provide:()=>o.JJ,proxyRefs:()=>o.WL,pushScopeId:()=>o.dD,queuePostFlushCb:()=>o.qb,reactive:()=>o.qj,readonly:()=>o.OT,ref:()=>o.iH,registerRuntimeCompiler:()=>o.Y1,render:()=>_e,renderList:()=>o.Ko,renderSlot:()=>o.WI,resolveComponent:()=>o.up,resolveDirective:()=>o.Q2,resolveDynamicComponent:()=>o.LL,resolveFilter:()=>o.eq,resolveTransitionHooks:()=>o.U2,setBlockTracking:()=>o.qZ,setDevtoolsHook:()=>o.ec,setTransitionHooks:()=>o.nK,shallowReactive:()=>o.Um,shallowReadonly:()=>o.YS,shallowRef:()=>o.XI,ssrContextKey:()=>o.Uc,ssrUtils:()=>o.G,stop:()=>o.sT,toDisplayString:()=>o.zw,toHandlerKey:()=>o.hR,toHandlers:()=>o.mx,toRaw:()=>o.IU,toRef:()=>o.Vh,toRefs:()=>o.BK,transformVNodeArgs:()=>o.C3,triggerRef:()=>o.oR,unref:()=>o.SU,useAttrs:()=>o.l1,useCssModule:()=>T,useCssVars:()=>O,useSSRContext:()=>o.Zq,useSlots:()=>o.Rr,useTransitionState:()=>o.Y8,vModelCheckbox:()=>ie,vModelDynamic:()=>fe,vModelRadio:()=>ae,vModelSelect:()=>le,vModelText:()=>oe,vShow:()=>ye,version:()=>o.i8,warn:()=>o.ZK,watch:()=>o.YP,watchEffect:()=>o.m0,watchPostEffect:()=>o.Rh,watchSyncEffect:()=>o.yX,withAsyncContext:()=>o.mv,withCtx:()=>o.w5,withDefaults:()=>o.b9,withDirectives:()=>o.wy,withKeys:()=>be,withMemo:()=>o.MX,withModifiers:()=>ve,withScopeId:()=>o.HX});var o=n(6252),i=n(3577),s=n(2262);const a="undefined"!=typeof document?document:null,l=a&&a.createElement("template"),c={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?a.createElementNS("http://www.w3.org/2000/svg",e):a.createElement(e,n?{is:n}:void 0);return"select"===e&&r&&null!=r.multiple&&o.setAttribute("multiple",r.multiple),o},createText:e=>a.createTextNode(e),createComment:e=>a.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>a.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},cloneNode(e){const t=e.cloneNode(!0);return"_value"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,o,i){const s=n?n.previousSibling:t.lastChild;if(o&&(o===i||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),o!==i&&(o=o.nextSibling););else{l.innerHTML=r?`<svg>${e}</svg>`:e;const o=l.content;if(r){const e=o.firstChild;for(;e.firstChild;)o.appendChild(e.firstChild);o.removeChild(e)}t.insertBefore(o,n)}return[s?s.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},u=/\s*!important$/;function d(e,t,n){if((0,i.kJ)(n))n.forEach((n=>d(e,t,n)));else if(t.startsWith("--"))e.setProperty(t,n);else{const r=function(e,t){const n=h[t];if(n)return n;let r=(0,i._A)(t);if("filter"!==r&&r in e)return h[t]=r;r=(0,i.kC)(r);for(let n=0;n<f.length;n++){const o=f[n]+r;if(o in e)return h[t]=o}return t}(e,t);u.test(n)?e.setProperty((0,i.rs)(r),n.replace(u,""),"important"):e[r]=n}}const f=["Webkit","Moz","ms"],h={},p="http://www.w3.org/1999/xlink";let m=Date.now,v=!1;if("undefined"!=typeof window){m()>document.createEvent("Event").timeStamp&&(m=()=>performance.now());const e=navigator.userAgent.match(/firefox\/(\d+)/i);v=!!(e&&Number(e[1])<=53)}let g=0;const b=Promise.resolve(),y=()=>{g=0};function w(e,t,n,r){e.addEventListener(t,n,r)}const x=/(?:Once|Passive|Capture)$/,k=/^on[a-z]/;function S(e,t){const n=(0,o.aZ)(e);class r extends _{constructor(e){super(n,e,t)}}return r.def=n,r}const E=e=>S(e,Te),C="undefined"!=typeof HTMLElement?HTMLElement:class{};class _ extends C{constructor(e,t={},n){super(),this._def=e,this._props=t,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):this.attachShadow({mode:"open"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,(0,o.Y3)((()=>{this._connected||(_e(null,this.shadowRoot),this._instance=null)}))}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let e=0;e<this.attributes.length;e++)this._setAttr(this.attributes[e].name);new MutationObserver((e=>{for(const t of e)this._setAttr(t.attributeName)})).observe(this,{attributes:!0});const e=e=>{const{props:t,styles:n}=e,r=!(0,i.kJ)(t),o=t?r?Object.keys(t):t:[];let s;if(r)for(const e in this._props){const n=t[e];(n===Number||n&&n.type===Number)&&(this._props[e]=(0,i.He)(this._props[e]),(s||(s=Object.create(null)))[e]=!0)}this._numberProps=s;for(const e of Object.keys(this))"_"!==e[0]&&this._setProp(e,this[e],!0,!1);for(const e of o.map(i._A))Object.defineProperty(this,e,{get(){return this._getProp(e)},set(t){this._setProp(e,t)}});this._applyStyles(n),this._update()},t=this._def.__asyncLoader;t?t().then(e):e(this._def)}_setAttr(e){let t=this.getAttribute(e);this._numberProps&&this._numberProps[e]&&(t=(0,i.He)(t)),this._setProp((0,i._A)(e),t,!1)}_getProp(e){return this._props[e]}_setProp(e,t,n=!0,r=!0){t!==this._props[e]&&(this._props[e]=t,r&&this._instance&&this._update(),n&&(!0===t?this.setAttribute((0,i.rs)(e),""):"string"==typeof t||"number"==typeof t?this.setAttribute((0,i.rs)(e),t+""):t||this.removeAttribute((0,i.rs)(e))))}_update(){_e(this._createVNode(),this.shadowRoot)}_createVNode(){const e=(0,o.Wm)(this._def,(0,i.l7)({},this._props));return this._instance||(e.ce=e=>{this._instance=e,e.isCE=!0,e.emit=(e,...t)=>{this.dispatchEvent(new CustomEvent(e,{detail:t}))};let t=this;for(;t=t&&(t.parentNode||t.host);)if(t instanceof _){e.parent=t._instance;break}}),e}_applyStyles(e){e&&e.forEach((e=>{const t=document.createElement("style");t.textContent=e,this.shadowRoot.appendChild(t)}))}}function T(e="$style"){{const t=(0,o.FN)();if(!t)return i.kT;const n=t.type.__cssModules;if(!n)return i.kT;return n[e]||i.kT}}function O(e){const t=(0,o.FN)();if(!t)return;const n=()=>L(t.subTree,e(t.proxy));(0,o.Rh)(n),(0,o.bv)((()=>{const e=new MutationObserver(n);e.observe(t.subTree.el.parentNode,{childList:!0}),(0,o.Ah)((()=>e.disconnect()))}))}function L(e,t){if(128&e.shapeFlag){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push((()=>{L(n.activeBranch,t)}))}for(;e.component;)e=e.component.subTree;if(1&e.shapeFlag&&e.el)R(e.el,t);else if(e.type===o.HY)e.children.forEach((e=>L(e,t)));else if(e.type===o.qG){let{el:n,anchor:r}=e;for(;n&&(R(n,t),n!==r);)n=n.nextSibling}}function R(e,t){if(1===e.nodeType){const n=e.style;for(const e in t)n.setProperty(`--${e}`,t[e])}}const D="transition",A="animation",I=(e,{slots:t})=>(0,o.h)(o.P$,N(e),t);I.displayName="Transition";const M={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},F=I.props=(0,i.l7)({},o.P$.props,M),P=(e,t=[])=>{(0,i.kJ)(e)?e.forEach((e=>e(...t))):e&&e(...t)},H=e=>!!e&&((0,i.kJ)(e)?e.some((e=>e.length>1)):e.length>1);function N(e){const t={};for(const n in e)n in M||(t[n]=e[n]);if(!1===e.css)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=s,appearActiveClass:u=a,appearToClass:d=l,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:h=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=function(e){if(null==e)return null;if((0,i.Kn)(e))return[j(e.enter),j(e.leave)];{const t=j(e);return[t,t]}}(o),v=m&&m[0],g=m&&m[1],{onBeforeEnter:b,onEnter:y,onEnterCancelled:w,onLeave:x,onLeaveCancelled:k,onBeforeAppear:S=b,onAppear:E=y,onAppearCancelled:C=w}=t,_=(e,t,n)=>{B(e,t?d:l),B(e,t?u:a),n&&n()},T=(e,t)=>{B(e,p),B(e,h),t&&t()},O=e=>(t,n)=>{const o=e?E:y,i=()=>_(t,e,n);P(o,[t,i]),z((()=>{B(t,e?c:s),W(t,e?d:l),H(o)||q(t,r,v,i)}))};return(0,i.l7)(t,{onBeforeEnter(e){P(b,[e]),W(e,s),W(e,a)},onBeforeAppear(e){P(S,[e]),W(e,c),W(e,u)},onEnter:O(!1),onAppear:O(!0),onLeave(e,t){const n=()=>T(e,t);W(e,f),Y(),W(e,h),z((()=>{B(e,f),W(e,p),H(x)||q(e,r,g,n)})),P(x,[e,n])},onEnterCancelled(e){_(e,!1),P(w,[e])},onAppearCancelled(e){_(e,!0),P(C,[e])},onLeaveCancelled(e){T(e),P(k,[e])}})}function j(e){return(0,i.He)(e)}function W(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.add(t))),(e._vtc||(e._vtc=new Set)).add(t)}function B(e,t){t.split(/\s+/).forEach((t=>t&&e.classList.remove(t)));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function z(e){requestAnimationFrame((()=>{requestAnimationFrame(e)}))}let V=0;function q(e,t,n,r){const o=e._endId=++V,i=()=>{o===e._endId&&r()};if(n)return setTimeout(i,n);const{type:s,timeout:a,propCount:l}=$(e,t);if(!s)return r();const c=s+"end";let u=0;const d=()=>{e.removeEventListener(c,f),i()},f=t=>{t.target===e&&++u>=l&&d()};setTimeout((()=>{u<l&&d()}),a+1),e.addEventListener(c,f)}function $(e,t){const n=window.getComputedStyle(e),r=e=>(n[e]||"").split(", "),o=r("transitionDelay"),i=r("transitionDuration"),s=U(o,i),a=r("animationDelay"),l=r("animationDuration"),c=U(a,l);let u=null,d=0,f=0;return t===D?s>0&&(u=D,d=s,f=i.length):t===A?c>0&&(u=A,d=c,f=l.length):(d=Math.max(s,c),u=d>0?s>c?D:A:null,f=u?u===D?i.length:l.length:0),{type:u,timeout:d,propCount:f,hasTransform:u===D&&/\b(transform|all)(,|$)/.test(n.transitionProperty)}}function U(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map(((t,n)=>Z(t)+Z(e[n]))))}function Z(e){return 1e3*Number(e.slice(0,-1).replace(",","."))}function Y(){return document.body.offsetHeight}const G=new WeakMap,J=new WeakMap,K={name:"TransitionGroup",props:(0,i.l7)({},F,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=(0,o.FN)(),r=(0,o.Y8)();let i,a;return(0,o.ic)((()=>{if(!i.length)return;const t=e.moveClass||`${e.name||"v"}-move`;if(!function(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach((e=>{e.split(/\s+/).forEach((e=>e&&r.classList.remove(e)))})),n.split(/\s+/).forEach((e=>e&&r.classList.add(e))),r.style.display="none";const o=1===t.nodeType?t:t.parentNode;o.appendChild(r);const{hasTransform:i}=$(r);return o.removeChild(r),i}(i[0].el,n.vnode.el,t))return;i.forEach(X),i.forEach(Q);const r=i.filter(ee);Y(),r.forEach((e=>{const n=e.el,r=n.style;W(n,t),r.transform=r.webkitTransform=r.transitionDuration="";const o=n._moveCb=e=>{e&&e.target!==n||e&&!/transform$/.test(e.propertyName)||(n.removeEventListener("transitionend",o),n._moveCb=null,B(n,t))};n.addEventListener("transitionend",o)}))})),()=>{const l=(0,s.IU)(e),c=N(l);let u=l.tag||o.HY;i=a,a=t.default?(0,o.Q6)(t.default()):[];for(let e=0;e<a.length;e++){const t=a[e];null!=t.key&&(0,o.nK)(t,(0,o.U2)(t,c,r,n))}if(i)for(let e=0;e<i.length;e++){const t=i[e];(0,o.nK)(t,(0,o.U2)(t,c,r,n)),G.set(t,t.el.getBoundingClientRect())}return(0,o.Wm)(u,null,a)}}};function X(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function Q(e){J.set(e,e.el.getBoundingClientRect())}function ee(e){const t=G.get(e),n=J.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const t=e.el.style;return t.transform=t.webkitTransform=`translate(${r}px,${o}px)`,t.transitionDuration="0s",e}}const te=e=>{const t=e.props["onUpdate:modelValue"];return(0,i.kJ)(t)?e=>(0,i.ir)(t,e):t};function ne(e){e.target.composing=!0}function re(e){const t=e.target;t.composing&&(t.composing=!1,function(e,t){const n=document.createEvent("HTMLEvents");n.initEvent("input",!0,!0),e.dispatchEvent(n)}(t))}const oe={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e._assign=te(o);const s=r||o.props&&"number"===o.props.type;w(e,t?"change":"input",(t=>{if(t.target.composing)return;let r=e.value;n?r=r.trim():s&&(r=(0,i.He)(r)),e._assign(r)})),n&&w(e,"change",(()=>{e.value=e.value.trim()})),t||(w(e,"compositionstart",ne),w(e,"compositionend",re),w(e,"change",re))},mounted(e,{value:t}){e.value=null==t?"":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:r,number:o}},s){if(e._assign=te(s),e.composing)return;if(document.activeElement===e){if(n)return;if(r&&e.value.trim()===t)return;if((o||"number"===e.type)&&(0,i.He)(e.value)===t)return}const a=null==t?"":t;e.value!==a&&(e.value=a)}},ie={deep:!0,created(e,t,n){e._assign=te(n),w(e,"change",(()=>{const t=e._modelValue,n=ue(e),r=e.checked,o=e._assign;if((0,i.kJ)(t)){const e=(0,i.hq)(t,n),s=-1!==e;if(r&&!s)o(t.concat(n));else if(!r&&s){const n=[...t];n.splice(e,1),o(n)}}else if((0,i.DM)(t)){const e=new Set(t);r?e.add(n):e.delete(n),o(e)}else o(de(e,r))}))},mounted:se,beforeUpdate(e,t,n){e._assign=te(n),se(e,t,n)}};function se(e,{value:t,oldValue:n},r){e._modelValue=t,(0,i.kJ)(t)?e.checked=(0,i.hq)(t,r.props.value)>-1:(0,i.DM)(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=(0,i.WV)(t,de(e,!0)))}const ae={created(e,{value:t},n){e.checked=(0,i.WV)(t,n.props.value),e._assign=te(n),w(e,"change",(()=>{e._assign(ue(e))}))},beforeUpdate(e,{value:t,oldValue:n},r){e._assign=te(r),t!==n&&(e.checked=(0,i.WV)(t,r.props.value))}},le={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=(0,i.DM)(t);w(e,"change",(()=>{const t=Array.prototype.filter.call(e.options,(e=>e.selected)).map((e=>n?(0,i.He)(ue(e)):ue(e)));e._assign(e.multiple?o?new Set(t):t:t[0])})),e._assign=te(r)},mounted(e,{value:t}){ce(e,t)},beforeUpdate(e,t,n){e._assign=te(n)},updated(e,{value:t}){ce(e,t)}};function ce(e,t){const n=e.multiple;if(!n||(0,i.kJ)(t)||(0,i.DM)(t)){for(let r=0,o=e.options.length;r<o;r++){const o=e.options[r],s=ue(o);if(n)(0,i.kJ)(t)?o.selected=(0,i.hq)(t,s)>-1:o.selected=t.has(s);else if((0,i.WV)(ue(o),t))return void(e.selectedIndex!==r&&(e.selectedIndex=r))}n||-1===e.selectedIndex||(e.selectedIndex=-1)}}function ue(e){return"_value"in e?e._value:e.value}function de(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const fe={created(e,t,n){he(e,t,n,null,"created")},mounted(e,t,n){he(e,t,n,null,"mounted")},beforeUpdate(e,t,n,r){he(e,t,n,r,"beforeUpdate")},updated(e,t,n,r){he(e,t,n,r,"updated")}};function he(e,t,n,r,o){let i;switch(e.tagName){case"SELECT":i=le;break;case"TEXTAREA":i=oe;break;default:switch(n.props&&n.props.type){case"checkbox":i=ie;break;case"radio":i=ae;break;default:i=oe}}const s=i[o];s&&s(e,t,n,r)}const pe=["ctrl","shift","alt","meta"],me={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&0!==e.button,middle:e=>"button"in e&&1!==e.button,right:e=>"button"in e&&2!==e.button,exact:(e,t)=>pe.some((n=>e[`${n}Key`]&&!t.includes(n)))},ve=(e,t)=>(n,...r)=>{for(let e=0;e<t.length;e++){const r=me[t[e]];if(r&&r(n,t))return}return e(n,...r)},ge={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},be=(e,t)=>n=>{if(!("key"in n))return;const r=(0,i.rs)(n.key);return t.some((e=>e===r||ge[e]===r))?e(n):void 0},ye={beforeMount(e,{value:t},{transition:n}){e._vod="none"===e.style.display?"":e.style.display,n&&t?n.beforeEnter(e):we(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),we(e,!0),r.enter(e)):r.leave(e,(()=>{we(e,!1)})):we(e,t))},beforeUnmount(e,{value:t}){we(e,t)}};function we(e,t){e.style.display=t?e._vod:"none"}const xe=(0,i.l7)({patchProp:(e,t,n,r,s=!1,a,l,c,u)=>{"class"===t?function(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(" ")),null==t?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}(e,r,s):"style"===t?function(e,t,n){const r=e.style,o=(0,i.HD)(n);if(n&&!o){for(const e in n)d(r,e,n[e]);if(t&&!(0,i.HD)(t))for(const e in t)null==n[e]&&d(r,e,"")}else{const i=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute("style"),"_vod"in e&&(r.display=i)}}(e,n,r):(0,i.F7)(t)?(0,i.tR)(t)||function(e,t,n,r,s=null){const a=e._vei||(e._vei={}),l=a[t];if(r&&l)l.value=r;else{const[n,c]=function(e){let t;if(x.test(e)){let n;for(t={};n=e.match(x);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[(0,i.rs)(e.slice(2)),t]}(t);if(r){const l=a[t]=function(e,t){const n=e=>{const r=e.timeStamp||m();(v||r>=n.attached-1)&&(0,o.$d)(function(e,t){if((0,i.kJ)(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map((e=>t=>!t._stopped&&e&&e(t)))}return t}(e,n.value),t,5,[e])};return n.value=e,n.attached=g||(b.then(y),g=m()),n}(r,s);w(e,n,l,c)}else l&&(function(e,t,n,r){e.removeEventListener(t,n,r)}(e,n,l,c),a[t]=void 0)}}(e,t,0,r,l):("."===t[0]?(t=t.slice(1),1):"^"===t[0]?(t=t.slice(1),0):function(e,t,n,r){return r?"innerHTML"===t||"textContent"===t||!!(t in e&&k.test(t)&&(0,i.mf)(n)):"spellcheck"!==t&&"draggable"!==t&&("form"!==t&&(("list"!==t||"INPUT"!==e.tagName)&&(("type"!==t||"TEXTAREA"!==e.tagName)&&((!k.test(t)||!(0,i.HD)(n))&&t in e))))}(e,t,r,s))?function(e,t,n,r,o,s,a){if("innerHTML"===t||"textContent"===t)return r&&a(r,o,s),void(e[t]=null==n?"":n);if("value"===t&&"PROGRESS"!==e.tagName&&!e.tagName.includes("-")){e._value=n;const r=null==n?"":n;return e.value===r&&"OPTION"!==e.tagName||(e.value=r),void(null==n&&e.removeAttribute(t))}if(""===n||null==n){const r=typeof e[t];if("boolean"===r)return void(e[t]=(0,i.yA)(n));if(null==n&&"string"===r)return e[t]="",void e.removeAttribute(t);if("number"===r){try{e[t]=0}catch(e){}return void e.removeAttribute(t)}}try{e[t]=n}catch(e){}}(e,t,r,a,l,c,u):("true-value"===t?e._trueValue=r:"false-value"===t&&(e._falseValue=r),function(e,t,n,r,o){if(r&&t.startsWith("xlink:"))null==n?e.removeAttributeNS(p,t.slice(6,t.length)):e.setAttributeNS(p,t,n);else{const r=(0,i.Pq)(t);null==n||r&&!(0,i.yA)(n)?e.removeAttribute(t):e.setAttribute(t,r?"":n)}}(e,t,r,s))}},c);let ke,Se=!1;function Ee(){return ke||(ke=(0,o.Us)(xe))}function Ce(){return ke=Se?ke:(0,o.Eo)(xe),Se=!0,ke}const _e=(...e)=>{Ee().render(...e)},Te=(...e)=>{Ce().hydrate(...e)},Oe=(...e)=>{const t=Ee().createApp(...e),{mount:n}=t;return t.mount=e=>{const r=Re(e);if(!r)return;const o=t._component;(0,i.mf)(o)||o.render||o.template||(o.template=r.innerHTML),r.innerHTML="";const s=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),s},t},Le=(...e)=>{const t=Ce().createApp(...e),{mount:n}=t;return t.mount=e=>{const t=Re(e);if(t)return n(t,!0,t instanceof SVGElement)},t};function Re(e){return(0,i.HD)(e)?document.querySelector(e):e}let De=!1;const Ae=()=>{De||(De=!0,oe.getSSRProps=({value:e})=>({value:e}),ae.getSSRProps=({value:e},t)=>{if(t.props&&(0,i.WV)(t.props.value,e))return{checked:!0}},ie.getSSRProps=({value:e},t)=>{if((0,i.kJ)(e)){if(t.props&&(0,i.hq)(e,t.props.value)>-1)return{checked:!0}}else if((0,i.DM)(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}},ye.getSSRProps=({value:e})=>{if(!e)return{style:{display:"none"}}})};function Ie(e){throw e}function Me(e){}function Fe(e,t,n,r){const o=new SyntaxError(String(e));return o.code=e,o.loc=t,o}const Pe=Symbol(""),He=Symbol(""),Ne=Symbol(""),je=Symbol(""),We=Symbol(""),Be=Symbol(""),ze=Symbol(""),Ve=Symbol(""),qe=Symbol(""),$e=Symbol(""),Ue=Symbol(""),Ze=Symbol(""),Ye=Symbol(""),Ge=Symbol(""),Je=Symbol(""),Ke=Symbol(""),Xe=Symbol(""),Qe=Symbol(""),et=Symbol(""),tt=Symbol(""),nt=Symbol(""),rt=Symbol(""),ot=Symbol(""),it=Symbol(""),st=Symbol(""),at=Symbol(""),lt=Symbol(""),ct=Symbol(""),ut=Symbol(""),dt=Symbol(""),ft=Symbol(""),ht=Symbol(""),pt=Symbol(""),mt=Symbol(""),vt=Symbol(""),gt=Symbol(""),bt=Symbol(""),yt=Symbol(""),wt=Symbol(""),xt={[Pe]:"Fragment",[He]:"Teleport",[Ne]:"Suspense",[je]:"KeepAlive",[We]:"BaseTransition",[Be]:"openBlock",[ze]:"createBlock",[Ve]:"createElementBlock",[qe]:"createVNode",[$e]:"createElementVNode",[Ue]:"createCommentVNode",[Ze]:"createTextVNode",[Ye]:"createStaticVNode",[Ge]:"resolveComponent",[Je]:"resolveDynamicComponent",[Ke]:"resolveDirective",[Xe]:"resolveFilter",[Qe]:"withDirectives",[et]:"renderList",[tt]:"renderSlot",[nt]:"createSlots",[rt]:"toDisplayString",[ot]:"mergeProps",[it]:"normalizeClass",[st]:"normalizeStyle",[at]:"normalizeProps",[lt]:"guardReactiveProps",[ct]:"toHandlers",[ut]:"camelize",[dt]:"capitalize",[ft]:"toHandlerKey",[ht]:"setBlockTracking",[pt]:"pushScopeId",[mt]:"popScopeId",[vt]:"withCtx",[gt]:"unref",[bt]:"isRef",[yt]:"withMemo",[wt]:"isMemoSame"},kt={source:"",start:{line:1,column:1,offset:0},end:{line:1,column:1,offset:0}};function St(e,t,n,r,o,i,s,a=!1,l=!1,c=!1,u=kt){return e&&(a?(e.helper(Be),e.helper(Xt(e.inSSR,c))):e.helper(Kt(e.inSSR,c)),s&&e.helper(Qe)),{type:13,tag:t,props:n,children:r,patchFlag:o,dynamicProps:i,directives:s,isBlock:a,disableTracking:l,isComponent:c,loc:u}}function Et(e,t=kt){return{type:17,loc:t,elements:e}}function Ct(e,t=kt){return{type:15,loc:t,properties:e}}function _t(e,t){return{type:16,loc:kt,key:(0,i.HD)(e)?Tt(e,!0):e,value:t}}function Tt(e,t=!1,n=kt,r=0){return{type:4,loc:n,content:e,isStatic:t,constType:t?3:r}}function Ot(e,t=kt){return{type:8,loc:t,children:e}}function Lt(e,t=[],n=kt){return{type:14,loc:n,callee:e,arguments:t}}function Rt(e,t,n=!1,r=!1,o=kt){return{type:18,params:e,returns:t,newline:n,isSlot:r,loc:o}}function Dt(e,t,n,r=!0){return{type:19,test:e,consequent:t,alternate:n,newline:r,loc:kt}}const At=e=>4===e.type&&e.isStatic,It=(e,t)=>e===t||e===(0,i.rs)(t);function Mt(e){return It(e,"Teleport")?He:It(e,"Suspense")?Ne:It(e,"KeepAlive")?je:It(e,"BaseTransition")?We:void 0}const Ft=/^\d|[^\$\w]/,Pt=e=>!Ft.test(e),Ht=/[A-Za-z_$\xA0-\uFFFF]/,Nt=/[\.\?\w$\xA0-\uFFFF]/,jt=/\s+[.[]\s*|\s*[.[]\s+/g,Wt=e=>{e=e.trim().replace(jt,(e=>e.trim()));let t=0,n=[],r=0,o=0,i=null;for(let s=0;s<e.length;s++){const a=e.charAt(s);switch(t){case 0:if("["===a)n.push(t),t=1,r++;else if("("===a)n.push(t),t=2,o++;else if(!(0===s?Ht:Nt).test(a))return!1;break;case 1:"'"===a||'"'===a||"`"===a?(n.push(t),t=3,i=a):"["===a?r++:"]"===a&&(--r||(t=n.pop()));break;case 2:if("'"===a||'"'===a||"`"===a)n.push(t),t=3,i=a;else if("("===a)o++;else if(")"===a){if(s===e.length-1)return!1;--o||(t=n.pop())}break;case 3:a===i&&(t=n.pop(),i=null)}}return!r&&!o};function Bt(e,t,n){const r={source:e.source.slice(t,t+n),start:zt(e.start,e.source,t),end:e.end};return null!=n&&(r.end=zt(e.start,e.source,t+n)),r}function zt(e,t,n=t.length){return Vt((0,i.l7)({},e),t,n)}function Vt(e,t,n=t.length){let r=0,o=-1;for(let e=0;e<n;e++)10===t.charCodeAt(e)&&(r++,o=e);return e.offset+=n,e.line+=r,e.column=-1===o?e.column+n:n-o,e}function qt(e,t,n=!1){for(let r=0;r<e.props.length;r++){const o=e.props[r];if(7===o.type&&(n||o.exp)&&((0,i.HD)(t)?o.name===t:t.test(o.name)))return o}}function $t(e,t,n=!1,r=!1){for(let o=0;o<e.props.length;o++){const i=e.props[o];if(6===i.type){if(n)continue;if(i.name===t&&(i.value||r))return i}else if("bind"===i.name&&(i.exp||r)&&Ut(i.arg,t))return i}}function Ut(e,t){return!(!e||!At(e)||e.content!==t)}function Zt(e){return 5===e.type||2===e.type}function Yt(e){return 7===e.type&&"slot"===e.name}function Gt(e){return 1===e.type&&3===e.tagType}function Jt(e){return 1===e.type&&2===e.tagType}function Kt(e,t){return e||t?qe:$e}function Xt(e,t){return e||t?ze:Ve}const Qt=new Set([at,lt]);function en(e,t=[]){if(e&&!(0,i.HD)(e)&&14===e.type){const n=e.callee;if(!(0,i.HD)(n)&&Qt.has(n))return en(e.arguments[0],t.concat(e))}return[e,t]}function tn(e,t,n){let r,o,s=13===e.type?e.props:e.arguments[2],a=[];if(s&&!(0,i.HD)(s)&&14===s.type){const e=en(s);s=e[0],a=e[1],o=a[a.length-1]}if(null==s||(0,i.HD)(s))r=Ct([t]);else if(14===s.type){const e=s.arguments[0];(0,i.HD)(e)||15!==e.type?s.callee===ct?r=Lt(n.helper(ot),[Ct([t]),s]):s.arguments.unshift(Ct([t])):e.properties.unshift(t),!r&&(r=s)}else if(15===s.type){let e=!1;if(4===t.key.type){const n=t.key.content;e=s.properties.some((e=>4===e.key.type&&e.key.content===n))}e||s.properties.unshift(t),r=s}else r=Lt(n.helper(ot),[Ct([t]),s]),o&&o.callee===lt&&(o=a[a.length-2]);13===e.type?o?o.arguments[0]=r:e.props=r:o?o.arguments[0]=r:e.arguments[2]=r}function nn(e,t){return`_${t}_${e.replace(/[^\w]/g,((t,n)=>"-"===t?"_":e.charCodeAt(n).toString()))}`}function rn(e,{helper:t,removeHelper:n,inSSR:r}){e.isBlock||(e.isBlock=!0,n(Kt(r,e.isComponent)),t(Be),t(Xt(r,e.isComponent)))}function on(e,t){const n=t.options?t.options.compatConfig:t.compatConfig,r=n&&n[e];return"MODE"===e?r||3:r}function sn(e,t){const n=on("MODE",t),r=on(e,t);return 3===n?!0===r:!1!==r}function an(e,t,n,...r){return sn(e,t)}const ln=/&(gt|lt|amp|apos|quot);/g,cn={gt:">",lt:"<",amp:"&",apos:"'",quot:'"'},un={delimiters:["{{","}}"],getNamespace:()=>0,getTextMode:()=>0,isVoidTag:i.NO,isPreTag:i.NO,isCustomElement:i.NO,decodeEntities:e=>e.replace(ln,((e,t)=>cn[t])),onError:Ie,onWarn:Me,comments:!1};function dn(e,t,n){const r=_n(n),o=r?r.ns:0,s=[];for(;!An(e,t,n);){const a=e.source;let l;if(0===t||1===t)if(!e.inVPre&&Tn(a,e.options.delimiters[0]))l=xn(e,t);else if(0===t&&"<"===a[0])if(1===a.length)Dn(e,5,1);else if("!"===a[1])Tn(a,"\x3c!--")?l=pn(e):Tn(a,"<!DOCTYPE")?l=mn(e):Tn(a,"<![CDATA[")?0!==o?l=hn(e,n):(Dn(e,1),l=mn(e)):(Dn(e,11),l=mn(e));else if("/"===a[1])if(2===a.length)Dn(e,5,2);else{if(">"===a[2]){Dn(e,14,2),On(e,3);continue}if(/[a-z]/i.test(a[2])){Dn(e,23),bn(e,1,r);continue}Dn(e,12,2),l=mn(e)}else/[a-z]/i.test(a[1])?(l=vn(e,n),sn("COMPILER_NATIVE_TEMPLATE",e)&&l&&"template"===l.tag&&!l.props.some((e=>7===e.type&&gn(e.name)))&&(l=l.children)):"?"===a[1]?(Dn(e,21,1),l=mn(e)):Dn(e,12,1);if(l||(l=kn(e,t)),(0,i.kJ)(l))for(let e=0;e<l.length;e++)fn(s,l[e]);else fn(s,l)}let a=!1;if(2!==t&&1!==t){const t="preserve"!==e.options.whitespace;for(let n=0;n<s.length;n++){const r=s[n];if(e.inPre||2!==r.type)3!==r.type||e.options.comments||(a=!0,s[n]=null);else if(/[^\t\r\n\f ]/.test(r.content))t&&(r.content=r.content.replace(/[\t\r\n\f ]+/g," "));else{const e=s[n-1],o=s[n+1];!e||!o||t&&(3===e.type||3===o.type||1===e.type&&1===o.type&&/[\r\n]/.test(r.content))?(a=!0,s[n]=null):r.content=" "}}if(e.inPre&&r&&e.options.isPreTag(r.tag)){const e=s[0];e&&2===e.type&&(e.content=e.content.replace(/^\r?\n/,""))}}return a?s.filter(Boolean):s}function fn(e,t){if(2===t.type){const n=_n(e);if(n&&2===n.type&&n.loc.end.offset===t.loc.start.offset)return n.content+=t.content,n.loc.end=t.loc.end,void(n.loc.source+=t.loc.source)}e.push(t)}function hn(e,t){On(e,9);const n=dn(e,3,t);return 0===e.source.length?Dn(e,6):On(e,3),n}function pn(e){const t=En(e);let n;const r=/--(\!)?>/.exec(e.source);if(r){r.index<=3&&Dn(e,0),r[1]&&Dn(e,10),n=e.source.slice(4,r.index);const t=e.source.slice(0,r.index);let o=1,i=0;for(;-1!==(i=t.indexOf("\x3c!--",o));)On(e,i-o+1),i+4<t.length&&Dn(e,16),o=i+1;On(e,r.index+r[0].length-o+1)}else n=e.source.slice(4),On(e,e.source.length),Dn(e,7);return{type:3,content:n,loc:Cn(e,t)}}function mn(e){const t=En(e),n="?"===e.source[1]?1:2;let r;const o=e.source.indexOf(">");return-1===o?(r=e.source.slice(n),On(e,e.source.length)):(r=e.source.slice(n,o),On(e,o+1)),{type:3,content:r,loc:Cn(e,t)}}function vn(e,t){const n=e.inPre,r=e.inVPre,o=_n(t),i=bn(e,0,o),s=e.inPre&&!n,a=e.inVPre&&!r;if(i.isSelfClosing||e.options.isVoidTag(i.tag))return s&&(e.inPre=!1),a&&(e.inVPre=!1),i;t.push(i);const l=e.options.getTextMode(i,o),c=dn(e,l,t);t.pop();{const t=i.props.find((e=>6===e.type&&"inline-template"===e.name));if(t&&an("COMPILER_INLINE_TEMPLATE",e,t.loc)){const n=Cn(e,i.loc.end);t.value={type:2,content:n.source,loc:n}}}if(i.children=c,In(e.source,i.tag))bn(e,1,o);else if(Dn(e,24,0,i.loc.start),0===e.source.length&&"script"===i.tag.toLowerCase()){const t=c[0];t&&Tn(t.loc.source,"\x3c!--")&&Dn(e,8)}return i.loc=Cn(e,i.loc.start),s&&(e.inPre=!1),a&&(e.inVPre=!1),i}const gn=(0,i.fY)("if,else,else-if,for,slot");function bn(e,t,n){const r=En(e),o=/^<\/?([a-z][^\t\r\n\f />]*)/i.exec(e.source),s=o[1],a=e.options.getNamespace(s,n);On(e,o[0].length),Ln(e);const l=En(e),c=e.source;e.options.isPreTag(s)&&(e.inPre=!0);let u=yn(e,t);0===t&&!e.inVPre&&u.some((e=>7===e.type&&"pre"===e.name))&&(e.inVPre=!0,(0,i.l7)(e,l),e.source=c,u=yn(e,t).filter((e=>"v-pre"!==e.name)));let d=!1;if(0===e.source.length?Dn(e,9):(d=Tn(e.source,"/>"),1===t&&d&&Dn(e,4),On(e,d?2:1)),1===t)return;let f=0;return e.inVPre||("slot"===s?f=2:"template"===s?u.some((e=>7===e.type&&gn(e.name)))&&(f=3):function(e,t,n){const r=n.options;if(r.isCustomElement(e))return!1;if("component"===e||/^[A-Z]/.test(e)||Mt(e)||r.isBuiltInComponent&&r.isBuiltInComponent(e)||r.isNativeTag&&!r.isNativeTag(e))return!0;for(let e=0;e<t.length;e++){const r=t[e];if(6===r.type){if("is"===r.name&&r.value){if(r.value.content.startsWith("vue:"))return!0;if(an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}else{if("is"===r.name)return!0;if("bind"===r.name&&Ut(r.arg,"is")&&an("COMPILER_IS_ON_ELEMENT",n,r.loc))return!0}}}(s,u,e)&&(f=1)),{type:1,ns:a,tag:s,tagType:f,props:u,isSelfClosing:d,children:[],loc:Cn(e,r),codegenNode:void 0}}function yn(e,t){const n=[],r=new Set;for(;e.source.length>0&&!Tn(e.source,">")&&!Tn(e.source,"/>");){if(Tn(e.source,"/")){Dn(e,22),On(e,1),Ln(e);continue}1===t&&Dn(e,3);const o=wn(e,r);6===o.type&&o.value&&"class"===o.name&&(o.value.content=o.value.content.replace(/\s+/g," ").trim()),0===t&&n.push(o),/^[^\t\r\n\f />]/.test(e.source)&&Dn(e,15),Ln(e)}return n}function wn(e,t){const n=En(e),r=/^[^\t\r\n\f />][^\t\r\n\f />=]*/.exec(e.source)[0];t.has(r)&&Dn(e,2),t.add(r),"="===r[0]&&Dn(e,19);{const t=/["'<]/g;let n;for(;n=t.exec(r);)Dn(e,17,n.index)}let o;On(e,r.length),/^[\t\r\n\f ]*=/.test(e.source)&&(Ln(e),On(e,1),Ln(e),o=function(e){const t=En(e);let n;const r=e.source[0],o='"'===r||"'"===r;if(o){On(e,1);const t=e.source.indexOf(r);-1===t?n=Sn(e,e.source.length,4):(n=Sn(e,t,4),On(e,1))}else{const t=/^[^\t\r\n\f >]+/.exec(e.source);if(!t)return;const r=/["'<=`]/g;let o;for(;o=r.exec(t[0]);)Dn(e,18,o.index);n=Sn(e,t[0].length,4)}return{content:n,isQuoted:o,loc:Cn(e,t)}}(e),o||Dn(e,13));const i=Cn(e,n);if(!e.inVPre&&/^(v-[A-Za-z0-9-]|:|\.|@|#)/.test(r)){const t=/(?:^v-([a-z0-9-]+))?(?:(?::|^\.|^@|^#)(\[[^\]]+\]|[^\.]+))?(.+)?$/i.exec(r);let s,a=Tn(r,"."),l=t[1]||(a||Tn(r,":")?"bind":Tn(r,"@")?"on":"slot");if(t[2]){const o="slot"===l,i=r.lastIndexOf(t[2]),a=Cn(e,Rn(e,n,i),Rn(e,n,i+t[2].length+(o&&t[3]||"").length));let c=t[2],u=!0;c.startsWith("[")?(u=!1,c.endsWith("]")?c=c.slice(1,c.length-1):(Dn(e,27),c=c.slice(1))):o&&(c+=t[3]||""),s={type:4,content:c,isStatic:u,constType:u?3:0,loc:a}}if(o&&o.isQuoted){const e=o.loc;e.start.offset++,e.start.column++,e.end=zt(e.start,o.content),e.source=e.source.slice(1,-1)}const c=t[3]?t[3].slice(1).split("."):[];return a&&c.push("prop"),"bind"===l&&s&&c.includes("sync")&&an("COMPILER_V_BIND_SYNC",e,0,s.loc.source)&&(l="model",c.splice(c.indexOf("sync"),1)),{type:7,name:l,exp:o&&{type:4,content:o.content,isStatic:!1,constType:0,loc:o.loc},arg:s,modifiers:c,loc:i}}return!e.inVPre&&Tn(r,"v-")&&Dn(e,26),{type:6,name:r,value:o&&{type:2,content:o.content,loc:o.loc},loc:i}}function xn(e,t){const[n,r]=e.options.delimiters,o=e.source.indexOf(r,n.length);if(-1===o)return void Dn(e,25);const i=En(e);On(e,n.length);const s=En(e),a=En(e),l=o-n.length,c=e.source.slice(0,l),u=Sn(e,l,t),d=u.trim(),f=u.indexOf(d);return f>0&&Vt(s,c,f),Vt(a,c,l-(u.length-d.length-f)),On(e,r.length),{type:5,content:{type:4,isStatic:!1,constType:0,content:d,loc:Cn(e,s,a)},loc:Cn(e,i)}}function kn(e,t){const n=3===t?["]]>"]:["<",e.options.delimiters[0]];let r=e.source.length;for(let t=0;t<n.length;t++){const o=e.source.indexOf(n[t],1);-1!==o&&r>o&&(r=o)}const o=En(e);return{type:2,content:Sn(e,r,t),loc:Cn(e,o)}}function Sn(e,t,n){const r=e.source.slice(0,t);return On(e,t),2!==n&&3!==n&&r.includes("&")?e.options.decodeEntities(r,4===n):r}function En(e){const{column:t,line:n,offset:r}=e;return{column:t,line:n,offset:r}}function Cn(e,t,n){return{start:t,end:n=n||En(e),source:e.originalSource.slice(t.offset,n.offset)}}function _n(e){return e[e.length-1]}function Tn(e,t){return e.startsWith(t)}function On(e,t){const{source:n}=e;Vt(e,n,t),e.source=n.slice(t)}function Ln(e){const t=/^[\t\r\n\f ]+/.exec(e.source);t&&On(e,t[0].length)}function Rn(e,t,n){return zt(t,e.originalSource.slice(t.offset,n),n)}function Dn(e,t,n,r=En(e)){n&&(r.offset+=n,r.column+=n),e.options.onError(Fe(t,{start:r,end:r,source:""}))}function An(e,t,n){const r=e.source;switch(t){case 0:if(Tn(r,"</"))for(let e=n.length-1;e>=0;--e)if(In(r,n[e].tag))return!0;break;case 1:case 2:{const e=_n(n);if(e&&In(r,e.tag))return!0;break}case 3:if(Tn(r,"]]>"))return!0}return!r}function In(e,t){return Tn(e,"</")&&e.slice(2,2+t.length).toLowerCase()===t.toLowerCase()&&/[\t\r\n\f />]/.test(e[2+t.length]||">")}function Mn(e,t){Pn(e,t,Fn(e,e.children[0]))}function Fn(e,t){const{children:n}=e;return 1===n.length&&1===t.type&&!Jt(t)}function Pn(e,t,n=!1){const{children:r}=e,o=r.length;let s=0;for(let e=0;e<r.length;e++){const o=r[e];if(1===o.type&&0===o.tagType){const e=n?0:Hn(o,t);if(e>0){if(e>=2){o.codegenNode.patchFlag="-1",o.codegenNode=t.hoist(o.codegenNode),s++;continue}}else{const e=o.codegenNode;if(13===e.type){const n=zn(e);if((!n||512===n||1===n)&&Wn(o,t)>=2){const n=Bn(o);n&&(e.props=t.hoist(n))}e.dynamicProps&&(e.dynamicProps=t.hoist(e.dynamicProps))}}}else 12===o.type&&Hn(o.content,t)>=2&&(o.codegenNode=t.hoist(o.codegenNode),s++);if(1===o.type){const e=1===o.tagType;e&&t.scopes.vSlot++,Pn(o,t),e&&t.scopes.vSlot--}else if(11===o.type)Pn(o,t,1===o.children.length);else if(9===o.type)for(let e=0;e<o.branches.length;e++)Pn(o.branches[e],t,1===o.branches[e].children.length)}s&&t.transformHoist&&t.transformHoist(r,t,e),s&&s===o&&1===e.type&&0===e.tagType&&e.codegenNode&&13===e.codegenNode.type&&(0,i.kJ)(e.codegenNode.children)&&(e.codegenNode.children=t.hoist(Et(e.codegenNode.children)))}function Hn(e,t){const{constantCache:n}=t;switch(e.type){case 1:if(0!==e.tagType)return 0;const r=n.get(e);if(void 0!==r)return r;const o=e.codegenNode;if(13!==o.type)return 0;if(o.isBlock&&"svg"!==e.tag&&"foreignObject"!==e.tag)return 0;if(zn(o))return n.set(e,0),0;{let r=3;const i=Wn(e,t);if(0===i)return n.set(e,0),0;i<r&&(r=i);for(let o=0;o<e.children.length;o++){const i=Hn(e.children[o],t);if(0===i)return n.set(e,0),0;i<r&&(r=i)}if(r>1)for(let o=0;o<e.props.length;o++){const i=e.props[o];if(7===i.type&&"bind"===i.name&&i.exp){const o=Hn(i.exp,t);if(0===o)return n.set(e,0),0;o<r&&(r=o)}}return o.isBlock&&(t.removeHelper(Be),t.removeHelper(Xt(t.inSSR,o.isComponent)),o.isBlock=!1,t.helper(Kt(t.inSSR,o.isComponent))),n.set(e,r),r}case 2:case 3:return 3;case 9:case 11:case 10:default:return 0;case 5:case 12:return Hn(e.content,t);case 4:return e.constType;case 8:let s=3;for(let n=0;n<e.children.length;n++){const r=e.children[n];if((0,i.HD)(r)||(0,i.yk)(r))continue;const o=Hn(r,t);if(0===o)return 0;o<s&&(s=o)}return s}}const Nn=new Set([it,st,at,lt]);function jn(e,t){if(14===e.type&&!(0,i.HD)(e.callee)&&Nn.has(e.callee)){const n=e.arguments[0];if(4===n.type)return Hn(n,t);if(14===n.type)return jn(n,t)}return 0}function Wn(e,t){let n=3;const r=Bn(e);if(r&&15===r.type){const{properties:e}=r;for(let r=0;r<e.length;r++){const{key:o,value:i}=e[r],s=Hn(o,t);if(0===s)return s;let a;if(s<n&&(n=s),a=4===i.type?Hn(i,t):14===i.type?jn(i,t):0,0===a)return a;a<n&&(n=a)}}return n}function Bn(e){const t=e.codegenNode;if(13===t.type)return t.props}function zn(e){const t=e.patchFlag;return t?parseInt(t,10):void 0}function Vn(e,t){const n=function(e,{filename:t="",prefixIdentifiers:n=!1,hoistStatic:r=!1,cacheHandlers:o=!1,nodeTransforms:s=[],directiveTransforms:a={},transformHoist:l=null,isBuiltInComponent:c=i.dG,isCustomElement:u=i.dG,expressionPlugins:d=[],scopeId:f=null,slotted:h=!0,ssr:p=!1,inSSR:m=!1,ssrCssVars:v="",bindingMetadata:g=i.kT,inline:b=!1,isTS:y=!1,onError:w=Ie,onWarn:x=Me,compatConfig:k}){const S=t.replace(/\?.*$/,"").match(/([^/\\]+)\.\w+$/),E={selfName:S&&(0,i.kC)((0,i._A)(S[1])),prefixIdentifiers:n,hoistStatic:r,cacheHandlers:o,nodeTransforms:s,directiveTransforms:a,transformHoist:l,isBuiltInComponent:c,isCustomElement:u,expressionPlugins:d,scopeId:f,slotted:h,ssr:p,inSSR:m,ssrCssVars:v,bindingMetadata:g,inline:b,isTS:y,onError:w,onWarn:x,compatConfig:k,root:e,helpers:new Map,components:new Set,directives:new Set,hoists:[],imports:[],constantCache:new Map,temps:0,cached:0,identifiers:Object.create(null),scopes:{vFor:0,vSlot:0,vPre:0,vOnce:0},parent:null,currentNode:e,childIndex:0,inVOnce:!1,helper(e){const t=E.helpers.get(e)||0;return E.helpers.set(e,t+1),e},removeHelper(e){const t=E.helpers.get(e);if(t){const n=t-1;n?E.helpers.set(e,n):E.helpers.delete(e)}},helperString:e=>`_${xt[E.helper(e)]}`,replaceNode(e){E.parent.children[E.childIndex]=E.currentNode=e},removeNode(e){const t=E.parent.children,n=e?t.indexOf(e):E.currentNode?E.childIndex:-1;e&&e!==E.currentNode?E.childIndex>n&&(E.childIndex--,E.onNodeRemoved()):(E.currentNode=null,E.onNodeRemoved()),E.parent.children.splice(n,1)},onNodeRemoved:()=>{},addIdentifiers(e){},removeIdentifiers(e){},hoist(e){(0,i.HD)(e)&&(e=Tt(e)),E.hoists.push(e);const t=Tt(`_hoisted_${E.hoists.length}`,!1,e.loc,2);return t.hoisted=e,t},cache:(e,t=!1)=>function(e,t,n=!1){return{type:20,index:e,value:t,isVNode:n,loc:kt}}(E.cached++,e,t)};return E.filters=new Set,E}(e,t);qn(e,n),t.hoistStatic&&Mn(e,n),t.ssr||function(e,t){const{helper:n}=t,{children:r}=e;if(1===r.length){const n=r[0];if(Fn(e,n)&&n.codegenNode){const r=n.codegenNode;13===r.type&&rn(r,t),e.codegenNode=r}else e.codegenNode=n}else if(r.length>1){let r=64;i.m[64],e.codegenNode=St(t,n(Pe),void 0,e.children,r+"",void 0,void 0,!0,void 0,!1)}}(e,n),e.helpers=[...n.helpers.keys()],e.components=[...n.components],e.directives=[...n.directives],e.imports=n.imports,e.hoists=n.hoists,e.temps=n.temps,e.cached=n.cached,e.filters=[...n.filters]}function qn(e,t){t.currentNode=e;const{nodeTransforms:n}=t,r=[];for(let o=0;o<n.length;o++){const s=n[o](e,t);if(s&&((0,i.kJ)(s)?r.push(...s):r.push(s)),!t.currentNode)return;e=t.currentNode}switch(e.type){case 3:t.ssr||t.helper(Ue);break;case 5:t.ssr||t.helper(rt);break;case 9:for(let n=0;n<e.branches.length;n++)qn(e.branches[n],t);break;case 10:case 11:case 1:case 0:!function(e,t){let n=0;const r=()=>{n--};for(;n<e.children.length;n++){const o=e.children[n];(0,i.HD)(o)||(t.parent=e,t.childIndex=n,t.onNodeRemoved=r,qn(o,t))}}(e,t)}t.currentNode=e;let o=r.length;for(;o--;)r[o]()}function $n(e,t){const n=(0,i.HD)(e)?t=>t===e:t=>e.test(t);return(e,r)=>{if(1===e.type){const{props:o}=e;if(3===e.tagType&&o.some(Yt))return;const i=[];for(let s=0;s<o.length;s++){const a=o[s];if(7===a.type&&n(a.name)){o.splice(s,1),s--;const n=t(e,a,r);n&&i.push(n)}}return i}}}const Un="/*#__PURE__*/";function Zn(e,t,{helper:n,push:r,newline:o,isTS:i}){const s=n("filter"===t?Xe:"component"===t?Ge:Ke);for(let n=0;n<e.length;n++){let a=e[n];const l=a.endsWith("__self");l&&(a=a.slice(0,-6)),r(`const ${nn(a,t)} = ${s}(${JSON.stringify(a)}${l?", true":""})${i?"!":""}`),n<e.length-1&&o()}}function Yn(e,t){const n=e.length>3||!1;t.push("["),n&&t.indent(),Gn(e,t,n),n&&t.deindent(),t.push("]")}function Gn(e,t,n=!1,r=!0){const{push:o,newline:s}=t;for(let a=0;a<e.length;a++){const l=e[a];(0,i.HD)(l)?o(l):(0,i.kJ)(l)?Yn(l,t):Jn(l,t),a<e.length-1&&(n?(r&&o(","),s()):r&&o(", "))}}function Jn(e,t){if((0,i.HD)(e))t.push(e);else if((0,i.yk)(e))t.push(t.helper(e));else switch(e.type){case 1:case 9:case 11:case 12:Jn(e.codegenNode,t);break;case 2:!function(e,t){t.push(JSON.stringify(e.content),e)}(e,t);break;case 4:Kn(e,t);break;case 5:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(rt)}(`),Jn(e.content,t),n(")")}(e,t);break;case 8:Xn(e,t);break;case 3:!function(e,t){const{push:n,helper:r,pure:o}=t;o&&n(Un),n(`${r(Ue)}(${JSON.stringify(e.content)})`,e)}(e,t);break;case 13:!function(e,t){const{push:n,helper:r,pure:o}=t,{tag:i,props:s,children:a,patchFlag:l,dynamicProps:c,directives:u,isBlock:d,disableTracking:f,isComponent:h}=e;u&&n(r(Qe)+"("),d&&n(`(${r(Be)}(${f?"true":""}), `),o&&n(Un);n(r(d?Xt(t.inSSR,h):Kt(t.inSSR,h))+"(",e),Gn(function(e){let t=e.length;for(;t--&&null==e[t];);return e.slice(0,t+1).map((e=>e||"null"))}([i,s,a,l,c]),t),n(")"),d&&n(")"),u&&(n(", "),Jn(u,t),n(")"))}(e,t);break;case 14:!function(e,t){const{push:n,helper:r,pure:o}=t,s=(0,i.HD)(e.callee)?e.callee:r(e.callee);o&&n(Un),n(s+"(",e),Gn(e.arguments,t),n(")")}(e,t);break;case 15:!function(e,t){const{push:n,indent:r,deindent:o,newline:i}=t,{properties:s}=e;if(!s.length)return void n("{}",e);const a=s.length>1||!1;n(a?"{":"{ "),a&&r();for(let e=0;e<s.length;e++){const{key:r,value:o}=s[e];Qn(r,t),n(": "),Jn(o,t),e<s.length-1&&(n(","),i())}a&&o(),n(a?"}":" }")}(e,t);break;case 17:!function(e,t){Yn(e.elements,t)}(e,t);break;case 18:!function(e,t){const{push:n,indent:r,deindent:o}=t,{params:s,returns:a,body:l,newline:c,isSlot:u}=e;u&&n(`_${xt[vt]}(`),n("(",e),(0,i.kJ)(s)?Gn(s,t):s&&Jn(s,t),n(") => "),(c||l)&&(n("{"),r()),a?(c&&n("return "),(0,i.kJ)(a)?Yn(a,t):Jn(a,t)):l&&Jn(l,t),(c||l)&&(o(),n("}")),u&&(e.isNonScopedSlot&&n(", undefined, true"),n(")"))}(e,t);break;case 19:!function(e,t){const{test:n,consequent:r,alternate:o,newline:i}=e,{push:s,indent:a,deindent:l,newline:c}=t;if(4===n.type){const e=!Pt(n.content);e&&s("("),Kn(n,t),e&&s(")")}else s("("),Jn(n,t),s(")");i&&a(),t.indentLevel++,i||s(" "),s("? "),Jn(r,t),t.indentLevel--,i&&c(),i||s(" "),s(": ");const u=19===o.type;u||t.indentLevel++,Jn(o,t),u||t.indentLevel--,i&&l(!0)}(e,t);break;case 20:!function(e,t){const{push:n,helper:r,indent:o,deindent:i,newline:s}=t;n(`_cache[${e.index}] || (`),e.isVNode&&(o(),n(`${r(ht)}(-1),`),s()),n(`_cache[${e.index}] = `),Jn(e.value,t),e.isVNode&&(n(","),s(),n(`${r(ht)}(1),`),s(),n(`_cache[${e.index}]`),i()),n(")")}(e,t);break;case 21:Gn(e.body,t,!0,!1)}}function Kn(e,t){const{content:n,isStatic:r}=e;t.push(r?JSON.stringify(n):n,e)}function Xn(e,t){for(let n=0;n<e.children.length;n++){const r=e.children[n];(0,i.HD)(r)?t.push(r):Jn(r,t)}}function Qn(e,t){const{push:n}=t;8===e.type?(n("["),Xn(e,t),n("]")):e.isStatic?n(Pt(e.content)?e.content:JSON.stringify(e.content),e):n(`[${e.content}]`,e)}new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments,typeof,void".split(",").join("\\b|\\b")+"\\b");const er=$n(/^(if|else|else-if)$/,((e,t,n)=>function(e,t,n,r){if(!("else"===t.name||t.exp&&t.exp.content.trim())){const r=t.exp?t.exp.loc:e.loc;n.onError(Fe(28,t.loc)),t.exp=Tt("true",!1,r)}if("if"===t.name){const o=tr(e,t),i={type:9,loc:e.loc,branches:[o]};if(n.replaceNode(i),r)return r(i,o,!0)}else{const o=n.parent.children;let i=o.indexOf(e);for(;i-- >=-1;){const s=o[i];if(!s||2!==s.type||s.content.trim().length){if(s&&9===s.type){"else-if"===t.name&&void 0===s.branches[s.branches.length-1].condition&&n.onError(Fe(30,e.loc)),n.removeNode();const o=tr(e,t);s.branches.push(o);const i=r&&r(s,o,!1);qn(o,n),i&&i(),n.currentNode=null}else n.onError(Fe(30,e.loc));break}n.removeNode(s)}}}(e,t,n,((e,t,r)=>{const o=n.parent.children;let i=o.indexOf(e),s=0;for(;i-- >=0;){const e=o[i];e&&9===e.type&&(s+=e.branches.length)}return()=>{if(r)e.codegenNode=nr(t,s,n);else{const r=function(e){for(;;)if(19===e.type){if(19!==e.alternate.type)return e;e=e.alternate}else 20===e.type&&(e=e.value)}(e.codegenNode);r.alternate=nr(t,s+e.branches.length-1,n)}}}))));function tr(e,t){return{type:10,loc:e.loc,condition:"else"===t.name?void 0:t.exp,children:3!==e.tagType||qt(e,"for")?[e]:e.children,userKey:$t(e,"key")}}function nr(e,t,n){return e.condition?Dt(e.condition,rr(e,t,n),Lt(n.helper(Ue),['""',"true"])):rr(e,t,n)}function rr(e,t,n){const{helper:r}=n,o=_t("key",Tt(`${t}`,!1,kt,2)),{children:s}=e,a=s[0];if(1!==s.length||1!==a.type){if(1===s.length&&11===a.type){const e=a.codegenNode;return tn(e,o,n),e}{let t=64;return i.m[64],St(n,r(Pe),Ct([o]),s,t+"",void 0,void 0,!0,!1,!1,e.loc)}}{const e=a.codegenNode,t=14===(l=e).type&&l.callee===yt?l.arguments[1].returns:l;return 13===t.type&&rn(t,n),tn(t,o,n),e}var l}const or=$n("for",((e,t,n)=>{const{helper:r,removeHelper:o}=n;return function(e,t,n,r){if(!t.exp)return void n.onError(Fe(31,t.loc));const o=lr(t.exp);if(!o)return void n.onError(Fe(32,t.loc));const{addIdentifiers:i,removeIdentifiers:s,scopes:a}=n,{source:l,value:c,key:u,index:d}=o,f={type:11,loc:t.loc,source:l,valueAlias:c,keyAlias:u,objectIndexAlias:d,parseResult:o,children:Gt(e)?e.children:[e]};n.replaceNode(f),a.vFor++;const h=r&&r(f);return()=>{a.vFor--,h&&h()}}(e,t,n,(t=>{const i=Lt(r(et),[t.source]),s=Gt(e),a=qt(e,"memo"),l=$t(e,"key"),c=l&&(6===l.type?Tt(l.value.content,!0):l.exp),u=l?_t("key",c):null,d=4===t.source.type&&t.source.constType>0,f=d?64:l?128:256;return t.codegenNode=St(n,r(Pe),void 0,i,f+"",void 0,void 0,!0,!d,!1,e.loc),()=>{let l;const{children:f}=t,h=1!==f.length||1!==f[0].type,p=Jt(e)?e:s&&1===e.children.length&&Jt(e.children[0])?e.children[0]:null;if(p?(l=p.codegenNode,s&&u&&tn(l,u,n)):h?l=St(n,r(Pe),u?Ct([u]):void 0,e.children,"64",void 0,void 0,!0,void 0,!1):(l=f[0].codegenNode,s&&u&&tn(l,u,n),l.isBlock!==!d&&(l.isBlock?(o(Be),o(Xt(n.inSSR,l.isComponent))):o(Kt(n.inSSR,l.isComponent))),l.isBlock=!d,l.isBlock?(r(Be),r(Xt(n.inSSR,l.isComponent))):r(Kt(n.inSSR,l.isComponent))),a){const e=Rt(ur(t.parseResult,[Tt("_cached")]));e.body={type:21,body:[Ot(["const _memo = (",a.exp,")"]),Ot(["if (_cached",...c?[" && _cached.key === ",c]:[],` && ${n.helperString(wt)}(_cached, _memo)) return _cached`]),Ot(["const _item = ",l]),Tt("_item.memo = _memo"),Tt("return _item")],loc:kt},i.arguments.push(e,Tt("_cache"),Tt(String(n.cached++)))}else i.arguments.push(Rt(ur(t.parseResult),l,!0))}}))})),ir=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,sr=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,ar=/^\(|\)$/g;function lr(e,t){const n=e.loc,r=e.content,o=r.match(ir);if(!o)return;const[,i,s]=o,a={source:cr(n,s.trim(),r.indexOf(s,i.length)),value:void 0,key:void 0,index:void 0};let l=i.trim().replace(ar,"").trim();const c=i.indexOf(l),u=l.match(sr);if(u){l=l.replace(sr,"").trim();const e=u[1].trim();let t;if(e&&(t=r.indexOf(e,c+l.length),a.key=cr(n,e,t)),u[2]){const o=u[2].trim();o&&(a.index=cr(n,o,r.indexOf(o,a.key?t+e.length:c+l.length)))}}return l&&(a.value=cr(n,l,c)),a}function cr(e,t,n){return Tt(t,!1,Bt(e,n,t.length))}function ur({value:e,key:t,index:n},r=[]){return function(e){let t=e.length;for(;t--&&!e[t];);return e.slice(0,t+1).map(((e,t)=>e||Tt("_".repeat(t+1),!1)))}([e,t,n,...r])}const dr=Tt("undefined",!1),fr=(e,t)=>{if(1===e.type&&(1===e.tagType||3===e.tagType)){const n=qt(e,"slot");if(n)return n.exp,t.scopes.vSlot++,()=>{t.scopes.vSlot--}}},hr=(e,t,n)=>Rt(e,t,!1,!0,t.length?t[0].loc:n);function pr(e,t,n=hr){t.helper(vt);const{children:r,loc:o}=e,i=[],s=[];let a=t.scopes.vSlot>0||t.scopes.vFor>0;const l=qt(e,"slot",!0);if(l){const{arg:e,exp:t}=l;e&&!At(e)&&(a=!0),i.push(_t(e||Tt("default",!0),n(t,r,o)))}let c=!1,u=!1;const d=[],f=new Set;for(let e=0;e<r.length;e++){const o=r[e];let h;if(!Gt(o)||!(h=qt(o,"slot",!0))){3!==o.type&&d.push(o);continue}if(l){t.onError(Fe(37,h.loc));break}c=!0;const{children:p,loc:m}=o,{arg:v=Tt("default",!0),exp:g,loc:b}=h;let y;At(v)?y=v?v.content:"default":a=!0;const w=n(g,p,m);let x,k,S;if(x=qt(o,"if"))a=!0,s.push(Dt(x.exp,mr(v,w),dr));else if(k=qt(o,/^else(-if)?$/,!0)){let n,o=e;for(;o--&&(n=r[o],3===n.type););if(n&&Gt(n)&&qt(n,"if")){r.splice(e,1),e--;let t=s[s.length-1];for(;19===t.alternate.type;)t=t.alternate;t.alternate=k.exp?Dt(k.exp,mr(v,w),dr):mr(v,w)}else t.onError(Fe(30,k.loc))}else if(S=qt(o,"for")){a=!0;const e=S.parseResult||lr(S.exp);e?s.push(Lt(t.helper(et),[e.source,Rt(ur(e),mr(v,w),!0)])):t.onError(Fe(32,S.loc))}else{if(y){if(f.has(y)){t.onError(Fe(38,b));continue}f.add(y),"default"===y&&(u=!0)}i.push(_t(v,w))}}if(!l){const e=(e,r)=>{const i=n(e,r,o);return t.compatConfig&&(i.isNonScopedSlot=!0),_t("default",i)};c?d.length&&d.some((e=>gr(e)))&&(u?t.onError(Fe(39,d[0].loc)):i.push(e(void 0,d))):i.push(e(void 0,r))}const h=a?2:vr(e.children)?3:1;let p=Ct(i.concat(_t("_",Tt(h+"",!1))),o);return s.length&&(p=Lt(t.helper(nt),[p,Et(s)])),{slots:p,hasDynamicSlots:a}}function mr(e,t){return Ct([_t("name",e),_t("fn",t)])}function vr(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.type){case 1:if(2===n.tagType||vr(n.children))return!0;break;case 9:if(vr(n.branches))return!0;break;case 10:case 11:if(vr(n.children))return!0}}return!1}function gr(e){return 2!==e.type&&12!==e.type||(2===e.type?!!e.content.trim():gr(e.content))}const br=new WeakMap,yr=(e,t)=>function(){if(1!==(e=t.currentNode).type||0!==e.tagType&&1!==e.tagType)return;const{tag:n,props:r}=e,o=1===e.tagType;let s,a,l,c,u,d,f=o?function(e,t,n=!1){let{tag:r}=e;const o=Sr(r),i=$t(e,"is");if(i)if(o||sn("COMPILER_IS_ON_ELEMENT",t)){const e=6===i.type?i.value&&Tt(i.value.content,!0):i.exp;if(e)return Lt(t.helper(Je),[e])}else 6===i.type&&i.value.content.startsWith("vue:")&&(r=i.value.content.slice(4));const s=!o&&qt(e,"is");if(s&&s.exp)return Lt(t.helper(Je),[s.exp]);const a=Mt(r)||t.isBuiltInComponent(r);return a?(n||t.helper(a),a):(t.helper(Ge),t.components.add(r),nn(r,"component"))}(e,t):`"${n}"`,h=0,p=(0,i.Kn)(f)&&f.callee===Je||f===He||f===Ne||!o&&("svg"===n||"foreignObject"===n);if(r.length>0){const n=wr(e,t);s=n.props,h=n.patchFlag,u=n.dynamicPropNames;const r=n.directives;d=r&&r.length?Et(r.map((e=>function(e,t){const n=[],r=br.get(e);r?n.push(t.helperString(r)):(t.helper(Ke),t.directives.add(e.name),n.push(nn(e.name,"directive")));const{loc:o}=e;if(e.exp&&n.push(e.exp),e.arg&&(e.exp||n.push("void 0"),n.push(e.arg)),Object.keys(e.modifiers).length){e.arg||(e.exp||n.push("void 0"),n.push("void 0"));const t=Tt("true",!1,o);n.push(Ct(e.modifiers.map((e=>_t(e,t))),o))}return Et(n,e.loc)}(e,t)))):void 0,n.shouldUseBlock&&(p=!0)}if(e.children.length>0)if(f===je&&(p=!0,h|=1024),o&&f!==He&&f!==je){const{slots:n,hasDynamicSlots:r}=pr(e,t);a=n,r&&(h|=1024)}else if(1===e.children.length&&f!==He){const n=e.children[0],r=n.type,o=5===r||8===r;o&&0===Hn(n,t)&&(h|=1),a=o||2===r?n:e.children}else a=e.children;0!==h&&(l=String(h),u&&u.length&&(c=function(e){let t="[";for(let n=0,r=e.length;n<r;n++)t+=JSON.stringify(e[n]),n<r-1&&(t+=", ");return t+"]"}(u))),e.codegenNode=St(t,f,s,a,l,c,d,!!p,!1,o,e.loc)};function wr(e,t,n=e.props,r=!1){const{tag:o,loc:s,children:a}=e,l=1===e.tagType;let c=[];const u=[],d=[],f=a.length>0;let h=!1,p=0,m=!1,v=!1,g=!1,b=!1,y=!1,w=!1;const x=[],k=({key:e,value:n})=>{if(At(e)){const r=e.content,o=(0,i.F7)(r);if(l||!o||"onclick"===r.toLowerCase()||"onUpdate:modelValue"===r||(0,i.Gg)(r)||(b=!0),o&&(0,i.Gg)(r)&&(w=!0),20===n.type||(4===n.type||8===n.type)&&Hn(n,t)>0)return;"ref"===r?m=!0:"class"===r?v=!0:"style"===r?g=!0:"key"===r||x.includes(r)||x.push(r),!l||"class"!==r&&"style"!==r||x.includes(r)||x.push(r)}else y=!0};for(let a=0;a<n.length;a++){const p=n[a];if(6===p.type){const{loc:e,name:n,value:r}=p;let i=!0;if("ref"===n&&(m=!0,t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true")))),"is"===n&&(Sr(o)||r&&r.content.startsWith("vue:")||sn("COMPILER_IS_ON_ELEMENT",t)))continue;c.push(_t(Tt(n,!0,Bt(e,0,n.length)),Tt(r?r.content:"",i,r?r.loc:e)))}else{const{name:n,arg:a,exp:m,loc:v}=p,g="bind"===n,b="on"===n;if("slot"===n){l||t.onError(Fe(40,v));continue}if("once"===n||"memo"===n)continue;if("is"===n||g&&Ut(a,"is")&&(Sr(o)||sn("COMPILER_IS_ON_ELEMENT",t)))continue;if(b&&r)continue;if((g&&Ut(a,"key")||b&&f&&Ut(a,"vue:before-update"))&&(h=!0),g&&Ut(a,"ref")&&t.scopes.vFor>0&&c.push(_t(Tt("ref_for",!0),Tt("true"))),!a&&(g||b)){if(y=!0,m)if(c.length&&(u.push(Ct(xr(c),s)),c=[]),g){if(sn("COMPILER_V_BIND_OBJECT_ORDER",t)){u.unshift(m);continue}u.push(m)}else u.push({type:14,loc:v,callee:t.helper(ct),arguments:[m]});else t.onError(Fe(g?34:35,v));continue}const w=t.directiveTransforms[n];if(w){const{props:n,needRuntime:o}=w(p,e,t);!r&&n.forEach(k),c.push(...n),o&&(d.push(p),(0,i.yk)(o)&&br.set(p,o))}else(0,i.wh)(n)||(d.push(p),f&&(h=!0))}}let S;if(u.length?(c.length&&u.push(Ct(xr(c),s)),S=u.length>1?Lt(t.helper(ot),u,s):u[0]):c.length&&(S=Ct(xr(c),s)),y?p|=16:(v&&!l&&(p|=2),g&&!l&&(p|=4),x.length&&(p|=8),b&&(p|=32)),h||0!==p&&32!==p||!(m||w||d.length>0)||(p|=512),!t.inSSR&&S)switch(S.type){case 15:let e=-1,n=-1,r=!1;for(let t=0;t<S.properties.length;t++){const o=S.properties[t].key;At(o)?"class"===o.content?e=t:"style"===o.content&&(n=t):o.isHandlerKey||(r=!0)}const o=S.properties[e],i=S.properties[n];r?S=Lt(t.helper(at),[S]):(o&&!At(o.value)&&(o.value=Lt(t.helper(it),[o.value])),!i||At(i.value)||!g&&17!==i.value.type||(i.value=Lt(t.helper(st),[i.value])));break;case 14:break;default:S=Lt(t.helper(at),[Lt(t.helper(lt),[S])])}return{props:S,directives:d,patchFlag:p,dynamicPropNames:x,shouldUseBlock:h}}function xr(e){const t=new Map,n=[];for(let r=0;r<e.length;r++){const o=e[r];if(8===o.key.type||!o.key.isStatic){n.push(o);continue}const s=o.key.content,a=t.get(s);a?("style"===s||"class"===s||(0,i.F7)(s))&&kr(a,o):(t.set(s,o),n.push(o))}return n}function kr(e,t){17===e.value.type?e.value.elements.push(t.value):e.value=Et([e.value,t.value],e.loc)}function Sr(e){return"component"===e||"Component"===e}const Er=/-(\w)/g,Cr=(e=>{const t=Object.create(null);return e=>t[e]||(t[e]=(e=>e.replace(Er,((e,t)=>t?t.toUpperCase():"")))(e))})(),_r=(e,t)=>{if(Jt(e)){const{children:n,loc:r}=e,{slotName:o,slotProps:i}=function(e,t){let n,r='"default"';const o=[];for(let t=0;t<e.props.length;t++){const n=e.props[t];6===n.type?n.value&&("name"===n.name?r=JSON.stringify(n.value.content):(n.name=Cr(n.name),o.push(n))):"bind"===n.name&&Ut(n.arg,"name")?n.exp&&(r=n.exp):("bind"===n.name&&n.arg&&At(n.arg)&&(n.arg.content=Cr(n.arg.content)),o.push(n))}if(o.length>0){const{props:r,directives:i}=wr(e,t,o);n=r,i.length&&t.onError(Fe(36,i[0].loc))}return{slotName:r,slotProps:n}}(e,t),s=[t.prefixIdentifiers?"_ctx.$slots":"$slots",o,"{}","undefined","true"];let a=2;i&&(s[2]=i,a=3),n.length&&(s[3]=Rt([],n,!1,!1,r),a=4),t.scopeId&&!t.slotted&&(a=5),s.splice(a),e.codegenNode=Lt(t.helper(tt),s,r)}},Tr=/^\s*([\w$_]+|(async\s*)?\([^)]*?\))\s*=>|^\s*(async\s+)?function(?:\s+[\w$]+)?\s*\(/,Or=(e,t,n,r)=>{const{loc:o,modifiers:s,arg:a}=e;let l;if(e.exp||s.length||n.onError(Fe(35,o)),4===a.type)if(a.isStatic){let e=a.content;e.startsWith("vue:")&&(e=`vnode-${e.slice(4)}`),l=Tt((0,i.hR)((0,i._A)(e)),!0,a.loc)}else l=Ot([`${n.helperString(ft)}(`,a,")"]);else l=a,l.children.unshift(`${n.helperString(ft)}(`),l.children.push(")");let c=e.exp;c&&!c.content.trim()&&(c=void 0);let u=n.cacheHandlers&&!c&&!n.inVOnce;if(c){const e=Wt(c.content),t=!(e||Tr.test(c.content)),n=c.content.includes(";");(t||u&&e)&&(c=Ot([`${t?"$event":"(...args)"} => ${n?"{":"("}`,c,n?"}":")"]))}let d={props:[_t(l,c||Tt("() => {}",!1,o))]};return r&&(d=r(d)),u&&(d.props[0].value=n.cache(d.props[0].value)),d.props.forEach((e=>e.key.isHandlerKey=!0)),d},Lr=(e,t,n)=>{const{exp:r,modifiers:o,loc:s}=e,a=e.arg;return 4!==a.type?(a.children.unshift("("),a.children.push(') || ""')):a.isStatic||(a.content=`${a.content} || ""`),o.includes("camel")&&(4===a.type?a.isStatic?a.content=(0,i._A)(a.content):a.content=`${n.helperString(ut)}(${a.content})`:(a.children.unshift(`${n.helperString(ut)}(`),a.children.push(")"))),n.inSSR||(o.includes("prop")&&Rr(a,"."),o.includes("attr")&&Rr(a,"^")),!r||4===r.type&&!r.content.trim()?(n.onError(Fe(34,s)),{props:[_t(a,Tt("",!0,s))]}):{props:[_t(a,r)]}},Rr=(e,t)=>{4===e.type?e.isStatic?e.content=t+e.content:e.content=`\`${t}\${${e.content}}\``:(e.children.unshift(`'${t}' + (`),e.children.push(")"))},Dr=(e,t)=>{if(0===e.type||1===e.type||11===e.type||10===e.type)return()=>{const n=e.children;let r,o=!1;for(let e=0;e<n.length;e++){const t=n[e];if(Zt(t)){o=!0;for(let o=e+1;o<n.length;o++){const i=n[o];if(!Zt(i)){r=void 0;break}r||(r=n[e]={type:8,loc:t.loc,children:[t]}),r.children.push(" + ",i),n.splice(o,1),o--}}}if(o&&(1!==n.length||0!==e.type&&(1!==e.type||0!==e.tagType||e.props.find((e=>7===e.type&&!t.directiveTransforms[e.name]))||"template"===e.tag)))for(let e=0;e<n.length;e++){const r=n[e];if(Zt(r)||8===r.type){const o=[];2===r.type&&" "===r.content||o.push(r),t.ssr||0!==Hn(r,t)||o.push("1"),n[e]={type:12,content:r,loc:r.loc,codegenNode:Lt(t.helper(Ze),o)}}}}},Ar=new WeakSet,Ir=(e,t)=>{if(1===e.type&&qt(e,"once",!0)){if(Ar.has(e)||t.inVOnce)return;return Ar.add(e),t.inVOnce=!0,t.helper(ht),()=>{t.inVOnce=!1;const e=t.currentNode;e.codegenNode&&(e.codegenNode=t.cache(e.codegenNode,!0))}}},Mr=(e,t,n)=>{const{exp:r,arg:o}=e;if(!r)return n.onError(Fe(41,e.loc)),Fr();const i=r.loc.source,s=4===r.type?r.content:i;if(n.bindingMetadata[i],!s.trim()||!Wt(s))return n.onError(Fe(42,r.loc)),Fr();const a=o||Tt("modelValue",!0),l=o?At(o)?`onUpdate:${o.content}`:Ot(['"onUpdate:" + ',o]):"onUpdate:modelValue";let c;c=Ot([(n.isTS?"($event: any)":"$event")+" => ((",r,") = $event)"]);const u=[_t(a,e.exp),_t(l,c)];if(e.modifiers.length&&1===t.tagType){const t=e.modifiers.map((e=>(Pt(e)?e:JSON.stringify(e))+": true")).join(", "),n=o?At(o)?`${o.content}Modifiers`:Ot([o,' + "Modifiers"']):"modelModifiers";u.push(_t(n,Tt(`{ ${t} }`,!1,e.loc,2)))}return Fr(u)};function Fr(e=[]){return{props:e}}const Pr=/[\w).+\-_$\]]/,Hr=(e,t)=>{sn("COMPILER_FILTER",t)&&(5===e.type&&Nr(e.content,t),1===e.type&&e.props.forEach((e=>{7===e.type&&"for"!==e.name&&e.exp&&Nr(e.exp,t)})))};function Nr(e,t){if(4===e.type)jr(e,t);else for(let n=0;n<e.children.length;n++){const r=e.children[n];"object"==typeof r&&(4===r.type?jr(r,t):8===r.type?Nr(e,t):5===r.type&&Nr(r.content,t))}}function jr(e,t){const n=e.content;let r,o,i,s,a=!1,l=!1,c=!1,u=!1,d=0,f=0,h=0,p=0,m=[];for(i=0;i<n.length;i++)if(o=r,r=n.charCodeAt(i),a)39===r&&92!==o&&(a=!1);else if(l)34===r&&92!==o&&(l=!1);else if(c)96===r&&92!==o&&(c=!1);else if(u)47===r&&92!==o&&(u=!1);else if(124!==r||124===n.charCodeAt(i+1)||124===n.charCodeAt(i-1)||d||f||h){switch(r){case 34:l=!0;break;case 39:a=!0;break;case 96:c=!0;break;case 40:h++;break;case 41:h--;break;case 91:f++;break;case 93:f--;break;case 123:d++;break;case 125:d--}if(47===r){let e,t=i-1;for(;t>=0&&(e=n.charAt(t)," "===e);t--);e&&Pr.test(e)||(u=!0)}}else void 0===s?(p=i+1,s=n.slice(0,i).trim()):v();function v(){m.push(n.slice(p,i).trim()),p=i+1}if(void 0===s?s=n.slice(0,i).trim():0!==p&&v(),m.length){for(i=0;i<m.length;i++)s=Wr(s,m[i],t);e.content=s}}function Wr(e,t,n){n.helper(Xe);const r=t.indexOf("(");if(r<0)return n.filters.add(t),`${nn(t,"filter")}(${e})`;{const o=t.slice(0,r),i=t.slice(r+1);return n.filters.add(o),`${nn(o,"filter")}(${e}${")"!==i?","+i:i}`}}const Br=new WeakSet,zr=(e,t)=>{if(1===e.type){const n=qt(e,"memo");if(!n||Br.has(e))return;return Br.add(e),()=>{const r=e.codegenNode||t.currentNode.codegenNode;r&&13===r.type&&(1!==e.tagType&&rn(r,t),e.codegenNode=Lt(t.helper(yt),[n.exp,Rt(void 0,r),"_cache",String(t.cached++)]))}}};function Vr(e,t={}){const n=t.onError||Ie,r="module"===t.mode;!0===t.prefixIdentifiers?n(Fe(46)):r&&n(Fe(47)),t.cacheHandlers&&n(Fe(48)),t.scopeId&&!r&&n(Fe(49));const o=(0,i.HD)(e)?function(e,t={}){const n=function(e,t){const n=(0,i.l7)({},un);let r;for(r in t)n[r]=void 0===t[r]?un[r]:t[r];return{options:n,column:1,line:1,offset:0,originalSource:e,source:e,inPre:!1,inVPre:!1,onWarn:n.onWarn}}(e,t),r=En(n);return function(e,t=kt){return{type:0,children:e,helpers:[],components:[],directives:[],hoists:[],imports:[],cached:0,temps:0,codegenNode:void 0,loc:t}}(dn(n,0,[]),Cn(n,r))}(e,t):e,[s,a]=[[Ir,er,zr,or,Hr,_r,yr,fr,Dr],{on:Or,bind:Lr,model:Mr}];return Vn(o,(0,i.l7)({},t,{prefixIdentifiers:!1,nodeTransforms:[...s,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},a,t.directiveTransforms||{})})),function(e,t={}){const n=function(e,{mode:t="function",prefixIdentifiers:n="module"===t,sourceMap:r=!1,filename:o="template.vue.html",scopeId:i=null,optimizeImports:s=!1,runtimeGlobalName:a="Vue",runtimeModuleName:l="vue",ssrRuntimeModuleName:c="vue/server-renderer",ssr:u=!1,isTS:d=!1,inSSR:f=!1}){const h={mode:t,prefixIdentifiers:n,sourceMap:r,filename:o,scopeId:i,optimizeImports:s,runtimeGlobalName:a,runtimeModuleName:l,ssrRuntimeModuleName:c,ssr:u,isTS:d,inSSR:f,source:e.loc.source,code:"",column:1,line:1,offset:0,indentLevel:0,pure:!1,map:void 0,helper:e=>`_${xt[e]}`,push(e,t){h.code+=e},indent(){p(++h.indentLevel)},deindent(e=!1){e?--h.indentLevel:p(--h.indentLevel)},newline(){p(h.indentLevel)}};function p(e){h.push("\n"+"  ".repeat(e))}return h}(e,t);t.onContextCreated&&t.onContextCreated(n);const{mode:r,push:o,prefixIdentifiers:i,indent:s,deindent:a,newline:l,scopeId:c,ssr:u}=n,d=e.helpers.length>0,f=!i&&"module"!==r;if(function(e,t){const{ssr:n,prefixIdentifiers:r,push:o,newline:i,runtimeModuleName:s,runtimeGlobalName:a,ssrRuntimeModuleName:l}=t,c=a,u=e=>`${xt[e]}: _${xt[e]}`;e.helpers.length>0&&(o(`const _Vue = ${c}\n`),e.hoists.length)&&o(`const { ${[qe,$e,Ue,Ze,Ye].filter((t=>e.helpers.includes(t))).map(u).join(", ")} } = _Vue\n`),function(e,t){if(!e.length)return;t.pure=!0;const{push:n,newline:r,helper:o,scopeId:i,mode:s}=t;r();for(let o=0;o<e.length;o++){const i=e[o];i&&(n(`const _hoisted_${o+1} = `),Jn(i,t),r())}t.pure=!1}(e.hoists,t),i(),o("return ")}(e,n),o(`function ${u?"ssrRender":"render"}(${(u?["_ctx","_push","_parent","_attrs"]:["_ctx","_cache"]).join(", ")}) {`),s(),f&&(o("with (_ctx) {"),s(),d&&(o(`const { ${e.helpers.map((e=>`${xt[e]}: _${xt[e]}`)).join(", ")} } = _Vue`),o("\n"),l())),e.components.length&&(Zn(e.components,"component",n),(e.directives.length||e.temps>0)&&l()),e.directives.length&&(Zn(e.directives,"directive",n),e.temps>0&&l()),e.filters&&e.filters.length&&(l(),Zn(e.filters,"filter",n),l()),e.temps>0){o("let ");for(let t=0;t<e.temps;t++)o(`${t>0?", ":""}_temp${t}`)}return(e.components.length||e.directives.length||e.temps)&&(o("\n"),l()),u||o("return "),e.codegenNode?Jn(e.codegenNode,n):o("null"),f&&(a(),o("}")),a(),o("}"),{ast:e,code:n.code,preamble:"",map:n.map?n.map.toJSON():void 0}}(o,(0,i.l7)({},t,{prefixIdentifiers:!1}))}const qr=Symbol(""),$r=Symbol(""),Ur=Symbol(""),Zr=Symbol(""),Yr=Symbol(""),Gr=Symbol(""),Jr=Symbol(""),Kr=Symbol(""),Xr=Symbol(""),Qr=Symbol("");var eo;let to;eo={[qr]:"vModelRadio",[$r]:"vModelCheckbox",[Ur]:"vModelText",[Zr]:"vModelSelect",[Yr]:"vModelDynamic",[Gr]:"withModifiers",[Jr]:"withKeys",[Kr]:"vShow",[Xr]:"Transition",[Qr]:"TransitionGroup"},Object.getOwnPropertySymbols(eo).forEach((e=>{xt[e]=eo[e]}));const no=(0,i.fY)("style,iframe,script,noscript",!0),ro={isVoidTag:i.WB,isNativeTag:e=>(0,i.eS)(e)||(0,i.aN)(e),isPreTag:e=>"pre"===e,decodeEntities:function(e,t=!1){return to||(to=document.createElement("div")),t?(to.innerHTML=`<div foo="${e.replace(/"/g,"&quot;")}">`,to.children[0].getAttribute("foo")):(to.innerHTML=e,to.textContent)},isBuiltInComponent:e=>It(e,"Transition")?Xr:It(e,"TransitionGroup")?Qr:void 0,getNamespace(e,t){let n=t?t.ns:0;if(t&&2===n)if("annotation-xml"===t.tag){if("svg"===e)return 1;t.props.some((e=>6===e.type&&"encoding"===e.name&&null!=e.value&&("text/html"===e.value.content||"application/xhtml+xml"===e.value.content)))&&(n=0)}else/^m(?:[ions]|text)$/.test(t.tag)&&"mglyph"!==e&&"malignmark"!==e&&(n=0);else t&&1===n&&("foreignObject"!==t.tag&&"desc"!==t.tag&&"title"!==t.tag||(n=0));if(0===n){if("svg"===e)return 1;if("math"===e)return 2}return n},getTextMode({tag:e,ns:t}){if(0===t){if("textarea"===e||"title"===e)return 1;if(no(e))return 2}return 0}},oo=(e,t)=>{const n=(0,i.yL)(e);return Tt(JSON.stringify(n),!1,t,3)};function io(e,t){return Fe(e,t)}const so=(0,i.fY)("passive,once,capture"),ao=(0,i.fY)("stop,prevent,self,ctrl,shift,alt,meta,exact,middle"),lo=(0,i.fY)("left,right"),co=(0,i.fY)("onkeyup,onkeydown,onkeypress",!0),uo=(e,t)=>At(e)&&"onclick"===e.content.toLowerCase()?Tt(t,!0):4!==e.type?Ot(["(",e,`) === "onClick" ? "${t}" : (`,e,")"]):e,fo=(e,t)=>{1!==e.type||0!==e.tagType||"script"!==e.tag&&"style"!==e.tag||(t.onError(io(60,e.loc)),t.removeNode())},ho=[e=>{1===e.type&&e.props.forEach(((t,n)=>{6===t.type&&"style"===t.name&&t.value&&(e.props[n]={type:7,name:"bind",arg:Tt("style",!0,t.loc),exp:oo(t.value.content,t.loc),modifiers:[],loc:t.loc})}))}],po={cloak:()=>({props:[]}),html:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(50,o)),t.children.length&&(n.onError(io(51,o)),t.children.length=0),{props:[_t(Tt("innerHTML",!0,o),r||Tt("",!0))]}},text:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(52,o)),t.children.length&&(n.onError(io(53,o)),t.children.length=0),{props:[_t(Tt("textContent",!0),r?Lt(n.helperString(rt),[r],o):Tt("",!0))]}},model:(e,t,n)=>{const r=Mr(e,t,n);if(!r.props.length||1===t.tagType)return r;e.arg&&n.onError(io(55,e.arg.loc));const{tag:o}=t,i=n.isCustomElement(o);if("input"===o||"textarea"===o||"select"===o||i){let s=Ur,a=!1;if("input"===o||i){const r=$t(t,"type");if(r){if(7===r.type)s=Yr;else if(r.value)switch(r.value.content){case"radio":s=qr;break;case"checkbox":s=$r;break;case"file":a=!0,n.onError(io(56,e.loc))}}else(function(e){return e.props.some((e=>!(7!==e.type||"bind"!==e.name||e.arg&&4===e.arg.type&&e.arg.isStatic)))})(t)&&(s=Yr)}else"select"===o&&(s=Zr);a||(r.needRuntime=n.helper(s))}else n.onError(io(54,e.loc));return r.props=r.props.filter((e=>!(4===e.key.type&&"modelValue"===e.key.content))),r},on:(e,t,n)=>Or(e,0,n,(t=>{const{modifiers:r}=e;if(!r.length)return t;let{key:o,value:s}=t.props[0];const{keyModifiers:a,nonKeyModifiers:l,eventOptionModifiers:c}=((e,t,n,r)=>{const o=[],i=[],s=[];for(let r=0;r<t.length;r++){const a=t[r];"native"===a&&an("COMPILER_V_ON_NATIVE",n)||so(a)?s.push(a):lo(a)?At(e)?co(e.content)?o.push(a):i.push(a):(o.push(a),i.push(a)):ao(a)?i.push(a):o.push(a)}return{keyModifiers:o,nonKeyModifiers:i,eventOptionModifiers:s}})(o,r,n,e.loc);if(l.includes("right")&&(o=uo(o,"onContextmenu")),l.includes("middle")&&(o=uo(o,"onMouseup")),l.length&&(s=Lt(n.helper(Gr),[s,JSON.stringify(l)])),!a.length||At(o)&&!co(o.content)||(s=Lt(n.helper(Jr),[s,JSON.stringify(a)])),c.length){const e=c.map(i.kC).join("");o=At(o)?Tt(`${o.content}${e}`,!0):Ot(["(",o,`) + "${e}"`])}return{props:[_t(o,s)]}})),show:(e,t,n)=>{const{exp:r,loc:o}=e;return r||n.onError(io(58,o)),{props:[],needRuntime:n.helper(Kr)}}},mo=Object.create(null);(0,o.Y1)((function(e,t){if(!(0,i.HD)(e)){if(!e.nodeType)return i.dG;e=e.innerHTML}const n=e,o=mo[n];if(o)return o;if("#"===e[0]){const t=document.querySelector(e);e=t?t.innerHTML:""}const{code:s}=function(e,t={}){return Vr(e,(0,i.l7)({},ro,t,{nodeTransforms:[fo,...ho,...t.nodeTransforms||[]],directiveTransforms:(0,i.l7)({},po,t.directiveTransforms||{}),transformHoist:null}))}(e,(0,i.l7)({hoistStatic:!0,onError:void 0,onWarn:i.dG},t)),a=new Function("Vue",s)(r);return a._rc=!0,mo[n]=a}))},4515:(e,t,n)=>{var r={"./index.ts":1528};function o(e){var t=i(e);return n(t)}function i(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=i,e.exports=o,o.id=4515},4884:e=>{"use strict";e.exports=()=>window.__DOCS__},9984:e=>{"use strict";e.exports=__DOCS_CONFIG__},7648:(e,t,n)=>{"use strict";n.d(t,{MT:()=>o,IV:()=>c,U2:()=>a,t8:()=>l});function r(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}function o(e,t){const n=(!navigator.userAgentData&&/Safari\//.test(navigator.userAgent)&&!/Chrom(e|ium)\//.test(navigator.userAgent)&&indexedDB.databases?new Promise((function(e){var t=function(){return indexedDB.databases().finally(e)};o=setInterval(t,100),t()})).finally((function(){return clearInterval(o)})):Promise.resolve()).then((()=>{const n=indexedDB.open(e);return n.onupgradeneeded=()=>n.result.createObjectStore(t),r(n)}));var o;return(e,r)=>n.then((n=>r(n.transaction(t,e).objectStore(t))))}let i;function s(){return i||(i=o("keyval-store","keyval")),i}function a(e,t=s()){return t("readonly",(t=>r(t.get(e))))}function l(e,t,n=s()){return n("readwrite",(n=>(n.put(t,e),r(n.transaction))))}function c(e,t=s()){return t("readwrite",(t=>(t.delete(e),r(t.transaction))))}}},t={};function n(r){var o=t[r];if(void 0!==o)return o.exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.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.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),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})},(()=>{"use strict";var e=n(4359),t=n(2626),r=n(872),o=n(5701),i=n(9984),s=n.n(i),a=n(2110);function l(e){setTimeout((function(){e(function(){var e;if("number"==typeof s().flags)e=s().flags;else{if(!c())return!1;if("number"!=typeof s().flags)return!1;e=s().flags}var n=h(f("73696465626172"),f("444F432D53494445424152"),f("646F63732D706F77657265642D6279"),document.children),r=0===n.length&&t.h.state.unloading;if(n.length>0)for(var o=0;o<n.length;++o){var i=n[o],a=null==i?void 0:i.firstChild,l=null==i?void 0:i.querySelector("svg");if(!(i&&a&&l&&i.getAttribute(f("68726566"))===f("68747470733A2F2F7265747970652E636F6D2F")&&a.innerHTML===f("506F7765726564206279")&&l.getAttribute(f("7769647468"))===f("3936")&&l.getAttribute(f("686569676874"))===f("3230")&&1045===l.innerHTML.replace(/\s+/g,"").split("").map((function(e){return e.charCodeAt(0)})).reduce((function(e,t){return e^23*t}),0)))return!1;r||i&&(i.offsetWidth||i.offsetHeight||i.getClientRects().length)&&(r=!0)}return r||(1&e)*(2&e)>0}())}),10)}function c(){var e,t=d();if(!t)return!1;for(var n=parseInt(t.checksum.slice(0,-5)||"0"),r=[s().id,t.fingerprint,".",t.signature,s().base,s().host,n.toString()],o=0,i=s().sidebar;o<i.length;o++){var a=i[o];r.push(null!==(e=a.l)&&void 0!==e?e:a.n)}for(var l=0,c=0,u=r;c<u.length;c++)for(var f=u[c],h=0;h<f.length;++h)l^=f.charCodeAt(h);return l===parseInt(t.checksum.slice(-5))&&(s().flags=n,!0)}function u(t,n,r){if(!n){var o="5B464154414C5D3A20436F".concat(727275,"7074656420776"),i=function(){t&&t.unmount();var e="56273697".concat(4652063,"6F6E66696775726174696F6E"),n=document.getElementById(f("646F63732D617070"));n&&(n.innerHTML="",window[f("636F6E736F6C65")][f("6572726F72")](f(o+e)))};r?(0,e.Y3)((function(){return i()})):i()}}function d(){var e=null===s()||void 0===s()?void 0:s().key;if(!e||"string"!=typeof e)return null;var t=e.indexOf(".");if(t<=0)return null;var n=e.lastIndexOf(".");if(n<=t)return null;for(var r={fingerprint:e.slice(0,t),signature:e.slice(t+1,n),checksum:e.slice(n+1)},o=r.signature.length%4;o>0;--o)r.signature+="=";return r}function f(e){for(var t="",n=0;n<e.length;n+=2)t+=String.fromCharCode(parseInt(e.substr(n,2),16));return t}function h(e,t,n,r,o,i){null!=i||(i=[]);for(var s=0;s<r.length;++s){var a=r[s];if("A"===a.nodeName&&a.classList.contains(n)&&a instanceof HTMLElement)i.push(a);else{var l=a.children.length?a.children:"TEMPLATE"===a.nodeName&&a instanceof HTMLTemplateElement&&a.content.children?a.content.children:null;(null==l?void 0:l.length)&&h(e,t,n,l,o,i)}}return i}var p=n(4884),m=n.n(p);const v=()=>window.__DOCS_MERMAID__;var g=n.n(v);const b=()=>window.__DOCS_PRISM__;var y=n.n(b);const w=()=>window.__DOCS_KATEX__;var x,k,S,E,C,_,T=n.n(w),O=n(6184),L=n(7023),R=n(5184),D=n(5543),A=n(8816),I=n(7755),M=n(7924);(0,O.BL)(),"file:"===location.protocol.toLowerCase()&&(O.nP.drive=!1,O.nP.navigator.proposeVisit=function(e){window.location.href=e.toString()});var F="reloadPosition=";null!==(x=window.retype)&&void 0!==x||(window.retype={}),null!==(k=(S=window.retype).reload)&&void 0!==k||(S.reload=function(e,t){if(e){var n=location.pathname.endsWith("/")||/[.]html?$/i.test(location.pathname)?location.pathname:location.pathname+"/";document.cookie="".concat(F).concat(window.scrollX,",").concat(window.scrollY,";path=").concat(n,";max-age=5"),window.location.reload()}else{C=[window.scrollX,window.scrollY],_=window.location.hash;var r=window.location.href,o=_?window.location.pathname+window.location.search:r;(0,O.Vn)(o,{action:"replace"}),t&&(0,A.v2)()}}),document.addEventListener("turbo:load",(function(){var i,f,h;if(t.h.state.initialPageLoad){if(!c())return void u(E,!1);(function(){var e,t,n,r,o;return t=this,n=void 0,o=function(){var t,n,r,o,i,l,c,u,f,h,p,m,v,g,b;return function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}(this,(function(y){switch(y.label){case 0:if(!(t=d()))return[2,!1];for(n=parseInt(t.checksum.slice(0,-5)||"0"),r=atob(t.signature),o=[],g=0;g<r.length;++g)o.push(r.charCodeAt(g));for(i=[s().id,s().base,s().host,n.toString()],l=0,c=s().sidebar;l<c.length;l++)u=c[l],i.push(null!==(e=u.l)&&void 0!==e?e:u.n);return i.push(t.fingerprint),f=i.join(""),h=new TextEncoder,p=new TextDecoder,[4,crypto.subtle.digest("SHA-256",h.encode(f))];case 1:for(m=y.sent(),v=[48,71,48,115,103,125,49,133,75,132,137,14,25,65,99,18,116,124,42,116,85,72,11,45,125,183,150,91,96,33,111,30,32,103,88,212,96,188,182,160,83,67,148,88,185,171,117,178,221,234,50,86,254,60,165,240,3,106,69,30,235,147,143,222,64,97,80,223,163,20,180,16,45,166,117,156,157,202,217,232,216,165,93,4,176,78,44,97,133,2,3,1,0,1],g=a.u.length+a.bT.length;g>0;--g)v[g%v.length]^=a.u[g%a.u.length]^a.bT[g%a.bT.length];return[4,crypto.subtle.importKey("spki",new Uint8Array(v),{name:p.decode(a.u),hash:p.decode(a.bT)},!1,["verify"])];case 2:return b=y.sent(),[4,crypto.subtle.verify(b.algorithm,b,new Uint8Array(o),m)];case 3:return[2,y.sent()]}}))},new((r=void 0)||(r=Promise))((function(e,i){function s(e){try{l(o.next(e))}catch(e){i(e)}}function a(e){try{l(o.throw(e))}catch(e){i(e)}}function l(t){var n;t.done?e(t.value):(n=t.value,n instanceof r?n:new r((function(e){e(n)}))).then(s,a)}l((o=o.apply(t,n||[])).next())}))})().then((function(e){return u(E,e,!0)}))}else E.unmount();(function(){E=(0,e.ri)((0,e.aZ)({name:"DocApp",compilerOptions:{delimiters:["\0\0","\0\0"]},setup:function(){var n=(0,t.oR)().store;(0,r.g)(n),n.actions.resetMemberData();var o=function(){var t=(0,e.iH)(!1),n=null;return(0,L.zX)(window,"scroll",(function(){t.value=!0,null!==n&&clearTimeout(n),n=setTimeout((function(){t.value=!1}),100)})),{isScrolling:t}}().isScrolling;(0,e.YP)(o,(function(e){n.state.isWindowScrolling=e}),{immediate:!0}),(0,e.bv)((function(){(0,e.Y3)((function(){n.state.initialPageLoad=!1}))})),function(){var e=(0,t.oR)().store,n=(0,R.B)().scrollTo;(0,L.zX)(window,"popstate",(function(){var t;if(window.location.hash){var r=decodeURIComponent(window.location.hash);(null!==(t=document.getElementById(r.slice(1)))&&void 0!==t?t:document.querySelector(r))&&n(r,{offset:D.vE,onStart:function(){e.actions.updateScrolledElementId(r.substr(1))}})}}))}()}})),E.provide(t.$Q,t.h),E.provide(o.Mu,o.Ke);var i=n(4515);i.keys().forEach((function(e){var t=i(e);Object.keys(t).forEach((function(e){E.component(e,t[e])}))}));var s=document.getElementById("docs-app");if(s&&s.parentElement){var a=s.parentElement;s.querySelectorAll("script, style").forEach((function(e){e.remove(),a.appendChild(e)}))}E.mount("#docs-app")})(),l((function(e){return u(E,e)})),(null===(f=null===(i=window.retype)||void 0===i?void 0:i.editor)||void 0===f?void 0:f.initView)&&window.retype.editor.initView();var p=m()();(null==p?void 0:p.hasPrism)&&(0,I.b)("prism-js",y(),(function(e){return null==e?void 0:e.initPrism()})),(null==p?void 0:p.hasMermaid)&&(0,I.b)("mermaid-js",g(),(function(e){return null==e?void 0:e.initMermaid()})),(null==p?void 0:p.hasMath)&&(0,I.b)("katex-js",T(),(function(e){return null==e?void 0:e.initKatex()})),document.querySelectorAll(".scrollbar").forEach((function(e){e.classList.remove("overflow-hidden"),new M.Z(e)})),_&&(history.replaceState(history.state,document.title,window.location.pathname+_+window.location.search),_=null);var v=!1;if(C)window.scrollTo.apply(window,C),C=null,v=!0;else if(t.h.state.initialPageLoad){var b=null===(h=document.cookie.split(";").find((function(e){return e.trim().startsWith(F)})))||void 0===h?void 0:h.trim();if(b){var w=b.slice(F.length).split(",");w&&2==w.length&&/^\d+$/.test(w[0])&&/^\d+$/.test(w[1])&&(t.h.state.isScrollPositionRestored=!0,setTimeout((function(){t.h.state.isScrollPositionRestored=!1}),3e3),window.scrollTo(Number.parseInt(w[0]),Number.parseInt(w[1])),v=!0)}}v&&O.ry.currentVisit&&(O.ry.currentVisit.scrolled=!0),t.h.actions.updateMemberFilter(""),t.h.actions.updateSearchQuery("")})),window.addEventListener("beforeunload",(function(){t.h.state.unloading=!0}))})()})();
\ No newline at end of file
