"use strict";(()=>{var Je=Object.create;var qr=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ze=Object.prototype.hasOwnProperty;var rt=(r,o)=>()=>(o||r((o={exports:{}}).exports,o),o.exports);var et=(r,o,t,e)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of Qe(o))!Ze.call(r,n)&&n!==t&&qr(r,n,{get:()=>o[n],enumerable:!(e=$e(o,n))||e.enumerable});return r};var tt=(r,o,t)=>(t=r!=null?Je(Xe(r)):{},et(o||!r||!r.__esModule?qr(t,"default",{value:r,enumerable:!0}):t,r));var me=rt((Tt,er)=>{/*! *****************************************************************************
Copyright (c) Microsoft Corporation.

Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */var Hr,Kr,Jr,$r,Qr,Xr,Zr,re,ee,Z,Ar,te,oe,ne,k,ie,fe,ae,ue,ce,se,pe,le,rr;(function(r){var o=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(e){r(t(o,t(e)))}):typeof er=="object"&&typeof er.exports=="object"?r(t(o,t(er.exports))):r(t(o));function t(e,n){return e!==o&&(typeof Object.create=="function"?Object.defineProperty(e,"__esModule",{value:!0}):e.__esModule=!0),function(i,f){return e[i]=n?n(i,f):f}}})(function(r){var o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])};Hr=function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");o(e,n);function i(){this.constructor=e}e.prototype=n===null?Object.create(n):(i.prototype=n.prototype,new i)},Kr=Object.assign||function(e){for(var n,i=1,f=arguments.length;i<f;i++){n=arguments[i];for(var u in n)Object.prototype.hasOwnProperty.call(n,u)&&(e[u]=n[u])}return e},Jr=function(e,n){var i={};for(var f in e)Object.prototype.hasOwnProperty.call(e,f)&&n.indexOf(f)<0&&(i[f]=e[f]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var u=0,f=Object.getOwnPropertySymbols(e);u<f.length;u++)n.indexOf(f[u])<0&&Object.prototype.propertyIsEnumerable.call(e,f[u])&&(i[f[u]]=e[f[u]]);return i},$r=function(e,n,i,f){var u=arguments.length,a=u<3?n:f===null?f=Object.getOwnPropertyDescriptor(n,i):f,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")a=Reflect.decorate(e,n,i,f);else for(var s=e.length-1;s>=0;s--)(c=e[s])&&(a=(u<3?c(a):u>3?c(n,i,a):c(n,i))||a);return u>3&&a&&Object.defineProperty(n,i,a),a},Qr=function(e,n){return function(i,f){n(i,f,e)}},Xr=function(e,n){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(e,n)},Zr=function(e,n,i,f){function u(a){return a instanceof i?a:new i(function(c){c(a)})}return new(i||(i=Promise))(function(a,c){function s(y){try{p(f.next(y))}catch(g){c(g)}}function d(y){try{p(f.throw(y))}catch(g){c(g)}}function p(y){y.done?a(y.value):u(y.value).then(s,d)}p((f=f.apply(e,n||[])).next())})},re=function(e,n){var i={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},f,u,a,c;return c={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(c[Symbol.iterator]=function(){return this}),c;function s(p){return function(y){return d([p,y])}}function d(p){if(f)throw new TypeError("Generator is already executing.");for(;i;)try{if(f=1,u&&(a=p[0]&2?u.return:p[0]?u.throw||((a=u.return)&&a.call(u),0):u.next)&&!(a=a.call(u,p[1])).done)return a;switch(u=0,a&&(p=[p[0]&2,a.value]),p[0]){case 0:case 1:a=p;break;case 4:return i.label++,{value:p[1],done:!1};case 5:i.label++,u=p[1],p=[0];continue;case 7:p=i.ops.pop(),i.trys.pop();continue;default:if(a=i.trys,!(a=a.length>0&&a[a.length-1])&&(p[0]===6||p[0]===2)){i=0;continue}if(p[0]===3&&(!a||p[1]>a[0]&&p[1]<a[3])){i.label=p[1];break}if(p[0]===6&&i.label<a[1]){i.label=a[1],a=p;break}if(a&&i.label<a[2]){i.label=a[2],i.ops.push(p);break}a[2]&&i.ops.pop(),i.trys.pop();continue}p=n.call(e,i)}catch(y){p=[6,y],u=0}finally{f=a=0}if(p[0]&5)throw p[1];return{value:p[0]?p[1]:void 0,done:!0}}},ee=function(e,n){for(var i in e)i!=="default"&&!Object.prototype.hasOwnProperty.call(n,i)&&rr(n,e,i)},rr=Object.create?function(e,n,i,f){f===void 0&&(f=i),Object.defineProperty(e,f,{enumerable:!0,get:function(){return n[i]}})}:function(e,n,i,f){f===void 0&&(f=i),e[f]=n[i]},Z=function(e){var n=typeof Symbol=="function"&&Symbol.iterator,i=n&&e[n],f=0;if(i)return i.call(e);if(e&&typeof e.length=="number")return{next:function(){return e&&f>=e.length&&(e=void 0),{value:e&&e[f++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},Ar=function(e,n){var i=typeof Symbol=="function"&&e[Symbol.iterator];if(!i)return e;var f=i.call(e),u,a=[],c;try{for(;(n===void 0||n-- >0)&&!(u=f.next()).done;)a.push(u.value)}catch(s){c={error:s}}finally{try{u&&!u.done&&(i=f.return)&&i.call(f)}finally{if(c)throw c.error}}return a},te=function(){for(var e=[],n=0;n<arguments.length;n++)e=e.concat(Ar(arguments[n]));return e},oe=function(){for(var e=0,n=0,i=arguments.length;n<i;n++)e+=arguments[n].length;for(var f=Array(e),u=0,n=0;n<i;n++)for(var a=arguments[n],c=0,s=a.length;c<s;c++,u++)f[u]=a[c];return f},ne=function(e,n,i){if(i||arguments.length===2)for(var f=0,u=n.length,a;f<u;f++)(a||!(f in n))&&(a||(a=Array.prototype.slice.call(n,0,f)),a[f]=n[f]);return e.concat(a||Array.prototype.slice.call(n))},k=function(e){return this instanceof k?(this.v=e,this):new k(e)},ie=function(e,n,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var f=i.apply(e,n||[]),u,a=[];return u={},c("next"),c("throw"),c("return"),u[Symbol.asyncIterator]=function(){return this},u;function c(m){f[m]&&(u[m]=function(P){return new Promise(function(j,R){a.push([m,P,j,R])>1||s(m,P)})})}function s(m,P){try{d(f[m](P))}catch(j){g(a[0][3],j)}}function d(m){m.value instanceof k?Promise.resolve(m.value.v).then(p,y):g(a[0][2],m)}function p(m){s("next",m)}function y(m){s("throw",m)}function g(m,P){m(P),a.shift(),a.length&&s(a[0][0],a[0][1])}},fe=function(e){var n,i;return n={},f("next"),f("throw",function(u){throw u}),f("return"),n[Symbol.iterator]=function(){return this},n;function f(u,a){n[u]=e[u]?function(c){return(i=!i)?{value:k(e[u](c)),done:u==="return"}:a?a(c):c}:a}},ae=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=e[Symbol.asyncIterator],i;return n?n.call(e):(e=typeof Z=="function"?Z(e):e[Symbol.iterator](),i={},f("next"),f("throw"),f("return"),i[Symbol.asyncIterator]=function(){return this},i);function f(a){i[a]=e[a]&&function(c){return new Promise(function(s,d){c=e[a](c),u(s,d,c.done,c.value)})}}function u(a,c,s,d){Promise.resolve(d).then(function(p){a({value:p,done:s})},c)}},ue=function(e,n){return Object.defineProperty?Object.defineProperty(e,"raw",{value:n}):e.raw=n,e};var t=Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:!0,value:n})}:function(e,n){e.default=n};ce=function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var i in e)i!=="default"&&Object.prototype.hasOwnProperty.call(e,i)&&rr(n,e,i);return t(n,e),n},se=function(e){return e&&e.__esModule?e:{default:e}},pe=function(e,n,i,f){if(i==="a"&&!f)throw new TypeError("Private accessor was defined without a getter");if(typeof n=="function"?e!==n||!f:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?f:i==="a"?f.call(e):f?f.value:n.get(e)},le=function(e,n,i,f,u){if(f==="m")throw new TypeError("Private method is not writable");if(f==="a"&&!u)throw new TypeError("Private accessor was defined without a setter");if(typeof n=="function"?e!==n||!u:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return f==="a"?u.call(e,i):u?u.value=i:n.set(e,i),i},r("__extends",Hr),r("__assign",Kr),r("__rest",Jr),r("__decorate",$r),r("__param",Qr),r("__metadata",Xr),r("__awaiter",Zr),r("__generator",re),r("__exportStar",ee),r("__createBinding",rr),r("__values",Z),r("__read",Ar),r("__spread",te),r("__spreadArrays",oe),r("__spreadArray",ne),r("__await",k),r("__asyncGenerator",ie),r("__asyncDelegator",fe),r("__asyncValues",ae),r("__makeTemplateObject",ue),r("__importStar",ce),r("__importDefault",se),r("__classPrivateFieldGet",pe),r("__classPrivateFieldSet",le)})});var de=tt(me(),1),{__extends:_,__assign:Pt,__rest:jt,__decorate:Ft,__param:Mt,__metadata:Ct,__awaiter:he,__generator:tr,__exportStar:Lt,__createBinding:Rt,__values:M,__read:w,__spread:kt,__spreadArrays:Ut,__spreadArray:S,__await:or,__asyncGenerator:ve,__asyncDelegator:Wt,__asyncValues:be,__makeTemplateObject:Dt,__importStar:Vt,__importDefault:Bt,__classPrivateFieldGet:Gt,__classPrivateFieldSet:Nt}=de.default;function l(r){return typeof r=="function"}function nr(r){var o=function(e){Error.call(e),e.stack=new Error().stack},t=r(o);return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var ir=nr(function(r){return function(t){r(this),this.message=t?t.length+` errors occurred during unsubscription:
`+t.map(function(e,n){return n+1+") "+e.toString()}).join(`
  `):"",this.name="UnsubscriptionError",this.errors=t}});function C(r,o){if(r){var t=r.indexOf(o);0<=t&&r.splice(t,1)}}var F=function(){function r(o){this.initialTeardown=o,this.closed=!1,this._parentage=null,this._finalizers=null}return r.prototype.unsubscribe=function(){var o,t,e,n,i;if(!this.closed){this.closed=!0;var f=this._parentage;if(f)if(this._parentage=null,Array.isArray(f))try{for(var u=M(f),a=u.next();!a.done;a=u.next()){var c=a.value;c.remove(this)}}catch(m){o={error:m}}finally{try{a&&!a.done&&(t=u.return)&&t.call(u)}finally{if(o)throw o.error}}else f.remove(this);var s=this.initialTeardown;if(l(s))try{s()}catch(m){i=m instanceof ir?m.errors:[m]}var d=this._finalizers;if(d){this._finalizers=null;try{for(var p=M(d),y=p.next();!y.done;y=p.next()){var g=y.value;try{ye(g)}catch(m){i=i!=null?i:[],m instanceof ir?i=S(S([],w(i)),w(m.errors)):i.push(m)}}}catch(m){e={error:m}}finally{try{y&&!y.done&&(n=p.return)&&n.call(p)}finally{if(e)throw e.error}}}if(i)throw new ir(i)}},r.prototype.add=function(o){var t;if(o&&o!==this)if(this.closed)ye(o);else{if(o instanceof r){if(o.closed||o._hasParent(this))return;o._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(o)}},r.prototype._hasParent=function(o){var t=this._parentage;return t===o||Array.isArray(t)&&t.includes(o)},r.prototype._addParent=function(o){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(o),t):t?[t,o]:o},r.prototype._removeParent=function(o){var t=this._parentage;t===o?this._parentage=null:Array.isArray(t)&&C(t,o)},r.prototype.remove=function(o){var t=this._finalizers;t&&C(t,o),o instanceof r&&o._removeParent(this)},r.EMPTY=function(){var o=new r;return o.closed=!0,o}(),r}();var Ir=F.EMPTY;function fr(r){return r instanceof F||r&&"closed"in r&&l(r.remove)&&l(r.add)&&l(r.unsubscribe)}function ye(r){l(r)?r():r.unsubscribe()}var O={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var U={setTimeout:function(r,o){for(var t=[],e=2;e<arguments.length;e++)t[e-2]=arguments[e];var n=U.delegate;return n!=null&&n.setTimeout?n.setTimeout.apply(n,S([r,o],w(t))):setTimeout.apply(void 0,S([r,o],w(t)))},clearTimeout:function(r){var o=U.delegate;return((o==null?void 0:o.clearTimeout)||clearTimeout)(r)},delegate:void 0};function ar(r){U.setTimeout(function(){var o=O.onUnhandledError;if(o)o(r);else throw r})}function A(){}var xe=function(){return Tr("C",void 0,void 0)}();function _e(r){return Tr("E",void 0,r)}function we(r){return Tr("N",r,void 0)}function Tr(r,o,t){return{kind:r,value:o,error:t}}var L=null;function W(r){if(O.useDeprecatedSynchronousErrorHandling){var o=!L;if(o&&(L={errorThrown:!1,error:null}),r(),o){var t=L,e=t.errorThrown,n=t.error;if(L=null,e)throw n}}else r()}function Se(r){O.useDeprecatedSynchronousErrorHandling&&L&&(L.errorThrown=!0,L.error=r)}var K=function(r){_(o,r);function o(t){var e=r.call(this)||this;return e.isStopped=!1,t?(e.destination=t,fr(t)&&t.add(e)):e.destination=ft,e}return o.create=function(t,e,n){return new cr(t,e,n)},o.prototype.next=function(t){this.isStopped?jr(we(t),this):this._next(t)},o.prototype.error=function(t){this.isStopped?jr(_e(t),this):(this.isStopped=!0,this._error(t))},o.prototype.complete=function(){this.isStopped?jr(xe,this):(this.isStopped=!0,this._complete())},o.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,r.prototype.unsubscribe.call(this),this.destination=null)},o.prototype._next=function(t){this.destination.next(t)},o.prototype._error=function(t){try{this.destination.error(t)}finally{this.unsubscribe()}},o.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},o}(F);var ot=Function.prototype.bind;function Pr(r,o){return ot.call(r,o)}var nt=function(){function r(o){this.partialObserver=o}return r.prototype.next=function(o){var t=this.partialObserver;if(t.next)try{t.next(o)}catch(e){ur(e)}},r.prototype.error=function(o){var t=this.partialObserver;if(t.error)try{t.error(o)}catch(e){ur(e)}else ur(o)},r.prototype.complete=function(){var o=this.partialObserver;if(o.complete)try{o.complete()}catch(t){ur(t)}},r}(),cr=function(r){_(o,r);function o(t,e,n){var i=r.call(this)||this,f;if(l(t)||!t)f={next:t!=null?t:void 0,error:e!=null?e:void 0,complete:n!=null?n:void 0};else{var u;i&&O.useDeprecatedNextContext?(u=Object.create(t),u.unsubscribe=function(){return i.unsubscribe()},f={next:t.next&&Pr(t.next,u),error:t.error&&Pr(t.error,u),complete:t.complete&&Pr(t.complete,u)}):f=t}return i.destination=new nt(f),i}return o}(K);function ur(r){O.useDeprecatedSynchronousErrorHandling?Se(r):ar(r)}function it(r){throw r}function jr(r,o){var t=O.onStoppedNotification;t&&U.setTimeout(function(){return t(r,o)})}var ft={closed:!0,next:A,error:it,complete:A};var D=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}();function I(r){return r}function ge(r){return r.length===0?I:r.length===1?r[0]:function(t){return r.reduce(function(e,n){return n(e)},t)}}var b=function(){function r(o){o&&(this._subscribe=o)}return r.prototype.lift=function(o){var t=new r;return t.source=this,t.operator=o,t},r.prototype.subscribe=function(o,t,e){var n=this,i=ut(o)?o:new cr(o,t,e);return W(function(){var f=n,u=f.operator,a=f.source;i.add(u?u.call(i,a):a?n._subscribe(i):n._trySubscribe(i))}),i},r.prototype._trySubscribe=function(o){try{return this._subscribe(o)}catch(t){o.error(t)}},r.prototype.forEach=function(o,t){var e=this;return t=Ee(t),new t(function(n,i){var f=new cr({next:function(u){try{o(u)}catch(a){i(a),f.unsubscribe()}},error:i,complete:n});e.subscribe(f)})},r.prototype._subscribe=function(o){var t;return(t=this.source)===null||t===void 0?void 0:t.subscribe(o)},r.prototype[D]=function(){return this},r.prototype.pipe=function(){for(var o=[],t=0;t<arguments.length;t++)o[t]=arguments[t];return ge(o)(this)},r.prototype.toPromise=function(o){var t=this;return o=Ee(o),new o(function(e,n){var i;t.subscribe(function(f){return i=f},function(f){return n(f)},function(){return e(i)})})},r.create=function(o){return new r(o)},r}();function Ee(r){var o;return(o=r!=null?r:O.Promise)!==null&&o!==void 0?o:Promise}function at(r){return r&&l(r.next)&&l(r.error)&&l(r.complete)}function ut(r){return r&&r instanceof K||at(r)&&fr(r)}function ct(r){return l(r==null?void 0:r.lift)}function h(r){return function(o){if(ct(o))return o.lift(function(t){try{return r(t,this)}catch(e){this.error(e)}});throw new TypeError("Unable to lift unknown Observable type")}}function v(r,o,t,e,n){return new st(r,o,t,e,n)}var st=function(r){_(o,r);function o(t,e,n,i,f,u){var a=r.call(this,t)||this;return a.onFinalize=f,a.shouldUnsubscribe=u,a._next=e?function(c){try{e(c)}catch(s){t.error(s)}}:r.prototype._next,a._error=i?function(c){try{i(c)}catch(s){t.error(s)}finally{this.unsubscribe()}}:r.prototype._error,a._complete=n?function(){try{n()}catch(c){t.error(c)}finally{this.unsubscribe()}}:r.prototype._complete,a}return o.prototype.unsubscribe=function(){var t;if(!this.shouldUnsubscribe||this.shouldUnsubscribe()){var e=this.closed;r.prototype.unsubscribe.call(this),!e&&((t=this.onFinalize)===null||t===void 0||t.call(this))}},o}(K);var Oe=nr(function(r){return function(){r(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}});var Fr=function(r){_(o,r);function o(){var t=r.call(this)||this;return t.closed=!1,t.currentObservers=null,t.observers=[],t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return o.prototype.lift=function(t){var e=new Ae(this,this);return e.operator=t,e},o.prototype._throwIfClosed=function(){if(this.closed)throw new Oe},o.prototype.next=function(t){var e=this;W(function(){var n,i;if(e._throwIfClosed(),!e.isStopped){e.currentObservers||(e.currentObservers=Array.from(e.observers));try{for(var f=M(e.currentObservers),u=f.next();!u.done;u=f.next()){var a=u.value;a.next(t)}}catch(c){n={error:c}}finally{try{u&&!u.done&&(i=f.return)&&i.call(f)}finally{if(n)throw n.error}}}})},o.prototype.error=function(t){var e=this;W(function(){if(e._throwIfClosed(),!e.isStopped){e.hasError=e.isStopped=!0,e.thrownError=t;for(var n=e.observers;n.length;)n.shift().error(t)}})},o.prototype.complete=function(){var t=this;W(function(){if(t._throwIfClosed(),!t.isStopped){t.isStopped=!0;for(var e=t.observers;e.length;)e.shift().complete()}})},o.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=this.currentObservers=null},Object.defineProperty(o.prototype,"observed",{get:function(){var t;return((t=this.observers)===null||t===void 0?void 0:t.length)>0},enumerable:!1,configurable:!0}),o.prototype._trySubscribe=function(t){return this._throwIfClosed(),r.prototype._trySubscribe.call(this,t)},o.prototype._subscribe=function(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)},o.prototype._innerSubscribe=function(t){var e=this,n=this,i=n.hasError,f=n.isStopped,u=n.observers;return i||f?Ir:(this.currentObservers=null,u.push(t),new F(function(){e.currentObservers=null,C(u,t)}))},o.prototype._checkFinalizedStatuses=function(t){var e=this,n=e.hasError,i=e.thrownError,f=e.isStopped;n?t.error(i):f&&t.complete()},o.prototype.asObservable=function(){var t=new b;return t.source=this,t},o.create=function(t,e){return new Ae(t,e)},o}(b);var Ae=function(r){_(o,r);function o(t,e){var n=r.call(this)||this;return n.destination=t,n.source=e,n}return o.prototype.next=function(t){var e,n;(n=(e=this.destination)===null||e===void 0?void 0:e.next)===null||n===void 0||n.call(e,t)},o.prototype.error=function(t){var e,n;(n=(e=this.destination)===null||e===void 0?void 0:e.error)===null||n===void 0||n.call(e,t)},o.prototype.complete=function(){var t,e;(e=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||e===void 0||e.call(t)},o.prototype._subscribe=function(t){var e,n;return(n=(e=this.source)===null||e===void 0?void 0:e.subscribe(t))!==null&&n!==void 0?n:Ir},o}(Fr);var J={now:function(){return(J.delegate||Date).now()},delegate:void 0};var Mr=function(r){_(o,r);function o(t,e,n){t===void 0&&(t=1/0),e===void 0&&(e=1/0),n===void 0&&(n=J);var i=r.call(this)||this;return i._bufferSize=t,i._windowTime=e,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=e===1/0,i._bufferSize=Math.max(1,t),i._windowTime=Math.max(1,e),i}return o.prototype.next=function(t){var e=this,n=e.isStopped,i=e._buffer,f=e._infiniteTimeWindow,u=e._timestampProvider,a=e._windowTime;n||(i.push(t),!f&&i.push(u.now()+a)),this._trimBuffer(),r.prototype.next.call(this,t)},o.prototype._subscribe=function(t){this._throwIfClosed(),this._trimBuffer();for(var e=this._innerSubscribe(t),n=this,i=n._infiniteTimeWindow,f=n._buffer,u=f.slice(),a=0;a<u.length&&!t.closed;a+=i?1:2)t.next(u[a]);return this._checkFinalizedStatuses(t),e},o.prototype._trimBuffer=function(){var t=this,e=t._bufferSize,n=t._timestampProvider,i=t._buffer,f=t._infiniteTimeWindow,u=(f?1:2)*e;if(e<1/0&&u<i.length&&i.splice(0,i.length-u),!f){for(var a=n.now(),c=0,s=1;s<i.length&&i[s]<=a;s+=2)c=s;c&&i.splice(0,c+1)}},o}(Fr);var Ie=function(r){_(o,r);function o(t,e){return r.call(this)||this}return o.prototype.schedule=function(t,e){return e===void 0&&(e=0),this},o}(F);var $={setInterval:function(r,o){for(var t=[],e=2;e<arguments.length;e++)t[e-2]=arguments[e];var n=$.delegate;return n!=null&&n.setInterval?n.setInterval.apply(n,S([r,o],w(t))):setInterval.apply(void 0,S([r,o],w(t)))},clearInterval:function(r){var o=$.delegate;return((o==null?void 0:o.clearInterval)||clearInterval)(r)},delegate:void 0};var Te=function(r){_(o,r);function o(t,e){var n=r.call(this,t,e)||this;return n.scheduler=t,n.work=e,n.pending=!1,n}return o.prototype.schedule=function(t,e){var n;if(e===void 0&&(e=0),this.closed)return this;this.state=t;var i=this.id,f=this.scheduler;return i!=null&&(this.id=this.recycleAsyncId(f,i,e)),this.pending=!0,this.delay=e,this.id=(n=this.id)!==null&&n!==void 0?n:this.requestAsyncId(f,this.id,e),this},o.prototype.requestAsyncId=function(t,e,n){return n===void 0&&(n=0),$.setInterval(t.flush.bind(t,this),n)},o.prototype.recycleAsyncId=function(t,e,n){if(n===void 0&&(n=0),n!=null&&this.delay===n&&this.pending===!1)return e;e!=null&&$.clearInterval(e)},o.prototype.execute=function(t,e){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var n=this._execute(t,e);if(n)return n;this.pending===!1&&this.id!=null&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},o.prototype._execute=function(t,e){var n=!1,i;try{this.work(t)}catch(f){n=!0,i=f||new Error("Scheduled action threw falsy error")}if(n)return this.unsubscribe(),i},o.prototype.unsubscribe=function(){if(!this.closed){var t=this,e=t.id,n=t.scheduler,i=n.actions;this.work=this.state=this.scheduler=null,this.pending=!1,C(i,this),e!=null&&(this.id=this.recycleAsyncId(n,e,null)),this.delay=null,r.prototype.unsubscribe.call(this)}},o}(Ie);var Cr=function(){function r(o,t){t===void 0&&(t=r.now),this.schedulerActionCtor=o,this.now=t}return r.prototype.schedule=function(o,t,e){return t===void 0&&(t=0),new this.schedulerActionCtor(this,o).schedule(e,t)},r.now=J.now,r}();var Pe=function(r){_(o,r);function o(t,e){e===void 0&&(e=Cr.now);var n=r.call(this,t,e)||this;return n.actions=[],n._active=!1,n}return o.prototype.flush=function(t){var e=this.actions;if(this._active){e.push(t);return}var n;this._active=!0;do if(n=t.execute(t.state,t.delay))break;while(t=e.shift());if(this._active=!1,n){for(;t=e.shift();)t.unsubscribe();throw n}},o}(Cr);var Q=new Pe(Te),je=Q;var V=new b(function(r){return r.complete()});function sr(r){return r&&l(r.schedule)}function Lr(r){return r[r.length-1]}function Fe(r){return l(Lr(r))?r.pop():void 0}function B(r){return sr(Lr(r))?r.pop():void 0}function Me(r,o){return typeof Lr(r)=="number"?r.pop():o}var G=function(r){return r&&typeof r.length=="number"&&typeof r!="function"};function pr(r){return l(r==null?void 0:r.then)}function lr(r){return l(r[D])}function mr(r){return Symbol.asyncIterator&&l(r==null?void 0:r[Symbol.asyncIterator])}function dr(r){return new TypeError("You provided "+(r!==null&&typeof r=="object"?"an invalid object":"'"+r+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function pt(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var hr=pt();function vr(r){return l(r==null?void 0:r[hr])}function br(r){return ve(this,arguments,function(){var t,e,n,i;return tr(this,function(f){switch(f.label){case 0:t=r.getReader(),f.label=1;case 1:f.trys.push([1,,9,10]),f.label=2;case 2:return[4,or(t.read())];case 3:return e=f.sent(),n=e.value,i=e.done,i?[4,or(void 0)]:[3,5];case 4:return[2,f.sent()];case 5:return[4,or(n)];case 6:return[4,f.sent()];case 7:return f.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}})})}function yr(r){return l(r==null?void 0:r.getReader)}function x(r){if(r instanceof b)return r;if(r!=null){if(lr(r))return lt(r);if(G(r))return mt(r);if(pr(r))return dt(r);if(mr(r))return Ce(r);if(vr(r))return ht(r);if(yr(r))return vt(r)}throw dr(r)}function lt(r){return new b(function(o){var t=r[D]();if(l(t.subscribe))return t.subscribe(o);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function mt(r){return new b(function(o){for(var t=0;t<r.length&&!o.closed;t++)o.next(r[t]);o.complete()})}function dt(r){return new b(function(o){r.then(function(t){o.closed||(o.next(t),o.complete())},function(t){return o.error(t)}).then(null,ar)})}function ht(r){return new b(function(o){var t,e;try{for(var n=M(r),i=n.next();!i.done;i=n.next()){var f=i.value;if(o.next(f),o.closed)return}}catch(u){t={error:u}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}o.complete()})}function Ce(r){return new b(function(o){bt(r,o).catch(function(t){return o.error(t)})})}function vt(r){return Ce(br(r))}function bt(r,o){var t,e,n,i;return he(this,void 0,void 0,function(){var f,u;return tr(this,function(a){switch(a.label){case 0:a.trys.push([0,5,6,11]),t=be(r),a.label=1;case 1:return[4,t.next()];case 2:if(e=a.sent(),!!e.done)return[3,4];if(f=e.value,o.next(f),o.closed)return[2];a.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return u=a.sent(),n={error:u},[3,11];case 6:return a.trys.push([6,,9,10]),e&&!e.done&&(i=t.return)?[4,i.call(t)]:[3,8];case 7:a.sent(),a.label=8;case 8:return[3,10];case 9:if(n)throw n.error;return[7];case 10:return[7];case 11:return o.complete(),[2]}})})}function E(r,o,t,e,n){e===void 0&&(e=0),n===void 0&&(n=!1);var i=o.schedule(function(){t(),n?r.add(this.schedule(null,e)):this.unsubscribe()},e);if(r.add(i),!n)return i}function xr(r,o){return o===void 0&&(o=0),h(function(t,e){t.subscribe(v(e,function(n){return E(e,r,function(){return e.next(n)},o)},function(){return E(e,r,function(){return e.complete()},o)},function(n){return E(e,r,function(){return e.error(n)},o)}))})}function _r(r,o){return o===void 0&&(o=0),h(function(t,e){e.add(r.schedule(function(){return t.subscribe(e)},o))})}function Le(r,o){return x(r).pipe(_r(o),xr(o))}function Re(r,o){return x(r).pipe(_r(o),xr(o))}function ke(r,o){return new b(function(t){var e=0;return o.schedule(function(){e===r.length?t.complete():(t.next(r[e++]),t.closed||this.schedule())})})}function Ue(r,o){return new b(function(t){var e;return E(t,o,function(){e=r[hr](),E(t,o,function(){var n,i,f;try{n=e.next(),i=n.value,f=n.done}catch(u){t.error(u);return}f?t.complete():t.next(i)},0,!0)}),function(){return l(e==null?void 0:e.return)&&e.return()}})}function wr(r,o){if(!r)throw new Error("Iterable cannot be null");return new b(function(t){E(t,o,function(){var e=r[Symbol.asyncIterator]();E(t,o,function(){e.next().then(function(n){n.done?t.complete():t.next(n.value)})},0,!0)})})}function We(r,o){return wr(br(r),o)}function De(r,o){if(r!=null){if(lr(r))return Le(r,o);if(G(r))return ke(r,o);if(pr(r))return Re(r,o);if(mr(r))return wr(r,o);if(vr(r))return Ue(r,o);if(yr(r))return We(r,o)}throw dr(r)}function N(r,o){return o?De(r,o):x(r)}function Rr(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];var t=B(r);return N(r,t)}function Ve(r){return r instanceof Date&&!isNaN(r)}function Y(r,o){return h(function(t,e){var n=0;t.subscribe(v(e,function(i){e.next(r.call(o,i,n++))}))})}var yt=Array.isArray;function xt(r,o){return yt(o)?r.apply(void 0,S([],w(o))):r(o)}function Be(r){return Y(function(o){return xt(r,o)})}function Ge(r,o,t,e,n,i,f,u){var a=[],c=0,s=0,d=!1,p=function(){d&&!a.length&&!c&&o.complete()},y=function(m){return c<e?g(m):a.push(m)},g=function(m){i&&o.next(m),c++;var P=!1;x(t(m,s++)).subscribe(v(o,function(j){n==null||n(j),i?y(j):o.next(j)},function(){P=!0},void 0,function(){if(P)try{c--;for(var j=function(){var R=a.shift();f?E(o,f,function(){return g(R)}):g(R)};a.length&&c<e;)j();p()}catch(R){o.error(R)}}))};return r.subscribe(v(o,y,function(){d=!0,p()})),function(){u==null||u()}}function T(r,o,t){return t===void 0&&(t=1/0),l(o)?T(function(e,n){return Y(function(i,f){return o(e,i,n,f)})(x(r(e,n)))},t):(typeof o=="number"&&(t=o),h(function(e,n){return Ge(e,n,r,t)}))}function Sr(r){return r===void 0&&(r=1/0),T(I,r)}function Ne(){return Sr(1)}function Ye(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];return Ne()(N(r,B(r)))}var _t=["addListener","removeListener"],wt=["addEventListener","removeEventListener"],St=["on","off"];function z(r,o,t,e){if(l(t)&&(e=t,t=void 0),e)return z(r,o,t).pipe(Be(e));var n=w(Ot(r)?wt.map(function(u){return function(a){return r[u](o,a,t)}}):gt(r)?_t.map(ze(r,o)):Et(r)?St.map(ze(r,o)):[],2),i=n[0],f=n[1];if(!i&&G(r))return T(function(u){return z(u,o,t)})(x(r));if(!i)throw new TypeError("Invalid event target");return new b(function(u){var a=function(){for(var c=[],s=0;s<arguments.length;s++)c[s]=arguments[s];return u.next(1<c.length?c:c[0])};return i(a),function(){return f(a)}})}function ze(r,o){return function(t){return function(e){return r[t](o,e)}}}function gt(r){return l(r.addListener)&&l(r.removeListener)}function Et(r){return l(r.on)&&l(r.off)}function Ot(r){return l(r.addEventListener)&&l(r.removeEventListener)}function q(r,o,t){r===void 0&&(r=0),t===void 0&&(t=je);var e=-1;return o!=null&&(sr(o)?t=o:e=o),new b(function(n){var i=Ve(r)?+r-t.now():r;i<0&&(i=0);var f=0;return t.schedule(function(){n.closed||(n.next(f++),0<=e?this.schedule(void 0,e):n.complete())},i)})}function kr(r,o){return r===void 0&&(r=0),o===void 0&&(o=Q),r<0&&(r=0),q(r,r,o)}function Ur(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];var t=B(r),e=Me(r,1/0),n=r;return n.length?n.length===1?x(n[0]):Sr(e)(N(n,t)):V}var Wr=new b(A);function X(r,o){return h(function(t,e){var n=0;t.subscribe(v(e,function(i){return r.call(o,i,n++)&&e.next(i)}))})}function H(r){return r<=0?function(){return V}:h(function(o,t){var e=0;o.subscribe(v(t,function(n){++e<=r&&(t.next(n),r<=e&&t.complete())}))})}function qe(){return h(function(r,o){r.subscribe(v(o,A))})}function He(r){return Y(function(){return r})}function Dr(r,o){return o?function(t){return Ye(o.pipe(H(1),qe()),t.pipe(Dr(r)))}:T(function(t,e){return r(t,e).pipe(H(1),He(t))})}function Vr(r,o){o===void 0&&(o=Q);var t=q(r,o);return Dr(function(){return t})}function Br(r,o){return o===void 0&&(o=I),r=r!=null?r:At,h(function(t,e){var n,i=!0;t.subscribe(v(e,function(f){var u=o(f);(i||!r(n,u))&&(i=!1,n=u,e.next(f))}))})}function At(r,o){return r===o}function Gr(r){return h(function(o,t){try{o.subscribe(t)}finally{t.add(r)}})}function Nr(r){var o,t=1/0,e;return r!=null&&(typeof r=="object"?(o=r.count,t=o===void 0?1/0:o,e=r.delay):t=r),t<=0?function(){return V}:h(function(n,i){var f=0,u,a=function(){if(u==null||u.unsubscribe(),u=null,e!=null){var s=typeof e=="number"?q(e):x(e(f)),d=v(i,function(){d.unsubscribe(),c()});s.subscribe(d)}else c()},c=function(){var s=!1;u=n.subscribe(v(i,void 0,function(){++f<t?u?a():s=!0:i.complete()})),s&&a()};c()})}function Yr(r,o){return h(function(t,e){var n=null,i=0,f=!1,u=function(){return f&&!n&&e.complete()};t.subscribe(v(e,function(a){n==null||n.unsubscribe();var c=0,s=i++;x(r(a,s)).subscribe(n=v(e,function(d){return e.next(o?o(a,d,s,c++):d)},function(){n=null,u()}))},function(){f=!0,u()}))})}function gr(r){return h(function(o,t){x(r).subscribe(v(t,function(){return t.complete()},A)),!t.closed&&o.subscribe(t)})}function Er(r,o,t){var e=l(r)||o||t?{next:r,error:o,complete:t}:r;return e?h(function(n,i){var f;(f=e.subscribe)===null||f===void 0||f.call(e);var u=!0;n.subscribe(v(i,function(a){var c;(c=e.next)===null||c===void 0||c.call(e,a),i.next(a)},function(){var a;u=!1,(a=e.complete)===null||a===void 0||a.call(e),i.complete()},function(a){var c;u=!1,(c=e.error)===null||c===void 0||c.call(e,a),i.error(a)},function(){var a,c;u&&((a=e.unsubscribe)===null||a===void 0||a.call(e)),(c=e.finalize)===null||c===void 0||c.call(e)}))}):I}function zr(){for(var r=[],o=0;o<arguments.length;o++)r[o]=arguments[o];var t=Fe(r);return h(function(e,n){for(var i=r.length,f=new Array(i),u=r.map(function(){return!1}),a=!1,c=function(d){x(r[d]).subscribe(v(n,function(p){f[d]=p,!a&&!u[d]&&(u[d]=!0,(a=u.every(I))&&(u=null))},A))},s=0;s<i;s++)c(s);e.subscribe(v(n,function(d){if(a){var p=S([d],w(f));n.next(t?t.apply(void 0,S([],w(p))):p)}}))})}var Ke=document.createElement("div");document.body.appendChild(Ke);var Or=document.querySelector(".md-header__option");if(Or){let r=document.createElement("button");r.className="md-header__button md-icon \u1D34\u2092\u1D34\u2092\u1D34\u2092__button",Or.parentElement&&Or.parentElement.insertBefore(r,Or);let o=new Mr(1);o.pipe(Br()).subscribe(t=>{sessionStorage.setItem("\u1D34\u2092\u1D34\u2092\u1D34\u2092",`${t}`),r.hidden=!t}),o.next(JSON.parse(sessionStorage.getItem("\u1D34\u2092\u1D34\u2092\u1D34\u2092")||"true")),z(r,"click").pipe(zr(o)).subscribe(([,t])=>o.next(!t)),kr(250).pipe(gr(o.pipe(X(t=>!t))),H(75),Nr({delay:()=>o.pipe(X(t=>t))}),T(()=>{let t=document.createElement("div");return t.className="\u1D34\u2092\u1D34\u2092\u1D34\u2092",t.ariaHidden="true",Ke.appendChild(t),Ur(Wr,Rr(t)).pipe(Gr(()=>t.remove()),gr(o.pipe(X(e=>!e))),Yr(e=>z(e,"click").pipe(Er(()=>e.classList.add("\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090")),Vr(1e3),Er(()=>e.classList.remove("\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090")))))})).subscribe()}})();
//# sourceMappingURL=bundle.5f09fbc3.min.js.map

