/*
  @license
	Rollup.js v1.23.1
	Sat, 05 Oct 2019 06:08:56 GMT - commit 53266e6b971fff985b273800d808b17084d5c41b


	https://github.com/rollup/rollup

	Released under the MIT License.
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).rollup={})}(this,(function(e){"use strict";
/*! *****************************************************************************
    Copyright (c) Microsoft Corporation. All rights reserved.
    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
    this file except in compliance with the License. You may obtain a copy of the
    License at http://www.apache.org/licenses/LICENSE-2.0

    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
    MERCHANTABLITY OR NON-INFRINGEMENT.

    See the Apache Version 2.0 License for specific language governing permissions
    and limitations under the License.
    ***************************************************************************** */function t(e,t,n,i){return new(n||(n=Promise))((function(r,s){function o(e){try{h(i.next(e))}catch(e){s(e)}}function a(e){try{h(i.throw(e))}catch(e){s(e)}}function h(e){e.done?r(e.value):new n((function(t){t(e.value)})).then(o,a)}h((i=i.apply(e,t||[])).next())}))}var n="1.23.1",i=r;function r(e,t){if(!e)throw new Error(t||"Assertion failed")}function s(e,t){return 55296==(64512&e.charCodeAt(t))&&(!(t<0||t+1>=e.length)&&56320==(64512&e.charCodeAt(t+1)))}function o(e){return(e>>>24|e>>>8&65280|e<<8&16711680|(255&e)<<24)>>>0}function a(e){return 1===e.length?"0"+e:e}function h(e){return 7===e.length?"0"+e:6===e.length?"00"+e:5===e.length?"000"+e:4===e.length?"0000"+e:3===e.length?"00000"+e:2===e.length?"000000"+e:1===e.length?"0000000"+e:e}r.equal=function(e,t,n){if(e!=t)throw new Error(n||"Assertion failed: "+e+" != "+t)};var u={inherits:function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}})),toArray:function(e,t){if(Array.isArray(e))return e.slice();if(!e)return[];var n=[];if("string"==typeof e)if(t){if("hex"===t)for((e=e.replace(/[^a-z0-9]+/gi,"")).length%2!=0&&(e="0"+e),r=0;r<e.length;r+=2)n.push(parseInt(e[r]+e[r+1],16))}else for(var i=0,r=0;r<e.length;r++){var o=e.charCodeAt(r);o<128?n[i++]=o:o<2048?(n[i++]=o>>6|192,n[i++]=63&o|128):s(e,r)?(o=65536+((1023&o)<<10)+(1023&e.charCodeAt(++r)),n[i++]=o>>18|240,n[i++]=o>>12&63|128,n[i++]=o>>6&63|128,n[i++]=63&o|128):(n[i++]=o>>12|224,n[i++]=o>>6&63|128,n[i++]=63&o|128)}else for(r=0;r<e.length;r++)n[r]=0|e[r];return n},toHex:function(e){for(var t="",n=0;n<e.length;n++)t+=a(e[n].toString(16));return t},htonl:o,toHex32:function(e,t){for(var n="",i=0;i<e.length;i++){var r=e[i];"little"===t&&(r=o(r)),n+=h(r.toString(16))}return n},zero2:a,zero8:h,join32:function(e,t,n,r){var s=n-t;i(s%4==0);for(var o=new Array(s/4),a=0,h=t;a<o.length;a++,h+=4){var u;u="big"===r?e[h]<<24|e[h+1]<<16|e[h+2]<<8|e[h+3]:e[h+3]<<24|e[h+2]<<16|e[h+1]<<8|e[h],o[a]=u>>>0}return o},split32:function(e,t){for(var n=new Array(4*e.length),i=0,r=0;i<e.length;i++,r+=4){var s=e[i];"big"===t?(n[r]=s>>>24,n[r+1]=s>>>16&255,n[r+2]=s>>>8&255,n[r+3]=255&s):(n[r+3]=s>>>24,n[r+2]=s>>>16&255,n[r+1]=s>>>8&255,n[r]=255&s)}return n},rotr32:function(e,t){return e>>>t|e<<32-t},rotl32:function(e,t){return e<<t|e>>>32-t},sum32:function(e,t){return e+t>>>0},sum32_3:function(e,t,n){return e+t+n>>>0},sum32_4:function(e,t,n,i){return e+t+n+i>>>0},sum32_5:function(e,t,n,i,r){return e+t+n+i+r>>>0},sum64:function(e,t,n,i){var r=e[t],s=i+e[t+1]>>>0,o=(s<i?1:0)+n+r;e[t]=o>>>0,e[t+1]=s},sum64_hi:function(e,t,n,i){return(t+i>>>0<t?1:0)+e+n>>>0},sum64_lo:function(e,t,n,i){return t+i>>>0},sum64_4_hi:function(e,t,n,i,r,s,o,a){var h=0,u=t;return h+=(u=u+i>>>0)<t?1:0,h+=(u=u+s>>>0)<s?1:0,e+n+r+o+(h+=(u=u+a>>>0)<a?1:0)>>>0},sum64_4_lo:function(e,t,n,i,r,s,o,a){return t+i+s+a>>>0},sum64_5_hi:function(e,t,n,i,r,s,o,a,h,u){var c=0,l=t;return c+=(l=l+i>>>0)<t?1:0,c+=(l=l+s>>>0)<s?1:0,c+=(l=l+a>>>0)<a?1:0,e+n+r+o+h+(c+=(l=l+u>>>0)<u?1:0)>>>0},sum64_5_lo:function(e,t,n,i,r,s,o,a,h,u){return t+i+s+a+u>>>0},rotr64_hi:function(e,t,n){return(t<<32-n|e>>>n)>>>0},rotr64_lo:function(e,t,n){return(e<<32-n|t>>>n)>>>0},shr64_hi:function(e,t,n){return e>>>n},shr64_lo:function(e,t,n){return(e<<32-n|t>>>n)>>>0}};function c(){this.pending=null,this.pendingTotal=0,this.blockSize=this.constructor.blockSize,this.outSize=this.constructor.outSize,this.hmacStrength=this.constructor.hmacStrength,this.padLength=this.constructor.padLength/8,this.endian="big",this._delta8=this.blockSize/8,this._delta32=this.blockSize/32}var l=c;c.prototype.update=function(e,t){if(e=u.toArray(e,t),this.pending?this.pending=this.pending.concat(e):this.pending=e,this.pendingTotal+=e.length,this.pending.length>=this._delta8){var n=(e=this.pending).length%this._delta8;this.pending=e.slice(e.length-n,e.length),0===this.pending.length&&(this.pending=null),e=u.join32(e,0,e.length-n,this.endian);for(var i=0;i<e.length;i+=this._delta32)this._update(e,i,i+this._delta32)}return this},c.prototype.digest=function(e){return this.update(this._pad()),i(null===this.pending),this._digest(e)},c.prototype._pad=function(){var e=this.pendingTotal,t=this._delta8,n=t-(e+this.padLength)%t,i=new Array(n+this.padLength);i[0]=128;for(var r=1;r<n;r++)i[r]=0;if(e<<=3,"big"===this.endian){for(var s=8;s<this.padLength;s++)i[r++]=0;i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=e>>>24&255,i[r++]=e>>>16&255,i[r++]=e>>>8&255,i[r++]=255&e}else for(i[r++]=255&e,i[r++]=e>>>8&255,i[r++]=e>>>16&255,i[r++]=e>>>24&255,i[r++]=0,i[r++]=0,i[r++]=0,i[r++]=0,s=8;s<this.padLength;s++)i[r++]=0;return i};var p={BlockHash:l},d=u.rotr32;function f(e,t,n){return e&t^~e&n}function m(e,t,n){return e&t^e&n^t&n}function g(e,t,n){return e^t^n}var y={ft_1:function(e,t,n,i){return 0===e?f(t,n,i):1===e||3===e?g(t,n,i):2===e?m(t,n,i):void 0},ch32:f,maj32:m,p32:g,s0_256:function(e){return d(e,2)^d(e,13)^d(e,22)},s1_256:function(e){return d(e,6)^d(e,11)^d(e,25)},g0_256:function(e){return d(e,7)^d(e,18)^e>>>3},g1_256:function(e){return d(e,17)^d(e,19)^e>>>10}},v=u.sum32,x=u.sum32_4,E=u.sum32_5,_=y.ch32,b=y.maj32,S=y.s0_256,A=y.s1_256,C=y.g0_256,I=y.g1_256,w=p.BlockHash,P=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298];function k(){if(!(this instanceof k))return new k;w.call(this),this.h=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],this.k=P,this.W=new Array(64)}u.inherits(k,w);var N=k;k.blockSize=512,k.outSize=256,k.hmacStrength=192,k.padLength=64,k.prototype._update=function(e,t){for(var n=this.W,r=0;r<16;r++)n[r]=e[t+r];for(;r<n.length;r++)n[r]=x(I(n[r-2]),n[r-7],C(n[r-15]),n[r-16]);var s=this.h[0],o=this.h[1],a=this.h[2],h=this.h[3],u=this.h[4],c=this.h[5],l=this.h[6],p=this.h[7];for(i(this.k.length===n.length),r=0;r<n.length;r++){var d=E(p,A(u),_(u,c,l),this.k[r],n[r]),f=v(S(s),b(s,o,a));p=l,l=c,c=u,u=v(h,d),h=a,a=o,o=s,s=v(d,f)}this.h[0]=v(this.h[0],s),this.h[1]=v(this.h[1],o),this.h[2]=v(this.h[2],a),this.h[3]=v(this.h[3],h),this.h[4]=v(this.h[4],u),this.h[5]=v(this.h[5],c),this.h[6]=v(this.h[6],l),this.h[7]=v(this.h[7],p)},k.prototype._digest=function(e){return"hex"===e?u.toHex32(this.h,"big"):u.split32(this.h,"big")};for(var $={},R="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",T=0;T<R.length;T++)$[R.charCodeAt(T)]=T;function O(e){var t="";e=e<0?-e<<1|1:e<<1;do{var n=31&e;(e>>>=5)>0&&(n|=32),t+=R[n]}while(e>0);return t}var M=function(e,t,n){this.start=e,this.end=t,this.original=n,this.intro="",this.outro="",this.content=n,this.storeName=!1,this.edited=!1,Object.defineProperties(this,{previous:{writable:!0,value:null},next:{writable:!0,value:null}})};M.prototype.appendLeft=function(e){this.outro+=e},M.prototype.appendRight=function(e){this.intro=this.intro+e},M.prototype.clone=function(){var e=new M(this.start,this.end,this.original);return e.intro=this.intro,e.outro=this.outro,e.content=this.content,e.storeName=this.storeName,e.edited=this.edited,e},M.prototype.contains=function(e){return this.start<e&&e<this.end},M.prototype.eachNext=function(e){for(var t=this;t;)e(t),t=t.next},M.prototype.eachPrevious=function(e){for(var t=this;t;)e(t),t=t.previous},M.prototype.edit=function(e,t,n){return this.content=e,n||(this.intro="",this.outro=""),this.storeName=t,this.edited=!0,this},M.prototype.prependLeft=function(e){this.outro=e+this.outro},M.prototype.prependRight=function(e){this.intro=e+this.intro},M.prototype.split=function(e){var t=e-this.start,n=this.original.slice(0,t),i=this.original.slice(t);this.original=n;var r=new M(e,this.end,i);return r.outro=this.outro,this.outro="",this.end=e,this.edited?(r.edit("",!1),this.content=""):this.content=n,r.next=this.next,r.next&&(r.next.previous=r),r.previous=this,this.next=r,r},M.prototype.toString=function(){return this.intro+this.content+this.outro},M.prototype.trimEnd=function(e){if(this.outro=this.outro.replace(e,""),this.outro.length)return!0;var t=this.content.replace(e,"");return t.length?(t!==this.content&&this.split(this.start+t.length).edit("",void 0,!0),!0):(this.edit("",void 0,!0),this.intro=this.intro.replace(e,""),!!this.intro.length||void 0)},M.prototype.trimStart=function(e){if(this.intro=this.intro.replace(e,""),this.intro.length)return!0;var t=this.content.replace(e,"");return t.length?(t!==this.content&&(this.split(this.end-t.length),this.edit("",void 0,!0)),!0):(this.edit("",void 0,!0),this.outro=this.outro.replace(e,""),!!this.outro.length||void 0)};var L=function(){throw new Error("Unsupported environment: `window.btoa` or `Buffer` should be supported.")};"undefined"!=typeof window&&"function"==typeof window.btoa?L=function(e){return window.btoa(unescape(encodeURIComponent(e)))}:"function"==typeof Buffer&&(L=function(e){return Buffer.from(e,"utf-8").toString("base64")});var D=function(e){this.version=3,this.file=e.file,this.sources=e.sources,this.sourcesContent=e.sourcesContent,this.names=e.names,this.mappings=function(e){for(var t=0,n=0,i=0,r=0,s="",o=0;o<e.length;o++){var a=e[o];if(o>0&&(s+=";"),0!==a.length){for(var h=0,u=[],c=0,l=a;c<l.length;c++){var p=l[c],d=O(p[0]-h);h=p[0],p.length>1&&(d+=O(p[1]-t)+O(p[2]-n)+O(p[3]-i),t=p[1],n=p[2],i=p[3]),5===p.length&&(d+=O(p[4]-r),r=p[4]),u.push(d)}s+=u.join(",")}}return s}(e.mappings)};function V(e){var t=e.split("\n"),n=t.filter((function(e){return/^\t+/.test(e)})),i=t.filter((function(e){return/^ {2,}/.test(e)}));if(0===n.length&&0===i.length)return null;if(n.length>=i.length)return"\t";var r=i.reduce((function(e,t){var n=/^ +/.exec(t)[0].length;return Math.min(n,e)}),1/0);return new Array(r+1).join(" ")}function B(e,t){var n=e.split(/[/\\]/),i=t.split(/[/\\]/);for(n.pop();n[0]===i[0];)n.shift(),i.shift();if(n.length)for(var r=n.length;r--;)n[r]="..";return n.concat(i).join("/")}D.prototype.toString=function(){return JSON.stringify(this)},D.prototype.toUrl=function(){return"data:application/json;charset=utf-8;base64,"+L(this.toString())};var z=Object.prototype.toString;function W(e){return"[object Object]"===z.call(e)}function j(e){for(var t=e.split("\n"),n=[],i=0,r=0;i<t.length;i++)n.push(r),r+=t[i].length+1;return function(e){for(var t=0,i=n.length;t<i;){var r=t+i>>1;e<n[r]?i=r:t=r+1}var s=t-1;return{line:s,column:e-n[s]}}}var F=function(e){this.hires=e,this.generatedCodeLine=0,this.generatedCodeColumn=0,this.raw=[],this.rawSegments=this.raw[this.generatedCodeLine]=[],this.pending=null};F.prototype.addEdit=function(e,t,n,i){if(t.length){var r=[this.generatedCodeColumn,e,n.line,n.column];i>=0&&r.push(i),this.rawSegments.push(r)}else this.pending&&this.rawSegments.push(this.pending);this.advance(t),this.pending=null},F.prototype.addUneditedChunk=function(e,t,n,i,r){for(var s=t.start,o=!0;s<t.end;)(this.hires||o||r[s])&&this.rawSegments.push([this.generatedCodeColumn,e,i.line,i.column]),"\n"===n[s]?(i.line+=1,i.column=0,this.generatedCodeLine+=1,this.raw[this.generatedCodeLine]=this.rawSegments=[],this.generatedCodeColumn=0):(i.column+=1,this.generatedCodeColumn+=1),s+=1,o=!1;this.pending=[this.generatedCodeColumn,e,i.line,i.column]},F.prototype.advance=function(e){if(e){var t=e.split("\n");if(t.length>1){for(var n=0;n<t.length-1;n++)this.generatedCodeLine++,this.raw[this.generatedCodeLine]=this.rawSegments=[];this.generatedCodeColumn=0}this.generatedCodeColumn+=t[t.length-1].length}};var U="\n",G={insertLeft:!1,insertRight:!1,storeName:!1},H=function(e,t){void 0===t&&(t={});var n=new M(0,e.length,e);Object.defineProperties(this,{original:{writable:!0,value:e},outro:{writable:!0,value:""},intro:{writable:!0,value:""},firstChunk:{writable:!0,value:n},lastChunk:{writable:!0,value:n},lastSearchedChunk:{writable:!0,value:n},byStart:{writable:!0,value:{}},byEnd:{writable:!0,value:{}},filename:{writable:!0,value:t.filename},indentExclusionRanges:{writable:!0,value:t.indentExclusionRanges},sourcemapLocations:{writable:!0,value:{}},storedNames:{writable:!0,value:{}},indentStr:{writable:!0,value:V(e)}}),this.byStart[0]=n,this.byEnd[e.length]=n};H.prototype.addSourcemapLocation=function(e){this.sourcemapLocations[e]=!0},H.prototype.append=function(e){if("string"!=typeof e)throw new TypeError("outro content must be a string");return this.outro+=e,this},H.prototype.appendLeft=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byEnd[e];return n?n.appendLeft(t):this.intro+=t,this},H.prototype.appendRight=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byStart[e];return n?n.appendRight(t):this.outro+=t,this},H.prototype.clone=function(){for(var e=new H(this.original,{filename:this.filename}),t=this.firstChunk,n=e.firstChunk=e.lastSearchedChunk=t.clone();t;){e.byStart[n.start]=n,e.byEnd[n.end]=n;var i=t.next,r=i&&i.clone();r&&(n.next=r,r.previous=n,n=r),t=i}return e.lastChunk=n,this.indentExclusionRanges&&(e.indentExclusionRanges=this.indentExclusionRanges.slice()),Object.keys(this.sourcemapLocations).forEach((function(t){e.sourcemapLocations[t]=!0})),e.intro=this.intro,e.outro=this.outro,e},H.prototype.generateDecodedMap=function(e){var t=this;e=e||{};var n=Object.keys(this.storedNames),i=new F(e.hires),r=j(this.original);return this.intro&&i.advance(this.intro),this.firstChunk.eachNext((function(e){var s=r(e.start);e.intro.length&&i.advance(e.intro),e.edited?i.addEdit(0,e.content,s,e.storeName?n.indexOf(e.original):-1):i.addUneditedChunk(0,e,t.original,s,t.sourcemapLocations),e.outro.length&&i.advance(e.outro)})),{file:e.file?e.file.split(/[/\\]/).pop():null,sources:[e.source?B(e.file||"",e.source):null],sourcesContent:e.includeContent?[this.original]:[null],names:n,mappings:i.raw}},H.prototype.generateMap=function(e){return new D(this.generateDecodedMap(e))},H.prototype.getIndentString=function(){return null===this.indentStr?"\t":this.indentStr},H.prototype.indent=function(e,t){var n=/^[^\r\n]/gm;if(W(e)&&(t=e,e=void 0),""===(e=void 0!==e?e:this.indentStr||"\t"))return this;var i={};(t=t||{}).exclude&&("number"==typeof t.exclude[0]?[t.exclude]:t.exclude).forEach((function(e){for(var t=e[0];t<e[1];t+=1)i[t]=!0}));var r=!1!==t.indentStart,s=function(t){return r?""+e+t:(r=!0,t)};this.intro=this.intro.replace(n,s);for(var o=0,a=this.firstChunk;a;){var h=a.end;if(a.edited)i[o]||(a.content=a.content.replace(n,s),a.content.length&&(r="\n"===a.content[a.content.length-1]));else for(o=a.start;o<h;){if(!i[o]){var u=this.original[o];"\n"===u?r=!0:"\r"!==u&&r&&(r=!1,o===a.start?a.prependRight(e):(this._splitChunk(a,o),(a=a.next).prependRight(e)))}o+=1}o=a.end,a=a.next}return this.outro=this.outro.replace(n,s),this},H.prototype.insert=function(){throw new Error("magicString.insert(...) is deprecated. Use prependRight(...) or appendLeft(...)")},H.prototype.insertLeft=function(e,t){return G.insertLeft||(console.warn("magicString.insertLeft(...) is deprecated. Use magicString.appendLeft(...) instead"),G.insertLeft=!0),this.appendLeft(e,t)},H.prototype.insertRight=function(e,t){return G.insertRight||(console.warn("magicString.insertRight(...) is deprecated. Use magicString.prependRight(...) instead"),G.insertRight=!0),this.prependRight(e,t)},H.prototype.move=function(e,t,n){if(n>=e&&n<=t)throw new Error("Cannot move a selection inside itself");this._split(e),this._split(t),this._split(n);var i=this.byStart[e],r=this.byEnd[t],s=i.previous,o=r.next,a=this.byStart[n];if(!a&&r===this.lastChunk)return this;var h=a?a.previous:this.lastChunk;return s&&(s.next=o),o&&(o.previous=s),h&&(h.next=i),a&&(a.previous=r),i.previous||(this.firstChunk=r.next),r.next||(this.lastChunk=i.previous,this.lastChunk.next=null),i.previous=h,r.next=a||null,h||(this.firstChunk=i),a||(this.lastChunk=r),this},H.prototype.overwrite=function(e,t,n,i){if("string"!=typeof n)throw new TypeError("replacement content must be a string");for(;e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;if(t>this.original.length)throw new Error("end is out of bounds");if(e===t)throw new Error("Cannot overwrite a zero-length range – use appendLeft or prependRight instead");this._split(e),this._split(t),!0===i&&(G.storeName||(console.warn("The final argument to magicString.overwrite(...) should be an options object. See https://github.com/rich-harris/magic-string"),G.storeName=!0),i={storeName:!0});var r=void 0!==i&&i.storeName,s=void 0!==i&&i.contentOnly;if(r){var o=this.original.slice(e,t);this.storedNames[o]=!0}var a=this.byStart[e],h=this.byEnd[t];if(a){if(t>a.end&&a.next!==this.byStart[a.end])throw new Error("Cannot overwrite across a split point");if(a.edit(n,r,s),a!==h){for(var u=a.next;u!==h;)u.edit("",!1),u=u.next;u.edit("",!1)}}else{var c=new M(e,t,"").edit(n,r);h.next=c,c.previous=h}return this},H.prototype.prepend=function(e){if("string"!=typeof e)throw new TypeError("outro content must be a string");return this.intro=e+this.intro,this},H.prototype.prependLeft=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byEnd[e];return n?n.prependLeft(t):this.intro=t+this.intro,this},H.prototype.prependRight=function(e,t){if("string"!=typeof t)throw new TypeError("inserted content must be a string");this._split(e);var n=this.byStart[e];return n?n.prependRight(t):this.outro=t+this.outro,this},H.prototype.remove=function(e,t){for(;e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;if(e===t)return this;if(e<0||t>this.original.length)throw new Error("Character is out of bounds");if(e>t)throw new Error("end must be greater than start");this._split(e),this._split(t);for(var n=this.byStart[e];n;)n.intro="",n.outro="",n.edit(""),n=t>n.end?this.byStart[n.end]:null;return this},H.prototype.lastChar=function(){if(this.outro.length)return this.outro[this.outro.length-1];var e=this.lastChunk;do{if(e.outro.length)return e.outro[e.outro.length-1];if(e.content.length)return e.content[e.content.length-1];if(e.intro.length)return e.intro[e.intro.length-1]}while(e=e.previous);return this.intro.length?this.intro[this.intro.length-1]:""},H.prototype.lastLine=function(){var e=this.outro.lastIndexOf(U);if(-1!==e)return this.outro.substr(e+1);var t=this.outro,n=this.lastChunk;do{if(n.outro.length>0){if(-1!==(e=n.outro.lastIndexOf(U)))return n.outro.substr(e+1)+t;t=n.outro+t}if(n.content.length>0){if(-1!==(e=n.content.lastIndexOf(U)))return n.content.substr(e+1)+t;t=n.content+t}if(n.intro.length>0){if(-1!==(e=n.intro.lastIndexOf(U)))return n.intro.substr(e+1)+t;t=n.intro+t}}while(n=n.previous);return-1!==(e=this.intro.lastIndexOf(U))?this.intro.substr(e+1)+t:this.intro+t},H.prototype.slice=function(e,t){for(void 0===e&&(e=0),void 0===t&&(t=this.original.length);e<0;)e+=this.original.length;for(;t<0;)t+=this.original.length;for(var n="",i=this.firstChunk;i&&(i.start>e||i.end<=e);){if(i.start<t&&i.end>=t)return n;i=i.next}if(i&&i.edited&&i.start!==e)throw new Error("Cannot use replaced character "+e+" as slice start anchor.");for(var r=i;i;){!i.intro||r===i&&i.start!==e||(n+=i.intro);var s=i.start<t&&i.end>=t;if(s&&i.edited&&i.end!==t)throw new Error("Cannot use replaced character "+t+" as slice end anchor.");var o=r===i?e-i.start:0,a=s?i.content.length+t-i.end:i.content.length;if(n+=i.content.slice(o,a),!i.outro||s&&i.end!==t||(n+=i.outro),s)break;i=i.next}return n},H.prototype.snip=function(e,t){var n=this.clone();return n.remove(0,e),n.remove(t,n.original.length),n},H.prototype._split=function(e){if(!this.byStart[e]&&!this.byEnd[e])for(var t=this.lastSearchedChunk,n=e>t.end;t;){if(t.contains(e))return this._splitChunk(t,e);t=n?this.byStart[t.end]:this.byEnd[t.start]}},H.prototype._splitChunk=function(e,t){if(e.edited&&e.content.length){var n=j(this.original)(t);throw new Error("Cannot split a chunk that has already been edited ("+n.line+":"+n.column+' – "'+e.original+'")')}var i=e.split(t);return this.byEnd[t]=e,this.byStart[t]=i,this.byEnd[i.end]=i,e===this.lastChunk&&(this.lastChunk=i),this.lastSearchedChunk=e,!0},H.prototype.toString=function(){for(var e=this.intro,t=this.firstChunk;t;)e+=t.toString(),t=t.next;return e+this.outro},H.prototype.isEmpty=function(){var e=this.firstChunk;do{if(e.intro.length&&e.intro.trim()||e.content.length&&e.content.trim()||e.outro.length&&e.outro.trim())return!1}while(e=e.next);return!0},H.prototype.length=function(){var e=this.firstChunk,t=0;do{t+=e.intro.length+e.content.length+e.outro.length}while(e=e.next);return t},H.prototype.trimLines=function(){return this.trim("[\\r\\n]")},H.prototype.trim=function(e){return this.trimStart(e).trimEnd(e)},H.prototype.trimEndAborted=function(e){var t=new RegExp((e||"\\s")+"+$");if(this.outro=this.outro.replace(t,""),this.outro.length)return!0;var n=this.lastChunk;do{var i=n.end,r=n.trimEnd(t);if(n.end!==i&&(this.lastChunk===n&&(this.lastChunk=n.next),this.byEnd[n.end]=n,this.byStart[n.next.start]=n.next,this.byEnd[n.next.end]=n.next),r)return!0;n=n.previous}while(n);return!1},H.prototype.trimEnd=function(e){return this.trimEndAborted(e),this},H.prototype.trimStartAborted=function(e){var t=new RegExp("^"+(e||"\\s")+"+");if(this.intro=this.intro.replace(t,""),this.intro.length)return!0;var n=this.firstChunk;do{var i=n.end,r=n.trimStart(t);if(n.end!==i&&(n===this.lastChunk&&(this.lastChunk=n.next),this.byEnd[n.end]=n,this.byStart[n.next.start]=n.next,this.byEnd[n.next.end]=n.next),r)return!0;n=n.next}while(n);return!1},H.prototype.trimStart=function(e){return this.trimStartAborted(e),this};var q=Object.prototype.hasOwnProperty,K=function(e){void 0===e&&(e={}),this.intro=e.intro||"",this.separator=void 0!==e.separator?e.separator:"\n",this.sources=[],this.uniqueSources=[],this.uniqueSourceIndexByFilename={}};function Y(e,t){const n=e.split(/[/\\]/).filter(Boolean),i=t.split(/[/\\]/).filter(Boolean);for("."===n[0]&&n.shift(),"."===i[0]&&i.shift();n[0]&&i[0]&&n[0]===i[0];)n.shift(),i.shift();for(;".."===i[0]&&n.length>0;)i.shift(),n.pop();for(;n.pop();)i.unshift("..");return i.join("/")}K.prototype.addSource=function(e){if(e instanceof H)return this.addSource({content:e,filename:e.filename,separator:this.separator});if(!W(e)||!e.content)throw new Error("bundle.addSource() takes an object with a `content` property, which should be an instance of MagicString, and an optional `filename`");if(["filename","indentExclusionRanges","separator"].forEach((function(t){q.call(e,t)||(e[t]=e.content[t])})),void 0===e.separator&&(e.separator=this.separator),e.filename)if(q.call(this.uniqueSourceIndexByFilename,e.filename)){var t=this.uniqueSources[this.uniqueSourceIndexByFilename[e.filename]];if(e.content.original!==t.content)throw new Error("Illegal source: same filename ("+e.filename+"), different contents")}else this.uniqueSourceIndexByFilename[e.filename]=this.uniqueSources.length,this.uniqueSources.push({filename:e.filename,content:e.content.original});return this.sources.push(e),this},K.prototype.append=function(e,t){return this.addSource({content:new H(e),separator:t&&t.separator||""}),this},K.prototype.clone=function(){var e=new K({intro:this.intro,separator:this.separator});return this.sources.forEach((function(t){e.addSource({filename:t.filename,content:t.content.clone(),separator:t.separator})})),e},K.prototype.generateDecodedMap=function(e){var t=this;void 0===e&&(e={});var n=[];this.sources.forEach((function(e){Object.keys(e.content.storedNames).forEach((function(e){~n.indexOf(e)||n.push(e)}))}));var i=new F(e.hires);return this.intro&&i.advance(this.intro),this.sources.forEach((function(e,r){r>0&&i.advance(t.separator);var s=e.filename?t.uniqueSourceIndexByFilename[e.filename]:-1,o=e.content,a=j(o.original);o.intro&&i.advance(o.intro),o.firstChunk.eachNext((function(t){var r=a(t.start);t.intro.length&&i.advance(t.intro),e.filename?t.edited?i.addEdit(s,t.content,r,t.storeName?n.indexOf(t.original):-1):i.addUneditedChunk(s,t,o.original,r,o.sourcemapLocations):i.advance(t.content),t.outro.length&&i.advance(t.outro)})),o.outro&&i.advance(o.outro)})),{file:e.file?e.file.split(/[/\\]/).pop():null,sources:this.uniqueSources.map((function(t){return e.file?B(e.file,t.filename):t.filename})),sourcesContent:this.uniqueSources.map((function(t){return e.includeContent?t.content:null})),names:n,mappings:i.raw}},K.prototype.generateMap=function(e){return new D(this.generateDecodedMap(e))},K.prototype.getIndentString=function(){var e={};return this.sources.forEach((function(t){var n=t.content.indentStr;null!==n&&(e[n]||(e[n]=0),e[n]+=1)})),Object.keys(e).sort((function(t,n){return e[t]-e[n]}))[0]||"\t"},K.prototype.indent=function(e){var t=this;if(arguments.length||(e=this.getIndentString()),""===e)return this;var n=!this.intro||"\n"===this.intro.slice(-1);return this.sources.forEach((function(i,r){var s=void 0!==i.separator?i.separator:t.separator,o=n||r>0&&/\r?\n$/.test(s);i.content.indent(e,{exclude:i.indentExclusionRanges,indentStart:o}),n="\n"===i.content.lastChar()})),this.intro&&(this.intro=e+this.intro.replace(/^[^\n]/gm,(function(t,n){return n>0?e+t:t}))),this},K.prototype.prepend=function(e){return this.intro=e+this.intro,this},K.prototype.toString=function(){var e=this,t=this.sources.map((function(t,n){var i=void 0!==t.separator?t.separator:e.separator;return(n>0?i:"")+t.content.toString()})).join("");return this.intro+t},K.prototype.isEmpty=function(){return(!this.intro.length||!this.intro.trim())&&!this.sources.some((function(e){return!e.content.isEmpty()}))},K.prototype.length=function(){return this.sources.reduce((function(e,t){return e+t.content.length()}),this.intro.length)},K.prototype.trimLines=function(){return this.trim("[\\r\\n]")},K.prototype.trim=function(e){return this.trimStart(e).trimEnd(e)},K.prototype.trimStart=function(e){var t=new RegExp("^"+(e||"\\s")+"+");if(this.intro=this.intro.replace(t,""),!this.intro){var n,i=0;do{if(!(n=this.sources[i++]))break}while(!n.content.trimStartAborted(e))}return this},K.prototype.trimEnd=function(e){var t,n=new RegExp((e||"\\s")+"+$"),i=this.sources.length-1;do{if(!(t=this.sources[i--])){this.intro=this.intro.replace(n,"");break}}while(!t.content.trimEndAborted(e));return this};const X=Object.create(null),Q="BlockStatement",J="CallExpression",Z="ExportAllDeclaration",ee="ExpressionStatement",te="FunctionExpression",ne="Identifier",ie="ImportDefaultSpecifier",re="ImportNamespaceSpecifier",se="Program",oe="Property",ae="ReturnStatement",he="VariableDeclaration";function ue(e,t,n,i){if(t.remove(n,i),e.annotations)for(const i of e.annotations){if(!(i.start<n))return;t.remove(i.start,i.end)}}function ce(e,t){if(e.annotations||e.parent.type!==ee||(e=e.parent),e.annotations)for(const n of e.annotations)t.remove(n.start,n.end)}const le={isNoStatement:!0};function pe(e,t,n=0){let i,r;for(i=e.indexOf(t,n);;){if(-1===(n=e.indexOf("/",n))||n>i)return i;r=e.charCodeAt(++n),++n,(n=47===r?e.indexOf("\n",n)+1:e.indexOf("*/",n)+2)>i&&(i=e.indexOf(t,n))}}function de(e){let t,n,i=0;for(t=e.indexOf("\n",i);;){if(-1===(i=e.indexOf("/",i))||i>t)return t;if(47===(n=e.charCodeAt(++i)))return t;(i=e.indexOf("*/",i+2)+2)>t&&(t=e.indexOf("\n",i))}}function fe(e,t,n,i,r){let s,o,a,h,u=e[0],c=!u.included||u.needsBoundaries;c&&(h=n+de(t.original.slice(n,u.start))+1);for(let n=1;n<=e.length;n++)s=u,o=h,a=c,c=void 0!==(u=e[n])&&(!u.included||u.needsBoundaries),a||c?(h=s.end+de(t.original.slice(s.end,void 0===u?i:u.start))+1,s.included?a?s.render(t,r,{end:h,start:o}):s.render(t,r):ue(s,t,o,h)):s.render(t,r)}function me(e,t,n,i){const r=[];let s,o,a,h,u,c=n-1;for(let i=0;i<e.length;i++){for(o=e[i],void 0!==s&&(c=s.end+pe(t.original.slice(s.end,o.start),",")),a=h=c+2+de(t.original.slice(c+1,o.start));32===(u=t.original.charCodeAt(a))||9===u||10===u||13===u;)a++;void 0!==s&&r.push({contentEnd:h,end:a,node:s,separator:c,start:n}),s=o,n=a}return r.push({contentEnd:i,end:i,node:s,separator:null,start:n}),r}function ge(e,t,n){for(;;){const i=de(e.original.slice(t,n));if(-1===i)break;t=t+i+1,e.remove(t-1,t)}}const ye="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_$",ve=64;function xe(e){let t="";do{const n=e%ve;e=Math.floor(e/ve),t=ye[n]+t}while(0!==e);return t}const Ee=Object.assign(Object.create(null),{await:!0,break:!0,case:!0,catch:!0,class:!0,const:!0,continue:!0,debugger:!0,default:!0,delete:!0,do:!0,else:!0,enum:!0,eval:!0,export:!0,extends:!0,false:!0,finally:!0,for:!0,function:!0,if:!0,implements:!0,import:!0,in:!0,instanceof:!0,interface:!0,let:!0,new:!0,null:!0,package:!0,private:!0,protected:!0,public:!0,return:!0,static:!0,super:!0,switch:!0,this:!0,throw:!0,true:!0,try:!0,typeof:!0,undefined:!0,var:!0,void:!0,while:!0,with:!0,yield:!0});function _e(e,t){let n=e,i=1;for(;t.has(n)||Ee[n];)n=`${e}$${xe(i++)}`;return t.add(n),n}class be{constructor({withNew:e=!1,args:t=[],callIdentifier:n}={}){this.withNew=e,this.args=t,this.callIdentifier=n}static create(e){return new this(e)}equals(e){return e&&this.callIdentifier===e.callIdentifier}}const Se={UNKNOWN_KEY:!0},Ae=[],Ce=[Se];function Ie(e,t=null){return Object.create(t,e)}const we={UNKNOWN_VALUE:!0},Pe={deoptimizePath:()=>{},getLiteralValueAtPath:()=>we,getReturnExpressionWhenCalledAtPath:()=>Pe,hasEffectsWhenAccessedAtPath:e=>e.length>0,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:()=>!0,include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN]]"},ke={deoptimizePath:()=>{},getLiteralValueAtPath:()=>void 0,getReturnExpressionWhenCalledAtPath:()=>Pe,hasEffectsWhenAccessedAtPath:e=>e.length>0,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:()=>!0,include:()=>{},includeCallArguments(){},included:!0,toString:()=>"undefined"},Ne={value:{returns:null,returnsPrimitive:Pe,callsArgs:null,mutatesSelf:!0}},$e={value:{returns:null,returnsPrimitive:Pe,callsArgs:[0],mutatesSelf:!1}};class Re{constructor(){this.included=!1}deoptimizePath(){}getLiteralValueAtPath(){return we}getReturnExpressionWhenCalledAtPath(e){return 1===e.length?Ze(Ke,e[0]):Pe}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Je(Ke,e[0],this.included,t,n)}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}toString(){return"[[UNKNOWN ARRAY]]"}}const Te={value:{callsArgs:null,mutatesSelf:!1,returns:Re,returnsPrimitive:null}},Oe={value:{callsArgs:null,mutatesSelf:!0,returns:Re,returnsPrimitive:null}},Me={value:{callsArgs:[0],mutatesSelf:!1,returns:Re,returnsPrimitive:null}},Le={value:{callsArgs:[0],mutatesSelf:!0,returns:Re,returnsPrimitive:null}},De={deoptimizePath:()=>{},getLiteralValueAtPath:()=>we,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Ze(Ye,e[0]):Pe,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:e=>{if(1===e.length){const t=e[0];return"string"!=typeof t||!Ye[t]}return!0},include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN BOOLEAN]]"},Ve={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:De}},Be={value:{callsArgs:[0],mutatesSelf:!1,returns:null,returnsPrimitive:De}},ze={deoptimizePath:()=>{},getLiteralValueAtPath:()=>we,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Ze(Xe,e[0]):Pe,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:e=>{if(1===e.length){const t=e[0];return"string"!=typeof t||!Xe[t]}return!0},include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN NUMBER]]"},We={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:ze}},je={value:{callsArgs:null,mutatesSelf:!0,returns:null,returnsPrimitive:ze}},Fe={value:{callsArgs:[0],mutatesSelf:!1,returns:null,returnsPrimitive:ze}},Ue={deoptimizePath:()=>{},getLiteralValueAtPath:()=>we,getReturnExpressionWhenCalledAtPath:e=>1===e.length?Ze(Qe,e[0]):Pe,hasEffectsWhenAccessedAtPath:e=>e.length>1,hasEffectsWhenAssignedAtPath:e=>e.length>0,hasEffectsWhenCalledAtPath:(e,t,n)=>1!==e.length||Je(Qe,e[0],!0,t,n),include:()=>{},includeCallArguments(e){for(const t of e)t.include(!1)},included:!0,toString:()=>"[[UNKNOWN STRING]]"},Ge={value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:Ue}};class He{constructor(){this.included=!1}deoptimizePath(){}getLiteralValueAtPath(){return we}getReturnExpressionWhenCalledAtPath(e){return 1===e.length?Ze(qe,e[0]):Pe}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Je(qe,e[0],this.included,t,n)}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}toString(){return"[[UNKNOWN OBJECT]]"}}const qe=Ie({hasOwnProperty:Ve,isPrototypeOf:Ve,propertyIsEnumerable:Ve,toLocaleString:Ge,toString:Ge,valueOf:{value:{callsArgs:null,mutatesSelf:!1,returns:null,returnsPrimitive:Pe}}}),Ke=Ie({concat:Te,copyWithin:Oe,every:Be,fill:Oe,filter:Me,find:$e,findIndex:Fe,forEach:$e,includes:Ve,indexOf:We,join:Ge,lastIndexOf:We,map:Me,pop:Ne,push:je,reduce:$e,reduceRight:$e,reverse:Oe,shift:Ne,slice:Te,some:Be,sort:Le,splice:Oe,unshift:je},qe),Ye=Ie({valueOf:Ve},qe),Xe=Ie({toExponential:Ge,toFixed:Ge,toLocaleString:Ge,toPrecision:Ge,valueOf:We},qe),Qe=Ie({charAt:Ge,charCodeAt:We,codePointAt:We,concat:Ge,endsWith:Ve,includes:Ve,indexOf:We,lastIndexOf:We,localeCompare:We,match:Ve,normalize:Ge,padEnd:Ge,padStart:Ge,repeat:Ge,replace:{value:{callsArgs:[1],mutatesSelf:!1,returns:null,returnsPrimitive:Ue}},search:We,slice:Ge,split:Te,startsWith:Ve,substr:Ge,substring:Ge,toLocaleLowerCase:Ge,toLocaleUpperCase:Ge,toLowerCase:Ge,toUpperCase:Ge,trim:Ge,valueOf:Ge},qe);function Je(e,t,n,i,r){if("string"!=typeof t||!e[t])return!0;if(e[t].mutatesSelf&&n)return!0;if(!e[t].callsArgs)return!1;for(const n of e[t].callsArgs)if(i.args[n]&&i.args[n].hasEffectsWhenCalledAtPath(Ae,be.create({args:[],callIdentifier:{},withNew:!1}),r.getHasEffectsWhenCalledOptions()))return!0;return!1}function Ze(e,t){return"string"==typeof t&&e[t]?null!==e[t].returnsPrimitive?e[t].returnsPrimitive:new e[t].returns:Pe}class et{constructor(e){this.alwaysRendered=!1,this.exportName=null,this.included=!1,this.isId=!1,this.isReassigned=!1,this.renderBaseName=null,this.renderName=null,this.safeExportName=null,this.name=e}addReference(e){}deoptimizePath(e){}getBaseVariableName(){return this.renderBaseName||this.renderName||this.name}getLiteralValueAtPath(e,t,n){return we}getName(){const e=this.renderName||this.name;return this.renderBaseName?`${this.renderBaseName}.${e}`:e}getReturnExpressionWhenCalledAtPath(e,t,n){return Pe}hasEffectsWhenAccessedAtPath(e,t){return e.length>0}hasEffectsWhenAssignedAtPath(e,t){return!0}hasEffectsWhenCalledAtPath(e,t,n){return!0}include(){this.included=!0}includeCallArguments(e){for(const t of e)t.include(!1)}markCalledFromTryStatement(){}setRenderNames(e,t){this.renderBaseName=e,this.renderName=t}setSafeName(e){this.renderName=e}toString(){return this.name}}class tt extends et{constructor(e,t){super(t),this.module=e,this.isNamespace="*"===t,this.referenced=!1}addReference(e){this.referenced=!0,"default"!==this.name&&"*"!==this.name||this.module.suggestName(e.name)}include(){this.included||(this.included=!0,this.module.used=!0)}}const nt="break case class catch const continue debugger default delete do else export extends finally for function if import in instanceof let new return super switch this throw try typeof var void while with yield enum await implements package protected static interface private public".split(" "),it="Infinity NaN undefined null true false eval uneval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Symbol Error EvalError InternalError RangeError ReferenceError SyntaxError TypeError URIError Number Math Date String RegExp Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array Map Set WeakMap WeakSet SIMD ArrayBuffer DataView JSON Promise Generator GeneratorFunction Reflect Proxy Intl".split(" "),rt=Object.create(null);nt.concat(it).forEach(e=>rt[e]=!0);const st=/[^$_a-zA-Z0-9]/g,ot=e=>/\d/.test(e[0]);function at(e){return e=e.replace(/-(\w)/g,(e,t)=>t.toUpperCase()).replace(st,"_"),(ot(e)||rt[e])&&(e=`_${e}`),e||"_"}const ht=/^(?:\/|(?:[A-Za-z]:)?[\\|/])/,ut=/^\.?\.\//;function ct(e){return ht.test(e)}function lt(e){return ut.test(e)}function pt(e){return e.replace(/\\/g,"/")}function dt(e){return e.split(/(\/|\\)/).pop()}function ft(e){const t=/(\/|\\)[^/\\]*$/.exec(e);if(!t)return".";const n=e.slice(0,-t[0].length);return n||"/"}function mt(e){const t=/\.[^.]+$/.exec(dt(e));return t?t[0]:""}function gt(e,t){const n=e.split(/[/\\]/).filter(Boolean),i=t.split(/[/\\]/).filter(Boolean);for("."===n[0]&&n.shift(),"."===i[0]&&i.shift();n[0]&&i[0]&&n[0]===i[0];)n.shift(),i.shift();for(;".."===i[0]&&n.length>0;)i.shift(),n.pop();for(;n.pop();)i.unshift("..");return i.join("/")}function yt(...e){let t=e.shift().split(/[/\\]/);return e.forEach(e=>{if(ct(e))t=e.split(/[/\\]/);else{const n=e.split(/[/\\]/);for(;"."===n[0]||".."===n[0];){".."===n.shift()&&t.pop()}t.push.apply(t,n)}}),t.join("/")}class vt{constructor(e,t,n){this.exportsNames=!1,this.exportsNamespace=!1,this.mostCommonSuggestion=0,this.reexported=!1,this.renderPath=void 0,this.renormalizeRenderPath=!1,this.used=!1,this.graph=e,this.id=t,this.execIndex=1/0,this.moduleSideEffects=n;const i=t.split(/[\\/]/);this.variableName=at(i.pop()),this.nameSuggestions=Object.create(null),this.declarations=Object.create(null),this.exportedVariables=new Map}getVariableForExportName(e,t){"*"===e?this.exportsNamespace=!0:"default"!==e&&(this.exportsNames=!0);let n=this.declarations[e];return n||(this.declarations[e]=n=new tt(this,e),this.exportedVariables.set(n,e),n)}setRenderPath(e,t){return this.renderPath="",e.paths&&(this.renderPath="function"==typeof e.paths?e.paths(this.id):e.paths[this.id]),this.renderPath||(ct(this.id)?(this.renderPath=pt(gt(t,this.id)),this.renormalizeRenderPath=!0):this.renderPath=this.id),this.renderPath}suggestName(e){this.nameSuggestions[e]||(this.nameSuggestions[e]=0),this.nameSuggestions[e]+=1,this.nameSuggestions[e]>this.mostCommonSuggestion&&(this.mostCommonSuggestion=this.nameSuggestions[e],this.variableName=e)}warnUnusedImports(){const e=Object.keys(this.declarations).filter(e=>{if("*"===e)return!1;const t=this.declarations[e];return!t.included&&!this.reexported&&!t.referenced});if(0===e.length)return;const t=1===e.length?`'${e[0]}' is`:`${e.slice(0,-1).map(e=>`'${e}'`).join(", ")} and '${e.slice(-1)}' are`;this.graph.warn({code:"UNUSED_EXTERNAL_IMPORT",message:`${t} imported from external module '${this.id}' but never used`,names:e,source:this.id})}}function xt(e){e.isExecuted=!0;const t=[e],n=new Set;for(const e of t)for(const i of e.dependencies)i instanceof vt||i.isExecuted||!i.moduleSideEffects||n.has(i.id)||(i.isExecuted=!0,n.add(i.id),t.push(i))}const Et=7;class _t extends et{constructor(e,t,n,i){super(e),this.additionalInitializers=null,this.calledFromTryStatement=!1,this.expressionsToBeDeoptimized=[],this.declarations=t?[t]:[],this.init=n,this.deoptimizationTracker=i.deoptimizationTracker,this.module=i.module}addDeclaration(e,t){this.declarations.push(e),null===this.additionalInitializers&&(this.additionalInitializers=null===this.init?[]:[this.init],this.init=Pe,this.isReassigned=!0),null!==t&&this.additionalInitializers.push(t)}consolidateInitializers(){if(null!==this.additionalInitializers){for(const e of this.additionalInitializers)e.deoptimizePath(Ce);this.additionalInitializers=null}}deoptimizePath(e){if(!(e.length>Et||this.isReassigned||this.deoptimizationTracker.track(this,e)))if(0===e.length){if(!this.isReassigned){this.isReassigned=!0;for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache();this.init&&this.init.deoptimizePath(Ce)}}else this.init&&this.init.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.isReassigned||!this.init||e.length>Et||t.isTracked(this.init,e)?we:(this.expressionsToBeDeoptimized.push(n),this.init.getLiteralValueAtPath(e,t.track(this.init,e),n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isReassigned||!this.init||e.length>Et||t.isTracked(this.init,e)?Pe:(this.expressionsToBeDeoptimized.push(n),this.init.getReturnExpressionWhenCalledAtPath(e,t.track(this.init,e),n))}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(this.isReassigned||e.length>Et||this.init&&!t.hasNodeBeenAccessedAtPath(e,this.init)&&this.init.hasEffectsWhenAccessedAtPath(e,t.addAccessedNodeAtPath(e,this.init)))}hasEffectsWhenAssignedAtPath(e,t){return!!(this.included||e.length>Et)||0!==e.length&&(this.isReassigned||this.init&&!t.hasNodeBeenAssignedAtPath(e,this.init)&&this.init.hasEffectsWhenAssignedAtPath(e,t.addAssignedNodeAtPath(e,this.init)))}hasEffectsWhenCalledAtPath(e,t,n){return e.length>Et||(this.isReassigned||this.init&&!n.hasNodeBeenCalledAtPathWithOptions(e,this.init,t)&&this.init.hasEffectsWhenCalledAtPath(e,t,n.addCalledNodeAtPathWithOptions(e,this.init,t)))}include(){if(!this.included){this.included=!0,this.module.isExecuted||xt(this.module);for(const e of this.declarations){e.included||e.include(!1);let t=e.parent;for(;!t.included&&(t.included=!0,t.type!==se);)t=t.parent}}}includeCallArguments(e){if(this.isReassigned)for(const t of e)t.include(!1);else this.init&&this.init.includeCallArguments(e)}markCalledFromTryStatement(){this.calledFromTryStatement=!0}}class bt{constructor(){this.children=[],this.variables=new Map}addDeclaration(e,t,n=null,i){const r=e.name;let s=this.variables.get(r);return s?s.addDeclaration(e,n):(s=new _t(e.name,e,n||ke,t),this.variables.set(r,s)),s}contains(e){return this.variables.has(e)}findVariable(e){throw new Error("Internal Error: findVariable needs to be implemented by a subclass")}}class St extends bt{constructor(e){super(),this.accessedOutsideVariables=new Map,this.parent=e,e.children.push(this)}addAccessedGlobalsByFormat(e){let t=this.accessedGlobalVariablesByFormat;t||(t=this.accessedGlobalVariablesByFormat=new Map);for(const n of Object.keys(e)){let i=t.get(n);i||(i=new Set,t.set(n,i));for(const t of e[n])i.add(t)}this.parent instanceof St&&this.parent.addAccessedGlobalsByFormat(e)}addNamespaceMemberAccess(e,t){this.accessedOutsideVariables.set(e,t),this.parent instanceof St&&this.parent.addNamespaceMemberAccess(e,t)}addReturnExpression(e){this.parent instanceof St&&this.parent.addReturnExpression(e)}contains(e){return this.variables.has(e)||this.parent.contains(e)}deconflict(e){const t=new Set;for(const n of this.accessedOutsideVariables.values())n.included&&(t.add(n.getBaseVariableName()),n.exportName&&"system"===e&&t.add("exports"));const n=this.accessedGlobalVariablesByFormat&&this.accessedGlobalVariablesByFormat.get(e);if(n)for(const e of n)t.add(e);for(const[e,n]of this.variables)(n.included||n.alwaysRendered)&&n.setSafeName(_e(e,t));for(const t of this.children)t.deconflict(e)}findLexicalBoundary(){return this.parent instanceof St?this.parent.findLexicalBoundary():this}findVariable(e){const t=this.variables.get(e)||this.accessedOutsideVariables.get(e);if(t)return t;const n=this.parent.findVariable(e);return this.accessedOutsideVariables.set(e,n),n}}function At(e,t,n){if("number"==typeof n)throw new Error("locate takes a { startIndex, offsetLine, offsetColumn } object as the third argument");return function(e,t){void 0===t&&(t={});var n=t.offsetLine||0,i=t.offsetColumn||0,r=e.split("\n"),s=0,o=r.map((function(e,t){var n=s+e.length+1,i={start:s,end:n,line:t};return s=n,i})),a=0;function h(e,t){return e.start<=t&&t<e.end}function u(e,t){return{line:n+e.line,column:i+t-e.start,character:t}}return function(t,n){"string"==typeof t&&(t=e.indexOf(t,n||0));for(var i=o[a],r=t>=i.end?1:-1;i;){if(h(i,t))return u(i,t);i=o[a+=r]}}}(e,n)(t,n&&n.startIndex)}var Ct=5,It=1<<Ct,wt=It-1,Pt={};function kt(e){e&&(e.value=!0)}function Nt(){}function $t(e){return void 0===e.size&&(e.size=e.__iterate(Tt)),e.size}function Rt(e,t){if("number"!=typeof t){var n=t>>>0;if(""+n!==t||4294967295===n)return NaN;t=n}return t<0?$t(e)+t:t}function Tt(){return!0}function Ot(e,t,n){return(0===e&&!Vt(e)||void 0!==n&&e<=-n)&&(void 0===t||void 0!==n&&t>=n)}function Mt(e,t){return Dt(e,t,0)}function Lt(e,t){return Dt(e,t,t)}function Dt(e,t,n){return void 0===e?n:Vt(e)?t===1/0?t:0|Math.max(0,t+e):void 0===t||t===e?e:0|Math.min(t,e)}function Vt(e){return e<0||0===e&&1/e==-1/0}var Bt="@@__IMMUTABLE_ITERABLE__@@";function zt(e){return Boolean(e&&e[Bt])}var Wt="@@__IMMUTABLE_KEYED__@@";function jt(e){return Boolean(e&&e[Wt])}var Ft="@@__IMMUTABLE_INDEXED__@@";function Ut(e){return Boolean(e&&e[Ft])}function Gt(e){return jt(e)||Ut(e)}var Ht=function(e){return zt(e)?e:xn(e)},qt=function(e){function t(e){return jt(e)?e:En(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Ht),Kt=function(e){function t(e){return Ut(e)?e:_n(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Ht),Yt=function(e){function t(e){return zt(e)&&!Gt(e)?e:bn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(Ht);Ht.Keyed=qt,Ht.Indexed=Kt,Ht.Set=Yt;var Xt="@@__IMMUTABLE_SEQ__@@";function Qt(e){return Boolean(e&&e[Xt])}var Jt="@@__IMMUTABLE_RECORD__@@";function Zt(e){return Boolean(e&&e[Jt])}function en(e){return zt(e)||Zt(e)}var tn="@@__IMMUTABLE_ORDERED__@@";function nn(e){return Boolean(e&&e[tn])}var rn=0,sn=1,on=2,an="function"==typeof Symbol&&Symbol.iterator,hn="@@iterator",un=an||hn,cn=function(e){this.next=e};function ln(e,t,n,i){var r=0===e?t:1===e?n:[t,n];return i?i.value=r:i={value:r,done:!1},i}function pn(){return{value:void 0,done:!0}}function dn(e){return!!gn(e)}function fn(e){return e&&"function"==typeof e.next}function mn(e){var t=gn(e);return t&&t.call(e)}function gn(e){var t=e&&(an&&e[an]||e[hn]);if("function"==typeof t)return t}cn.prototype.toString=function(){return"[Iterator]"},cn.KEYS=rn,cn.VALUES=sn,cn.ENTRIES=on,cn.prototype.inspect=cn.prototype.toSource=function(){return this.toString()},cn.prototype[un]=function(){return this};var yn=Object.prototype.hasOwnProperty;function vn(e){return!(!Array.isArray(e)&&"string"!=typeof e)||e&&"object"==typeof e&&Number.isInteger(e.length)&&e.length>=0&&(0===e.length?1===Object.keys(e).length:e.hasOwnProperty(e.length-1))}var xn=function(e){function t(e){return null==e?wn():en(e)?e.toSeq():function(e){var t=Nn(e);if(t)return t;if("object"==typeof e)return new An(e);throw new TypeError("Expected Array or collection object of values, or keyed object: "+e)}(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq {","}")},t.prototype.cacheResult=function(){return!this._cache&&this.__iterateUncached&&(this._cache=this.entrySeq().toArray(),this.size=this._cache.length),this},t.prototype.__iterate=function(e,t){var n=this._cache;if(n){for(var i=n.length,r=0;r!==i;){var s=n[t?i-++r:r++];if(!1===e(s[1],s[0],this))break}return r}return this.__iterateUncached(e,t)},t.prototype.__iterator=function(e,t){var n=this._cache;if(n){var i=n.length,r=0;return new cn((function(){if(r===i)return{value:void 0,done:!0};var s=n[t?i-++r:r++];return ln(e,s[0],s[1])}))}return this.__iteratorUncached(e,t)},t}(Ht),En=function(e){function t(e){return null==e?wn().toKeyedSeq():zt(e)?jt(e)?e.toSeq():e.fromEntrySeq():Zt(e)?e.toSeq():Pn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toKeyedSeq=function(){return this},t}(xn),_n=function(e){function t(e){return null==e?wn():zt(e)?jt(e)?e.entrySeq():e.toIndexedSeq():Zt(e)?e.toSeq().entrySeq():kn(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toIndexedSeq=function(){return this},t.prototype.toString=function(){return this.__toString("Seq [","]")},t}(xn),bn=function(e){function t(e){return(zt(e)&&!Gt(e)?e:_n(e)).toSetSeq()}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return t(arguments)},t.prototype.toSetSeq=function(){return this},t}(xn);xn.isSeq=Qt,xn.Keyed=En,xn.Set=bn,xn.Indexed=_n,xn.prototype[Xt]=!0;var Sn=function(e){function t(e){this._array=e,this.size=e.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return this.has(e)?this._array[Rt(this,e)]:t},t.prototype.__iterate=function(e,t){for(var n=this._array,i=n.length,r=0;r!==i;){var s=t?i-++r:r++;if(!1===e(n[s],s,this))break}return r},t.prototype.__iterator=function(e,t){var n=this._array,i=n.length,r=0;return new cn((function(){if(r===i)return{value:void 0,done:!0};var s=t?i-++r:r++;return ln(e,s,n[s])}))},t}(_n),An=function(e){function t(e){var t=Object.keys(e);this._object=e,this._keys=t,this.size=t.length}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return void 0===t||this.has(e)?this._object[e]:t},t.prototype.has=function(e){return yn.call(this._object,e)},t.prototype.__iterate=function(e,t){for(var n=this._object,i=this._keys,r=i.length,s=0;s!==r;){var o=i[t?r-++s:s++];if(!1===e(n[o],o,this))break}return s},t.prototype.__iterator=function(e,t){var n=this._object,i=this._keys,r=i.length,s=0;return new cn((function(){if(s===r)return{value:void 0,done:!0};var o=i[t?r-++s:s++];return ln(e,o,n[o])}))},t}(En);An.prototype[tn]=!0;var Cn,In=function(e){function t(e){this._collection=e,this.size=e.length||e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.__iterateUncached=function(e,t){if(t)return this.cacheResult().__iterate(e,t);var n=mn(this._collection),i=0;if(fn(n))for(var r;!(r=n.next()).done&&!1!==e(r.value,i++,this););return i},t.prototype.__iteratorUncached=function(e,t){if(t)return this.cacheResult().__iterator(e,t);var n=mn(this._collection);if(!fn(n))return new cn(pn);var i=0;return new cn((function(){var t=n.next();return t.done?t:ln(e,i++,t.value)}))},t}(_n);function wn(){return Cn||(Cn=new Sn([]))}function Pn(e){var t=Array.isArray(e)?new Sn(e):dn(e)?new In(e):void 0;if(t)return t.fromEntrySeq();if("object"==typeof e)return new An(e);throw new TypeError("Expected Array or collection object of [k, v] entries, or keyed object: "+e)}function kn(e){var t=Nn(e);if(t)return t;throw new TypeError("Expected Array or collection object of values: "+e)}function Nn(e){return vn(e)?new Sn(e):dn(e)?new In(e):void 0}var $n="@@__IMMUTABLE_MAP__@@";function Rn(e){return Boolean(e&&e[$n])}function Tn(e){return Rn(e)&&nn(e)}function On(e){return Boolean(e&&"function"==typeof e.equals&&"function"==typeof e.hashCode)}function Mn(e,t){if(e===t||e!=e&&t!=t)return!0;if(!e||!t)return!1;if("function"==typeof e.valueOf&&"function"==typeof t.valueOf){if((e=e.valueOf())===(t=t.valueOf())||e!=e&&t!=t)return!0;if(!e||!t)return!1}return!!(On(e)&&On(t)&&e.equals(t))}var Ln="function"==typeof Math.imul&&-2===Math.imul(4294967295,2)?Math.imul:function(e,t){var n=65535&(e|=0),i=65535&(t|=0);return n*i+((e>>>16)*i+n*(t>>>16)<<16>>>0)|0};function Dn(e){return e>>>1&1073741824|3221225471&e}var Vn=Object.prototype.valueOf;function Bn(e){switch(typeof e){case"boolean":return e?1108378657:1108378656;case"number":return function(e){if(e!=e||e===1/0)return 0;var t=0|e;t!==e&&(t^=4294967295*e);for(;e>4294967295;)t^=e/=4294967295;return Dn(t)}(e);case"string":return e.length>qn?function(e){var t=Xn[e];void 0===t&&(t=zn(e),Yn===Kn&&(Yn=0,Xn={}),Yn++,Xn[e]=t);return t}(e):zn(e);case"object":case"function":return null===e?1108378658:"function"==typeof e.hashCode?Dn(e.hashCode(e)):(e.valueOf!==Vn&&"function"==typeof e.valueOf&&(e=e.valueOf(e)),function(e){var t;if(Un&&void 0!==(t=Fn.get(e)))return t;if(void 0!==(t=e[Hn]))return t;if(!jn){if(void 0!==(t=e.propertyIsEnumerable&&e.propertyIsEnumerable[Hn]))return t;if(void 0!==(t=function(e){if(e&&e.nodeType>0)switch(e.nodeType){case 1:return e.uniqueID;case 9:return e.documentElement&&e.documentElement.uniqueID}}(e)))return t}t=++Gn,1073741824&Gn&&(Gn=0);if(Un)Fn.set(e,t);else{if(void 0!==Wn&&!1===Wn(e))throw new Error("Non-extensible objects are not allowed as keys.");if(jn)Object.defineProperty(e,Hn,{enumerable:!1,configurable:!1,writable:!1,value:t});else if(void 0!==e.propertyIsEnumerable&&e.propertyIsEnumerable===e.constructor.prototype.propertyIsEnumerable)e.propertyIsEnumerable=function(){return this.constructor.prototype.propertyIsEnumerable.apply(this,arguments)},e.propertyIsEnumerable[Hn]=t;else{if(void 0===e.nodeType)throw new Error("Unable to set a non-enumerable property on object.");e[Hn]=t}}return t}(e));case"undefined":return 1108378659;default:if("function"==typeof e.toString)return zn(e.toString());throw new Error("Value type "+typeof e+" cannot be hashed.")}}function zn(e){for(var t=0,n=0;n<e.length;n++)t=31*t+e.charCodeAt(n)|0;return Dn(t)}var Wn=Object.isExtensible,jn=function(){try{return Object.defineProperty({},"@",{}),!0}catch(e){return!1}}();var Fn,Un="function"==typeof WeakMap;Un&&(Fn=new WeakMap);var Gn=0,Hn="__immutablehash__";"function"==typeof Symbol&&(Hn=Symbol(Hn));var qn=16,Kn=255,Yn=0,Xn={},Qn=function(e){function t(e,t){this._iter=e,this._useKeys=t,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.get=function(e,t){return this._iter.get(e,t)},t.prototype.has=function(e){return this._iter.has(e)},t.prototype.valueSeq=function(){return this._iter.valueSeq()},t.prototype.reverse=function(){var e=this,t=ii(this,!0);return this._useKeys||(t.valueSeq=function(){return e._iter.toSeq().reverse()}),t},t.prototype.map=function(e,t){var n=this,i=ni(this,e,t);return this._useKeys||(i.valueSeq=function(){return n._iter.toSeq().map(e,t)}),i},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t,i){return e(t,i,n)}),t)},t.prototype.__iterator=function(e,t){return this._iter.__iterator(e,t)},t}(En);Qn.prototype[tn]=!0;var Jn=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.includes=function(e){return this._iter.includes(e)},t.prototype.__iterate=function(e,t){var n=this,i=0;return t&&$t(this),this._iter.__iterate((function(r){return e(r,t?n.size-++i:i++,n)}),t)},t.prototype.__iterator=function(e,t){var n=this,i=this._iter.__iterator(sn,t),r=0;return t&&$t(this),new cn((function(){var s=i.next();return s.done?s:ln(e,t?n.size-++r:r++,s.value,s)}))},t}(_n),Zn=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.has=function(e){return this._iter.includes(e)},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){return e(t,t,n)}),t)},t.prototype.__iterator=function(e,t){var n=this._iter.__iterator(sn,t);return new cn((function(){var t=n.next();return t.done?t:ln(e,t.value,t.value,t)}))},t}(bn),ei=function(e){function t(e){this._iter=e,this.size=e.size}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.entrySeq=function(){return this._iter.toSeq()},t.prototype.__iterate=function(e,t){var n=this;return this._iter.__iterate((function(t){if(t){fi(t);var i=zt(t);return e(i?t.get(1):t[1],i?t.get(0):t[0],n)}}),t)},t.prototype.__iterator=function(e,t){var n=this._iter.__iterator(sn,t);return new cn((function(){for(;;){var t=n.next();if(t.done)return t;var i=t.value;if(i){fi(i);var r=zt(i);return ln(e,r?i.get(0):i[0],r?i.get(1):i[1],t)}}}))},t}(En);function ti(e){var t=gi(e);return t._iter=e,t.size=e.size,t.flip=function(){return e},t.reverse=function(){var t=e.reverse.apply(this);return t.flip=function(){return e.reverse()},t},t.has=function(t){return e.includes(t)},t.includes=function(t){return e.has(t)},t.cacheResult=yi,t.__iterateUncached=function(t,n){var i=this;return e.__iterate((function(e,n){return!1!==t(n,e,i)}),n)},t.__iteratorUncached=function(t,n){if(t===on){var i=e.__iterator(t,n);return new cn((function(){var e=i.next();if(!e.done){var t=e.value[0];e.value[0]=e.value[1],e.value[1]=t}return e}))}return e.__iterator(t===sn?rn:sn,n)},t}function ni(e,t,n){var i=gi(e);return i.size=e.size,i.has=function(t){return e.has(t)},i.get=function(i,r){var s=e.get(i,Pt);return s===Pt?r:t.call(n,s,i,e)},i.__iterateUncached=function(i,r){var s=this;return e.__iterate((function(e,r,o){return!1!==i(t.call(n,e,r,o),r,s)}),r)},i.__iteratorUncached=function(i,r){var s=e.__iterator(on,r);return new cn((function(){var r=s.next();if(r.done)return r;var o=r.value,a=o[0];return ln(i,a,t.call(n,o[1],a,e),r)}))},i}function ii(e,t){var n=this,i=gi(e);return i._iter=e,i.size=e.size,i.reverse=function(){return e},e.flip&&(i.flip=function(){var t=ti(e);return t.reverse=function(){return e.flip()},t}),i.get=function(n,i){return e.get(t?n:-1-n,i)},i.has=function(n){return e.has(t?n:-1-n)},i.includes=function(t){return e.includes(t)},i.cacheResult=yi,i.__iterate=function(n,i){var r=this,s=0;return i&&$t(e),e.__iterate((function(e,o){return n(e,t?o:i?r.size-++s:s++,r)}),!i)},i.__iterator=function(i,r){var s=0;r&&$t(e);var o=e.__iterator(on,!r);return new cn((function(){var e=o.next();if(e.done)return e;var a=e.value;return ln(i,t?a[0]:r?n.size-++s:s++,a[1],e)}))},i}function ri(e,t,n,i){var r=gi(e);return i&&(r.has=function(i){var r=e.get(i,Pt);return r!==Pt&&!!t.call(n,r,i,e)},r.get=function(i,r){var s=e.get(i,Pt);return s!==Pt&&t.call(n,s,i,e)?s:r}),r.__iterateUncached=function(r,s){var o=this,a=0;return e.__iterate((function(e,s,h){if(t.call(n,e,s,h))return a++,r(e,i?s:a-1,o)}),s),a},r.__iteratorUncached=function(r,s){var o=e.__iterator(on,s),a=0;return new cn((function(){for(;;){var s=o.next();if(s.done)return s;var h=s.value,u=h[0],c=h[1];if(t.call(n,c,u,e))return ln(r,i?u:a++,c,s)}}))},r}function si(e,t,n,i){var r=e.size;if(Ot(t,n,r))return e;var s=Mt(t,r),o=Lt(n,r);if(s!=s||o!=o)return si(e.toSeq().cacheResult(),t,n,i);var a,h=o-s;h==h&&(a=h<0?0:h);var u=gi(e);return u.size=0===a?a:e.size&&a||void 0,!i&&Qt(e)&&a>=0&&(u.get=function(t,n){return(t=Rt(this,t))>=0&&t<a?e.get(t+s,n):n}),u.__iterateUncached=function(t,n){var r=this;if(0===a)return 0;if(n)return this.cacheResult().__iterate(t,n);var o=0,h=!0,u=0;return e.__iterate((function(e,n){if(!h||!(h=o++<s))return u++,!1!==t(e,i?n:u-1,r)&&u!==a})),u},u.__iteratorUncached=function(t,n){if(0!==a&&n)return this.cacheResult().__iterator(t,n);if(0===a)return new cn(pn);var r=e.__iterator(t,n),o=0,h=0;return new cn((function(){for(;o++<s;)r.next();if(++h>a)return{value:void 0,done:!0};var e=r.next();return i||t===sn||e.done?e:ln(t,h-1,t===rn?void 0:e.value[1],e)}))},u}function oi(e,t,n,i){var r=gi(e);return r.__iterateUncached=function(r,s){var o=this;if(s)return this.cacheResult().__iterate(r,s);var a=!0,h=0;return e.__iterate((function(e,s,u){if(!a||!(a=t.call(n,e,s,u)))return h++,r(e,i?s:h-1,o)})),h},r.__iteratorUncached=function(r,s){var o=this;if(s)return this.cacheResult().__iterator(r,s);var a=e.__iterator(on,s),h=!0,u=0;return new cn((function(){var e,s,c;do{if((e=a.next()).done)return i||r===sn?e:ln(r,u++,r===rn?void 0:e.value[1],e);var l=e.value;s=l[0],c=l[1],h&&(h=t.call(n,c,s,o))}while(h);return r===on?e:ln(r,s,c,e)}))},r}function ai(e,t){var n=jt(e),i=[e].concat(t).map((function(e){return zt(e)?n&&(e=qt(e)):e=n?Pn(e):kn(Array.isArray(e)?e:[e]),e})).filter((function(e){return 0!==e.size}));if(0===i.length)return e;if(1===i.length){var r=i[0];if(r===e||n&&jt(r)||Ut(e)&&Ut(r))return r}var s=new Sn(i);return n?s=s.toKeyedSeq():Ut(e)||(s=s.toSetSeq()),(s=s.flatten(!0)).size=i.reduce((function(e,t){if(void 0!==e){var n=t.size;if(void 0!==n)return e+n}}),0),s}function hi(e,t,n){var i=gi(e);return i.__iterateUncached=function(r,s){if(s)return this.cacheResult().__iterate(r,s);var o=0,a=!1;return function e(h,u){h.__iterate((function(s,h){return(!t||u<t)&&zt(s)?e(s,u+1):(o++,!1===r(s,n?h:o-1,i)&&(a=!0)),!a}),s)}(e,0),o},i.__iteratorUncached=function(i,r){if(r)return this.cacheResult().__iterator(i,r);var s=e.__iterator(i,r),o=[],a=0;return new cn((function(){for(;s;){var e=s.next();if(!1===e.done){var h=e.value;if(i===on&&(h=h[1]),t&&!(o.length<t)||!zt(h))return n?e:ln(i,a++,h,e);o.push(s),s=h.__iterator(i,r)}else s=o.pop()}return{value:void 0,done:!0}}))},i}function ui(e,t,n){t||(t=vi);var i=jt(e),r=0,s=e.toSeq().map((function(t,i){return[i,t,r++,n?n(t,i,e):t]})).valueSeq().toArray();return s.sort((function(e,n){return t(e[3],n[3])||e[2]-n[2]})).forEach(i?function(e,t){s[t].length=2}:function(e,t){s[t]=e[1]}),i?En(s):Ut(e)?_n(s):bn(s)}function ci(e,t,n){if(t||(t=vi),n){var i=e.toSeq().map((function(t,i){return[t,n(t,i,e)]})).reduce((function(e,n){return li(t,e[1],n[1])?n:e}));return i&&i[0]}return e.reduce((function(e,n){return li(t,e,n)?n:e}))}function li(e,t,n){var i=e(n,t);return 0===i&&n!==t&&(null==n||n!=n)||i>0}function pi(e,t,n,i){var r=gi(e),s=new Sn(n).map((function(e){return e.size}));return r.size=i?s.max():s.min(),r.__iterate=function(e,t){for(var n,i=this.__iterator(sn,t),r=0;!(n=i.next()).done&&!1!==e(n.value,r++,this););return r},r.__iteratorUncached=function(e,r){var s=n.map((function(e){return e=Ht(e),mn(r?e.reverse():e)})),o=0,a=!1;return new cn((function(){var n;return a||(n=s.map((function(e){return e.next()})),a=i?n.every((function(e){return e.done})):n.some((function(e){return e.done}))),a?{value:void 0,done:!0}:ln(e,o++,t.apply(null,n.map((function(e){return e.value}))))}))},r}function di(e,t){return e===t?e:Qt(e)?t:e.constructor(t)}function fi(e){if(e!==Object(e))throw new TypeError("Expected [K, V] tuple: "+e)}function mi(e){return jt(e)?qt:Ut(e)?Kt:Yt}function gi(e){return Object.create((jt(e)?En:Ut(e)?_n:bn).prototype)}function yi(){return this._iter.cacheResult?(this._iter.cacheResult(),this.size=this._iter.size,this):xn.prototype.cacheResult.call(this)}function vi(e,t){return void 0===e&&void 0===t?0:void 0===e?1:void 0===t?-1:e>t?1:e<t?-1:0}function xi(e,t){t=t||0;for(var n=Math.max(0,e.length-t),i=new Array(n),r=0;r<n;r++)i[r]=e[r+t];return i}function Ei(e,t){if(!e)throw new Error(t)}function _i(e){Ei(e!==1/0,"Cannot perform this action with an infinite size.")}function bi(e){if(vn(e)&&"string"!=typeof e)return e;if(nn(e))return e.toArray();throw new TypeError("Invalid keyPath: expected Ordered Collection or Array: "+e)}function Si(e){return e&&("function"!=typeof e.constructor||"Object"===e.constructor.name)}function Ai(e){return"object"==typeof e&&(en(e)||Array.isArray(e)||Si(e))}function Ci(e){try{return"string"==typeof e?JSON.stringify(e):String(e)}catch(t){return JSON.stringify(e)}}function Ii(e,t){return en(e)?e.has(t):Ai(e)&&yn.call(e,t)}function wi(e,t,n){return en(e)?e.get(t,n):Ii(e,t)?"function"==typeof e.get?e.get(t):e[t]:n}function Pi(e){if(Array.isArray(e))return xi(e);var t={};for(var n in e)yn.call(e,n)&&(t[n]=e[n]);return t}function ki(e,t){if(!Ai(e))throw new TypeError("Cannot update non-data-structure value: "+e);if(en(e)){if(!e.remove)throw new TypeError("Cannot update immutable value without .remove() method: "+e);return e.remove(t)}if(!yn.call(e,t))return e;var n=Pi(e);return Array.isArray(n)?n.splice(t,1):delete n[t],n}function Ni(e,t,n){if(!Ai(e))throw new TypeError("Cannot update non-data-structure value: "+e);if(en(e)){if(!e.set)throw new TypeError("Cannot update immutable value without .set() method: "+e);return e.set(t,n)}if(yn.call(e,t)&&n===e[t])return e;var i=Pi(e);return i[t]=n,i}function $i(e,t,n,i){i||(i=n,n=void 0);var r=function e(t,n,i,r,s,o){var a=n===Pt;if(r===i.length){var h=a?s:n,u=o(h);return u===h?n:u}if(!a&&!Ai(n))throw new TypeError("Cannot update within non-data-structure value in path ["+i.slice(0,r).map(Ci)+"]: "+n);var c=i[r];var l=a?Pt:wi(n,c,Pt);var p=e(l===Pt?t:en(l),l,i,r+1,s,o);return p===l?n:p===Pt?ki(n,c):Ni(a?t?cr():{}:n,c,p)}(en(e),e,bi(t),0,n,i);return r===Pt?n:r}function Ri(e,t,n){return $i(e,t,Pt,(function(){return n}))}function Ti(e,t){return Ri(this,e,t)}function Oi(e,t){return $i(e,t,(function(){return Pt}))}function Mi(e){return Oi(this,e)}function Li(e,t,n,i){return $i(e,[t],n,i)}function Di(e,t,n){return 1===arguments.length?e(this):Li(this,e,t,n)}function Vi(e,t,n){return $i(this,e,t,n)}function Bi(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return Wi(this,e)}function zi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];if("function"!=typeof e)throw new TypeError("Invalid merger function: "+e);return Wi(this,t,e)}function Wi(e,t,n){for(var i=[],r=0;r<t.length;r++){var s=qt(t[r]);0!==s.size&&i.push(s)}return 0===i.length?e:0!==e.toSeq().size||e.__ownerID||1!==i.length?e.withMutations((function(e){for(var t=n?function(t,i){Li(e,i,Pt,(function(e){return e===Pt?t:n(e,t,i)}))}:function(t,n){e.set(n,t)},r=0;r<i.length;r++)i[r].forEach(t)})):e.constructor(i[0])}function ji(e,t,n){return Fi(e,t,function(e){return function t(n,i,r){return Ai(n)&&Ai(i)?Fi(n,[i],t):e?e(n,i,r):i}}(n))}function Fi(e,t,n){if(!Ai(e))throw new TypeError("Cannot merge into non-data-structure value: "+e);if(en(e))return"function"==typeof n&&e.mergeWith?e.mergeWith.apply(e,[n].concat(t)):e.merge?e.merge.apply(e,t):e.concat.apply(e,t);for(var i=Array.isArray(e),r=e,s=i?Kt:qt,o=i?function(t){r===e&&(r=Pi(r)),r.push(t)}:function(t,i){var s=yn.call(r,i),o=s&&n?n(r[i],t,i):t;s&&o===r[i]||(r===e&&(r=Pi(r)),r[i]=o)},a=0;a<t.length;a++)s(t[a]).forEach(o);return r}function Ui(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return ji(this,e)}function Gi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return ji(this,t,e)}function Hi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return $i(this,e,cr(),(function(e){return Fi(e,t)}))}function qi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return $i(this,e,cr(),(function(e){return ji(e,t)}))}function Ki(e){var t=this.asMutable();return e(t),t.wasAltered()?t.__ensureOwner(this.__ownerID):this}function Yi(){return this.__ownerID?this:this.__ensureOwner(new Nt)}function Xi(){return this.__ensureOwner()}function Qi(){return this.__altered}Jn.prototype.cacheResult=Qn.prototype.cacheResult=Zn.prototype.cacheResult=ei.prototype.cacheResult=yi;var Ji=function(e){function t(t){return null==t?cr():Rn(t)&&!nn(t)?t:cr().withMutations((function(n){var i=e(t);_i(i.size),i.forEach((function(e,t){return n.set(t,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return cr().withMutations((function(t){for(var n=0;n<e.length;n+=2){if(n+1>=e.length)throw new Error("Missing value for key: "+e[n]);t.set(e[n],e[n+1])}}))},t.prototype.toString=function(){return this.__toString("Map {","}")},t.prototype.get=function(e,t){return this._root?this._root.get(0,void 0,e,t):t},t.prototype.set=function(e,t){return lr(this,e,t)},t.prototype.remove=function(e){return lr(this,e,Pt)},t.prototype.deleteAll=function(e){var t=Ht(e);return 0===t.size?this:this.withMutations((function(e){t.forEach((function(t){return e.remove(t)}))}))},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._root=null,this.__hash=void 0,this.__altered=!0,this):cr()},t.prototype.sort=function(e){return Lr(ui(this,e))},t.prototype.sortBy=function(e,t){return Lr(ui(this,t,e))},t.prototype.map=function(e,t){return this.withMutations((function(n){n.forEach((function(i,r){n.set(r,e.call(t,i,r,n))}))}))},t.prototype.__iterator=function(e,t){return new or(this,e,t)},t.prototype.__iterate=function(e,t){var n=this,i=0;return this._root&&this._root.iterate((function(t){return i++,e(t[1],t[0],n)}),t),i},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?ur(this.size,this._root,e,this.__hash):0===this.size?cr():(this.__ownerID=e,this.__altered=!1,this)},t}(qt);Ji.isMap=Rn;var Zi=Ji.prototype;Zi[$n]=!0,Zi.delete=Zi.remove,Zi.removeAll=Zi.deleteAll,Zi.setIn=Ti,Zi.removeIn=Zi.deleteIn=Mi,Zi.update=Di,Zi.updateIn=Vi,Zi.merge=Zi.concat=Bi,Zi.mergeWith=zi,Zi.mergeDeep=Ui,Zi.mergeDeepWith=Gi,Zi.mergeIn=Hi,Zi.mergeDeepIn=qi,Zi.withMutations=Ki,Zi.wasAltered=Qi,Zi.asImmutable=Xi,Zi["@@transducer/init"]=Zi.asMutable=Yi,Zi["@@transducer/step"]=function(e,t){return e.set(t[0],t[1])},Zi["@@transducer/result"]=function(e){return e.asImmutable()};var er=function(e,t){this.ownerID=e,this.entries=t};er.prototype.get=function(e,t,n,i){for(var r=this.entries,s=0,o=r.length;s<o;s++)if(Mn(n,r[s][0]))return r[s][1];return i},er.prototype.update=function(e,t,n,i,r,s,o){for(var a=r===Pt,h=this.entries,u=0,c=h.length;u<c&&!Mn(i,h[u][0]);u++);var l=u<c;if(l?h[u][1]===r:a)return this;if(kt(o),(a||!l)&&kt(s),!a||1!==h.length){if(!l&&!a&&h.length>=yr)return function(e,t,n,i){e||(e=new Nt);for(var r=new rr(e,Bn(n),[n,i]),s=0;s<t.length;s++){var o=t[s];r=r.update(e,0,void 0,o[0],o[1])}return r}(e,h,i,r);var p=e&&e===this.ownerID,d=p?h:xi(h);return l?a?u===c-1?d.pop():d[u]=d.pop():d[u]=[i,r]:d.push([i,r]),p?(this.entries=d,this):new er(e,d)}};var tr=function(e,t,n){this.ownerID=e,this.bitmap=t,this.nodes=n};tr.prototype.get=function(e,t,n,i){void 0===t&&(t=Bn(n));var r=1<<((0===e?t:t>>>e)&wt),s=this.bitmap;return 0==(s&r)?i:this.nodes[mr(s&r-1)].get(e+Ct,t,n,i)},tr.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Bn(i));var a=(0===t?n:n>>>t)&wt,h=1<<a,u=this.bitmap,c=0!=(u&h);if(!c&&r===Pt)return this;var l=mr(u&h-1),p=this.nodes,d=c?p[l]:void 0,f=pr(d,e,t+Ct,n,i,r,s,o);if(f===d)return this;if(!c&&f&&p.length>=vr)return function(e,t,n,i,r){for(var s=0,o=new Array(It),a=0;0!==n;a++,n>>>=1)o[a]=1&n?t[s++]:void 0;return o[i]=r,new nr(e,s+1,o)}(e,p,u,a,f);if(c&&!f&&2===p.length&&dr(p[1^l]))return p[1^l];if(c&&f&&1===p.length&&dr(f))return f;var m=e&&e===this.ownerID,g=c?f?u:u^h:u|h,y=c?f?gr(p,l,f,m):function(e,t,n){var i=e.length-1;if(n&&t===i)return e.pop(),e;for(var r=new Array(i),s=0,o=0;o<i;o++)o===t&&(s=1),r[o]=e[o+s];return r}(p,l,m):function(e,t,n,i){var r=e.length+1;if(i&&t+1===r)return e[t]=n,e;for(var s=new Array(r),o=0,a=0;a<r;a++)a===t?(s[a]=n,o=-1):s[a]=e[a+o];return s}(p,l,f,m);return m?(this.bitmap=g,this.nodes=y,this):new tr(e,g,y)};var nr=function(e,t,n){this.ownerID=e,this.count=t,this.nodes=n};nr.prototype.get=function(e,t,n,i){void 0===t&&(t=Bn(n));var r=(0===e?t:t>>>e)&wt,s=this.nodes[r];return s?s.get(e+Ct,t,n,i):i},nr.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Bn(i));var a=(0===t?n:n>>>t)&wt,h=r===Pt,u=this.nodes,c=u[a];if(h&&!c)return this;var l=pr(c,e,t+Ct,n,i,r,s,o);if(l===c)return this;var p=this.count;if(c){if(!l&&--p<xr)return function(e,t,n,i){for(var r=0,s=0,o=new Array(n),a=0,h=1,u=t.length;a<u;a++,h<<=1){var c=t[a];void 0!==c&&a!==i&&(r|=h,o[s++]=c)}return new tr(e,r,o)}(e,u,p,a)}else p++;var d=e&&e===this.ownerID,f=gr(u,a,l,d);return d?(this.count=p,this.nodes=f,this):new nr(e,p,f)};var ir=function(e,t,n){this.ownerID=e,this.keyHash=t,this.entries=n};ir.prototype.get=function(e,t,n,i){for(var r=this.entries,s=0,o=r.length;s<o;s++)if(Mn(n,r[s][0]))return r[s][1];return i},ir.prototype.update=function(e,t,n,i,r,s,o){void 0===n&&(n=Bn(i));var a=r===Pt;if(n!==this.keyHash)return a?this:(kt(o),kt(s),fr(this,e,t,n,[i,r]));for(var h=this.entries,u=0,c=h.length;u<c&&!Mn(i,h[u][0]);u++);var l=u<c;if(l?h[u][1]===r:a)return this;if(kt(o),(a||!l)&&kt(s),a&&2===c)return new rr(e,this.keyHash,h[1^u]);var p=e&&e===this.ownerID,d=p?h:xi(h);return l?a?u===c-1?d.pop():d[u]=d.pop():d[u]=[i,r]:d.push([i,r]),p?(this.entries=d,this):new ir(e,this.keyHash,d)};var rr=function(e,t,n){this.ownerID=e,this.keyHash=t,this.entry=n};rr.prototype.get=function(e,t,n,i){return Mn(n,this.entry[0])?this.entry[1]:i},rr.prototype.update=function(e,t,n,i,r,s,o){var a=r===Pt,h=Mn(i,this.entry[0]);return(h?r===this.entry[1]:a)?this:(kt(o),a?void kt(s):h?e&&e===this.ownerID?(this.entry[1]=r,this):new rr(e,this.keyHash,[i,r]):(kt(s),fr(this,e,t,Bn(i),[i,r])))},er.prototype.iterate=ir.prototype.iterate=function(e,t){for(var n=this.entries,i=0,r=n.length-1;i<=r;i++)if(!1===e(n[t?r-i:i]))return!1},tr.prototype.iterate=nr.prototype.iterate=function(e,t){for(var n=this.nodes,i=0,r=n.length-1;i<=r;i++){var s=n[t?r-i:i];if(s&&!1===s.iterate(e,t))return!1}},rr.prototype.iterate=function(e,t){return e(this.entry)};var sr,or=function(e){function t(e,t,n){this._type=t,this._reverse=n,this._stack=e._root&&hr(e._root)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.next=function(){for(var e=this._type,t=this._stack;t;){var n=t.node,i=t.index++,r=void 0;if(n.entry){if(0===i)return ar(e,n.entry)}else if(n.entries){if(i<=(r=n.entries.length-1))return ar(e,n.entries[this._reverse?r-i:i])}else if(i<=(r=n.nodes.length-1)){var s=n.nodes[this._reverse?r-i:i];if(s){if(s.entry)return ar(e,s.entry);t=this._stack=hr(s,t)}continue}t=this._stack=this._stack.__prev}return{value:void 0,done:!0}},t}(cn);function ar(e,t){return ln(e,t[0],t[1])}function hr(e,t){return{node:e,index:0,__prev:t}}function ur(e,t,n,i){var r=Object.create(Zi);return r.size=e,r._root=t,r.__ownerID=n,r.__hash=i,r.__altered=!1,r}function cr(){return sr||(sr=ur(0))}function lr(e,t,n){var i,r;if(e._root){var s={value:!1},o={value:!1};if(i=pr(e._root,e.__ownerID,0,void 0,t,n,s,o),!o.value)return e;r=e.size+(s.value?n===Pt?-1:1:0)}else{if(n===Pt)return e;r=1,i=new er(e.__ownerID,[[t,n]])}return e.__ownerID?(e.size=r,e._root=i,e.__hash=void 0,e.__altered=!0,e):i?ur(r,i):cr()}function pr(e,t,n,i,r,s,o,a){return e?e.update(t,n,i,r,s,o,a):s===Pt?e:(kt(a),kt(o),new rr(t,i,[r,s]))}function dr(e){return e.constructor===rr||e.constructor===ir}function fr(e,t,n,i,r){if(e.keyHash===i)return new ir(t,i,[e.entry,r]);var s,o=(0===n?e.keyHash:e.keyHash>>>n)&wt,a=(0===n?i:i>>>n)&wt,h=o===a?[fr(e,t,n+Ct,i,r)]:(s=new rr(t,i,r),o<a?[e,s]:[s,e]);return new tr(t,1<<o|1<<a,h)}function mr(e){return e=(e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)}function gr(e,t,n,i){var r=i?e:xi(e);return r[t]=n,r}var yr=It/4,vr=It/2,xr=It/4,Er="@@__IMMUTABLE_LIST__@@";function _r(e){return Boolean(e&&e[Er])}var br=function(e){function t(t){var n=kr();if(null==t)return n;if(_r(t))return t;var i=e(t),r=i.size;return 0===r?n:(_i(r),r>0&&r<It?Pr(0,r,Ct,null,new Ar(i.toArray())):n.withMutations((function(e){e.setSize(r),i.forEach((function(t,n){return e.set(n,t)}))})))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("List [","]")},t.prototype.get=function(e,t){if((e=Rt(this,e))>=0&&e<this.size){var n=Rr(this,e+=this._origin);return n&&n.array[e&wt]}return t},t.prototype.set=function(e,t){return function(e,t,n){if((t=Rt(e,t))!=t)return e;if(t>=e.size||t<0)return e.withMutations((function(e){t<0?Tr(e,t).set(0,n):Tr(e,0,t+1).set(t,n)}));t+=e._origin;var i=e._tail,r=e._root,s={value:!1};t>=Or(e._capacity)?i=Nr(i,e.__ownerID,0,t,n,s):r=Nr(r,e.__ownerID,e._level,t,n,s);if(!s.value)return e;if(e.__ownerID)return e._root=r,e._tail=i,e.__hash=void 0,e.__altered=!0,e;return Pr(e._origin,e._capacity,e._level,r,i)}(this,e,t)},t.prototype.remove=function(e){return this.has(e)?0===e?this.shift():e===this.size-1?this.pop():this.splice(e,1):this},t.prototype.insert=function(e,t){return this.splice(e,0,t)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=this._origin=this._capacity=0,this._level=Ct,this._root=this._tail=null,this.__hash=void 0,this.__altered=!0,this):kr()},t.prototype.push=function(){var e=arguments,t=this.size;return this.withMutations((function(n){Tr(n,0,t+e.length);for(var i=0;i<e.length;i++)n.set(t+i,e[i])}))},t.prototype.pop=function(){return Tr(this,0,-1)},t.prototype.unshift=function(){var e=arguments;return this.withMutations((function(t){Tr(t,-e.length);for(var n=0;n<e.length;n++)t.set(n,e[n])}))},t.prototype.shift=function(){return Tr(this,1)},t.prototype.concat=function(){for(var t=arguments,n=[],i=0;i<arguments.length;i++){var r=t[i],s=e("string"!=typeof r&&dn(r)?r:[r]);0!==s.size&&n.push(s)}return 0===n.length?this:0!==this.size||this.__ownerID||1!==n.length?this.withMutations((function(e){n.forEach((function(t){return t.forEach((function(t){return e.push(t)}))}))})):this.constructor(n[0])},t.prototype.setSize=function(e){return Tr(this,0,e)},t.prototype.map=function(e,t){var n=this;return this.withMutations((function(i){for(var r=0;r<n.size;r++)i.set(r,e.call(t,i.get(r),r,i))}))},t.prototype.slice=function(e,t){var n=this.size;return Ot(e,t,n)?this:Tr(this,Mt(e,n),Lt(t,n))},t.prototype.__iterator=function(e,t){var n=t?this.size:0,i=wr(this,t);return new cn((function(){var r=i();return r===Ir?{value:void 0,done:!0}:ln(e,t?--n:n++,r)}))},t.prototype.__iterate=function(e,t){for(var n,i=t?this.size:0,r=wr(this,t);(n=r())!==Ir&&!1!==e(n,t?--i:i++,this););return i},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Pr(this._origin,this._capacity,this._level,this._root,this._tail,e,this.__hash):0===this.size?kr():(this.__ownerID=e,this.__altered=!1,this)},t}(Kt);br.isList=_r;var Sr=br.prototype;Sr[Er]=!0,Sr.delete=Sr.remove,Sr.merge=Sr.concat,Sr.setIn=Ti,Sr.deleteIn=Sr.removeIn=Mi,Sr.update=Di,Sr.updateIn=Vi,Sr.mergeIn=Hi,Sr.mergeDeepIn=qi,Sr.withMutations=Ki,Sr.wasAltered=Qi,Sr.asImmutable=Xi,Sr["@@transducer/init"]=Sr.asMutable=Yi,Sr["@@transducer/step"]=function(e,t){return e.push(t)},Sr["@@transducer/result"]=function(e){return e.asImmutable()};var Ar=function(e,t){this.array=e,this.ownerID=t};Ar.prototype.removeBefore=function(e,t,n){if(n===t?1<<t:0===this.array.length)return this;var i=n>>>t&wt;if(i>=this.array.length)return new Ar([],e);var r,s=0===i;if(t>0){var o=this.array[i];if((r=o&&o.removeBefore(e,t-Ct,n))===o&&s)return this}if(s&&!r)return this;var a=$r(this,e);if(!s)for(var h=0;h<i;h++)a.array[h]=void 0;return r&&(a.array[i]=r),a},Ar.prototype.removeAfter=function(e,t,n){if(n===(t?1<<t:0)||0===this.array.length)return this;var i,r=n-1>>>t&wt;if(r>=this.array.length)return this;if(t>0){var s=this.array[r];if((i=s&&s.removeAfter(e,t-Ct,n))===s&&r===this.array.length-1)return this}var o=$r(this,e);return o.array.splice(r+1),i&&(o.array[r]=i),o};var Cr,Ir={};function wr(e,t){var n=e._origin,i=e._capacity,r=Or(i),s=e._tail;return o(e._root,e._level,0);function o(e,a,h){return 0===a?function(e,o){var a=o===r?s&&s.array:e&&e.array,h=o>n?0:n-o,u=i-o;u>It&&(u=It);return function(){if(h===u)return Ir;var e=t?--u:h++;return a&&a[e]}}(e,h):function(e,r,s){var a,h=e&&e.array,u=s>n?0:n-s>>r,c=1+(i-s>>r);c>It&&(c=It);return function(){for(;;){if(a){var e=a();if(e!==Ir)return e;a=null}if(u===c)return Ir;var n=t?--c:u++;a=o(h&&h[n],r-Ct,s+(n<<r))}}}(e,a,h)}}function Pr(e,t,n,i,r,s,o){var a=Object.create(Sr);return a.size=t-e,a._origin=e,a._capacity=t,a._level=n,a._root=i,a._tail=r,a.__ownerID=s,a.__hash=o,a.__altered=!1,a}function kr(){return Cr||(Cr=Pr(0,0,Ct))}function Nr(e,t,n,i,r,s){var o,a=i>>>n&wt,h=e&&a<e.array.length;if(!h&&void 0===r)return e;if(n>0){var u=e&&e.array[a],c=Nr(u,t,n-Ct,i,r,s);return c===u?e:((o=$r(e,t)).array[a]=c,o)}return h&&e.array[a]===r?e:(s&&kt(s),o=$r(e,t),void 0===r&&a===o.array.length-1?o.array.pop():o.array[a]=r,o)}function $r(e,t){return t&&e&&t===e.ownerID?e:new Ar(e?e.array.slice():[],t)}function Rr(e,t){if(t>=Or(e._capacity))return e._tail;if(t<1<<e._level+Ct){for(var n=e._root,i=e._level;n&&i>0;)n=n.array[t>>>i&wt],i-=Ct;return n}}function Tr(e,t,n){void 0!==t&&(t|=0),void 0!==n&&(n|=0);var i=e.__ownerID||new Nt,r=e._origin,s=e._capacity,o=r+t,a=void 0===n?s:n<0?s+n:r+n;if(o===r&&a===s)return e;if(o>=a)return e.clear();for(var h=e._level,u=e._root,c=0;o+c<0;)u=new Ar(u&&u.array.length?[void 0,u]:[],i),c+=1<<(h+=Ct);c&&(o+=c,r+=c,a+=c,s+=c);for(var l=Or(s),p=Or(a);p>=1<<h+Ct;)u=new Ar(u&&u.array.length?[u]:[],i),h+=Ct;var d=e._tail,f=p<l?Rr(e,a-1):p>l?new Ar([],i):d;if(d&&p>l&&o<s&&d.array.length){for(var m=u=$r(u,i),g=h;g>Ct;g-=Ct){var y=l>>>g&wt;m=m.array[y]=$r(m.array[y],i)}m.array[l>>>Ct&wt]=d}if(a<s&&(f=f&&f.removeAfter(i,0,a)),o>=p)o-=p,a-=p,h=Ct,u=null,f=f&&f.removeBefore(i,0,o);else if(o>r||p<l){for(c=0;u;){var v=o>>>h&wt;if(v!==p>>>h&wt)break;v&&(c+=(1<<h)*v),h-=Ct,u=u.array[v]}u&&o>r&&(u=u.removeBefore(i,h,o-c)),u&&p<l&&(u=u.removeAfter(i,h,p-c)),c&&(o-=c,a-=c)}return e.__ownerID?(e.size=a-o,e._origin=o,e._capacity=a,e._level=h,e._root=u,e._tail=f,e.__hash=void 0,e.__altered=!0,e):Pr(o,a,h,u,f)}function Or(e){return e<It?0:e-1>>>Ct<<Ct}var Mr,Lr=function(e){function t(e){return null==e?Vr():Tn(e)?e:Vr().withMutations((function(t){var n=qt(e);_i(n.size),n.forEach((function(e,n){return t.set(n,e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("OrderedMap {","}")},t.prototype.get=function(e,t){var n=this._map.get(e);return void 0!==n?this._list.get(n)[1]:t},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._map.clear(),this._list.clear(),this):Vr()},t.prototype.set=function(e,t){return Br(this,e,t)},t.prototype.remove=function(e){return Br(this,e,Pt)},t.prototype.wasAltered=function(){return this._map.wasAltered()||this._list.wasAltered()},t.prototype.__iterate=function(e,t){var n=this;return this._list.__iterate((function(t){return t&&e(t[1],t[0],n)}),t)},t.prototype.__iterator=function(e,t){return this._list.fromEntrySeq().__iterator(e,t)},t.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e),n=this._list.__ensureOwner(e);return e?Dr(t,n,e,this.__hash):0===this.size?Vr():(this.__ownerID=e,this._map=t,this._list=n,this)},t}(Ji);function Dr(e,t,n,i){var r=Object.create(Lr.prototype);return r.size=e?e.size:0,r._map=e,r._list=t,r.__ownerID=n,r.__hash=i,r}function Vr(){return Mr||(Mr=Dr(cr(),kr()))}function Br(e,t,n){var i,r,s=e._map,o=e._list,a=s.get(t),h=void 0!==a;if(n===Pt){if(!h)return e;o.size>=It&&o.size>=2*s.size?(i=(r=o.filter((function(e,t){return void 0!==e&&a!==t}))).toKeyedSeq().map((function(e){return e[0]})).flip().toMap(),e.__ownerID&&(i.__ownerID=r.__ownerID=e.__ownerID)):(i=s.remove(t),r=a===o.size-1?o.pop():o.set(a,void 0))}else if(h){if(n===o.get(a)[1])return e;i=s,r=o.set(a,[t,n])}else i=s.set(t,o.size),r=o.set(o.size,[t,n]);return e.__ownerID?(e.size=i.size,e._map=i,e._list=r,e.__hash=void 0,e):Dr(i,r)}Lr.isOrderedMap=Tn,Lr.prototype[tn]=!0,Lr.prototype.delete=Lr.prototype.remove;var zr="@@__IMMUTABLE_STACK__@@";function Wr(e){return Boolean(e&&e[zr])}var jr=function(e){function t(e){return null==e?Hr():Wr(e)?e:Hr().pushAll(e)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.prototype.toString=function(){return this.__toString("Stack [","]")},t.prototype.get=function(e,t){var n=this._head;for(e=Rt(this,e);n&&e--;)n=n.next;return n?n.value:t},t.prototype.peek=function(){return this._head&&this._head.value},t.prototype.push=function(){var e=arguments;if(0===arguments.length)return this;for(var t=this.size+arguments.length,n=this._head,i=arguments.length-1;i>=0;i--)n={value:e[i],next:n};return this.__ownerID?(this.size=t,this._head=n,this.__hash=void 0,this.__altered=!0,this):Gr(t,n)},t.prototype.pushAll=function(t){if(0===(t=e(t)).size)return this;if(0===this.size&&Wr(t))return t;_i(t.size);var n=this.size,i=this._head;return t.__iterate((function(e){n++,i={value:e,next:i}}),!0),this.__ownerID?(this.size=n,this._head=i,this.__hash=void 0,this.__altered=!0,this):Gr(n,i)},t.prototype.pop=function(){return this.slice(1)},t.prototype.clear=function(){return 0===this.size?this:this.__ownerID?(this.size=0,this._head=void 0,this.__hash=void 0,this.__altered=!0,this):Hr()},t.prototype.slice=function(t,n){if(Ot(t,n,this.size))return this;var i=Mt(t,this.size);if(Lt(n,this.size)!==this.size)return e.prototype.slice.call(this,t,n);for(var r=this.size-i,s=this._head;i--;)s=s.next;return this.__ownerID?(this.size=r,this._head=s,this.__hash=void 0,this.__altered=!0,this):Gr(r,s)},t.prototype.__ensureOwner=function(e){return e===this.__ownerID?this:e?Gr(this.size,this._head,e,this.__hash):0===this.size?Hr():(this.__ownerID=e,this.__altered=!1,this)},t.prototype.__iterate=function(e,t){var n=this;if(t)return new Sn(this.toArray()).__iterate((function(t,i){return e(t,i,n)}),t);for(var i=0,r=this._head;r&&!1!==e(r.value,i++,this);)r=r.next;return i},t.prototype.__iterator=function(e,t){if(t)return new Sn(this.toArray()).__iterator(e,t);var n=0,i=this._head;return new cn((function(){if(i){var t=i.value;return i=i.next,ln(e,n++,t)}return{value:void 0,done:!0}}))},t}(Kt);jr.isStack=Wr;var Fr,Ur=jr.prototype;function Gr(e,t,n,i){var r=Object.create(Ur);return r.size=e,r._head=t,r.__ownerID=n,r.__hash=i,r.__altered=!1,r}function Hr(){return Fr||(Fr=Gr(0))}Ur[zr]=!0,Ur.shift=Ur.pop,Ur.unshift=Ur.push,Ur.unshiftAll=Ur.pushAll,Ur.withMutations=Ki,Ur.wasAltered=Qi,Ur.asImmutable=Xi,Ur["@@transducer/init"]=Ur.asMutable=Yi,Ur["@@transducer/step"]=function(e,t){return e.unshift(t)},Ur["@@transducer/result"]=function(e){return e.asImmutable()};var qr="@@__IMMUTABLE_SET__@@";function Kr(e){return Boolean(e&&e[qr])}function Yr(e){return Kr(e)&&nn(e)}function Xr(e,t){if(e===t)return!0;if(!zt(t)||void 0!==e.size&&void 0!==t.size&&e.size!==t.size||void 0!==e.__hash&&void 0!==t.__hash&&e.__hash!==t.__hash||jt(e)!==jt(t)||Ut(e)!==Ut(t)||nn(e)!==nn(t))return!1;if(0===e.size&&0===t.size)return!0;var n=!Gt(e);if(nn(e)){var i=e.entries();return t.every((function(e,t){var r=i.next().value;return r&&Mn(r[1],e)&&(n||Mn(r[0],t))}))&&i.next().done}var r=!1;if(void 0===e.size)if(void 0===t.size)"function"==typeof e.cacheResult&&e.cacheResult();else{r=!0;var s=e;e=t,t=s}var o=!0,a=t.__iterate((function(t,i){if(n?!e.has(t):r?!Mn(t,e.get(i,Pt)):!Mn(e.get(i,Pt),t))return o=!1,!1}));return o&&e.size===a}function Qr(e,t){var n=function(n){e.prototype[n]=t[n]};return Object.keys(t).forEach(n),Object.getOwnPropertySymbols&&Object.getOwnPropertySymbols(t).forEach(n),e}function Jr(e){if(!e||"object"!=typeof e)return e;if(!zt(e)){if(!Ai(e))return e;e=xn(e)}if(jt(e)){var t={};return e.__iterate((function(e,n){t[n]=Jr(e)})),t}var n=[];return e.__iterate((function(e){n.push(Jr(e))})),n}var Zr=function(e){function t(t){return null==t?rs():Kr(t)&&!nn(t)?t:rs().withMutations((function(n){var i=e(t);_i(i.size),i.forEach((function(e){return n.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(qt(e).keySeq())},t.intersect=function(e){return(e=Ht(e).toArray()).length?ts.intersect.apply(t(e.pop()),e):rs()},t.union=function(e){return(e=Ht(e).toArray()).length?ts.union.apply(t(e.pop()),e):rs()},t.prototype.toString=function(){return this.__toString("Set {","}")},t.prototype.has=function(e){return this._map.has(e)},t.prototype.add=function(e){return ns(this,this._map.set(e,e))},t.prototype.remove=function(e){return ns(this,this._map.remove(e))},t.prototype.clear=function(){return ns(this,this._map.clear())},t.prototype.map=function(e,t){var n=this,i=[],r=[];return this.forEach((function(s){var o=e.call(t,s,s,n);o!==s&&(i.push(s),r.push(o))})),this.withMutations((function(e){i.forEach((function(t){return e.remove(t)})),r.forEach((function(t){return e.add(t)}))}))},t.prototype.union=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return 0===(t=t.filter((function(e){return 0!==e.size}))).length?this:0!==this.size||this.__ownerID||1!==t.length?this.withMutations((function(n){for(var i=0;i<t.length;i++)e(t[i]).forEach((function(e){return n.add(e)}))})):this.constructor(t[0])},t.prototype.intersect=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];if(0===t.length)return this;t=t.map((function(t){return e(t)}));var i=[];return this.forEach((function(e){t.every((function(t){return t.includes(e)}))||i.push(e)})),this.withMutations((function(e){i.forEach((function(t){e.remove(t)}))}))},t.prototype.subtract=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];if(0===t.length)return this;t=t.map((function(t){return e(t)}));var i=[];return this.forEach((function(e){t.some((function(t){return t.includes(e)}))&&i.push(e)})),this.withMutations((function(e){i.forEach((function(t){e.remove(t)}))}))},t.prototype.sort=function(e){return bs(ui(this,e))},t.prototype.sortBy=function(e,t){return bs(ui(this,t,e))},t.prototype.wasAltered=function(){return this._map.wasAltered()},t.prototype.__iterate=function(e,t){var n=this;return this._map.__iterate((function(t){return e(t,t,n)}),t)},t.prototype.__iterator=function(e,t){return this._map.__iterator(e,t)},t.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._map.__ensureOwner(e);return e?this.__make(t,e):0===this.size?this.__empty():(this.__ownerID=e,this._map=t,this)},t}(Yt);Zr.isSet=Kr;var es,ts=Zr.prototype;function ns(e,t){return e.__ownerID?(e.size=t.size,e._map=t,e):t===e._map?e:0===t.size?e.__empty():e.__make(t)}function is(e,t){var n=Object.create(ts);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function rs(){return es||(es=is(cr()))}ts[qr]=!0,ts.delete=ts.remove,ts.merge=ts.concat=ts.union,ts.withMutations=Ki,ts.asImmutable=Xi,ts["@@transducer/init"]=ts.asMutable=Yi,ts["@@transducer/step"]=function(e,t){return e.add(t)},ts["@@transducer/result"]=function(e){return e.asImmutable()},ts.__empty=rs,ts.__make=is;var ss,os=function(e){function t(e,n,i){if(!(this instanceof t))return new t(e,n,i);if(Ei(0!==i,"Cannot step a Range by 0"),e=e||0,void 0===n&&(n=1/0),i=void 0===i?1:Math.abs(i),n<e&&(i=-i),this._start=e,this._end=n,this._step=i,this.size=Math.max(0,Math.ceil((n-e)/i-1)+1),0===this.size){if(ss)return ss;ss=this}}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return 0===this.size?"Range []":"Range [ "+this._start+"..."+this._end+(1!==this._step?" by "+this._step:"")+" ]"},t.prototype.get=function(e,t){return this.has(e)?this._start+Rt(this,e)*this._step:t},t.prototype.includes=function(e){var t=(e-this._start)/this._step;return t>=0&&t<this.size&&t===Math.floor(t)},t.prototype.slice=function(e,n){return Ot(e,n,this.size)?this:(e=Mt(e,this.size),(n=Lt(n,this.size))<=e?new t(0,0):new t(this.get(e,this._end),this.get(n,this._end),this._step))},t.prototype.indexOf=function(e){var t=e-this._start;if(t%this._step==0){var n=t/this._step;if(n>=0&&n<this.size)return n}return-1},t.prototype.lastIndexOf=function(e){return this.indexOf(e)},t.prototype.__iterate=function(e,t){for(var n=this.size,i=this._step,r=t?this._start+(n-1)*i:this._start,s=0;s!==n&&!1!==e(r,t?n-++s:s++,this);)r+=t?-i:i;return s},t.prototype.__iterator=function(e,t){var n=this.size,i=this._step,r=t?this._start+(n-1)*i:this._start,s=0;return new cn((function(){if(s===n)return{value:void 0,done:!0};var o=r;return r+=t?-i:i,ln(e,t?n-++s:s++,o)}))},t.prototype.equals=function(e){return e instanceof t?this._start===e._start&&this._end===e._end&&this._step===e._step:Xr(this,e)},t}(_n);function as(e,t,n){for(var i=bi(t),r=0;r!==i.length;)if((e=wi(e,i[r++],Pt))===Pt)return n;return e}function hs(e,t){return as(this,e,t)}function us(e,t){return as(e,t,Pt)!==Pt}function cs(){_i(this.size);var e={};return this.__iterate((function(t,n){e[n]=t})),e}Ht.isIterable=zt,Ht.isKeyed=jt,Ht.isIndexed=Ut,Ht.isAssociative=Gt,Ht.isOrdered=nn,Ht.Iterator=cn,Qr(Ht,{toArray:function(){_i(this.size);var e=new Array(this.size||0),t=jt(this),n=0;return this.__iterate((function(i,r){e[n++]=t?[r,i]:i})),e},toIndexedSeq:function(){return new Jn(this)},toJS:function(){return Jr(this)},toKeyedSeq:function(){return new Qn(this,!0)},toMap:function(){return Ji(this.toKeyedSeq())},toObject:cs,toOrderedMap:function(){return Lr(this.toKeyedSeq())},toOrderedSet:function(){return bs(jt(this)?this.valueSeq():this)},toSet:function(){return Zr(jt(this)?this.valueSeq():this)},toSetSeq:function(){return new Zn(this)},toSeq:function(){return Ut(this)?this.toIndexedSeq():jt(this)?this.toKeyedSeq():this.toSetSeq()},toStack:function(){return jr(jt(this)?this.valueSeq():this)},toList:function(){return br(jt(this)?this.valueSeq():this)},toString:function(){return"[Collection]"},__toString:function(e,t){return 0===this.size?e+t:e+" "+this.toSeq().map(this.__toStringMapper).join(", ")+" "+t},concat:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return di(this,ai(this,e))},includes:function(e){return this.some((function(t){return Mn(t,e)}))},entries:function(){return this.__iterator(on)},every:function(e,t){_i(this.size);var n=!0;return this.__iterate((function(i,r,s){if(!e.call(t,i,r,s))return n=!1,!1})),n},filter:function(e,t){return di(this,ri(this,e,t,!0))},find:function(e,t,n){var i=this.findEntry(e,t);return i?i[1]:n},forEach:function(e,t){return _i(this.size),this.__iterate(t?e.bind(t):e)},join:function(e){_i(this.size),e=void 0!==e?""+e:",";var t="",n=!0;return this.__iterate((function(i){n?n=!1:t+=e,t+=null!=i?i.toString():""})),t},keys:function(){return this.__iterator(rn)},map:function(e,t){return di(this,ni(this,e,t))},reduce:function(e,t,n){return fs(this,e,t,n,arguments.length<2,!1)},reduceRight:function(e,t,n){return fs(this,e,t,n,arguments.length<2,!0)},reverse:function(){return di(this,ii(this,!0))},slice:function(e,t){return di(this,si(this,e,t,!0))},some:function(e,t){return!this.every(ys(e),t)},sort:function(e){return di(this,ui(this,e))},values:function(){return this.__iterator(sn)},butLast:function(){return this.slice(0,-1)},isEmpty:function(){return void 0!==this.size?0===this.size:!this.some((function(){return!0}))},count:function(e,t){return $t(e?this.toSeq().filter(e,t):this)},countBy:function(e,t){return function(e,t,n){var i=Ji().asMutable();return e.__iterate((function(r,s){i.update(t.call(n,r,s,e),0,(function(e){return e+1}))})),i.asImmutable()}(this,e,t)},equals:function(e){return Xr(this,e)},entrySeq:function(){var e=this;if(e._cache)return new Sn(e._cache);var t=e.toSeq().map(gs).toIndexedSeq();return t.fromEntrySeq=function(){return e.toSeq()},t},filterNot:function(e,t){return this.filter(ys(e),t)},findEntry:function(e,t,n){var i=n;return this.__iterate((function(n,r,s){if(e.call(t,n,r,s))return i=[r,n],!1})),i},findKey:function(e,t){var n=this.findEntry(e,t);return n&&n[0]},findLast:function(e,t,n){return this.toKeyedSeq().reverse().find(e,t,n)},findLastEntry:function(e,t,n){return this.toKeyedSeq().reverse().findEntry(e,t,n)},findLastKey:function(e,t){return this.toKeyedSeq().reverse().findKey(e,t)},first:function(e){return this.find(Tt,null,e)},flatMap:function(e,t){return di(this,function(e,t,n){var i=mi(e);return e.toSeq().map((function(r,s){return i(t.call(n,r,s,e))})).flatten(!0)}(this,e,t))},flatten:function(e){return di(this,hi(this,e,!0))},fromEntrySeq:function(){return new ei(this)},get:function(e,t){return this.find((function(t,n){return Mn(n,e)}),void 0,t)},getIn:hs,groupBy:function(e,t){return function(e,t,n){var i=jt(e),r=(nn(e)?Lr():Ji()).asMutable();e.__iterate((function(s,o){r.update(t.call(n,s,o,e),(function(e){return(e=e||[]).push(i?[o,s]:s),e}))}));var s=mi(e);return r.map((function(t){return di(e,s(t))})).asImmutable()}(this,e,t)},has:function(e){return this.get(e,Pt)!==Pt},hasIn:function(e){return us(this,e)},isSubset:function(e){return e="function"==typeof e.includes?e:Ht(e),this.every((function(t){return e.includes(t)}))},isSuperset:function(e){return(e="function"==typeof e.isSubset?e:Ht(e)).isSubset(this)},keyOf:function(e){return this.findKey((function(t){return Mn(t,e)}))},keySeq:function(){return this.toSeq().map(ms).toIndexedSeq()},last:function(e){return this.toSeq().reverse().first(e)},lastKeyOf:function(e){return this.toKeyedSeq().reverse().keyOf(e)},max:function(e){return ci(this,e)},maxBy:function(e,t){return ci(this,t,e)},min:function(e){return ci(this,e?vs(e):Es)},minBy:function(e,t){return ci(this,t?vs(t):Es,e)},rest:function(){return this.slice(1)},skip:function(e){return 0===e?this:this.slice(Math.max(0,e))},skipLast:function(e){return 0===e?this:this.slice(0,-Math.max(0,e))},skipWhile:function(e,t){return di(this,oi(this,e,t,!0))},skipUntil:function(e,t){return this.skipWhile(ys(e),t)},sortBy:function(e,t){return di(this,ui(this,t,e))},take:function(e){return this.slice(0,Math.max(0,e))},takeLast:function(e){return this.slice(-Math.max(0,e))},takeWhile:function(e,t){return di(this,function(e,t,n){var i=gi(e);return i.__iterateUncached=function(i,r){var s=this;if(r)return this.cacheResult().__iterate(i,r);var o=0;return e.__iterate((function(e,r,a){return t.call(n,e,r,a)&&++o&&i(e,r,s)})),o},i.__iteratorUncached=function(i,r){var s=this;if(r)return this.cacheResult().__iterator(i,r);var o=e.__iterator(on,r),a=!0;return new cn((function(){if(!a)return{value:void 0,done:!0};var e=o.next();if(e.done)return e;var r=e.value,h=r[0],u=r[1];return t.call(n,u,h,s)?i===on?e:ln(i,h,u,e):(a=!1,{value:void 0,done:!0})}))},i}(this,e,t))},takeUntil:function(e,t){return this.takeWhile(ys(e),t)},update:function(e){return e(this)},valueSeq:function(){return this.toIndexedSeq()},hashCode:function(){return this.__hash||(this.__hash=function(e){if(e.size===1/0)return 0;var t=nn(e),n=jt(e),i=t?1:0;return function(e,t){return t=Ln(t,3432918353),t=Ln(t<<15|t>>>-15,461845907),t=Ln(t<<13|t>>>-13,5),t=Ln((t=(t+3864292196|0)^e)^t>>>16,2246822507),t=Dn((t=Ln(t^t>>>13,3266489909))^t>>>16)}(e.__iterate(n?t?function(e,t){i=31*i+_s(Bn(e),Bn(t))|0}:function(e,t){i=i+_s(Bn(e),Bn(t))|0}:t?function(e){i=31*i+Bn(e)|0}:function(e){i=i+Bn(e)|0}),i)}(this))}});var ls=Ht.prototype;ls[Bt]=!0,ls[un]=ls.values,ls.toJSON=ls.toArray,ls.__toStringMapper=Ci,ls.inspect=ls.toSource=function(){return this.toString()},ls.chain=ls.flatMap,ls.contains=ls.includes,Qr(qt,{flip:function(){return di(this,ti(this))},mapEntries:function(e,t){var n=this,i=0;return di(this,this.toSeq().map((function(r,s){return e.call(t,[s,r],i++,n)})).fromEntrySeq())},mapKeys:function(e,t){var n=this;return di(this,this.toSeq().flip().map((function(i,r){return e.call(t,i,r,n)})).flip())}});var ps=qt.prototype;ps[Wt]=!0,ps[un]=ls.entries,ps.toJSON=cs,ps.__toStringMapper=function(e,t){return Ci(t)+": "+Ci(e)},Qr(Kt,{toKeyedSeq:function(){return new Qn(this,!1)},filter:function(e,t){return di(this,ri(this,e,t,!1))},findIndex:function(e,t){var n=this.findEntry(e,t);return n?n[0]:-1},indexOf:function(e){var t=this.keyOf(e);return void 0===t?-1:t},lastIndexOf:function(e){var t=this.lastKeyOf(e);return void 0===t?-1:t},reverse:function(){return di(this,ii(this,!1))},slice:function(e,t){return di(this,si(this,e,t,!1))},splice:function(e,t){var n=arguments.length;if(t=Math.max(t||0,0),0===n||2===n&&!t)return this;e=Mt(e,e<0?this.count():this.size);var i=this.slice(0,e);return di(this,1===n?i:i.concat(xi(arguments,2),this.slice(e+t)))},findLastIndex:function(e,t){var n=this.findLastEntry(e,t);return n?n[0]:-1},first:function(e){return this.get(0,e)},flatten:function(e){return di(this,hi(this,e,!1))},get:function(e,t){return(e=Rt(this,e))<0||this.size===1/0||void 0!==this.size&&e>this.size?t:this.find((function(t,n){return n===e}),void 0,t)},has:function(e){return(e=Rt(this,e))>=0&&(void 0!==this.size?this.size===1/0||e<this.size:-1!==this.indexOf(e))},interpose:function(e){return di(this,function(e,t){var n=gi(e);return n.size=e.size&&2*e.size-1,n.__iterateUncached=function(n,i){var r=this,s=0;return e.__iterate((function(e){return(!s||!1!==n(t,s++,r))&&!1!==n(e,s++,r)}),i),s},n.__iteratorUncached=function(n,i){var r,s=e.__iterator(sn,i),o=0;return new cn((function(){return(!r||o%2)&&(r=s.next()).done?r:o%2?ln(n,o++,t):ln(n,o++,r.value,r)}))},n}(this,e))},interleave:function(){var e=[this].concat(xi(arguments)),t=pi(this.toSeq(),_n.of,e),n=t.flatten(!0);return t.size&&(n.size=t.size*e.length),di(this,n)},keySeq:function(){return os(0,this.size)},last:function(e){return this.get(-1,e)},skipWhile:function(e,t){return di(this,oi(this,e,t,!1))},zip:function(){var e=[this].concat(xi(arguments));return di(this,pi(this,xs,e))},zipAll:function(){var e=[this].concat(xi(arguments));return di(this,pi(this,xs,e,!0))},zipWith:function(e){var t=xi(arguments);return t[0]=this,di(this,pi(this,e,t))}});var ds=Kt.prototype;function fs(e,t,n,i,r,s){return _i(e.size),e.__iterate((function(e,s,o){r?(r=!1,n=e):n=t.call(i,n,e,s,o)}),s),n}function ms(e,t){return t}function gs(e,t){return[t,e]}function ys(e){return function(){return!e.apply(this,arguments)}}function vs(e){return function(){return-e.apply(this,arguments)}}function xs(){return xi(arguments)}function Es(e,t){return e<t?1:e>t?-1:0}function _s(e,t){return e^t+2654435769+(e<<6)+(e>>2)|0}ds[Ft]=!0,ds[tn]=!0,Qr(Yt,{get:function(e,t){return this.has(e)?e:t},includes:function(e){return this.has(e)},keySeq:function(){return this.valueSeq()}}),Yt.prototype.has=ls.includes,Yt.prototype.contains=Yt.prototype.includes,Qr(En,qt.prototype),Qr(_n,Kt.prototype),Qr(bn,Yt.prototype);var bs=function(e){function t(e){return null==e?Is():Yr(e)?e:Is().withMutations((function(t){var n=Yt(e);_i(n.size),n.forEach((function(e){return t.add(e)}))}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.of=function(){return this(arguments)},t.fromKeys=function(e){return this(qt(e).keySeq())},t.prototype.toString=function(){return this.__toString("OrderedSet {","}")},t}(Zr);bs.isOrderedSet=Yr;var Ss,As=bs.prototype;function Cs(e,t){var n=Object.create(As);return n.size=e?e.size:0,n._map=e,n.__ownerID=t,n}function Is(){return Ss||(Ss=Cs(Vr()))}As[tn]=!0,As.zip=ds.zip,As.zipWith=ds.zipWith,As.__empty=Is,As.__make=Cs;var ws=function(e,t){var n,i=function(s){var o=this;if(s instanceof i)return s;if(!(this instanceof i))return new i(s);if(!n){n=!0;var a=Object.keys(e),h=r._indices={};r._name=t,r._keys=a,r._defaultValues=e;for(var u=0;u<a.length;u++){var c=a[u];h[c]=u,r[c]?"object"==typeof console&&console.warn&&console.warn("Cannot define "+$s(this)+' with property "'+c+'" since that property name is part of the Record API.'):Ts(r,c)}}this.__ownerID=void 0,this._values=br().withMutations((function(e){e.setSize(o._keys.length),qt(s).forEach((function(t,n){e.set(o._indices[n],t===o._defaultValues[n]?void 0:t)}))}))},r=i.prototype=Object.create(ks);return r.constructor=i,t&&(i.displayName=t),i};ws.prototype.toString=function(){for(var e,t=$s(this)+" { ",n=this._keys,i=0,r=n.length;i!==r;i++)t+=(i?", ":"")+(e=n[i])+": "+Ci(this.get(e));return t+" }"},ws.prototype.equals=function(e){return this===e||e&&this._keys===e._keys&&Rs(this).equals(Rs(e))},ws.prototype.hashCode=function(){return Rs(this).hashCode()},ws.prototype.has=function(e){return this._indices.hasOwnProperty(e)},ws.prototype.get=function(e,t){if(!this.has(e))return t;var n=this._indices[e],i=this._values.get(n);return void 0===i?this._defaultValues[e]:i},ws.prototype.set=function(e,t){if(this.has(e)){var n=this._values.set(this._indices[e],t===this._defaultValues[e]?void 0:t);if(n!==this._values&&!this.__ownerID)return Ns(this,n)}return this},ws.prototype.remove=function(e){return this.set(e)},ws.prototype.clear=function(){var e=this._values.clear().setSize(this._keys.length);return this.__ownerID?this:Ns(this,e)},ws.prototype.wasAltered=function(){return this._values.wasAltered()},ws.prototype.toSeq=function(){return Rs(this)},ws.prototype.toJS=function(){return Jr(this)},ws.prototype.entries=function(){return this.__iterator(on)},ws.prototype.__iterator=function(e,t){return Rs(this).__iterator(e,t)},ws.prototype.__iterate=function(e,t){return Rs(this).__iterate(e,t)},ws.prototype.__ensureOwner=function(e){if(e===this.__ownerID)return this;var t=this._values.__ensureOwner(e);return e?Ns(this,t,e):(this.__ownerID=e,this._values=t,this)},ws.isRecord=Zt,ws.getDescriptiveName=$s;var Ps,ks=ws.prototype;function Ns(e,t,n){var i=Object.create(Object.getPrototypeOf(e));return i._values=t,i.__ownerID=n,i}function $s(e){return e.constructor.displayName||e.constructor.name||"Record"}function Rs(e){return Pn(e._keys.map((function(t){return[t,e.get(t)]})))}function Ts(e,t){try{Object.defineProperty(e,t,{get:function(){return this.get(t)},set:function(e){Ei(this.__ownerID,"Cannot set on an immutable record."),this.set(t,e)}})}catch(e){}}function Os(e,t){return jt(t)?t.toMap():t.toList()}ks[Jt]=!0,ks.delete=ks.remove,ks.deleteIn=ks.removeIn=Mi,ks.getIn=hs,ks.hasIn=ls.hasIn,ks.merge=Bi,ks.mergeWith=zi,ks.mergeIn=Hi,ks.mergeDeep=Ui,ks.mergeDeepWith=Gi,ks.mergeDeepIn=qi,ks.setIn=Ti,ks.update=Di,ks.updateIn=Vi,ks.withMutations=Ki,ks.asMutable=Yi,ks.asImmutable=Xi,ks[un]=ks.entries,ks.toJSON=ks.toObject=ls.toObject,ks.inspect=ks.toSource=function(){return this.toString()};var Ms,Ls={version:"4.0.0-rc.11",Collection:Ht,Iterable:Ht,Seq:xn,Map:Ji,OrderedMap:Lr,List:br,Stack:jr,Set:Zr,OrderedSet:bs,Record:ws,Range:os,Repeat:function(e){function t(e,n){if(!(this instanceof t))return new t(e,n);if(this._value=e,this.size=void 0===n?1/0:Math.max(0,n),0===this.size){if(Ps)return Ps;Ps=this}}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return 0===this.size?"Repeat []":"Repeat [ "+this._value+" "+this.size+" times ]"},t.prototype.get=function(e,t){return this.has(e)?this._value:t},t.prototype.includes=function(e){return Mn(this._value,e)},t.prototype.slice=function(e,n){var i=this.size;return Ot(e,n,i)?this:new t(this._value,Lt(n,i)-Mt(e,i))},t.prototype.reverse=function(){return this},t.prototype.indexOf=function(e){return Mn(this._value,e)?0:-1},t.prototype.lastIndexOf=function(e){return Mn(this._value,e)?this.size:-1},t.prototype.__iterate=function(e,t){for(var n=this.size,i=0;i!==n&&!1!==e(this._value,t?n-++i:i++,this););return i},t.prototype.__iterator=function(e,t){var n=this,i=this.size,r=0;return new cn((function(){return r===i?{value:void 0,done:!0}:ln(e,t?i-++r:r++,n._value)}))},t.prototype.equals=function(e){return e instanceof t?Mn(this._value,e._value):Xr(e)},t}(_n),is:Mn,fromJS:function(e,t){return function e(t,n,i,r,s,o){var a=Array.isArray(i)?_n:Si(i)?En:null;if(a){if(~t.indexOf(i))throw new TypeError("Cannot convert circular structure to Immutable");t.push(i),s&&""!==r&&s.push(r);var h=n.call(o,r,a(i).map((function(r,o){return e(t,n,r,o,s,i)})),s&&s.slice());return t.pop(),s&&s.pop(),h}return i}([],t||Os,e,"",t&&t.length>2?[]:void 0,{"":e})},hash:Bn,isImmutable:en,isCollection:zt,isKeyed:jt,isIndexed:Ut,isAssociative:Gt,isOrdered:nn,isValueObject:On,isSeq:Qt,isList:_r,isMap:Rn,isOrderedMap:Tn,isStack:Wr,isSet:Kr,isOrderedSet:Yr,isRecord:Zt,get:wi,getIn:as,has:Ii,hasIn:us,merge:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return Fi(e,t)},mergeDeep:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return ji(e,t)},mergeWith:function(e,t){for(var n=[],i=arguments.length-2;i-- >0;)n[i]=arguments[i+2];return Fi(t,n,e)},mergeDeepWith:function(e,t){for(var n=[],i=arguments.length-2;i-- >0;)n[i]=arguments[i+2];return ji(t,n,e)},remove:ki,removeIn:Oi,set:Ni,setIn:Ri,update:Li,updateIn:$i};!function(e){e[e.IGNORED_LABELS=0]="IGNORED_LABELS",e[e.ACCESSED_NODES=1]="ACCESSED_NODES",e[e.ASSIGNED_NODES=2]="ASSIGNED_NODES",e[e.IGNORE_BREAK_STATEMENTS=3]="IGNORE_BREAK_STATEMENTS",e[e.IGNORE_RETURN_AWAIT_YIELD=4]="IGNORE_RETURN_AWAIT_YIELD",e[e.NODES_CALLED_AT_PATH_WITH_OPTIONS=5]="NODES_CALLED_AT_PATH_WITH_OPTIONS",e[e.REPLACED_VARIABLE_INITS=6]="REPLACED_VARIABLE_INITS",e[e.RETURN_EXPRESSIONS_ACCESSED_AT_PATH=7]="RETURN_EXPRESSIONS_ACCESSED_AT_PATH",e[e.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH=8]="RETURN_EXPRESSIONS_ASSIGNED_AT_PATH",e[e.RETURN_EXPRESSIONS_CALLED_AT_PATH=9]="RETURN_EXPRESSIONS_CALLED_AT_PATH"}(Ms||(Ms={}));const Ds={};class Vs{constructor(e){this.optionValues=e}static create(){return new this(Ls.Map())}addAccessedNodeAtPath(e,t){return this.setIn([Ms.ACCESSED_NODES,t,...e,Ds],!0)}addAccessedReturnExpressionAtPath(e,t){return this.setIn([Ms.RETURN_EXPRESSIONS_ACCESSED_AT_PATH,t,...e,Ds],!0)}addAssignedNodeAtPath(e,t){return this.setIn([Ms.ASSIGNED_NODES,t,...e,Ds],!0)}addAssignedReturnExpressionAtPath(e,t){return this.setIn([Ms.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH,t,...e,Ds],!0)}addCalledNodeAtPathWithOptions(e,t,n){return this.setIn([Ms.NODES_CALLED_AT_PATH_WITH_OPTIONS,t,...e,Ds,n],!0)}addCalledReturnExpressionAtPath(e,t){return this.setIn([Ms.RETURN_EXPRESSIONS_CALLED_AT_PATH,t,...e,Ds],!0)}getHasEffectsWhenCalledOptions(){return this.setIgnoreReturnAwaitYield().setIgnoreBreakStatements(!1).setIgnoreNoLabels()}getReplacedVariableInit(e){return this.optionValues.getIn([Ms.REPLACED_VARIABLE_INITS,e])}hasNodeBeenAccessedAtPath(e,t){return this.optionValues.getIn([Ms.ACCESSED_NODES,t,...e,Ds])}hasNodeBeenAssignedAtPath(e,t){return this.optionValues.getIn([Ms.ASSIGNED_NODES,t,...e,Ds])}hasNodeBeenCalledAtPathWithOptions(e,t,n){const i=this.optionValues.getIn([Ms.NODES_CALLED_AT_PATH_WITH_OPTIONS,t,...e,Ds]);return i&&i.find((e,t)=>t.equals(n))}hasReturnExpressionBeenAccessedAtPath(e,t){return this.optionValues.getIn([Ms.RETURN_EXPRESSIONS_ACCESSED_AT_PATH,t,...e,Ds])}hasReturnExpressionBeenAssignedAtPath(e,t){return this.optionValues.getIn([Ms.RETURN_EXPRESSIONS_ASSIGNED_AT_PATH,t,...e,Ds])}hasReturnExpressionBeenCalledAtPath(e,t){return this.optionValues.getIn([Ms.RETURN_EXPRESSIONS_CALLED_AT_PATH,t,...e,Ds])}ignoreBreakStatements(){return this.get(Ms.IGNORE_BREAK_STATEMENTS)}ignoreLabel(e){return this.optionValues.getIn([Ms.IGNORED_LABELS,e])}ignoreReturnAwaitYield(){return this.get(Ms.IGNORE_RETURN_AWAIT_YIELD)}replaceVariableInit(e,t){return this.setIn([Ms.REPLACED_VARIABLE_INITS,e],t)}setIgnoreBreakStatements(e=!0){return this.set(Ms.IGNORE_BREAK_STATEMENTS,e)}setIgnoreLabel(e){return this.setIn([Ms.IGNORED_LABELS,e],!0)}setIgnoreNoLabels(){return this.remove(Ms.IGNORED_LABELS)}setIgnoreReturnAwaitYield(e=!0){return this.set(Ms.IGNORE_RETURN_AWAIT_YIELD,e)}get(e){return this.optionValues.get(e)}remove(e){return new Vs(this.optionValues.remove(e))}set(e,t){return new Vs(this.optionValues.set(e,t))}setIn(e,t){return new Vs(this.optionValues.setIn(e,t))}}const Bs={Literal:[],Program:["body"]};const zs="variables",Ws=Vs.create();class js{constructor(e,t,n){this.included=!1,this.keys=Bs[e.type]||function(e){return Bs[e.type]=Object.keys(e).filter(t=>"object"==typeof e[t]),Bs[e.type]}(e),this.parent=t,this.context=t.context,this.createScope(n),this.parseNode(e),this.initialise(),this.context.magicString.addSourcemapLocation(this.start),this.context.magicString.addSourcemapLocation(this.end)}bind(){for(const e of this.keys){const t=this[e];if(null!==t&&"annotations"!==e)if(Array.isArray(t))for(const e of t)null!==e&&e.bind();else t.bind()}}createScope(e){this.scope=e}declare(e,t){return[]}deoptimizePath(e){}getLiteralValueAtPath(e,t,n){return we}getReturnExpressionWhenCalledAtPath(e,t,n){return Pe}hasEffects(e){for(const t of this.keys){const n=this[t];if(null!==n&&"annotations"!==t)if(Array.isArray(n)){for(const t of n)if(null!==t&&t.hasEffects(e))return!0}else if(n.hasEffects(e))return!0}return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>0}hasEffectsWhenAssignedAtPath(e,t){return!0}hasEffectsWhenCalledAtPath(e,t,n){return!0}include(e){this.included=!0;for(const t of this.keys){const n=this[t];if(null!==n&&"annotations"!==t)if(Array.isArray(n))for(const t of n)null!==t&&t.include(e);else n.include(e)}}includeCallArguments(e){for(const t of e)t.include(!1)}includeWithAllDeclaredVariables(e){this.include(e)}initialise(){}insertSemicolon(e){";"!==e.original[this.end-1]&&e.appendLeft(this.end,";")}locate(){const e=At(this.context.code,this.start,{offsetLine:1});return e.file=this.context.fileName,e.toString=()=>JSON.stringify(e),e}parseNode(e){for(const t of Object.keys(e)){if(this.hasOwnProperty(t))continue;const n=e[t];if("object"!=typeof n||null===n||"annotations"===t)this[t]=n;else if(Array.isArray(n)){this[t]=[];for(const e of n)this[t].push(null===e?null:new(this.context.nodeConstructors[e.type]||this.context.nodeConstructors.UnknownNode)(e,this,this.scope))}else this[t]=new(this.context.nodeConstructors[n.type]||this.context.nodeConstructors.UnknownNode)(n,this,this.scope)}}render(e,t){for(const n of this.keys){const i=this[n];if(null!==i&&"annotations"!==n)if(Array.isArray(i))for(const n of i)null!==n&&n.render(e,t);else i.render(e,t)}}shouldBeIncluded(){return this.included||this.hasEffects(Ws)}toString(){return this.context.code.slice(this.start,this.end)}}class Fs extends js{createScope(e){this.scope=new St(e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}hasEffectsWhenAssignedAtPath(e,t){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return this.body.hasEffectsWhenCalledAtPath(e,t,n)||null!==this.superClass&&this.superClass.hasEffectsWhenCalledAtPath(e,t,n)}initialise(){null!==this.id&&this.id.declare("class",this)}}class Us extends Fs{initialise(){super.initialise(),null!==this.id&&(this.id.variable.isId=!0)}parseNode(e){null!==e.id&&(this.id=new this.context.nodeConstructors.Identifier(e.id,this,this.scope.parent)),super.parseNode(e)}render(e,t){"system"===t.format&&this.id&&this.id.variable.exportName&&e.appendLeft(this.end,` exports('${this.id.variable.exportName}', ${this.id.variable.getName()});`),super.render(e,t)}}class Gs extends _t{constructor(e){super("arguments",null,Pe,e)}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenAssignedAtPath(){return!0}hasEffectsWhenCalledAtPath(){return!0}}class Hs extends _t{constructor(e){super("this",null,null,e)}_getInit(e){return e.getReplacedVariableInit(this)||Pe}getLiteralValueAtPath(){return we}hasEffectsWhenAccessedAtPath(e,t){return this._getInit(t).hasEffectsWhenAccessedAtPath(e,t)||super.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return this._getInit(t).hasEffectsWhenAssignedAtPath(e,t)||super.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return this._getInit(n).hasEffectsWhenCalledAtPath(e,t,n)||super.hasEffectsWhenCalledAtPath(e,t,n)}}class qs extends St{constructor(e,t){super(e),this.parameters=[],this.hasRest=!1,this.context=t,this.hoistedBodyVarScope=new St(this)}addParameterDeclaration(e){const t=e.name;let n=this.hoistedBodyVarScope.variables.get(t);return n?n.addDeclaration(e,null):n=new _t(t,e,Pe,this.context),this.variables.set(t,n),n}addParameterVariables(e,t){this.parameters=e;for(const t of e)for(const e of t)e.alwaysRendered=!0;this.hasRest=t}includeCallArguments(e){let t=!1,n=!1;const i=this.hasRest&&this.parameters[this.parameters.length-1];for(let r=e.length-1;r>=0;r--){const s=this.parameters[r]||i,o=e[r];if(s){t=!1;for(const e of s)e.included&&(n=!0),e.calledFromTryStatement&&(t=!0)}!n&&o.shouldBeIncluded()&&(n=!0),n&&o.include(t)}}}class Ks extends qs{constructor(){super(...arguments),this.returnExpression=null,this.returnExpressions=[]}addReturnExpression(e){this.returnExpressions.push(e)}getReturnExpression(){return null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression}updateReturnExpression(){if(1===this.returnExpressions.length)this.returnExpression=this.returnExpressions[0];else{this.returnExpression=Pe;for(const e of this.returnExpressions)e.deoptimizePath(Ce)}}}class Ys extends Ks{constructor(e,t){super(e,t),this.variables.set("arguments",this.argumentsVariable=new Gs(t)),this.variables.set("this",this.thisVariable=new Hs(t))}findLexicalBoundary(){return this}getOptionsWhenCalledWith({withNew:e},t){return t.replaceVariableInit(this.thisVariable,e?new He:Pe)}includeCallArguments(e){if(super.includeCallArguments(e),this.argumentsVariable.included)for(const t of e)t.included||t.include(!1)}}const Xs=Symbol("Value Properties"),Qs={pure:!0},Js={pure:!1},Zs={__proto__:null,[Xs]:Js},eo={__proto__:null,[Xs]:Qs},to={__proto__:null,[Xs]:Js,prototype:Zs},no={__proto__:null,[Xs]:Qs,prototype:Zs},io={__proto__:null,[Xs]:Qs,from:eo,of:eo,prototype:Zs},ro={__proto__:null,[Xs]:Qs,supportedLocalesOf:no},so={global:Zs,globalThis:Zs,self:Zs,window:Zs,__proto__:null,[Xs]:Js,Array:{__proto__:null,[Xs]:Js,from:eo,isArray:eo,of:eo,prototype:Zs},ArrayBuffer:{__proto__:null,[Xs]:Qs,isView:eo,prototype:Zs},Atomics:Zs,BigInt:to,BigInt64Array:to,BigUint64Array:to,Boolean:no,constructor:to,DataView:no,Date:{__proto__:null,[Xs]:Qs,now:eo,parse:eo,prototype:Zs,UTC:eo},decodeURI:eo,decodeURIComponent:eo,encodeURI:eo,encodeURIComponent:eo,Error:no,escape:eo,eval:Zs,EvalError:no,Float32Array:io,Float64Array:io,Function:to,hasOwnProperty:Zs,Infinity:Zs,Int16Array:io,Int32Array:io,Int8Array:io,isFinite:eo,isNaN:eo,isPrototypeOf:Zs,JSON:Zs,Map:no,Math:{__proto__:null,[Xs]:Js,abs:eo,acos:eo,acosh:eo,asin:eo,asinh:eo,atan:eo,atan2:eo,atanh:eo,cbrt:eo,ceil:eo,clz32:eo,cos:eo,cosh:eo,exp:eo,expm1:eo,floor:eo,fround:eo,hypot:eo,imul:eo,log:eo,log10:eo,log1p:eo,log2:eo,max:eo,min:eo,pow:eo,random:eo,round:eo,sign:eo,sin:eo,sinh:eo,sqrt:eo,tan:eo,tanh:eo,trunc:eo},NaN:Zs,Number:{__proto__:null,[Xs]:Qs,isFinite:eo,isInteger:eo,isNaN:eo,isSafeInteger:eo,parseFloat:eo,parseInt:eo,prototype:Zs},Object:{__proto__:null,[Xs]:Qs,create:eo,getNotifier:eo,getOwn:eo,getOwnPropertyDescriptor:eo,getOwnPropertyNames:eo,getOwnPropertySymbols:eo,getPrototypeOf:eo,is:eo,isExtensible:eo,isFrozen:eo,isSealed:eo,keys:eo,prototype:Zs},parseFloat:eo,parseInt:eo,Promise:{__proto__:null,[Xs]:Js,all:eo,prototype:Zs,race:eo,resolve:eo},propertyIsEnumerable:Zs,Proxy:Zs,RangeError:no,ReferenceError:no,Reflect:Zs,RegExp:no,Set:no,SharedArrayBuffer:to,String:{__proto__:null,[Xs]:Qs,fromCharCode:eo,fromCodePoint:eo,prototype:Zs,raw:eo},Symbol:{__proto__:null,[Xs]:Qs,for:eo,keyFor:eo,prototype:Zs},SyntaxError:no,toLocaleString:Zs,toString:Zs,TypeError:no,Uint16Array:io,Uint32Array:io,Uint8Array:io,Uint8ClampedArray:io,unescape:eo,URIError:no,valueOf:Zs,WeakMap:no,WeakSet:no,clearInterval:to,clearTimeout:to,console:Zs,Intl:{__proto__:null,[Xs]:Js,Collator:ro,DateTimeFormat:ro,ListFormat:ro,NumberFormat:ro,PluralRules:ro,RelativeTimeFormat:ro},setInterval:to,setTimeout:to,TextDecoder:to,TextEncoder:to,URL:to,URLSearchParams:to,AbortController:to,AbortSignal:to,addEventListener:Zs,alert:Zs,AnalyserNode:to,Animation:to,AnimationEvent:to,applicationCache:Zs,ApplicationCache:to,ApplicationCacheErrorEvent:to,atob:Zs,Attr:to,Audio:to,AudioBuffer:to,AudioBufferSourceNode:to,AudioContext:to,AudioDestinationNode:to,AudioListener:to,AudioNode:to,AudioParam:to,AudioProcessingEvent:to,AudioScheduledSourceNode:to,AudioWorkletNode:to,BarProp:to,BaseAudioContext:to,BatteryManager:to,BeforeUnloadEvent:to,BiquadFilterNode:to,Blob:to,BlobEvent:to,blur:Zs,BroadcastChannel:to,btoa:Zs,ByteLengthQueuingStrategy:to,Cache:to,caches:Zs,CacheStorage:to,cancelAnimationFrame:Zs,cancelIdleCallback:Zs,CanvasCaptureMediaStreamTrack:to,CanvasGradient:to,CanvasPattern:to,CanvasRenderingContext2D:to,ChannelMergerNode:to,ChannelSplitterNode:to,CharacterData:to,clientInformation:Zs,ClipboardEvent:to,close:Zs,closed:Zs,CloseEvent:to,Comment:to,CompositionEvent:to,confirm:Zs,ConstantSourceNode:to,ConvolverNode:to,CountQueuingStrategy:to,createImageBitmap:Zs,Credential:to,CredentialsContainer:to,crypto:Zs,Crypto:to,CryptoKey:to,CSS:to,CSSConditionRule:to,CSSFontFaceRule:to,CSSGroupingRule:to,CSSImportRule:to,CSSKeyframeRule:to,CSSKeyframesRule:to,CSSMediaRule:to,CSSNamespaceRule:to,CSSPageRule:to,CSSRule:to,CSSRuleList:to,CSSStyleDeclaration:to,CSSStyleRule:to,CSSStyleSheet:to,CSSSupportsRule:to,CustomElementRegistry:to,customElements:Zs,CustomEvent:to,DataTransfer:to,DataTransferItem:to,DataTransferItemList:to,defaultstatus:Zs,defaultStatus:Zs,DelayNode:to,DeviceMotionEvent:to,DeviceOrientationEvent:to,devicePixelRatio:Zs,dispatchEvent:Zs,document:Zs,Document:to,DocumentFragment:to,DocumentType:to,DOMError:to,DOMException:to,DOMImplementation:to,DOMMatrix:to,DOMMatrixReadOnly:to,DOMParser:to,DOMPoint:to,DOMPointReadOnly:to,DOMQuad:to,DOMRect:to,DOMRectReadOnly:to,DOMStringList:to,DOMStringMap:to,DOMTokenList:to,DragEvent:to,DynamicsCompressorNode:to,Element:to,ErrorEvent:to,Event:to,EventSource:to,EventTarget:to,external:Zs,fetch:Zs,File:to,FileList:to,FileReader:to,find:Zs,focus:Zs,FocusEvent:to,FontFace:to,FontFaceSetLoadEvent:to,FormData:to,frames:Zs,GainNode:to,Gamepad:to,GamepadButton:to,GamepadEvent:to,getComputedStyle:Zs,getSelection:Zs,HashChangeEvent:to,Headers:to,history:Zs,History:to,HTMLAllCollection:to,HTMLAnchorElement:to,HTMLAreaElement:to,HTMLAudioElement:to,HTMLBaseElement:to,HTMLBodyElement:to,HTMLBRElement:to,HTMLButtonElement:to,HTMLCanvasElement:to,HTMLCollection:to,HTMLContentElement:to,HTMLDataElement:to,HTMLDataListElement:to,HTMLDetailsElement:to,HTMLDialogElement:to,HTMLDirectoryElement:to,HTMLDivElement:to,HTMLDListElement:to,HTMLDocument:to,HTMLElement:to,HTMLEmbedElement:to,HTMLFieldSetElement:to,HTMLFontElement:to,HTMLFormControlsCollection:to,HTMLFormElement:to,HTMLFrameElement:to,HTMLFrameSetElement:to,HTMLHeadElement:to,HTMLHeadingElement:to,HTMLHRElement:to,HTMLHtmlElement:to,HTMLIFrameElement:to,HTMLImageElement:to,HTMLInputElement:to,HTMLLabelElement:to,HTMLLegendElement:to,HTMLLIElement:to,HTMLLinkElement:to,HTMLMapElement:to,HTMLMarqueeElement:to,HTMLMediaElement:to,HTMLMenuElement:to,HTMLMetaElement:to,HTMLMeterElement:to,HTMLModElement:to,HTMLObjectElement:to,HTMLOListElement:to,HTMLOptGroupElement:to,HTMLOptionElement:to,HTMLOptionsCollection:to,HTMLOutputElement:to,HTMLParagraphElement:to,HTMLParamElement:to,HTMLPictureElement:to,HTMLPreElement:to,HTMLProgressElement:to,HTMLQuoteElement:to,HTMLScriptElement:to,HTMLSelectElement:to,HTMLShadowElement:to,HTMLSlotElement:to,HTMLSourceElement:to,HTMLSpanElement:to,HTMLStyleElement:to,HTMLTableCaptionElement:to,HTMLTableCellElement:to,HTMLTableColElement:to,HTMLTableElement:to,HTMLTableRowElement:to,HTMLTableSectionElement:to,HTMLTemplateElement:to,HTMLTextAreaElement:to,HTMLTimeElement:to,HTMLTitleElement:to,HTMLTrackElement:to,HTMLUListElement:to,HTMLUnknownElement:to,HTMLVideoElement:to,IDBCursor:to,IDBCursorWithValue:to,IDBDatabase:to,IDBFactory:to,IDBIndex:to,IDBKeyRange:to,IDBObjectStore:to,IDBOpenDBRequest:to,IDBRequest:to,IDBTransaction:to,IDBVersionChangeEvent:to,IdleDeadline:to,IIRFilterNode:to,Image:to,ImageBitmap:to,ImageBitmapRenderingContext:to,ImageCapture:to,ImageData:to,indexedDB:Zs,innerHeight:Zs,innerWidth:Zs,InputEvent:to,IntersectionObserver:to,IntersectionObserverEntry:to,isSecureContext:Zs,KeyboardEvent:to,KeyframeEffect:to,length:Zs,localStorage:Zs,location:Zs,Location:to,locationbar:Zs,matchMedia:Zs,MediaDeviceInfo:to,MediaDevices:to,MediaElementAudioSourceNode:to,MediaEncryptedEvent:to,MediaError:to,MediaKeyMessageEvent:to,MediaKeySession:to,MediaKeyStatusMap:to,MediaKeySystemAccess:to,MediaList:to,MediaQueryList:to,MediaQueryListEvent:to,MediaRecorder:to,MediaSettingsRange:to,MediaSource:to,MediaStream:to,MediaStreamAudioDestinationNode:to,MediaStreamAudioSourceNode:to,MediaStreamEvent:to,MediaStreamTrack:to,MediaStreamTrackEvent:to,menubar:Zs,MessageChannel:to,MessageEvent:to,MessagePort:to,MIDIAccess:to,MIDIConnectionEvent:to,MIDIInput:to,MIDIInputMap:to,MIDIMessageEvent:to,MIDIOutput:to,MIDIOutputMap:to,MIDIPort:to,MimeType:to,MimeTypeArray:to,MouseEvent:to,moveBy:Zs,moveTo:Zs,MutationEvent:to,MutationObserver:to,MutationRecord:to,name:Zs,NamedNodeMap:to,NavigationPreloadManager:to,navigator:Zs,Navigator:to,NetworkInformation:to,Node:to,NodeFilter:Zs,NodeIterator:to,NodeList:to,Notification:to,OfflineAudioCompletionEvent:to,OfflineAudioContext:to,offscreenBuffering:Zs,OffscreenCanvas:to,open:Zs,openDatabase:Zs,Option:to,origin:Zs,OscillatorNode:to,outerHeight:Zs,outerWidth:Zs,PageTransitionEvent:to,pageXOffset:Zs,pageYOffset:Zs,PannerNode:to,parent:Zs,Path2D:to,PaymentAddress:to,PaymentRequest:to,PaymentRequestUpdateEvent:to,PaymentResponse:to,performance:Zs,Performance:to,PerformanceEntry:to,PerformanceLongTaskTiming:to,PerformanceMark:to,PerformanceMeasure:to,PerformanceNavigation:to,PerformanceNavigationTiming:to,PerformanceObserver:to,PerformanceObserverEntryList:to,PerformancePaintTiming:to,PerformanceResourceTiming:to,PerformanceTiming:to,PeriodicWave:to,Permissions:to,PermissionStatus:to,personalbar:Zs,PhotoCapabilities:to,Plugin:to,PluginArray:to,PointerEvent:to,PopStateEvent:to,postMessage:Zs,Presentation:to,PresentationAvailability:to,PresentationConnection:to,PresentationConnectionAvailableEvent:to,PresentationConnectionCloseEvent:to,PresentationConnectionList:to,PresentationReceiver:to,PresentationRequest:to,print:Zs,ProcessingInstruction:to,ProgressEvent:to,PromiseRejectionEvent:to,prompt:Zs,PushManager:to,PushSubscription:to,PushSubscriptionOptions:to,queueMicrotask:Zs,RadioNodeList:to,Range:to,ReadableStream:to,RemotePlayback:to,removeEventListener:Zs,Request:to,requestAnimationFrame:Zs,requestIdleCallback:Zs,resizeBy:Zs,ResizeObserver:to,ResizeObserverEntry:to,resizeTo:Zs,Response:to,RTCCertificate:to,RTCDataChannel:to,RTCDataChannelEvent:to,RTCDtlsTransport:to,RTCIceCandidate:to,RTCIceTransport:to,RTCPeerConnection:to,RTCPeerConnectionIceEvent:to,RTCRtpReceiver:to,RTCRtpSender:to,RTCSctpTransport:to,RTCSessionDescription:to,RTCStatsReport:to,RTCTrackEvent:to,screen:Zs,Screen:to,screenLeft:Zs,ScreenOrientation:to,screenTop:Zs,screenX:Zs,screenY:Zs,ScriptProcessorNode:to,scroll:Zs,scrollbars:Zs,scrollBy:Zs,scrollTo:Zs,scrollX:Zs,scrollY:Zs,SecurityPolicyViolationEvent:to,Selection:to,ServiceWorker:to,ServiceWorkerContainer:to,ServiceWorkerRegistration:to,sessionStorage:Zs,ShadowRoot:to,SharedWorker:to,SourceBuffer:to,SourceBufferList:to,speechSynthesis:Zs,SpeechSynthesisEvent:to,SpeechSynthesisUtterance:to,StaticRange:to,status:Zs,statusbar:Zs,StereoPannerNode:to,stop:Zs,Storage:to,StorageEvent:to,StorageManager:to,styleMedia:Zs,StyleSheet:to,StyleSheetList:to,SubtleCrypto:to,SVGAElement:to,SVGAngle:to,SVGAnimatedAngle:to,SVGAnimatedBoolean:to,SVGAnimatedEnumeration:to,SVGAnimatedInteger:to,SVGAnimatedLength:to,SVGAnimatedLengthList:to,SVGAnimatedNumber:to,SVGAnimatedNumberList:to,SVGAnimatedPreserveAspectRatio:to,SVGAnimatedRect:to,SVGAnimatedString:to,SVGAnimatedTransformList:to,SVGAnimateElement:to,SVGAnimateMotionElement:to,SVGAnimateTransformElement:to,SVGAnimationElement:to,SVGCircleElement:to,SVGClipPathElement:to,SVGComponentTransferFunctionElement:to,SVGDefsElement:to,SVGDescElement:to,SVGDiscardElement:to,SVGElement:to,SVGEllipseElement:to,SVGFEBlendElement:to,SVGFEColorMatrixElement:to,SVGFEComponentTransferElement:to,SVGFECompositeElement:to,SVGFEConvolveMatrixElement:to,SVGFEDiffuseLightingElement:to,SVGFEDisplacementMapElement:to,SVGFEDistantLightElement:to,SVGFEDropShadowElement:to,SVGFEFloodElement:to,SVGFEFuncAElement:to,SVGFEFuncBElement:to,SVGFEFuncGElement:to,SVGFEFuncRElement:to,SVGFEGaussianBlurElement:to,SVGFEImageElement:to,SVGFEMergeElement:to,SVGFEMergeNodeElement:to,SVGFEMorphologyElement:to,SVGFEOffsetElement:to,SVGFEPointLightElement:to,SVGFESpecularLightingElement:to,SVGFESpotLightElement:to,SVGFETileElement:to,SVGFETurbulenceElement:to,SVGFilterElement:to,SVGForeignObjectElement:to,SVGGElement:to,SVGGeometryElement:to,SVGGradientElement:to,SVGGraphicsElement:to,SVGImageElement:to,SVGLength:to,SVGLengthList:to,SVGLinearGradientElement:to,SVGLineElement:to,SVGMarkerElement:to,SVGMaskElement:to,SVGMatrix:to,SVGMetadataElement:to,SVGMPathElement:to,SVGNumber:to,SVGNumberList:to,SVGPathElement:to,SVGPatternElement:to,SVGPoint:to,SVGPointList:to,SVGPolygonElement:to,SVGPolylineElement:to,SVGPreserveAspectRatio:to,SVGRadialGradientElement:to,SVGRect:to,SVGRectElement:to,SVGScriptElement:to,SVGSetElement:to,SVGStopElement:to,SVGStringList:to,SVGStyleElement:to,SVGSVGElement:to,SVGSwitchElement:to,SVGSymbolElement:to,SVGTextContentElement:to,SVGTextElement:to,SVGTextPathElement:to,SVGTextPositioningElement:to,SVGTitleElement:to,SVGTransform:to,SVGTransformList:to,SVGTSpanElement:to,SVGUnitTypes:to,SVGUseElement:to,SVGViewElement:to,TaskAttributionTiming:to,Text:to,TextEvent:to,TextMetrics:to,TextTrack:to,TextTrackCue:to,TextTrackCueList:to,TextTrackList:to,TimeRanges:to,toolbar:Zs,top:Zs,Touch:to,TouchEvent:to,TouchList:to,TrackEvent:to,TransitionEvent:to,TreeWalker:to,UIEvent:to,ValidityState:to,visualViewport:Zs,VisualViewport:to,VTTCue:to,WaveShaperNode:to,WebAssembly:Zs,WebGL2RenderingContext:to,WebGLActiveInfo:to,WebGLBuffer:to,WebGLContextEvent:to,WebGLFramebuffer:to,WebGLProgram:to,WebGLQuery:to,WebGLRenderbuffer:to,WebGLRenderingContext:to,WebGLSampler:to,WebGLShader:to,WebGLShaderPrecisionFormat:to,WebGLSync:to,WebGLTexture:to,WebGLTransformFeedback:to,WebGLUniformLocation:to,WebGLVertexArrayObject:to,WebSocket:to,WheelEvent:to,Window:to,Worker:to,WritableStream:to,XMLDocument:to,XMLHttpRequest:to,XMLHttpRequestEventTarget:to,XMLHttpRequestUpload:to,XMLSerializer:to,XPathEvaluator:to,XPathExpression:to,XPathResult:to,XSLTProcessor:to};for(const e of["window","global","self","globalThis"])so[e]=so;function oo(e){let t=so;for(const n of e){if("string"!=typeof n)return null;if(!(t=t[n]))return null}return t[Xs]}class ao extends et{hasEffectsWhenAccessedAtPath(e){return!function(e){return 1===e.length?"undefined"===e[0]||null!==oo(e):null!==oo(e.slice(0,-1))}([this.name,...e])}hasEffectsWhenCalledAtPath(e){return!function(e){const t=oo(e);return null!==t&&t.pure}([this.name,...e])}}class ho extends js{constructor(){super(...arguments),this.variable=null,this.bound=!1}addExportedVariables(e){null!==this.variable&&this.variable.exportName&&e.push(this.variable)}bind(){this.bound||(this.bound=!0,null===this.variable&&function e(t,n){if("MemberExpression"===t.type)return!t.computed&&e(t.object,t);if("Identifier"===t.type){if(!n)return!0;switch(n.type){case"MemberExpression":return n.computed||t===n.object;case"MethodDefinition":return n.computed;case"Property":return n.computed||t===n.value;case"ExportSpecifier":case"ImportSpecifier":return t===n.local;case"LabeledStatement":case"BreakStatement":case"ContinueStatement":return!1;default:return!0}}return!1}(this,this.parent)&&(this.variable=this.scope.findVariable(this.name),this.variable.addReference(this)),null!==this.variable&&this.variable instanceof _t&&null!==this.variable.additionalInitializers&&this.variable.consolidateInitializers())}declare(e,t){let n;switch(e){case"var":case"function":n=this.scope.addDeclaration(this,this.context,t,!0);break;case"let":case"const":case"class":n=this.scope.addDeclaration(this,this.context,t,!1);break;case"parameter":n=this.scope.addParameterDeclaration(this);break;default:throw new Error(`Internal Error: Unexpected identifier kind ${e}.`)}return[this.variable=n]}deoptimizePath(e){this.bound||this.bind(),0!==e.length||this.scope.contains(this.name)||this.disallowImportReassignment(),this.variable.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.bound||this.bind(),this.variable.getLiteralValueAtPath(e,t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){return this.bound||this.bind(),this.variable.getReturnExpressionWhenCalledAtPath(e,t,n)}hasEffects(){return this.context.unknownGlobalSideEffects&&this.variable instanceof ao&&this.variable.hasEffectsWhenAccessedAtPath(Ae)}hasEffectsWhenAccessedAtPath(e,t){return null!==this.variable&&this.variable.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return!this.variable||this.variable.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return!this.variable||this.variable.hasEffectsWhenCalledAtPath(e,t,n)}include(){this.included||(this.included=!0,null!==this.variable&&this.context.includeVariable(this.variable))}includeCallArguments(e){this.variable.includeCallArguments(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,isShorthandProperty:r}=X){if(this.variable){const t=this.variable.getName();t!==this.name&&(e.overwrite(this.start,this.end,t,{contentOnly:!0,storeName:!0}),r&&e.prependRight(this.start,`${this.name}: `)),"eval"===t&&n===J&&i&&e.appendRight(this.start,"0, ")}}disallowImportReassignment(){this.context.error({code:"ILLEGAL_REASSIGNMENT",message:`Illegal reassignment to import '${this.name}'`},this.start)}}class uo extends js{constructor(){super(...arguments),this.declarationInit=null}addExportedVariables(e){this.argument.addExportedVariables(e)}bind(){super.bind(),null!==this.declarationInit&&this.declarationInit.deoptimizePath([Se,Se])}declare(e,t){return this.declarationInit=t,this.argument.declare(e,Pe)}deoptimizePath(e){0===e.length&&this.argument.deoptimizePath(Ae)}hasEffectsWhenAssignedAtPath(e,t){return e.length>0||this.argument.hasEffectsWhenAssignedAtPath(Ae,t)}}class co extends js{constructor(){super(...arguments),this.isPrototypeDeoptimized=!1}createScope(e){this.scope=new Ys(e,this.context)}deoptimizePath(e){1===e.length&&("prototype"===e[0]?this.isPrototypeDeoptimized=!0:e[0]===Se&&(this.isPrototypeDeoptimized=!0,this.scope.getReturnExpression().deoptimizePath(Ce)))}getReturnExpressionWhenCalledAtPath(e){return 0===e.length?this.scope.getReturnExpression():Pe}hasEffects(){return null!==this.id&&this.id.hasEffects()}hasEffectsWhenAccessedAtPath(e){return!(e.length<=1)&&(e.length>2||"prototype"!==e[0]||this.isPrototypeDeoptimized)}hasEffectsWhenAssignedAtPath(e){return!(e.length<=1)&&(e.length>2||"prototype"!==e[0]||this.isPrototypeDeoptimized)}hasEffectsWhenCalledAtPath(e,t,n){if(e.length>0)return!0;const i=this.scope.getOptionsWhenCalledWith(t,n);for(const e of this.params)if(e.hasEffects(i))return!0;return this.body.hasEffects(i)}include(e){this.included=!0,this.body.include(e),this.id&&this.id.include();const t=this.scope.argumentsVariable.included;for(const n of this.params)n instanceof ho&&!t||n.include(e)}includeCallArguments(e){this.scope.includeCallArguments(e)}initialise(){null!==this.id&&this.id.declare("function",this),this.scope.addParameterVariables(this.params.map(e=>e.declare("parameter",Pe)),this.params[this.params.length-1]instanceof uo),this.body.addImplicitReturnExpressionToScope()}parseNode(e){this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope.hoistedBodyVarScope),super.parseNode(e)}}co.prototype.preventChildBlockScope=!0;class lo extends co{initialise(){super.initialise(),null!==this.id&&(this.id.variable.isId=!0)}parseNode(e){null!==e.id&&(this.id=new this.context.nodeConstructors.Identifier(e.id,this,this.scope.parent)),super.parseNode(e)}}const po=/\s/;class fo extends js{include(e){super.include(e),e&&this.context.includeVariable(this.variable)}initialise(){const e=this.declaration;this.declarationName=e.id&&e.id.name||this.declaration.name,this.variable=this.scope.addExportDefaultDeclaration(this.declarationName||this.context.getModuleName(),this,this.context),this.context.addExport(this)}render(e,t,{start:n,end:i}=X){const r=function(e,t=0){for(t=pe(e,"default",t)+7;po.test(e[t]);)t++;return t}(e.original,this.start);if(this.declaration instanceof lo)this.renderNamedDeclaration(e,r,"function",null===this.declaration.id,t);else if(this.declaration instanceof Us)this.renderNamedDeclaration(e,r,"class",null===this.declaration.id,t);else{if(this.variable.getOriginalVariable()!==this.variable)return void("system"===t.format&&this.variable.exportName?e.overwrite(n,i,`exports('${this.variable.exportName}', ${this.variable.getName()});`):ue(this,e,n,i));if(!this.variable.included)return e.remove(this.start,r),this.declaration.render(e,t,{isCalleeOfRenderedParent:!1,renderedParentType:ee}),void(";"!==e.original[this.end-1]&&e.appendLeft(this.end,";"));this.renderVariableDeclaration(e,r,t)}this.declaration.render(e,t)}renderNamedDeclaration(e,t,n,i,r){const s=this.variable.getName();e.remove(this.start,t),i&&e.appendLeft(function(e,t,n=0){const i=pe(e,t,n)+t.length;e=e.slice(i,pe(e,"{",i));const r=pe(e,"*");return-1===r?i:i+r+1}(e.original,n,t),` ${s}`),"system"===r.format&&this.declaration instanceof Us&&this.variable.exportName&&e.appendLeft(this.end,` exports('${this.variable.exportName}', ${s});`)}renderVariableDeclaration(e,t,n){const i="system"===n.format&&this.variable.exportName?`exports('${this.variable.exportName}', `:"";e.overwrite(this.start,t,`${n.varOrConst} ${this.variable.getName()} = ${i}`);const r=59===e.original.charCodeAt(this.end-1);i?e.appendRight(r?this.end-1:this.end,")"+(r?"":";")):r||e.appendLeft(this.end,";")}}fo.prototype.needsBoundaries=!0;class mo extends _t{constructor(e,t,n){super(e,t,t.declaration,n),this.hasId=!1,this.originalId=null,this.originalVariable=null;const i=t.declaration;(i instanceof lo||i instanceof Us)&&i.id?(this.hasId=!0,this.originalId=i.id):i instanceof ho&&(this.originalId=i)}addReference(e){this.hasId||(this.name=e.name)}getAssignedVariableName(){return this.originalId&&this.originalId.name||null}getBaseVariableName(){const e=this.getOriginalVariable();return e===this?super.getBaseVariableName():e.getBaseVariableName()}getName(){const e=this.getOriginalVariable();return e===this?super.getName():e.getName()}getOriginalVariable(){if(null===this.originalVariable)if(!this.originalId||!this.hasId&&this.originalId.variable.isReassigned)this.originalVariable=this;else{const e=this.originalId.variable;this.originalVariable=e instanceof mo?e.getOriginalVariable():e}return this.originalVariable}setRenderNames(e,t){const n=this.getOriginalVariable();n===this?super.setRenderNames(e,t):n.setRenderNames(e,t)}setSafeName(e){const t=this.getOriginalVariable();t===this?super.setSafeName(e):t.setSafeName(e)}}const go="_missingExportShim",yo="_interopDefault",vo="_interopNamespace";class xo extends et{constructor(e){super(go),this.module=e}}class Eo extends et{constructor(e){super(e.getModuleName()),this.memberVariables=Object.create(null),this.containsExternalNamespace=!1,this.referencedEarly=!1,this.references=[],this.context=e,this.module=e.module}addReference(e){this.references.push(e),this.name=e.name}deoptimizePath(){for(const e in this.memberVariables)this.memberVariables[e].deoptimizePath(Ce)}include(){if(!this.included){this.containsExternalNamespace&&this.context.error({code:"NAMESPACE_CANNOT_CONTAIN_EXTERNAL",id:this.module.id,message:`Cannot create an explicit namespace object for module "${this.context.getModuleName()}" because it contains a reexported external namespace`},void 0),this.included=!0;for(const e of this.references)if(e.context.getModuleExecIndex()<=this.context.getModuleExecIndex()){this.referencedEarly=!0;break}if(this.context.preserveModules)for(const e of Object.keys(this.memberVariables))this.memberVariables[e].include();else for(const e of Object.keys(this.memberVariables))this.context.includeVariable(this.memberVariables[e])}}initialise(){for(const e of this.context.getExports().concat(this.context.getReexports()))"*"===e[0]&&e.length>1&&(this.containsExternalNamespace=!0),this.memberVariables[e]=this.context.traceExport(e)}renderBlock(e){const t=e.compact?"":" ",n=e.compact?"":"\n",i=e.indent,r=Object.keys(this.memberVariables).map(n=>{const r=this.memberVariables[n];if(this.referencedEarly||r.isReassigned)return`${i}get ${n}${t}()${t}{${t}return ${r.getName()}${e.compact?"":";"}${t}}`;const s=Ee[n]?`'${n}'`:n;return`${i}${s}: ${r.getName()}`});r.unshift(`${i}__proto__:${t}null`),e.namespaceToStringTag&&r.unshift(`${i}[Symbol.toStringTag]:${t}'Module'`);const s=this.getName(),o=e.freeze?"/*#__PURE__*/Object.freeze":"",a=r.join(`,${n}`);let h=`${e.varOrConst} ${s}${t}=${t}${o}({${n}${a}${n}});`;return"system"===e.format&&this.exportName&&(h+=`${n}exports('${this.exportName}',${t}${s});`),h}renderFirst(){return this.referencedEarly}}Eo.prototype.isNamespace=!0;const _o="Object.defineProperty(exports, '__esModule', { value: true });",bo="Object.defineProperty(exports,'__esModule',{value:true});";function So(e,t,n,i,r,s,o="return "){const a=r?"":" ",h=r?"":"\n";if(!n){let n;if(e.length>0)n=e[0].local;else for(const e of t)if(e.reexports){const t=e.reexports[0];n=e.namedExportsMode&&"*"!==t.imported&&"default"!==t.imported?`${e.name}.${t.imported}`:e.name}return`${o}${n};`}let u="";t.forEach(({name:e,reexports:t})=>{t&&n&&t.forEach(t=>{"*"===t.reexported&&(u&&(u+=h),t.needsLiveBinding?u+=`Object.keys(${e}).forEach(function${a}(k)${a}{${h}`+`${s}if${a}(k${a}!==${a}'default')${a}Object.defineProperty(exports,${a}k,${a}{${h}`+`${s}${s}enumerable:${a}true,${h}`+`${s}${s}get:${a}function${a}()${a}{${h}`+`${s}${s}${s}return ${e}[k];${h}`+`${s}${s}}${h}${s}});${h}});`:u+=`Object.keys(${e}).forEach(function${a}(k)${a}{${h}`+`${s}if${a}(k${a}!==${a}'default')${a}exports[k]${a}=${a}${e}[k];${h}});`)})});for(const{name:e,imports:r,reexports:o,isChunk:c,namedExportsMode:l,exportsNames:p}of t)if(o&&n)for(const t of o)if("default"!==t.imported||c)if("*"!==t.imported){u&&(u+=h);const n="default"!==t.imported||l?`${e}.${t.imported}`:e;u+=t.needsLiveBinding?`Object.defineProperty(exports,${a}'${t.reexported}',${a}{${h}`+`${s}enumerable:${a}true,${h}`+`${s}get:${a}function${a}()${a}{${h}`+`${s}${s}return ${n};${h}${s}}${h}});`:`exports.${t.reexported}${a}=${a}${n};`}else"*"!==t.reexported&&(u&&(u+=h),u+=`exports.${t.reexported}${a}=${a}${e};`);else u&&(u+=h),p&&(o.some(e=>"default"===e.imported?"default"===e.reexported:"*"!==e.imported)||r&&r.some(e=>"default"!==e.imported))?u+=`exports.${t.reexported}${a}=${a}${e}${!1!==i?"__default":".default"};`:u+=`exports.${t.reexported}${a}=${a}${e};`;for(const t of e){const e=`exports.${t.exported}`,n=t.local;e!==n&&(u&&(u+=h),u+=`${e}${a}=${a}${n};`)}return u}function Ao(e,t,n){const i=t.compact?"":" ";return e.map(({name:e,exportsNames:r,exportsDefault:s,namedExportsMode:o})=>o&&s&&!1!==t.interop?r?`${n} ${e}__default${i}=${i}'default'${i}in ${e}${i}?`+`${i}${e}['default']${i}:${i}${e};`:`${e}${i}=${i}${e}${i}&&${i}${e}.hasOwnProperty('default')${i}?`+`${i}${e}['default']${i}:${i}${e};`:null).filter(Boolean).join(t.compact?"":"\n")}function Co(e,t,n,i){return`${i}var d${e}=${e}Object.getOwnPropertyDescriptor(e,${e}k);${t}`+`${i}Object.defineProperty(n,${e}k,${e}d.get${e}?${e}d${e}:${e}{${t}`+`${i}${n}enumerable:${e}true,${t}`+`${i}${n}get:${e}function${e}()${e}{${t}`+`${i}${n}${n}return e[k];${t}`+`${i}${n}}${t}`+`${i}});${t}`}function Io(e,t,n,i){return`${i}n[k]${e}=e${e}[k];${t}`}function wo(e,t,n,i){return`function ${vo}(e)${e}{${t}`+`${n}if${e}(e${e}&&${e}e.__esModule)${e}{${e}return e;${e}}${e}else${e}{${t}`+`${n}${n}var n${e}=${e}{};${t}`+`${n}${n}if${e}(e)${e}{${t}`+`${n}${n}${n}Object.keys(e).forEach(function${e}(k)${e}{${t}`+(i?Co:Io)(e,t,n,n+n+n+n)+`${n}${n}${n}});${t}`+`${n}${n}}${t}`+`${n}${n}n['default']${e}=${e}e;${t}`+`${n}${n}return n;${t}`+`${n}}${t}`+`}${t}${t}`}const Po={assert:!0,buffer:!0,console:!0,constants:!0,domain:!0,events:!0,http:!0,https:!0,os:!0,path:!0,process:!0,punycode:!0,querystring:!0,stream:!0,string_decoder:!0,timers:!0,tty:!0,url:!0,util:!0,vm:!0,zlib:!0};function ko(e,t){const n=t.map(({id:e})=>e).filter(e=>e in Po);n.length&&e({code:"MISSING_NODE_BUILTINS",message:`Creating a browser bundle that depends on Node.js built-in ${1===n.length?`module ('${n[0]}')`:`modules (${n.slice(0,-1).map(e=>`'${e}'`).join(", ")} and '${n.slice(-1)}')`}. You might need to include https://www.npmjs.com/package/rollup-plugin-node-builtins`,modules:n})}function No(e){return e.replace(/^\t+/,e=>e.split("\t").join("  "))}function $o(e,t,n){let i=e.split("\n");const r=Math.max(0,t-3);let s=Math.min(t+2,i.length);for(i=i.slice(r,s);!/\S/.test(i[i.length-1]);)i.pop(),s-=1;const o=String(s).length;return i.map((e,i)=>{const s=r+i+1===t;let a=String(i+r+1);for(;a.length<o;)a=` ${a}`;if(s){const t=function(e){let t="";for(;e--;)t+=" ";return t}(o+2+No(e.slice(0,n)).length)+"^";return`${a}: ${No(e)}\n${t}`}return`${a}: ${No(e)}`}).join("\n")}function Ro(e){return e.replace(/[\0?*]/g,"_")}function To(e){const t=dt(e);return t.substr(0,t.length-mt(e).length)}function Oo(e){return"undefined"!=typeof process&&ct(e)?gt(process.cwd(),e):e}function Mo(e){return"/"!==e[0]&&!("."===e[0]&&("/"===e[1]||"."===e[1]))&&Ro(e)===e}function Lo(e,t){throw e instanceof Error||(e=Object.assign(new Error(e.message),e)),t&&Object.assign(e,t),e}function Do(e,t,n,i){if("object"==typeof t){const{line:n,column:r}=t;e.loc={file:i,line:n,column:r}}else{e.pos=t;const{line:r,column:s}=At(n,t,{offsetLine:1});e.loc={file:i,line:r,column:s}}if(void 0===e.frame){const{line:t,column:i}=e.loc;e.frame=$o(n,t,i)}}var Vo;function Bo(e){return Object.assign({code:Vo.DEPRECATED_FEATURE},"string"==typeof e?{message:e}:e)}function zo(e,t,n){return{code:Vo.NAMESPACE_CONFLICT,message:`Conflicting namespaces: ${Oo(t.id)} re-exports '${e}' from both ${Oo(t.exportsAll[e])} and ${Oo(n.exportsAll[e])} (will be ignored)`,name:e,reexporter:t.id,sources:[t.exportsAll[e],n.exportsAll[e]]}}function Wo(e){return{code:Vo.VALIDATION_ERROR,message:e}}!function(e){e.ASSET_NOT_FINALISED="ASSET_NOT_FINALISED",e.ASSET_NOT_FOUND="ASSET_NOT_FOUND",e.ASSET_SOURCE_ALREADY_SET="ASSET_SOURCE_ALREADY_SET",e.ASSET_SOURCE_MISSING="ASSET_SOURCE_MISSING",e.BAD_LOADER="BAD_LOADER",e.CANNOT_EMIT_FROM_OPTIONS_HOOK="CANNOT_EMIT_FROM_OPTIONS_HOOK",e.CHUNK_NOT_GENERATED="CHUNK_NOT_GENERATED",e.DEPRECATED_FEATURE="DEPRECATED_FEATURE",e.FILE_NOT_FOUND="FILE_NOT_FOUND",e.FILE_NAME_CONFLICT="FILE_NAME_CONFLICT",e.INVALID_CHUNK="INVALID_CHUNK",e.INVALID_EXTERNAL_ID="INVALID_EXTERNAL_ID",e.INVALID_OPTION="INVALID_OPTION",e.INVALID_PLUGIN_HOOK="INVALID_PLUGIN_HOOK",e.INVALID_ROLLUP_PHASE="INVALID_ROLLUP_PHASE",e.NAMESPACE_CONFLICT="NAMESPACE_CONFLICT",e.PLUGIN_ERROR="PLUGIN_ERROR",e.UNRESOLVED_ENTRY="UNRESOLVED_ENTRY",e.UNRESOLVED_IMPORT="UNRESOLVED_IMPORT",e.VALIDATION_ERROR="VALIDATION_ERROR"}(Vo||(Vo={}));const jo=/^[a-zA-Z$_][a-zA-Z0-9$_]*$/;function Fo(e){return jo.test(e)?`.${e}`:`['${e}']`}function Uo(e){return e.split(".").map(Fo).join("")}function Go(e,t,n,i,r){const s=i?"":" ",o=e.split(".");n&&(o[0]=("function"==typeof n?n(o[0]):n[o[0]])||o[0]);const a=o.pop();let h=t,u=o.map(e=>(h+=Fo(e),`${h}${s}=${s}${h}${s}||${s}{}`)).concat(`${h}${Fo(a)}`).join(`,${s}`).concat(`${s}=${s}${r}`);return o.length>0&&(u=`(${u})`),u}function Ho(e){let t=e.length;for(;t--;){const n=e[t];if(n.exportsDefault||n.exportsNames)return e.slice(0,t+1)}return[]}const qo=e=>`this${Uo(e)}`;const Ko=(e,t,n,i,r)=>e?`${r}${i}${t} _starExcludes${n}=${n}{${n}${Array.from(e).join(`:${n}1,${n}`)}${e.size?`:${n}1`:""}${n}};`:"",Yo=(e,t,n,i)=>e.length?`${i}${n}var ${e.join(`,${t}`)};`:"";function Xo(e,t,n,i){return 0===e.length?"":1===e.length?`${n}${n}${n}exports('${e[0].name}',${t}${e[0].value});${i}${i}`:`${n}${n}${n}exports({${i}`+e.map(({name:e,value:i})=>`${n}${n}${n}${n}${e}:${t}${i}`).join(`,${i}`)+`${i}${n}${n}${n}});${i}${i}`}const Qo=(e,t,n,i)=>Xo(e.filter(e=>e.hoisted||e.uninitialized).map(e=>({name:e.exported,value:e.uninitialized?"void 0":e.local})),t,n,i),Jo=(e,t,n,i)=>Xo(e.filter(e=>e.local===go).map(e=>({name:e.exported,value:go})),t,n,i);function Zo(e,t){return e?`${t}${Uo(e)}`:"null"}var ea={system:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,outro:a,usesTopLevelAwait:h,varOrConst:u},c){const l=c.compact?"":"\n",p=c.compact?"":" ",d=n.map(e=>`'${e.id}'`),f=[];let m;const g=[];n.forEach(({imports:e,reexports:t})=>{const r=[];if(e&&e.forEach(e=>{f.push(e.local),"*"===e.imported?r.push(`${e.local}${p}=${p}module;`):r.push(`${e.local}${p}=${p}module.${e.imported};`)}),t){let e=!1;t.length>1||1===t.length&&("*"===t[0].reexported||"*"===t[0].imported)?(t.forEach(t=>{"*"===t.reexported&&(m||(m=function({dependencies:e,exports:t}){const n=new Set(t.map(e=>e.exported));return n.has("default")||n.add("default"),e.forEach(({reexports:e})=>{e&&e.forEach(e=>{"*"===e.imported||n.has(e.reexported)||n.add(e.reexported)})}),n}({dependencies:n,exports:i})),e||(r.push(`${u} _setter${p}=${p}{};`),e=!0),r.push(`for${p}(var _$p${p}in${p}module)${p}{`),r.push(`${s}if${p}(!_starExcludes[_$p])${p}_setter[_$p]${p}=${p}module[_$p];`),r.push("}"))}),t.forEach(e=>{"*"===e.imported&&"*"!==e.reexported&&r.push(`exports('${e.reexported}',${p}module);`)}),t.forEach(t=>{"*"!==t.reexported&&"*"!==t.imported&&(e||(r.push(`${u} _setter${p}=${p}{};`),e=!0),r.push(`_setter.${t.reexported}${p}=${p}module.${t.imported};`))}),e&&r.push("exports(_setter);")):t.forEach(e=>{r.push(`exports('${e.reexported}',${p}module.${e.imported});`)})}g.push(r.join(`${l}${s}${s}${s}`))});const y=c.name?`'${c.name}',${p}`:"",v=t.has("module")?`exports,${p}module`:r?"exports":"";let x=`System.register(${y}[`+d.join(`,${p}`)+`],${p}function${p}(${v})${p}{${l}${s}${c.strict?"'use strict';":""}`+Ko(m,u,p,s,l)+Yo(f,p,s,l)+`${l}${s}return${p}{${g.length?`${l}${s}${s}setters:${p}[${g.map(e=>e?`function${p}(module)${p}{${l}${s}${s}${s}${e}${l}${s}${s}}`:`function${p}()${p}{}`).join(`,${p}`)}],`:""}${l}`;x+=`${s}${s}execute:${p}${h?`async${p}`:""}function${p}()${p}{${l}${l}`+Qo(i,p,s,l);const E=`${l}${l}`+Jo(i,p,s,l)+`${s}${s}}${l}${s}}${c.compact?"":";"}${l}});`;return o&&e.prepend(o),a&&e.append(a),e.indent(`${s}${s}${s}`).append(E).prepend(x)},amd:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,isEntryModuleFacade:a,namedExportsMode:h,outro:u,varOrConst:c,warn:l},p){ko(l,n);const d=n.map(e=>`'${function(e){return"."===e[0]&&e.endsWith(".js")?e.slice(0,-3):e}(e.id)}'`),f=n.map(e=>e.name),m=p.compact?"":"\n",g=p.compact?"":" ";h&&r&&(f.unshift("exports"),d.unshift("'exports'")),t.has("require")&&(f.unshift("require"),d.unshift("'require'")),t.has("module")&&(f.unshift("module"),d.unshift("'module'"));const y=p.amd||{},v=(y.id?`'${y.id}',${g}`:"")+(d.length?`[${d.join(`,${g}`)}],${g}`:""),x=!1!==p.strict?`${g}'use strict';`:"",E=`${y.define||"define"}(${v}function${g}(${f.join(`,${g}`)})${g}{${x}${m}${m}`,_=Ao(n,p,c);_&&e.prepend(_+m+m),t.has(vo)&&e.prepend(wo(g,m,s,!1!==p.externalLiveBindings)),o&&e.prepend(o);const b=So(i,n,h,p.interop,p.compact,s);return b&&e.append(m+m+b),h&&r&&a&&p.esModule&&e.append(`${m}${m}${p.compact?bo:_o}`),u&&e.append(u),e.indent(s).append(m+m+"});").prepend(E)},cjs:function(e,{accessedGlobals:t,dependencies:n,exports:i,hasExports:r,indentString:s,intro:o,isEntryModuleFacade:a,namedExportsMode:h,outro:u,varOrConst:c},l){const p=l.compact?"":"\n",d=l.compact?"":" ";o=(!1===l.strict?o:`'use strict';${p}${p}${o}`)+(h&&r&&a&&l.esModule?`${l.compact?bo:_o}${p}${p}`:"");let f=!1;const m=!1!==l.interop;let g,y=!1;g="";for(const{id:e,namedExportsMode:t,isChunk:i,name:r,reexports:s,imports:o,exportsNames:a,exportsDefault:h}of n)s||o?(g+=l.compact&&y?",":`${g?`;${p}`:""}${c} `,y=!0,m&&!i&&h&&t?(f=!0,g+=a?`${r}${d}=${d}require('${e}')${l.compact?",":`;\n${c} `}${r}__default${d}=${d}${yo}(${r})`:`${r}${d}=${d}${yo}(require('${e}'))`):g+=`${r}${d}=${d}require('${e}')`):(g&&(g+=!l.compact||y?`;${p}`:","),y=!1,g+=`require('${e}')`);if(g&&(g+=";"),f){const e=l.compact?"e":"ex";o+=`function ${yo}${d}(${e})${d}{${d}return${d}`+`(${e}${d}&&${d}(typeof ${e}${d}===${d}'object')${d}&&${d}'default'${d}in ${e})${d}`+`?${d}${e}['default']${d}:${d}${e}${l.compact?"":"; "}}${p}${p}`}t.has(vo)&&(o+=wo(d,p,s,!1!==l.externalLiveBindings)),g&&(o+=g+p+p);const v=So(i,n,h,l.interop,l.compact,s,`module.exports${d}=${d}`);return e.prepend(o),v&&e.append(p+p+v),u&&e.append(u),e},es:function(e,{intro:t,outro:n,dependencies:i,exports:r},s){const o=s.compact?"":" ",a=s.compact?"":"\n",h=i.map(({id:e,reexports:t,imports:n,name:i})=>{if(!t&&!n)return`import${o}'${e}';`;let r="";if(n){const t=n.find(e=>"default"===e.imported),i=n.find(e=>"*"===e.imported);i&&(r+=`import${o}*${o}as ${i.local} from${o}'${e}';`,n.length>1&&(r+=a)),t&&1===n.length?r+=`import ${t.local} from${o}'${e}';`:(!i||n.length>1)&&(r+=`import ${t?`${t.local},${o}`:""}{${o}${n.filter(e=>e!==t&&e!==i).map(e=>e.imported===e.local?e.imported:`${e.imported} as ${e.local}`).join(`,${o}`)}${o}}${o}from${o}'${e}';`)}if(t){n&&(r+=a);const s=t.find(e=>"*"===e.reexported),h=t.find(e=>"*"===e.imported&&"*"!==e.reexported);if(s){if(r+=`export${o}*${o}from${o}'${e}';`,1===t.length)return r;r+=a}if(h){if(n&&n.some(e=>"*"===e.imported&&e.local===i)||(r+=`import${o}*${o}as ${i} from${o}'${e}';${a}`),r+=`export${o}{${o}${i===h.reexported?i:`${i} as ${h.reexported}`} };`,t.length===(s?2:1))return r;r+=a}r+=`export${o}{${o}${t.filter(e=>e!==s&&e!==h).map(e=>e.imported===e.reexported?e.imported:`${e.imported} as ${e.reexported}`).join(`,${o}`)}${o}}${o}from${o}'${e}';`}return r}).join(a);h&&(t+=h+a+a),t&&e.prepend(t);const u=[],c=[];return r.forEach(e=>{"default"===e.exported?u.push(`export default ${e.local};`):c.push(e.exported===e.local?e.local:`${e.local} as ${e.exported}`)}),c.length&&u.push(`export${o}{${o}${c.join(`,${o}`)}${o}};`),u.length&&e.append(a+a+u.join(a).trim()),n&&e.append(n),e.trim()},iife:function(e,{dependencies:t,exports:n,hasExports:i,indentString:r,intro:s,namedExportsMode:o,outro:a,varOrConst:h,warn:u},c){const l=c.compact?"":" ",p=c.compact?"":"\n",{extend:d,name:f}=c,m=f&&-1!==f.indexOf("."),g=!d&&!m;var y;f&&g&&(ot(y=f)||rt[y]||st.test(y))&&Lo({code:"ILLEGAL_IDENTIFIER_AS_NAME",message:`Given name (${f}) is not legal JS identifier. If you need this you can try --extend option`}),ko(u,t);const v=Ho(t),x=v.map(e=>e.globalName||"null"),E=v.map(e=>e.name);i&&!f&&Lo({code:"INVALID_OPTION",message:'You must supply "output.name" for IIFE bundles.'}),o&&i&&(d?(x.unshift(`${qo(f)}${l}=${l}${qo(f)}${l}||${l}{}`),E.unshift("exports")):(x.unshift("{}"),E.unshift("exports")));const _=!1!==c.strict?`${r}'use strict';${p}${p}`:"";let b=`(function${l}(${E.join(`,${l}`)})${l}{${p}${_}`;!i||d&&o||(b=(g?`${h} ${f}`:qo(f))+`${l}=${l}${b}`),m&&i&&(b=function(e,t,n,i){const r=e.split(".");n&&(r[0]=("function"==typeof n?n(r[0]):n[r[0]])||r[0]);const s=i?"":" ";r.pop();let o=t;return r.map(e=>(o+=Fo(e),`${o}${s}=${s}${o}${s}||${s}{}${i?"":";"}`)).join(i?",":"\n")+(i&&r.length?";":"\n")}(f,"this",c.globals,c.compact)+b);let S=`${p}${p}}(${x.join(`,${l}`)}));`;!d&&o&&i&&(S=`${p}${p}${r}return exports;${S}`);const A=Ao(t,c,h);A&&e.prepend(A+p+p),s&&e.prepend(s);const C=So(n,t,o,c.interop,c.compact,r);return C&&e.append(p+p+C),a&&e.append(a),e.indent(r).prepend(b).append(S)},umd:function(e,{dependencies:t,exports:n,hasExports:i,indentString:r,intro:s,namedExportsMode:o,outro:a,varOrConst:h,warn:u},c){const l=c.compact?"":" ",p=c.compact?"":"\n",d=c.compact?"f":"factory",f=c.compact?"g":"global";i&&!c.name&&Lo({code:"INVALID_OPTION",message:'You must supply "output.name" for UMD bundles.'}),ko(u,t);const m=t.map(e=>`'${e.id}'`),g=t.map(e=>`require('${e.id}')`),y=Ho(t),v=y.map(e=>Zo(e.globalName,f)),x=y.map(e=>e.name);o&&(i||!0===c.noConflict)&&(m.unshift("'exports'"),g.unshift("exports"),v.unshift(Go(c.name,f,c.globals,c.compact,`${c.extend?`${Zo(c.name,f)}${l}||${l}`:""}{}`)),x.unshift("exports"));const E=c.amd||{},_=(E.id?`'${E.id}',${l}`:"")+(m.length?`[${m.join(`,${l}`)}],${l}`:""),b=E.define||"define",S=!o&&i?`module.exports${l}=${l}`:"",A=!1!==c.strict?`${l}'use strict';${p}`:"";let C;if(!0===c.noConflict){const e=c.compact?"e":"exports";let t;if(!o&&i)t=`var ${e}${l}=${l}${Go(c.name,f,c.globals,c.compact,`${d}(${v.join(`,${l}`)})`)};`;else if(o){t=`var ${e}${l}=${l}${v.shift()};${p}`+`${r}${r}${d}(${[e].concat(v).join(`,${l}`)});`}C=`(function${l}()${l}{${p}`+`${r}${r}var current${l}=${l}${function(e,t,n){const i=e.split(".");let r=t;return i.map(e=>(r+=Fo(e),r)).join(`${n}&&${n}`)}(c.name,f,l)};${p}`+`${r}${r}${t}${p}`+`${r}${r}${e}.noConflict${l}=${l}function${l}()${l}{${l}`+`${Zo(c.name,f)}${l}=${l}current;${l}return ${e}${c.compact?"":"; "}};${p}`+`${r}}())`}else C=`${d}(${v.join(`,${l}`)})`,!o&&i&&(C=Go(c.name,f,c.globals,c.compact,C));const I=i||!0===c.noConflict&&o||v.length>0,w=I?`this,${l}`:"",P=I?`(${f}${l}=${l}${f}${l}||${l}self,${l}`:"",k=I?")":"",N=`(function${l}(${I?`${f},${l}`:""}${d})${l}{${p}`+(I?`${r}typeof exports${l}===${l}'object'${l}&&${l}typeof module${l}!==${l}'undefined'${l}?`+`${l}${S}${d}(${g.join(`,${l}`)})${l}:${p}`:"")+`${r}typeof ${b}${l}===${l}'function'${l}&&${l}${b}.amd${l}?${l}${b}(${_}${d})${l}:${p}`+`${r}${P}${C}${k};${p}`+`}(${w}function${l}(${x.join(", ")})${l}{${A}${p}`,$=p+p+"}));",R=Ao(t,c,h);R&&e.prepend(R+p+p),s&&e.prepend(s);const T=So(n,t,o,c.interop,c.compact,r);return T&&e.append(p+p+T),o&&i&&c.esModule&&e.append(p+p+(c.compact?bo:_o)),a&&e.append(a),e.trim().indent(r).append($).prepend(N)}};const ta={ArrayPattern(e,t){for(const n of t.elements)n&&ta[n.type](e,n)},AssignmentPattern(e,t){ta[t.left.type](e,t.left)},Identifier(e,t){e.push(t.name)},MemberExpression(){},ObjectPattern(e,t){for(const n of t.properties)"RestElement"===n.type?ta.RestElement(e,n):ta[n.value.type](e,n.value)},RestElement(e,t){ta[t.argument.type](e,t.argument)}},na=function(e){const t=[];return ta[e.type](t,e),t};class ia extends St{addDeclaration(e,t,n=null,i=!1){return i?this.parent.addDeclaration(e,t,Pe,!0):super.addDeclaration(e,t,n,!1)}}class ra extends js{addImplicitReturnExpressionToScope(){const e=this.body[this.body.length-1];e&&e.type===ae||this.scope.addReturnExpression(Pe)}createScope(e){this.scope=this.parent.preventChildBlockScope?e:new ia(e)}hasEffects(e){for(const t of this.body)if(t.hasEffects(e))return!0;return!1}include(e){this.included=!0;for(const t of this.body)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){this.body.length?fe(this.body,e,this.start+1,this.end-1,t):super.render(e,t)}}class sa extends js{createScope(e){this.scope=new Ks(e,this.context)}deoptimizePath(e){1===e.length&&e[0]===Se&&this.scope.getReturnExpression().deoptimizePath(Ce)}getReturnExpressionWhenCalledAtPath(e){return 0===e.length?this.scope.getReturnExpression():Pe}hasEffects(e){return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}hasEffectsWhenAssignedAtPath(e,t){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){if(e.length>0)return!0;for(const e of this.params)if(e.hasEffects(n))return!0;return this.body.hasEffects(n)}include(e){this.included=!0,this.body.include(e);for(const t of this.params)t instanceof ho||t.include(e)}includeCallArguments(e){this.scope.includeCallArguments(e)}initialise(){this.scope.addParameterVariables(this.params.map(e=>e.declare("parameter",Pe)),this.params[this.params.length-1]instanceof uo),this.body instanceof ra?this.body.addImplicitReturnExpressionToScope():this.scope.addReturnExpression(this.body)}parseNode(e){e.body.type===Q&&(this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope.hoistedBodyVarScope)),super.parseNode(e)}}function oa(e){return 1===e.length?`exports('${e[0].safeExportName||e[0].exportName}', ${e[0].getName()});`:`exports({${e.map(e=>`${e.safeExportName||e.exportName}: ${e.getName()}`).join(", ")}});`}sa.prototype.preventChildBlockScope=!0;const aa={};class ha{constructor(e=Ls.Map()){this.entityPaths=e}isTracked(e,t){return this.entityPaths.getIn([e,...t,aa])}track(e,t){return new ha(this.entityPaths.setIn([e,...t,aa],!0))}}const ua=new ha;class ca extends js{initialise(){this.directive&&"use strict"!==this.directive&&this.parent.type===se&&this.context.warn({code:"MODULE_LEVEL_DIRECTIVE",message:`Module level directives cause errors when bundled, '${this.directive}' was ignored.`},this.start)}render(e,t){super.render(e,t),this.included&&this.insertSemicolon(e)}shouldBeIncluded(){return this.directive&&"use strict"!==this.directive?this.parent.type!==se:super.shouldBeIncluded()}}const la={"!=":(e,t)=>e!=t,"!==":(e,t)=>e!==t,"%":(e,t)=>e%t,"&":(e,t)=>e&t,"*":(e,t)=>e*t,"**":(e,t)=>Math.pow(e,t),"+":(e,t)=>e+t,"-":(e,t)=>e-t,"/":(e,t)=>e/t,"<":(e,t)=>e<t,"<<":(e,t)=>e<<t,"<=":(e,t)=>e<=t,"==":(e,t)=>e==t,"===":(e,t)=>e===t,">":(e,t)=>e>t,">=":(e,t)=>e>=t,">>":(e,t)=>e>>t,">>>":(e,t)=>e>>>t,"^":(e,t)=>e^t,in:()=>we,instanceof:()=>we,"|":(e,t)=>e|t};class pa extends qs{addDeclaration(e,t,n=null,i=!1){return i?this.parent.addDeclaration(e,t,n,!0):super.addDeclaration(e,t,n,!1)}}class da extends js{createScope(e){this.scope=new pa(e,this.context)}initialise(){this.param&&this.param.declare("parameter",Pe)}parseNode(e){this.body=new this.context.nodeConstructors.BlockStatement(e.body,this,this.scope),super.parseNode(e)}}da.prototype.preventChildBlockScope=!0;class fa{constructor(e){this.included=!1,this.expressions=e}deoptimizePath(e){for(const t of this.expressions)t.deoptimizePath(e)}getLiteralValueAtPath(){return we}getReturnExpressionWhenCalledAtPath(e,t,n){return new fa(this.expressions.map(i=>i.getReturnExpressionWhenCalledAtPath(e,t,n)))}hasEffectsWhenAccessedAtPath(e,t){for(const n of this.expressions)if(n.hasEffectsWhenAccessedAtPath(e,t))return!0;return!1}hasEffectsWhenAssignedAtPath(e,t){for(const n of this.expressions)if(n.hasEffectsWhenAssignedAtPath(e,t))return!0;return!1}hasEffectsWhenCalledAtPath(e,t,n){for(const i of this.expressions)if(i.hasEffectsWhenCalledAtPath(e,t,n))return!0;return!1}include(){}includeCallArguments(e){for(const t of this.expressions)t.includeCallArguments(e)}}class ma extends js{hasEffects(){return!1}initialise(){this.context.addExport(this)}render(e,t,{start:n,end:i}=X){e.remove(n,i)}}ma.prototype.needsBoundaries=!0;class ga extends js{bind(){null!==this.declaration&&this.declaration.bind()}hasEffects(e){return null!==this.declaration&&this.declaration.hasEffects(e)}initialise(){this.context.addExport(this)}render(e,t,{start:n,end:i}=X){null===this.declaration?e.remove(n,i):(e.remove(this.start,this.declaration.start),this.declaration.render(e,t,{start:n,end:i}))}}ga.prototype.needsBoundaries=!0;class ya extends js{bind(){}hasEffects(){return!1}initialise(){this.context.addImport(this)}render(e,t,{start:n,end:i}=X){e.remove(n,i)}}ya.prototype.needsBoundaries=!0;class va extends js{getLiteralValueAtPath(e){return e.length>0||null===this.value&&110!==this.context.code.charCodeAt(this.start)||"bigint"==typeof this.value||47===this.context.code.charCodeAt(this.start)?we:this.value}getReturnExpressionWhenCalledAtPath(e){return 1!==e.length?Pe:Ze(this.members,e[0])}hasEffectsWhenAccessedAtPath(e){return null===this.value?e.length>0:e.length>1}hasEffectsWhenAssignedAtPath(e){return e.length>0}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Je(this.members,e[0],this.included,t,n)}initialise(){this.members=function(e){switch(typeof e){case"boolean":return Ye;case"number":return Xe;case"string":return Qe;default:return Object.create(null)}}(this.value)}render(e,t){"string"==typeof this.value&&e.indentExclusionRanges.push([this.start+1,this.end-1])}}function xa(e){return e.computed?function(e){if(e instanceof va)return String(e.value);return null}(e.property):e.property.name}class Ea extends js{constructor(){super(...arguments),this.variable=null,this.bound=!1,this.expressionsToBeDeoptimized=[],this.replacement=null}addExportedVariables(){}bind(){if(this.bound)return;this.bound=!0;const e=function e(t){const n=t.propertyKey,i=t.object;if("string"==typeof n){if(i instanceof ho)return[{key:i.name,pos:i.start},{key:n,pos:t.property.start}];if(i instanceof Ea){const r=e(i);return r&&[...r,{key:n,pos:t.property.start}]}}return null}(this),t=e&&this.scope.findVariable(e[0].key);if(t&&t.isNamespace){const n=this.resolveNamespaceVariables(t,e.slice(1));n?"string"==typeof n?this.replacement=n:(n instanceof tt&&n.module&&n.module.suggestName(e[0].key),this.variable=n,this.scope.addNamespaceMemberAccess(function(e){let t=e[0].key;for(let n=1;n<e.length;n++)t+="."+e[n].key;return t}(e),n)):super.bind()}else super.bind(),null===this.propertyKey&&this.analysePropertyKey()}deoptimizeCache(){for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}deoptimizePath(e){this.bound||this.bind(),0===e.length&&this.disallowNamespaceReassignment(),this.variable?this.variable.deoptimizePath(e):(null===this.propertyKey&&this.analysePropertyKey(),this.object.deoptimizePath([this.propertyKey,...e]))}getLiteralValueAtPath(e,t,n){return this.bound||this.bind(),null!==this.variable?this.variable.getLiteralValueAtPath(e,t,n):(null===this.propertyKey&&this.analysePropertyKey(),this.expressionsToBeDeoptimized.push(n),this.object.getLiteralValueAtPath([this.propertyKey,...e],t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.bound||this.bind(),null!==this.variable?this.variable.getReturnExpressionWhenCalledAtPath(e,t,n):(null===this.propertyKey&&this.analysePropertyKey(),this.expressionsToBeDeoptimized.push(n),this.object.getReturnExpressionWhenCalledAtPath([this.propertyKey,...e],t,n))}hasEffects(e){return this.property.hasEffects(e)||this.object.hasEffects(e)||this.context.propertyReadSideEffects&&this.object.hasEffectsWhenAccessedAtPath([this.propertyKey],e)}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null!==this.variable?this.variable.hasEffectsWhenAccessedAtPath(e,t):this.object.hasEffectsWhenAccessedAtPath([this.propertyKey,...e],t))}hasEffectsWhenAssignedAtPath(e,t){return null!==this.variable?this.variable.hasEffectsWhenAssignedAtPath(e,t):this.object.hasEffectsWhenAssignedAtPath([this.propertyKey,...e],t)}hasEffectsWhenCalledAtPath(e,t,n){return null!==this.variable?this.variable.hasEffectsWhenCalledAtPath(e,t,n):this.object.hasEffectsWhenCalledAtPath([this.propertyKey,...e],t,n)}include(e){this.included||(this.included=!0,null!==this.variable&&this.context.includeVariable(this.variable)),this.object.include(e),this.property.include(e)}includeCallArguments(e){this.variable?this.variable.includeCallArguments(e):super.includeCallArguments(e)}initialise(){this.propertyKey=xa(this)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i}=X){const r=n===J&&i;if(this.variable||this.replacement){let t=this.variable?this.variable.getName():this.replacement;r&&(t="0, "+t),e.overwrite(this.start,this.end,t,{contentOnly:!0,storeName:!0})}else r&&e.appendRight(this.start,"0, "),super.render(e,t)}analysePropertyKey(){this.propertyKey=Se;const e=this.property.getLiteralValueAtPath(Ae,ua,this);this.propertyKey=e===we?Se:String(e)}disallowNamespaceReassignment(){this.object instanceof ho&&this.scope.findVariable(this.object.name).isNamespace&&this.context.error({code:"ILLEGAL_NAMESPACE_REASSIGNMENT",message:`Illegal reassignment to import '${this.object.name}'`},this.start)}resolveNamespaceVariables(e,t){if(0===t.length)return e;if(!e.isNamespace)return null;const n=t[0].key,i=e instanceof tt?e.module.getVariableForExportName(n):e.context.traceExport(n);if(!i){const i=e instanceof tt?e.module.id:e.context.fileName;return this.context.warn({code:"MISSING_EXPORT",exporter:Oo(i),importer:Oo(this.context.fileName),message:`'${n}' is not exported by '${Oo(i)}'`,missing:n,url:"https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module"},t[0].pos),"undefined"}return this.resolveNamespaceVariables(i,t.slice(1))}}const _a=e=>(...t)=>{throw new Error(`Cannot use fs.${e} inside browser`)},ba=_a("lstatSync"),Sa=_a("readdirSync"),Aa=_a("readFile"),Ca=_a("realpathSync"),Ia=_a("writeFile");function wa(e,t){try{const n=ba(e);if(!t&&n.isSymbolicLink())return wa(Ca(e),t);if(t&&n.isSymbolicLink()||n.isFile()){const t=dt(e);if(-1!==Sa(ft(e)).indexOf(t))return e}}catch(e){}}function Pa(e){return function(t,n){return"undefined"==typeof process&&Lo({code:"MISSING_PROCESS",message:"It looks like you're using Rollup in a non-Node.js environment. This means you must supply a plugin with custom resolveId and load functions",url:"https://rollupjs.org/guide/en/#a-simple-example"}),void 0===n||ct(t)||"."===t[0]?function(e,t){let n=wa(e,t);return n||((n=wa(e+".mjs",t))?n:n=wa(e+".js",t))}(yt(n?ft(n):yt(),t),e):null}}const ka=(e,t="URL")=>`new ${t}(${e}).href`,Na=e=>`(document.currentScript && document.currentScript.src || new URL('${e}', document.baseURI).href)`,$a=e=>(t,n)=>{const i=e(n);return null===t?`({ url: ${i} })`:"url"===t?i:"undefined"},Ra={amd:$a(()=>ka("module.uri, document.baseURI")),cjs:$a(e=>`(typeof document === 'undefined' ? ${ka("'file:' + __filename","(require('u' + 'rl').URL)")} : ${Na(e)})`),iife:$a(e=>Na(e)),system:e=>null===e?"module.meta":`module.meta.${e}`,umd:$a(e=>`(typeof document === 'undefined' ? ${ka("'file:' + __filename","(require('u' + 'rl').URL)")} : ${Na(e)})`)},Ta=e=>ka(`'${e}', document.currentScript && document.currentScript.src || document.baseURI`),Oa={amd:e=>("."!==e[0]&&(e="./"+e),ka(`require.toUrl('${e}'), document.baseURI`)),cjs:e=>`(typeof document === 'undefined' ? ${ka(`'file:' + __dirname + '/${e}'`,"(require('u' + 'rl').URL)")} : ${Ta(e)})`,es:e=>ka(`'${e}', import.meta.url`),iife:e=>Ta(e),system:e=>ka(`'${e}', module.meta.url`),umd:e=>`(typeof document === 'undefined' ? ${ka(`'file:' + __dirname + '/${e}'`,"(require('u' + 'rl').URL)")} : ${Ta(e)})`},Ma={amd:["document","module","URL"],cjs:["document","require","URL"],iife:["document","URL"],system:["module"],umd:["document","require","URL"]},La={amd:["document","require","URL"],cjs:["document","require","URL"],iife:["document","URL"],system:["module","URL"],umd:["document","require","URL"]},Da="ROLLUP_ASSET_URL_",Va="ROLLUP_CHUNK_URL_",Ba="ROLLUP_FILE_URL_";class za extends js{bind(){super.bind(),this.argument.deoptimizePath([Se,Se])}}class Wa extends js{hasEffects(e){for(const t of this.body)if(t.hasEffects(e))return!0;return!1}include(e){this.included=!0;for(const t of this.body)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){this.body.length?fe(this.body,e,this.start,this.end,t):super.render(e,t)}}class ja extends js{getLiteralValueAtPath(e){return e.length>0||1!==this.quasis.length?we:this.quasis[0].value.cooked}render(e,t){e.indentExclusionRanges.push([this.start,this.end]),super.render(e,t)}}class Fa extends St{constructor(e,t){super(e),this.context=t,this.variables.set("this",new _t("this",null,ke,t))}addExportDefaultDeclaration(e,t,n){const i=new mo(e,t,n);return this.variables.set("default",i),i}addNamespaceMemberAccess(e,t){t instanceof ao&&this.accessedOutsideVariables.set(t.name,t)}deconflict(e){for(const t of this.children)t.deconflict(e)}findLexicalBoundary(){return this}findVariable(e){const t=this.variables.get(e)||this.accessedOutsideVariables.get(e);if(t)return t;const n=this.context.traceVariable(e)||this.parent.findVariable(e);return n instanceof ao&&this.accessedOutsideVariables.set(e,n),n}}const Ua={"!":e=>!e,"+":e=>+e,"-":e=>-e,delete:()=>we,typeof:e=>typeof e,void:()=>void 0,"~":e=>~e};function Ga(e){return null!==e.renderBaseName&&null!==e.exportName&&e.isReassigned}const Ha={ArrayExpression:class extends js{bind(){super.bind();for(const e of this.elements)null!==e&&e.deoptimizePath(Ce)}getReturnExpressionWhenCalledAtPath(e){return 1!==e.length?Pe:Ze(Ke,e[0])}hasEffectsWhenAccessedAtPath(e){return e.length>1}hasEffectsWhenCalledAtPath(e,t,n){return 1!==e.length||Je(Ke,e[0],this.included,t,n)}},ArrayPattern:class extends js{addExportedVariables(e){for(const t of this.elements)null!==t&&t.addExportedVariables(e)}declare(e,t){const n=[];for(const t of this.elements)null!==t&&n.push(...t.declare(e,Pe));return n}deoptimizePath(e){if(0===e.length)for(const t of this.elements)null!==t&&t.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){if(e.length>0)return!0;for(const e of this.elements)if(null!==e&&e.hasEffectsWhenAssignedAtPath(Ae,t))return!0;return!1}},ArrowFunctionExpression:sa,AssignmentExpression:class extends js{bind(){super.bind(),this.left.deoptimizePath(Ae),this.right.deoptimizePath(Ce)}hasEffects(e){return this.right.hasEffects(e)||this.left.hasEffects(e)||this.left.hasEffectsWhenAssignedAtPath(Ae,e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.right.hasEffectsWhenAccessedAtPath(e,t)}render(e,t){if(this.left.render(e,t),this.right.render(e,t),"system"===t.format)if(this.left.variable&&this.left.variable.exportName)e.prependLeft(e.original.indexOf("=",this.left.end)+1,` exports('${this.left.variable.exportName}',`),e.appendLeft(this.right.end,")");else if("addExportedVariables"in this.left){const t=[];this.left.addExportedVariables(t),t.length>0&&(e.prependRight(this.start,`function (v) {${oa(t)} return v;} (`),e.appendLeft(this.end,")"))}}},AssignmentPattern:class extends js{addExportedVariables(e){this.left.addExportedVariables(e)}bind(){super.bind(),this.left.deoptimizePath(Ae),this.right.deoptimizePath(Ce)}declare(e,t){return this.left.declare(e,t)}deoptimizePath(e){0===e.length&&this.left.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){return e.length>0||this.left.hasEffectsWhenAssignedAtPath(Ae,t)}render(e,t,{isShorthandProperty:n}=X){this.left.render(e,t,{isShorthandProperty:n}),this.right.render(e,t)}},AwaitExpression:class extends js{hasEffects(e){return super.hasEffects(e)||!e.ignoreReturnAwaitYield()}include(e){e:if(!this.included&&!this.context.usesTopLevelAwait){let e=this.parent;do{if(e instanceof co||e instanceof sa)break e}while(e=e.parent);this.context.usesTopLevelAwait=!0}super.include(e)}render(e,t){super.render(e,t)}},BinaryExpression:class extends js{deoptimizeCache(){}getLiteralValueAtPath(e,t,n){if(e.length>0)return we;const i=this.left.getLiteralValueAtPath(Ae,t,n);if(i===we)return we;const r=this.right.getLiteralValueAtPath(Ae,t,n);if(r===we)return we;const s=la[this.operator];return s?s(i,r):we}hasEffects(e){return"+"===this.operator&&this.parent instanceof ca&&""===this.left.getLiteralValueAtPath(Ae,ua,this)||super.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}},BlockStatement:ra,BreakStatement:class extends js{hasEffects(e){return super.hasEffects(e)||!e.ignoreBreakStatements()||null!==this.label&&!e.ignoreLabel(this.label.name)}},CallExpression:class extends js{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.returnExpression=null}bind(){if(super.bind(),this.callee instanceof ho){this.scope.findVariable(this.callee.name).isNamespace&&this.context.error({code:"CANNOT_CALL_NAMESPACE",message:`Cannot call a namespace ('${this.callee.name}')`},this.start),"eval"===this.callee.name&&this.context.warn({code:"EVAL",message:"Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification",url:"https://rollupjs.org/guide/en/#avoiding-eval"},this.start)}null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Ae,ua,this));for(const e of this.arguments)e.deoptimizePath(Ce)}deoptimizeCache(){if(this.returnExpression!==Pe){this.returnExpression=Pe;for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&!this.context.deoptimizationTracker.track(this,e)&&(null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Ae,ua,this)),this.returnExpression.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Ae,t,this)),this.returnExpression===Pe||t.isTracked(this.returnExpression,e)?we:(this.expressionsToBeDeoptimized.push(n),this.returnExpression.getLiteralValueAtPath(e,t.track(this.returnExpression,e),n))}getReturnExpressionWhenCalledAtPath(e,t,n){return null===this.returnExpression&&(this.returnExpression=this.callee.getReturnExpressionWhenCalledAtPath(Ae,t,this)),this.returnExpression===Pe||t.isTracked(this.returnExpression,e)?Pe:(this.expressionsToBeDeoptimized.push(n),this.returnExpression.getReturnExpressionWhenCalledAtPath(e,t.track(this.returnExpression,e),n))}hasEffects(e){for(const t of this.arguments)if(t.hasEffects(e))return!0;return(!this.context.annotations||!this.annotatedPure)&&(this.callee.hasEffects(e)||this.callee.hasEffectsWhenCalledAtPath(Ae,this.callOptions,e.getHasEffectsWhenCalledOptions()))}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&!t.hasReturnExpressionBeenAccessedAtPath(e,this)&&this.returnExpression.hasEffectsWhenAccessedAtPath(e,t.addAccessedReturnExpressionAtPath(e,this))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||!t.hasReturnExpressionBeenAssignedAtPath(e,this)&&this.returnExpression.hasEffectsWhenAssignedAtPath(e,t.addAssignedReturnExpressionAtPath(e,this))}hasEffectsWhenCalledAtPath(e,t,n){return!n.hasReturnExpressionBeenCalledAtPath(e,this)&&this.returnExpression.hasEffectsWhenCalledAtPath(e,t,n.addCalledReturnExpressionAtPath(e,this))}include(e){e?(super.include(e),e===zs&&this.callee instanceof ho&&this.callee.variable&&this.callee.variable.markCalledFromTryStatement()):(this.included=!0,this.callee.include(!1)),this.callee.includeCallArguments(this.arguments),this.returnExpression.included||this.returnExpression.include(!1)}initialise(){this.callOptions=be.create({args:this.arguments,callIdentifier:this,withNew:!1})}render(e,t,{renderedParentType:n}=X){if(this.callee.render(e,t),this.arguments.length>0)if(this.arguments[this.arguments.length-1].included)for(const n of this.arguments)n.render(e,t);else{let n=this.arguments.length-2;for(;n>=0&&!this.arguments[n].included;)n--;if(n>=0){for(let i=0;i<=n;i++)this.arguments[i].render(e,t);e.remove(pe(e.original,",",this.arguments[n].end),this.end-1)}else e.remove(pe(e.original,"(",this.callee.end)+1,this.end-1)}n===ee&&this.callee.type===te&&(e.appendRight(this.start,"("),e.prependLeft(this.end,")"))}},CatchClause:da,ClassBody:class extends js{hasEffectsWhenCalledAtPath(e,t,n){return e.length>0||null!==this.classConstructor&&this.classConstructor.hasEffectsWhenCalledAtPath(Ae,t,n)}initialise(){for(const e of this.body)if("constructor"===e.kind)return void(this.classConstructor=e);this.classConstructor=null}},ClassDeclaration:Us,ClassExpression:class extends Fs{},ConditionalExpression:class extends js{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.isBranchResolutionAnalysed=!1,this.unusedBranch=null,this.usedBranch=null}bind(){super.bind(),this.isBranchResolutionAnalysed||this.analyseBranchResolution()}deoptimizeCache(){if(null!==this.usedBranch){this.usedBranch=null,this.unusedBranch.deoptimizePath(Ce);for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&(this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?(this.consequent.deoptimizePath(e),this.alternate.deoptimizePath(e)):this.usedBranch.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?we:(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getLiteralValueAtPath(e,t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?new fa([this.consequent.getReturnExpressionWhenCalledAtPath(e,t,n),this.alternate.getReturnExpressionWhenCalledAtPath(e,t,n)]):(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getReturnExpressionWhenCalledAtPath(e,t,n))}hasEffects(e){return!!this.test.hasEffects(e)||(null===this.usedBranch?this.consequent.hasEffects(e)||this.alternate.hasEffects(e):this.usedBranch.hasEffects(e))}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null===this.usedBranch?this.consequent.hasEffectsWhenAccessedAtPath(e,t)||this.alternate.hasEffectsWhenAccessedAtPath(e,t):this.usedBranch.hasEffectsWhenAccessedAtPath(e,t))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||(null===this.usedBranch?this.consequent.hasEffectsWhenAssignedAtPath(e,t)||this.alternate.hasEffectsWhenAssignedAtPath(e,t):this.usedBranch.hasEffectsWhenAssignedAtPath(e,t))}hasEffectsWhenCalledAtPath(e,t,n){return null===this.usedBranch?this.consequent.hasEffectsWhenCalledAtPath(e,t,n)||this.alternate.hasEffectsWhenCalledAtPath(e,t,n):this.usedBranch.hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0,e||null===this.usedBranch||this.test.shouldBeIncluded()?(this.test.include(e),this.consequent.include(e),this.alternate.include(e)):this.usedBranch.include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=X){if(this.test.included)super.render(e,t);else{const s=pe(e.original,":",this.consequent.end),o=(this.consequent.included?pe(e.original,"?",this.test.end):s)+1;r&&ge(e,o,this.usedBranch.start),e.remove(this.start,o),this.consequent.included&&e.remove(s,this.end),ce(this,e),this.usedBranch.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type})}}analyseBranchResolution(){this.isBranchResolutionAnalysed=!0;const e=this.test.getLiteralValueAtPath(Ae,ua,this);e!==we&&(e?(this.usedBranch=this.consequent,this.unusedBranch=this.alternate):(this.usedBranch=this.alternate,this.unusedBranch=this.consequent))}},DoWhileStatement:class extends js{hasEffects(e){return this.test.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}},EmptyStatement:class extends js{hasEffects(){return!1}},ExportAllDeclaration:ma,ExportDefaultDeclaration:fo,ExportNamedDeclaration:ga,ExpressionStatement:ca,ForInStatement:class extends js{bind(){this.left.bind(),this.left.deoptimizePath(Ae),this.right.bind(),this.body.bind()}createScope(e){this.scope=new ia(e)}hasEffects(e){return this.left&&(this.left.hasEffects(e)||this.left.hasEffectsWhenAssignedAtPath(Ae,e))||this.right&&this.right.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}include(e){this.included=!0,this.left.includeWithAllDeclaredVariables(e),this.left.deoptimizePath(Ae),this.right.include(e),this.body.include(e)}render(e,t){this.left.render(e,t,le),this.right.render(e,t,le),this.body.render(e,t)}},ForOfStatement:class extends js{bind(){this.left.bind(),this.left.deoptimizePath(Ae),this.right.bind(),this.body.bind()}createScope(e){this.scope=new ia(e)}hasEffects(){return!0}include(e){this.included=!0,this.left.includeWithAllDeclaredVariables(e),this.left.deoptimizePath(Ae),this.right.include(e),this.body.include(e)}render(e,t){this.left.render(e,t,le),this.right.render(e,t,le),this.body.render(e,t)}},ForStatement:class extends js{createScope(e){this.scope=new ia(e)}hasEffects(e){return this.init&&this.init.hasEffects(e)||this.test&&this.test.hasEffects(e)||this.update&&this.update.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}render(e,t){this.init&&this.init.render(e,t,le),this.test&&this.test.render(e,t,le),this.update&&this.update.render(e,t,le),this.body.render(e,t)}},FunctionDeclaration:lo,FunctionExpression:class extends co{},Identifier:ho,IfStatement:class extends js{constructor(){super(...arguments),this.isTestValueAnalysed=!1}bind(){super.bind(),this.isTestValueAnalysed||(this.testValue=we,this.isTestValueAnalysed=!0,this.testValue=this.test.getLiteralValueAtPath(Ae,ua,this))}deoptimizeCache(){this.testValue=we}hasEffects(e){return!!this.test.hasEffects(e)||(this.testValue===we?this.consequent.hasEffects(e)||null!==this.alternate&&this.alternate.hasEffects(e):this.testValue?this.consequent.hasEffects(e):null!==this.alternate&&this.alternate.hasEffects(e))}include(e){if(this.included=!0,e)return this.test.include(e),this.consequent.include(e),void(null!==this.alternate&&this.alternate.include(e));const t=this.testValue===we;(t||this.test.shouldBeIncluded())&&this.test.include(!1),(t||this.testValue)&&this.consequent.shouldBeIncluded()&&this.consequent.include(!1),null===this.alternate||!t&&this.testValue||!this.alternate.shouldBeIncluded()||this.alternate.include(!1)}render(e,t){if(this.test.included||(this.testValue?null!==this.alternate&&this.alternate.included:this.consequent.included))this.test.included?this.test.render(e,t):e.overwrite(this.test.start,this.test.end,this.testValue?"true":"false"),this.consequent.included?this.consequent.render(e,t):e.overwrite(this.consequent.start,this.consequent.end,";"),null!==this.alternate&&(this.alternate.included?this.alternate.render(e,t):e.remove(this.consequent.end,this.alternate.end));else{const n=this.testValue?this.consequent:this.alternate;e.remove(this.start,n.start),e.remove(n.end,this.end),ce(this,e),n.render(e,t)}}},ImportDeclaration:ya,ImportExpression:class extends js{constructor(){super(...arguments),this.exportMode="auto"}hasEffects(){return!0}include(e){this.included||(this.included=!0,this.context.includeDynamicImport(this)),this.source.include(e)}initialise(){this.context.addDynamicImport(this)}render(e,t){if(this.inlineNamespace){const n=t.compact?"":" ",i=t.compact?"":";";return void e.overwrite(this.start,this.end,`Promise.resolve().then(function${n}()${n}{${n}return ${this.inlineNamespace.getName()}${i}${n}})`)}const n=this.getDynamicImportMechanism(t);n&&(e.overwrite(this.start,pe(e.original,"(",this.start+6)+1,n.left),e.overwrite(this.end-1,this.end,n.right)),this.source.render(e,t)}renderFinalResolution(e,t,n){this.included&&("amd"===n&&t.startsWith("'.")&&t.endsWith(".js'")&&(t=t.slice(0,-4)+"'"),e.overwrite(this.source.start,this.source.end,t))}setResolution(e,t){this.exportMode=e,t?this.inlineNamespace=t:(this.scope.addAccessedGlobalsByFormat({amd:["require"],cjs:["require"],system:["module"]}),"auto"===e&&this.scope.addAccessedGlobalsByFormat({amd:[vo],cjs:[vo]}))}getDynamicImportMechanism(e){switch(e.format){case"cjs":{const t=e.compact?"":" ",n=e.compact?"c":"resolve";switch(this.exportMode){case"default":return{left:`new Promise(function${t}(${n})${t}{${t}${n}({${t}'default':${t}require(`,right:`)${t}});${t}})`};case"auto":return{left:`new Promise(function${t}(${n})${t}{${t}${n}(${vo}(require(`,right:`)));${t}})`};default:return{left:`new Promise(function${t}(${n})${t}{${t}${n}(require(`,right:`));${t}})`}}}case"amd":{const t=e.compact?"":" ",n=e.compact?"c":"resolve",i=e.compact?"e":"reject";return{left:`new Promise(function${t}(${n},${t}${i})${t}{${t}require([`,right:`],${t}${"default"===this.exportMode?`function${t}(m)${t}{${t}${n}({${t}'default':${t}m${t}});${t}}`:"auto"===this.exportMode?`function${t}(m)${t}{${t}${n}(${vo}(m));${t}}`:n},${t}${i})${t}})`}}case"system":return{left:"module.import(",right:")"};case"es":if(e.dynamicImportFunction)return{left:`${e.dynamicImportFunction}(`,right:")"}}return null}},LabeledStatement:class extends js{hasEffects(e){return this.body.hasEffects(e.setIgnoreLabel(this.label.name).setIgnoreBreakStatements())}},Literal:va,LogicalExpression:class extends js{constructor(){super(...arguments),this.expressionsToBeDeoptimized=[],this.isBranchResolutionAnalysed=!1,this.unusedBranch=null,this.usedBranch=null}bind(){super.bind(),this.isBranchResolutionAnalysed||this.analyseBranchResolution()}deoptimizeCache(){if(null!==this.usedBranch){this.usedBranch=null,this.unusedBranch.deoptimizePath(Ce);for(const e of this.expressionsToBeDeoptimized)e.deoptimizeCache()}}deoptimizePath(e){e.length>0&&(this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?(this.left.deoptimizePath(e),this.right.deoptimizePath(e)):this.usedBranch.deoptimizePath(e))}getLiteralValueAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?we:(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getLiteralValueAtPath(e,t,n))}getReturnExpressionWhenCalledAtPath(e,t,n){return this.isBranchResolutionAnalysed||this.analyseBranchResolution(),null===this.usedBranch?new fa([this.left.getReturnExpressionWhenCalledAtPath(e,t,n),this.right.getReturnExpressionWhenCalledAtPath(e,t,n)]):(this.expressionsToBeDeoptimized.push(n),this.usedBranch.getReturnExpressionWhenCalledAtPath(e,t,n))}hasEffects(e){return null===this.usedBranch?this.left.hasEffects(e)||this.right.hasEffects(e):this.usedBranch.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return 0!==e.length&&(null===this.usedBranch?this.left.hasEffectsWhenAccessedAtPath(e,t)||this.right.hasEffectsWhenAccessedAtPath(e,t):this.usedBranch.hasEffectsWhenAccessedAtPath(e,t))}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||(null===this.usedBranch?this.left.hasEffectsWhenAssignedAtPath(e,t)||this.right.hasEffectsWhenAssignedAtPath(e,t):this.usedBranch.hasEffectsWhenAssignedAtPath(e,t))}hasEffectsWhenCalledAtPath(e,t,n){return null===this.usedBranch?this.left.hasEffectsWhenCalledAtPath(e,t,n)||this.right.hasEffectsWhenCalledAtPath(e,t,n):this.usedBranch.hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0,e||null===this.usedBranch||this.unusedBranch.shouldBeIncluded()?(this.left.include(e),this.right.include(e)):this.usedBranch.include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=X){if(this.left.included&&this.right.included)super.render(e,t);else{const s=pe(e.original,this.operator,this.left.end);this.right.included?(e.remove(this.start,s+2),r&&ge(e,s+2,this.right.start)):e.remove(s,this.end),ce(this,e),this.usedBranch.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type})}}analyseBranchResolution(){this.isBranchResolutionAnalysed=!0;const e=this.left.getLiteralValueAtPath(Ae,ua,this);e!==we&&(("||"===this.operator?e:!e)?(this.usedBranch=this.left,this.unusedBranch=this.right):(this.usedBranch=this.right,this.unusedBranch=this.left))}},MemberExpression:Ea,MetaProperty:class extends js{hasEffects(){return!1}hasEffectsWhenAccessedAtPath(e){return e.length>1}include(){if(!this.included){this.included=!0;const e=this.parent,t=this.metaProperty=e instanceof Ea&&"string"==typeof e.propertyKey?e.propertyKey:null;t&&("url"===t?this.scope.addAccessedGlobalsByFormat(Ma):(t.startsWith(Ba)||t.startsWith(Da)||t.startsWith(Va))&&this.scope.addAccessedGlobalsByFormat(La))}}initialise(){"import"===this.meta.name&&this.context.addImportMeta(this)}renderFinalMechanism(e,t,n,i){if(!this.included)return;const r=this.parent,s=this.metaProperty;if(s&&(s.startsWith(Ba)||s.startsWith(Da)||s.startsWith(Va))){let o,a=null,h=null,u=null;s.startsWith(Ba)?(a=s.substr(Ba.length),o=this.context.getFileName(a)):s.startsWith(Da)?(this.context.warnDeprecation(`Using the "${Da}" prefix to reference files is deprecated. Use the "${Ba}" prefix instead.`,!1),h=s.substr(Da.length),o=this.context.getFileName(h)):(this.context.warnDeprecation(`Using the "${Va}" prefix to reference files is deprecated. Use the "${Ba}" prefix instead.`,!1),u=s.substr(Va.length),o=this.context.getFileName(u));const c=pt(gt(ft(t),o));let l;return null!==h&&(l=i.hookFirstSync("resolveAssetUrl",[{assetFileName:o,chunkId:t,format:n,moduleId:this.context.module.id,relativeAssetPath:c}])),l||(l=i.hookFirstSync("resolveFileUrl",[{assetReferenceId:h,chunkId:t,chunkReferenceId:u,fileName:o,format:n,moduleId:this.context.module.id,referenceId:a||h||u,relativePath:c}])),void e.overwrite(r.start,r.end,l,{contentOnly:!0})}const o=i.hookFirstSync("resolveImportMeta",[s,{chunkId:t,format:n,moduleId:this.context.module.id}]);"string"==typeof o&&(r instanceof Ea?e.overwrite(r.start,r.end,o,{contentOnly:!0}):e.overwrite(this.start,this.end,o,{contentOnly:!0}))}},MethodDefinition:class extends js{hasEffects(e){return this.key.hasEffects(e)}hasEffectsWhenCalledAtPath(e,t,n){return e.length>0||this.value.hasEffectsWhenCalledAtPath(Ae,t,n)}},NewExpression:class extends js{bind(){super.bind();for(const e of this.arguments)e.deoptimizePath(Ce)}hasEffects(e){for(const t of this.arguments)if(t.hasEffects(e))return!0;return!this.annotatedPure&&this.callee.hasEffectsWhenCalledAtPath(Ae,this.callOptions,e.getHasEffectsWhenCalledOptions())}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}initialise(){this.callOptions=be.create({args:this.arguments,callIdentifier:this,withNew:!0})}},ObjectExpression:class extends js{constructor(){super(...arguments),this.deoptimizedPaths=new Set,this.expressionsToBeDeoptimized=new Map,this.hasUnknownDeoptimizedProperty=!1,this.propertyMap=null,this.unmatchablePropertiesRead=[],this.unmatchablePropertiesWrite=[]}bind(){super.bind(),null===this.propertyMap&&this.buildPropertyMap()}deoptimizeCache(){this.hasUnknownDeoptimizedProperty||this.deoptimizeAllProperties()}deoptimizePath(e){if(this.hasUnknownDeoptimizedProperty)return;if(null===this.propertyMap&&this.buildPropertyMap(),0===e.length)return void this.deoptimizeAllProperties();const t=e[0];if(1===e.length){if("string"!=typeof t)return void this.deoptimizeAllProperties();if(!this.deoptimizedPaths.has(t)){this.deoptimizedPaths.add(t);const e=this.expressionsToBeDeoptimized.get(t);if(e)for(const t of e)t.deoptimizeCache()}}const n=1===e.length?Ce:e.slice(1);for(const e of"string"==typeof t?this.propertyMap[t]?this.propertyMap[t].propertiesRead:[]:this.properties)e.deoptimizePath(n)}getLiteralValueAtPath(e,t,n){null===this.propertyMap&&this.buildPropertyMap();const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i))return we;if(1===e.length&&!this.propertyMap[i]&&!qe[i]&&0===this.unmatchablePropertiesRead.length){const e=this.expressionsToBeDeoptimized.get(i);return void(e?e.push(n):this.expressionsToBeDeoptimized.set(i,[n]))}if(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead||this.propertyMap[i].propertiesRead.length>1)return we;const r=this.expressionsToBeDeoptimized.get(i);return r?r.push(n):this.expressionsToBeDeoptimized.set(i,[n]),this.propertyMap[i].exactMatchRead.getLiteralValueAtPath(e.slice(1),t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){null===this.propertyMap&&this.buildPropertyMap();const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i))return Pe;if(1===e.length&&qe[i]&&0===this.unmatchablePropertiesRead.length&&(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead))return Ze(qe,i);if(!this.propertyMap[i]||null===this.propertyMap[i].exactMatchRead||this.propertyMap[i].propertiesRead.length>1)return Pe;const r=this.expressionsToBeDeoptimized.get(i);return r?r.push(n):this.expressionsToBeDeoptimized.set(i,[n]),this.propertyMap[i].exactMatchRead.getReturnExpressionWhenCalledAtPath(e.slice(1),t,n)}hasEffectsWhenAccessedAtPath(e,t){if(0===e.length)return!1;const n=e[0];if(e.length>1&&(this.hasUnknownDeoptimizedProperty||"string"!=typeof n||this.deoptimizedPaths.has(n)||!this.propertyMap[n]||null===this.propertyMap[n].exactMatchRead))return!0;const i=e.slice(1);for(const e of"string"!=typeof n?this.properties:this.propertyMap[n]?this.propertyMap[n].propertiesRead:[])if(e.hasEffectsWhenAccessedAtPath(i,t))return!0;return!1}hasEffectsWhenAssignedAtPath(e,t){if(0===e.length)return!1;const n=e[0];if(e.length>1&&(this.hasUnknownDeoptimizedProperty||"string"!=typeof n||this.deoptimizedPaths.has(n)||!this.propertyMap[n]||null===this.propertyMap[n].exactMatchRead))return!0;const i=e.slice(1);for(const r of"string"!=typeof n?this.properties:e.length>1?this.propertyMap[n].propertiesRead:this.propertyMap[n]?this.propertyMap[n].propertiesSet:[])if(r.hasEffectsWhenAssignedAtPath(i,t))return!0;return!1}hasEffectsWhenCalledAtPath(e,t,n){const i=e[0];if(0===e.length||this.hasUnknownDeoptimizedProperty||"string"!=typeof i||this.deoptimizedPaths.has(i)||(this.propertyMap[i]?!this.propertyMap[i].exactMatchRead:e.length>1||!qe[i]))return!0;const r=e.slice(1);for(const e of this.propertyMap[i]?this.propertyMap[i].propertiesRead:[])if(e.hasEffectsWhenCalledAtPath(r,t,n))return!0;return!(1!==e.length||!qe[i])&&Je(qe,i,this.included,t,n)}render(e,t,{renderedParentType:n}=X){super.render(e,t),n===ee&&(e.appendRight(this.start,"("),e.prependLeft(this.end,")"))}buildPropertyMap(){this.propertyMap=Object.create(null);for(let e=this.properties.length-1;e>=0;e--){const t=this.properties[e];if(t instanceof za){this.unmatchablePropertiesRead.push(t);continue}const n="get"!==t.kind,i="set"!==t.kind;let r;if(t.computed){const e=t.key.getLiteralValueAtPath(Ae,ua,this);if(e===we){i?this.unmatchablePropertiesRead.push(t):this.unmatchablePropertiesWrite.push(t);continue}r=String(e)}else r=t.key instanceof ho?t.key.name:String(t.key.value);const s=this.propertyMap[r];s?(i&&null===s.exactMatchRead&&(s.exactMatchRead=t,s.propertiesRead.push(t,...this.unmatchablePropertiesRead)),n&&!i&&null===s.exactMatchWrite&&(s.exactMatchWrite=t,s.propertiesSet.push(t,...this.unmatchablePropertiesWrite))):this.propertyMap[r]={exactMatchRead:i?t:null,exactMatchWrite:n?t:null,propertiesRead:i?[t,...this.unmatchablePropertiesRead]:[],propertiesSet:n&&!i?[t,...this.unmatchablePropertiesWrite]:[]}}}deoptimizeAllProperties(){this.hasUnknownDeoptimizedProperty=!0;for(const e of this.properties)e.deoptimizePath(Ce);for(const e of this.expressionsToBeDeoptimized.values())for(const t of e)t.deoptimizeCache()}},ObjectPattern:class extends js{addExportedVariables(e){for(const t of this.properties)t.type===oe?t.value.addExportedVariables(e):t.argument.addExportedVariables(e)}declare(e,t){const n=[];for(const i of this.properties)n.push(...i.declare(e,t));return n}deoptimizePath(e){if(0===e.length)for(const t of this.properties)t.deoptimizePath(e)}hasEffectsWhenAssignedAtPath(e,t){if(e.length>0)return!0;for(const e of this.properties)if(e.hasEffectsWhenAssignedAtPath(Ae,t))return!0;return!1}},Program:Wa,Property:class extends js{constructor(){super(...arguments),this.declarationInit=null,this.returnExpression=null}bind(){super.bind(),"get"===this.kind&&null===this.returnExpression&&this.updateReturnExpression(),null!==this.declarationInit&&this.declarationInit.deoptimizePath([Se,Se])}declare(e,t){return this.declarationInit=t,this.value.declare(e,Pe)}deoptimizeCache(){throw new Error("Unexpected deoptimization")}deoptimizePath(e){"get"===this.kind?e.length>0&&(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.deoptimizePath(e)):"set"!==this.kind&&this.value.deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return"set"===this.kind?we:"get"===this.kind?(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.getLiteralValueAtPath(e,t,n)):this.value.getLiteralValueAtPath(e,t,n)}getReturnExpressionWhenCalledAtPath(e,t,n){return"set"===this.kind?Pe:"get"===this.kind?(null===this.returnExpression&&this.updateReturnExpression(),this.returnExpression.getReturnExpressionWhenCalledAtPath(e,t,n)):this.value.getReturnExpressionWhenCalledAtPath(e,t,n)}hasEffects(e){return this.key.hasEffects(e)||this.value.hasEffects(e)}hasEffectsWhenAccessedAtPath(e,t){return"get"===this.kind?this.value.hasEffectsWhenCalledAtPath(Ae,this.accessorCallOptions,t.getHasEffectsWhenCalledOptions())||e.length>0&&this.returnExpression.hasEffectsWhenAccessedAtPath(e,t):this.value.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return"get"===this.kind?0===e.length||this.returnExpression.hasEffectsWhenAssignedAtPath(e,t):"set"===this.kind?e.length>0||this.value.hasEffectsWhenCalledAtPath(Ae,this.accessorCallOptions,t.getHasEffectsWhenCalledOptions()):this.value.hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return"get"===this.kind?this.returnExpression.hasEffectsWhenCalledAtPath(e,t,n):this.value.hasEffectsWhenCalledAtPath(e,t,n)}initialise(){this.accessorCallOptions=be.create({callIdentifier:this,withNew:!1})}render(e,t){this.shorthand||this.key.render(e,t),this.value.render(e,t,{isShorthandProperty:this.shorthand})}updateReturnExpression(){this.returnExpression=Pe,this.returnExpression=this.value.getReturnExpressionWhenCalledAtPath(Ae,ua,this)}},RestElement:uo,ReturnStatement:class extends js{hasEffects(e){return!e.ignoreReturnAwaitYield()||null!==this.argument&&this.argument.hasEffects(e)}initialise(){this.scope.addReturnExpression(this.argument||Pe)}render(e,t){this.argument&&(this.argument.render(e,t,{preventASI:!0}),this.argument.start===this.start+6&&e.prependLeft(this.start+6," "))}},SequenceExpression:class extends js{deoptimizePath(e){e.length>0&&this.expressions[this.expressions.length-1].deoptimizePath(e)}getLiteralValueAtPath(e,t,n){return this.expressions[this.expressions.length-1].getLiteralValueAtPath(e,t,n)}hasEffects(e){for(const t of this.expressions)if(t.hasEffects(e))return!0;return!1}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.expressions[this.expressions.length-1].hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return 0===e.length||this.expressions[this.expressions.length-1].hasEffectsWhenAssignedAtPath(e,t)}hasEffectsWhenCalledAtPath(e,t,n){return this.expressions[this.expressions.length-1].hasEffectsWhenCalledAtPath(e,t,n)}include(e){this.included=!0;for(let t=0;t<this.expressions.length-1;t++){const n=this.expressions[t];(e||n.shouldBeIncluded())&&n.include(e)}this.expressions[this.expressions.length-1].include(e)}render(e,t,{renderedParentType:n,isCalleeOfRenderedParent:i,preventASI:r}=X){let s=0;for(const{node:o,start:a,end:h}of me(this.expressions,e,this.start,this.end))o.included?(1===++s&&r&&ge(e,a,o.start),o===this.expressions[this.expressions.length-1]&&1===s?o.render(e,t,{isCalleeOfRenderedParent:n?i:this.parent.callee===this,renderedParentType:n||this.parent.type}):o.render(e,t)):ue(o,e,a,h)}},SpreadElement:za,SwitchCase:class extends js{include(e){this.included=!0,this.test&&this.test.include(e);for(const t of this.consequent)(e||t.shouldBeIncluded())&&t.include(e)}render(e,t){if(this.consequent.length){this.test&&this.test.render(e,t);const n=this.test?this.test.end:pe(e.original,"default",this.start)+7,i=pe(e.original,":",n)+1;fe(this.consequent,e,i,this.end,t)}else super.render(e,t)}},SwitchStatement:class extends js{createScope(e){this.scope=new ia(e)}hasEffects(e){return super.hasEffects(e.setIgnoreBreakStatements())}},TaggedTemplateExpression:class extends js{bind(){if(super.bind(),this.tag.type===ne){this.scope.findVariable(this.tag.name).isNamespace&&this.context.error({code:"CANNOT_CALL_NAMESPACE",message:`Cannot call a namespace ('${this.tag.name}')`},this.start),"eval"===this.tag.name&&this.context.warn({code:"EVAL",message:"Use of eval is strongly discouraged, as it poses security risks and may cause issues with minification",url:"https://rollupjs.org/guide/en/#avoiding-eval"},this.start)}}hasEffects(e){return super.hasEffects(e)||this.tag.hasEffectsWhenCalledAtPath(Ae,this.callOptions,e.getHasEffectsWhenCalledOptions())}initialise(){this.callOptions=be.create({callIdentifier:this,withNew:!1})}},TemplateElement:class extends js{hasEffects(e){return!1}},TemplateLiteral:ja,ThisExpression:class extends js{bind(){super.bind(),this.variable=this.scope.findVariable("this")}hasEffectsWhenAccessedAtPath(e,t){return e.length>0&&this.variable.hasEffectsWhenAccessedAtPath(e,t)}hasEffectsWhenAssignedAtPath(e,t){return this.variable.hasEffectsWhenAssignedAtPath(e,t)}initialise(){this.alias=this.scope.findLexicalBoundary()instanceof Fa?this.context.moduleContext:null,"undefined"===this.alias&&this.context.warn({code:"THIS_IS_UNDEFINED",message:"The 'this' keyword is equivalent to 'undefined' at the top level of an ES module, and has been rewritten",url:"https://rollupjs.org/guide/en/#error-this-is-undefined"},this.start)}render(e,t){null!==this.alias&&e.overwrite(this.start,this.end,this.alias,{contentOnly:!1,storeName:!0})}},ThrowStatement:class extends js{hasEffects(e){return!0}render(e,t){this.argument.render(e,t,{preventASI:!0})}},TryStatement:class extends js{constructor(){super(...arguments),this.directlyIncluded=!1}hasEffects(e){return this.block.body.length>0||null!==this.handler&&this.handler.hasEffects(e)||null!==this.finalizer&&this.finalizer.hasEffects(e)}include(e){this.directlyIncluded&&this.context.tryCatchDeoptimization||(this.included=!0,this.directlyIncluded=!0,this.block.include(this.context.tryCatchDeoptimization?zs:e)),null!==this.handler&&this.handler.include(e),null!==this.finalizer&&this.finalizer.include(e)}},UnaryExpression:class extends js{bind(){super.bind(),"delete"===this.operator&&this.argument.deoptimizePath(Ae)}getLiteralValueAtPath(e,t,n){if(e.length>0)return we;const i=this.argument.getLiteralValueAtPath(Ae,t,n);return i===we?we:Ua[this.operator](i)}hasEffects(e){return!("typeof"===this.operator&&this.argument instanceof ho)&&(this.argument.hasEffects(e)||"delete"===this.operator&&this.argument.hasEffectsWhenAssignedAtPath(Ae,e))}hasEffectsWhenAccessedAtPath(e,t){return"void"===this.operator?e.length>0:e.length>1}},UnknownNode:class extends js{hasEffects(e){return!0}include(){super.include(!0)}},UpdateExpression:class extends js{bind(){if(super.bind(),this.argument.deoptimizePath(Ae),this.argument instanceof ho){this.scope.findVariable(this.argument.name).isReassigned=!0}}hasEffects(e){return this.argument.hasEffects(e)||this.argument.hasEffectsWhenAssignedAtPath(Ae,e)}hasEffectsWhenAccessedAtPath(e,t){return e.length>1}render(e,t){this.argument.render(e,t);const n=this.argument.variable;if("system"===t.format&&n&&n.exportName){const t=n.getName();if(this.prefix)e.overwrite(this.start,this.end,`exports('${n.exportName}', ${this.operator}${t})`);else{let i;switch(this.operator){case"++":i=`${t} + 1`;break;case"--":i=`${t} - 1`}e.overwrite(this.start,this.end,`(exports('${n.exportName}', ${i}), ${t}${this.operator})`)}}}},VariableDeclaration:class extends js{deoptimizePath(e){for(const e of this.declarations)e.deoptimizePath(Ae)}hasEffectsWhenAssignedAtPath(e,t){return!1}include(e){this.included=!0;for(const t of this.declarations)(e||t.shouldBeIncluded())&&t.include(e)}includeWithAllDeclaredVariables(e){this.included=!0;for(const t of this.declarations)t.include(e)}initialise(){for(const e of this.declarations)e.declareDeclarator(this.kind)}render(e,t,n=X){if(function(e){for(const t of e){if(!t.included)return!1;if(t.id.type===ne){if(t.id.variable.exportName)return!1}else{const e=[];if(t.id.addExportedVariables(e),e.length>0)return!1}}return!0}(this.declarations)){for(const n of this.declarations)n.render(e,t);n.isNoStatement||59===e.original.charCodeAt(this.end-1)||e.appendLeft(this.end,";")}else this.renderReplacedDeclarations(e,t,n)}renderDeclarationEnd(e,t,n,i,r,s,o){59===e.original.charCodeAt(this.end-1)&&e.remove(this.end-1,this.end),s&&(t+=";"),null!==n?(10!==e.original.charCodeAt(i-1)||10!==e.original.charCodeAt(this.end)&&13!==e.original.charCodeAt(this.end)||(i--,13===e.original.charCodeAt(i)&&i--),i===n+1?e.overwrite(n,r,t):(e.overwrite(n,n+1,t),e.remove(i,r))):e.appendLeft(r,t),o.length>0&&e.appendLeft(r," "+oa(o))}renderReplacedDeclarations(e,t,{start:n=this.start,end:i=this.end,isNoStatement:r}){const s=me(this.declarations,e,this.start+this.kind.length,this.end-(59===e.original.charCodeAt(this.end-1)?1:0));let o,a,h=(a=/\n\s*$/.test(e.slice(this.start,s[0].start))?this.start+this.kind.length:s[0].start)-1;e.remove(this.start,h);let u,c,l=!1,p=!1,d="";const f=[];for(const{node:n,start:i,separator:r,contentEnd:m,end:g}of s)!n.included||n.id instanceof ho&&Ga(n.id.variable)&&null===n.init?e.remove(i,g):(u="",c="",n.id instanceof ho&&Ga(n.id.variable)?(p&&(d+=";"),l=!1):("system"===t.format&&null!==n.init&&(n.id.type!==ne?n.id.addExportedVariables(f):n.id.variable.exportName&&(e.prependLeft(e.original.indexOf("=",n.id.end)+1,` exports('${n.id.variable.safeExportName||n.id.variable.exportName}',`),c+=")")),l?d+=",":(p&&(d+=";"),u+=`${this.kind} `,l=!0)),a===h+1?e.overwrite(h,a,d+u):(e.overwrite(h,h+1,d),e.appendLeft(a,u)),n.render(e,t),o=m,a=g,p=!0,h=r,d=c);p?this.renderDeclarationEnd(e,d,h,o,a,!r,f):e.remove(n,i)}},VariableDeclarator:class extends js{declareDeclarator(e){this.id.declare(e,this.init||ke)}deoptimizePath(e){this.id.deoptimizePath(e)}render(e,t){null===this.init||this.init.included?super.render(e,t):(e.remove(this.id.end,this.end),this.id.render(e,t))}},WhileStatement:class extends js{hasEffects(e){return this.test.hasEffects(e)||this.body.hasEffects(e.setIgnoreBreakStatements())}},YieldExpression:class extends js{bind(){super.bind(),null!==this.argument&&this.argument.deoptimizePath(Ce)}hasEffects(e){return!e.ignoreReturnAwaitYield()||null!==this.argument&&this.argument.hasEffects(e)}render(e,t){this.argument&&(this.argument.render(e,t),this.argument.start===this.start+5&&e.prependLeft(this.start+5," "))}}};function qa(e,t,n){n(e,t)}function Ka(e,t,n){}var Ya={};function Xa(e,t,n=e.type){let i=t.commentNodes[t.commentIndex];for(;i&&e.start>=i.end;)Qa(e,i),i=t.commentNodes[++t.commentIndex];i&&i.end<=e.end&&Ya[n](e,t,Xa)}function Qa(e,t){e.annotations?e.annotations.push(t):e.annotations=[t],"ExpressionStatement"===e.type&&(e=e.expression),"CallExpression"!==e.type&&"NewExpression"!==e.type||(e.annotatedPure=!0)}Ya.Program=Ya.BlockStatement=function(e,t,n){for(var i=0,r=e.body;i<r.length;i+=1){n(r[i],t,"Statement")}},Ya.Statement=qa,Ya.EmptyStatement=Ka,Ya.ExpressionStatement=Ya.ParenthesizedExpression=function(e,t,n){return n(e.expression,t,"Expression")},Ya.IfStatement=function(e,t,n){n(e.test,t,"Expression"),n(e.consequent,t,"Statement"),e.alternate&&n(e.alternate,t,"Statement")},Ya.LabeledStatement=function(e,t,n){return n(e.body,t,"Statement")},Ya.BreakStatement=Ya.ContinueStatement=Ka,Ya.WithStatement=function(e,t,n){n(e.object,t,"Expression"),n(e.body,t,"Statement")},Ya.SwitchStatement=function(e,t,n){n(e.discriminant,t,"Expression");for(var i=0,r=e.cases;i<r.length;i+=1){var s=r[i];s.test&&n(s.test,t,"Expression");for(var o=0,a=s.consequent;o<a.length;o+=1){n(a[o],t,"Statement")}}},Ya.SwitchCase=function(e,t,n){e.test&&n(e.test,t,"Expression");for(var i=0,r=e.consequent;i<r.length;i+=1){n(r[i],t,"Statement")}},Ya.ReturnStatement=Ya.YieldExpression=Ya.AwaitExpression=function(e,t,n){e.argument&&n(e.argument,t,"Expression")},Ya.ThrowStatement=Ya.SpreadElement=function(e,t,n){return n(e.argument,t,"Expression")},Ya.TryStatement=function(e,t,n){n(e.block,t,"Statement"),e.handler&&n(e.handler,t),e.finalizer&&n(e.finalizer,t,"Statement")},Ya.CatchClause=function(e,t,n){e.param&&n(e.param,t,"Pattern"),n(e.body,t,"Statement")},Ya.WhileStatement=Ya.DoWhileStatement=function(e,t,n){n(e.test,t,"Expression"),n(e.body,t,"Statement")},Ya.ForStatement=function(e,t,n){e.init&&n(e.init,t,"ForInit"),e.test&&n(e.test,t,"Expression"),e.update&&n(e.update,t,"Expression"),n(e.body,t,"Statement")},Ya.ForInStatement=Ya.ForOfStatement=function(e,t,n){n(e.left,t,"ForInit"),n(e.right,t,"Expression"),n(e.body,t,"Statement")},Ya.ForInit=function(e,t,n){"VariableDeclaration"===e.type?n(e,t):n(e,t,"Expression")},Ya.DebuggerStatement=Ka,Ya.FunctionDeclaration=function(e,t,n){return n(e,t,"Function")},Ya.VariableDeclaration=function(e,t,n){for(var i=0,r=e.declarations;i<r.length;i+=1){n(r[i],t)}},Ya.VariableDeclarator=function(e,t,n){n(e.id,t,"Pattern"),e.init&&n(e.init,t,"Expression")},Ya.Function=function(e,t,n){e.id&&n(e.id,t,"Pattern");for(var i=0,r=e.params;i<r.length;i+=1){n(r[i],t,"Pattern")}n(e.body,t,e.expression?"Expression":"Statement")},Ya.Pattern=function(e,t,n){"Identifier"===e.type?n(e,t,"VariablePattern"):"MemberExpression"===e.type?n(e,t,"MemberPattern"):n(e,t)},Ya.VariablePattern=Ka,Ya.MemberPattern=qa,Ya.RestElement=function(e,t,n){return n(e.argument,t,"Pattern")},Ya.ArrayPattern=function(e,t,n){for(var i=0,r=e.elements;i<r.length;i+=1){var s=r[i];s&&n(s,t,"Pattern")}},Ya.ObjectPattern=function(e,t,n){for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];"Property"===s.type?(s.computed&&n(s.key,t,"Expression"),n(s.value,t,"Pattern")):"RestElement"===s.type&&n(s.argument,t,"Pattern")}},Ya.Expression=qa,Ya.ThisExpression=Ya.Super=Ya.MetaProperty=Ka,Ya.ArrayExpression=function(e,t,n){for(var i=0,r=e.elements;i<r.length;i+=1){var s=r[i];s&&n(s,t,"Expression")}},Ya.ObjectExpression=function(e,t,n){for(var i=0,r=e.properties;i<r.length;i+=1){n(r[i],t)}},Ya.FunctionExpression=Ya.ArrowFunctionExpression=Ya.FunctionDeclaration,Ya.SequenceExpression=function(e,t,n){for(var i=0,r=e.expressions;i<r.length;i+=1){n(r[i],t,"Expression")}},Ya.TemplateLiteral=function(e,t,n){for(var i=0,r=e.quasis;i<r.length;i+=1){n(r[i],t)}for(var s=0,o=e.expressions;s<o.length;s+=1){n(o[s],t,"Expression")}},Ya.TemplateElement=Ka,Ya.UnaryExpression=Ya.UpdateExpression=function(e,t,n){n(e.argument,t,"Expression")},Ya.BinaryExpression=Ya.LogicalExpression=function(e,t,n){n(e.left,t,"Expression"),n(e.right,t,"Expression")},Ya.AssignmentExpression=Ya.AssignmentPattern=function(e,t,n){n(e.left,t,"Pattern"),n(e.right,t,"Expression")},Ya.ConditionalExpression=function(e,t,n){n(e.test,t,"Expression"),n(e.consequent,t,"Expression"),n(e.alternate,t,"Expression")},Ya.NewExpression=Ya.CallExpression=function(e,t,n){if(n(e.callee,t,"Expression"),e.arguments)for(var i=0,r=e.arguments;i<r.length;i+=1){n(r[i],t,"Expression")}},Ya.MemberExpression=function(e,t,n){n(e.object,t,"Expression"),e.computed&&n(e.property,t,"Expression")},Ya.ExportNamedDeclaration=Ya.ExportDefaultDeclaration=function(e,t,n){e.declaration&&n(e.declaration,t,"ExportNamedDeclaration"===e.type||e.declaration.id?"Statement":"Expression"),e.source&&n(e.source,t,"Expression")},Ya.ExportAllDeclaration=function(e,t,n){n(e.source,t,"Expression")},Ya.ImportDeclaration=function(e,t,n){for(var i=0,r=e.specifiers;i<r.length;i+=1){n(r[i],t)}n(e.source,t,"Expression")},Ya.ImportExpression=function(e,t,n){n(e.source,t,"Expression")},Ya.ImportSpecifier=Ya.ImportDefaultSpecifier=Ya.ImportNamespaceSpecifier=Ya.Identifier=Ya.Literal=Ka,Ya.TaggedTemplateExpression=function(e,t,n){n(e.tag,t,"Expression"),n(e.quasi,t,"Expression")},Ya.ClassDeclaration=Ya.ClassExpression=function(e,t,n){return n(e,t,"Class")},Ya.Class=function(e,t,n){e.id&&n(e.id,t,"Pattern"),e.superClass&&n(e.superClass,t,"Expression"),n(e.body,t)},Ya.ClassBody=function(e,t,n){for(var i=0,r=e.body;i<r.length;i+=1){n(r[i],t)}},Ya.MethodDefinition=Ya.Property=function(e,t,n){e.computed&&n(e.key,t,"Expression"),n(e.value,t,"Expression")};const Ja=/[@#]__PURE__/,Za=e=>Ja.test(e.text);let eh="sourceMa";eh+="ppingURL";const th=new RegExp(`^#\\s+${eh}=.+\\n?`),nh=()=>{};let ih=()=>[0,0],rh=()=>0,sh=()=>0,oh={};const ah=e=>1e3*e[0]+e[1]/1e6;function hh(e,t){switch(t){case 1:return`# ${e}`;case 2:return`## ${e}`;case 3:return e;default:return`${"  ".repeat(t-4)}- ${e}`}}function uh(e,t=3){e=hh(e,t),oh.hasOwnProperty(e)||(oh[e]={memory:0,startMemory:void 0,startTime:void 0,time:0,totalMemory:0});const n=sh();oh[e].startTime=ih(),oh[e].startMemory=n}function ch(e,t=3){if(e=hh(e,t),oh.hasOwnProperty(e)){const t=sh();oh[e].time+=rh(oh[e].startTime),oh[e].totalMemory=Math.max(oh[e].totalMemory,t),oh[e].memory+=t-oh[e].startMemory}}function lh(){const e={};return Object.keys(oh).forEach(t=>{e[t]=[oh[t].time,oh[t].memory,oh[t].totalMemory]}),e}let ph=nh,dh=nh;const fh={load:!0,ongenerate:!0,onwrite:!0,resolveDynamicImport:!0,resolveId:!0,transform:!0,transformBundle:!0};function mh(e,t){const n={};for(const i of Object.keys(e))if(!0===fh[i]){let r=`plugin ${t}`;e.name&&(r+=` (${e.name})`),r+=` - ${i}`,n[i]=function(){ph(r,4);const t=e[i].apply(this===n?e:this,arguments);return dh(r,4),t&&"function"==typeof t.then&&(ph(`${r} (async)`,4),t.then(()=>dh(`${r} (async)`,4))),t}}else n[i]=e[i];return n}function gh(e){e.perf?(oh={},"undefined"!=typeof process&&"function"==typeof process.hrtime?(ih=process.hrtime.bind(process),rh=e=>ah(process.hrtime(e))):"undefined"!=typeof performance&&"function"==typeof performance.now&&(ih=()=>[performance.now(),0],rh=e=>performance.now()-e[0]),"undefined"!=typeof process&&"function"==typeof process.memoryUsage&&(sh=()=>process.memoryUsage().heapUsed),ph=uh,dh=ch,e.plugins=e.plugins.map(mh)):(ph=nh,dh=nh)}const yh={ecmaVersion:2020,preserveParens:!1,sourceType:"module"};function vh(e,t,n,i){t.error({code:"MISSING_EXPORT",message:`'${e}' is not exported by ${Oo(n)}`,url:"https://rollupjs.org/guide/en/#error-name-is-not-exported-by-module"},i)}const xh={identifier:null,localName:go};class Eh{constructor(e,t,n,i){this.chunkFileNames=new Set,this.chunkName=null,this.comments=[],this.dependencies=[],this.dynamicallyImportedBy=[],this.dynamicDependencies=[],this.dynamicImports=[],this.entryPointsHash=new Uint8Array(10),this.execIndex=1/0,this.exportAllModules=null,this.exportAllSources=[],this.exports=Object.create(null),this.exportsAll=Object.create(null),this.exportShimVariable=new xo(this),this.facadeChunk=null,this.importDescriptions=Object.create(null),this.importMetas=[],this.imports=new Set,this.isExecuted=!1,this.isUserDefinedEntryPoint=!1,this.manualChunkAlias=null,this.reexports=Object.create(null),this.sources=[],this.userChunkNames=new Set,this.usesTopLevelAwait=!1,this.namespaceVariable=void 0,this.transformDependencies=[],this.id=t,this.graph=e,this.excludeFromSourcemap=/\0/.test(t),this.context=e.getModuleContext(t),this.moduleSideEffects=n,this.isEntryPoint=i}basename(){const e=dt(this.id),t=mt(this.id);return at(t?e.slice(0,-t.length):e)}bindReferences(){this.ast.bind()}error(e,t){if(void 0!==t){e.pos=t;let n=At(this.code,t,{offsetLine:1});try{n=function(e,t){const n=e.filter(e=>e.mappings);for(;n.length>0;){const e=n.pop(),i=e.mappings[t.line-1];let r=!1;if(void 0!==i)for(const n of i)if(n[0]>=t.column){if(1===n.length)break;t={column:n[3],line:n[2]+1,name:5===n.length?e.names[n[4]]:void 0,source:e.sources[n[1]]},r=!0;break}if(!r)throw new Error("Can't resolve original location of error.")}return t}(this.sourcemapChain,n)}catch(e){this.warn({code:"SOURCEMAP_ERROR",loc:{column:n.column,file:this.id,line:n.line},message:`Error when using sourcemap for reporting an error: ${e.message}`,pos:t},void 0)}e.loc={column:n.column,file:this.id,line:n.line},e.frame=$o(this.originalCode,n.line,n.column)}e.watchFiles=Object.keys(this.graph.watchFiles),Lo(e)}getAllExportNames(){if(this.allExportNames)return this.allExportNames;const e=this.allExportNames=new Set;for(const t of Object.keys(this.exports))e.add(t);for(const t of Object.keys(this.reexports))e.add(t);for(const t of this.exportAllModules)if(t instanceof vt)e.add(`*${t.id}`);else for(const n of t.getAllExportNames())"default"!==n&&e.add(n);return e}getDynamicImportExpressions(){return this.dynamicImports.map(({node:e})=>{const t=e.source;return t instanceof ja&&1===t.quasis.length&&t.quasis[0].value.cooked?t.quasis[0].value.cooked:t instanceof va&&"string"==typeof t.value?t.value:t})}getExportNamesByVariable(){const e=new Map;for(const t of this.getAllExportNames()){const n=this.getVariableForExportName(t);if(!n||!(n.included||n instanceof tt))continue;const i=e.get(n);i?i.push(t):e.set(n,[t])}return e}getExports(){return Object.keys(this.exports)}getOrCreateNamespace(){return this.namespaceVariable||(this.namespaceVariable=new Eo(this.astContext),this.namespaceVariable.initialise()),this.namespaceVariable}getReexports(){if(this.transitiveReexports)return this.transitiveReexports;this.transitiveReexports=[];const e=new Set;for(const t in this.reexports)e.add(t);for(const t of this.exportAllModules)if(t instanceof vt)e.add(`*${t.id}`);else for(const n of t.getExports().concat(t.getReexports()))"default"!==n&&e.add(n);return this.transitiveReexports=Array.from(e)}getRenderedExports(){const e=[],t=[];for(const n in this.exports){const i=this.getVariableForExportName(n);(i&&i.included?e:t).push(n)}return{renderedExports:e,removedExports:t}}getTransitiveDependencies(){return this.dependencies.concat(this.getReexports().map(e=>this.getVariableForExportName(e).module))}getVariableForExportName(e,t){if("*"===e[0]){if(1===e.length)return this.getOrCreateNamespace();return this.graph.moduleById.get(e.slice(1)).getVariableForExportName("*")}const n=this.reexports[e];if(n){const e=n.module.getVariableForExportName(n.localName);return e||vh(n.localName,this,n.module.id,n.start),e}const i=this.exports[e];if(i){if(i===xh)return this.exportShimVariable;const e=i.localName;return this.traceVariable(e)||this.graph.scope.findVariable(e)}if("default"!==e)for(const t of this.exportAllModules){const n=t.getVariableForExportName(e,!0);if(n)return n}if(this.graph.shimMissingExports&&!t)return this.shimMissingExport(e),this.exportShimVariable}include(){this.ast.shouldBeIncluded()&&this.ast.include(!1)}includeAllExports(){this.isExecuted||(this.graph.needsTreeshakingPass=!0,xt(this));for(const e of this.getExports()){const t=this.getVariableForExportName(e);t.deoptimizePath(Ce),t.included||(t.include(),this.graph.needsTreeshakingPass=!0)}for(const e of this.getReexports()){const t=this.getVariableForExportName(e);t.deoptimizePath(Ce),t.included||(t.include(),this.graph.needsTreeshakingPass=!0),t instanceof tt&&(t.module.reexported=!0)}}includeAllInBundle(){this.ast.include(!0)}isIncluded(){return this.ast.included||this.namespaceVariable&&this.namespaceVariable.included}linkDependencies(){for(const e of this.sources){const t=this.resolvedIds[e].id;if(t){const e=this.graph.moduleById.get(t);this.dependencies.push(e)}}for(const{resolution:e}of this.dynamicImports)(e instanceof Eh||e instanceof vt)&&this.dynamicDependencies.push(e);this.addModulesToSpecifiers(this.importDescriptions),this.addModulesToSpecifiers(this.reexports),this.exportAllModules=this.exportAllSources.map(e=>{const t=this.resolvedIds[e].id;return this.graph.moduleById.get(t)}).sort((e,t)=>{const n=e instanceof vt;return n===t instanceof vt?0:n?1:-1})}render(e){const t=this.magicString.clone();return this.ast.render(t,e),this.usesTopLevelAwait=this.astContext.usesTopLevelAwait,t}setSource({ast:e,code:t,customTransformCache:n,moduleSideEffects:i,originalCode:r,originalSourcemap:s,resolvedIds:o,sourcemapChain:a,transformDependencies:h,transformFiles:u}){var c;this.code=t,this.originalCode=r,this.originalSourcemap=s,this.sourcemapChain=a,u&&(this.transformFiles=u),this.transformDependencies=h,this.customTransformCache=n,"boolean"==typeof i&&(this.moduleSideEffects=i),ph("generate ast",3),this.esTreeAst=e||function(e,t,n){try{return t.parse(e.code,Object.assign(Object.assign(Object.assign({},yh),n),{onComment:(t,n,i,r)=>e.comments.push({block:t,text:n,start:i,end:r})}))}catch(t){let n=t.message.replace(/ \(\d+:\d+\)$/,"");e.id.endsWith(".json")?n+=" (Note that you need rollup-plugin-json to import JSON files)":e.id.endsWith(".js")||(n+=" (Note that you need plugins to import files that are not JavaScript)"),e.error({code:"PARSE_ERROR",message:n},t.pos)}}(this,this.graph.acornParser,this.graph.acornOptions),c=this.comments,Xa(this.esTreeAst,{commentIndex:0,commentNodes:c.filter(Za)}),dh("generate ast",3),this.resolvedIds=o||Object.create(null);const l=this.id;this.magicString=new H(t,{filename:this.excludeFromSourcemap?null:l,indentExclusionRanges:[]}),this.removeExistingSourceMap(),ph("analyse ast",3),this.astContext={addDynamicImport:this.addDynamicImport.bind(this),addExport:this.addExport.bind(this),addImport:this.addImport.bind(this),addImportMeta:this.addImportMeta.bind(this),annotations:this.graph.treeshakingOptions&&this.graph.treeshakingOptions.annotations,code:t,deoptimizationTracker:this.graph.deoptimizationTracker,error:this.error.bind(this),fileName:l,getExports:this.getExports.bind(this),getFileName:this.graph.pluginDriver.getFileName,getModuleExecIndex:()=>this.execIndex,getModuleName:this.basename.bind(this),getReexports:this.getReexports.bind(this),importDescriptions:this.importDescriptions,includeDynamicImport:this.includeDynamicImport.bind(this),includeVariable:this.includeVariable.bind(this),isCrossChunkImport:e=>e.module.chunk!==this.chunk,magicString:this.magicString,module:this,moduleContext:this.context,nodeConstructors:Ha,preserveModules:this.graph.preserveModules,propertyReadSideEffects:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.propertyReadSideEffects,traceExport:this.getVariableForExportName.bind(this),traceVariable:this.traceVariable.bind(this),treeshake:!!this.graph.treeshakingOptions,tryCatchDeoptimization:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.tryCatchDeoptimization,unknownGlobalSideEffects:!this.graph.treeshakingOptions||this.graph.treeshakingOptions.unknownGlobalSideEffects,usesTopLevelAwait:!1,warn:this.warn.bind(this),warnDeprecation:this.graph.warnDeprecation.bind(this.graph)},this.scope=new Fa(this.graph.scope,this.astContext),this.ast=new Wa(this.esTreeAst,{type:"Module",context:this.astContext},this.scope),dh("analyse ast",3)}toJSON(){return{ast:this.esTreeAst,code:this.code,customTransformCache:this.customTransformCache,dependencies:this.dependencies.map(e=>e.id),id:this.id,moduleSideEffects:this.moduleSideEffects,originalCode:this.originalCode,originalSourcemap:this.originalSourcemap,resolvedIds:this.resolvedIds,sourcemapChain:this.sourcemapChain,transformDependencies:this.transformDependencies,transformFiles:this.transformFiles}}traceVariable(e){const t=this.scope.variables.get(e);if(t)return t;if(e in this.importDescriptions){const t=this.importDescriptions[e],n=t.module;if(n instanceof Eh&&"*"===t.name)return n.getOrCreateNamespace();const i=n.getVariableForExportName(t.name);return i||vh(t.name,this,n.id,t.start),i}return null}warn(e,t){if(void 0!==t){e.pos=t;const{line:n,column:i}=At(this.code,t,{offsetLine:1});e.loc={file:this.id,line:n,column:i},e.frame=$o(this.code,n,i)}e.id=this.id,this.graph.warn(e)}addDynamicImport(e){this.dynamicImports.push({node:e,resolution:null})}addExport(e){const t=e.source&&e.source.value;if(t)if(-1===this.sources.indexOf(t)&&this.sources.push(t),e.type===Z)this.exportAllSources.push(t);else for(const n of e.specifiers){const e=n.exported.name;(this.exports[e]||this.reexports[e])&&this.error({code:"DUPLICATE_EXPORT",message:`A module cannot have multiple exports with the same name ('${e}')`},n.start),this.reexports[e]={localName:n.local.name,module:null,source:t,start:n.start}}else if(e instanceof fo)this.exports.default&&this.error({code:"DUPLICATE_EXPORT",message:"A module can only have one default export"},e.start),this.exports.default={identifier:e.variable.getAssignedVariableName(),localName:"default"};else if(e.declaration){const t=e.declaration;if(t.type===he)for(const e of t.declarations)for(const t of na(e.id))this.exports[t]={identifier:null,localName:t};else{const e=t.id.name;this.exports[e]={identifier:null,localName:e}}}else for(const t of e.specifiers){const e=t.local.name,n=t.exported.name;(this.exports[n]||this.reexports[n])&&this.error({code:"DUPLICATE_EXPORT",message:`A module cannot have multiple exports with the same name ('${n}')`},t.start),this.exports[n]={identifier:null,localName:e}}}addImport(e){const t=e.source.value;-1===this.sources.indexOf(t)&&this.sources.push(t);for(const n of e.specifiers){const e=n.local.name;this.importDescriptions[e]&&this.error({code:"DUPLICATE_IMPORT",message:`Duplicated import '${e}'`},n.start);const i=n.type===ie,r=n.type===re,s=i?"default":r?"*":n.imported.name;this.importDescriptions[e]={source:t,start:n.start,name:s,module:null}}}addImportMeta(e){this.importMetas.push(e)}addModulesToSpecifiers(e){for(const t of Object.keys(e)){const n=e[t],i=this.resolvedIds[n.source].id;n.module=this.graph.moduleById.get(i)}}includeDynamicImport(e){const t=this.dynamicImports.find(t=>t.node===e).resolution;t instanceof Eh&&(t.dynamicallyImportedBy.push(this),t.includeAllExports())}includeVariable(e){const t=e.module;e.included||(e.include(),this.graph.needsTreeshakingPass=!0),t&&t!==this&&this.imports.add(e)}removeExistingSourceMap(){for(const e of this.comments)!e.block&&th.test(e.text)&&this.magicString.remove(e.start,e.end)}shimMissingExport(e){this.exports[e]||(this.graph.warn({code:"SHIMMED_EXPORT",exporter:Oo(this.id),exportName:e,message:`Missing export "${e}" has been shimmed in module ${Oo(this.id)}.`}),this.exports[e]=xh)}}class _h{constructor(e,t){this.isOriginal=!0,this.filename=e,this.content=t}traceSegment(e,t,n){return{line:e,column:t,name:n,source:this}}}class bh{constructor(e,t){this.sources=t,this.names=e.names,this.mappings=e.mappings}traceMappings(){const e=[],t=[],n=[],i=[];for(const r of this.mappings){const s=[];for(const i of r){if(1==i.length)continue;const r=this.sources[i[1]];if(!r)continue;const o=r.traceSegment(i[2],i[3],5===i.length?this.names[i[4]]:"");if(o){let r=e.lastIndexOf(o.source.filename);-1===r?(r=e.length,e.push(o.source.filename),t[r]=o.source.content):null==t[r]?t[r]=o.source.content:null!=o.source.content&&t[r]!==o.source.content&&Lo({message:`Multiple conflicting contents for sourcemap source ${o.source.filename}`});const a=[i[0],r,o.line,o.column];if(o.name){let e=n.indexOf(o.name);-1===e&&(e=n.length,n.push(o.name)),a[4]=e}s.push(a)}}i.push(s)}return{sources:e,sourcesContent:t,names:n,mappings:i}}traceSegment(e,t,n){const i=this.mappings[e];if(!i)return null;let r=0,s=i.length-1;for(;r<=s;){const e=r+s>>1,o=i[e];if(o[0]===t){if(1==o.length)return null;const e=this.sources[o[1]];return e?e.traceSegment(o[2],o[3],5===o.length?this.names[o[4]]:n):null}o[0]>t?s=e-1:r=e+1}return null}}function Sh(e){return function(t,n){return n.mappings?new bh(n,[t]):(e.warn({code:"SOURCEMAP_BROKEN",message:`Sourcemap is likely to be incorrect: a plugin${n.plugin?` ('${n.plugin}')`:""} was used to transform files, but didn't generate a sourcemap for the transformation. Consult the plugin documentation for help`,plugin:n.plugin,url:"https://rollupjs.org/guide/en/#warning-sourcemap-is-likely-to-be-incorrect"}),new bh({mappings:[],names:[]},[t]))}}function Ah(e,t,n,i,r){let s;if(n){const t=n.sources,i=n.sourcesContent||[],r=ft(e)||".",o=n.sourceRoot||".",a=t.map((e,t)=>new _h(yt(r,o,e),i[t]));s=new bh(n,a)}else s=new _h(e,t);return i.reduce(r,s)}const Ch={amd:Ph,cjs:Ph,es:wh,iife:Ph,system:wh,umd:Ph};function Ih(e,t,n,i,r,s,o){!function(e,t,n){for(const i of t){const t=i.scope;for(const[n,i]of t.accessedOutsideVariables)i.included&&e.add(n);const r=t.accessedGlobalVariablesByFormat&&t.accessedGlobalVariablesByFormat.get(n);if(r)for(const t of r)e.add(t)}}(i,e,r),function(e,t){for(const n of t){for(const t of n.scope.variables.values())t.included&&!(t.renderBaseName||t instanceof mo&&t.getOriginalVariable()!==t)&&t.setRenderNames(null,_e(t.name,e));const t=n.getOrCreateNamespace();t.included&&t.setRenderNames(null,_e(t.name,e))}}(i,e),Ch[r](i,n,t,s,o);for(const t of e)t.scope.deconflict(r)}function wh(e,t,n,i){for(const n of t){const t=n.module,r=n.name;let s;s=t instanceof vt&&("*"===r||"default"===r)?"default"===r&&i&&t.exportsNamespace?t.variableName+"__default":t.variableName:r,n.setRenderNames(null,_e(s,e))}}function Ph(e,t,n,i,r){for(const t of n)t.variableName=_e(t.variableName,e);for(const e of t){const t=e.module;if(t instanceof vt){const n=e.name;"default"===n&&i&&(t.exportsNamespace||t.exportsNames)?e.setRenderNames(null,t.variableName+"__default"):"*"===n||"default"===n?e.setRenderNames(null,t.variableName):e.setRenderNames(t.variableName,null)}else{const n=t.chunk;"default"===n.exportMode||r&&e.isNamespace?e.setRenderNames(null,n.variableName):e.setRenderNames(n.variableName,n.getVariableExportName(e))}}}const kh=(e,t)=>e.execIndex>t.execIndex?1:-1;function Nh(e){e.sort(kh)}function $h(e,t,n){const i=[Oo(e)];let r=t;for(;r!==e&&(i.push(Oo(r)),r=n[r]););return i.push(i[0]),i.reverse(),i}function Rh(e){const t=e.split("\n"),n=t.filter(e=>/^\t+/.test(e)),i=t.filter(e=>/^ {2,}/.test(e));if(0===n.length&&0===i.length)return null;if(n.length>=i.length)return"\t";const r=i.reduce((e,t)=>{const n=/^ +/.exec(t)[0].length;return Math.min(n,e)},1/0);return new Array(r+1).join(" ")}function Th(e){if(!e)return null;if("string"==typeof e&&(e=JSON.parse(e)),""===e.mappings)return{mappings:[],names:[],sources:[],version:3};let t;return t="string"==typeof e.mappings?function(e){for(var t=0,n=0,i=0,r=0,s=0,o=[],a=[],h=[],u=0,c=0,l=0,p=0,d=e.length;u<d;u++){var f=e.charCodeAt(u);if(44===f)h.length&&a.push(h),h=[],c=0;else if(59===f)h.length&&a.push(h),h=[],c=0,o.push(a),a=[],t=0;else{var m=$[f];if(void 0===m)throw new Error("Invalid character ("+String.fromCharCode(f)+")");var g=32&m;if(p+=(m&=31)<<l,g)l+=5;else{var y=1&p;p>>>=1,y&&0===(p=-p)&&(p=-2147483648),0==c?(t+=p,h.push(t)):1===c?(n+=p,h.push(n)):2===c?(i+=p,h.push(i)):3===c?(r+=p,h.push(r)):4===c&&(s+=p,h.push(s)),c++,p=l=0}}}return h.length&&a.push(h),o.push(a),o}(e.mappings):e.mappings,Object.assign(Object.assign({},e),{mappings:t})}function Oh(e,t,n){return Mo(e)?e.replace(/\[(\w+)\]/g,(e,i)=>{if(!n.hasOwnProperty(i))return Lo(Wo(`"[${i}]" is not a valid placeholder in "${t}" pattern.`));const r=n[i]();return Mo(r)?r:Lo(Wo(`Invalid substitution "${r}" for placeholder "[${i}]" in "${t}" pattern, can be neither absolute nor relative path.`))}):Lo(Wo(`Invalid pattern "${e}" for "${t}", patterns can be neither absolute nor relative paths and must not contain invalid characters.`))}function Mh(e,t){if(e in t==!1)return e;const n=mt(e);e=e.substr(0,e.length-n.length);let i,r=1;for(;t[i=e+ ++r+n];);return i}const Lh=[".js",".jsx",".ts",".tsx"];function Dh(e,t,n,i){let r;return"function"==typeof t?r=t(e.id):t&&(r=t[e.id]),r||(i?(n.warn({code:"MISSING_GLOBAL_NAME",guess:e.variableName,message:`No name was provided for external module '${e.id}' in output.globals – guessing '${e.variableName}'`,source:e.id}),e.variableName):void 0)}function Vh(e){return!e.isEmpty||e.entryModules.length>0||null!==e.manualChunkAlias}class Bh{constructor(e,t){this.entryModules=[],this.exportMode="named",this.facadeModule=null,this.id=null,this.indentString=void 0,this.manualChunkAlias=null,this.usedModules=void 0,this.variableName="chunk",this.dependencies=void 0,this.dynamicDependencies=void 0,this.exportNames=Object.create(null),this.exports=new Set,this.fileName=null,this.imports=new Set,this.name=null,this.needsExportsShim=!1,this.renderedDeclarations=void 0,this.renderedHash=void 0,this.renderedModuleSources=new Map,this.renderedSource=null,this.renderedSourceLength=void 0,this.sortedExportNames=null,this.graph=e,this.orderedModules=t,this.execIndex=t.length>0?t[0].execIndex:1/0,this.isEmpty=!0;for(const e of t)this.isEmpty&&e.isIncluded()&&(this.isEmpty=!1),e.manualChunkAlias&&(this.manualChunkAlias=e.manualChunkAlias),e.chunk=this,(e.isEntryPoint||e.dynamicallyImportedBy.some(e=>-1===t.indexOf(e)))&&this.entryModules.push(e);const n=this.entryModules[0]||this.orderedModules[this.orderedModules.length-1];n&&(this.variableName=at(dt(n.chunkName||n.manualChunkAlias||To(n.id))))}static generateFacade(e,t,n){const i=new Bh(e,[]);i.assignFacadeName(n,t),t.facadeChunk||(t.facadeChunk=i),i.dependencies=[t.chunk],i.dynamicDependencies=[],i.facadeModule=t;for(const e of t.getAllExportNames()){const n=t.getVariableForExportName(e);i.exports.add(n),i.exportNames[e]=n}return i}canModuleBeFacade(e){for(const t of this.exports)if(!e.has(t))return!1;return!0}generateFacades(){const e=[];for(const t of this.entryModules){const n=Array.from(t.userChunkNames).map(e=>({name:e}));if(0===n.length&&t.isUserDefinedEntryPoint&&n.push({}),n.push(...Array.from(t.chunkFileNames).map(e=>({fileName:e}))),0===n.length&&n.push({}),!this.facadeModule){const e=t.getExportNamesByVariable();if(this.graph.preserveModules||this.canModuleBeFacade(e)){this.facadeModule=t,t.facadeChunk=this;for(const[t,n]of e)for(const e of n)this.exportNames[e]=t;this.assignFacadeName(n.shift(),t)}}for(const i of n)e.push(Bh.generateFacade(this.graph,t,i))}return e}generateId(e,t,n,i){if(null!==this.fileName)return this.fileName;const[r,s]=this.facadeModule&&this.facadeModule.isUserDefinedEntryPoint?[t.entryFileNames||"[name].js","output.entryFileNames"]:[t.chunkFileNames||"[name]-[hash].js","output.chunkFileNames"];return Mh(Oh(r,s,{format:()=>"es"===t.format?"esm":t.format,hash:()=>i?this.computeContentHashWithDependencies(e,t,n):"[hash]",name:()=>this.getChunkName()}),n)}generateIdPreserveModules(e,t,n){const i=this.orderedModules[0].id,r=Ro(i);let s;if(ct(i)){const n=mt(i),o=Oh(t.entryFileNames||(Lh.includes(n)?"[name].js":"[name][extname].js"),"output.entryFileNames",{ext:()=>n.substr(1),extname:()=>n,format:()=>"es"===t.format?"esm":t.format,name:()=>this.getChunkName()});s=Y(e,`${ft(r)}/${o}`)}else s=`_virtual/${dt(r)}`;return Mh(pt(s),n)}generateInternalExports(e){if(null!==this.facadeModule)return;const t="system"===e.format||"es"===e.format||e.compact;let n,i=0;if(this.exportNames=Object.create(null),this.sortedExportNames=null,t)for(const e of this.exports){const t=e.name[0];if(this.exportNames[t]){do{49===(n=xe(++i)).charCodeAt(0)&&(n=xe(i+=9*Math.pow(64,n.length-1)))}while(Ee[n]||this.exportNames[n]);this.exportNames[n]=e}else this.exportNames[t]=e}else for(const e of this.exports){for(i=0,n=e.name;this.exportNames[n];)n=e.name+"$"+ ++i;this.exportNames[n]=e}}getChunkName(){return this.name||(this.name=Ro(this.getFallbackChunkName()))}getDynamicImportIds(){return this.dynamicDependencies.map(e=>e.id).filter(Boolean)}getExportNames(){return this.sortedExportNames||(this.sortedExportNames=Object.keys(this.exportNames).sort())}getImportIds(){return this.dependencies.map(e=>e.id).filter(Boolean)}getRenderedHash(){if(this.renderedHash)return this.renderedHash;if(!this.renderedSource)return"";const e=N(),t=this.calculateHashAugmentation();return e.update(t),e.update(this.renderedSource.toString()),e.update(this.getExportNames().map(e=>{const t=this.exportNames[e];return`${Oo(t.module.id).replace(/\\/g,"/")}:${t.name}:${e}`}).join(",")),this.renderedHash=e.digest("hex")}getRenderedSourceLength(){return void 0!==this.renderedSourceLength?this.renderedSourceLength:this.renderedSourceLength=this.renderedSource.length()}getVariableExportName(e){if(this.graph.preserveModules&&e instanceof Eo)return"*";for(const t of Object.keys(this.exportNames))if(this.exportNames[t]===e)return t;throw new Error(`Internal Error: Could not find export name for variable ${e.name}.`)}link(){const e=new Set,t=new Set;for(const n of this.orderedModules)this.addDependenciesToChunk(n.getTransitiveDependencies(),e),this.addDependenciesToChunk(n.dynamicDependencies,t),this.setUpChunkImportsAndExportsForModule(n);this.dependencies=Array.from(e),this.dynamicDependencies=Array.from(t)}merge(e,t,n,i){if(null!==this.facadeModule||null!==e.facadeModule)throw new Error("Internal error: Code splitting chunk merges not supported for facades");for(const t of e.orderedModules)t.chunk=this,this.orderedModules.push(t);for(const t of e.imports)this.imports.has(t)||t.module.chunk===this||this.imports.add(t);for(const t of e.exports)this.exports.has(t)||this.exports.add(t);const r=this.exportNames;this.generateInternalExports(n);const s=(e,t)=>{if(e.imports)for(const n of e.imports)n.imported=this.getVariableExportName(t[n.imported]);if(e.reexports)for(const n of e.reexports)n.imported=this.getVariableExportName(t[n.imported])},o=(e,t)=>{t.imports&&(e.imports?e.imports=e.imports.concat(t.imports):e.imports=t.imports),t.reexports&&(e.reexports?e.reexports=e.reexports.concat(t.reexports):e.reexports=t.reexports),!e.exportsNames&&t.exportsNames&&(e.exportsNames=!0),!e.exportsDefault&&t.exportsDefault&&(e.exportsDefault=!0),e.name=this.variableName};for(const n of t){let t=void 0;for(let i=0;i<n.dependencies.length;i++){const a=n.dependencies[i];if(a!==e&&a!==this||!t)a===e?(n.dependencies[i]=this,s(t=n.renderedDeclarations.dependencies[i],e.exportNames)):a===this&&s(t=n.renderedDeclarations.dependencies[i],r);else{const h=n.renderedDeclarations.dependencies[i];s(h,a===e?e.exportNames:r),o(t,h),n.renderedDeclarations.dependencies.splice(i,1),n.dependencies.splice(i--,1)}}}this.preRender(n,i)}preRender(e,t){ph("render modules",3);const n=new K({separator:e.compact?"":"\n\n"});this.usedModules=[],this.indentString=e.compact?"":function(e,t){if(!0!==t.indent)return t.indent||"";for(let t=0;t<e.length;t++){const n=Rh(e[t].originalCode);if(null!==n)return n}return"\t"}(this.orderedModules,e);const i=e.compact?"":"\n",r=e.compact?"":" ",s={compact:e.compact,dynamicImportFunction:e.dynamicImportFunction,format:e.format,freeze:!1!==e.freeze,indent:this.indentString,namespaceToStringTag:!0===e.namespaceToStringTag,varOrConst:e.preferConst?"const":"var"};for(const{module:e}of this.imports){const t=e instanceof Eh?e.chunk:e;-1===this.dependencies.indexOf(t)&&this.dependencies.push(t)}if(!this.graph.preserveModules&&null!==this.facadeModule)for(const e of this.dependencies)e instanceof Bh&&this.inlineChunkDependencies(e,!0);for(let e=0;e<this.dependencies.length;e++){const t=this.dependencies[e];t instanceof Bh&&t.isEmpty&&(this.dependencies.splice(e--,1),this.inlineChunkDependencies(t,!1))}Nh(this.dependencies),this.prepareDynamicImports(),this.setIdentifierRenderResolutions(e);let o="";const a=this.renderedModules=Object.create(null);for(const t of this.orderedModules){let r=0;if(t.isIncluded()){const a=t.render(s).trim();e.compact&&-1!==a.lastLine().indexOf("//")&&a.append("\n");const h=t.getOrCreateNamespace();if((h.included||a.length()>0)&&(r=a.length(),this.renderedModuleSources.set(t,a),n.addSource(a),this.usedModules.push(t),h.included&&!this.graph.preserveModules)){const e=h.renderBlock(s);h.renderFirst()?o+=i+e:n.addSource(new H(e))}}const{renderedExports:h,removedExports:u}=t.getRenderedExports();a[t.id]={originalLength:t.originalCode.length,removedExports:u,renderedExports:h,renderedLength:r}}o&&n.prepend(o+i+i),this.needsExportsShim&&n.prepend(`${i}${s.varOrConst} ${go}${r}=${r}void 0;${i}${i}`),e.compact?this.renderedSource=n:this.renderedSource=n.trim(),this.renderedSourceLength=void 0,this.renderedHash=void 0,0===this.getExportNames().length&&0===this.getImportIds().length&&this.isEmpty&&this.graph.warn({code:"EMPTY_BUNDLE",message:"Generated an empty bundle"}),this.setExternalRenderPaths(e,t),this.renderedDeclarations={dependencies:this.getChunkDependencyDeclarations(e),exports:"none"===this.exportMode?[]:this.getChunkExportDeclarations()},dh("render modules",3)}render(e,t,n){if(ph("render format",3),!this.renderedSource)throw new Error("Internal error: Chunk render called before preRender");const i=e.format,r=ea[i];r||Lo({code:"INVALID_OPTION",message:`Invalid format: ${i} - valid options are ${Object.keys(ea).join(", ")}.`}),e.dynamicImportFunction&&"es"!==i&&this.graph.warn({code:"INVALID_OPTION",message:'"output.dynamicImportFunction" is ignored for formats other than "esm".'});for(let e=0;e<this.dependencies.length;e++){const t=this.dependencies[e];if(t instanceof vt&&!t.renormalizeRenderPath)continue;const n=this.renderedDeclarations.dependencies[e],i=t instanceof vt?n.id:t.id;t instanceof Bh&&(n.namedExportsMode="default"!==t.exportMode),n.id=this.getRelativePath(i)}this.finaliseDynamicImports(i),this.finaliseImportMetas(i);const s=0!==this.renderedDeclarations.exports.length||this.renderedDeclarations.dependencies.some(e=>e.reexports&&0!==e.reexports.length);let o=!1;const a=new Set;for(const e of this.orderedModules){e.usesTopLevelAwait&&(o=!0);const t=e.scope.accessedGlobalVariablesByFormat,n=t&&t.get(i);if(n)for(const e of n)a.add(e)}o&&"es"!==i&&"system"!==i&&Lo({code:"INVALID_TLA_FORMAT",message:`Module format ${i} does not support top-level await. Use the "es" or "system" output formats rather.`});const h=r(this.renderedSource,{accessedGlobals:a,dependencies:this.renderedDeclarations.dependencies,exports:this.renderedDeclarations.exports,hasExports:s,indentString:this.indentString,intro:t.intro,isEntryModuleFacade:null!==this.facadeModule&&this.facadeModule.isEntryPoint,namedExportsMode:"default"!==this.exportMode,outro:t.outro,usesTopLevelAwait:o,varOrConst:e.preferConst?"const":"var",warn:this.graph.warn.bind(this.graph)},e);t.banner&&h.prepend(t.banner),t.footer&&h.append(t.footer);const u=h.toString();dh("render format",3);let c=null;const l=[];return function({graph:e,chunk:t,renderChunk:n,code:i,sourcemapChain:r,options:s}){const o=(e,t,n)=>{if(null==t)return e;if("string"==typeof t&&(t={code:t,map:void 0}),null!==t.map){const e=Th(t.map);r.push(e||{missing:!0,plugin:n.name})}return t.code};let a=!1,h=!0;return e.pluginDriver.hookReduceArg0("renderChunk",[i,n,s],o).then(n=>(h=!1,e.pluginDriver.hookReduceArg0("transformChunk",[n,s,t],o))).then(n=>(a=!0,e.pluginDriver.hookReduceArg0("transformBundle",[n,s,t],o))).catch(e=>{if(h)throw e;return Lo(e,{code:a?"BAD_BUNDLE_TRANSFORMER":"BAD_CHUNK_TRANSFORMER",message:`Error transforming ${(a?"bundle":"chunk")+(e.plugin?` with '${e.plugin}' plugin`:"")}: ${e.message}`,plugin:e.plugin})})}({chunk:this,code:u,graph:this.graph,options:e,renderChunk:n,sourcemapChain:l}).then(t=>{if(e.sourcemap){let t;ph("sourcemap",3),t=e.file?yt(e.sourcemapFile||e.file):e.dir?yt(e.dir,this.id):yt(this.id);const n=h.generateDecodedMap({});(c=function(e,t,n,i,r,s){const o=Sh(e.graph),a=i.filter(e=>!e.excludeFromSourcemap).map(e=>Ah(e.id,e.originalCode,e.originalSourcemap,e.sourcemapChain,o));let h=new bh(n,a);h=r.reduce(o,h);let{sources:u,sourcesContent:c,names:l,mappings:p}=h.traceMappings();if(t){const e=ft(t);u=u.map(t=>gt(e,t)),t=dt(t)}return new D({file:t,sources:u,sourcesContent:c=s?null:c,names:l,mappings:p})}(this,t,n,this.usedModules,l,e.sourcemapExcludeSources)).sources=c.sources.map(t=>pt(e.sourcemapPathTransform?e.sourcemapPathTransform(t):t)),dh("sourcemap",3)}return!0!==e.compact&&"\n"!==t[t.length-1]&&(t+="\n"),{code:t,map:c}})}visitDependencies(e){const t=[this],n=new Set;for(const i of t)if(e(i),!(i instanceof vt))for(const e of i.dependencies.concat(i.dynamicDependencies))n.has(e)||(n.add(e),t.push(e))}visitStaticDependenciesUntilCondition(e){const t=new Set;return function n(i){if(!t.has(i)){if(t.add(i),i instanceof Bh)for(const e of i.dependencies)if(n(e))return!0;return!0===e(i)}}(this)}addDependenciesToChunk(e,t){for(const n of e){if(n.chunk===this)continue;let e;if(n instanceof Eh)e=n.chunk;else{if(!n.used&&!n.moduleSideEffects)continue;e=n}t.add(e)}}assignFacadeName({fileName:e,name:t},n){e?this.fileName=e:this.name=Ro(t||n.chunkName||To(n.id))}calculateHashAugmentation(){const e=this.facadeModule,t=this.getChunkName.bind(this),n={dynamicImports:this.getDynamicImportIds(),exports:this.getExportNames(),facadeModuleId:e&&e.id,imports:this.getImportIds(),isDynamicEntry:null!==e&&e.dynamicallyImportedBy.length>0,isEntry:null!==e&&e.isEntryPoint,modules:this.renderedModules,get name(){return t()}};return this.graph.pluginDriver.hookReduceValueSync("augmentChunkHash","",[n],(e,t)=>(t&&(e+=t),e))}computeContentHashWithDependencies(e,t,n){const i=N();return i.update([e.intro,e.outro,e.banner,e.footer].map(e=>e||"").join(":")),i.update(t.format),this.visitDependencies(r=>{r instanceof vt?i.update(":"+r.renderPath):(i.update(r.getRenderedHash()),i.update(r.generateId(e,t,n,!1)))}),i.digest("hex").substr(0,8)}finaliseDynamicImports(e){for(const[t,n]of this.renderedModuleSources)for(const{node:i,resolution:r}of t.dynamicImports)if(r)if(r instanceof Eh){if(r.chunk!==this&&Vh(r.chunk)){const t=r.facadeChunk||r.chunk;i.renderFinalResolution(n,`'${this.getRelativePath(t.id)}'`,e)}}else i.renderFinalResolution(n,r instanceof vt?`'${r.renormalizeRenderPath?this.getRelativePath(r.renderPath):r.id}'`:r,e)}finaliseImportMetas(e){for(const[t,n]of this.renderedModuleSources)for(const i of t.importMetas)i.renderFinalMechanism(n,this.id,e,this.graph.pluginDriver)}getChunkDependencyDeclarations(e){const t=new Map;for(let n of this.getExportNames()){let i,r,s=!1;if("*"===n[0])s=!1!==e.externalLiveBindings,i=this.graph.moduleById.get(n.substr(1)),r=n="*";else{const t=this.exportNames[n],o=t.module;if(!o||o.chunk===this)continue;o instanceof Eh?(r=(i=o.chunk).getVariableExportName(t),s=t.isReassigned):(i=o,r=t.name,s=!1!==e.externalLiveBindings)}let o=t.get(i);o||t.set(i,o=[]),o.push({imported:r,reexported:n,needsLiveBinding:s})}const n=new Set,i=[];for(const r of this.dependencies){const s=[];for(const e of this.imports){const t=e instanceof mo?e.getOriginalVariable():e;(e.module instanceof Eh?e.module.chunk!==r:e.module!==r)||n.has(t)||(n.add(t),s.push({imported:e.module instanceof vt?e.name:e.module.chunk.getVariableExportName(e),local:e.getName()}))}const o=t.get(r);let a,h,u=!0;r instanceof vt?(a=r.exportsNames||r.exportsNamespace,h="default"in r.declarations):(a=!0,h=!1,u="default"!==r.exportMode);let c=void 0,l=void 0;r instanceof vt&&(c=r.renderPath,"umd"!==e.format&&"iife"!==e.format||(l=Dh(r,e.globals,this.graph,a||h))),i.push({exportsDefault:h,exportsNames:a,globalName:l,id:c,imports:s.length>0?s:null,isChunk:r instanceof Bh,name:r.variableName,namedExportsMode:u,reexports:o})}return i}getChunkExportDeclarations(){const e=[];for(const t of this.getExportNames()){if("*"===t[0])continue;const n=this.exportNames[t],i=n.module;if(i&&i.chunk!==this)continue;let r=!1,s=!1;if(n instanceof _t){n.init===ke&&(s=!0);for(const e of n.declarations)if(e.parent instanceof lo||e instanceof fo&&e.declaration instanceof lo){r=!0;break}}else n instanceof ao&&(r=!0);const o=n.getName();e.push({exported:"*"===t?o:t,hoisted:r,local:o,uninitialized:s})}return e}getFallbackChunkName(){return this.manualChunkAlias?this.manualChunkAlias:this.fileName?To(this.fileName):To(this.orderedModules[this.orderedModules.length-1].id)}getRelativePath(e){const t=pt(Y(ft(this.id),e));return t.startsWith("../")?t:"./"+t}inlineChunkDependencies(e,t){for(const n of e.dependencies)if(n instanceof vt)-1===this.dependencies.indexOf(n)&&this.dependencies.push(n);else{if(n===this||-1!==this.dependencies.indexOf(n))continue;n.isEmpty||this.dependencies.push(n),t&&this.inlineChunkDependencies(n,!0)}}prepareDynamicImports(){for(const e of this.orderedModules)for(const{node:t,resolution:n}of e.dynamicImports)if(t.included)if(n instanceof Eh)if(n.chunk===this){const e=n.getOrCreateNamespace();t.setResolution("named",e)}else t.setResolution(n.chunk.exportMode);else t.setResolution("auto")}setExternalRenderPaths(e,t){for(const n of this.dependencies.concat(this.dynamicDependencies))n instanceof vt&&n.setRenderPath(e,t)}setIdentifierRenderResolutions(e){for(const t of this.getExportNames()){const n=this.exportNames[t];n&&(n instanceof xo&&(this.needsExportsShim=!0),n.exportName=t,"es"===e.format||"system"===e.format||!n.isReassigned||n.isId||n instanceof mo&&n.hasId?n.setRenderNames(null,null):n.setRenderNames("exports",t))}const t=new Set;this.needsExportsShim&&t.add(go),"es"!==e.format&&(t.add("exports"),"cjs"===e.format&&t.add(yo).add("require").add("module").add("__filename").add("__dirname")),Ih(this.orderedModules,this.dependencies,this.imports,t,e.format,!1!==e.interop,this.graph.preserveModules)}setUpChunkImportsAndExportsForModule(e){for(const t of e.imports)t.module.chunk!==this&&(this.imports.add(t),t.module instanceof Eh&&t.module.chunk.exports.add(t));if(e.isEntryPoint||e.dynamicallyImportedBy.some(e=>e.chunk!==this)){const t=e.getExportNamesByVariable();for(const e of t.keys()){this.exports.add(e);const t=e.module;t&&t.chunk&&t.chunk!==this&&t.chunk.exports.add(e)}}if(e.getOrCreateNamespace().included)for(const t of Object.keys(e.reexports)){const n=e.reexports[t],i=n.module.getVariableForExportName(n.localName);i.module.chunk!==this&&(this.imports.add(i),i.module instanceof Eh&&i.module.chunk.exports.add(i))}for(const{node:t,resolution:n}of e.dynamicImports)t.included&&n instanceof Eh&&n.chunk===this&&n.getOrCreateNamespace().include()}}var zh={3:"abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",5:"class enum extends super const export import",6:"enum",strict:"implements interface let package private protected public static yield",strictBind:"eval arguments"},Wh="break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this",jh={5:Wh,"5module":Wh+" export import",6:Wh+" const class extends export import super"},Fh=/^in(stanceof)?$/,Uh="ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࢠ-ࢴࢶ-ࢽऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഅ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆺㇰ-ㇿ㐀-䶵一-鿯ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-Ᶎꟷ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭧꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ﬀ-ﬆﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼＡ-Ｚａ-ｚｦ-ﾾￂ-ￇￊ-ￏￒ-ￗￚ-ￜ",Gh="‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍ୖୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ංඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏０-９＿",Hh=new RegExp("["+Uh+"]"),qh=new RegExp("["+Uh+Gh+"]");Uh=Gh=null;var Kh=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,477,28,11,0,9,21,155,22,13,52,76,44,33,24,27,35,30,0,12,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,0,33,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,0,161,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,270,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,754,9486,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42710,42,4148,12,221,3,5761,15,7472,3104,541],Yh=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,525,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,4,9,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,232,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,19723,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,792487,239];function Xh(e,t){for(var n=65536,i=0;i<t.length;i+=2){if((n+=t[i])>e)return!1;if((n+=t[i+1])>=e)return!0}}function Qh(e,t){return e<65?36===e:e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&Hh.test(String.fromCharCode(e)):!1!==t&&Xh(e,Kh)))}function Jh(e,t){return e<48?36===e:e<58||!(e<65)&&(e<91||(e<97?95===e:e<123||(e<=65535?e>=170&&qh.test(String.fromCharCode(e)):!1!==t&&(Xh(e,Kh)||Xh(e,Yh)))))}var Zh=function(e,t){void 0===t&&(t={}),this.label=e,this.keyword=t.keyword,this.beforeExpr=!!t.beforeExpr,this.startsExpr=!!t.startsExpr,this.isLoop=!!t.isLoop,this.isAssign=!!t.isAssign,this.prefix=!!t.prefix,this.postfix=!!t.postfix,this.binop=t.binop||null,this.updateContext=null};function eu(e,t){return new Zh(e,{beforeExpr:!0,binop:t})}var tu={beforeExpr:!0},nu={startsExpr:!0},iu={};function ru(e,t){return void 0===t&&(t={}),t.keyword=e,iu[e]=new Zh(e,t)}var su={num:new Zh("num",nu),regexp:new Zh("regexp",nu),string:new Zh("string",nu),name:new Zh("name",nu),eof:new Zh("eof"),bracketL:new Zh("[",{beforeExpr:!0,startsExpr:!0}),bracketR:new Zh("]"),braceL:new Zh("{",{beforeExpr:!0,startsExpr:!0}),braceR:new Zh("}"),parenL:new Zh("(",{beforeExpr:!0,startsExpr:!0}),parenR:new Zh(")"),comma:new Zh(",",tu),semi:new Zh(";",tu),colon:new Zh(":",tu),dot:new Zh("."),question:new Zh("?",tu),arrow:new Zh("=>",tu),template:new Zh("template"),invalidTemplate:new Zh("invalidTemplate"),ellipsis:new Zh("...",tu),backQuote:new Zh("`",nu),dollarBraceL:new Zh("${",{beforeExpr:!0,startsExpr:!0}),eq:new Zh("=",{beforeExpr:!0,isAssign:!0}),assign:new Zh("_=",{beforeExpr:!0,isAssign:!0}),incDec:new Zh("++/--",{prefix:!0,postfix:!0,startsExpr:!0}),prefix:new Zh("!/~",{beforeExpr:!0,prefix:!0,startsExpr:!0}),logicalOR:eu("||",1),logicalAND:eu("&&",2),bitwiseOR:eu("|",3),bitwiseXOR:eu("^",4),bitwiseAND:eu("&",5),equality:eu("==/!=/===/!==",6),relational:eu("</>/<=/>=",7),bitShift:eu("<</>>/>>>",8),plusMin:new Zh("+/-",{beforeExpr:!0,binop:9,prefix:!0,startsExpr:!0}),modulo:eu("%",10),star:eu("*",10),slash:eu("/",10),starstar:new Zh("**",{beforeExpr:!0}),_break:ru("break"),_case:ru("case",tu),_catch:ru("catch"),_continue:ru("continue"),_debugger:ru("debugger"),_default:ru("default",tu),_do:ru("do",{isLoop:!0,beforeExpr:!0}),_else:ru("else",tu),_finally:ru("finally"),_for:ru("for",{isLoop:!0}),_function:ru("function",nu),_if:ru("if"),_return:ru("return",tu),_switch:ru("switch"),_throw:ru("throw",tu),_try:ru("try"),_var:ru("var"),_const:ru("const"),_while:ru("while",{isLoop:!0}),_with:ru("with"),_new:ru("new",{beforeExpr:!0,startsExpr:!0}),_this:ru("this",nu),_super:ru("super",nu),_class:ru("class",nu),_extends:ru("extends",tu),_export:ru("export"),_import:ru("import",nu),_null:ru("null",nu),_true:ru("true",nu),_false:ru("false",nu),_in:ru("in",{beforeExpr:!0,binop:7}),_instanceof:ru("instanceof",{beforeExpr:!0,binop:7}),_typeof:ru("typeof",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_void:ru("void",{beforeExpr:!0,prefix:!0,startsExpr:!0}),_delete:ru("delete",{beforeExpr:!0,prefix:!0,startsExpr:!0})},ou=/\r\n?|\n|\u2028|\u2029/,au=new RegExp(ou.source,"g");function hu(e,t){return 10===e||13===e||!t&&(8232===e||8233===e)}var uu=/[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/,cu=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,lu=Object.prototype,pu=lu.hasOwnProperty,du=lu.toString;function fu(e,t){return pu.call(e,t)}var mu=Array.isArray||function(e){return"[object Array]"===du.call(e)};function gu(e){return new RegExp("^(?:"+e.replace(/ /g,"|")+")$")}var yu=function(e,t){this.line=e,this.column=t};yu.prototype.offset=function(e){return new yu(this.line,this.column+e)};var vu=function(e,t,n){this.start=t,this.end=n,null!==e.sourceFile&&(this.source=e.sourceFile)};function xu(e,t){for(var n=1,i=0;;){au.lastIndex=i;var r=au.exec(e);if(!(r&&r.index<t))return new yu(n,t-i);++n,i=r.index+r[0].length}}var Eu={ecmaVersion:10,sourceType:"script",onInsertedSemicolon:null,onTrailingComma:null,allowReserved:null,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowAwaitOutsideFunction:!1,allowHashBang:!1,locations:!1,onToken:null,onComment:null,ranges:!1,program:null,sourceFile:null,directSourceFile:null,preserveParens:!1};function _u(e){var t={};for(var n in Eu)t[n]=e&&fu(e,n)?e[n]:Eu[n];if(t.ecmaVersion>=2015&&(t.ecmaVersion-=2009),null==t.allowReserved&&(t.allowReserved=t.ecmaVersion<5),mu(t.onToken)){var i=t.onToken;t.onToken=function(e){return i.push(e)}}return mu(t.onComment)&&(t.onComment=function(e,t){return function(n,i,r,s,o,a){var h={type:n?"Block":"Line",value:i,start:r,end:s};e.locations&&(h.loc=new vu(this,o,a)),e.ranges&&(h.range=[r,s]),t.push(h)}}(t,t.onComment)),t}var bu=2,Su=1|bu,Au=4,Cu=8;function Iu(e,t){return bu|(e?Au:0)|(t?Cu:0)}var wu=function(e,t,n){this.options=e=_u(e),this.sourceFile=e.sourceFile,this.keywords=gu(jh[e.ecmaVersion>=6?6:"module"===e.sourceType?"5module":5]);var i="";if(!0!==e.allowReserved){for(var r=e.ecmaVersion;!(i=zh[r]);r--);"module"===e.sourceType&&(i+=" await")}this.reservedWords=gu(i);var s=(i?i+" ":"")+zh.strict;this.reservedWordsStrict=gu(s),this.reservedWordsStrictBind=gu(s+" "+zh.strictBind),this.input=String(t),this.containsEsc=!1,n?(this.pos=n,this.lineStart=this.input.lastIndexOf("\n",n-1)+1,this.curLine=this.input.slice(0,this.lineStart).split(ou).length):(this.pos=this.lineStart=0,this.curLine=1),this.type=su.eof,this.value=null,this.start=this.end=this.pos,this.startLoc=this.endLoc=this.curPosition(),this.lastTokEndLoc=this.lastTokStartLoc=null,this.lastTokStart=this.lastTokEnd=this.pos,this.context=this.initialContext(),this.exprAllowed=!0,this.inModule="module"===e.sourceType,this.strict=this.inModule||this.strictDirective(this.pos),this.potentialArrowAt=-1,this.yieldPos=this.awaitPos=this.awaitIdentPos=0,this.labels=[],this.undefinedExports={},0===this.pos&&e.allowHashBang&&"#!"===this.input.slice(0,2)&&this.skipLineComment(2),this.scopeStack=[],this.enterScope(1),this.regexpState=null},Pu={inFunction:{configurable:!0},inGenerator:{configurable:!0},inAsync:{configurable:!0},allowSuper:{configurable:!0},allowDirectSuper:{configurable:!0},treatFunctionsAsVar:{configurable:!0}};wu.prototype.parse=function(){var e=this.options.program||this.startNode();return this.nextToken(),this.parseTopLevel(e)},Pu.inFunction.get=function(){return(this.currentVarScope().flags&bu)>0},Pu.inGenerator.get=function(){return(this.currentVarScope().flags&Cu)>0},Pu.inAsync.get=function(){return(this.currentVarScope().flags&Au)>0},Pu.allowSuper.get=function(){return(64&this.currentThisScope().flags)>0},Pu.allowDirectSuper.get=function(){return(128&this.currentThisScope().flags)>0},Pu.treatFunctionsAsVar.get=function(){return this.treatFunctionsAsVarInScope(this.currentScope())},wu.prototype.inNonArrowFunction=function(){return(this.currentThisScope().flags&bu)>0},wu.extend=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var n=this,i=0;i<e.length;i++)n=e[i](n);return n},wu.parse=function(e,t){return new this(t,e).parse()},wu.parseExpressionAt=function(e,t,n){var i=new this(n,e,t);return i.nextToken(),i.parseExpression()},wu.tokenizer=function(e,t){return new this(t,e)},Object.defineProperties(wu.prototype,Pu);var ku=wu.prototype,Nu=/^(?:'((?:\\.|[^'])*?)'|"((?:\\.|[^"])*?)")/;function $u(){this.shorthandAssign=this.trailingComma=this.parenthesizedAssign=this.parenthesizedBind=this.doubleProto=-1}ku.strictDirective=function(e){for(;;){cu.lastIndex=e,e+=cu.exec(this.input)[0].length;var t=Nu.exec(this.input.slice(e));if(!t)return!1;if("use strict"===(t[1]||t[2]))return!0;e+=t[0].length,cu.lastIndex=e,e+=cu.exec(this.input)[0].length,";"===this.input[e]&&e++}},ku.eat=function(e){return this.type===e&&(this.next(),!0)},ku.isContextual=function(e){return this.type===su.name&&this.value===e&&!this.containsEsc},ku.eatContextual=function(e){return!!this.isContextual(e)&&(this.next(),!0)},ku.expectContextual=function(e){this.eatContextual(e)||this.unexpected()},ku.canInsertSemicolon=function(){return this.type===su.eof||this.type===su.braceR||ou.test(this.input.slice(this.lastTokEnd,this.start))},ku.insertSemicolon=function(){if(this.canInsertSemicolon())return this.options.onInsertedSemicolon&&this.options.onInsertedSemicolon(this.lastTokEnd,this.lastTokEndLoc),!0},ku.semicolon=function(){this.eat(su.semi)||this.insertSemicolon()||this.unexpected()},ku.afterTrailingComma=function(e,t){if(this.type===e)return this.options.onTrailingComma&&this.options.onTrailingComma(this.lastTokStart,this.lastTokStartLoc),t||this.next(),!0},ku.expect=function(e){this.eat(e)||this.unexpected()},ku.unexpected=function(e){this.raise(null!=e?e:this.start,"Unexpected token")},ku.checkPatternErrors=function(e,t){if(e){e.trailingComma>-1&&this.raiseRecoverable(e.trailingComma,"Comma is not permitted after the rest element");var n=t?e.parenthesizedAssign:e.parenthesizedBind;n>-1&&this.raiseRecoverable(n,"Parenthesized pattern")}},ku.checkExpressionErrors=function(e,t){if(!e)return!1;var n=e.shorthandAssign,i=e.doubleProto;if(!t)return n>=0||i>=0;n>=0&&this.raise(n,"Shorthand property assignments are valid only in destructuring patterns"),i>=0&&this.raiseRecoverable(i,"Redefinition of __proto__ property")},ku.checkYieldAwaitInDefaultParams=function(){this.yieldPos&&(!this.awaitPos||this.yieldPos<this.awaitPos)&&this.raise(this.yieldPos,"Yield expression cannot be a default value"),this.awaitPos&&this.raise(this.awaitPos,"Await expression cannot be a default value")},ku.isSimpleAssignTarget=function(e){return"ParenthesizedExpression"===e.type?this.isSimpleAssignTarget(e.expression):"Identifier"===e.type||"MemberExpression"===e.type};var Ru=wu.prototype;Ru.parseTopLevel=function(e){var t={};for(e.body||(e.body=[]);this.type!==su.eof;){var n=this.parseStatement(null,!0,t);e.body.push(n)}if(this.inModule)for(var i=0,r=Object.keys(this.undefinedExports);i<r.length;i+=1){var s=r[i];this.raiseRecoverable(this.undefinedExports[s].start,"Export '"+s+"' is not defined")}return this.adaptDirectivePrologue(e.body),this.next(),e.sourceType=this.options.sourceType,this.finishNode(e,"Program")};var Tu={kind:"loop"},Ou={kind:"switch"};Ru.isLet=function(e){if(this.options.ecmaVersion<6||!this.isContextual("let"))return!1;cu.lastIndex=this.pos;var t=cu.exec(this.input),n=this.pos+t[0].length,i=this.input.charCodeAt(n);if(91===i)return!0;if(e)return!1;if(123===i)return!0;if(Qh(i,!0)){for(var r=n+1;Jh(this.input.charCodeAt(r),!0);)++r;var s=this.input.slice(n,r);if(!Fh.test(s))return!0}return!1},Ru.isAsyncFunction=function(){if(this.options.ecmaVersion<8||!this.isContextual("async"))return!1;cu.lastIndex=this.pos;var e=cu.exec(this.input),t=this.pos+e[0].length;return!(ou.test(this.input.slice(this.pos,t))||"function"!==this.input.slice(t,t+8)||t+8!==this.input.length&&Jh(this.input.charAt(t+8)))},Ru.parseStatement=function(e,t,n){var i,r=this.type,s=this.startNode();switch(this.isLet(e)&&(r=su._var,i="let"),r){case su._break:case su._continue:return this.parseBreakContinueStatement(s,r.keyword);case su._debugger:return this.parseDebuggerStatement(s);case su._do:return this.parseDoStatement(s);case su._for:return this.parseForStatement(s);case su._function:return e&&(this.strict||"if"!==e&&"label"!==e)&&this.options.ecmaVersion>=6&&this.unexpected(),this.parseFunctionStatement(s,!1,!e);case su._class:return e&&this.unexpected(),this.parseClass(s,!0);case su._if:return this.parseIfStatement(s);case su._return:return this.parseReturnStatement(s);case su._switch:return this.parseSwitchStatement(s);case su._throw:return this.parseThrowStatement(s);case su._try:return this.parseTryStatement(s);case su._const:case su._var:return i=i||this.value,e&&"var"!==i&&this.unexpected(),this.parseVarStatement(s,i);case su._while:return this.parseWhileStatement(s);case su._with:return this.parseWithStatement(s);case su.braceL:return this.parseBlock(!0,s);case su.semi:return this.parseEmptyStatement(s);case su._export:case su._import:if(this.options.ecmaVersion>10&&r===su._import){cu.lastIndex=this.pos;var o=cu.exec(this.input),a=this.pos+o[0].length;if(40===this.input.charCodeAt(a))return this.parseExpressionStatement(s,this.parseExpression())}return this.options.allowImportExportEverywhere||(t||this.raise(this.start,"'import' and 'export' may only appear at the top level"),this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'")),r===su._import?this.parseImport(s):this.parseExport(s,n);default:if(this.isAsyncFunction())return e&&this.unexpected(),this.next(),this.parseFunctionStatement(s,!0,!e);var h=this.value,u=this.parseExpression();return r===su.name&&"Identifier"===u.type&&this.eat(su.colon)?this.parseLabeledStatement(s,h,u,e):this.parseExpressionStatement(s,u)}},Ru.parseBreakContinueStatement=function(e,t){var n="break"===t;this.next(),this.eat(su.semi)||this.insertSemicolon()?e.label=null:this.type!==su.name?this.unexpected():(e.label=this.parseIdent(),this.semicolon());for(var i=0;i<this.labels.length;++i){var r=this.labels[i];if(null==e.label||r.name===e.label.name){if(null!=r.kind&&(n||"loop"===r.kind))break;if(e.label&&n)break}}return i===this.labels.length&&this.raise(e.start,"Unsyntactic "+t),this.finishNode(e,n?"BreakStatement":"ContinueStatement")},Ru.parseDebuggerStatement=function(e){return this.next(),this.semicolon(),this.finishNode(e,"DebuggerStatement")},Ru.parseDoStatement=function(e){return this.next(),this.labels.push(Tu),e.body=this.parseStatement("do"),this.labels.pop(),this.expect(su._while),e.test=this.parseParenExpression(),this.options.ecmaVersion>=6?this.eat(su.semi):this.semicolon(),this.finishNode(e,"DoWhileStatement")},Ru.parseForStatement=function(e){this.next();var t=this.options.ecmaVersion>=9&&(this.inAsync||!this.inFunction&&this.options.allowAwaitOutsideFunction)&&this.eatContextual("await")?this.lastTokStart:-1;if(this.labels.push(Tu),this.enterScope(0),this.expect(su.parenL),this.type===su.semi)return t>-1&&this.unexpected(t),this.parseFor(e,null);var n=this.isLet();if(this.type===su._var||this.type===su._const||n){var i=this.startNode(),r=n?"let":this.value;return this.next(),this.parseVar(i,!0,r),this.finishNode(i,"VariableDeclaration"),(this.type===su._in||this.options.ecmaVersion>=6&&this.isContextual("of"))&&1===i.declarations.length?(this.options.ecmaVersion>=9&&(this.type===su._in?t>-1&&this.unexpected(t):e.await=t>-1),this.parseForIn(e,i)):(t>-1&&this.unexpected(t),this.parseFor(e,i))}var s=new $u,o=this.parseExpression(!0,s);return this.type===su._in||this.options.ecmaVersion>=6&&this.isContextual("of")?(this.options.ecmaVersion>=9&&(this.type===su._in?t>-1&&this.unexpected(t):e.await=t>-1),this.toAssignable(o,!1,s),this.checkLVal(o),this.parseForIn(e,o)):(this.checkExpressionErrors(s,!0),t>-1&&this.unexpected(t),this.parseFor(e,o))},Ru.parseFunctionStatement=function(e,t,n){return this.next(),this.parseFunction(e,Lu|(n?0:Du),!1,t)},Ru.parseIfStatement=function(e){return this.next(),e.test=this.parseParenExpression(),e.consequent=this.parseStatement("if"),e.alternate=this.eat(su._else)?this.parseStatement("if"):null,this.finishNode(e,"IfStatement")},Ru.parseReturnStatement=function(e){return this.inFunction||this.options.allowReturnOutsideFunction||this.raise(this.start,"'return' outside of function"),this.next(),this.eat(su.semi)||this.insertSemicolon()?e.argument=null:(e.argument=this.parseExpression(),this.semicolon()),this.finishNode(e,"ReturnStatement")},Ru.parseSwitchStatement=function(e){var t;this.next(),e.discriminant=this.parseParenExpression(),e.cases=[],this.expect(su.braceL),this.labels.push(Ou),this.enterScope(0);for(var n=!1;this.type!==su.braceR;)if(this.type===su._case||this.type===su._default){var i=this.type===su._case;t&&this.finishNode(t,"SwitchCase"),e.cases.push(t=this.startNode()),t.consequent=[],this.next(),i?t.test=this.parseExpression():(n&&this.raiseRecoverable(this.lastTokStart,"Multiple default clauses"),n=!0,t.test=null),this.expect(su.colon)}else t||this.unexpected(),t.consequent.push(this.parseStatement(null));return this.exitScope(),t&&this.finishNode(t,"SwitchCase"),this.next(),this.labels.pop(),this.finishNode(e,"SwitchStatement")},Ru.parseThrowStatement=function(e){return this.next(),ou.test(this.input.slice(this.lastTokEnd,this.start))&&this.raise(this.lastTokEnd,"Illegal newline after throw"),e.argument=this.parseExpression(),this.semicolon(),this.finishNode(e,"ThrowStatement")};var Mu=[];Ru.parseTryStatement=function(e){if(this.next(),e.block=this.parseBlock(),e.handler=null,this.type===su._catch){var t=this.startNode();if(this.next(),this.eat(su.parenL)){t.param=this.parseBindingAtom();var n="Identifier"===t.param.type;this.enterScope(n?32:0),this.checkLVal(t.param,n?4:2),this.expect(su.parenR)}else this.options.ecmaVersion<10&&this.unexpected(),t.param=null,this.enterScope(0);t.body=this.parseBlock(!1),this.exitScope(),e.handler=this.finishNode(t,"CatchClause")}return e.finalizer=this.eat(su._finally)?this.parseBlock():null,e.handler||e.finalizer||this.raise(e.start,"Missing catch or finally clause"),this.finishNode(e,"TryStatement")},Ru.parseVarStatement=function(e,t){return this.next(),this.parseVar(e,!1,t),this.semicolon(),this.finishNode(e,"VariableDeclaration")},Ru.parseWhileStatement=function(e){return this.next(),e.test=this.parseParenExpression(),this.labels.push(Tu),e.body=this.parseStatement("while"),this.labels.pop(),this.finishNode(e,"WhileStatement")},Ru.parseWithStatement=function(e){return this.strict&&this.raise(this.start,"'with' in strict mode"),this.next(),e.object=this.parseParenExpression(),e.body=this.parseStatement("with"),this.finishNode(e,"WithStatement")},Ru.parseEmptyStatement=function(e){return this.next(),this.finishNode(e,"EmptyStatement")},Ru.parseLabeledStatement=function(e,t,n,i){for(var r=0,s=this.labels;r<s.length;r+=1){s[r].name===t&&this.raise(n.start,"Label '"+t+"' is already declared")}for(var o=this.type.isLoop?"loop":this.type===su._switch?"switch":null,a=this.labels.length-1;a>=0;a--){var h=this.labels[a];if(h.statementStart!==e.start)break;h.statementStart=this.start,h.kind=o}return this.labels.push({name:t,kind:o,statementStart:this.start}),e.body=this.parseStatement(i?-1===i.indexOf("label")?i+"label":i:"label"),this.labels.pop(),e.label=n,this.finishNode(e,"LabeledStatement")},Ru.parseExpressionStatement=function(e,t){return e.expression=t,this.semicolon(),this.finishNode(e,"ExpressionStatement")},Ru.parseBlock=function(e,t){for(void 0===e&&(e=!0),void 0===t&&(t=this.startNode()),t.body=[],this.expect(su.braceL),e&&this.enterScope(0);!this.eat(su.braceR);){var n=this.parseStatement(null);t.body.push(n)}return e&&this.exitScope(),this.finishNode(t,"BlockStatement")},Ru.parseFor=function(e,t){return e.init=t,this.expect(su.semi),e.test=this.type===su.semi?null:this.parseExpression(),this.expect(su.semi),e.update=this.type===su.parenR?null:this.parseExpression(),this.expect(su.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,"ForStatement")},Ru.parseForIn=function(e,t){var n=this.type===su._in;return this.next(),"VariableDeclaration"===t.type&&null!=t.declarations[0].init&&(!n||this.options.ecmaVersion<8||this.strict||"var"!==t.kind||"Identifier"!==t.declarations[0].id.type)?this.raise(t.start,(n?"for-in":"for-of")+" loop variable declaration may not have an initializer"):"AssignmentPattern"===t.type&&this.raise(t.start,"Invalid left-hand side in for-loop"),e.left=t,e.right=n?this.parseExpression():this.parseMaybeAssign(),this.expect(su.parenR),e.body=this.parseStatement("for"),this.exitScope(),this.labels.pop(),this.finishNode(e,n?"ForInStatement":"ForOfStatement")},Ru.parseVar=function(e,t,n){for(e.declarations=[],e.kind=n;;){var i=this.startNode();if(this.parseVarId(i,n),this.eat(su.eq)?i.init=this.parseMaybeAssign(t):"const"!==n||this.type===su._in||this.options.ecmaVersion>=6&&this.isContextual("of")?"Identifier"===i.id.type||t&&(this.type===su._in||this.isContextual("of"))?i.init=null:this.raise(this.lastTokEnd,"Complex binding patterns require an initialization value"):this.unexpected(),e.declarations.push(this.finishNode(i,"VariableDeclarator")),!this.eat(su.comma))break}return e},Ru.parseVarId=function(e,t){e.id=this.parseBindingAtom(),this.checkLVal(e.id,"var"===t?1:2,!1)};var Lu=1,Du=2;Ru.parseFunction=function(e,t,n,i){this.initFunction(e),(this.options.ecmaVersion>=9||this.options.ecmaVersion>=6&&!i)&&(this.type===su.star&&t&Du&&this.unexpected(),e.generator=this.eat(su.star)),this.options.ecmaVersion>=8&&(e.async=!!i),t&Lu&&(e.id=4&t&&this.type!==su.name?null:this.parseIdent(),!e.id||t&Du||this.checkLVal(e.id,this.strict||e.generator||e.async?this.treatFunctionsAsVar?1:2:3));var r=this.yieldPos,s=this.awaitPos,o=this.awaitIdentPos;return this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(Iu(e.async,e.generator)),t&Lu||(e.id=this.type===su.name?this.parseIdent():null),this.parseFunctionParams(e),this.parseFunctionBody(e,n,!1),this.yieldPos=r,this.awaitPos=s,this.awaitIdentPos=o,this.finishNode(e,t&Lu?"FunctionDeclaration":"FunctionExpression")},Ru.parseFunctionParams=function(e){this.expect(su.parenL),e.params=this.parseBindingList(su.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams()},Ru.parseClass=function(e,t){this.next();var n=this.strict;this.strict=!0,this.parseClassId(e,t),this.parseClassSuper(e);var i=this.startNode(),r=!1;for(i.body=[],this.expect(su.braceL);!this.eat(su.braceR);){var s=this.parseClassElement(null!==e.superClass);s&&(i.body.push(s),"MethodDefinition"===s.type&&"constructor"===s.kind&&(r&&this.raise(s.start,"Duplicate constructor in the same class"),r=!0))}return e.body=this.finishNode(i,"ClassBody"),this.strict=n,this.finishNode(e,t?"ClassDeclaration":"ClassExpression")},Ru.parseClassElement=function(e){var t=this;if(this.eat(su.semi))return null;var n=this.startNode(),i=function(e,i){void 0===i&&(i=!1);var r=t.start,s=t.startLoc;return!!t.eatContextual(e)&&(!(t.type===su.parenL||i&&t.canInsertSemicolon())||(n.key&&t.unexpected(),n.computed=!1,n.key=t.startNodeAt(r,s),n.key.name=e,t.finishNode(n.key,"Identifier"),!1))};n.kind="method",n.static=i("static");var r=this.eat(su.star),s=!1;r||(this.options.ecmaVersion>=8&&i("async",!0)?(s=!0,r=this.options.ecmaVersion>=9&&this.eat(su.star)):i("get")?n.kind="get":i("set")&&(n.kind="set")),n.key||this.parsePropertyName(n);var o=n.key,a=!1;return n.computed||n.static||!("Identifier"===o.type&&"constructor"===o.name||"Literal"===o.type&&"constructor"===o.value)?n.static&&"Identifier"===o.type&&"prototype"===o.name&&this.raise(o.start,"Classes may not have a static property named prototype"):("method"!==n.kind&&this.raise(o.start,"Constructor can't have get/set modifier"),r&&this.raise(o.start,"Constructor can't be a generator"),s&&this.raise(o.start,"Constructor can't be an async method"),n.kind="constructor",a=e),this.parseClassMethod(n,r,s,a),"get"===n.kind&&0!==n.value.params.length&&this.raiseRecoverable(n.value.start,"getter should have no params"),"set"===n.kind&&1!==n.value.params.length&&this.raiseRecoverable(n.value.start,"setter should have exactly one param"),"set"===n.kind&&"RestElement"===n.value.params[0].type&&this.raiseRecoverable(n.value.params[0].start,"Setter cannot use rest params"),n},Ru.parseClassMethod=function(e,t,n,i){return e.value=this.parseMethod(t,n,i),this.finishNode(e,"MethodDefinition")},Ru.parseClassId=function(e,t){this.type===su.name?(e.id=this.parseIdent(),t&&this.checkLVal(e.id,2,!1)):(!0===t&&this.unexpected(),e.id=null)},Ru.parseClassSuper=function(e){e.superClass=this.eat(su._extends)?this.parseExprSubscripts():null},Ru.parseExport=function(e,t){if(this.next(),this.eat(su.star))return this.expectContextual("from"),this.type!==su.string&&this.unexpected(),e.source=this.parseExprAtom(),this.semicolon(),this.finishNode(e,"ExportAllDeclaration");if(this.eat(su._default)){var n;if(this.checkExport(t,"default",this.lastTokStart),this.type===su._function||(n=this.isAsyncFunction())){var i=this.startNode();this.next(),n&&this.next(),e.declaration=this.parseFunction(i,4|Lu,!1,n)}else if(this.type===su._class){var r=this.startNode();e.declaration=this.parseClass(r,"nullableID")}else e.declaration=this.parseMaybeAssign(),this.semicolon();return this.finishNode(e,"ExportDefaultDeclaration")}if(this.shouldParseExportStatement())e.declaration=this.parseStatement(null),"VariableDeclaration"===e.declaration.type?this.checkVariableExport(t,e.declaration.declarations):this.checkExport(t,e.declaration.id.name,e.declaration.id.start),e.specifiers=[],e.source=null;else{if(e.declaration=null,e.specifiers=this.parseExportSpecifiers(t),this.eatContextual("from"))this.type!==su.string&&this.unexpected(),e.source=this.parseExprAtom();else{for(var s=0,o=e.specifiers;s<o.length;s+=1){var a=o[s];this.checkUnreserved(a.local),this.checkLocalExport(a.local)}e.source=null}this.semicolon()}return this.finishNode(e,"ExportNamedDeclaration")},Ru.checkExport=function(e,t,n){e&&(fu(e,t)&&this.raiseRecoverable(n,"Duplicate export '"+t+"'"),e[t]=!0)},Ru.checkPatternExport=function(e,t){var n=t.type;if("Identifier"===n)this.checkExport(e,t.name,t.start);else if("ObjectPattern"===n)for(var i=0,r=t.properties;i<r.length;i+=1){var s=r[i];this.checkPatternExport(e,s)}else if("ArrayPattern"===n)for(var o=0,a=t.elements;o<a.length;o+=1){var h=a[o];h&&this.checkPatternExport(e,h)}else"Property"===n?this.checkPatternExport(e,t.value):"AssignmentPattern"===n?this.checkPatternExport(e,t.left):"RestElement"===n?this.checkPatternExport(e,t.argument):"ParenthesizedExpression"===n&&this.checkPatternExport(e,t.expression)},Ru.checkVariableExport=function(e,t){if(e)for(var n=0,i=t;n<i.length;n+=1){var r=i[n];this.checkPatternExport(e,r.id)}},Ru.shouldParseExportStatement=function(){return"var"===this.type.keyword||"const"===this.type.keyword||"class"===this.type.keyword||"function"===this.type.keyword||this.isLet()||this.isAsyncFunction()},Ru.parseExportSpecifiers=function(e){var t=[],n=!0;for(this.expect(su.braceL);!this.eat(su.braceR);){if(n)n=!1;else if(this.expect(su.comma),this.afterTrailingComma(su.braceR))break;var i=this.startNode();i.local=this.parseIdent(!0),i.exported=this.eatContextual("as")?this.parseIdent(!0):i.local,this.checkExport(e,i.exported.name,i.exported.start),t.push(this.finishNode(i,"ExportSpecifier"))}return t},Ru.parseImport=function(e){return this.next(),this.type===su.string?(e.specifiers=Mu,e.source=this.parseExprAtom()):(e.specifiers=this.parseImportSpecifiers(),this.expectContextual("from"),e.source=this.type===su.string?this.parseExprAtom():this.unexpected()),this.semicolon(),this.finishNode(e,"ImportDeclaration")},Ru.parseImportSpecifiers=function(){var e=[],t=!0;if(this.type===su.name){var n=this.startNode();if(n.local=this.parseIdent(),this.checkLVal(n.local,2),e.push(this.finishNode(n,"ImportDefaultSpecifier")),!this.eat(su.comma))return e}if(this.type===su.star){var i=this.startNode();return this.next(),this.expectContextual("as"),i.local=this.parseIdent(),this.checkLVal(i.local,2),e.push(this.finishNode(i,"ImportNamespaceSpecifier")),e}for(this.expect(su.braceL);!this.eat(su.braceR);){if(t)t=!1;else if(this.expect(su.comma),this.afterTrailingComma(su.braceR))break;var r=this.startNode();r.imported=this.parseIdent(!0),this.eatContextual("as")?r.local=this.parseIdent():(this.checkUnreserved(r.imported),r.local=r.imported),this.checkLVal(r.local,2),e.push(this.finishNode(r,"ImportSpecifier"))}return e},Ru.adaptDirectivePrologue=function(e){for(var t=0;t<e.length&&this.isDirectiveCandidate(e[t]);++t)e[t].directive=e[t].expression.raw.slice(1,-1)},Ru.isDirectiveCandidate=function(e){return"ExpressionStatement"===e.type&&"Literal"===e.expression.type&&"string"==typeof e.expression.value&&('"'===this.input[e.start]||"'"===this.input[e.start])};var Vu=wu.prototype;Vu.toAssignable=function(e,t,n){if(this.options.ecmaVersion>=6&&e)switch(e.type){case"Identifier":this.inAsync&&"await"===e.name&&this.raise(e.start,"Cannot use 'await' as identifier inside an async function");break;case"ObjectPattern":case"ArrayPattern":case"RestElement":break;case"ObjectExpression":e.type="ObjectPattern",n&&this.checkPatternErrors(n,!0);for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];this.toAssignable(s,t),"RestElement"!==s.type||"ArrayPattern"!==s.argument.type&&"ObjectPattern"!==s.argument.type||this.raise(s.argument.start,"Unexpected token")}break;case"Property":"init"!==e.kind&&this.raise(e.key.start,"Object pattern can't contain getter or setter"),this.toAssignable(e.value,t);break;case"ArrayExpression":e.type="ArrayPattern",n&&this.checkPatternErrors(n,!0),this.toAssignableList(e.elements,t);break;case"SpreadElement":e.type="RestElement",this.toAssignable(e.argument,t),"AssignmentPattern"===e.argument.type&&this.raise(e.argument.start,"Rest elements cannot have a default value");break;case"AssignmentExpression":"="!==e.operator&&this.raise(e.left.end,"Only '=' operator can be used for specifying default value."),e.type="AssignmentPattern",delete e.operator,this.toAssignable(e.left,t);case"AssignmentPattern":break;case"ParenthesizedExpression":this.toAssignable(e.expression,t,n);break;case"MemberExpression":if(!t)break;default:this.raise(e.start,"Assigning to rvalue")}else n&&this.checkPatternErrors(n,!0);return e},Vu.toAssignableList=function(e,t){for(var n=e.length,i=0;i<n;i++){var r=e[i];r&&this.toAssignable(r,t)}if(n){var s=e[n-1];6===this.options.ecmaVersion&&t&&s&&"RestElement"===s.type&&"Identifier"!==s.argument.type&&this.unexpected(s.argument.start)}return e},Vu.parseSpread=function(e){var t=this.startNode();return this.next(),t.argument=this.parseMaybeAssign(!1,e),this.finishNode(t,"SpreadElement")},Vu.parseRestBinding=function(){var e=this.startNode();return this.next(),6===this.options.ecmaVersion&&this.type!==su.name&&this.unexpected(),e.argument=this.parseBindingAtom(),this.finishNode(e,"RestElement")},Vu.parseBindingAtom=function(){if(this.options.ecmaVersion>=6)switch(this.type){case su.bracketL:var e=this.startNode();return this.next(),e.elements=this.parseBindingList(su.bracketR,!0,!0),this.finishNode(e,"ArrayPattern");case su.braceL:return this.parseObj(!0)}return this.parseIdent()},Vu.parseBindingList=function(e,t,n){for(var i=[],r=!0;!this.eat(e);)if(r?r=!1:this.expect(su.comma),t&&this.type===su.comma)i.push(null);else{if(n&&this.afterTrailingComma(e))break;if(this.type===su.ellipsis){var s=this.parseRestBinding();this.parseBindingListItem(s),i.push(s),this.type===su.comma&&this.raise(this.start,"Comma is not permitted after the rest element"),this.expect(e);break}var o=this.parseMaybeDefault(this.start,this.startLoc);this.parseBindingListItem(o),i.push(o)}return i},Vu.parseBindingListItem=function(e){return e},Vu.parseMaybeDefault=function(e,t,n){if(n=n||this.parseBindingAtom(),this.options.ecmaVersion<6||!this.eat(su.eq))return n;var i=this.startNodeAt(e,t);return i.left=n,i.right=this.parseMaybeAssign(),this.finishNode(i,"AssignmentPattern")},Vu.checkLVal=function(e,t,n){switch(void 0===t&&(t=0),e.type){case"Identifier":2===t&&"let"===e.name&&this.raiseRecoverable(e.start,"let is disallowed as a lexically bound name"),this.strict&&this.reservedWordsStrictBind.test(e.name)&&this.raiseRecoverable(e.start,(t?"Binding ":"Assigning to ")+e.name+" in strict mode"),n&&(fu(n,e.name)&&this.raiseRecoverable(e.start,"Argument name clash"),n[e.name]=!0),0!==t&&5!==t&&this.declareName(e.name,t,e.start);break;case"MemberExpression":t&&this.raiseRecoverable(e.start,"Binding member expression");break;case"ObjectPattern":for(var i=0,r=e.properties;i<r.length;i+=1){var s=r[i];this.checkLVal(s,t,n)}break;case"Property":this.checkLVal(e.value,t,n);break;case"ArrayPattern":for(var o=0,a=e.elements;o<a.length;o+=1){var h=a[o];h&&this.checkLVal(h,t,n)}break;case"AssignmentPattern":this.checkLVal(e.left,t,n);break;case"RestElement":this.checkLVal(e.argument,t,n);break;case"ParenthesizedExpression":this.checkLVal(e.expression,t,n);break;default:this.raise(e.start,(t?"Binding":"Assigning to")+" rvalue")}};var Bu=wu.prototype;Bu.checkPropClash=function(e,t,n){if(!(this.options.ecmaVersion>=9&&"SpreadElement"===e.type||this.options.ecmaVersion>=6&&(e.computed||e.method||e.shorthand))){var i,r=e.key;switch(r.type){case"Identifier":i=r.name;break;case"Literal":i=String(r.value);break;default:return}var s=e.kind;if(this.options.ecmaVersion>=6)"__proto__"===i&&"init"===s&&(t.proto&&(n&&n.doubleProto<0?n.doubleProto=r.start:this.raiseRecoverable(r.start,"Redefinition of __proto__ property")),t.proto=!0);else{var o=t[i="$"+i];if(o)("init"===s?this.strict&&o.init||o.get||o.set:o.init||o[s])&&this.raiseRecoverable(r.start,"Redefinition of property");else o=t[i]={init:!1,get:!1,set:!1};o[s]=!0}}},Bu.parseExpression=function(e,t){var n=this.start,i=this.startLoc,r=this.parseMaybeAssign(e,t);if(this.type===su.comma){var s=this.startNodeAt(n,i);for(s.expressions=[r];this.eat(su.comma);)s.expressions.push(this.parseMaybeAssign(e,t));return this.finishNode(s,"SequenceExpression")}return r},Bu.parseMaybeAssign=function(e,t,n){if(this.isContextual("yield")){if(this.inGenerator)return this.parseYield(e);this.exprAllowed=!1}var i=!1,r=-1,s=-1,o=-1;t?(r=t.parenthesizedAssign,s=t.trailingComma,o=t.shorthandAssign,t.parenthesizedAssign=t.trailingComma=t.shorthandAssign=-1):(t=new $u,i=!0);var a=this.start,h=this.startLoc;this.type!==su.parenL&&this.type!==su.name||(this.potentialArrowAt=this.start);var u=this.parseMaybeConditional(e,t);if(n&&(u=n.call(this,u,a,h)),this.type.isAssign){var c=this.startNodeAt(a,h);return c.operator=this.value,c.left=this.type===su.eq?this.toAssignable(u,!1,t):u,i||$u.call(t),t.shorthandAssign=-1,this.checkLVal(u),this.next(),c.right=this.parseMaybeAssign(e),this.finishNode(c,"AssignmentExpression")}return i&&this.checkExpressionErrors(t,!0),r>-1&&(t.parenthesizedAssign=r),s>-1&&(t.trailingComma=s),o>-1&&(t.shorthandAssign=o),u},Bu.parseMaybeConditional=function(e,t){var n=this.start,i=this.startLoc,r=this.parseExprOps(e,t);if(this.checkExpressionErrors(t))return r;if(this.eat(su.question)){var s=this.startNodeAt(n,i);return s.test=r,s.consequent=this.parseMaybeAssign(),this.expect(su.colon),s.alternate=this.parseMaybeAssign(e),this.finishNode(s,"ConditionalExpression")}return r},Bu.parseExprOps=function(e,t){var n=this.start,i=this.startLoc,r=this.parseMaybeUnary(t,!1);return this.checkExpressionErrors(t)?r:r.start===n&&"ArrowFunctionExpression"===r.type?r:this.parseExprOp(r,n,i,-1,e)},Bu.parseExprOp=function(e,t,n,i,r){var s=this.type.binop;if(null!=s&&(!r||this.type!==su._in)&&s>i){var o=this.type===su.logicalOR||this.type===su.logicalAND,a=this.value;this.next();var h=this.start,u=this.startLoc,c=this.parseExprOp(this.parseMaybeUnary(null,!1),h,u,s,r),l=this.buildBinary(t,n,e,c,a,o);return this.parseExprOp(l,t,n,i,r)}return e},Bu.buildBinary=function(e,t,n,i,r,s){var o=this.startNodeAt(e,t);return o.left=n,o.operator=r,o.right=i,this.finishNode(o,s?"LogicalExpression":"BinaryExpression")},Bu.parseMaybeUnary=function(e,t){var n,i=this.start,r=this.startLoc;if(this.isContextual("await")&&(this.inAsync||!this.inFunction&&this.options.allowAwaitOutsideFunction))n=this.parseAwait(),t=!0;else if(this.type.prefix){var s=this.startNode(),o=this.type===su.incDec;s.operator=this.value,s.prefix=!0,this.next(),s.argument=this.parseMaybeUnary(null,!0),this.checkExpressionErrors(e,!0),o?this.checkLVal(s.argument):this.strict&&"delete"===s.operator&&"Identifier"===s.argument.type?this.raiseRecoverable(s.start,"Deleting local variable in strict mode"):t=!0,n=this.finishNode(s,o?"UpdateExpression":"UnaryExpression")}else{if(n=this.parseExprSubscripts(e),this.checkExpressionErrors(e))return n;for(;this.type.postfix&&!this.canInsertSemicolon();){var a=this.startNodeAt(i,r);a.operator=this.value,a.prefix=!1,a.argument=n,this.checkLVal(n),this.next(),n=this.finishNode(a,"UpdateExpression")}}return!t&&this.eat(su.starstar)?this.buildBinary(i,r,n,this.parseMaybeUnary(null,!1),"**",!1):n},Bu.parseExprSubscripts=function(e){var t=this.start,n=this.startLoc,i=this.parseExprAtom(e),r="ArrowFunctionExpression"===i.type&&")"!==this.input.slice(this.lastTokStart,this.lastTokEnd);if(this.checkExpressionErrors(e)||r)return i;var s=this.parseSubscripts(i,t,n);return e&&"MemberExpression"===s.type&&(e.parenthesizedAssign>=s.start&&(e.parenthesizedAssign=-1),e.parenthesizedBind>=s.start&&(e.parenthesizedBind=-1)),s},Bu.parseSubscripts=function(e,t,n,i){for(var r=this.options.ecmaVersion>=8&&"Identifier"===e.type&&"async"===e.name&&this.lastTokEnd===e.end&&!this.canInsertSemicolon()&&"async"===this.input.slice(e.start,e.end);;){var s=this.parseSubscript(e,t,n,i,r);if(s===e||"ArrowFunctionExpression"===s.type)return s;e=s}},Bu.parseSubscript=function(e,t,n,i,r){var s=this.eat(su.bracketL);if(s||this.eat(su.dot)){var o=this.startNodeAt(t,n);o.object=e,o.property=s?this.parseExpression():this.parseIdent("never"!==this.options.allowReserved),o.computed=!!s,s&&this.expect(su.bracketR),e=this.finishNode(o,"MemberExpression")}else if(!i&&this.eat(su.parenL)){var a=new $u,h=this.yieldPos,u=this.awaitPos,c=this.awaitIdentPos;this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0;var l=this.parseExprList(su.parenR,this.options.ecmaVersion>=8,!1,a);if(r&&!this.canInsertSemicolon()&&this.eat(su.arrow))return this.checkPatternErrors(a,!1),this.checkYieldAwaitInDefaultParams(),this.awaitIdentPos>0&&this.raise(this.awaitIdentPos,"Cannot use 'await' as identifier inside an async function"),this.yieldPos=h,this.awaitPos=u,this.awaitIdentPos=c,this.parseArrowExpression(this.startNodeAt(t,n),l,!0);this.checkExpressionErrors(a,!0),this.yieldPos=h||this.yieldPos,this.awaitPos=u||this.awaitPos,this.awaitIdentPos=c||this.awaitIdentPos;var p=this.startNodeAt(t,n);p.callee=e,p.arguments=l,e=this.finishNode(p,"CallExpression")}else if(this.type===su.backQuote){var d=this.startNodeAt(t,n);d.tag=e,d.quasi=this.parseTemplate({isTagged:!0}),e=this.finishNode(d,"TaggedTemplateExpression")}return e},Bu.parseExprAtom=function(e){this.type===su.slash&&this.readRegexp();var t,n=this.potentialArrowAt===this.start;switch(this.type){case su._super:return this.allowSuper||this.raise(this.start,"'super' keyword outside a method"),t=this.startNode(),this.next(),this.type!==su.parenL||this.allowDirectSuper||this.raise(t.start,"super() call outside constructor of a subclass"),this.type!==su.dot&&this.type!==su.bracketL&&this.type!==su.parenL&&this.unexpected(),this.finishNode(t,"Super");case su._this:return t=this.startNode(),this.next(),this.finishNode(t,"ThisExpression");case su.name:var i=this.start,r=this.startLoc,s=this.containsEsc,o=this.parseIdent(!1);if(this.options.ecmaVersion>=8&&!s&&"async"===o.name&&!this.canInsertSemicolon()&&this.eat(su._function))return this.parseFunction(this.startNodeAt(i,r),0,!1,!0);if(n&&!this.canInsertSemicolon()){if(this.eat(su.arrow))return this.parseArrowExpression(this.startNodeAt(i,r),[o],!1);if(this.options.ecmaVersion>=8&&"async"===o.name&&this.type===su.name&&!s)return o=this.parseIdent(!1),!this.canInsertSemicolon()&&this.eat(su.arrow)||this.unexpected(),this.parseArrowExpression(this.startNodeAt(i,r),[o],!0)}return o;case su.regexp:var a=this.value;return(t=this.parseLiteral(a.value)).regex={pattern:a.pattern,flags:a.flags},t;case su.num:case su.string:return this.parseLiteral(this.value);case su._null:case su._true:case su._false:return(t=this.startNode()).value=this.type===su._null?null:this.type===su._true,t.raw=this.type.keyword,this.next(),this.finishNode(t,"Literal");case su.parenL:var h=this.start,u=this.parseParenAndDistinguishExpression(n);return e&&(e.parenthesizedAssign<0&&!this.isSimpleAssignTarget(u)&&(e.parenthesizedAssign=h),e.parenthesizedBind<0&&(e.parenthesizedBind=h)),u;case su.bracketL:return t=this.startNode(),this.next(),t.elements=this.parseExprList(su.bracketR,!0,!0,e),this.finishNode(t,"ArrayExpression");case su.braceL:return this.parseObj(!1,e);case su._function:return t=this.startNode(),this.next(),this.parseFunction(t,0);case su._class:return this.parseClass(this.startNode(),!1);case su._new:return this.parseNew();case su.backQuote:return this.parseTemplate();case su._import:return this.options.ecmaVersion>=11?this.parseExprImport():this.unexpected();default:this.unexpected()}},Bu.parseExprImport=function(){var e=this.startNode();switch(this.next(),this.type){case su.parenL:return this.parseDynamicImport(e);default:this.unexpected()}},Bu.parseDynamicImport=function(e){if(this.next(),e.source=this.parseMaybeAssign(),!this.eat(su.parenR)){var t=this.start;this.eat(su.comma)&&this.eat(su.parenR)?this.raiseRecoverable(t,"Trailing comma is not allowed in import()"):this.unexpected(t)}return this.finishNode(e,"ImportExpression")},Bu.parseLiteral=function(e){var t=this.startNode();return t.value=e,t.raw=this.input.slice(this.start,this.end),110===t.raw.charCodeAt(t.raw.length-1)&&(t.bigint=t.raw.slice(0,-1)),this.next(),this.finishNode(t,"Literal")},Bu.parseParenExpression=function(){this.expect(su.parenL);var e=this.parseExpression();return this.expect(su.parenR),e},Bu.parseParenAndDistinguishExpression=function(e){var t,n=this.start,i=this.startLoc,r=this.options.ecmaVersion>=8;if(this.options.ecmaVersion>=6){this.next();var s,o=this.start,a=this.startLoc,h=[],u=!0,c=!1,l=new $u,p=this.yieldPos,d=this.awaitPos;for(this.yieldPos=0,this.awaitPos=0;this.type!==su.parenR;){if(u?u=!1:this.expect(su.comma),r&&this.afterTrailingComma(su.parenR,!0)){c=!0;break}if(this.type===su.ellipsis){s=this.start,h.push(this.parseParenItem(this.parseRestBinding())),this.type===su.comma&&this.raise(this.start,"Comma is not permitted after the rest element");break}h.push(this.parseMaybeAssign(!1,l,this.parseParenItem))}var f=this.start,m=this.startLoc;if(this.expect(su.parenR),e&&!this.canInsertSemicolon()&&this.eat(su.arrow))return this.checkPatternErrors(l,!1),this.checkYieldAwaitInDefaultParams(),this.yieldPos=p,this.awaitPos=d,this.parseParenArrowList(n,i,h);h.length&&!c||this.unexpected(this.lastTokStart),s&&this.unexpected(s),this.checkExpressionErrors(l,!0),this.yieldPos=p||this.yieldPos,this.awaitPos=d||this.awaitPos,h.length>1?((t=this.startNodeAt(o,a)).expressions=h,this.finishNodeAt(t,"SequenceExpression",f,m)):t=h[0]}else t=this.parseParenExpression();if(this.options.preserveParens){var g=this.startNodeAt(n,i);return g.expression=t,this.finishNode(g,"ParenthesizedExpression")}return t},Bu.parseParenItem=function(e){return e},Bu.parseParenArrowList=function(e,t,n){return this.parseArrowExpression(this.startNodeAt(e,t),n)};var zu=[];Bu.parseNew=function(){var e=this.startNode(),t=this.parseIdent(!0);if(this.options.ecmaVersion>=6&&this.eat(su.dot)){e.meta=t;var n=this.containsEsc;return e.property=this.parseIdent(!0),("target"!==e.property.name||n)&&this.raiseRecoverable(e.property.start,"The only valid meta property for new is new.target"),this.inNonArrowFunction()||this.raiseRecoverable(e.start,"new.target can only be used in functions"),this.finishNode(e,"MetaProperty")}var i=this.start,r=this.startLoc,s=this.type===su._import;return e.callee=this.parseSubscripts(this.parseExprAtom(),i,r,!0),s&&"ImportExpression"===e.callee.type&&this.raise(i,"Cannot use new with import()"),this.eat(su.parenL)?e.arguments=this.parseExprList(su.parenR,this.options.ecmaVersion>=8,!1):e.arguments=zu,this.finishNode(e,"NewExpression")},Bu.parseTemplateElement=function(e){var t=e.isTagged,n=this.startNode();return this.type===su.invalidTemplate?(t||this.raiseRecoverable(this.start,"Bad escape sequence in untagged template literal"),n.value={raw:this.value,cooked:null}):n.value={raw:this.input.slice(this.start,this.end).replace(/\r\n?/g,"\n"),cooked:this.value},this.next(),n.tail=this.type===su.backQuote,this.finishNode(n,"TemplateElement")},Bu.parseTemplate=function(e){void 0===e&&(e={});var t=e.isTagged;void 0===t&&(t=!1);var n=this.startNode();this.next(),n.expressions=[];var i=this.parseTemplateElement({isTagged:t});for(n.quasis=[i];!i.tail;)this.type===su.eof&&this.raise(this.pos,"Unterminated template literal"),this.expect(su.dollarBraceL),n.expressions.push(this.parseExpression()),this.expect(su.braceR),n.quasis.push(i=this.parseTemplateElement({isTagged:t}));return this.next(),this.finishNode(n,"TemplateLiteral")},Bu.isAsyncProp=function(e){return!e.computed&&"Identifier"===e.key.type&&"async"===e.key.name&&(this.type===su.name||this.type===su.num||this.type===su.string||this.type===su.bracketL||this.type.keyword||this.options.ecmaVersion>=9&&this.type===su.star)&&!ou.test(this.input.slice(this.lastTokEnd,this.start))},Bu.parseObj=function(e,t){var n=this.startNode(),i=!0,r={};for(n.properties=[],this.next();!this.eat(su.braceR);){if(i)i=!1;else if(this.expect(su.comma),this.options.ecmaVersion>=5&&this.afterTrailingComma(su.braceR))break;var s=this.parseProperty(e,t);e||this.checkPropClash(s,r,t),n.properties.push(s)}return this.finishNode(n,e?"ObjectPattern":"ObjectExpression")},Bu.parseProperty=function(e,t){var n,i,r,s,o=this.startNode();if(this.options.ecmaVersion>=9&&this.eat(su.ellipsis))return e?(o.argument=this.parseIdent(!1),this.type===su.comma&&this.raise(this.start,"Comma is not permitted after the rest element"),this.finishNode(o,"RestElement")):(this.type===su.parenL&&t&&(t.parenthesizedAssign<0&&(t.parenthesizedAssign=this.start),t.parenthesizedBind<0&&(t.parenthesizedBind=this.start)),o.argument=this.parseMaybeAssign(!1,t),this.type===su.comma&&t&&t.trailingComma<0&&(t.trailingComma=this.start),this.finishNode(o,"SpreadElement"));this.options.ecmaVersion>=6&&(o.method=!1,o.shorthand=!1,(e||t)&&(r=this.start,s=this.startLoc),e||(n=this.eat(su.star)));var a=this.containsEsc;return this.parsePropertyName(o),!e&&!a&&this.options.ecmaVersion>=8&&!n&&this.isAsyncProp(o)?(i=!0,n=this.options.ecmaVersion>=9&&this.eat(su.star),this.parsePropertyName(o,t)):i=!1,this.parsePropertyValue(o,e,n,i,r,s,t,a),this.finishNode(o,"Property")},Bu.parsePropertyValue=function(e,t,n,i,r,s,o,a){if((n||i)&&this.type===su.colon&&this.unexpected(),this.eat(su.colon))e.value=t?this.parseMaybeDefault(this.start,this.startLoc):this.parseMaybeAssign(!1,o),e.kind="init";else if(this.options.ecmaVersion>=6&&this.type===su.parenL)t&&this.unexpected(),e.kind="init",e.method=!0,e.value=this.parseMethod(n,i);else if(t||a||!(this.options.ecmaVersion>=5)||e.computed||"Identifier"!==e.key.type||"get"!==e.key.name&&"set"!==e.key.name||this.type===su.comma||this.type===su.braceR)this.options.ecmaVersion>=6&&!e.computed&&"Identifier"===e.key.type?((n||i)&&this.unexpected(),this.checkUnreserved(e.key),"await"!==e.key.name||this.awaitIdentPos||(this.awaitIdentPos=r),e.kind="init",t?e.value=this.parseMaybeDefault(r,s,e.key):this.type===su.eq&&o?(o.shorthandAssign<0&&(o.shorthandAssign=this.start),e.value=this.parseMaybeDefault(r,s,e.key)):e.value=e.key,e.shorthand=!0):this.unexpected();else{(n||i)&&this.unexpected(),e.kind=e.key.name,this.parsePropertyName(e),e.value=this.parseMethod(!1);var h="get"===e.kind?0:1;if(e.value.params.length!==h){var u=e.value.start;"get"===e.kind?this.raiseRecoverable(u,"getter should have no params"):this.raiseRecoverable(u,"setter should have exactly one param")}else"set"===e.kind&&"RestElement"===e.value.params[0].type&&this.raiseRecoverable(e.value.params[0].start,"Setter cannot use rest params")}},Bu.parsePropertyName=function(e){if(this.options.ecmaVersion>=6){if(this.eat(su.bracketL))return e.computed=!0,e.key=this.parseMaybeAssign(),this.expect(su.bracketR),e.key;e.computed=!1}return e.key=this.type===su.num||this.type===su.string?this.parseExprAtom():this.parseIdent("never"!==this.options.allowReserved)},Bu.initFunction=function(e){e.id=null,this.options.ecmaVersion>=6&&(e.generator=e.expression=!1),this.options.ecmaVersion>=8&&(e.async=!1)},Bu.parseMethod=function(e,t,n){var i=this.startNode(),r=this.yieldPos,s=this.awaitPos,o=this.awaitIdentPos;return this.initFunction(i),this.options.ecmaVersion>=6&&(i.generator=e),this.options.ecmaVersion>=8&&(i.async=!!t),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,this.enterScope(64|Iu(t,i.generator)|(n?128:0)),this.expect(su.parenL),i.params=this.parseBindingList(su.parenR,!1,this.options.ecmaVersion>=8),this.checkYieldAwaitInDefaultParams(),this.parseFunctionBody(i,!1,!0),this.yieldPos=r,this.awaitPos=s,this.awaitIdentPos=o,this.finishNode(i,"FunctionExpression")},Bu.parseArrowExpression=function(e,t,n){var i=this.yieldPos,r=this.awaitPos,s=this.awaitIdentPos;return this.enterScope(16|Iu(n,!1)),this.initFunction(e),this.options.ecmaVersion>=8&&(e.async=!!n),this.yieldPos=0,this.awaitPos=0,this.awaitIdentPos=0,e.params=this.toAssignableList(t,!0),this.parseFunctionBody(e,!0,!1),this.yieldPos=i,this.awaitPos=r,this.awaitIdentPos=s,this.finishNode(e,"ArrowFunctionExpression")},Bu.parseFunctionBody=function(e,t,n){var i=t&&this.type!==su.braceL,r=this.strict,s=!1;if(i)e.body=this.parseMaybeAssign(),e.expression=!0,this.checkParams(e,!1);else{var o=this.options.ecmaVersion>=7&&!this.isSimpleParamList(e.params);r&&!o||(s=this.strictDirective(this.end))&&o&&this.raiseRecoverable(e.start,"Illegal 'use strict' directive in function with non-simple parameter list");var a=this.labels;this.labels=[],s&&(this.strict=!0),this.checkParams(e,!r&&!s&&!t&&!n&&this.isSimpleParamList(e.params)),e.body=this.parseBlock(!1),e.expression=!1,this.adaptDirectivePrologue(e.body.body),this.labels=a}this.exitScope(),this.strict&&e.id&&this.checkLVal(e.id,5),this.strict=r},Bu.isSimpleParamList=function(e){for(var t=0,n=e;t<n.length;t+=1){if("Identifier"!==n[t].type)return!1}return!0},Bu.checkParams=function(e,t){for(var n={},i=0,r=e.params;i<r.length;i+=1){var s=r[i];this.checkLVal(s,1,t?null:n)}},Bu.parseExprList=function(e,t,n,i){for(var r=[],s=!0;!this.eat(e);){if(s)s=!1;else if(this.expect(su.comma),t&&this.afterTrailingComma(e))break;var o=void 0;n&&this.type===su.comma?o=null:this.type===su.ellipsis?(o=this.parseSpread(i),i&&this.type===su.comma&&i.trailingComma<0&&(i.trailingComma=this.start)):o=this.parseMaybeAssign(!1,i),r.push(o)}return r},Bu.checkUnreserved=function(e){var t=e.start,n=e.end,i=e.name;(this.inGenerator&&"yield"===i&&this.raiseRecoverable(t,"Cannot use 'yield' as identifier inside a generator"),this.inAsync&&"await"===i&&this.raiseRecoverable(t,"Cannot use 'await' as identifier inside an async function"),this.keywords.test(i)&&this.raise(t,"Unexpected keyword '"+i+"'"),this.options.ecmaVersion<6&&-1!==this.input.slice(t,n).indexOf("\\"))||(this.strict?this.reservedWordsStrict:this.reservedWords).test(i)&&(this.inAsync||"await"!==i||this.raiseRecoverable(t,"Cannot use keyword 'await' outside an async function"),this.raiseRecoverable(t,"The keyword '"+i+"' is reserved"))},Bu.parseIdent=function(e,t){var n=this.startNode();return this.type===su.name?n.name=this.value:this.type.keyword?(n.name=this.type.keyword,"class"!==n.name&&"function"!==n.name||this.lastTokEnd===this.lastTokStart+1&&46===this.input.charCodeAt(this.lastTokStart)||this.context.pop()):this.unexpected(),this.next(),this.finishNode(n,"Identifier"),e||(this.checkUnreserved(n),"await"!==n.name||this.awaitIdentPos||(this.awaitIdentPos=n.start)),n},Bu.parseYield=function(e){this.yieldPos||(this.yieldPos=this.start);var t=this.startNode();return this.next(),this.type===su.semi||this.canInsertSemicolon()||this.type!==su.star&&!this.type.startsExpr?(t.delegate=!1,t.argument=null):(t.delegate=this.eat(su.star),t.argument=this.parseMaybeAssign(e)),this.finishNode(t,"YieldExpression")},Bu.parseAwait=function(){this.awaitPos||(this.awaitPos=this.start);var e=this.startNode();return this.next(),e.argument=this.parseMaybeUnary(null,!0),this.finishNode(e,"AwaitExpression")};var Wu=wu.prototype;Wu.raise=function(e,t){var n=xu(this.input,e);t+=" ("+n.line+":"+n.column+")";var i=new SyntaxError(t);throw i.pos=e,i.loc=n,i.raisedAt=this.pos,i},Wu.raiseRecoverable=Wu.raise,Wu.curPosition=function(){if(this.options.locations)return new yu(this.curLine,this.pos-this.lineStart)};var ju=wu.prototype,Fu=function(e){this.flags=e,this.var=[],this.lexical=[],this.functions=[]};ju.enterScope=function(e){this.scopeStack.push(new Fu(e))},ju.exitScope=function(){this.scopeStack.pop()},ju.treatFunctionsAsVarInScope=function(e){return e.flags&bu||!this.inModule&&1&e.flags},ju.declareName=function(e,t,n){var i=!1;if(2===t){var r=this.currentScope();i=r.lexical.indexOf(e)>-1||r.functions.indexOf(e)>-1||r.var.indexOf(e)>-1,r.lexical.push(e),this.inModule&&1&r.flags&&delete this.undefinedExports[e]}else if(4===t){this.currentScope().lexical.push(e)}else if(3===t){var s=this.currentScope();i=this.treatFunctionsAsVar?s.lexical.indexOf(e)>-1:s.lexical.indexOf(e)>-1||s.var.indexOf(e)>-1,s.functions.push(e)}else for(var o=this.scopeStack.length-1;o>=0;--o){var a=this.scopeStack[o];if(a.lexical.indexOf(e)>-1&&!(32&a.flags&&a.lexical[0]===e)||!this.treatFunctionsAsVarInScope(a)&&a.functions.indexOf(e)>-1){i=!0;break}if(a.var.push(e),this.inModule&&1&a.flags&&delete this.undefinedExports[e],a.flags&Su)break}i&&this.raiseRecoverable(n,"Identifier '"+e+"' has already been declared")},ju.checkLocalExport=function(e){-1===this.scopeStack[0].lexical.indexOf(e.name)&&-1===this.scopeStack[0].var.indexOf(e.name)&&(this.undefinedExports[e.name]=e)},ju.currentScope=function(){return this.scopeStack[this.scopeStack.length-1]},ju.currentVarScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Su)return t}},ju.currentThisScope=function(){for(var e=this.scopeStack.length-1;;e--){var t=this.scopeStack[e];if(t.flags&Su&&!(16&t.flags))return t}};var Uu=function(e,t,n){this.type="",this.start=t,this.end=0,e.options.locations&&(this.loc=new vu(e,n)),e.options.directSourceFile&&(this.sourceFile=e.options.directSourceFile),e.options.ranges&&(this.range=[t,0])},Gu=wu.prototype;function Hu(e,t,n,i){return e.type=t,e.end=n,this.options.locations&&(e.loc.end=i),this.options.ranges&&(e.range[1]=n),e}Gu.startNode=function(){return new Uu(this,this.start,this.startLoc)},Gu.startNodeAt=function(e,t){return new Uu(this,e,t)},Gu.finishNode=function(e,t){return Hu.call(this,e,t,this.lastTokEnd,this.lastTokEndLoc)},Gu.finishNodeAt=function(e,t,n,i){return Hu.call(this,e,t,n,i)};var qu=function(e,t,n,i,r){this.token=e,this.isExpr=!!t,this.preserveSpace=!!n,this.override=i,this.generator=!!r},Ku={b_stat:new qu("{",!1),b_expr:new qu("{",!0),b_tmpl:new qu("${",!1),p_stat:new qu("(",!1),p_expr:new qu("(",!0),q_tmpl:new qu("`",!0,!0,(function(e){return e.tryReadTemplateToken()})),f_stat:new qu("function",!1),f_expr:new qu("function",!0),f_expr_gen:new qu("function",!0,!1,null,!0),f_gen:new qu("function",!1,!1,null,!0)},Yu=wu.prototype;Yu.initialContext=function(){return[Ku.b_stat]},Yu.braceIsBlock=function(e){var t=this.curContext();return t===Ku.f_expr||t===Ku.f_stat||(e!==su.colon||t!==Ku.b_stat&&t!==Ku.b_expr?e===su._return||e===su.name&&this.exprAllowed?ou.test(this.input.slice(this.lastTokEnd,this.start)):e===su._else||e===su.semi||e===su.eof||e===su.parenR||e===su.arrow||(e===su.braceL?t===Ku.b_stat:e!==su._var&&e!==su._const&&e!==su.name&&!this.exprAllowed):!t.isExpr)},Yu.inGeneratorContext=function(){for(var e=this.context.length-1;e>=1;e--){var t=this.context[e];if("function"===t.token)return t.generator}return!1},Yu.updateContext=function(e){var t,n=this.type;n.keyword&&e===su.dot?this.exprAllowed=!1:(t=n.updateContext)?t.call(this,e):this.exprAllowed=n.beforeExpr},su.parenR.updateContext=su.braceR.updateContext=function(){if(1!==this.context.length){var e=this.context.pop();e===Ku.b_stat&&"function"===this.curContext().token&&(e=this.context.pop()),this.exprAllowed=!e.isExpr}else this.exprAllowed=!0},su.braceL.updateContext=function(e){this.context.push(this.braceIsBlock(e)?Ku.b_stat:Ku.b_expr),this.exprAllowed=!0},su.dollarBraceL.updateContext=function(){this.context.push(Ku.b_tmpl),this.exprAllowed=!0},su.parenL.updateContext=function(e){var t=e===su._if||e===su._for||e===su._with||e===su._while;this.context.push(t?Ku.p_stat:Ku.p_expr),this.exprAllowed=!0},su.incDec.updateContext=function(){},su._function.updateContext=su._class.updateContext=function(e){!e.beforeExpr||e===su.semi||e===su._else||e===su._return&&ou.test(this.input.slice(this.lastTokEnd,this.start))||(e===su.colon||e===su.braceL)&&this.curContext()===Ku.b_stat?this.context.push(Ku.f_stat):this.context.push(Ku.f_expr),this.exprAllowed=!1},su.backQuote.updateContext=function(){this.curContext()===Ku.q_tmpl?this.context.pop():this.context.push(Ku.q_tmpl),this.exprAllowed=!1},su.star.updateContext=function(e){if(e===su._function){var t=this.context.length-1;this.context[t]===Ku.f_expr?this.context[t]=Ku.f_expr_gen:this.context[t]=Ku.f_gen}this.exprAllowed=!0},su.name.updateContext=function(e){var t=!1;this.options.ecmaVersion>=6&&e!==su.dot&&("of"===this.value&&!this.exprAllowed||"yield"===this.value&&this.inGeneratorContext())&&(t=!0),this.exprAllowed=t};var Xu="ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS",Qu=Xu+" Extended_Pictographic",Ju={9:Xu,10:Qu,11:"ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS Extended_Pictographic"},Zu="Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu",ec="Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb",tc=ec+" Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd",nc={9:ec,10:tc,11:"Adlam Adlm Ahom Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho"},ic={};function rc(e){var t=ic[e]={binary:gu(Ju[e]+" "+Zu),nonBinary:{General_Category:gu(Zu),Script:gu(nc[e])}};t.nonBinary.Script_Extensions=t.nonBinary.Script,t.nonBinary.gc=t.nonBinary.General_Category,t.nonBinary.sc=t.nonBinary.Script,t.nonBinary.scx=t.nonBinary.Script_Extensions}rc(9),rc(10),rc(11);var sc=wu.prototype,oc=function(e){this.parser=e,this.validFlags="gim"+(e.options.ecmaVersion>=6?"uy":"")+(e.options.ecmaVersion>=9?"s":""),this.unicodeProperties=ic[e.options.ecmaVersion>=11?11:e.options.ecmaVersion],this.source="",this.flags="",this.start=0,this.switchU=!1,this.switchN=!1,this.pos=0,this.lastIntValue=0,this.lastStringValue="",this.lastAssertionIsQuantifiable=!1,this.numCapturingParens=0,this.maxBackReference=0,this.groupNames=[],this.backReferenceNames=[]};function ac(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}function hc(e){return 36===e||e>=40&&e<=43||46===e||63===e||e>=91&&e<=94||e>=123&&e<=125}function uc(e){return e>=65&&e<=90||e>=97&&e<=122}function cc(e){return uc(e)||95===e}function lc(e){return cc(e)||pc(e)}function pc(e){return e>=48&&e<=57}function dc(e){return e>=48&&e<=57||e>=65&&e<=70||e>=97&&e<=102}function fc(e){return e>=65&&e<=70?e-65+10:e>=97&&e<=102?e-97+10:e-48}function mc(e){return e>=48&&e<=55}oc.prototype.reset=function(e,t,n){var i=-1!==n.indexOf("u");this.start=0|e,this.source=t+"",this.flags=n,this.switchU=i&&this.parser.options.ecmaVersion>=6,this.switchN=i&&this.parser.options.ecmaVersion>=9},oc.prototype.raise=function(e){this.parser.raiseRecoverable(this.start,"Invalid regular expression: /"+this.source+"/: "+e)},oc.prototype.at=function(e){var t=this.source,n=t.length;if(e>=n)return-1;var i=t.charCodeAt(e);return!this.switchU||i<=55295||i>=57344||e+1>=n?i:(i<<10)+t.charCodeAt(e+1)-56613888},oc.prototype.nextIndex=function(e){var t=this.source,n=t.length;if(e>=n)return n;var i=t.charCodeAt(e);return!this.switchU||i<=55295||i>=57344||e+1>=n?e+1:e+2},oc.prototype.current=function(){return this.at(this.pos)},oc.prototype.lookahead=function(){return this.at(this.nextIndex(this.pos))},oc.prototype.advance=function(){this.pos=this.nextIndex(this.pos)},oc.prototype.eat=function(e){return this.current()===e&&(this.advance(),!0)},sc.validateRegExpFlags=function(e){for(var t=e.validFlags,n=e.flags,i=0;i<n.length;i++){var r=n.charAt(i);-1===t.indexOf(r)&&this.raise(e.start,"Invalid regular expression flag"),n.indexOf(r,i+1)>-1&&this.raise(e.start,"Duplicate regular expression flag")}},sc.validateRegExpPattern=function(e){this.regexp_pattern(e),!e.switchN&&this.options.ecmaVersion>=9&&e.groupNames.length>0&&(e.switchN=!0,this.regexp_pattern(e))},sc.regexp_pattern=function(e){e.pos=0,e.lastIntValue=0,e.lastStringValue="",e.lastAssertionIsQuantifiable=!1,e.numCapturingParens=0,e.maxBackReference=0,e.groupNames.length=0,e.backReferenceNames.length=0,this.regexp_disjunction(e),e.pos!==e.source.length&&(e.eat(41)&&e.raise("Unmatched ')'"),(e.eat(93)||e.eat(125))&&e.raise("Lone quantifier brackets")),e.maxBackReference>e.numCapturingParens&&e.raise("Invalid escape");for(var t=0,n=e.backReferenceNames;t<n.length;t+=1){var i=n[t];-1===e.groupNames.indexOf(i)&&e.raise("Invalid named capture referenced")}},sc.regexp_disjunction=function(e){for(this.regexp_alternative(e);e.eat(124);)this.regexp_alternative(e);this.regexp_eatQuantifier(e,!0)&&e.raise("Nothing to repeat"),e.eat(123)&&e.raise("Lone quantifier brackets")},sc.regexp_alternative=function(e){for(;e.pos<e.source.length&&this.regexp_eatTerm(e););},sc.regexp_eatTerm=function(e){return this.regexp_eatAssertion(e)?(e.lastAssertionIsQuantifiable&&this.regexp_eatQuantifier(e)&&e.switchU&&e.raise("Invalid quantifier"),!0):!(e.switchU?!this.regexp_eatAtom(e):!this.regexp_eatExtendedAtom(e))&&(this.regexp_eatQuantifier(e),!0)},sc.regexp_eatAssertion=function(e){var t=e.pos;if(e.lastAssertionIsQuantifiable=!1,e.eat(94)||e.eat(36))return!0;if(e.eat(92)){if(e.eat(66)||e.eat(98))return!0;e.pos=t}if(e.eat(40)&&e.eat(63)){var n=!1;if(this.options.ecmaVersion>=9&&(n=e.eat(60)),e.eat(61)||e.eat(33))return this.regexp_disjunction(e),e.eat(41)||e.raise("Unterminated group"),e.lastAssertionIsQuantifiable=!n,!0}return e.pos=t,!1},sc.regexp_eatQuantifier=function(e,t){return void 0===t&&(t=!1),!!this.regexp_eatQuantifierPrefix(e,t)&&(e.eat(63),!0)},sc.regexp_eatQuantifierPrefix=function(e,t){return e.eat(42)||e.eat(43)||e.eat(63)||this.regexp_eatBracedQuantifier(e,t)},sc.regexp_eatBracedQuantifier=function(e,t){var n=e.pos;if(e.eat(123)){var i=0,r=-1;if(this.regexp_eatDecimalDigits(e)&&(i=e.lastIntValue,e.eat(44)&&this.regexp_eatDecimalDigits(e)&&(r=e.lastIntValue),e.eat(125)))return-1!==r&&r<i&&!t&&e.raise("numbers out of order in {} quantifier"),!0;e.switchU&&!t&&e.raise("Incomplete quantifier"),e.pos=n}return!1},sc.regexp_eatAtom=function(e){return this.regexp_eatPatternCharacters(e)||e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)},sc.regexp_eatReverseSolidusAtomEscape=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatAtomEscape(e))return!0;e.pos=t}return!1},sc.regexp_eatUncapturingGroup=function(e){var t=e.pos;if(e.eat(40)){if(e.eat(63)&&e.eat(58)){if(this.regexp_disjunction(e),e.eat(41))return!0;e.raise("Unterminated group")}e.pos=t}return!1},sc.regexp_eatCapturingGroup=function(e){if(e.eat(40)){if(this.options.ecmaVersion>=9?this.regexp_groupSpecifier(e):63===e.current()&&e.raise("Invalid group"),this.regexp_disjunction(e),e.eat(41))return e.numCapturingParens+=1,!0;e.raise("Unterminated group")}return!1},sc.regexp_eatExtendedAtom=function(e){return e.eat(46)||this.regexp_eatReverseSolidusAtomEscape(e)||this.regexp_eatCharacterClass(e)||this.regexp_eatUncapturingGroup(e)||this.regexp_eatCapturingGroup(e)||this.regexp_eatInvalidBracedQuantifier(e)||this.regexp_eatExtendedPatternCharacter(e)},sc.regexp_eatInvalidBracedQuantifier=function(e){return this.regexp_eatBracedQuantifier(e,!0)&&e.raise("Nothing to repeat"),!1},sc.regexp_eatSyntaxCharacter=function(e){var t=e.current();return!!hc(t)&&(e.lastIntValue=t,e.advance(),!0)},sc.regexp_eatPatternCharacters=function(e){for(var t=e.pos,n=0;-1!==(n=e.current())&&!hc(n);)e.advance();return e.pos!==t},sc.regexp_eatExtendedPatternCharacter=function(e){var t=e.current();return!(-1===t||36===t||t>=40&&t<=43||46===t||63===t||91===t||94===t||124===t)&&(e.advance(),!0)},sc.regexp_groupSpecifier=function(e){if(e.eat(63)){if(this.regexp_eatGroupName(e))return-1!==e.groupNames.indexOf(e.lastStringValue)&&e.raise("Duplicate capture group name"),void e.groupNames.push(e.lastStringValue);e.raise("Invalid group")}},sc.regexp_eatGroupName=function(e){if(e.lastStringValue="",e.eat(60)){if(this.regexp_eatRegExpIdentifierName(e)&&e.eat(62))return!0;e.raise("Invalid capture group name")}return!1},sc.regexp_eatRegExpIdentifierName=function(e){if(e.lastStringValue="",this.regexp_eatRegExpIdentifierStart(e)){for(e.lastStringValue+=ac(e.lastIntValue);this.regexp_eatRegExpIdentifierPart(e);)e.lastStringValue+=ac(e.lastIntValue);return!0}return!1},sc.regexp_eatRegExpIdentifierStart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return Qh(e,!0)||36===e||95===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},sc.regexp_eatRegExpIdentifierPart=function(e){var t=e.pos,n=e.current();return e.advance(),92===n&&this.regexp_eatRegExpUnicodeEscapeSequence(e)&&(n=e.lastIntValue),function(e){return Jh(e,!0)||36===e||95===e||8204===e||8205===e}(n)?(e.lastIntValue=n,!0):(e.pos=t,!1)},sc.regexp_eatAtomEscape=function(e){return!!(this.regexp_eatBackReference(e)||this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)||e.switchN&&this.regexp_eatKGroupName(e))||(e.switchU&&(99===e.current()&&e.raise("Invalid unicode escape"),e.raise("Invalid escape")),!1)},sc.regexp_eatBackReference=function(e){var t=e.pos;if(this.regexp_eatDecimalEscape(e)){var n=e.lastIntValue;if(e.switchU)return n>e.maxBackReference&&(e.maxBackReference=n),!0;if(n<=e.numCapturingParens)return!0;e.pos=t}return!1},sc.regexp_eatKGroupName=function(e){if(e.eat(107)){if(this.regexp_eatGroupName(e))return e.backReferenceNames.push(e.lastStringValue),!0;e.raise("Invalid named reference")}return!1},sc.regexp_eatCharacterEscape=function(e){return this.regexp_eatControlEscape(e)||this.regexp_eatCControlLetter(e)||this.regexp_eatZero(e)||this.regexp_eatHexEscapeSequence(e)||this.regexp_eatRegExpUnicodeEscapeSequence(e)||!e.switchU&&this.regexp_eatLegacyOctalEscapeSequence(e)||this.regexp_eatIdentityEscape(e)},sc.regexp_eatCControlLetter=function(e){var t=e.pos;if(e.eat(99)){if(this.regexp_eatControlLetter(e))return!0;e.pos=t}return!1},sc.regexp_eatZero=function(e){return 48===e.current()&&!pc(e.lookahead())&&(e.lastIntValue=0,e.advance(),!0)},sc.regexp_eatControlEscape=function(e){var t=e.current();return 116===t?(e.lastIntValue=9,e.advance(),!0):110===t?(e.lastIntValue=10,e.advance(),!0):118===t?(e.lastIntValue=11,e.advance(),!0):102===t?(e.lastIntValue=12,e.advance(),!0):114===t&&(e.lastIntValue=13,e.advance(),!0)},sc.regexp_eatControlLetter=function(e){var t=e.current();return!!uc(t)&&(e.lastIntValue=t%32,e.advance(),!0)},sc.regexp_eatRegExpUnicodeEscapeSequence=function(e){var t,n=e.pos;if(e.eat(117)){if(this.regexp_eatFixedHexDigits(e,4)){var i=e.lastIntValue;if(e.switchU&&i>=55296&&i<=56319){var r=e.pos;if(e.eat(92)&&e.eat(117)&&this.regexp_eatFixedHexDigits(e,4)){var s=e.lastIntValue;if(s>=56320&&s<=57343)return e.lastIntValue=1024*(i-55296)+(s-56320)+65536,!0}e.pos=r,e.lastIntValue=i}return!0}if(e.switchU&&e.eat(123)&&this.regexp_eatHexDigits(e)&&e.eat(125)&&((t=e.lastIntValue)>=0&&t<=1114111))return!0;e.switchU&&e.raise("Invalid unicode escape"),e.pos=n}return!1},sc.regexp_eatIdentityEscape=function(e){if(e.switchU)return!!this.regexp_eatSyntaxCharacter(e)||!!e.eat(47)&&(e.lastIntValue=47,!0);var t=e.current();return!(99===t||e.switchN&&107===t)&&(e.lastIntValue=t,e.advance(),!0)},sc.regexp_eatDecimalEscape=function(e){e.lastIntValue=0;var t=e.current();if(t>=49&&t<=57){do{e.lastIntValue=10*e.lastIntValue+(t-48),e.advance()}while((t=e.current())>=48&&t<=57);return!0}return!1},sc.regexp_eatCharacterClassEscape=function(e){var t=e.current();if(function(e){return 100===e||68===e||115===e||83===e||119===e||87===e}(t))return e.lastIntValue=-1,e.advance(),!0;if(e.switchU&&this.options.ecmaVersion>=9&&(80===t||112===t)){if(e.lastIntValue=-1,e.advance(),e.eat(123)&&this.regexp_eatUnicodePropertyValueExpression(e)&&e.eat(125))return!0;e.raise("Invalid property name")}return!1},sc.regexp_eatUnicodePropertyValueExpression=function(e){var t=e.pos;if(this.regexp_eatUnicodePropertyName(e)&&e.eat(61)){var n=e.lastStringValue;if(this.regexp_eatUnicodePropertyValue(e)){var i=e.lastStringValue;return this.regexp_validateUnicodePropertyNameAndValue(e,n,i),!0}}if(e.pos=t,this.regexp_eatLoneUnicodePropertyNameOrValue(e)){var r=e.lastStringValue;return this.regexp_validateUnicodePropertyNameOrValue(e,r),!0}return!1},sc.regexp_validateUnicodePropertyNameAndValue=function(e,t,n){fu(e.unicodeProperties.nonBinary,t)||e.raise("Invalid property name"),e.unicodeProperties.nonBinary[t].test(n)||e.raise("Invalid property value")},sc.regexp_validateUnicodePropertyNameOrValue=function(e,t){e.unicodeProperties.binary.test(t)||e.raise("Invalid property name")},sc.regexp_eatUnicodePropertyName=function(e){var t=0;for(e.lastStringValue="";cc(t=e.current());)e.lastStringValue+=ac(t),e.advance();return""!==e.lastStringValue},sc.regexp_eatUnicodePropertyValue=function(e){var t=0;for(e.lastStringValue="";lc(t=e.current());)e.lastStringValue+=ac(t),e.advance();return""!==e.lastStringValue},sc.regexp_eatLoneUnicodePropertyNameOrValue=function(e){return this.regexp_eatUnicodePropertyValue(e)},sc.regexp_eatCharacterClass=function(e){if(e.eat(91)){if(e.eat(94),this.regexp_classRanges(e),e.eat(93))return!0;e.raise("Unterminated character class")}return!1},sc.regexp_classRanges=function(e){for(;this.regexp_eatClassAtom(e);){var t=e.lastIntValue;if(e.eat(45)&&this.regexp_eatClassAtom(e)){var n=e.lastIntValue;!e.switchU||-1!==t&&-1!==n||e.raise("Invalid character class"),-1!==t&&-1!==n&&t>n&&e.raise("Range out of order in character class")}}},sc.regexp_eatClassAtom=function(e){var t=e.pos;if(e.eat(92)){if(this.regexp_eatClassEscape(e))return!0;if(e.switchU){var n=e.current();(99===n||mc(n))&&e.raise("Invalid class escape"),e.raise("Invalid escape")}e.pos=t}var i=e.current();return 93!==i&&(e.lastIntValue=i,e.advance(),!0)},sc.regexp_eatClassEscape=function(e){var t=e.pos;if(e.eat(98))return e.lastIntValue=8,!0;if(e.switchU&&e.eat(45))return e.lastIntValue=45,!0;if(!e.switchU&&e.eat(99)){if(this.regexp_eatClassControlLetter(e))return!0;e.pos=t}return this.regexp_eatCharacterClassEscape(e)||this.regexp_eatCharacterEscape(e)},sc.regexp_eatClassControlLetter=function(e){var t=e.current();return!(!pc(t)&&95!==t)&&(e.lastIntValue=t%32,e.advance(),!0)},sc.regexp_eatHexEscapeSequence=function(e){var t=e.pos;if(e.eat(120)){if(this.regexp_eatFixedHexDigits(e,2))return!0;e.switchU&&e.raise("Invalid escape"),e.pos=t}return!1},sc.regexp_eatDecimalDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;pc(n=e.current());)e.lastIntValue=10*e.lastIntValue+(n-48),e.advance();return e.pos!==t},sc.regexp_eatHexDigits=function(e){var t=e.pos,n=0;for(e.lastIntValue=0;dc(n=e.current());)e.lastIntValue=16*e.lastIntValue+fc(n),e.advance();return e.pos!==t},sc.regexp_eatLegacyOctalEscapeSequence=function(e){if(this.regexp_eatOctalDigit(e)){var t=e.lastIntValue;if(this.regexp_eatOctalDigit(e)){var n=e.lastIntValue;t<=3&&this.regexp_eatOctalDigit(e)?e.lastIntValue=64*t+8*n+e.lastIntValue:e.lastIntValue=8*t+n}else e.lastIntValue=t;return!0}return!1},sc.regexp_eatOctalDigit=function(e){var t=e.current();return mc(t)?(e.lastIntValue=t-48,e.advance(),!0):(e.lastIntValue=0,!1)},sc.regexp_eatFixedHexDigits=function(e,t){var n=e.pos;e.lastIntValue=0;for(var i=0;i<t;++i){var r=e.current();if(!dc(r))return e.pos=n,!1;e.lastIntValue=16*e.lastIntValue+fc(r),e.advance()}return!0};var gc=function(e){this.type=e.type,this.value=e.value,this.start=e.start,this.end=e.end,e.options.locations&&(this.loc=new vu(e,e.startLoc,e.endLoc)),e.options.ranges&&(this.range=[e.start,e.end])},yc=wu.prototype;function vc(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}yc.next=function(){this.options.onToken&&this.options.onToken(new gc(this)),this.lastTokEnd=this.end,this.lastTokStart=this.start,this.lastTokEndLoc=this.endLoc,this.lastTokStartLoc=this.startLoc,this.nextToken()},yc.getToken=function(){return this.next(),new gc(this)},"undefined"!=typeof Symbol&&(yc[Symbol.iterator]=function(){var e=this;return{next:function(){var t=e.getToken();return{done:t.type===su.eof,value:t}}}}),yc.curContext=function(){return this.context[this.context.length-1]},yc.nextToken=function(){var e=this.curContext();return e&&e.preserveSpace||this.skipSpace(),this.start=this.pos,this.options.locations&&(this.startLoc=this.curPosition()),this.pos>=this.input.length?this.finishToken(su.eof):e.override?e.override(this):void this.readToken(this.fullCharCodeAtPos())},yc.readToken=function(e){return Qh(e,this.options.ecmaVersion>=6)||92===e?this.readWord():this.getTokenFromCode(e)},yc.fullCharCodeAtPos=function(){var e=this.input.charCodeAt(this.pos);return e<=55295||e>=57344?e:(e<<10)+this.input.charCodeAt(this.pos+1)-56613888},yc.skipBlockComment=function(){var e,t=this.options.onComment&&this.curPosition(),n=this.pos,i=this.input.indexOf("*/",this.pos+=2);if(-1===i&&this.raise(this.pos-2,"Unterminated comment"),this.pos=i+2,this.options.locations)for(au.lastIndex=n;(e=au.exec(this.input))&&e.index<this.pos;)++this.curLine,this.lineStart=e.index+e[0].length;this.options.onComment&&this.options.onComment(!0,this.input.slice(n+2,i),n,this.pos,t,this.curPosition())},yc.skipLineComment=function(e){for(var t=this.pos,n=this.options.onComment&&this.curPosition(),i=this.input.charCodeAt(this.pos+=e);this.pos<this.input.length&&!hu(i);)i=this.input.charCodeAt(++this.pos);this.options.onComment&&this.options.onComment(!1,this.input.slice(t+e,this.pos),t,this.pos,n,this.curPosition())},yc.skipSpace=function(){e:for(;this.pos<this.input.length;){var e=this.input.charCodeAt(this.pos);switch(e){case 32:case 160:++this.pos;break;case 13:10===this.input.charCodeAt(this.pos+1)&&++this.pos;case 10:case 8232:case 8233:++this.pos,this.options.locations&&(++this.curLine,this.lineStart=this.pos);break;case 47:switch(this.input.charCodeAt(this.pos+1)){case 42:this.skipBlockComment();break;case 47:this.skipLineComment(2);break;default:break e}break;default:if(!(e>8&&e<14||e>=5760&&uu.test(String.fromCharCode(e))))break e;++this.pos}}},yc.finishToken=function(e,t){this.end=this.pos,this.options.locations&&(this.endLoc=this.curPosition());var n=this.type;this.type=e,this.value=t,this.updateContext(n)},yc.readToken_dot=function(){var e=this.input.charCodeAt(this.pos+1);if(e>=48&&e<=57)return this.readNumber(!0);var t=this.input.charCodeAt(this.pos+2);return this.options.ecmaVersion>=6&&46===e&&46===t?(this.pos+=3,this.finishToken(su.ellipsis)):(++this.pos,this.finishToken(su.dot))},yc.readToken_slash=function(){var e=this.input.charCodeAt(this.pos+1);return this.exprAllowed?(++this.pos,this.readRegexp()):61===e?this.finishOp(su.assign,2):this.finishOp(su.slash,1)},yc.readToken_mult_modulo_exp=function(e){var t=this.input.charCodeAt(this.pos+1),n=1,i=42===e?su.star:su.modulo;return this.options.ecmaVersion>=7&&42===e&&42===t&&(++n,i=su.starstar,t=this.input.charCodeAt(this.pos+2)),61===t?this.finishOp(su.assign,n+1):this.finishOp(i,n)},yc.readToken_pipe_amp=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?this.finishOp(124===e?su.logicalOR:su.logicalAND,2):61===t?this.finishOp(su.assign,2):this.finishOp(124===e?su.bitwiseOR:su.bitwiseAND,1)},yc.readToken_caret=function(){return 61===this.input.charCodeAt(this.pos+1)?this.finishOp(su.assign,2):this.finishOp(su.bitwiseXOR,1)},yc.readToken_plus_min=function(e){var t=this.input.charCodeAt(this.pos+1);return t===e?45!==t||this.inModule||62!==this.input.charCodeAt(this.pos+2)||0!==this.lastTokEnd&&!ou.test(this.input.slice(this.lastTokEnd,this.pos))?this.finishOp(su.incDec,2):(this.skipLineComment(3),this.skipSpace(),this.nextToken()):61===t?this.finishOp(su.assign,2):this.finishOp(su.plusMin,1)},yc.readToken_lt_gt=function(e){var t=this.input.charCodeAt(this.pos+1),n=1;return t===e?(n=62===e&&62===this.input.charCodeAt(this.pos+2)?3:2,61===this.input.charCodeAt(this.pos+n)?this.finishOp(su.assign,n+1):this.finishOp(su.bitShift,n)):33!==t||60!==e||this.inModule||45!==this.input.charCodeAt(this.pos+2)||45!==this.input.charCodeAt(this.pos+3)?(61===t&&(n=2),this.finishOp(su.relational,n)):(this.skipLineComment(4),this.skipSpace(),this.nextToken())},yc.readToken_eq_excl=function(e){var t=this.input.charCodeAt(this.pos+1);return 61===t?this.finishOp(su.equality,61===this.input.charCodeAt(this.pos+2)?3:2):61===e&&62===t&&this.options.ecmaVersion>=6?(this.pos+=2,this.finishToken(su.arrow)):this.finishOp(61===e?su.eq:su.prefix,1)},yc.getTokenFromCode=function(e){switch(e){case 46:return this.readToken_dot();case 40:return++this.pos,this.finishToken(su.parenL);case 41:return++this.pos,this.finishToken(su.parenR);case 59:return++this.pos,this.finishToken(su.semi);case 44:return++this.pos,this.finishToken(su.comma);case 91:return++this.pos,this.finishToken(su.bracketL);case 93:return++this.pos,this.finishToken(su.bracketR);case 123:return++this.pos,this.finishToken(su.braceL);case 125:return++this.pos,this.finishToken(su.braceR);case 58:return++this.pos,this.finishToken(su.colon);case 63:return++this.pos,this.finishToken(su.question);case 96:if(this.options.ecmaVersion<6)break;return++this.pos,this.finishToken(su.backQuote);case 48:var t=this.input.charCodeAt(this.pos+1);if(120===t||88===t)return this.readRadixNumber(16);if(this.options.ecmaVersion>=6){if(111===t||79===t)return this.readRadixNumber(8);if(98===t||66===t)return this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return this.readNumber(!1);case 34:case 39:return this.readString(e);case 47:return this.readToken_slash();case 37:case 42:return this.readToken_mult_modulo_exp(e);case 124:case 38:return this.readToken_pipe_amp(e);case 94:return this.readToken_caret();case 43:case 45:return this.readToken_plus_min(e);case 60:case 62:return this.readToken_lt_gt(e);case 61:case 33:return this.readToken_eq_excl(e);case 126:return this.finishOp(su.prefix,1)}this.raise(this.pos,"Unexpected character '"+vc(e)+"'")},yc.finishOp=function(e,t){var n=this.input.slice(this.pos,this.pos+t);return this.pos+=t,this.finishToken(e,n)},yc.readRegexp=function(){for(var e,t,n=this.pos;;){this.pos>=this.input.length&&this.raise(n,"Unterminated regular expression");var i=this.input.charAt(this.pos);if(ou.test(i)&&this.raise(n,"Unterminated regular expression"),e)e=!1;else{if("["===i)t=!0;else if("]"===i&&t)t=!1;else if("/"===i&&!t)break;e="\\"===i}++this.pos}var r=this.input.slice(n,this.pos);++this.pos;var s=this.pos,o=this.readWord1();this.containsEsc&&this.unexpected(s);var a=this.regexpState||(this.regexpState=new oc(this));a.reset(n,r,o),this.validateRegExpFlags(a),this.validateRegExpPattern(a);var h=null;try{h=new RegExp(r,o)}catch(e){}return this.finishToken(su.regexp,{pattern:r,flags:o,value:h})},yc.readInt=function(e,t){for(var n=this.pos,i=0,r=0,s=null==t?1/0:t;r<s;++r){var o=this.input.charCodeAt(this.pos),a=void 0;if((a=o>=97?o-97+10:o>=65?o-65+10:o>=48&&o<=57?o-48:1/0)>=e)break;++this.pos,i=i*e+a}return this.pos===n||null!=t&&this.pos-n!==t?null:i},yc.readRadixNumber=function(e){var t=this.pos;this.pos+=2;var n=this.readInt(e);return null==n&&this.raise(this.start+2,"Expected number in radix "+e),this.options.ecmaVersion>=11&&110===this.input.charCodeAt(this.pos)?(n="undefined"!=typeof BigInt?BigInt(this.input.slice(t,this.pos)):null,++this.pos):Qh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(su.num,n)},yc.readNumber=function(e){var t=this.pos;e||null!==this.readInt(10)||this.raise(t,"Invalid number");var n=this.pos-t>=2&&48===this.input.charCodeAt(t);n&&this.strict&&this.raise(t,"Invalid number"),n&&/[89]/.test(this.input.slice(t,this.pos))&&(n=!1);var i=this.input.charCodeAt(this.pos);if(!n&&!e&&this.options.ecmaVersion>=11&&110===i){var r=this.input.slice(t,this.pos),s="undefined"!=typeof BigInt?BigInt(r):null;return++this.pos,Qh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number"),this.finishToken(su.num,s)}46!==i||n||(++this.pos,this.readInt(10),i=this.input.charCodeAt(this.pos)),69!==i&&101!==i||n||(43!==(i=this.input.charCodeAt(++this.pos))&&45!==i||++this.pos,null===this.readInt(10)&&this.raise(t,"Invalid number")),Qh(this.fullCharCodeAtPos())&&this.raise(this.pos,"Identifier directly after number");var o=this.input.slice(t,this.pos),a=n?parseInt(o,8):parseFloat(o);return this.finishToken(su.num,a)},yc.readCodePoint=function(){var e;if(123===this.input.charCodeAt(this.pos)){this.options.ecmaVersion<6&&this.unexpected();var t=++this.pos;e=this.readHexChar(this.input.indexOf("}",this.pos)-this.pos),++this.pos,e>1114111&&this.invalidStringToken(t,"Code point out of bounds")}else e=this.readHexChar(4);return e},yc.readString=function(e){for(var t="",n=++this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated string constant");var i=this.input.charCodeAt(this.pos);if(i===e)break;92===i?(t+=this.input.slice(n,this.pos),t+=this.readEscapedChar(!1),n=this.pos):(hu(i,this.options.ecmaVersion>=10)&&this.raise(this.start,"Unterminated string constant"),++this.pos)}return t+=this.input.slice(n,this.pos++),this.finishToken(su.string,t)};var xc={};yc.tryReadTemplateToken=function(){this.inTemplateElement=!0;try{this.readTmplToken()}catch(e){if(e!==xc)throw e;this.readInvalidTemplateToken()}this.inTemplateElement=!1},yc.invalidStringToken=function(e,t){if(this.inTemplateElement&&this.options.ecmaVersion>=9)throw xc;this.raise(e,t)},yc.readTmplToken=function(){for(var e="",t=this.pos;;){this.pos>=this.input.length&&this.raise(this.start,"Unterminated template");var n=this.input.charCodeAt(this.pos);if(96===n||36===n&&123===this.input.charCodeAt(this.pos+1))return this.pos!==this.start||this.type!==su.template&&this.type!==su.invalidTemplate?(e+=this.input.slice(t,this.pos),this.finishToken(su.template,e)):36===n?(this.pos+=2,this.finishToken(su.dollarBraceL)):(++this.pos,this.finishToken(su.backQuote));if(92===n)e+=this.input.slice(t,this.pos),e+=this.readEscapedChar(!0),t=this.pos;else if(hu(n)){switch(e+=this.input.slice(t,this.pos),++this.pos,n){case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:e+="\n";break;default:e+=String.fromCharCode(n)}this.options.locations&&(++this.curLine,this.lineStart=this.pos),t=this.pos}else++this.pos}},yc.readInvalidTemplateToken=function(){for(;this.pos<this.input.length;this.pos++)switch(this.input[this.pos]){case"\\":++this.pos;break;case"$":if("{"!==this.input[this.pos+1])break;case"`":return this.finishToken(su.invalidTemplate,this.input.slice(this.start,this.pos))}this.raise(this.start,"Unterminated template")},yc.readEscapedChar=function(e){var t=this.input.charCodeAt(++this.pos);switch(++this.pos,t){case 110:return"\n";case 114:return"\r";case 120:return String.fromCharCode(this.readHexChar(2));case 117:return vc(this.readCodePoint());case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===this.input.charCodeAt(this.pos)&&++this.pos;case 10:return this.options.locations&&(this.lineStart=this.pos,++this.curLine),"";default:if(t>=48&&t<=55){var n=this.input.substr(this.pos-1,3).match(/^[0-7]+/)[0],i=parseInt(n,8);return i>255&&(n=n.slice(0,-1),i=parseInt(n,8)),this.pos+=n.length-1,t=this.input.charCodeAt(this.pos),"0"===n&&56!==t&&57!==t||!this.strict&&!e||this.invalidStringToken(this.pos-1-n.length,e?"Octal literal in template string":"Octal literal in strict mode"),String.fromCharCode(i)}return hu(t)?"":String.fromCharCode(t)}},yc.readHexChar=function(e){var t=this.pos,n=this.readInt(16,e);return null===n&&this.invalidStringToken(t,"Bad character escape sequence"),n},yc.readWord1=function(){this.containsEsc=!1;for(var e="",t=!0,n=this.pos,i=this.options.ecmaVersion>=6;this.pos<this.input.length;){var r=this.fullCharCodeAtPos();if(Jh(r,i))this.pos+=r<=65535?1:2;else{if(92!==r)break;this.containsEsc=!0,e+=this.input.slice(n,this.pos);var s=this.pos;117!==this.input.charCodeAt(++this.pos)&&this.invalidStringToken(this.pos,"Expecting Unicode escape sequence \\uXXXX"),++this.pos;var o=this.readCodePoint();(t?Qh:Jh)(o,i)||this.invalidStringToken(s,"Invalid Unicode escape"),e+=vc(o),n=this.pos}t=!1}return e+this.input.slice(n,this.pos)},yc.readWord=function(){var e=this.readWord1(),t=su.name;return this.keywords.test(e)&&(this.containsEsc&&this.raiseRecoverable(this.start,"Escape sequence in keyword "+e),t=iu[e]),this.finishToken(t,e)};wu.acorn={Parser:wu,version:"7.1.0",defaultOptions:Eu,Position:yu,SourceLocation:vu,getLineInfo:xu,Node:Uu,TokenType:Zh,tokTypes:su,keywordTypes:iu,TokContext:qu,tokContexts:Ku,isIdentifierChar:Jh,isIdentifierStart:Qh,Token:gc,isNewLine:hu,lineBreak:ou,lineBreakG:au,nonASCIIwhitespace:uu};const Ec=function(e){return e&&e.default||e}(Object.freeze({__proto__:null,Node:Uu,Parser:wu,Position:yu,SourceLocation:vu,TokContext:qu,Token:gc,TokenType:Zh,defaultOptions:Eu,getLineInfo:xu,isIdentifierChar:Jh,isIdentifierStart:Qh,isNewLine:hu,keywordTypes:iu,lineBreak:ou,lineBreakG:au,nonASCIIwhitespace:uu,parse:function(e,t){return wu.parse(e,t)},parseExpressionAt:function(e,t,n){return wu.parseExpressionAt(e,t,n)},tokContexts:Ku,tokTypes:su,tokenizer:function(e,t){return wu.tokenizer(e,t)},version:"7.1.0"})).tokTypes,_c=/(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g,bc=e=>{_c.lastIndex=e.pos;let t=_c.exec(e.input),n=e.pos+t[0].length;return"."===e.input.slice(n,n+1)};var Sc=function(e){return class extends e{parseExprAtom(e){if(this.type!==Ec._import||!bc(this))return super.parseExprAtom(e);this.options.allowImportExportEverywhere||this.inModule||this.raise(this.start,"'import' and 'export' may appear only with 'sourceType: module'");let t=this.startNode();return t.meta=this.parseIdent(!0),this.expect(Ec.dot),t.property=this.parseIdent(!0),"meta"!==t.property.name&&this.raiseRecoverable(t.property.start,"The only valid meta property for import is import.meta"),this.containsEsc&&this.raiseRecoverable(t.property.start,'"meta" in import.meta must not contain escape sequences'),this.finishNode(t,"MetaProperty")}parseStatement(e,t,n){if(this.type!==Ec._import||!bc(this))return super.parseStatement(e,t,n);let i=this.startNode(),r=this.parseExpression();return this.parseExpressionStatement(i,r)}}};class Ac extends et{constructor(){super("undefined")}getLiteralValueAtPath(){}}class Cc extends bt{constructor(){super(),this.variables.set("undefined",new Ac)}findVariable(e){let t=this.variables.get(e);return t||(t=new ao(e),this.variables.set(e,t)),t}}const Ic=()=>({paths:Object.create(null),tracked:!1,unknownPath:null});class wc{constructor(){this.entityPaths=new Map}track(e,t){let n=this.entityPaths.get(e);n||(n=Ic(),this.entityPaths.set(e,n));let i,r=0;for(;r<t.length;){const e=t[r];"string"==typeof e?(i=n.paths[e])||(i=Ic(),n.paths[e]=i):(i=n.unknownPath)||(i=Ic(),n.unknownPath=i),n=i,r++}const s=n.tracked;return n.tracked=!0,s}}var Pc;function kc(e,t){if(e in t)return Lo(function(e){return{code:Vo.FILE_NAME_CONFLICT,message:`Could not emit file "${e}" as it conflicts with an already emitted file.`}}(e));t[e]=Nc}!function(e){e[e.LOAD_AND_PARSE=0]="LOAD_AND_PARSE",e[e.ANALYSE=1]="ANALYSE",e[e.GENERATE=2]="GENERATE"}(Pc||(Pc={}));const Nc={type:"placeholder"};function $c(e,t,n){if("string"!=typeof e&&!Buffer.isBuffer(e)){const e=t.fileName||t.name||n;return Lo(Wo(`Could not set source for ${"string"==typeof e?`asset "${e}"`:"unnamed asset"}, asset source needs to be a string of Buffer.`))}return e}function Rc(e,t){return"string"!=typeof e.fileName?Lo((n=e.name||t,{code:Vo.ASSET_NOT_FINALISED,message:`Plugin error - Unable to get file name for asset "${n}". Ensure that the source is set and that generate is called first.`})):e.fileName;var n}function Tc(e){const t=e.fileName||e.module&&e.module.facadeChunk.id;return t||Lo((n=e.fileName||e.name,{code:Vo.CHUNK_NOT_GENERATED,message:`Plugin error - Unable to get file name for chunk "${n}". Ensure that generate is called first.`}));var n}class Oc{constructor(e){this.filesByReferenceId=new Map,this.buildFilesByReferenceId=this.filesByReferenceId,this.output=null,this.emitFile=e=>(function(e){return e&&("asset"===e.type||"chunk"===e.type)})(e)?function(e){const t=e.fileName||e.name;return!t||"string"==typeof t&&Mo(t)}(e)?"chunk"===e.type?this.emitChunk(e):this.emitAsset(e):Lo(Wo(`The "fileName" or "name" properties of emitted files must be strings that are neither absolute nor relative paths and do not contain invalid characters, received "${e.fileName||e.name}".`)):Lo(Wo(`Emitted files must be of type "asset" or "chunk", received "${e&&e.type}".`)),this.getFileName=e=>{const t=this.filesByReferenceId.get(e);return t?"chunk"===t.type?Tc(t):Rc(t,e):Lo(function(e){return{code:Vo.FILE_NOT_FOUND,message:`Plugin error - Unable to get file name for unknown file "${e}".`}}(e))},this.setAssetSource=(e,t)=>{const n=this.filesByReferenceId.get(e);if(!n)return Lo(function(e){return{code:Vo.ASSET_NOT_FOUND,message:`Plugin error - Unable to set the source for unknown asset "${e}".`}}(e));if("asset"!==n.type)return Lo(Wo(`Asset sources can only be set for emitted assets but "${e}" is an emitted chunk.`));if(void 0!==n.source)return Lo(function(e){return{code:Vo.ASSET_SOURCE_ALREADY_SET,message:`Unable to set the source for asset "${e}", source already set.`}}(n.name||e));const i=$c(t,n,e);this.output?this.finalizeAsset(n,i,e,this.output):n.source=i},this.graph=e}startOutput(e,t){this.filesByReferenceId=new Map(this.buildFilesByReferenceId),this.output={assetFileNames:t,bundle:e};for(const e of this.filesByReferenceId.values())e.fileName&&kc(e.fileName,this.output.bundle);for(const[e,t]of this.filesByReferenceId.entries())"asset"===t.type&&void 0!==t.source&&this.finalizeAsset(t,t.source,e,this.output)}assertAssetsFinalized(){for(const[t,n]of this.filesByReferenceId.entries())"asset"===n.type&&"string"!=typeof n.fileName&&Lo((e=n.name||t,{code:Vo.ASSET_SOURCE_MISSING,message:`Plugin error creating asset "${e}" - no asset source set.`}));var e}emitAsset(e){const t=void 0!==e.source?$c(e.source,e,null):void 0,n={fileName:e.fileName,name:e.name,source:t,type:"asset"},i=this.assignReferenceId(n,e.fileName||e.name||e.type);return this.output&&(e.fileName&&kc(e.fileName,this.output.bundle),void 0!==t&&this.finalizeAsset(n,t,i,this.output)),i}emitChunk(e){if(this.graph.phase>Pc.LOAD_AND_PARSE&&Lo({code:Vo.INVALID_ROLLUP_PHASE,message:"Cannot emit chunks after module loading has finished."}),"string"!=typeof e.id)return Lo(Wo(`Emitted chunks need to have a valid string id, received "${e.id}"`));const t={fileName:e.fileName,module:null,name:e.name||e.id,type:"chunk"};return this.graph.moduleLoader.addEntryModules([{fileName:e.fileName||null,id:e.id,name:e.name||null}],!1).then(({newEntryModules:[e]})=>{t.module=e}).catch(()=>{}),this.assignReferenceId(t,e.id)}assignReferenceId(e,t){let n;do{const e=N();n?e.update(n):e.update(t),n=e.digest("hex").substr(0,8)}while(this.filesByReferenceId.has(n));return this.filesByReferenceId.set(n,e),n}finalizeAsset(e,t,n,i){const r=e.fileName||this.findExistingAssetFileNameWithSource(i.bundle,t)||function(e,t,n){const i=e||"asset";return Mh(Oh(n.assetFileNames,"output.assetFileNames",{hash(){const e=N();return e.update(i),e.update(":"),e.update(t),e.digest("hex").substr(0,8)},ext:()=>mt(i).substr(1),extname:()=>mt(i),name:()=>i.substr(0,i.length-mt(i).length)}),n.bundle)}(e.name,t,i),s=Object.assign(Object.assign({},e),{source:t,fileName:r});this.filesByReferenceId.set(n,s);const o=this.graph;i.bundle[r]={fileName:r,get isAsset(){return o.warnDeprecation('Accessing "isAsset" on files in the bundle is deprecated, please use "type === \'asset\'" instead',!1),!0},source:t,type:"asset"}}findExistingAssetFileNameWithSource(e,t){for(const n of Object.keys(e)){const i=e[n];if("asset"===i.type&&(Buffer.isBuffer(t)&&Buffer.isBuffer(i.source)?t.equals(i.source):t===i.source))return n}return null}}const Mc="at position ",Lc=[{active:!0,deprecated:"ongenerate",replacement:"generateBundle"},{active:!0,deprecated:"onwrite",replacement:"generateBundle/writeBundle"},{active:!0,deprecated:"transformBundle",replacement:"renderChunk"},{active:!0,deprecated:"transformChunk",replacement:"renderChunk"},{active:!1,deprecated:"resolveAssetUrl",replacement:"resolveFileUrl"}];function Dc(e,t,{hook:n,id:i}={}){return"string"==typeof e&&(e={message:e}),e.code&&e.code!==Vo.PLUGIN_ERROR&&(e.pluginCode=e.code),e.code=Vo.PLUGIN_ERROR,e.plugin=t,n&&(e.hook=n),i&&(e.id=i),Lo(e)}function Vc(e,t,i,r){function s(t,n,i,r,s){let o=!1;return(...a)=>(o||(o=!0,e.warnDeprecation({message:`The "this.${n}" plugin context function used by plugin ${r} is deprecated. The "this.${i}" plugin context function should be used instead.`,plugin:r},s)),t(...a))}!function(e,t){for(const{active:n,deprecated:i,replacement:r}of Lc)for(const s of e)i in s&&t.warnDeprecation({message:`The "${i}" hook used by plugin ${s.name} is deprecated. The "${r}" hook should be used instead.`,plugin:s.name},n)}(t.plugins,e);const o=[...t.plugins,(a=t.preserveSymlinks,{name:"Rollup Core",resolveId:Pa(a),load:e=>Aa(e),resolveFileUrl:({relativePath:e,format:t})=>Oa[t](e),resolveImportMeta(e,{chunkId:t,format:n}){const i=Ra[n]&&Ra[n](e,t);if(i)return i}})];var a;const h=new Oc(e),u=new Set,c=o.map((t,o)=>{let a,c=!0;if("string"!=typeof t.cacheKey&&(t.name.startsWith(Mc)||u.has(t.name)?c=!1:u.add(t.name)),i)if(c){const e=t.cacheKey||t.name;a=function(e){return{has(t){const n=e[t];return!!n&&(n[0]=0,!0)},get(t){const n=e[t];if(n)return n[0]=0,n[1]},set(t,n){e[t]=[0,n]},delete:t=>delete e[t]}}(i[e]||(i[e]=Object.create(null)))}else a=Wc(t.name);else a=Bc;const l={addWatchFile(t){e.phase>=Pc.GENERATE&&this.error({code:Vo.INVALID_ROLLUP_PHASE,message:"Cannot call addWatchFile after the build has finished."}),e.watchFiles[t]=!0},cache:a,emitAsset:s((e,t)=>h.emitFile({type:"asset",name:e,source:t}),"emitAsset","emitFile",t.name,!1),emitChunk:s((e,t)=>h.emitFile({type:"chunk",id:e,name:t&&t.name}),"emitChunk","emitFile",t.name,!1),emitFile:h.emitFile,error:e=>Dc(e,t.name),getAssetFileName:s(h.getFileName,"getAssetFileName","getFileName",t.name,!1),getChunkFileName:s(h.getFileName,"getChunkFileName","getFileName",t.name,!1),getFileName:h.getFileName,getModuleInfo(t){const n=e.moduleById.get(t);if(null==n)throw new Error(`Unable to find module ${t}`);return{hasModuleSideEffects:n.moduleSideEffects,id:n.id,importedIds:n instanceof vt?[]:n.sources.map(e=>n.resolvedIds[e].id),isEntry:n instanceof Eh&&n.isEntryPoint,isExternal:n instanceof vt}},isExternal:s((t,n,i=!1)=>e.moduleLoader.isExternal(t,n,i),"isExternal","resolve",t.name,!1),meta:{rollupVersion:n},get moduleIds(){return e.moduleById.keys()},parse:e.contextParse,resolve:(t,n,i)=>e.moduleLoader.resolveId(t,n,i&&i.skipSelf?o:null),resolveId:s((t,n)=>e.moduleLoader.resolveId(t,n).then(e=>e&&e.id),"resolveId","resolve",t.name,!1),setAssetSource:h.setAssetSource,warn(n){"string"==typeof n&&(n={message:n}),n.code&&(n.pluginCode=n.code),n.code="PLUGIN_WARNING",n.plugin=t.name,e.warn(n)},watcher:r?(()=>{let e=!1;function t(t,n){return e||(l.warn({code:"PLUGIN_WATCHER_DEPRECATED",message:"this.watcher usage is deprecated in plugins. Use the watchChange plugin hook and this.addWatchFile() instead."}),e=!0),r.on(t,n)}return Object.assign(Object.assign({},r),{addListener:t,on:t})})():void 0};return l});function l(e,t,n,i=!1,r){const s=o[n];let a=c[n];const h=s[e];if(h){if(r&&(!(a=r(a,s))||a===c[n]))throw new Error("Internal Rollup error: hookContext must return a new context object.");try{if("function"!=typeof h){if(i)return h;Lo({code:"INVALID_PLUGIN_HOOK",message:`Error running plugin hook ${e} for ${s.name}, expected a function hook.`})}return h.apply(a,t)}catch(t){return Dc(t,s.name,{hook:e})}}}function p(e,t,n,i=!1,r){const s=o[n];let a=c[n];const h=s[e];if(h){if(r&&(!(a=r(a,s))||a===c[n]))throw new Error("Internal Rollup error: hookContext must return a new context object.");return Promise.resolve().then(()=>{if("function"!=typeof h){if(i)return h;Lo({code:"INVALID_PLUGIN_HOOK",message:`Error running plugin hook ${e} for ${s.name}, expected a function hook.`})}return h.apply(a,t)}).catch(t=>Dc(t,s.name,{hook:e}))}}return{emitFile:h.emitFile,finaliseAssets(){h.assertAssetsFinalized()},getFileName:h.getFileName,hookSeq(e,t,n){let i=Promise.resolve();for(let r=0;r<o.length;r++)i=i.then(()=>p(e,t,r,!1,n));return i},hookSeqSync(e,t,n){for(let i=0;i<o.length;i++)l(e,t,i,!1,n)},hookFirst(e,t,n,i){let r=Promise.resolve();for(let s=0;s<o.length;s++)i!==s&&(r=r.then(i=>null!=i?i:p(e,t,s,!1,n)));return r},hookFirstSync(e,t,n){for(let i=0;i<o.length;i++){const r=l(e,t,i,!1,n);if(null!=r)return r}return null},hookParallel(e,t,n){const i=[];for(let r=0;r<o.length;r++){const s=p(e,t,r,!1,n);s&&i.push(s)}return Promise.all(i).then(()=>{})},hookReduceArg0(e,[t,...n],i,r){let s=Promise.resolve(t);for(let t=0;t<o.length;t++)s=s.then(s=>{const a=p(e,[s,...n],t,!1,r);return a?a.then(e=>i.call(c[t],s,e,o[t])):s});return s},hookReduceArg0Sync(e,[t,...n],i,r){for(let s=0;s<o.length;s++){const a=l(e,[t,...n],s,!1,r);t=i.call(c[s],t,a,o[s])}return t},hookReduceValue(e,t,n,i,r){let s=Promise.resolve(t);for(let t=0;t<o.length;t++)s=s.then(s=>{const a=p(e,n,t,!0,r);return a?a.then(e=>i.call(c[t],s,e,o[t])):s});return s},hookReduceValueSync(e,t,n,i,r){let s=t;for(let t=0;t<o.length;t++){const a=l(e,n,t,!0,r);s=i.call(c[t],s,a,o[t])}return s},startOutput(e,t){h.startOutput(e,t)}}}const Bc={has:()=>!1,get(){},set(){},delete:()=>!1};function zc(e){e.startsWith(Mc)?Lo({code:"ANONYMOUS_PLUGIN_CACHE",message:"A plugin is trying to use the Rollup cache but is not declaring a plugin name or cacheKey."}):Lo({code:"DUPLICATE_PLUGIN_NAME",message:`The plugin name ${e} is being used twice in the same build. Plugin names must be distinct or provide a cacheKey (please post an issue to the plugin if you are a plugin user).`})}const Wc=e=>({has:()=>(zc(e),!1),get(){zc(e)},set(){zc(e)},delete:()=>(zc(e),!1)});function jc(e,t,n){const i=n.id,r=[];let s=null===t.map?null:Th(t.map);const o=t.code;let a=t.ast;const h=[],u=[];let c,l,p=!1,d=null;const f=t.code;let m;return e.pluginDriver.hookReduceArg0("transform",[f,i],(function(t,s,o){if(!p&&c.used&&(p=!0),p){if(s&&"object"==typeof s&&Array.isArray(s.dependencies))for(const t of s.dependencies)e.watchFiles[yt(ft(i),t)]=!0}else if(u.length&&(n.transformFiles=u),s&&"object"==typeof s&&Array.isArray(s.dependencies)){l.warnedTransformDependencies||e.warnDeprecation(`Returning "dependencies" from the "transform" hook as done by plugin ${o.name} is deprecated. The "this.addWatchFile" plugin context function should be used instead.`,!0),l.warnedTransformDependencies=!0;for(const e of s.dependencies)h.push(yt(ft(i),e))}if("string"==typeof s)s={ast:void 0,code:s,map:void 0};else{if(!s||"object"!=typeof s)return t;"string"==typeof s.map&&(s.map=JSON.parse(s.map)),"boolean"==typeof s.moduleSideEffects&&(d=s.moduleSideEffects)}if(null!==s.map){const e=Th(s.map);r.push(e||{missing:!0,plugin:o.name})}return a=s.ast,s.code}),(t,n)=>((l=n).cacheKey?p=!0:c=function(e){const t={used:!1,cache:void 0};return t.cache={has:n=>(t.used=!0,e.has(n)),get:n=>(t.used=!0,e.get(n)),set:(n,i)=>(t.used=!0,e.set(n,i)),delete:n=>(t.used=!0,e.delete(n))},t}(t.cache),Object.assign(Object.assign({},t),{cache:c?c.cache:t.cache,warn(e,n){"string"==typeof e&&(e={message:e}),n&&Do(e,n,f,i),e.id=i,e.hook="transform",t.warn(e)},error:(e,n)=>("string"==typeof e&&(e={message:e}),n&&Do(e,n,f,i),e.id=i,e.hook="transform",t.error(e)),emitAsset(t,n){const i={type:"asset",name:t,source:n};return u.push(Object.assign({},i)),e.pluginDriver.emitFile(i)},emitChunk(t,n){const i={type:"chunk",id:t,name:n&&n.name};return u.push(Object.assign({},i)),e.pluginDriver.emitFile(i)},emitFile:t=>(u.push(t),e.pluginDriver.emitFile(t)),addWatchFile(e){h.push(e),t.addWatchFile(e)},setAssetSource(e,n){if(t.setAssetSource(e,n),!p&&!m)try{this.error({code:"INVALID_SETASSETSOURCE",message:"setAssetSource cannot be called in transform for caching reasons. Use emitFile with a source, or call setAssetSource in another hook."})}catch(e){m=e}},getCombinedSourcemap(){const t=function(e,t,n,i,r){if(!r.length)return i;const s=Ah(t,n,i,r,Sh(e)).traceMappings();return Object.assign({version:3},s)}(e,i,o,s,r);if(!t){return new H(o).generateMap({includeContent:!0,hires:!0,source:i})}return s!==t&&(s=t,r.length=0),new D(Object.assign(Object.assign({},t),{file:null,sourcesContent:t.sourcesContent}))}}))).catch(e=>Dc(e,l.name,{hook:"transform",id:i})).then(e=>{if(!p&&m)throw m;return{ast:a,code:e,customTransformCache:p,moduleSideEffects:d,originalCode:o,originalSourcemap:s,sourcemapChain:r,transformDependencies:h}})}function Fc(e,t){return lt(t)?yt(e,"..",t):t}function Uc(e){if(!0===e)return()=>!0;if("function"==typeof e)return(t,...n)=>!t.startsWith("\0")&&e(t,...n)||!1;if(e){const t=new Set(Array.isArray(e)?e:e?[e]:[]);return e=>t.has(e)}return()=>!1}function Gc(e,t,n){if("boolean"==typeof e)return()=>e;if("no-external"===e)return(e,t)=>!t;if("function"==typeof e)return(t,n)=>!!t.startsWith("\0")||!1!==e(t,n);if(Array.isArray(e)){const t=new Set(e);return e=>t.has(e)}var i,r;e&&n.warn((i="treeshake.moduleSideEffects",r='please use one of false, "no-external", a function or an array',{code:Vo.INVALID_OPTION,message:`Invalid value for option "${i}" - ${r}.`}));const s=Uc(t);return(e,t)=>!(t&&s(e))}class Hc{constructor(e,t,n,i,r,s,o){this.indexedEntryModules=[],this.latestLoadModulesPromise=Promise.resolve(),this.manualChunkModules={},this.nextEntryModuleIndex=0,this.loadEntryModule=(e,t)=>this.pluginDriver.hookFirst("resolveId",[e,void 0]).then(n=>{if(!1===n||n&&"object"==typeof n&&n.external)return Lo(function(e){return{code:Vo.UNRESOLVED_ENTRY,message:`Entry module cannot be external (${Oo(e)}).`}}(e));const i=n&&"object"==typeof n?n.id:n;return"string"==typeof i?this.fetchModule(i,void 0,!0,t):Lo(function(e){return{code:Vo.UNRESOLVED_ENTRY,message:`Could not resolve entry module (${Oo(e)}).`}}(e))}),this.graph=e,this.modulesById=t,this.pluginDriver=n,this.isExternal=Uc(i),this.hasModuleSideEffects=Gc(s,o,e),this.getManualChunk="function"==typeof r?r:()=>null}addEntryModules(e,t){const n=this.nextEntryModuleIndex;this.nextEntryModuleIndex+=e.length;const i=Promise.all(e.map(({fileName:e,id:n,name:i})=>this.loadEntryModule(n,!0).then(n=>(null!==e?n.chunkFileNames.add(e):null!==i&&(null===n.chunkName&&(n.chunkName=i),t&&n.userChunkNames.add(i)),n)))).then(e=>{let i=n;for(const n of e){n.isUserDefinedEntryPoint=n.isUserDefinedEntryPoint||t;const e=this.indexedEntryModules.find(e=>e.module.id===n.id);e?e.index=Math.min(e.index,i):this.indexedEntryModules.push({module:n,index:i}),i++}return this.indexedEntryModules.sort(({index:e},{index:t})=>e>t?1:-1),e});return this.awaitLoadModulesPromise(i).then(e=>({entryModules:this.indexedEntryModules.map(({module:e})=>e),manualChunkModulesByAlias:this.manualChunkModules,newEntryModules:e}))}addManualChunks(e){const t=[];for(const n of Object.keys(e)){const i=e[n];for(const e of i)t.push({id:e,alias:n})}const n=Promise.all(t.map(({id:e})=>this.loadEntryModule(e,!1))).then(e=>{for(let n=0;n<e.length;n++)this.addModuleToManualChunk(t[n].alias,e[n])});return this.awaitLoadModulesPromise(n)}resolveId(e,n,i){return t(this,void 0,void 0,(function*(){return this.normalizeResolveIdResult(!this.isExternal(e,n,!1)&&(yield this.pluginDriver.hookFirst("resolveId",[e,n],null,i)),n,e)}))}addModuleToManualChunk(e,t){var n,i,r;null!==t.manualChunkAlias&&t.manualChunkAlias!==e&&Lo((n=t.id,i=e,r=t.manualChunkAlias,{code:Vo.INVALID_CHUNK,message:`Cannot assign ${Oo(n)} to the "${i}" chunk as it is already in the "${r}" chunk.`})),t.manualChunkAlias=e,this.manualChunkModules[e]||(this.manualChunkModules[e]=[]),this.manualChunkModules[e].push(t)}awaitLoadModulesPromise(e){this.latestLoadModulesPromise=Promise.all([e,this.latestLoadModulesPromise]);const t=()=>{const e=this.latestLoadModulesPromise;return e.then(()=>{if(this.latestLoadModulesPromise!==e)return t()})};return t().then(()=>e)}fetchAllDependencies(e){const t=Promise.all(e.getDynamicImportExpressions().map((t,n)=>this.resolveDynamicImport(e,t,e.id).then(t=>{if(null===t)return;const i=e.dynamicImports[n];if("string"!=typeof t)return this.fetchResolvedDependency(Oo(t.id),e.id,t).then(e=>{i.resolution=e});i.resolution=t})));return t.catch(()=>{}),Promise.all(e.sources.map(t=>this.resolveAndFetchDependency(e,t))).then(()=>t)}fetchModule(e,t,n,i){const r=this.modulesById.get(e);if(r){if(r instanceof vt)throw new Error(`Cannot fetch external module ${e}`);return r.isEntryPoint=r.isEntryPoint||i,Promise.resolve(r)}const s=new Eh(this.graph,e,n,i);this.modulesById.set(e,s),this.graph.watchFiles[e]=!0;const o=this.getManualChunk(e);return"string"==typeof o&&this.addModuleToManualChunk(o,s),ph("load modules",3),Promise.resolve(this.pluginDriver.hookFirst("load",[e])).catch(n=>{dh("load modules",3);let i=`Could not load ${e}`;throw t&&(i+=` (imported by ${t})`),i+=`: ${n.message}`,n.message=i,n}).then(t=>(dh("load modules",3),"string"==typeof t?{code:t}:t&&"object"==typeof t&&"string"==typeof t.code?t:Lo(function(e){return{code:Vo.BAD_LOADER,message:`Error loading ${Oo(e)}: plugin load hook should return a string, a { code, map } object, or nothing/null`}}(e)))).then(t=>{const n=this.graph.cachedModules.get(e);if(n&&!n.customTransformCache&&n.originalCode===t.code){if(n.transformFiles)for(const e of n.transformFiles)this.pluginDriver.emitFile(e);return n}return"boolean"==typeof t.moduleSideEffects&&(s.moduleSideEffects=t.moduleSideEffects),jc(this.graph,t,s)}).then(t=>(s.setSource(t),this.modulesById.set(e,s),this.fetchAllDependencies(s).then(()=>{for(const e in s.exports)"default"!==e&&(s.exportsAll[e]=s.id);return s.exportAllSources.forEach(e=>{const t=s.resolvedIds[e].id,n=this.modulesById.get(t);if(!(n instanceof vt))for(const e in n.exportsAll)e in s.exportsAll?this.graph.warn(zo(e,s,n)):s.exportsAll[e]=n.exportsAll[e]}),s})))}fetchResolvedDependency(e,t,n){if(n.external){this.modulesById.has(n.id)||this.modulesById.set(n.id,new vt(this.graph,n.id,n.moduleSideEffects));const i=this.modulesById.get(n.id);return i instanceof vt?Promise.resolve(i):Lo(function(e,t){return{code:Vo.INVALID_EXTERNAL_ID,message:`'${e}' is imported as an external by ${Oo(t)}, but is already an existing non-external module id.`}}(e,t))}return this.fetchModule(n.id,t,n.moduleSideEffects,!1)}handleMissingImports(e,t,n){return null===e?(lt(t)&&Lo(function(e,t){return{code:Vo.UNRESOLVED_IMPORT,message:`Could not resolve '${e}' from ${Oo(t)}`}}(t,n)),this.graph.warn(function(e,t){return{code:Vo.UNRESOLVED_IMPORT,importer:Oo(t),message:`'${e}' is imported by ${Oo(t)}, but could not be resolved – treating it as an external dependency`,source:e,url:"https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency"}}(t,n)),{external:!0,id:t,moduleSideEffects:this.hasModuleSideEffects(t,!0)}):e}normalizeResolveIdResult(e,t,n){let i="",r=!1,s=null;if(e)"object"==typeof e?(i=e.id,e.external&&(r=!0),"boolean"==typeof e.moduleSideEffects&&(s=e.moduleSideEffects)):(this.isExternal(e,t,!0)&&(r=!0),i=r?Fc(t,e):e);else{if(i=Fc(t,n),!1!==e&&!this.isExternal(i,t,!0))return null;r=!0}return{external:r,id:i,moduleSideEffects:"boolean"==typeof s?s:this.hasModuleSideEffects(i,r)}}resolveAndFetchDependency(e,n){return t(this,void 0,void 0,(function*(){return this.fetchResolvedDependency(n,e.id,e.resolvedIds[n]=e.resolvedIds[n]||this.handleMissingImports(yield this.resolveId(n,e.id),n,e.id))}))}resolveDynamicImport(e,n,i){return t(this,void 0,void 0,(function*(){const t=yield this.pluginDriver.hookFirst("resolveDynamicImport",[n,i]);return"string"!=typeof n?"string"==typeof t?t:t?Object.assign({external:!1,moduleSideEffects:!0},t):null:null==t?e.resolvedIds[n]=e.resolvedIds[n]||this.handleMissingImports(yield this.resolveId(n,e.id),n,e.id):this.handleMissingImports(this.normalizeResolveIdResult(t,i,n),n,i)}))}}const qc=97,Kc=48;function Yc(e){return e<10?String.fromCharCode(Kc+e):String.fromCharCode(qc+(e-10))}function Xc(e){let t="";for(let n=0;n<e.length;n++){const i=e[n];t+=Yc(i>>4),t+=Yc(15&i)}return t}function Qc(e){const t=new Uint8Array(e);for(let e=0;e<t.length;e++)t[e]=512*Math.random();return t}function Jc(e){return"string"==typeof e?[{fileName:null,name:null,id:e}]:Array.isArray(e)?e.map(e=>({fileName:null,name:null,id:e})):Object.keys(e).map(t=>({fileName:null,id:e[t],name:t}))}class Zc{constructor(e,t){if(this.moduleById=new Map,this.needsTreeshakingPass=!1,this.phase=Pc.LOAD_AND_PARSE,this.watchFiles=Object.create(null),this.externalModules=[],this.modules=[],this.onwarn=e.onwarn||function(){const e=Object.create(null);return t=>{const n=t.toString();n in e||(console.error(n),e[n]=!0)}}(),this.deoptimizationTracker=new wc,this.cachedModules=new Map,e.cache&&e.cache.modules)for(const t of e.cache.modules)this.cachedModules.set(t.id,t);if(!1!==e.cache){this.pluginCache=e.cache&&e.cache.plugins||Object.create(null);for(const e in this.pluginCache){const t=this.pluginCache[e];for(const e of Object.keys(t))t[e][0]++}}if(this.preserveModules=e.preserveModules,this.strictDeprecations=e.strictDeprecations,this.cacheExpiry=e.experimentalCacheExpiry,!1!==e.treeshake&&(this.treeshakingOptions=e.treeshake?{annotations:!1!==e.treeshake.annotations,moduleSideEffects:e.treeshake.moduleSideEffects,propertyReadSideEffects:!1!==e.treeshake.propertyReadSideEffects,pureExternalModules:e.treeshake.pureExternalModules,tryCatchDeoptimization:!1!==e.treeshake.tryCatchDeoptimization,unknownGlobalSideEffects:!1!==e.treeshake.unknownGlobalSideEffects}:{annotations:!0,moduleSideEffects:!0,propertyReadSideEffects:!0,tryCatchDeoptimization:!0,unknownGlobalSideEffects:!0},void 0!==this.treeshakingOptions.pureExternalModules&&this.warnDeprecation('The "treeshake.pureExternalModules" option is deprecated. The "treeshake.moduleSideEffects" option should be used instead. "treeshake.pureExternalModules: true" is equivalent to "treeshake.moduleSideEffects: \'no-external\'"',!1)),this.contextParse=(e,t={})=>this.acornParser.parse(e,Object.assign(Object.assign(Object.assign({},yh),t),this.acornOptions)),this.pluginDriver=Vc(this,e,this.pluginCache,t),t){const e=e=>this.pluginDriver.hookSeqSync("watchChange",[e]);t.on("change",e),t.once("restart",()=>{t.removeListener("change",e)})}this.shimMissingExports=e.shimMissingExports,this.scope=new Cc,this.context=String(e.context);const n=e.moduleContext;if("function"==typeof n)this.getModuleContext=e=>n(e)||this.context;else if("object"==typeof n){const e=new Map;for(const t in n)e.set(yt(t),n[t]);this.getModuleContext=t=>e.get(t)||this.context}else this.getModuleContext=()=>this.context;this.acornOptions=e.acorn?Object.assign({},e.acorn):{};const i=[];i.push(Sc),e.experimentalTopLevelAwait&&(this.acornOptions.allowAwaitOutsideFunction=!0);const r=e.acornInjectPlugins;i.push(...Array.isArray(r)?r:r?[r]:[]),this.acornParser=wu.extend(...i),this.moduleLoader=new Hc(this,this.moduleById,this.pluginDriver,e.external,"function"==typeof e.manualChunks&&e.manualChunks,this.treeshakingOptions?this.treeshakingOptions.moduleSideEffects:null,!!this.treeshakingOptions&&this.treeshakingOptions.pureExternalModules)}build(e,t,n){return ph("parse modules",2),Promise.all([this.moduleLoader.addEntryModules(Jc(e),!0),t&&"object"==typeof t&&this.moduleLoader.addManualChunks(t)]).then(([{entryModules:e,manualChunkModulesByAlias:t}])=>{if(0===e.length)throw new Error("You must supply options.input to rollup");for(const e of this.moduleById.values())e instanceof Eh?this.modules.push(e):this.externalModules.push(e);if(dh("parse modules",2),this.phase=Pc.ANALYSE,ph("analyse dependency graph",2),this.link(e),dh("analyse dependency graph",2),ph("mark included statements",2),n&&e.length>1)throw new Error("Internal Error: can only inline dynamic imports for single-file builds.");for(const t of e)t.includeAllExports();this.includeMarked(this.modules);for(const e of this.externalModules)e.warnUnusedImports();dh("mark included statements",2),ph("generate chunks",2),this.preserveModules||n||function(e,t){let n,i,r;const s=new Set,o=[],a=e=>{n.manualChunkAlias?(e.manualChunkAlias=n.manualChunkAlias,e.entryPointsHash=i):function(e,t){for(let n=0;n<e.length;n++)e[n]=e[n]^t[n]}(e.entryPointsHash,i);for(const t of e.dependencies)t instanceof vt||r.has(t.id)||(r.add(t.id),s.has(t.id)||t.manualChunkAlias||a(t));for(const{resolution:t}of e.dynamicImports)t instanceof Eh&&t.dynamicallyImportedBy.length>0&&!t.manualChunkAlias&&o.push(t)};if(t)for(const e of Object.keys(t))for(n of(i=Qc(10),t[e]))r=new Set(n.id),a(n);for(n of e)s.add(n.id),i=Qc(10),r=new Set(n.id),n.manualChunkAlias||a(n);for(n of o)s.has(n.id)||(s.add(n.id),i=Qc(10),r=new Set(n.id),a(n))}(e,t);let i=[];if(this.preserveModules)for(const e of this.modules){const t=new Bh(this,[e]);!e.isEntryPoint&&t.isEmpty||(t.entryModules=[e]),i.push(t)}else{const e={};for(const t of this.modules){const n=Xc(t.entryPointsHash),i=e[n];i?i.push(t):e[n]=[t]}for(const t in e){const n=e[t];Nh(n);const r=new Bh(this,n);i.push(r)}}for(const e of i)e.link();i=i.filter(Vh);const r=[];for(const e of i)r.push(...e.generateFacades());return dh("generate chunks",2),this.phase=Pc.GENERATE,i.concat(r)})}getCache(){for(const e in this.pluginCache){const t=this.pluginCache[e];let n=!0;for(const e of Object.keys(t))t[e][0]>=this.cacheExpiry?delete t[e]:n=!1;n&&delete this.pluginCache[e]}return{modules:this.modules.map(e=>e.toJSON()),plugins:this.pluginCache}}includeMarked(e){if(this.treeshakingOptions){let t=1;do{ph(`treeshaking pass ${t}`,3),this.needsTreeshakingPass=!1;for(const t of e)t.isExecuted&&t.include();dh(`treeshaking pass ${t++}`,3)}while(this.needsTreeshakingPass)}else for(const t of e)t.includeAllInBundle()}warn(e){e.toString=()=>{let t="";return e.plugin&&(t+=`(${e.plugin} plugin) `),e.loc&&(t+=`${Oo(e.loc.file)} (${e.loc.line}:${e.loc.column}) `),t+=e.message},this.onwarn(e)}warnDeprecation(e,t){if(t||this.strictDeprecations){const t=Bo(e);if(this.strictDeprecations)return Lo(t);this.warn(t)}}link(e){for(const e of this.modules)e.linkDependencies();const{orderedModules:t,cyclePaths:n}=function(e){let t=0;const n=[],i={},r=[],s=[],o={},a=e=>{if(!i[e.id]){if(e instanceof vt)return e.execIndex=t++,void(i[e.id]=!0);for(const t of e.dependencies)t.id in o?i[t.id]||n.push($h(t.id,e.id,o)):(o[t.id]=e.id,a(t));for(const{resolution:t}of e.dynamicImports)t instanceof Eh&&-1===s.indexOf(t)&&s.push(t);e.execIndex=t++,i[e.id]=!0,r.push(e)}};for(const t of e)o[t.id]||(o[t.id]=null,a(t));for(const e of s)o[e.id]||(o[e.id]=null,a(e));return{orderedModules:r,cyclePaths:n}}(e);for(const e of n)this.warn({code:"CIRCULAR_DEPENDENCY",importer:e[0],message:`Circular dependency: ${e.join(" -> ")}`});this.modules=t;for(const e of this.modules)e.bindReferences();this.warnForMissingExports()}warnForMissingExports(){for(const e of this.modules)for(const t of Object.keys(e.importDescriptions)){const n=e.importDescriptions[t];"*"===n.name||n.module.getVariableForExportName(n.name)||e.warn({code:"NON_EXISTENT_EXPORT",message:`Non-existent export '${n.name}' is imported from ${Oo(n.module.id)}`,name:n.name,source:n.module.id},n.start)}}}function el(e){switch(typeof e){case"function":return e();case"string":return e;default:return""}}const tl=(e,t)=>t?`${e}\n${t}`:e,nl=(e,t)=>t?`${e}\n\n${t}`:e;function il(e,t){Lo({code:"INVALID_EXPORT_OPTION",message:`'${e}' was specified for output.exports, but entry module has following exports: ${t.join(", ")}`})}function rl(e,{exports:t,name:n,format:i}){const r=e.getExportNames();return"default"===t?1===r.length&&"default"===r[0]||il("default",r):"none"===t&&r.length&&il("none",r),t&&"auto"!==t||(0===r.length?t="none":1===r.length&&"default"===r[0]?t="default":(null!==e.facadeModule&&e.facadeModule.isEntryPoint&&"es"!==i&&-1!==r.indexOf("default")&&e.graph.warn({code:"MIXED_EXPORTS",message:`Using named and default exports together. Consumers of your bundle will have to use ${n||"bundle"}['default'] to access the default export, which may not be what you want. Use \`output.exports: 'named'\` to disable this warning`,url:"https://rollupjs.org/guide/en/#output-exports"}),t="named")),/(?:default|named|none)/.test(t)||Lo({code:"INVALID_EXPORT_OPTION",message:"output.exports must be 'default', 'named', 'none', 'auto', or left unspecified (defaults to 'auto')",url:"https://rollupjs.org/guide/en/#output-exports"}),t}const sl=(e,t)=>(n,i)=>void 0!==t[n]?t[n]:void 0!==e[n]?e[n]:i,ol=e=>e&&"object"!=typeof e?{}:e,al=(e,t,n)=>{const i=ol(t[n]),r=ol(e[n]);return void 0!==i?i&&r?Object.assign(Object.assign({},r),i):i:r},hl=e=>{"string"==typeof e?console.warn(e):console.warn(e.message)},ul=(e,t=hl)=>e.onwarn?n=>e.onwarn(n,t):t,cl=(e,t)=>{const n=e.external;return"function"==typeof n?(e,...i)=>n(e,...i)||-1!==t.external.indexOf(e):("string"==typeof e.external?[n]:Array.isArray(n)?n:[]).concat(t.external)},ll={c:"config",d:"dir",e:"external",f:"format",g:"globals",h:"help",i:"input",m:"sourcemap",n:"name",o:"file",v:"version",w:"watch"};function pl({config:e={},command:t={},defaultOnWarnHandler:n}){const i=function(e){const t=e.external&&"string"==typeof e.external?e.external.split(","):[];return Object.assign(Object.assign({},e),{external:t,globals:"string"==typeof e.globals?e.globals.split(",").reduce((e,n)=>{const[i,r]=n.split(":");return e[i]=r,-1===t.indexOf(i)&&t.push(i),e},Object.create(null)):void 0})}(t),r=function(e,t={external:[],globals:void 0},n){const i=sl(e,t),r={acorn:e.acorn,acornInjectPlugins:e.acornInjectPlugins,cache:i("cache"),chunkGroupingSize:i("chunkGroupingSize",5e3),context:i("context"),experimentalCacheExpiry:i("experimentalCacheExpiry",10),experimentalOptimizeChunks:i("experimentalOptimizeChunks"),experimentalTopLevelAwait:i("experimentalTopLevelAwait"),external:cl(e,t),inlineDynamicImports:i("inlineDynamicImports",!1),input:i("input",[]),manualChunks:i("manualChunks"),moduleContext:e.moduleContext,onwarn:ul(e,n),perf:i("perf",!1),plugins:e.plugins,preserveModules:i("preserveModules"),preserveSymlinks:i("preserveSymlinks"),shimMissingExports:i("shimMissingExports"),strictDeprecations:i("strictDeprecations",!1),treeshake:al(e,t,"treeshake"),watch:e.watch};r.cache&&r.cache.cache&&(r.cache=r.cache.cache);return r}(e,i,n);i.output&&Object.assign(i,i.output);const s=e.output,o=Array.isArray(s)?s:s?[s]:[];0===o.length&&o.push({});const a=o.map(e=>(function(e,t={}){const n=sl(e,t);let i=n("format");switch(i){case"esm":case"module":i="es";break;case"commonjs":i="cjs"}return{amd:Object.assign(Object.assign({},e.amd),t.amd),assetFileNames:n("assetFileNames"),banner:n("banner"),chunkFileNames:n("chunkFileNames"),compact:n("compact",!1),dir:n("dir"),dynamicImportFunction:n("dynamicImportFunction"),entryFileNames:n("entryFileNames"),esModule:n("esModule",!0),exports:n("exports"),extend:n("extend"),externalLiveBindings:n("externalLiveBindings",!0),file:n("file"),footer:n("footer"),format:"esm"===i?"es":i,freeze:n("freeze",!0),globals:n("globals"),indent:n("indent",!0),interop:n("interop",!0),intro:n("intro"),name:n("name"),namespaceToStringTag:n("namespaceToStringTag",!1),noConflict:n("noConflict"),outro:n("outro"),paths:n("paths"),preferConst:n("preferConst"),sourcemap:n("sourcemap"),sourcemapExcludeSources:n("sourcemapExcludeSources"),sourcemapFile:n("sourcemapFile"),sourcemapPathTransform:n("sourcemapPathTransform"),strict:n("strict",!0)}})(e,i)),h=[],u=Object.keys(r);dl(h,Object.keys(e),u,"input option",/^output$/);const c=Object.keys(a[0]);dl(h,a.reduce((e,t)=>e.concat(Object.keys(t)),[]),c,"output option");const l=c.filter(e=>"sourcemapPathTransform"!==e);return dl(h,Object.keys(i),u.concat(l,Object.keys(ll),"config","environment","silent"),"CLI flag",/^_|output|(config.*)$/),{inputOptions:r,optionError:h.length>0?h.join("\n"):null,outputOptions:a}}function dl(e,t,n,i,r=/$./){const s=t.filter(e=>-1===n.indexOf(e)&&!r.test(e));s.length>0&&e.push(`Unknown ${i}: ${s.join(", ")}. Allowed options: ${n.sort().join(", ")}`)}const fl={get(){throw new Error("bundle.generate(...) now returns a Promise instead of a { code, map } object")}};function ml(e,t){return t.options&&t.options.call({meta:{rollupVersion:n}},e)||e}function gl(e){return Array.isArray(e)?e.filter(Boolean):e?[e]:[]}let yl;var vl;function xl(e){return"asset"===e.type?vl.ASSET:e.isEntry?vl.ENTRY_CHUNK:vl.SECONDARY_CHUNK}function El(e){return{output:Object.keys(e).map(t=>e[t]).filter(e=>Object.keys(e).length>0).sort((e,t)=>{const n=xl(e),i=xl(t);return n===i?0:n<i?-1:1})}}!function(e){e[e.ENTRY_CHUNK=0]="ENTRY_CHUNK",e[e.SECONDARY_CHUNK=1]="SECONDARY_CHUNK",e[e.ASSET=2]="ASSET"}(vl||(vl={})),e.VERSION=n,e.rollup=function(e){return t(this,void 0,void 0,(function*(){const n=function(e){if(!e)throw new Error("You must supply an options object to rollup");let{inputOptions:t,optionError:n}=pl({config:e});n&&t.onwarn({message:n,code:"UNKNOWN_OPTION"}),(t=gl(t.plugins).reduce(ml,t)).plugins=gl(t.plugins);for(let e=0;e<t.plugins.length;e++){const n=t.plugins[e];n.name||(n.name=`${Mc}${e+1}`)}return t.inlineDynamicImports?(t.preserveModules&&Lo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "inlineDynamicImports" option.'}),t.manualChunks&&Lo({code:"INVALID_OPTION",message:'"manualChunks" option is not supported for "inlineDynamicImports".'}),t.experimentalOptimizeChunks&&Lo({code:"INVALID_OPTION",message:'"experimentalOptimizeChunks" option is not supported for "inlineDynamicImports".'}),(t.input instanceof Array&&t.input.length>1||"object"==typeof t.input&&Object.keys(t.input).length>1)&&Lo({code:"INVALID_OPTION",message:'Multiple inputs are not supported for "inlineDynamicImports".'})):t.preserveModules&&(t.manualChunks&&Lo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "manualChunks" option.'}),t.experimentalOptimizeChunks&&Lo({code:"INVALID_OPTION",message:'"preserveModules" does not support the "experimentalOptimizeChunks" option.'})),t}(e);gh(n);const i=new Zc(n,yl);yl=void 0;const r=!1!==e.cache;let s;delete n.cache,delete e.cache,ph("BUILD",1);try{yield i.pluginDriver.hookParallel("buildStart",[n]),s=yield i.build(n.input,n.manualChunks,n.inlineDynamicImports)}catch(e){throw yield i.pluginDriver.hookParallel("buildEnd",[e]),e}yield i.pluginDriver.hookParallel("buildEnd",[]),dh("BUILD",1);let o=!1;function a(e){return function(e,t,n,i){if(!t)throw new Error("You must supply an options object");const r=pl({config:{output:Object.assign(Object.assign(Object.assign({},t),t.output),e.output)}});if(r.optionError)throw new Error(r.optionError);const s=r.outputOptions[0],o=i.hookReduceArg0Sync("outputOptions",[s],(e,t)=>t||e,e=>{const t=()=>e.error({code:Vo.CANNOT_EMIT_FROM_OPTIONS_HOOK,message:'Cannot emit files or set asset sources in the "outputOptions" hook, use the "renderStart" hook instead.'});return Object.assign(Object.assign({},e),{emitFile:t,setAssetSource:t})});a=o,"es6"===a.format&&Lo(Bo({message:'The "es6" output format is deprecated – use "esm" instead',url:"https://rollupjs.org/guide/en/#output-format"})),void(["amd","cjs","system","es","iife","umd"].indexOf(a.format)<0&&Lo({message:'You must specify "output.format", which can be one of "amd", "cjs", "system", "esm", "iife" or "umd".',url:"https://rollupjs.org/guide/en/#output-format"})),"string"==typeof o.file&&("string"==typeof o.dir&&Lo({code:"INVALID_OPTION",message:'You must set either "output.file" for a single-file build or "output.dir" when generating multiple chunks.'}),e.preserveModules&&Lo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when using the "preserveModules" option.'}),"object"!=typeof e.input||Array.isArray(e.input)||Lo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when providing named inputs.'}));var a;n&&("umd"!==o.format&&"iife"!==o.format||Lo({code:"INVALID_OPTION",message:"UMD and IIFE output formats are not supported for code-splitting builds."}),"string"==typeof o.file&&Lo({code:"INVALID_OPTION",message:'You must set "output.dir" instead of "output.file" when generating multiple chunks.'}));return o}(n,e,s.length>1,i.pluginDriver)}function h(e,r){return t(this,void 0,void 0,(function*(){ph("GENERATE",1);const t=e.assetFileNames||"assets/[name]-[hash][extname]",a=Object.create(null);let h;const u=function(e){if(0===e.length)return"/";if(1===e.length)return ft(e[0]);const t=e.slice(1).reduce((e,t)=>{const n=t.split(/\/+|\\+/);let i;for(i=0;e[i]===n[i]&&i<Math.min(e.length,n.length);i++);return e.slice(0,i)},e[0].split(/\/+|\\+/));return t.length>1?t.join("/"):"/"}(function(e){const t=[];for(const n of e)for(const e of n.entryModules)ct(e.id)&&t.push(e.id);return t}(s));i.pluginDriver.startOutput(a,t);try{yield i.pluginDriver.hookParallel("renderStart",[]);const t=yield function(e,t){const n=e.pluginDriver;return Promise.all([n.hookReduceValue("banner",el(t.banner),[],tl),n.hookReduceValue("footer",el(t.footer),[],tl),n.hookReduceValue("intro",el(t.intro),[],nl),n.hookReduceValue("outro",el(t.outro),[],nl)]).then(([e,t,n,i])=>(n&&(n+="\n\n"),i&&(i=`\n\n${i}`),e.length&&(e+="\n"),t.length&&(t="\n"+t),{intro:n,outro:i,banner:e,footer:t})).catch(e=>{Lo({code:"ADDON_ERROR",message:`Could not retrieve ${e.hook}. Check configuration of plugin ${e.plugin}.\n\tError Message: ${e.message}`})})}(i,e);for(const t of s)n.preserveModules||t.generateInternalExports(e),t.facadeModule&&t.facadeModule.isEntryPoint&&(t.exportMode=rl(t,e));for(const t of s)t.preRender(e,u);!o&&n.experimentalOptimizeChunks&&(!function(e,t,n,i){for(let r=0;r<e.length;r++){const s=e[r],o=[];if(s.visitStaticDependenciesUntilCondition(e=>{e instanceof Bh&&o.push(e)}),o.length<2)continue;let a=1,h=!0,u=void 0,c=o[0],l=o[1];const p=e=>null===e.facadeModule&&null===e.manualChunkAlias&&(!(!l||null!==l.facadeModule)&&!(e.getRenderedSourceLength()>n));do{if(h){p(c)&&(h=!1);continue}let s=n-u.getRenderedSourceLength()-c.getRenderedSourceLength();if(s<=0){p(c)||(h=!0);continue}const d=new Set;c.visitStaticDependenciesUntilCondition(e=>d.add(e));const f=new Set([c,u]);if(u.visitStaticDependenciesUntilCondition(e=>e!==c&&e!==u&&(!d.has(e)&&(e instanceof vt||((s-=e.getRenderedSourceLength())<=0||void f.add(e)))))){p(c)||(h=!0);continue}if(c.visitStaticDependenciesUntilCondition(e=>!f.has(e)&&(e instanceof vt||((s-=e.getRenderedSourceLength())<=0||void 0)))){p(c)||(h=!0);continue}const m=e.indexOf(c);m<=r&&r--,e.splice(m,1),u.merge(c,e,t,i),o.splice(--a,1),c=u,l&&!p(l)&&(h=!0)}while(u=c,c=l,l=o[++a],c)}}(s,e,n.chunkGroupingSize,u),o=!0),function(e,t,n,i,r,s){const o=[],a=[];for(const t of e)(t.facadeModule&&t.facadeModule.isUserDefinedEntryPoint?o:a).push(t);const h=o.concat(a);for(const e of h)n.file?e.id=dt(n.file):t.preserveModules?e.id=e.generateIdPreserveModules(i,n,s):e.id=e.generateId(r,n,s,!0),s[e.id]=Nc}(s,n,e,u,t,a),h=function(e,t){for(let n=0;n<e.length;n++){const i=e[n],r=i.facadeModule;t[i.id]={code:void 0,dynamicImports:i.getDynamicImportIds(),exports:i.getExportNames(),facadeModuleId:r&&r.id,fileName:i.id,imports:i.getImportIds(),isDynamicEntry:null!==r&&r.dynamicallyImportedBy.length>0,isEntry:null!==r&&r.isEntryPoint,map:void 0,modules:i.renderedModules,get name(){return i.getChunkName()},type:"chunk"}}return t}(s,a),yield Promise.all(s.map(n=>{const r=a[n.id];return n.render(e,t,r).then(t=>(r.code=t.code,r.map=t.map,i.pluginDriver.hookParallel("ongenerate",[Object.assign({bundle:r},e),r])))}))}catch(e){throw yield i.pluginDriver.hookParallel("renderError",[e]),e}yield i.pluginDriver.hookSeq("generateBundle",[e,h,r]);for(const e of Object.keys(h)){const t=h[e];t.type||(i.warnDeprecation('A plugin is directly adding properties to the bundle object in the "generateBundle" hook. This is deprecated and will be removed in a future Rollup version, please use "this.emitFile" instead.',!1),t.type="asset")}return i.pluginDriver.finaliseAssets(),dh("GENERATE",1),h}))}const u={cache:r?i.getCache():void 0,generate:e=>{const t=h(a(e),!1).then(e=>El(e));return Object.defineProperty(t,"code",fl),Object.defineProperty(t,"map",fl),t},watchFiles:Object.keys(i.watchFiles),write:e=>{const r=a(e);return r.dir||r.file||Lo({code:"MISSING_OPTION",message:'You must specify "output.file" or "output.dir" for the build.'}),h(r,!0).then(e=>t(this,void 0,void 0,(function*(){let t=0;for(const n of Object.keys(e)){if("asset"!==e[n].type&&++t>1)break}return t>1&&(r.sourcemapFile&&Lo({code:"INVALID_OPTION",message:'"output.sourcemapFile" is only supported for single-file builds.'}),"string"==typeof r.file&&Lo({code:"INVALID_OPTION",message:'When building multiple chunks, the "output.dir" option must be used, not "output.file".'+("string"!=typeof n.input||!0===n.inlineDynamicImports?"":' To inline dynamic imports, set the "inlineDynamicImports" option.')})),yield Promise.all(Object.keys(e).map(t=>(function(e,t,n,i){const r=yt(i.dir||ft(i.file),n.fileName);let s,o;if("asset"===n.type)o=n.source;else if(o=n.code,i.sourcemap&&n.map){let e;"inline"===i.sourcemap?e=n.map.toUrl():(e=`${dt(n.fileName)}.map`,s=Ia(`${r}.map`,n.map.toString())),"hidden"!==i.sourcemap&&(o+=`//# ${eh}=${e}\n`)}return Ia(r,o).then(()=>s).then(()=>"chunk"===n.type&&e.pluginDriver.hookSeq("onwrite",[Object.assign({bundle:t},i),n])).then(()=>{})})(i,u,e[t],r))),yield i.pluginDriver.hookParallel("writeBundle",[e]),El(e)})))}};return!0===n.perf&&(u.getTimings=lh),u}))},Object.defineProperty(e,"__esModule",{value:!0})}));
