{"version":3,"file":"signalwire-web-components-embed.umd.cjs","sources":["../../../../node_modules/@lit/reactive-element/css-tag.js","../../../../node_modules/@lit/reactive-element/reactive-element.js","../../../../node_modules/lit-html/lit-html.js","../../../../node_modules/lit-element/lit-element.js","../../../../node_modules/@lit/reactive-element/decorators/custom-element.js","../../../../node_modules/@lit/reactive-element/decorators/property.js","../../../../node_modules/@lit/reactive-element/decorators/state.js","../../../../node_modules/@lit/reactive-element/decorators/base.js","../../../../node_modules/@lit/reactive-element/decorators/query.js","../../../../node_modules/@lit/context/lib/context-request-event.js","../../../../node_modules/@lit/context/lib/create-context.js","../../../../node_modules/@lit/context/lib/controllers/context-consumer.js","../../../../node_modules/@lit/context/lib/value-notifier.js","../../../../node_modules/@lit/context/lib/controllers/context-provider.js","../../../../node_modules/@lit/context/lib/decorators/consume.js","../../src/context/call-state-context.ts","../../src/context/devices-context.ts","../../src/utils/video.ts","../../../../node_modules/tslib/tslib.es6.mjs","../../../../node_modules/rxjs/dist/esm5/internal/util/isFunction.js","../../../../node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js","../../../../node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js","../../../../node_modules/rxjs/dist/esm5/internal/util/arrRemove.js","../../../../node_modules/rxjs/dist/esm5/internal/Subscription.js","../../../../node_modules/rxjs/dist/esm5/internal/config.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js","../../../../node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js","../../../../node_modules/rxjs/dist/esm5/internal/util/noop.js","../../../../node_modules/rxjs/dist/esm5/internal/util/errorContext.js","../../../../node_modules/rxjs/dist/esm5/internal/Subscriber.js","../../../../node_modules/rxjs/dist/esm5/internal/symbol/observable.js","../../../../node_modules/rxjs/dist/esm5/internal/util/identity.js","../../../../node_modules/rxjs/dist/esm5/internal/util/pipe.js","../../../../node_modules/rxjs/dist/esm5/internal/Observable.js","../../../../node_modules/rxjs/dist/esm5/internal/util/lift.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/animationFrameProvider.js","../../../../node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js","../../../../node_modules/rxjs/dist/esm5/internal/Subject.js","../../../../node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js","../../../../node_modules/rxjs/dist/esm5/internal/ReplaySubject.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/Action.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js","../../../../node_modules/rxjs/dist/esm5/internal/util/Immediate.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/immediateProvider.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsapAction.js","../../../../node_modules/rxjs/dist/esm5/internal/Scheduler.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AsapScheduler.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/asap.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/async.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AnimationFrameAction.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/AnimationFrameScheduler.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduler/animationFrame.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/empty.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isScheduler.js","../../../../node_modules/rxjs/dist/esm5/internal/util/args.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isPromise.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js","../../../../node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js","../../../../node_modules/rxjs/dist/esm5/internal/symbol/iterator.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isIterable.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js","../../../../node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/observeOn.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js","../../../../node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/from.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/of.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/throwError.js","../../../../node_modules/rxjs/dist/esm5/internal/util/EmptyError.js","../../../../node_modules/rxjs/dist/esm5/internal/lastValueFrom.js","../../../../node_modules/rxjs/dist/esm5/internal/firstValueFrom.js","../../../../node_modules/rxjs/dist/esm5/internal/util/isDate.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/timeout.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/map.js","../../../../node_modules/rxjs/dist/esm5/internal/util/mapOneOrManyArgs.js","../../../../node_modules/rxjs/dist/esm5/internal/util/argsArgArrayOrObject.js","../../../../node_modules/rxjs/dist/esm5/internal/util/createObject.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/mergeInternals.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/mergeMap.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/concatAll.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/concat.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/defer.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/timer.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/interval.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/merge.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/never.js","../../../../node_modules/rxjs/dist/esm5/internal/util/argsOrArgArray.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/filter.js","../../../../node_modules/rxjs/dist/esm5/internal/observable/race.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/audit.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/auditTime.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/catchError.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/scanInternals.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/reduce.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/toArray.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/debounceTime.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/defaultIfEmpty.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/take.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/distinctUntilChanged.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/throwIfEmpty.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/exhaustMap.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/first.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/scan.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/share.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/shareReplay.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/skip.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/skipWhile.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/startWith.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/switchMap.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/tap.js","../../../../node_modules/rxjs/dist/esm5/internal/operators/withLatestFrom.js","../../../../node_modules/loglevel/lib/loglevel.js","../../../main/dist/operators-BlUtq-t0.mjs","../../../../node_modules/jwt-decode/build/esm/index.js","../../../../node_modules/uuid/dist/stringify.js","../../../../node_modules/uuid/dist/rng.js","../../../../node_modules/uuid/dist/v4.js","../../../main/dist/index.mjs","../../src/components/sw-call-media.ts","../../src/components/sw-self-media.ts","../../../../node_modules/lit-html/directive.js","../../../../node_modules/lit-html/directives/unsafe-html.js","../../src/components/UI/icons/icons.ts","../../src/components/UI/icons/backspace.svg?raw","../../src/components/UI/icons/download.svg?raw","../../src/components/UI/icons/copy.svg?raw","../../src/components/UI/icons/camera-off.svg?raw","../../src/components/UI/icons/camera-on.svg?raw","../../src/components/UI/icons/check-circle.svg?raw","../../src/components/UI/icons/chevron-up.svg?raw","../../src/components/UI/icons/close.svg?raw","../../src/components/UI/icons/fullscreen-exit.svg?raw","../../src/components/UI/icons/fullscreen.svg?raw","../../src/components/UI/icons/hand-raise.svg?raw","../../src/components/UI/icons/info-circle.svg?raw","../../src/components/UI/icons/mic-off.svg?raw","../../src/components/UI/icons/mic-on.svg?raw","../../src/components/UI/icons/person.svg?raw","../../src/components/UI/icons/phone-call.svg?raw","../../src/components/UI/icons/phone-end.svg?raw","../../src/components/UI/icons/room.svg?raw","../../src/components/UI/icons/screen-share.svg?raw","../../src/components/UI/icons/screen-share-off.svg?raw","../../src/components/UI/icons/sendIcon.svg?raw","../../src/components/UI/icons/settings.svg?raw","../../src/components/UI/icons/speaker-off.svg?raw","../../src/components/UI/icons/speaker-on.svg?raw","../../src/components/UI/icons/spinner.svg?raw","../../src/components/UI/icons/sw-logo.svg?raw","../../src/components/UI/icons/transcript.svg?raw","../../src/components/UI/icons/sw-ui-icon.ts","../../src/components/sw-local-camera.ts","../../src/components/UI/host-reset.ts","../../src/components/sw-participants.ts","../../src/components/sw-participant-controls.ts","../../src/components/sw-audio-level.ts","../../src/components/sw-call-controls.ts","../../src/components/sw-call-status.ts","../../src/context/CallStateContextController.ts","../../src/context/DevicesContextController.ts","../../src/components/sw-call-provider.ts","../../src/components/UI/controls/sw-ui-dialpad.ts","../../src/components/sw-call-dialpad.ts","../../src/context/transcript-context.ts","../../src/context/chat-state.ts","../../src/context/TranscriptController.ts","../../src/context/UserEventController.ts","../../src/components/UI/layout/sw-ui-call-layout.ts","../../src/components/UI/layout/sw-ui-responsive-container.ts","../../src/components/UI/layout/sw-ui-modal.ts","../../../../node_modules/lit-html/directives/style-map.js","../../src/assets/sw_background.webp","../../src/components/UI/DEFAULT_BACKGROUND.ts","../../src/components/UI/layout/sw-ui-background.ts","../../src/utils/prism.ts","../../src/components/UI/layout/sw-ui-content-drawer.ts","../../src/utils/transcriptToMarkdown.ts","../../src/components/UI/sw-ui-transcript-view.ts","../../src/components/UI/sw-ui-alert.ts","../../src/utils/use-google-font.ts","../../src/utils/theme-loader.ts","../../src/utils/user-variables.ts","../../src/components/sw-call-widget/client-factory.ts","../../src/components/sw-call-widget/sw-call-widget.templates.ts","../../src/components/sw-call-widget/sw-call-widget.ts","../../src/components/sw-click-to-call.ts","../../src/components/sw-directory.ts","../../src/components/sw-device-selector/sw-device-selector.styles.ts","../../src/components/sw-device-selector/sw-device-selector.ts","../../src/components/UI/controls/sw-ui-dropup.ts","../../src/components/UI/controls/sw-ui-split-button.ts","../../src/components/UI/controls/sw-ui-control-bar.ts","../../src/index.ts","../../../../node_modules/prismjs/prism.js","../../../../node_modules/prismjs/components/prism-javascript.js","../../../../node_modules/prismjs/components/prism-typescript.js","../../../../node_modules/prismjs/components/prism-python.js","../../../../node_modules/prismjs/components/prism-bash.js","../../../../node_modules/prismjs/components/prism-json.js","../../../../node_modules/prismjs/components/prism-css.js","../../../../node_modules/prismjs/components/prism-yaml.js","../../../../node_modules/prismjs/components/prism-sql.js","../../../../node_modules/prismjs/components/prism-markdown.js","../../../../node_modules/marked/lib/marked.esm.js","../../../../node_modules/dompurify/dist/purify.es.mjs"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){const e=this.constructor,h=this[t];if(i??=e.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(e._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach((t=>this._$ET(t,this[t]))),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.1\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t.trustedTypes,s=i?i.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,e=\"$lit$\",h=`lit$${Math.random().toFixed(9).slice(2)}$`,o=\"?\"+h,n=`<${o}>`,r=document,l=()=>r.createComment(\"\"),c=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,a=Array.isArray,u=t=>a(t)||\"function\"==typeof t?.[Symbol.iterator],d=\"[ \\t\\n\\f\\r]\",f=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,v=/-->/g,_=/>/g,m=RegExp(`>|${d}(?:([^\\\\s\"'>=/]+)(${d}*=${d}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),p=/'/g,g=/\"/g,$=/^(?:script|style|textarea|title)$/i,y=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),x=y(1),b=y(2),w=y(3),T=Symbol.for(\"lit-noChange\"),E=Symbol.for(\"lit-nothing\"),A=new WeakMap,C=r.createTreeWalker(r,129);function P(t,i){if(!a(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==s?s.createHTML(i):i}const V=(t,i)=>{const s=t.length-1,o=[];let r,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=f;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,y=0;for(;y<s.length&&(c.lastIndex=y,u=c.exec(s),null!==u);)y=c.lastIndex,c===f?\"!--\"===u[1]?c=v:void 0!==u[1]?c=_:void 0!==u[2]?($.test(u[2])&&(r=RegExp(\"</\"+u[2],\"g\")),c=m):void 0!==u[3]&&(c=m):c===m?\">\"===u[0]?(c=r??f,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?m:'\"'===u[3]?g:p):c===g||c===p?c=m:c===v||c===_?c=f:(c=m,r=void 0);const x=c===m&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===f?s+n:d>=0?(o.push(a),s.slice(0,d)+e+s.slice(d)+h+x):s+h+(-2===d?i:x)}return[P(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),o]};class N{constructor({strings:t,_$litType$:s},n){let r;this.parts=[];let c=0,a=0;const u=t.length-1,d=this.parts,[f,v]=V(t,s);if(this.el=N.createElement(f,n),C.currentNode=this.el.content,2===s||3===s){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=C.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(e)){const i=v[a++],s=r.getAttribute(t).split(h),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:c,name:e[2],strings:s,ctor:\".\"===e[1]?H:\"?\"===e[1]?I:\"@\"===e[1]?L:k}),r.removeAttribute(t)}else t.startsWith(h)&&(d.push({type:6,index:c}),r.removeAttribute(t));if($.test(r.tagName)){const t=r.textContent.split(h),s=t.length-1;if(s>0){r.textContent=i?i.emptyScript:\"\";for(let i=0;i<s;i++)r.append(t[i],l()),C.nextNode(),d.push({type:2,index:++c});r.append(t[s],l())}}}else if(8===r.nodeType)if(r.data===o)d.push({type:2,index:c});else{let t=-1;for(;-1!==(t=r.data.indexOf(h,t+1));)d.push({type:7,index:c}),t+=h.length-1}c++}}static createElement(t,i){const s=r.createElement(\"template\");return s.innerHTML=t,s}}function S(t,i,s=t,e){if(i===T)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=c(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=S(t,h._$AS(t,i.values),h,e)),i}class M{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??r).importNode(i,!0);C.currentNode=e;let h=C.nextNode(),o=0,n=0,l=s[0];for(;void 0!==l;){if(o===l.index){let i;2===l.type?i=new R(h,h.nextSibling,this,t):1===l.type?i=new l.ctor(h,l.name,l.strings,this,t):6===l.type&&(i=new z(h,this,t)),this._$AV.push(i),l=s[++n]}o!==l?.index&&(h=C.nextNode(),o++)}return C.currentNode=r,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class R{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=E,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=S(this,t,i),c(t)?t===E||null==t||\"\"===t?(this._$AH!==E&&this._$AR(),this._$AH=E):t!==this._$AH&&t!==T&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):u(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==E&&c(this._$AH)?this._$AA.nextSibling.data=t:this.T(r.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=N.createElement(P(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new M(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=A.get(t.strings);return void 0===i&&A.set(t.strings,i=new N(t)),i}k(t){a(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new R(this.O(l()),this.O(l()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,i){for(this._$AP?.(!1,!0,i);t!==this._$AB;){const i=t.nextSibling;t.remove(),t=i}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class k{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=E,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=E}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=S(this,t,i,0),o=!c(t)||t!==this._$AH&&t!==T,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=S(this,e[s+n],i,n),r===T&&(r=this._$AH[n]),o||=!c(r)||r!==this._$AH[n],r===E?t=E:t!==E&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===E?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class H extends k{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===E?void 0:t}}class I extends k{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==E)}}class L extends k{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=S(this,t,i,0)??E)===T)return;const s=this._$AH,e=t===E&&s!==E||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==E&&(s===E||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){S(this,t)}}const Z={M:e,P:h,A:o,C:1,L:V,R:M,D:u,V:S,I:R,H:k,N:I,U:L,B:H,F:z},j=t.litHtmlPolyfillSupport;j?.(N,R),(t.litHtmlVersions??=[]).push(\"3.3.1\");const B=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new R(i.insertBefore(l(),t),t,void 0,s??{})}return h._$AI(t),h};export{Z as _$LH,x as html,w as mathml,T as noChange,E as nothing,B as render,b as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.1\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst e=(e,t,c)=>(c.configurable=!0,c.enumerable=!0,Reflect.decorate&&\"object\"!=typeof t&&Object.defineProperty(e,t,c),c);export{e as desc};\n//# sourceMappingURL=base.js.map\n","import{desc as t}from\"./base.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e(e,r){return(n,s,i)=>{const o=t=>t.renderRoot?.querySelector(e)??null;if(r){const{get:e,set:r}=\"object\"==typeof s?n:i??(()=>{const t=Symbol();return{get(){return this[t]},set(e){this[t]=e}}})();return t(n,s,{get(){let t=e.call(this);return void 0===t&&(t=o(this),(null!==t||this.hasUpdated)&&r.call(this,t)),t}})}return t(n,s,{get(){return o(this)}})}}export{e as query};\n//# sourceMappingURL=query.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s extends Event{constructor(s,t,e,o){super(\"context-request\",{bubbles:!0,composed:!0}),this.context=s,this.contextTarget=t,this.callback=e,this.subscribe=o??!1}}export{s as ContextRequestEvent};\n//# sourceMappingURL=context-request-event.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nfunction n(n){return n}export{n as createContext};\n//# sourceMappingURL=create-context.js.map\n","import{ContextRequestEvent as t}from\"../context-request-event.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class s{constructor(t,s,i,h){if(this.subscribe=!1,this.provided=!1,this.value=void 0,this.t=(t,s)=>{this.unsubscribe&&(this.unsubscribe!==s&&(this.provided=!1,this.unsubscribe()),this.subscribe||this.unsubscribe()),this.value=t,this.host.requestUpdate(),this.provided&&!this.subscribe||(this.provided=!0,this.callback&&this.callback(t,s)),this.unsubscribe=s},this.host=t,void 0!==s.context){const t=s;this.context=t.context,this.callback=t.callback,this.subscribe=t.subscribe??!1}else this.context=s,this.callback=i,this.subscribe=h??!1;this.host.addController(this)}hostConnected(){this.dispatchRequest()}hostDisconnected(){this.unsubscribe&&(this.unsubscribe(),this.unsubscribe=void 0)}dispatchRequest(){this.host.dispatchEvent(new t(this.context,this.host,this.t,this.subscribe))}}export{s as ContextConsumer};\n//# sourceMappingURL=context-consumer.js.map\n","/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s{get value(){return this.o}set value(s){this.setValue(s)}setValue(s,t=!1){const i=t||!Object.is(s,this.o);this.o=s,i&&this.updateObservers()}constructor(s){this.subscriptions=new Map,this.updateObservers=()=>{for(const[s,{disposer:t}]of this.subscriptions)s(this.o,t)},void 0!==s&&(this.value=s)}addCallback(s,t,i){if(!i)return void s(this.value);this.subscriptions.has(s)||this.subscriptions.set(s,{disposer:()=>{this.subscriptions.delete(s)},consumerHost:t});const{disposer:h}=this.subscriptions.get(s);s(this.value,h)}clearCallbacks(){this.subscriptions.clear()}}export{s as ValueNotifier};\n//# sourceMappingURL=value-notifier.js.map\n","import{ContextRequestEvent as t}from\"../context-request-event.js\";import{ValueNotifier as s}from\"../value-notifier.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends Event{constructor(t,s){super(\"context-provider\",{bubbles:!0,composed:!0}),this.context=t,this.contextTarget=s}}class i extends s{constructor(s,e,i){super(void 0!==e.context?e.initialValue:i),this.onContextRequest=t=>{if(t.context!==this.context)return;const s=t.contextTarget??t.composedPath()[0];s!==this.host&&(t.stopPropagation(),this.addCallback(t.callback,s,t.subscribe))},this.onProviderRequest=s=>{if(s.context!==this.context)return;if((s.contextTarget??s.composedPath()[0])===this.host)return;const e=new Set;for(const[s,{consumerHost:i}]of this.subscriptions)e.has(s)||(e.add(s),i.dispatchEvent(new t(this.context,i,s,!0)));s.stopPropagation()},this.host=s,void 0!==e.context?this.context=e.context:this.context=e,this.attachListeners(),this.host.addController?.(this)}attachListeners(){this.host.addEventListener(\"context-request\",this.onContextRequest),this.host.addEventListener(\"context-provider\",this.onProviderRequest)}hostConnected(){this.host.dispatchEvent(new e(this.context,this.host))}}export{i as ContextProvider,e as ContextProviderEvent};\n//# sourceMappingURL=context-provider.js.map\n","import{ContextConsumer as t}from\"../controllers/context-consumer.js\";\n/**\n * @license\n * Copyright 2022 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function c({context:c,subscribe:e}){return(o,n)=>{\"object\"==typeof n?n.addInitializer((function(){new t(this,{context:c,callback:t=>{o.set.call(this,t)},subscribe:e})})):o.constructor.addInitializer((o=>{new t(o,{context:c,callback:t=>{o[n]=t},subscribe:e})}))}}export{c as consume};\n//# sourceMappingURL=consume.js.map\n","import { createContext } from '@lit/context';\nimport type { Observable, Subscription } from 'rxjs';\nimport type { ReactiveControllerHost } from 'lit';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport type {\n  CallStatus,\n  CallParticipant,\n  CallSelfParticipant,\n  CallAddress,\n  MediaDirections,\n  VideoPosition,\n} from '@signalwire/js';\n\n// ── Context value shape ───────────────────────────────────────────────────────\n\nexport interface CallState {\n  // ── Identity (static, set once on connect) ──────────────────────────────\n  id: string;\n  direction: 'inbound' | 'outbound';\n  to: string | undefined;\n\n  // ── Lifecycle ────────────────────────────────────────────────────────────\n  status: CallStatus;\n\n  // ── Room state ───────────────────────────────────────────────────────────\n  recording: boolean;\n  streaming: boolean;\n  locked: boolean;\n  raiseHandPriority: boolean;\n  meta: Record<string, unknown>;\n\n  // ── Participants ─────────────────────────────────────────────────────────\n  participants: CallParticipant[];\n  /** The local/self participant. Null until the call is joined. */\n  self: CallSelfParticipant | null;\n\n  // ── Media streams ────────────────────────────────────────────────────────\n  remoteStream: MediaStream | null;\n  localStream: MediaStream | null;\n  mediaDirections: MediaDirections;\n\n  // ── Layout ───────────────────────────────────────────────────────────────\n  layout: string | undefined;\n  layouts: string[];\n  layoutLayers: LayoutLayer[];\n\n  // ── Address / capabilities ───────────────────────────────────────────────\n  address: CallAddress | undefined;\n  capabilities: string[];\n\n  // ── Actions ──────────────────────────────────────────────────────────────\n  hangup: () => Promise<void>;\n  toggleLock: () => Promise<void>;\n  toggleHold: () => Promise<void>;\n  setLayout: (layout: string, positions?: Record<string, VideoPosition>) => Promise<void>;\n  startRecording: () => Promise<void>;\n  startStreaming: () => Promise<void>;\n  sendDigits: (digits: string) => Promise<void>;\n  answer: () => void;\n  reject: () => void;\n}\n\nexport const callStateContext = createContext<CallState>('sw-call-state');\n\n// ── Incoming call info ───────────────────────────────────────────────────────\n\nexport interface IncomingCallInfo {\n  call: Call;\n  callerName: string | undefined;\n  callerNumber: string | undefined;\n}\n\n// ── Incoming call controller ─────────────────────────────────────────────────\n\ntype IncomingCallCallback = (info: IncomingCallInfo) => void;\n\n/**\n * Listens to an incoming-calls observable and fires a callback for each\n * new inbound call. Deduplicates by call ID so a call is never announced\n * twice.\n *\n * Usage in a provider component:\n *\n *   private _incoming = new IncomingCallController(this);\n *\n *   // Set the handler:\n *   this._incoming.onIncomingCall = (info) => { ... };\n *\n *   // Start listening (pass the observable from client.session):\n *   this._incoming.connect(client.session.incomingCalls$);\n *\n *   // Stop listening:\n *   this._incoming.disconnect();\n */\nexport class IncomingCallController {\n  private _subscription: Subscription | null = null;\n  private _seenCallIds = new Set<string>();\n  private _callback: IncomingCallCallback | null = null;\n\n  constructor(host: ReactiveControllerHost & EventTarget) {\n    host.addController(this);\n  }\n\n  // Intentionally not a stateful ReactiveController. We only register with\n  // `host.addController(this)` so `hostDisconnected()` can clean up the\n  // RxJS subscription on removal — there's no provider, no host requestUpdate(),\n  // and `hostConnected()` is a deliberate no-op.\n  hostConnected() {}\n  hostDisconnected() {\n    this.disconnect();\n  }\n\n  set onIncomingCall(cb: IncomingCallCallback) {\n    this._callback = cb;\n  }\n\n  connect(incomingCalls$: Observable<Call[]>): void {\n    this.disconnect();\n\n    this._subscription = incomingCalls$.subscribe((calls) => {\n      for (const call of calls) {\n        if (this._seenCallIds.has(call.id)) continue;\n        this._seenCallIds.add(call.id);\n\n        this._callback?.({\n          call,\n          callerName: call.fromName,\n          callerNumber: call.from,\n        });\n      }\n    });\n  }\n\n  disconnect(): void {\n    this._subscription?.unsubscribe();\n    this._subscription = null;\n    this._seenCallIds.clear();\n  }\n}\n","import { createContext } from '@lit/context';\n\n// ── Context value shape ───────────────────────────────────────────────────────\n\nexport interface DevicesState {\n  // ── Device lists ────────────────────────────────────────────────────────\n  audioInputDevices: MediaDeviceInfo[];\n  audioOutputDevices: MediaDeviceInfo[];\n  videoInputDevices: MediaDeviceInfo[];\n\n  // ── Selected devices ────────────────────────────────────────────────────\n  selectedAudioInput: MediaDeviceInfo | null;\n  selectedAudioOutput: MediaDeviceInfo | null;\n  selectedVideoInput: MediaDeviceInfo | null;\n\n  // ── Mute state (source of truth: server via call.self$) ─────────────────\n  // These reflect what the server says — admin mute will flip these too.\n  audioMuted: boolean;\n  videoMuted: boolean;\n  /** deaf = can't hear = \"speaker muted\" from the server's perspective */\n  speakerMuted: boolean;\n\n  // ── Device actions ───────────────────────────────────────────────────────\n  selectAudioInput: (device: MediaDeviceInfo | null) => void;\n  selectAudioOutput: (device: MediaDeviceInfo | null) => void;\n  selectVideoInput: (device: MediaDeviceInfo | null) => void;\n\n  // ── Mute actions (call through to self participant) ──────────────────────\n  toggleAudioMute: () => Promise<void>;\n  toggleVideoMute: () => Promise<void>;\n  toggleSpeakerMute: () => Promise<void>;\n\n  // ── Audio processing state (source of truth: server via call.self$) ────\n  echoCancellation: boolean;\n  autoGain: boolean;\n  noiseSuppression: boolean;\n\n  // ── Audio processing actions ───────────────────────────────────────────\n  toggleEchoCancellation: () => Promise<void>;\n  toggleAutoGain: () => Promise<void>;\n  toggleNoiseSuppression: () => Promise<void>;\n}\n\nexport const devicesContext = createContext<DevicesState>('sw-devices');\n","/**\n * Video element utilities for creating and managing video elements\n * with proper configuration for WebRTC streams.\n */\n\nimport { VIDEO_READY_TIMEOUT_MS } from '../constants.js';\n\n/**\n * Creates a video element configured for WebRTC streams.\n * The video is muted, autoplays, and plays inline (mobile Safari support).\n * Prevents pause events which can occur on camera switches or PiP mode.\n *\n * @returns A configured HTMLVideoElement\n */\nexport function createVideoElement(): HTMLVideoElement {\n  const video = document.createElement('video');\n  video.muted = true;\n  video.autoplay = true;\n  video.playsInline = true;\n\n  // Prevent pause (Safari/Firefox pause on PiP, camera switch)\n  video.addEventListener('pause', () => {\n    video.play().catch((error) => {\n      console.error('Video Element Paused', error);\n    });\n  });\n\n  return video;\n}\n\n/**\n * Waits for a video element to be ready for playback.\n * Resolves when the video has metadata or when it can play.\n *\n * @param element - The video element to wait for\n * @returns A promise that resolves when the video is ready\n */\nexport function waitForVideoReady(element: HTMLVideoElement): Promise<void> {\n  return new Promise<void>((resolve) => {\n    if (element.readyState >= HTMLMediaElement.HAVE_METADATA) {\n      resolve();\n      return;\n    }\n\n    let resolved = false;\n\n    const done = () => {\n      if (resolved) return;\n      resolved = true;\n      clearTimeout(timeoutId);\n      element.removeEventListener('canplay', done);\n      element.removeEventListener('resize', done);\n      resolve();\n    };\n\n    // Timeout fallback for audio-only streams where resize/canplay may never fire\n    const timeoutId = setTimeout(done, VIDEO_READY_TIMEOUT_MS);\n    element.addEventListener('canplay', done);\n    element.addEventListener('resize', done);\n  });\n}\n\n/**\n * Attaches a MediaStream to a video element.\n *\n * @param element - The video element to attach the stream to\n * @param stream - The MediaStream to attach, or null to detach\n */\nexport function attachMediaStream(element: HTMLVideoElement, stream: MediaStream | null): void {\n  element.srcObject = stream;\n}\n\n/**\n * Detaches any MediaStream from a video element.\n *\n * @param element - The video element to detach the stream from\n */\nexport function detachMediaStream(element: HTMLVideoElement): void {\n  if (element.srcObject) {\n    element.srcObject = null;\n  }\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","export function isFunction(value) {\n    return typeof value === 'function';\n}\n//# sourceMappingURL=isFunction.js.map","export function createErrorClass(createImpl) {\n    var _super = function (instance) {\n        Error.call(instance);\n        instance.stack = new Error().stack;\n    };\n    var ctorFunc = createImpl(_super);\n    ctorFunc.prototype = Object.create(Error.prototype);\n    ctorFunc.prototype.constructor = ctorFunc;\n    return ctorFunc;\n}\n//# sourceMappingURL=createErrorClass.js.map","import { createErrorClass } from './createErrorClass';\nexport var UnsubscriptionError = createErrorClass(function (_super) {\n    return function UnsubscriptionErrorImpl(errors) {\n        _super(this);\n        this.message = errors\n            ? errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n  ')\n            : '';\n        this.name = 'UnsubscriptionError';\n        this.errors = errors;\n    };\n});\n//# sourceMappingURL=UnsubscriptionError.js.map","export function arrRemove(arr, item) {\n    if (arr) {\n        var index = arr.indexOf(item);\n        0 <= index && arr.splice(index, 1);\n    }\n}\n//# sourceMappingURL=arrRemove.js.map","import { __read, __spreadArray, __values } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { arrRemove } from './util/arrRemove';\nvar Subscription = (function () {\n    function Subscription(initialTeardown) {\n        this.initialTeardown = initialTeardown;\n        this.closed = false;\n        this._parentage = null;\n        this._finalizers = null;\n    }\n    Subscription.prototype.unsubscribe = function () {\n        var e_1, _a, e_2, _b;\n        var errors;\n        if (!this.closed) {\n            this.closed = true;\n            var _parentage = this._parentage;\n            if (_parentage) {\n                this._parentage = null;\n                if (Array.isArray(_parentage)) {\n                    try {\n                        for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {\n                            var parent_1 = _parentage_1_1.value;\n                            parent_1.remove(this);\n                        }\n                    }\n                    catch (e_1_1) { e_1 = { error: e_1_1 }; }\n                    finally {\n                        try {\n                            if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);\n                        }\n                        finally { if (e_1) throw e_1.error; }\n                    }\n                }\n                else {\n                    _parentage.remove(this);\n                }\n            }\n            var initialFinalizer = this.initialTeardown;\n            if (isFunction(initialFinalizer)) {\n                try {\n                    initialFinalizer();\n                }\n                catch (e) {\n                    errors = e instanceof UnsubscriptionError ? e.errors : [e];\n                }\n            }\n            var _finalizers = this._finalizers;\n            if (_finalizers) {\n                this._finalizers = null;\n                try {\n                    for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {\n                        var finalizer = _finalizers_1_1.value;\n                        try {\n                            execFinalizer(finalizer);\n                        }\n                        catch (err) {\n                            errors = errors !== null && errors !== void 0 ? errors : [];\n                            if (err instanceof UnsubscriptionError) {\n                                errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));\n                            }\n                            else {\n                                errors.push(err);\n                            }\n                        }\n                    }\n                }\n                catch (e_2_1) { e_2 = { error: e_2_1 }; }\n                finally {\n                    try {\n                        if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);\n                    }\n                    finally { if (e_2) throw e_2.error; }\n                }\n            }\n            if (errors) {\n                throw new UnsubscriptionError(errors);\n            }\n        }\n    };\n    Subscription.prototype.add = function (teardown) {\n        var _a;\n        if (teardown && teardown !== this) {\n            if (this.closed) {\n                execFinalizer(teardown);\n            }\n            else {\n                if (teardown instanceof Subscription) {\n                    if (teardown.closed || teardown._hasParent(this)) {\n                        return;\n                    }\n                    teardown._addParent(this);\n                }\n                (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);\n            }\n        }\n    };\n    Subscription.prototype._hasParent = function (parent) {\n        var _parentage = this._parentage;\n        return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n    };\n    Subscription.prototype._addParent = function (parent) {\n        var _parentage = this._parentage;\n        this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n    };\n    Subscription.prototype._removeParent = function (parent) {\n        var _parentage = this._parentage;\n        if (_parentage === parent) {\n            this._parentage = null;\n        }\n        else if (Array.isArray(_parentage)) {\n            arrRemove(_parentage, parent);\n        }\n    };\n    Subscription.prototype.remove = function (teardown) {\n        var _finalizers = this._finalizers;\n        _finalizers && arrRemove(_finalizers, teardown);\n        if (teardown instanceof Subscription) {\n            teardown._removeParent(this);\n        }\n    };\n    Subscription.EMPTY = (function () {\n        var empty = new Subscription();\n        empty.closed = true;\n        return empty;\n    })();\n    return Subscription;\n}());\nexport { Subscription };\nexport var EMPTY_SUBSCRIPTION = Subscription.EMPTY;\nexport function isSubscription(value) {\n    return (value instanceof Subscription ||\n        (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe)));\n}\nfunction execFinalizer(finalizer) {\n    if (isFunction(finalizer)) {\n        finalizer();\n    }\n    else {\n        finalizer.unsubscribe();\n    }\n}\n//# sourceMappingURL=Subscription.js.map","export var config = {\n    onUnhandledError: null,\n    onStoppedNotification: null,\n    Promise: undefined,\n    useDeprecatedSynchronousErrorHandling: false,\n    useDeprecatedNextContext: false,\n};\n//# sourceMappingURL=config.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var timeoutProvider = {\n    setTimeout: function (handler, timeout) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        var delegate = timeoutProvider.delegate;\n        if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {\n            return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n        }\n        return setTimeout.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n    },\n    clearTimeout: function (handle) {\n        var delegate = timeoutProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);\n    },\n    delegate: undefined,\n};\n//# sourceMappingURL=timeoutProvider.js.map","import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\nexport function reportUnhandledError(err) {\n    timeoutProvider.setTimeout(function () {\n        var onUnhandledError = config.onUnhandledError;\n        if (onUnhandledError) {\n            onUnhandledError(err);\n        }\n        else {\n            throw err;\n        }\n    });\n}\n//# sourceMappingURL=reportUnhandledError.js.map","export function noop() { }\n//# sourceMappingURL=noop.js.map","import { config } from '../config';\nvar context = null;\nexport function errorContext(cb) {\n    if (config.useDeprecatedSynchronousErrorHandling) {\n        var isRoot = !context;\n        if (isRoot) {\n            context = { errorThrown: false, error: null };\n        }\n        cb();\n        if (isRoot) {\n            var _a = context, errorThrown = _a.errorThrown, error = _a.error;\n            context = null;\n            if (errorThrown) {\n                throw error;\n            }\n        }\n    }\n    else {\n        cb();\n    }\n}\nexport function captureError(err) {\n    if (config.useDeprecatedSynchronousErrorHandling && context) {\n        context.errorThrown = true;\n        context.error = err;\n    }\n}\n//# sourceMappingURL=errorContext.js.map","import { __extends } from \"tslib\";\nimport { isFunction } from './util/isFunction';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\nvar Subscriber = (function (_super) {\n    __extends(Subscriber, _super);\n    function Subscriber(destination) {\n        var _this = _super.call(this) || this;\n        _this.isStopped = false;\n        if (destination) {\n            _this.destination = destination;\n            if (isSubscription(destination)) {\n                destination.add(_this);\n            }\n        }\n        else {\n            _this.destination = EMPTY_OBSERVER;\n        }\n        return _this;\n    }\n    Subscriber.create = function (next, error, complete) {\n        return new SafeSubscriber(next, error, complete);\n    };\n    Subscriber.prototype.next = function (value) {\n        if (this.isStopped) {\n            handleStoppedNotification(nextNotification(value), this);\n        }\n        else {\n            this._next(value);\n        }\n    };\n    Subscriber.prototype.error = function (err) {\n        if (this.isStopped) {\n            handleStoppedNotification(errorNotification(err), this);\n        }\n        else {\n            this.isStopped = true;\n            this._error(err);\n        }\n    };\n    Subscriber.prototype.complete = function () {\n        if (this.isStopped) {\n            handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n        }\n        else {\n            this.isStopped = true;\n            this._complete();\n        }\n    };\n    Subscriber.prototype.unsubscribe = function () {\n        if (!this.closed) {\n            this.isStopped = true;\n            _super.prototype.unsubscribe.call(this);\n            this.destination = null;\n        }\n    };\n    Subscriber.prototype._next = function (value) {\n        this.destination.next(value);\n    };\n    Subscriber.prototype._error = function (err) {\n        try {\n            this.destination.error(err);\n        }\n        finally {\n            this.unsubscribe();\n        }\n    };\n    Subscriber.prototype._complete = function () {\n        try {\n            this.destination.complete();\n        }\n        finally {\n            this.unsubscribe();\n        }\n    };\n    return Subscriber;\n}(Subscription));\nexport { Subscriber };\nvar _bind = Function.prototype.bind;\nfunction bind(fn, thisArg) {\n    return _bind.call(fn, thisArg);\n}\nvar ConsumerObserver = (function () {\n    function ConsumerObserver(partialObserver) {\n        this.partialObserver = partialObserver;\n    }\n    ConsumerObserver.prototype.next = function (value) {\n        var partialObserver = this.partialObserver;\n        if (partialObserver.next) {\n            try {\n                partialObserver.next(value);\n            }\n            catch (error) {\n                handleUnhandledError(error);\n            }\n        }\n    };\n    ConsumerObserver.prototype.error = function (err) {\n        var partialObserver = this.partialObserver;\n        if (partialObserver.error) {\n            try {\n                partialObserver.error(err);\n            }\n            catch (error) {\n                handleUnhandledError(error);\n            }\n        }\n        else {\n            handleUnhandledError(err);\n        }\n    };\n    ConsumerObserver.prototype.complete = function () {\n        var partialObserver = this.partialObserver;\n        if (partialObserver.complete) {\n            try {\n                partialObserver.complete();\n            }\n            catch (error) {\n                handleUnhandledError(error);\n            }\n        }\n    };\n    return ConsumerObserver;\n}());\nvar SafeSubscriber = (function (_super) {\n    __extends(SafeSubscriber, _super);\n    function SafeSubscriber(observerOrNext, error, complete) {\n        var _this = _super.call(this) || this;\n        var partialObserver;\n        if (isFunction(observerOrNext) || !observerOrNext) {\n            partialObserver = {\n                next: (observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : undefined),\n                error: error !== null && error !== void 0 ? error : undefined,\n                complete: complete !== null && complete !== void 0 ? complete : undefined,\n            };\n        }\n        else {\n            var context_1;\n            if (_this && config.useDeprecatedNextContext) {\n                context_1 = Object.create(observerOrNext);\n                context_1.unsubscribe = function () { return _this.unsubscribe(); };\n                partialObserver = {\n                    next: observerOrNext.next && bind(observerOrNext.next, context_1),\n                    error: observerOrNext.error && bind(observerOrNext.error, context_1),\n                    complete: observerOrNext.complete && bind(observerOrNext.complete, context_1),\n                };\n            }\n            else {\n                partialObserver = observerOrNext;\n            }\n        }\n        _this.destination = new ConsumerObserver(partialObserver);\n        return _this;\n    }\n    return SafeSubscriber;\n}(Subscriber));\nexport { SafeSubscriber };\nfunction handleUnhandledError(error) {\n    if (config.useDeprecatedSynchronousErrorHandling) {\n        captureError(error);\n    }\n    else {\n        reportUnhandledError(error);\n    }\n}\nfunction defaultErrorHandler(err) {\n    throw err;\n}\nfunction handleStoppedNotification(notification, subscriber) {\n    var onStoppedNotification = config.onStoppedNotification;\n    onStoppedNotification && timeoutProvider.setTimeout(function () { return onStoppedNotification(notification, subscriber); });\n}\nexport var EMPTY_OBSERVER = {\n    closed: true,\n    next: noop,\n    error: defaultErrorHandler,\n    complete: noop,\n};\n//# sourceMappingURL=Subscriber.js.map","export var observable = (function () { return (typeof Symbol === 'function' && Symbol.observable) || '@@observable'; })();\n//# sourceMappingURL=observable.js.map","export function identity(x) {\n    return x;\n}\n//# sourceMappingURL=identity.js.map","import { identity } from './identity';\nexport function pipe() {\n    var fns = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        fns[_i] = arguments[_i];\n    }\n    return pipeFromArray(fns);\n}\nexport function pipeFromArray(fns) {\n    if (fns.length === 0) {\n        return identity;\n    }\n    if (fns.length === 1) {\n        return fns[0];\n    }\n    return function piped(input) {\n        return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n    };\n}\n//# sourceMappingURL=pipe.js.map","import { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription } from './Subscription';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\nvar Observable = (function () {\n    function Observable(subscribe) {\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var _this = this;\n        var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n        errorContext(function () {\n            var _a = _this, operator = _a.operator, source = _a.source;\n            subscriber.add(operator\n                ?\n                    operator.call(subscriber, source)\n                : source\n                    ?\n                        _this._subscribe(subscriber)\n                    :\n                        _this._trySubscribe(subscriber));\n        });\n        return subscriber;\n    };\n    Observable.prototype._trySubscribe = function (sink) {\n        try {\n            return this._subscribe(sink);\n        }\n        catch (err) {\n            sink.error(err);\n        }\n    };\n    Observable.prototype.forEach = function (next, promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var subscriber = new SafeSubscriber({\n                next: function (value) {\n                    try {\n                        next(value);\n                    }\n                    catch (err) {\n                        reject(err);\n                        subscriber.unsubscribe();\n                    }\n                },\n                error: reject,\n                complete: resolve,\n            });\n            _this.subscribe(subscriber);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        var _a;\n        return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);\n    };\n    Observable.prototype[Symbol_observable] = function () {\n        return this;\n    };\n    Observable.prototype.pipe = function () {\n        var operations = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            operations[_i] = arguments[_i];\n        }\n        return pipeFromArray(operations)(this);\n    };\n    Observable.prototype.toPromise = function (promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var value;\n            _this.subscribe(function (x) { return (value = x); }, function (err) { return reject(err); }, function () { return resolve(value); });\n        });\n    };\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\nexport { Observable };\nfunction getPromiseCtor(promiseCtor) {\n    var _a;\n    return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;\n}\nfunction isObserver(value) {\n    return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\nfunction isSubscriber(value) {\n    return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n//# sourceMappingURL=Observable.js.map","import { isFunction } from './isFunction';\nexport function hasLift(source) {\n    return isFunction(source === null || source === void 0 ? void 0 : source.lift);\n}\nexport function operate(init) {\n    return function (source) {\n        if (hasLift(source)) {\n            return source.lift(function (liftedSource) {\n                try {\n                    return init(liftedSource, this);\n                }\n                catch (err) {\n                    this.error(err);\n                }\n            });\n        }\n        throw new TypeError('Unable to lift unknown Observable type');\n    };\n}\n//# sourceMappingURL=lift.js.map","import { __extends } from \"tslib\";\nimport { Subscriber } from '../Subscriber';\nexport function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {\n    return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\nvar OperatorSubscriber = (function (_super) {\n    __extends(OperatorSubscriber, _super);\n    function OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {\n        var _this = _super.call(this, destination) || this;\n        _this.onFinalize = onFinalize;\n        _this.shouldUnsubscribe = shouldUnsubscribe;\n        _this._next = onNext\n            ? function (value) {\n                try {\n                    onNext(value);\n                }\n                catch (err) {\n                    destination.error(err);\n                }\n            }\n            : _super.prototype._next;\n        _this._error = onError\n            ? function (err) {\n                try {\n                    onError(err);\n                }\n                catch (err) {\n                    destination.error(err);\n                }\n                finally {\n                    this.unsubscribe();\n                }\n            }\n            : _super.prototype._error;\n        _this._complete = onComplete\n            ? function () {\n                try {\n                    onComplete();\n                }\n                catch (err) {\n                    destination.error(err);\n                }\n                finally {\n                    this.unsubscribe();\n                }\n            }\n            : _super.prototype._complete;\n        return _this;\n    }\n    OperatorSubscriber.prototype.unsubscribe = function () {\n        var _a;\n        if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n            var closed_1 = this.closed;\n            _super.prototype.unsubscribe.call(this);\n            !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));\n        }\n    };\n    return OperatorSubscriber;\n}(Subscriber));\nexport { OperatorSubscriber };\n//# sourceMappingURL=OperatorSubscriber.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { Subscription } from '../Subscription';\nexport var animationFrameProvider = {\n    schedule: function (callback) {\n        var request = requestAnimationFrame;\n        var cancel = cancelAnimationFrame;\n        var delegate = animationFrameProvider.delegate;\n        if (delegate) {\n            request = delegate.requestAnimationFrame;\n            cancel = delegate.cancelAnimationFrame;\n        }\n        var handle = request(function (timestamp) {\n            cancel = undefined;\n            callback(timestamp);\n        });\n        return new Subscription(function () { return cancel === null || cancel === void 0 ? void 0 : cancel(handle); });\n    },\n    requestAnimationFrame: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var delegate = animationFrameProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));\n    },\n    cancelAnimationFrame: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var delegate = animationFrameProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));\n    },\n    delegate: undefined,\n};\n//# sourceMappingURL=animationFrameProvider.js.map","import { createErrorClass } from './createErrorClass';\nexport var ObjectUnsubscribedError = createErrorClass(function (_super) {\n    return function ObjectUnsubscribedErrorImpl() {\n        _super(this);\n        this.name = 'ObjectUnsubscribedError';\n        this.message = 'object unsubscribed';\n    };\n});\n//# sourceMappingURL=ObjectUnsubscribedError.js.map","import { __extends, __values } from \"tslib\";\nimport { Observable } from './Observable';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\nvar Subject = (function (_super) {\n    __extends(Subject, _super);\n    function Subject() {\n        var _this = _super.call(this) || this;\n        _this.closed = false;\n        _this.currentObservers = null;\n        _this.observers = [];\n        _this.isStopped = false;\n        _this.hasError = false;\n        _this.thrownError = null;\n        return _this;\n    }\n    Subject.prototype.lift = function (operator) {\n        var subject = new AnonymousSubject(this, this);\n        subject.operator = operator;\n        return subject;\n    };\n    Subject.prototype._throwIfClosed = function () {\n        if (this.closed) {\n            throw new ObjectUnsubscribedError();\n        }\n    };\n    Subject.prototype.next = function (value) {\n        var _this = this;\n        errorContext(function () {\n            var e_1, _a;\n            _this._throwIfClosed();\n            if (!_this.isStopped) {\n                if (!_this.currentObservers) {\n                    _this.currentObservers = Array.from(_this.observers);\n                }\n                try {\n                    for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {\n                        var observer = _c.value;\n                        observer.next(value);\n                    }\n                }\n                catch (e_1_1) { e_1 = { error: e_1_1 }; }\n                finally {\n                    try {\n                        if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n                    }\n                    finally { if (e_1) throw e_1.error; }\n                }\n            }\n        });\n    };\n    Subject.prototype.error = function (err) {\n        var _this = this;\n        errorContext(function () {\n            _this._throwIfClosed();\n            if (!_this.isStopped) {\n                _this.hasError = _this.isStopped = true;\n                _this.thrownError = err;\n                var observers = _this.observers;\n                while (observers.length) {\n                    observers.shift().error(err);\n                }\n            }\n        });\n    };\n    Subject.prototype.complete = function () {\n        var _this = this;\n        errorContext(function () {\n            _this._throwIfClosed();\n            if (!_this.isStopped) {\n                _this.isStopped = true;\n                var observers = _this.observers;\n                while (observers.length) {\n                    observers.shift().complete();\n                }\n            }\n        });\n    };\n    Subject.prototype.unsubscribe = function () {\n        this.isStopped = this.closed = true;\n        this.observers = this.currentObservers = null;\n    };\n    Object.defineProperty(Subject.prototype, \"observed\", {\n        get: function () {\n            var _a;\n            return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    Subject.prototype._trySubscribe = function (subscriber) {\n        this._throwIfClosed();\n        return _super.prototype._trySubscribe.call(this, subscriber);\n    };\n    Subject.prototype._subscribe = function (subscriber) {\n        this._throwIfClosed();\n        this._checkFinalizedStatuses(subscriber);\n        return this._innerSubscribe(subscriber);\n    };\n    Subject.prototype._innerSubscribe = function (subscriber) {\n        var _this = this;\n        var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;\n        if (hasError || isStopped) {\n            return EMPTY_SUBSCRIPTION;\n        }\n        this.currentObservers = null;\n        observers.push(subscriber);\n        return new Subscription(function () {\n            _this.currentObservers = null;\n            arrRemove(observers, subscriber);\n        });\n    };\n    Subject.prototype._checkFinalizedStatuses = function (subscriber) {\n        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;\n        if (hasError) {\n            subscriber.error(thrownError);\n        }\n        else if (isStopped) {\n            subscriber.complete();\n        }\n    };\n    Subject.prototype.asObservable = function () {\n        var observable = new Observable();\n        observable.source = this;\n        return observable;\n    };\n    Subject.create = function (destination, source) {\n        return new AnonymousSubject(destination, source);\n    };\n    return Subject;\n}(Observable));\nexport { Subject };\nvar AnonymousSubject = (function (_super) {\n    __extends(AnonymousSubject, _super);\n    function AnonymousSubject(destination, source) {\n        var _this = _super.call(this) || this;\n        _this.destination = destination;\n        _this.source = source;\n        return _this;\n    }\n    AnonymousSubject.prototype.next = function (value) {\n        var _a, _b;\n        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);\n    };\n    AnonymousSubject.prototype.error = function (err) {\n        var _a, _b;\n        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);\n    };\n    AnonymousSubject.prototype.complete = function () {\n        var _a, _b;\n        (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);\n    };\n    AnonymousSubject.prototype._subscribe = function (subscriber) {\n        var _a, _b;\n        return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;\n    };\n    return AnonymousSubject;\n}(Subject));\nexport { AnonymousSubject };\n//# sourceMappingURL=Subject.js.map","import { __extends } from \"tslib\";\nimport { Subject } from './Subject';\nvar BehaviorSubject = (function (_super) {\n    __extends(BehaviorSubject, _super);\n    function BehaviorSubject(_value) {\n        var _this = _super.call(this) || this;\n        _this._value = _value;\n        return _this;\n    }\n    Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n        get: function () {\n            return this.getValue();\n        },\n        enumerable: false,\n        configurable: true\n    });\n    BehaviorSubject.prototype._subscribe = function (subscriber) {\n        var subscription = _super.prototype._subscribe.call(this, subscriber);\n        !subscription.closed && subscriber.next(this._value);\n        return subscription;\n    };\n    BehaviorSubject.prototype.getValue = function () {\n        var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;\n        if (hasError) {\n            throw thrownError;\n        }\n        this._throwIfClosed();\n        return _value;\n    };\n    BehaviorSubject.prototype.next = function (value) {\n        _super.prototype.next.call(this, (this._value = value));\n    };\n    return BehaviorSubject;\n}(Subject));\nexport { BehaviorSubject };\n//# sourceMappingURL=BehaviorSubject.js.map","export var dateTimestampProvider = {\n    now: function () {\n        return (dateTimestampProvider.delegate || Date).now();\n    },\n    delegate: undefined,\n};\n//# sourceMappingURL=dateTimestampProvider.js.map","import { __extends } from \"tslib\";\nimport { Subject } from './Subject';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar ReplaySubject = (function (_super) {\n    __extends(ReplaySubject, _super);\n    function ReplaySubject(_bufferSize, _windowTime, _timestampProvider) {\n        if (_bufferSize === void 0) { _bufferSize = Infinity; }\n        if (_windowTime === void 0) { _windowTime = Infinity; }\n        if (_timestampProvider === void 0) { _timestampProvider = dateTimestampProvider; }\n        var _this = _super.call(this) || this;\n        _this._bufferSize = _bufferSize;\n        _this._windowTime = _windowTime;\n        _this._timestampProvider = _timestampProvider;\n        _this._buffer = [];\n        _this._infiniteTimeWindow = true;\n        _this._infiniteTimeWindow = _windowTime === Infinity;\n        _this._bufferSize = Math.max(1, _bufferSize);\n        _this._windowTime = Math.max(1, _windowTime);\n        return _this;\n    }\n    ReplaySubject.prototype.next = function (value) {\n        var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;\n        if (!isStopped) {\n            _buffer.push(value);\n            !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n        }\n        this._trimBuffer();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        this._throwIfClosed();\n        this._trimBuffer();\n        var subscription = this._innerSubscribe(subscriber);\n        var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;\n        var copy = _buffer.slice();\n        for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n            subscriber.next(copy[i]);\n        }\n        this._checkFinalizedStatuses(subscriber);\n        return subscription;\n    };\n    ReplaySubject.prototype._trimBuffer = function () {\n        var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;\n        var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n        _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n        if (!_infiniteTimeWindow) {\n            var now = _timestampProvider.now();\n            var last = 0;\n            for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {\n                last = i;\n            }\n            last && _buffer.splice(0, last + 1);\n        }\n    };\n    return ReplaySubject;\n}(Subject));\nexport { ReplaySubject };\n//# sourceMappingURL=ReplaySubject.js.map","import { __extends } from \"tslib\";\nimport { Subscription } from '../Subscription';\nvar Action = (function (_super) {\n    __extends(Action, _super);\n    function Action(scheduler, work) {\n        return _super.call(this) || this;\n    }\n    Action.prototype.schedule = function (state, delay) {\n        if (delay === void 0) { delay = 0; }\n        return this;\n    };\n    return Action;\n}(Subscription));\nexport { Action };\n//# sourceMappingURL=Action.js.map","import { __read, __spreadArray } from \"tslib\";\nexport var intervalProvider = {\n    setInterval: function (handler, timeout) {\n        var args = [];\n        for (var _i = 2; _i < arguments.length; _i++) {\n            args[_i - 2] = arguments[_i];\n        }\n        var delegate = intervalProvider.delegate;\n        if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {\n            return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout], __read(args)));\n        }\n        return setInterval.apply(void 0, __spreadArray([handler, timeout], __read(args)));\n    },\n    clearInterval: function (handle) {\n        var delegate = intervalProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);\n    },\n    delegate: undefined,\n};\n//# sourceMappingURL=intervalProvider.js.map","import { __extends } from \"tslib\";\nimport { Action } from './Action';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nvar AsyncAction = (function (_super) {\n    __extends(AsyncAction, _super);\n    function AsyncAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        _this.pending = false;\n        return _this;\n    }\n    AsyncAction.prototype.schedule = function (state, delay) {\n        var _a;\n        if (delay === void 0) { delay = 0; }\n        if (this.closed) {\n            return this;\n        }\n        this.state = state;\n        var id = this.id;\n        var scheduler = this.scheduler;\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, delay);\n        }\n        this.pending = true;\n        this.delay = delay;\n        this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay);\n        return this;\n    };\n    AsyncAction.prototype.requestAsyncId = function (scheduler, _id, delay) {\n        if (delay === void 0) { delay = 0; }\n        return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n    };\n    AsyncAction.prototype.recycleAsyncId = function (_scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay != null && this.delay === delay && this.pending === false) {\n            return id;\n        }\n        if (id != null) {\n            intervalProvider.clearInterval(id);\n        }\n        return undefined;\n    };\n    AsyncAction.prototype.execute = function (state, delay) {\n        if (this.closed) {\n            return new Error('executing a cancelled action');\n        }\n        this.pending = false;\n        var error = this._execute(state, delay);\n        if (error) {\n            return error;\n        }\n        else if (this.pending === false && this.id != null) {\n            this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n        }\n    };\n    AsyncAction.prototype._execute = function (state, _delay) {\n        var errored = false;\n        var errorValue;\n        try {\n            this.work(state);\n        }\n        catch (e) {\n            errored = true;\n            errorValue = e ? e : new Error('Scheduled action threw falsy error');\n        }\n        if (errored) {\n            this.unsubscribe();\n            return errorValue;\n        }\n    };\n    AsyncAction.prototype.unsubscribe = function () {\n        if (!this.closed) {\n            var _a = this, id = _a.id, scheduler = _a.scheduler;\n            var actions = scheduler.actions;\n            this.work = this.state = this.scheduler = null;\n            this.pending = false;\n            arrRemove(actions, this);\n            if (id != null) {\n                this.id = this.recycleAsyncId(scheduler, id, null);\n            }\n            this.delay = null;\n            _super.prototype.unsubscribe.call(this);\n        }\n    };\n    return AsyncAction;\n}(Action));\nexport { AsyncAction };\n//# sourceMappingURL=AsyncAction.js.map","var nextHandle = 1;\nvar resolved;\nvar activeHandles = {};\nfunction findAndClearHandle(handle) {\n    if (handle in activeHandles) {\n        delete activeHandles[handle];\n        return true;\n    }\n    return false;\n}\nexport var Immediate = {\n    setImmediate: function (cb) {\n        var handle = nextHandle++;\n        activeHandles[handle] = true;\n        if (!resolved) {\n            resolved = Promise.resolve();\n        }\n        resolved.then(function () { return findAndClearHandle(handle) && cb(); });\n        return handle;\n    },\n    clearImmediate: function (handle) {\n        findAndClearHandle(handle);\n    },\n};\nexport var TestTools = {\n    pending: function () {\n        return Object.keys(activeHandles).length;\n    }\n};\n//# sourceMappingURL=Immediate.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { Immediate } from '../util/Immediate';\nvar setImmediate = Immediate.setImmediate, clearImmediate = Immediate.clearImmediate;\nexport var immediateProvider = {\n    setImmediate: function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var delegate = immediateProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));\n    },\n    clearImmediate: function (handle) {\n        var delegate = immediateProvider.delegate;\n        return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);\n    },\n    delegate: undefined,\n};\n//# sourceMappingURL=immediateProvider.js.map","import { __extends } from \"tslib\";\nimport { AsyncAction } from './AsyncAction';\nimport { immediateProvider } from './immediateProvider';\nvar AsapAction = (function (_super) {\n    __extends(AsapAction, _super);\n    function AsapAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, undefined)));\n    };\n    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        var _a;\n        if (delay === void 0) { delay = 0; }\n        if (delay != null ? delay > 0 : this.delay > 0) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        var actions = scheduler.actions;\n        if (id != null && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {\n            immediateProvider.clearImmediate(id);\n            if (scheduler._scheduled === id) {\n                scheduler._scheduled = undefined;\n            }\n        }\n        return undefined;\n    };\n    return AsapAction;\n}(AsyncAction));\nexport { AsapAction };\n//# sourceMappingURL=AsapAction.js.map","import { dateTimestampProvider } from './scheduler/dateTimestampProvider';\nvar Scheduler = (function () {\n    function Scheduler(schedulerActionCtor, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        this.schedulerActionCtor = schedulerActionCtor;\n        this.now = now;\n    }\n    Scheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) { delay = 0; }\n        return new this.schedulerActionCtor(this, work).schedule(state, delay);\n    };\n    Scheduler.now = dateTimestampProvider.now;\n    return Scheduler;\n}());\nexport { Scheduler };\n//# sourceMappingURL=Scheduler.js.map","import { __extends } from \"tslib\";\nimport { Scheduler } from '../Scheduler';\nvar AsyncScheduler = (function (_super) {\n    __extends(AsyncScheduler, _super);\n    function AsyncScheduler(SchedulerAction, now) {\n        if (now === void 0) { now = Scheduler.now; }\n        var _this = _super.call(this, SchedulerAction, now) || this;\n        _this.actions = [];\n        _this._active = false;\n        return _this;\n    }\n    AsyncScheduler.prototype.flush = function (action) {\n        var actions = this.actions;\n        if (this._active) {\n            actions.push(action);\n            return;\n        }\n        var error;\n        this._active = true;\n        do {\n            if ((error = action.execute(action.state, action.delay))) {\n                break;\n            }\n        } while ((action = actions.shift()));\n        this._active = false;\n        if (error) {\n            while ((action = actions.shift())) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsyncScheduler;\n}(Scheduler));\nexport { AsyncScheduler };\n//# sourceMappingURL=AsyncScheduler.js.map","import { __extends } from \"tslib\";\nimport { AsyncScheduler } from './AsyncScheduler';\nvar AsapScheduler = (function (_super) {\n    __extends(AsapScheduler, _super);\n    function AsapScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AsapScheduler.prototype.flush = function (action) {\n        this._active = true;\n        var flushId = this._scheduled;\n        this._scheduled = undefined;\n        var actions = this.actions;\n        var error;\n        action = action || actions.shift();\n        do {\n            if ((error = action.execute(action.state, action.delay))) {\n                break;\n            }\n        } while ((action = actions[0]) && action.id === flushId && actions.shift());\n        this._active = false;\n        if (error) {\n            while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsapScheduler;\n}(AsyncScheduler));\nexport { AsapScheduler };\n//# sourceMappingURL=AsapScheduler.js.map","import { AsapAction } from './AsapAction';\nimport { AsapScheduler } from './AsapScheduler';\nexport var asapScheduler = new AsapScheduler(AsapAction);\nexport var asap = asapScheduler;\n//# sourceMappingURL=asap.js.map","import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\nexport var asyncScheduler = new AsyncScheduler(AsyncAction);\nexport var async = asyncScheduler;\n//# sourceMappingURL=async.js.map","import { __extends } from \"tslib\";\nimport { AsyncAction } from './AsyncAction';\nimport { animationFrameProvider } from './animationFrameProvider';\nvar AnimationFrameAction = (function (_super) {\n    __extends(AnimationFrameAction, _super);\n    function AnimationFrameAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) { delay = 0; }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(function () { return scheduler.flush(undefined); }));\n    };\n    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        var _a;\n        if (delay === void 0) { delay = 0; }\n        if (delay != null ? delay > 0 : this.delay > 0) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        var actions = scheduler.actions;\n        if (id != null && id === scheduler._scheduled && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {\n            animationFrameProvider.cancelAnimationFrame(id);\n            scheduler._scheduled = undefined;\n        }\n        return undefined;\n    };\n    return AnimationFrameAction;\n}(AsyncAction));\nexport { AnimationFrameAction };\n//# sourceMappingURL=AnimationFrameAction.js.map","import { __extends } from \"tslib\";\nimport { AsyncScheduler } from './AsyncScheduler';\nvar AnimationFrameScheduler = (function (_super) {\n    __extends(AnimationFrameScheduler, _super);\n    function AnimationFrameScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AnimationFrameScheduler.prototype.flush = function (action) {\n        this._active = true;\n        var flushId;\n        if (action) {\n            flushId = action.id;\n        }\n        else {\n            flushId = this._scheduled;\n            this._scheduled = undefined;\n        }\n        var actions = this.actions;\n        var error;\n        action = action || actions.shift();\n        do {\n            if ((error = action.execute(action.state, action.delay))) {\n                break;\n            }\n        } while ((action = actions[0]) && action.id === flushId && actions.shift());\n        this._active = false;\n        if (error) {\n            while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AnimationFrameScheduler;\n}(AsyncScheduler));\nexport { AnimationFrameScheduler };\n//# sourceMappingURL=AnimationFrameScheduler.js.map","import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nexport var animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\nexport var animationFrame = animationFrameScheduler;\n//# sourceMappingURL=animationFrame.js.map","import { Observable } from '../Observable';\nexport var EMPTY = new Observable(function (subscriber) { return subscriber.complete(); });\nexport function empty(scheduler) {\n    return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n    return new Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map","import { isFunction } from './isFunction';\nexport function isScheduler(value) {\n    return value && isFunction(value.schedule);\n}\n//# sourceMappingURL=isScheduler.js.map","import { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\nfunction last(arr) {\n    return arr[arr.length - 1];\n}\nexport function popResultSelector(args) {\n    return isFunction(last(args)) ? args.pop() : undefined;\n}\nexport function popScheduler(args) {\n    return isScheduler(last(args)) ? args.pop() : undefined;\n}\nexport function popNumber(args, defaultValue) {\n    return typeof last(args) === 'number' ? args.pop() : defaultValue;\n}\n//# sourceMappingURL=args.js.map","export var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map","import { isFunction } from \"./isFunction\";\nexport function isPromise(value) {\n    return isFunction(value === null || value === void 0 ? void 0 : value.then);\n}\n//# sourceMappingURL=isPromise.js.map","import { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\nexport function isInteropObservable(input) {\n    return isFunction(input[Symbol_observable]);\n}\n//# sourceMappingURL=isInteropObservable.js.map","import { isFunction } from './isFunction';\nexport function isAsyncIterable(obj) {\n    return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);\n}\n//# sourceMappingURL=isAsyncIterable.js.map","export function createInvalidObservableTypeError(input) {\n    return new TypeError(\"You provided \" + (input !== null && typeof input === 'object' ? 'an invalid object' : \"'\" + input + \"'\") + \" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.\");\n}\n//# sourceMappingURL=throwUnobservableError.js.map","export function getSymbolIterator() {\n    if (typeof Symbol !== 'function' || !Symbol.iterator) {\n        return '@@iterator';\n    }\n    return Symbol.iterator;\n}\nexport var iterator = getSymbolIterator();\n//# sourceMappingURL=iterator.js.map","import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\nexport function isIterable(input) {\n    return isFunction(input === null || input === void 0 ? void 0 : input[Symbol_iterator]);\n}\n//# sourceMappingURL=isIterable.js.map","import { __asyncGenerator, __await, __generator } from \"tslib\";\nimport { isFunction } from './isFunction';\nexport function readableStreamLikeToAsyncGenerator(readableStream) {\n    return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {\n        var reader, _a, value, done;\n        return __generator(this, function (_b) {\n            switch (_b.label) {\n                case 0:\n                    reader = readableStream.getReader();\n                    _b.label = 1;\n                case 1:\n                    _b.trys.push([1, , 9, 10]);\n                    _b.label = 2;\n                case 2:\n                    if (!true) return [3, 8];\n                    return [4, __await(reader.read())];\n                case 3:\n                    _a = _b.sent(), value = _a.value, done = _a.done;\n                    if (!done) return [3, 5];\n                    return [4, __await(void 0)];\n                case 4: return [2, _b.sent()];\n                case 5: return [4, __await(value)];\n                case 6: return [4, _b.sent()];\n                case 7:\n                    _b.sent();\n                    return [3, 2];\n                case 8: return [3, 10];\n                case 9:\n                    reader.releaseLock();\n                    return [7];\n                case 10: return [2];\n            }\n        });\n    });\n}\nexport function isReadableStreamLike(obj) {\n    return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);\n}\n//# sourceMappingURL=isReadableStreamLike.js.map","import { __asyncValues, __awaiter, __generator, __values } from \"tslib\";\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isPromise } from '../util/isPromise';\nimport { Observable } from '../Observable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isIterable } from '../util/isIterable';\nimport { isReadableStreamLike, readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nimport { isFunction } from '../util/isFunction';\nimport { reportUnhandledError } from '../util/reportUnhandledError';\nimport { observable as Symbol_observable } from '../symbol/observable';\nexport function innerFrom(input) {\n    if (input instanceof Observable) {\n        return input;\n    }\n    if (input != null) {\n        if (isInteropObservable(input)) {\n            return fromInteropObservable(input);\n        }\n        if (isArrayLike(input)) {\n            return fromArrayLike(input);\n        }\n        if (isPromise(input)) {\n            return fromPromise(input);\n        }\n        if (isAsyncIterable(input)) {\n            return fromAsyncIterable(input);\n        }\n        if (isIterable(input)) {\n            return fromIterable(input);\n        }\n        if (isReadableStreamLike(input)) {\n            return fromReadableStreamLike(input);\n        }\n    }\n    throw createInvalidObservableTypeError(input);\n}\nexport function fromInteropObservable(obj) {\n    return new Observable(function (subscriber) {\n        var obs = obj[Symbol_observable]();\n        if (isFunction(obs.subscribe)) {\n            return obs.subscribe(subscriber);\n        }\n        throw new TypeError('Provided object does not correctly implement Symbol.observable');\n    });\n}\nexport function fromArrayLike(array) {\n    return new Observable(function (subscriber) {\n        for (var i = 0; i < array.length && !subscriber.closed; i++) {\n            subscriber.next(array[i]);\n        }\n        subscriber.complete();\n    });\n}\nexport function fromPromise(promise) {\n    return new Observable(function (subscriber) {\n        promise\n            .then(function (value) {\n            if (!subscriber.closed) {\n                subscriber.next(value);\n                subscriber.complete();\n            }\n        }, function (err) { return subscriber.error(err); })\n            .then(null, reportUnhandledError);\n    });\n}\nexport function fromIterable(iterable) {\n    return new Observable(function (subscriber) {\n        var e_1, _a;\n        try {\n            for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {\n                var value = iterable_1_1.value;\n                subscriber.next(value);\n                if (subscriber.closed) {\n                    return;\n                }\n            }\n        }\n        catch (e_1_1) { e_1 = { error: e_1_1 }; }\n        finally {\n            try {\n                if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);\n            }\n            finally { if (e_1) throw e_1.error; }\n        }\n        subscriber.complete();\n    });\n}\nexport function fromAsyncIterable(asyncIterable) {\n    return new Observable(function (subscriber) {\n        process(asyncIterable, subscriber).catch(function (err) { return subscriber.error(err); });\n    });\n}\nexport function fromReadableStreamLike(readableStream) {\n    return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));\n}\nfunction process(asyncIterable, subscriber) {\n    var asyncIterable_1, asyncIterable_1_1;\n    var e_2, _a;\n    return __awaiter(this, void 0, void 0, function () {\n        var value, e_2_1;\n        return __generator(this, function (_b) {\n            switch (_b.label) {\n                case 0:\n                    _b.trys.push([0, 5, 6, 11]);\n                    asyncIterable_1 = __asyncValues(asyncIterable);\n                    _b.label = 1;\n                case 1: return [4, asyncIterable_1.next()];\n                case 2:\n                    if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];\n                    value = asyncIterable_1_1.value;\n                    subscriber.next(value);\n                    if (subscriber.closed) {\n                        return [2];\n                    }\n                    _b.label = 3;\n                case 3: return [3, 1];\n                case 4: return [3, 11];\n                case 5:\n                    e_2_1 = _b.sent();\n                    e_2 = { error: e_2_1 };\n                    return [3, 11];\n                case 6:\n                    _b.trys.push([6, , 9, 10]);\n                    if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];\n                    return [4, _a.call(asyncIterable_1)];\n                case 7:\n                    _b.sent();\n                    _b.label = 8;\n                case 8: return [3, 10];\n                case 9:\n                    if (e_2) throw e_2.error;\n                    return [7];\n                case 10: return [7];\n                case 11:\n                    subscriber.complete();\n                    return [2];\n            }\n        });\n    });\n}\n//# sourceMappingURL=innerFrom.js.map","export function executeSchedule(parentSubscription, scheduler, work, delay, repeat) {\n    if (delay === void 0) { delay = 0; }\n    if (repeat === void 0) { repeat = false; }\n    var scheduleSubscription = scheduler.schedule(function () {\n        work();\n        if (repeat) {\n            parentSubscription.add(this.schedule(null, delay));\n        }\n        else {\n            this.unsubscribe();\n        }\n    }, delay);\n    parentSubscription.add(scheduleSubscription);\n    if (!repeat) {\n        return scheduleSubscription;\n    }\n}\n//# sourceMappingURL=executeSchedule.js.map","import { executeSchedule } from '../util/executeSchedule';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function observeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return operate(function (source, subscriber) {\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return executeSchedule(subscriber, scheduler, function () { return subscriber.next(value); }, delay); }, function () { return executeSchedule(subscriber, scheduler, function () { return subscriber.complete(); }, delay); }, function (err) { return executeSchedule(subscriber, scheduler, function () { return subscriber.error(err); }, delay); }));\n    });\n}\n//# sourceMappingURL=observeOn.js.map","import { operate } from '../util/lift';\nexport function subscribeOn(scheduler, delay) {\n    if (delay === void 0) { delay = 0; }\n    return operate(function (source, subscriber) {\n        subscriber.add(scheduler.schedule(function () { return source.subscribe(subscriber); }, delay));\n    });\n}\n//# sourceMappingURL=subscribeOn.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function scheduleObservable(input, scheduler) {\n    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=scheduleObservable.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { observeOn } from '../operators/observeOn';\nimport { subscribeOn } from '../operators/subscribeOn';\nexport function schedulePromise(input, scheduler) {\n    return innerFrom(input).pipe(subscribeOn(scheduler), observeOn(scheduler));\n}\n//# sourceMappingURL=schedulePromise.js.map","import { Observable } from '../Observable';\nexport function scheduleArray(input, scheduler) {\n    return new Observable(function (subscriber) {\n        var i = 0;\n        return scheduler.schedule(function () {\n            if (i === input.length) {\n                subscriber.complete();\n            }\n            else {\n                subscriber.next(input[i++]);\n                if (!subscriber.closed) {\n                    this.schedule();\n                }\n            }\n        });\n    });\n}\n//# sourceMappingURL=scheduleArray.js.map","import { Observable } from '../Observable';\nimport { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from '../util/isFunction';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleIterable(input, scheduler) {\n    return new Observable(function (subscriber) {\n        var iterator;\n        executeSchedule(subscriber, scheduler, function () {\n            iterator = input[Symbol_iterator]();\n            executeSchedule(subscriber, scheduler, function () {\n                var _a;\n                var value;\n                var done;\n                try {\n                    (_a = iterator.next(), value = _a.value, done = _a.done);\n                }\n                catch (err) {\n                    subscriber.error(err);\n                    return;\n                }\n                if (done) {\n                    subscriber.complete();\n                }\n                else {\n                    subscriber.next(value);\n                }\n            }, 0, true);\n        });\n        return function () { return isFunction(iterator === null || iterator === void 0 ? void 0 : iterator.return) && iterator.return(); };\n    });\n}\n//# sourceMappingURL=scheduleIterable.js.map","import { Observable } from '../Observable';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function scheduleAsyncIterable(input, scheduler) {\n    if (!input) {\n        throw new Error('Iterable cannot be null');\n    }\n    return new Observable(function (subscriber) {\n        executeSchedule(subscriber, scheduler, function () {\n            var iterator = input[Symbol.asyncIterator]();\n            executeSchedule(subscriber, scheduler, function () {\n                iterator.next().then(function (result) {\n                    if (result.done) {\n                        subscriber.complete();\n                    }\n                    else {\n                        subscriber.next(result.value);\n                    }\n                });\n            }, 0, true);\n        });\n    });\n}\n//# sourceMappingURL=scheduleAsyncIterable.js.map","import { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { readableStreamLikeToAsyncGenerator } from '../util/isReadableStreamLike';\nexport function scheduleReadableStreamLike(input, scheduler) {\n    return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input), scheduler);\n}\n//# sourceMappingURL=scheduleReadableStreamLike.js.map","import { scheduleObservable } from './scheduleObservable';\nimport { schedulePromise } from './schedulePromise';\nimport { scheduleArray } from './scheduleArray';\nimport { scheduleIterable } from './scheduleIterable';\nimport { scheduleAsyncIterable } from './scheduleAsyncIterable';\nimport { isInteropObservable } from '../util/isInteropObservable';\nimport { isPromise } from '../util/isPromise';\nimport { isArrayLike } from '../util/isArrayLike';\nimport { isIterable } from '../util/isIterable';\nimport { isAsyncIterable } from '../util/isAsyncIterable';\nimport { createInvalidObservableTypeError } from '../util/throwUnobservableError';\nimport { isReadableStreamLike } from '../util/isReadableStreamLike';\nimport { scheduleReadableStreamLike } from './scheduleReadableStreamLike';\nexport function scheduled(input, scheduler) {\n    if (input != null) {\n        if (isInteropObservable(input)) {\n            return scheduleObservable(input, scheduler);\n        }\n        if (isArrayLike(input)) {\n            return scheduleArray(input, scheduler);\n        }\n        if (isPromise(input)) {\n            return schedulePromise(input, scheduler);\n        }\n        if (isAsyncIterable(input)) {\n            return scheduleAsyncIterable(input, scheduler);\n        }\n        if (isIterable(input)) {\n            return scheduleIterable(input, scheduler);\n        }\n        if (isReadableStreamLike(input)) {\n            return scheduleReadableStreamLike(input, scheduler);\n        }\n    }\n    throw createInvalidObservableTypeError(input);\n}\n//# sourceMappingURL=scheduled.js.map","import { scheduled } from '../scheduled/scheduled';\nimport { innerFrom } from './innerFrom';\nexport function from(input, scheduler) {\n    return scheduler ? scheduled(input, scheduler) : innerFrom(input);\n}\n//# sourceMappingURL=from.js.map","import { popScheduler } from '../util/args';\nimport { from } from './from';\nexport function of() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var scheduler = popScheduler(args);\n    return from(args, scheduler);\n}\n//# sourceMappingURL=of.js.map","import { Observable } from '../Observable';\nimport { isFunction } from '../util/isFunction';\nexport function throwError(errorOrErrorFactory, scheduler) {\n    var errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function () { return errorOrErrorFactory; };\n    var init = function (subscriber) { return subscriber.error(errorFactory()); };\n    return new Observable(scheduler ? function (subscriber) { return scheduler.schedule(init, 0, subscriber); } : init);\n}\n//# sourceMappingURL=throwError.js.map","import { createErrorClass } from './createErrorClass';\nexport var EmptyError = createErrorClass(function (_super) {\n    return function EmptyErrorImpl() {\n        _super(this);\n        this.name = 'EmptyError';\n        this.message = 'no elements in sequence';\n    };\n});\n//# sourceMappingURL=EmptyError.js.map","import { EmptyError } from './util/EmptyError';\nexport function lastValueFrom(source, config) {\n    var hasConfig = typeof config === 'object';\n    return new Promise(function (resolve, reject) {\n        var _hasValue = false;\n        var _value;\n        source.subscribe({\n            next: function (value) {\n                _value = value;\n                _hasValue = true;\n            },\n            error: reject,\n            complete: function () {\n                if (_hasValue) {\n                    resolve(_value);\n                }\n                else if (hasConfig) {\n                    resolve(config.defaultValue);\n                }\n                else {\n                    reject(new EmptyError());\n                }\n            },\n        });\n    });\n}\n//# sourceMappingURL=lastValueFrom.js.map","import { EmptyError } from './util/EmptyError';\nimport { SafeSubscriber } from './Subscriber';\nexport function firstValueFrom(source, config) {\n    var hasConfig = typeof config === 'object';\n    return new Promise(function (resolve, reject) {\n        var subscriber = new SafeSubscriber({\n            next: function (value) {\n                resolve(value);\n                subscriber.unsubscribe();\n            },\n            error: reject,\n            complete: function () {\n                if (hasConfig) {\n                    resolve(config.defaultValue);\n                }\n                else {\n                    reject(new EmptyError());\n                }\n            },\n        });\n        source.subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=firstValueFrom.js.map","export function isValidDate(value) {\n    return value instanceof Date && !isNaN(value);\n}\n//# sourceMappingURL=isDate.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { isValidDate } from '../util/isDate';\nimport { operate } from '../util/lift';\nimport { innerFrom } from '../observable/innerFrom';\nimport { createErrorClass } from '../util/createErrorClass';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport var TimeoutError = createErrorClass(function (_super) {\n    return function TimeoutErrorImpl(info) {\n        if (info === void 0) { info = null; }\n        _super(this);\n        this.message = 'Timeout has occurred';\n        this.name = 'TimeoutError';\n        this.info = info;\n    };\n});\nexport function timeout(config, schedulerArg) {\n    var _a = (isValidDate(config) ? { first: config } : typeof config === 'number' ? { each: config } : config), first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;\n    if (first == null && each == null) {\n        throw new TypeError('No timeout provided.');\n    }\n    return operate(function (source, subscriber) {\n        var originalSourceSubscription;\n        var timerSubscription;\n        var lastValue = null;\n        var seen = 0;\n        var startTimer = function (delay) {\n            timerSubscription = executeSchedule(subscriber, scheduler, function () {\n                try {\n                    originalSourceSubscription.unsubscribe();\n                    innerFrom(_with({\n                        meta: meta,\n                        lastValue: lastValue,\n                        seen: seen,\n                    })).subscribe(subscriber);\n                }\n                catch (err) {\n                    subscriber.error(err);\n                }\n            }, delay);\n        };\n        originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n            seen++;\n            subscriber.next((lastValue = value));\n            each > 0 && startTimer(each);\n        }, undefined, undefined, function () {\n            if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) {\n                timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.unsubscribe();\n            }\n            lastValue = null;\n        }));\n        !seen && startTimer(first != null ? (typeof first === 'number' ? first : +first - scheduler.now()) : each);\n    });\n}\nfunction timeoutErrorFactory(info) {\n    throw new TimeoutError(info);\n}\n//# sourceMappingURL=timeout.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function map(project, thisArg) {\n    return operate(function (source, subscriber) {\n        var index = 0;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            subscriber.next(project.call(thisArg, value, index++));\n        }));\n    });\n}\n//# sourceMappingURL=map.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { map } from \"../operators/map\";\nvar isArray = Array.isArray;\nfunction callOrApply(fn, args) {\n    return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);\n}\nexport function mapOneOrManyArgs(fn) {\n    return map(function (args) { return callOrApply(fn, args); });\n}\n//# sourceMappingURL=mapOneOrManyArgs.js.map","var isArray = Array.isArray;\nvar getPrototypeOf = Object.getPrototypeOf, objectProto = Object.prototype, getKeys = Object.keys;\nexport function argsArgArrayOrObject(args) {\n    if (args.length === 1) {\n        var first_1 = args[0];\n        if (isArray(first_1)) {\n            return { args: first_1, keys: null };\n        }\n        if (isPOJO(first_1)) {\n            var keys = getKeys(first_1);\n            return {\n                args: keys.map(function (key) { return first_1[key]; }),\n                keys: keys,\n            };\n        }\n    }\n    return { args: args, keys: null };\n}\nfunction isPOJO(obj) {\n    return obj && typeof obj === 'object' && getPrototypeOf(obj) === objectProto;\n}\n//# sourceMappingURL=argsArgArrayOrObject.js.map","export function createObject(keys, values) {\n    return keys.reduce(function (result, key, i) { return ((result[key] = values[i]), result); }, {});\n}\n//# sourceMappingURL=createObject.js.map","import { Observable } from '../Observable';\nimport { argsArgArrayOrObject } from '../util/argsArgArrayOrObject';\nimport { from } from './from';\nimport { identity } from '../util/identity';\nimport { mapOneOrManyArgs } from '../util/mapOneOrManyArgs';\nimport { popResultSelector, popScheduler } from '../util/args';\nimport { createObject } from '../util/createObject';\nimport { createOperatorSubscriber } from '../operators/OperatorSubscriber';\nimport { executeSchedule } from '../util/executeSchedule';\nexport function combineLatest() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var scheduler = popScheduler(args);\n    var resultSelector = popResultSelector(args);\n    var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;\n    if (observables.length === 0) {\n        return from([], scheduler);\n    }\n    var result = new Observable(combineLatestInit(observables, scheduler, keys\n        ?\n            function (values) { return createObject(keys, values); }\n        :\n            identity));\n    return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;\n}\nexport function combineLatestInit(observables, scheduler, valueTransform) {\n    if (valueTransform === void 0) { valueTransform = identity; }\n    return function (subscriber) {\n        maybeSchedule(scheduler, function () {\n            var length = observables.length;\n            var values = new Array(length);\n            var active = length;\n            var remainingFirstValues = length;\n            var _loop_1 = function (i) {\n                maybeSchedule(scheduler, function () {\n                    var source = from(observables[i], scheduler);\n                    var hasFirstValue = false;\n                    source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n                        values[i] = value;\n                        if (!hasFirstValue) {\n                            hasFirstValue = true;\n                            remainingFirstValues--;\n                        }\n                        if (!remainingFirstValues) {\n                            subscriber.next(valueTransform(values.slice()));\n                        }\n                    }, function () {\n                        if (!--active) {\n                            subscriber.complete();\n                        }\n                    }));\n                }, subscriber);\n            };\n            for (var i = 0; i < length; i++) {\n                _loop_1(i);\n            }\n        }, subscriber);\n    };\n}\nfunction maybeSchedule(scheduler, execute, subscription) {\n    if (scheduler) {\n        executeSchedule(subscription, scheduler, execute);\n    }\n    else {\n        execute();\n    }\n}\n//# sourceMappingURL=combineLatest.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { executeSchedule } from '../util/executeSchedule';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand, innerSubScheduler, additionalFinalizer) {\n    var buffer = [];\n    var active = 0;\n    var index = 0;\n    var isComplete = false;\n    var checkComplete = function () {\n        if (isComplete && !buffer.length && !active) {\n            subscriber.complete();\n        }\n    };\n    var outerNext = function (value) { return (active < concurrent ? doInnerSub(value) : buffer.push(value)); };\n    var doInnerSub = function (value) {\n        expand && subscriber.next(value);\n        active++;\n        var innerComplete = false;\n        innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function (innerValue) {\n            onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);\n            if (expand) {\n                outerNext(innerValue);\n            }\n            else {\n                subscriber.next(innerValue);\n            }\n        }, function () {\n            innerComplete = true;\n        }, undefined, function () {\n            if (innerComplete) {\n                try {\n                    active--;\n                    var _loop_1 = function () {\n                        var bufferedValue = buffer.shift();\n                        if (innerSubScheduler) {\n                            executeSchedule(subscriber, innerSubScheduler, function () { return doInnerSub(bufferedValue); });\n                        }\n                        else {\n                            doInnerSub(bufferedValue);\n                        }\n                    };\n                    while (buffer.length && active < concurrent) {\n                        _loop_1();\n                    }\n                    checkComplete();\n                }\n                catch (err) {\n                    subscriber.error(err);\n                }\n            }\n        }));\n    };\n    source.subscribe(createOperatorSubscriber(subscriber, outerNext, function () {\n        isComplete = true;\n        checkComplete();\n    }));\n    return function () {\n        additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();\n    };\n}\n//# sourceMappingURL=mergeInternals.js.map","import { map } from './map';\nimport { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { mergeInternals } from './mergeInternals';\nimport { isFunction } from '../util/isFunction';\nexport function mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) { concurrent = Infinity; }\n    if (isFunction(resultSelector)) {\n        return mergeMap(function (a, i) { return map(function (b, ii) { return resultSelector(a, b, i, ii); })(innerFrom(project(a, i))); }, concurrent);\n    }\n    else if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n    }\n    return operate(function (source, subscriber) { return mergeInternals(source, subscriber, project, concurrent); });\n}\n//# sourceMappingURL=mergeMap.js.map","import { mergeMap } from './mergeMap';\nimport { identity } from '../util/identity';\nexport function mergeAll(concurrent) {\n    if (concurrent === void 0) { concurrent = Infinity; }\n    return mergeMap(identity, concurrent);\n}\n//# sourceMappingURL=mergeAll.js.map","import { mergeAll } from './mergeAll';\nexport function concatAll() {\n    return mergeAll(1);\n}\n//# sourceMappingURL=concatAll.js.map","import { concatAll } from '../operators/concatAll';\nimport { popScheduler } from '../util/args';\nimport { from } from './from';\nexport function concat() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return concatAll()(from(args, popScheduler(args)));\n}\n//# sourceMappingURL=concat.js.map","import { Observable } from '../Observable';\nimport { innerFrom } from './innerFrom';\nexport function defer(observableFactory) {\n    return new Observable(function (subscriber) {\n        innerFrom(observableFactory()).subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=defer.js.map","import { Observable } from '../Observable';\nimport { async as asyncScheduler } from '../scheduler/async';\nimport { isScheduler } from '../util/isScheduler';\nimport { isValidDate } from '../util/isDate';\nexport function timer(dueTime, intervalOrScheduler, scheduler) {\n    if (dueTime === void 0) { dueTime = 0; }\n    if (scheduler === void 0) { scheduler = asyncScheduler; }\n    var intervalDuration = -1;\n    if (intervalOrScheduler != null) {\n        if (isScheduler(intervalOrScheduler)) {\n            scheduler = intervalOrScheduler;\n        }\n        else {\n            intervalDuration = intervalOrScheduler;\n        }\n    }\n    return new Observable(function (subscriber) {\n        var due = isValidDate(dueTime) ? +dueTime - scheduler.now() : dueTime;\n        if (due < 0) {\n            due = 0;\n        }\n        var n = 0;\n        return scheduler.schedule(function () {\n            if (!subscriber.closed) {\n                subscriber.next(n++);\n                if (0 <= intervalDuration) {\n                    this.schedule(undefined, intervalDuration);\n                }\n                else {\n                    subscriber.complete();\n                }\n            }\n        }, due);\n    });\n}\n//# sourceMappingURL=timer.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { timer } from './timer';\nexport function interval(period, scheduler) {\n    if (period === void 0) { period = 0; }\n    if (scheduler === void 0) { scheduler = asyncScheduler; }\n    if (period < 0) {\n        period = 0;\n    }\n    return timer(period, period, scheduler);\n}\n//# sourceMappingURL=interval.js.map","import { mergeAll } from '../operators/mergeAll';\nimport { innerFrom } from './innerFrom';\nimport { EMPTY } from './empty';\nimport { popNumber, popScheduler } from '../util/args';\nimport { from } from './from';\nexport function merge() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var scheduler = popScheduler(args);\n    var concurrent = popNumber(args, Infinity);\n    var sources = args;\n    return !sources.length\n        ?\n            EMPTY\n        : sources.length === 1\n            ?\n                innerFrom(sources[0])\n            :\n                mergeAll(concurrent)(from(sources, scheduler));\n}\n//# sourceMappingURL=merge.js.map","import { Observable } from '../Observable';\nimport { noop } from '../util/noop';\nexport var NEVER = new Observable(noop);\nexport function never() {\n    return NEVER;\n}\n//# sourceMappingURL=never.js.map","var isArray = Array.isArray;\nexport function argsOrArgArray(args) {\n    return args.length === 1 && isArray(args[0]) ? args[0] : args;\n}\n//# sourceMappingURL=argsOrArgArray.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function filter(predicate, thisArg) {\n    return operate(function (source, subscriber) {\n        var index = 0;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return predicate.call(thisArg, value, index++) && subscriber.next(value); }));\n    });\n}\n//# sourceMappingURL=filter.js.map","import { Observable } from '../Observable';\nimport { innerFrom } from './innerFrom';\nimport { argsOrArgArray } from '../util/argsOrArgArray';\nimport { createOperatorSubscriber } from '../operators/OperatorSubscriber';\nexport function race() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    sources = argsOrArgArray(sources);\n    return sources.length === 1 ? innerFrom(sources[0]) : new Observable(raceInit(sources));\n}\nexport function raceInit(sources) {\n    return function (subscriber) {\n        var subscriptions = [];\n        var _loop_1 = function (i) {\n            subscriptions.push(innerFrom(sources[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {\n                if (subscriptions) {\n                    for (var s = 0; s < subscriptions.length; s++) {\n                        s !== i && subscriptions[s].unsubscribe();\n                    }\n                    subscriptions = null;\n                }\n                subscriber.next(value);\n            })));\n        };\n        for (var i = 0; subscriptions && !subscriber.closed && i < sources.length; i++) {\n            _loop_1(i);\n        }\n    };\n}\n//# sourceMappingURL=race.js.map","import { operate } from '../util/lift';\nimport { innerFrom } from '../observable/innerFrom';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function audit(durationSelector) {\n    return operate(function (source, subscriber) {\n        var hasValue = false;\n        var lastValue = null;\n        var durationSubscriber = null;\n        var isComplete = false;\n        var endDuration = function () {\n            durationSubscriber === null || durationSubscriber === void 0 ? void 0 : durationSubscriber.unsubscribe();\n            durationSubscriber = null;\n            if (hasValue) {\n                hasValue = false;\n                var value = lastValue;\n                lastValue = null;\n                subscriber.next(value);\n            }\n            isComplete && subscriber.complete();\n        };\n        var cleanupDuration = function () {\n            durationSubscriber = null;\n            isComplete && subscriber.complete();\n        };\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            hasValue = true;\n            lastValue = value;\n            if (!durationSubscriber) {\n                innerFrom(durationSelector(value)).subscribe((durationSubscriber = createOperatorSubscriber(subscriber, endDuration, cleanupDuration)));\n            }\n        }, function () {\n            isComplete = true;\n            (!hasValue || !durationSubscriber || durationSubscriber.closed) && subscriber.complete();\n        }));\n    });\n}\n//# sourceMappingURL=audit.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { audit } from './audit';\nimport { timer } from '../observable/timer';\nexport function auditTime(duration, scheduler) {\n    if (scheduler === void 0) { scheduler = asyncScheduler; }\n    return audit(function () { return timer(duration, scheduler); });\n}\n//# sourceMappingURL=auditTime.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { operate } from '../util/lift';\nexport function catchError(selector) {\n    return operate(function (source, subscriber) {\n        var innerSub = null;\n        var syncUnsub = false;\n        var handledResult;\n        innerSub = source.subscribe(createOperatorSubscriber(subscriber, undefined, undefined, function (err) {\n            handledResult = innerFrom(selector(err, catchError(selector)(source)));\n            if (innerSub) {\n                innerSub.unsubscribe();\n                innerSub = null;\n                handledResult.subscribe(subscriber);\n            }\n            else {\n                syncUnsub = true;\n            }\n        }));\n        if (syncUnsub) {\n            innerSub.unsubscribe();\n            innerSub = null;\n            handledResult.subscribe(subscriber);\n        }\n    });\n}\n//# sourceMappingURL=catchError.js.map","import { createOperatorSubscriber } from './OperatorSubscriber';\nexport function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {\n    return function (source, subscriber) {\n        var hasState = hasSeed;\n        var state = seed;\n        var index = 0;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            var i = index++;\n            state = hasState\n                ?\n                    accumulator(state, value, i)\n                :\n                    ((hasState = true), value);\n            emitOnNext && subscriber.next(state);\n        }, emitBeforeComplete &&\n            (function () {\n                hasState && subscriber.next(state);\n                subscriber.complete();\n            })));\n    };\n}\n//# sourceMappingURL=scanInternals.js.map","import { scanInternals } from './scanInternals';\nimport { operate } from '../util/lift';\nexport function reduce(accumulator, seed) {\n    return operate(scanInternals(accumulator, seed, arguments.length >= 2, false, true));\n}\n//# sourceMappingURL=reduce.js.map","import { reduce } from './reduce';\nimport { operate } from '../util/lift';\nvar arrReducer = function (arr, value) { return (arr.push(value), arr); };\nexport function toArray() {\n    return operate(function (source, subscriber) {\n        reduce(arrReducer, [])(source).subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=toArray.js.map","import { asyncScheduler } from '../scheduler/async';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) { scheduler = asyncScheduler; }\n    return operate(function (source, subscriber) {\n        var activeTask = null;\n        var lastValue = null;\n        var lastTime = null;\n        var emit = function () {\n            if (activeTask) {\n                activeTask.unsubscribe();\n                activeTask = null;\n                var value = lastValue;\n                lastValue = null;\n                subscriber.next(value);\n            }\n        };\n        function emitWhenIdle() {\n            var targetTime = lastTime + dueTime;\n            var now = scheduler.now();\n            if (now < targetTime) {\n                activeTask = this.schedule(undefined, targetTime - now);\n                subscriber.add(activeTask);\n                return;\n            }\n            emit();\n        }\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            lastValue = value;\n            lastTime = scheduler.now();\n            if (!activeTask) {\n                activeTask = scheduler.schedule(emitWhenIdle, dueTime);\n                subscriber.add(activeTask);\n            }\n        }, function () {\n            emit();\n            subscriber.complete();\n        }, undefined, function () {\n            lastValue = activeTask = null;\n        }));\n    });\n}\n//# sourceMappingURL=debounceTime.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function defaultIfEmpty(defaultValue) {\n    return operate(function (source, subscriber) {\n        var hasValue = false;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            hasValue = true;\n            subscriber.next(value);\n        }, function () {\n            if (!hasValue) {\n                subscriber.next(defaultValue);\n            }\n            subscriber.complete();\n        }));\n    });\n}\n//# sourceMappingURL=defaultIfEmpty.js.map","import { EMPTY } from '../observable/empty';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function take(count) {\n    return count <= 0\n        ?\n            function () { return EMPTY; }\n        : operate(function (source, subscriber) {\n            var seen = 0;\n            source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n                if (++seen <= count) {\n                    subscriber.next(value);\n                    if (count <= seen) {\n                        subscriber.complete();\n                    }\n                }\n            }));\n        });\n}\n//# sourceMappingURL=take.js.map","import { identity } from '../util/identity';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function distinctUntilChanged(comparator, keySelector) {\n    if (keySelector === void 0) { keySelector = identity; }\n    comparator = comparator !== null && comparator !== void 0 ? comparator : defaultCompare;\n    return operate(function (source, subscriber) {\n        var previousKey;\n        var first = true;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            var currentKey = keySelector(value);\n            if (first || !comparator(previousKey, currentKey)) {\n                first = false;\n                previousKey = currentKey;\n                subscriber.next(value);\n            }\n        }));\n    });\n}\nfunction defaultCompare(a, b) {\n    return a === b;\n}\n//# sourceMappingURL=distinctUntilChanged.js.map","import { EmptyError } from '../util/EmptyError';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function throwIfEmpty(errorFactory) {\n    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }\n    return operate(function (source, subscriber) {\n        var hasValue = false;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            hasValue = true;\n            subscriber.next(value);\n        }, function () { return (hasValue ? subscriber.complete() : subscriber.error(errorFactory())); }));\n    });\n}\nfunction defaultErrorFactory() {\n    return new EmptyError();\n}\n//# sourceMappingURL=throwIfEmpty.js.map","import { map } from './map';\nimport { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function exhaustMap(project, resultSelector) {\n    if (resultSelector) {\n        return function (source) {\n            return source.pipe(exhaustMap(function (a, i) { return innerFrom(project(a, i)).pipe(map(function (b, ii) { return resultSelector(a, b, i, ii); })); }));\n        };\n    }\n    return operate(function (source, subscriber) {\n        var index = 0;\n        var innerSub = null;\n        var isComplete = false;\n        source.subscribe(createOperatorSubscriber(subscriber, function (outerValue) {\n            if (!innerSub) {\n                innerSub = createOperatorSubscriber(subscriber, undefined, function () {\n                    innerSub = null;\n                    isComplete && subscriber.complete();\n                });\n                innerFrom(project(outerValue, index++)).subscribe(innerSub);\n            }\n        }, function () {\n            isComplete = true;\n            !innerSub && subscriber.complete();\n        }));\n    });\n}\n//# sourceMappingURL=exhaustMap.js.map","import { EmptyError } from '../util/EmptyError';\nimport { filter } from './filter';\nimport { take } from './take';\nimport { defaultIfEmpty } from './defaultIfEmpty';\nimport { throwIfEmpty } from './throwIfEmpty';\nimport { identity } from '../util/identity';\nexport function first(predicate, defaultValue) {\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) {\n        return source.pipe(predicate ? filter(function (v, i) { return predicate(v, i, source); }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function () { return new EmptyError(); }));\n    };\n}\n//# sourceMappingURL=first.js.map","import { operate } from '../util/lift';\nimport { scanInternals } from './scanInternals';\nexport function scan(accumulator, seed) {\n    return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));\n}\n//# sourceMappingURL=scan.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { innerFrom } from '../observable/innerFrom';\nimport { Subject } from '../Subject';\nimport { SafeSubscriber } from '../Subscriber';\nimport { operate } from '../util/lift';\nexport function share(options) {\n    if (options === void 0) { options = {}; }\n    var _a = options.connector, connector = _a === void 0 ? function () { return new Subject(); } : _a, _b = options.resetOnError, resetOnError = _b === void 0 ? true : _b, _c = options.resetOnComplete, resetOnComplete = _c === void 0 ? true : _c, _d = options.resetOnRefCountZero, resetOnRefCountZero = _d === void 0 ? true : _d;\n    return function (wrapperSource) {\n        var connection;\n        var resetConnection;\n        var subject;\n        var refCount = 0;\n        var hasCompleted = false;\n        var hasErrored = false;\n        var cancelReset = function () {\n            resetConnection === null || resetConnection === void 0 ? void 0 : resetConnection.unsubscribe();\n            resetConnection = undefined;\n        };\n        var reset = function () {\n            cancelReset();\n            connection = subject = undefined;\n            hasCompleted = hasErrored = false;\n        };\n        var resetAndUnsubscribe = function () {\n            var conn = connection;\n            reset();\n            conn === null || conn === void 0 ? void 0 : conn.unsubscribe();\n        };\n        return operate(function (source, subscriber) {\n            refCount++;\n            if (!hasErrored && !hasCompleted) {\n                cancelReset();\n            }\n            var dest = (subject = subject !== null && subject !== void 0 ? subject : connector());\n            subscriber.add(function () {\n                refCount--;\n                if (refCount === 0 && !hasErrored && !hasCompleted) {\n                    resetConnection = handleReset(resetAndUnsubscribe, resetOnRefCountZero);\n                }\n            });\n            dest.subscribe(subscriber);\n            if (!connection &&\n                refCount > 0) {\n                connection = new SafeSubscriber({\n                    next: function (value) { return dest.next(value); },\n                    error: function (err) {\n                        hasErrored = true;\n                        cancelReset();\n                        resetConnection = handleReset(reset, resetOnError, err);\n                        dest.error(err);\n                    },\n                    complete: function () {\n                        hasCompleted = true;\n                        cancelReset();\n                        resetConnection = handleReset(reset, resetOnComplete);\n                        dest.complete();\n                    },\n                });\n                innerFrom(source).subscribe(connection);\n            }\n        })(wrapperSource);\n    };\n}\nfunction handleReset(reset, on) {\n    var args = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        args[_i - 2] = arguments[_i];\n    }\n    if (on === true) {\n        reset();\n        return;\n    }\n    if (on === false) {\n        return;\n    }\n    var onSubscriber = new SafeSubscriber({\n        next: function () {\n            onSubscriber.unsubscribe();\n            reset();\n        },\n    });\n    return innerFrom(on.apply(void 0, __spreadArray([], __read(args)))).subscribe(onSubscriber);\n}\n//# sourceMappingURL=share.js.map","import { ReplaySubject } from '../ReplaySubject';\nimport { share } from './share';\nexport function shareReplay(configOrBufferSize, windowTime, scheduler) {\n    var _a, _b, _c;\n    var bufferSize;\n    var refCount = false;\n    if (configOrBufferSize && typeof configOrBufferSize === 'object') {\n        (_a = configOrBufferSize.bufferSize, bufferSize = _a === void 0 ? Infinity : _a, _b = configOrBufferSize.windowTime, windowTime = _b === void 0 ? Infinity : _b, _c = configOrBufferSize.refCount, refCount = _c === void 0 ? false : _c, scheduler = configOrBufferSize.scheduler);\n    }\n    else {\n        bufferSize = (configOrBufferSize !== null && configOrBufferSize !== void 0 ? configOrBufferSize : Infinity);\n    }\n    return share({\n        connector: function () { return new ReplaySubject(bufferSize, windowTime, scheduler); },\n        resetOnError: true,\n        resetOnComplete: false,\n        resetOnRefCountZero: refCount,\n    });\n}\n//# sourceMappingURL=shareReplay.js.map","import { filter } from './filter';\nexport function skip(count) {\n    return filter(function (_, index) { return count <= index; });\n}\n//# sourceMappingURL=skip.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function skipWhile(predicate) {\n    return operate(function (source, subscriber) {\n        var taking = false;\n        var index = 0;\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) { return (taking || (taking = !predicate(value, index++))) && subscriber.next(value); }));\n    });\n}\n//# sourceMappingURL=skipWhile.js.map","import { concat } from '../observable/concat';\nimport { popScheduler } from '../util/args';\nimport { operate } from '../util/lift';\nexport function startWith() {\n    var values = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        values[_i] = arguments[_i];\n    }\n    var scheduler = popScheduler(values);\n    return operate(function (source, subscriber) {\n        (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=startWith.js.map","import { innerFrom } from '../observable/innerFrom';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nexport function switchMap(project, resultSelector) {\n    return operate(function (source, subscriber) {\n        var innerSubscriber = null;\n        var index = 0;\n        var isComplete = false;\n        var checkComplete = function () { return isComplete && !innerSubscriber && subscriber.complete(); };\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();\n            var innerIndex = 0;\n            var outerIndex = index++;\n            innerFrom(project(value, outerIndex)).subscribe((innerSubscriber = createOperatorSubscriber(subscriber, function (innerValue) { return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue); }, function () {\n                innerSubscriber = null;\n                checkComplete();\n            })));\n        }, function () {\n            isComplete = true;\n            checkComplete();\n        }));\n    });\n}\n//# sourceMappingURL=switchMap.js.map","import { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { innerFrom } from '../observable/innerFrom';\nimport { noop } from '../util/noop';\nexport function takeUntil(notifier) {\n    return operate(function (source, subscriber) {\n        innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function () { return subscriber.complete(); }, noop));\n        !subscriber.closed && source.subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=takeUntil.js.map","import { isFunction } from '../util/isFunction';\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { identity } from '../util/identity';\nexport function tap(observerOrNext, error, complete) {\n    var tapObserver = isFunction(observerOrNext) || error || complete\n        ?\n            { next: observerOrNext, error: error, complete: complete }\n        : observerOrNext;\n    return tapObserver\n        ? operate(function (source, subscriber) {\n            var _a;\n            (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n            var isUnsub = true;\n            source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n                var _a;\n                (_a = tapObserver.next) === null || _a === void 0 ? void 0 : _a.call(tapObserver, value);\n                subscriber.next(value);\n            }, function () {\n                var _a;\n                isUnsub = false;\n                (_a = tapObserver.complete) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n                subscriber.complete();\n            }, function (err) {\n                var _a;\n                isUnsub = false;\n                (_a = tapObserver.error) === null || _a === void 0 ? void 0 : _a.call(tapObserver, err);\n                subscriber.error(err);\n            }, function () {\n                var _a, _b;\n                if (isUnsub) {\n                    (_a = tapObserver.unsubscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);\n                }\n                (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);\n            }));\n        })\n        :\n            identity;\n}\n//# sourceMappingURL=tap.js.map","import { __read, __spreadArray } from \"tslib\";\nimport { operate } from '../util/lift';\nimport { createOperatorSubscriber } from './OperatorSubscriber';\nimport { innerFrom } from '../observable/innerFrom';\nimport { identity } from '../util/identity';\nimport { noop } from '../util/noop';\nimport { popResultSelector } from '../util/args';\nexport function withLatestFrom() {\n    var inputs = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        inputs[_i] = arguments[_i];\n    }\n    var project = popResultSelector(inputs);\n    return operate(function (source, subscriber) {\n        var len = inputs.length;\n        var otherValues = new Array(len);\n        var hasValue = inputs.map(function () { return false; });\n        var ready = false;\n        var _loop_1 = function (i) {\n            innerFrom(inputs[i]).subscribe(createOperatorSubscriber(subscriber, function (value) {\n                otherValues[i] = value;\n                if (!ready && !hasValue[i]) {\n                    hasValue[i] = true;\n                    (ready = hasValue.every(identity)) && (hasValue = null);\n                }\n            }, noop));\n        };\n        for (var i = 0; i < len; i++) {\n            _loop_1(i);\n        }\n        source.subscribe(createOperatorSubscriber(subscriber, function (value) {\n            if (ready) {\n                var values = __spreadArray([value], __read(otherValues));\n                subscriber.next(project ? project.apply(void 0, __spreadArray([], __read(values))) : values);\n            }\n        }));\n    });\n}\n//# sourceMappingURL=withLatestFrom.js.map","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n    \"use strict\";\n    if (typeof define === 'function' && define.amd) {\n        define(definition);\n    } else if (typeof module === 'object' && module.exports) {\n        module.exports = definition();\n    } else {\n        root.log = definition();\n    }\n}(this, function () {\n    \"use strict\";\n\n    // Slightly dubious tricks to cut down minimized file size\n    var noop = function() {};\n    var undefinedType = \"undefined\";\n    var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n        /Trident\\/|MSIE /.test(window.navigator.userAgent)\n    );\n\n    var logMethods = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n    ];\n\n    var _loggersByName = {};\n    var defaultLogger = null;\n\n    // Cross-browser bind equivalent that works at least back to IE6\n    function bindMethod(obj, methodName) {\n        var method = obj[methodName];\n        if (typeof method.bind === 'function') {\n            return method.bind(obj);\n        } else {\n            try {\n                return Function.prototype.bind.call(method, obj);\n            } catch (e) {\n                // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n                return function() {\n                    return Function.prototype.apply.apply(method, [obj, arguments]);\n                };\n            }\n        }\n    }\n\n    // Trace() doesn't print the message in IE, so for that case we need to wrap it\n    function traceForIE() {\n        if (console.log) {\n            if (console.log.apply) {\n                console.log.apply(console, arguments);\n            } else {\n                // In old IE, native console methods themselves don't have apply().\n                Function.prototype.apply.apply(console.log, [console, arguments]);\n            }\n        }\n        if (console.trace) console.trace();\n    }\n\n    // Build the best logging method possible for this env\n    // Wherever possible we want to bind, not wrap, to preserve stack traces\n    function realMethod(methodName) {\n        if (methodName === 'debug') {\n            methodName = 'log';\n        }\n\n        if (typeof console === undefinedType) {\n            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n        } else if (methodName === 'trace' && isIE) {\n            return traceForIE;\n        } else if (console[methodName] !== undefined) {\n            return bindMethod(console, methodName);\n        } else if (console.log !== undefined) {\n            return bindMethod(console, 'log');\n        } else {\n            return noop;\n        }\n    }\n\n    // These private functions always need `this` to be set properly\n\n    function replaceLoggingMethods() {\n        /*jshint validthis:true */\n        var level = this.getLevel();\n\n        // Replace the actual methods.\n        for (var i = 0; i < logMethods.length; i++) {\n            var methodName = logMethods[i];\n            this[methodName] = (i < level) ?\n                noop :\n                this.methodFactory(methodName, level, this.name);\n        }\n\n        // Define log.log as an alias for log.debug\n        this.log = this.debug;\n\n        // Return any important warnings.\n        if (typeof console === undefinedType && level < this.levels.SILENT) {\n            return \"No console available for logging\";\n        }\n    }\n\n    // In old IE versions, the console isn't present until you first open it.\n    // We build realMethod() replacements here that regenerate logging methods\n    function enableLoggingWhenConsoleArrives(methodName) {\n        return function () {\n            if (typeof console !== undefinedType) {\n                replaceLoggingMethods.call(this);\n                this[methodName].apply(this, arguments);\n            }\n        };\n    }\n\n    // By default, we use closely bound real methods wherever possible, and\n    // otherwise we wait for a console to appear, and then try again.\n    function defaultMethodFactory(methodName, _level, _loggerName) {\n        /*jshint validthis:true */\n        return realMethod(methodName) ||\n               enableLoggingWhenConsoleArrives.apply(this, arguments);\n    }\n\n    function Logger(name, factory) {\n      // Private instance variables.\n      var self = this;\n      /**\n       * The level inherited from a parent logger (or a global default). We\n       * cache this here rather than delegating to the parent so that it stays\n       * in sync with the actual logging methods that we have installed (the\n       * parent could change levels but we might not have rebuilt the loggers\n       * in this child yet).\n       * @type {number}\n       */\n      var inheritedLevel;\n      /**\n       * The default level for this logger, if any. If set, this overrides\n       * `inheritedLevel`.\n       * @type {number|null}\n       */\n      var defaultLevel;\n      /**\n       * A user-specific level for this logger. If set, this overrides\n       * `defaultLevel`.\n       * @type {number|null}\n       */\n      var userLevel;\n\n      var storageKey = \"loglevel\";\n      if (typeof name === \"string\") {\n        storageKey += \":\" + name;\n      } else if (typeof name === \"symbol\") {\n        storageKey = undefined;\n      }\n\n      function persistLevelIfPossible(levelNum) {\n          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage[storageKey] = levelName;\n              return;\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n          } catch (ignore) {}\n      }\n\n      function getPersistedLevel() {\n          var storedLevel;\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          try {\n              storedLevel = window.localStorage[storageKey];\n          } catch (ignore) {}\n\n          // Fallback to cookies if local storage gives us nothing\n          if (typeof storedLevel === undefinedType) {\n              try {\n                  var cookie = window.document.cookie;\n                  var cookieName = encodeURIComponent(storageKey);\n                  var location = cookie.indexOf(cookieName + \"=\");\n                  if (location !== -1) {\n                      storedLevel = /^([^;]+)/.exec(\n                          cookie.slice(location + cookieName.length + 1)\n                      )[1];\n                  }\n              } catch (ignore) {}\n          }\n\n          // If the stored level is not valid, treat it as if nothing was stored.\n          if (self.levels[storedLevel] === undefined) {\n              storedLevel = undefined;\n          }\n\n          return storedLevel;\n      }\n\n      function clearPersistedLevel() {\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage.removeItem(storageKey);\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n          } catch (ignore) {}\n      }\n\n      function normalizeLevel(input) {\n          var level = input;\n          if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n              level = self.levels[level.toUpperCase()];\n          }\n          if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n              return level;\n          } else {\n              throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n          }\n      }\n\n      /*\n       *\n       * Public logger API - see https://github.com/pimterry/loglevel for details\n       *\n       */\n\n      self.name = name;\n\n      self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n          \"ERROR\": 4, \"SILENT\": 5};\n\n      self.methodFactory = factory || defaultMethodFactory;\n\n      self.getLevel = function () {\n          if (userLevel != null) {\n            return userLevel;\n          } else if (defaultLevel != null) {\n            return defaultLevel;\n          } else {\n            return inheritedLevel;\n          }\n      };\n\n      self.setLevel = function (level, persist) {\n          userLevel = normalizeLevel(level);\n          if (persist !== false) {  // defaults to true\n              persistLevelIfPossible(userLevel);\n          }\n\n          // NOTE: in v2, this should call rebuild(), which updates children.\n          return replaceLoggingMethods.call(self);\n      };\n\n      self.setDefaultLevel = function (level) {\n          defaultLevel = normalizeLevel(level);\n          if (!getPersistedLevel()) {\n              self.setLevel(level, false);\n          }\n      };\n\n      self.resetLevel = function () {\n          userLevel = null;\n          clearPersistedLevel();\n          replaceLoggingMethods.call(self);\n      };\n\n      self.enableAll = function(persist) {\n          self.setLevel(self.levels.TRACE, persist);\n      };\n\n      self.disableAll = function(persist) {\n          self.setLevel(self.levels.SILENT, persist);\n      };\n\n      self.rebuild = function () {\n          if (defaultLogger !== self) {\n              inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n          }\n          replaceLoggingMethods.call(self);\n\n          if (defaultLogger === self) {\n              for (var childName in _loggersByName) {\n                _loggersByName[childName].rebuild();\n              }\n          }\n      };\n\n      // Initialize all the internal levels.\n      inheritedLevel = normalizeLevel(\n          defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n      );\n      var initialLevel = getPersistedLevel();\n      if (initialLevel != null) {\n          userLevel = normalizeLevel(initialLevel);\n      }\n      replaceLoggingMethods.call(self);\n    }\n\n    /*\n     *\n     * Top-level API\n     *\n     */\n\n    defaultLogger = new Logger();\n\n    defaultLogger.getLogger = function getLogger(name) {\n        if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n            throw new TypeError(\"You must supply a name when creating a logger.\");\n        }\n\n        var logger = _loggersByName[name];\n        if (!logger) {\n            logger = _loggersByName[name] = new Logger(\n                name,\n                defaultLogger.methodFactory\n            );\n        }\n        return logger;\n    };\n\n    // Grab the current global log variable in case of overwrite\n    var _log = (typeof window !== undefinedType) ? window.log : undefined;\n    defaultLogger.noConflict = function() {\n        if (typeof window !== undefinedType &&\n               window.log === defaultLogger) {\n            window.log = _log;\n        }\n\n        return defaultLogger;\n    };\n\n    defaultLogger.getLoggers = function getLoggers() {\n        return _loggersByName;\n    };\n\n    // ES6 default export, for compatibility\n    defaultLogger['default'] = defaultLogger;\n\n    return defaultLogger;\n}));\n","import { filter, map, pipe } from \"rxjs\";\nimport log from \"loglevel\";\nimport { filter as filter$1, map as map$1 } from \"rxjs/operators\";\n\n//#region src/core/constants.ts\nconst INVITE_VERSION = 1e3;\nconst DEFAULT_ICE_CANDIDATE_TIMEOUT_MS = 600;\nconst DEFAULT_ICE_GATHERING_TIMEOUT_MS = 6e3;\nconst DEFAULT_RECONNECT_CALLS_TIMEOUT_MS = 300 * 1e3;\nconst DEFAULT_CONNECTION_TIMEOUT_MS = 1e4;\nconst DEFAULT_RECONNECT_DELAY_MIN_MS = 100;\nconst DEFAULT_RECONNECT_DELAY_MAX_MS = 3e3;\nconst DEFAULT_DEVICE_DEBOUNCE_TIME_MS = 1500;\nconst DEFAULT_DEVICE_POLLING_INTERVAL_MS = 0;\nconst PREFERENCES_STORAGE_KEY = \"sw:preferences\";\n/** Scope value that enables automatic token refresh. */\nconst SAT_REFRESH_SCOPE = \"sat:refresh\";\n/** API endpoints for device token operations. */\nconst DEVICE_TOKEN_ENDPOINT = \"/api/fabric/subscriber/devices/token\";\nconst DEVICE_REFRESH_ENDPOINT = \"/api/fabric/subscriber/devices/refresh\";\n/** Default device token TTL in seconds (15 minutes). */\nconst DEVICE_TOKEN_DEFAULT_EXPIRE_IN = 900;\n/** Buffer time in milliseconds before expiry to trigger refresh. */\nconst DEVICE_TOKEN_REFRESH_BUFFER_MS = 3e4;\n/** Maximum retry attempts for device token refresh on transient failure. */\nconst DEVICE_TOKEN_REFRESH_MAX_RETRIES = 3;\n/** Base delay in milliseconds for exponential backoff on refresh retry. */\nconst DEVICE_TOKEN_REFRESH_RETRY_BASE_MS = 1e3;\n/** Maximum retry attempts for developer credential refresh on transient failure. */\nconst CREDENTIAL_REFRESH_MAX_RETRIES = 5;\n/** Base delay in milliseconds for exponential backoff on credential refresh retry. */\nconst CREDENTIAL_REFRESH_RETRY_BASE_MS = 1e3;\n/** Maximum delay in milliseconds for credential refresh backoff. */\nconst CREDENTIAL_REFRESH_MAX_DELAY_MS = 3e4;\n/** Buffer in milliseconds before token expiry to trigger refresh. */\nconst CREDENTIAL_REFRESH_BUFFER_MS = 5e3;\n/**\n* Maximum time the coordinator will wait for `DeviceTokenManager.activate()`\n* to resolve before treating the activation as failed and falling back to\n* the developer-provided refresh path. Prevents a wedged HTTP layer from\n* leaving the session with no active refresh mechanism.\n*/\nconst CREDENTIAL_ACTIVATE_TIMEOUT_MS = 3e4;\n/** JSON-RPC error code for requester validation failure (corrupted auth state). */\nconst RPC_ERROR_REQUESTER_VALIDATION_FAILED = -32003;\n/** JSON-RPC error code for invalid params (e.g., missing authentication block). */\nconst RPC_ERROR_INVALID_PARAMS = -32602;\n/** JSON-RPC error code for authentication failure (invalid token, missing DPoP, etc.). */\nconst RPC_ERROR_AUTHENTICATION_FAILED = -32002;\n/** Error names browsers use for a media permission denial (user or policy). */\nconst MEDIA_ACCESS_DENIAL_NAMES = [\n\t\"NotAllowedError\",\n\t\"SecurityError\",\n\t\"PermissionDeniedError\"\n];\n/** Default polling interval for RTCPeerConnection.getStats() in milliseconds. */\nconst DEFAULT_STATS_POLLING_INTERVAL_MS = 1e3;\n/** Number of initial samples used to build a baseline for spike detection. */\nconst DEFAULT_STATS_BASELINE_SAMPLES = 10;\n/** Duration in ms with no inbound audio packets before emitting a critical issue. */\nconst DEFAULT_STATS_NO_PACKET_THRESHOLD_MS = 2e3;\n/** Multiplier applied to baseline RTT to detect a warning-level RTT spike. */\nconst DEFAULT_STATS_RTT_SPIKE_MULTIPLIER = 3;\n/** Packet loss fraction (0-1) above which a warning is emitted. */\nconst DEFAULT_STATS_PACKET_LOSS_THRESHOLD = .05;\n/** Multiplier applied to baseline jitter to detect a jitter spike. */\nconst DEFAULT_STATS_JITTER_SPIKE_MULTIPLIER = 4;\n/** Number of seconds of metrics history to retain. */\nconst DEFAULT_STATS_HISTORY_SIZE = 30;\n/** Maximum keyframe requests allowed within a single burst window. */\nconst DEFAULT_KEYFRAME_MAX_BURST = 3;\n/** Duration of the keyframe burst window in milliseconds. */\nconst DEFAULT_KEYFRAME_BURST_WINDOW_MS = 3e3;\n/** Cooldown period in ms after burst limit is reached before allowing more keyframes. */\nconst DEFAULT_KEYFRAME_COOLDOWN_MS = 1e4;\n/** Minimum time between re-INVITE attempts in milliseconds. */\nconst DEFAULT_REINVITE_DEBOUNCE_TIME_MS = 1e4;\n/** Maximum number of re-INVITE attempts per call. */\nconst DEFAULT_REINVITE_MAX_ATTEMPTS = 3;\n/** Timeout for a single re-INVITE attempt in milliseconds. */\nconst DEFAULT_REINVITE_TIMEOUT_MS = 5e3;\n/** Debounce window in ms to collapse multiple detection signals into one trigger. */\nconst DEFAULT_RECOVERY_DEBOUNCE_TIME_MS = 2e3;\n/** Cooldown period in ms between recovery attempts. */\nconst DEFAULT_RECOVERY_COOLDOWN_MS = 1e4;\n/** Grace period in ms before treating ICE 'disconnected' as a failure. */\nconst DEFAULT_ICE_DISCONNECTED_GRACE_PERIOD_MS = 3e3;\n/** Timeout for a single ICE restart attempt in milliseconds. */\nconst DEFAULT_ICE_RESTART_TIMEOUT_MS = 5e3;\n/** Maximum recovery attempts before emitting 'max_attempts_reached'. */\nconst DEFAULT_MAX_RECOVERY_ATTEMPTS = 3;\n/** Upper bound in ms for waiting on iceGatheringState === 'complete' after an ICE restart. */\nconst ICE_GATHERING_COMPLETE_TIMEOUT_MS = 1e4;\n/** Upper bound in ms for waiting on RTCPeerConnection.connectionState === 'connected' after a recovery ICE restart. */\nconst PEER_CONNECTION_RECOVERY_WAIT_MS = 5e3;\n/** Polling interval in ms while waiting for RTCPeerConnection.connectionState to transition. */\nconst PEER_CONNECTION_RECOVERY_POLL_MS = 100;\n/** Polling interval for LocalAudioPipeline.level$ (ms). ~30fps is smooth for meters. */\nconst AUDIO_LEVEL_POLL_INTERVAL_MS = 33;\n/** RMS level threshold (0..1) above which the local participant is considered speaking. */\nconst VAD_THRESHOLD = .03;\n/** Hold window in ms below the threshold before speaking$ flips back to false. */\nconst VAD_HOLD_MS = 250;\n/** Whether to persist device selections to storage by default. */\nconst DEFAULT_PERSIST_DEVICE_SELECTION = true;\n/** Whether to auto-apply device changes to active calls by default. */\nconst DEFAULT_SYNC_DEVICES_TO_ACTIVE_CALLS = true;\n/** Storage keys for persisted device selections. */\nconst DEVICE_STORAGE_KEY_AUDIO_INPUT = \"sw:device:audioinput\";\nconst DEVICE_STORAGE_KEY_AUDIO_OUTPUT = \"sw:device:audiooutput\";\nconst DEVICE_STORAGE_KEY_VIDEO_INPUT = \"sw:device:videoinput\";\n/** Whether to auto-mute video when the tab becomes hidden. */\nconst DEFAULT_AUTO_MUTE_VIDEO_ON_HIDDEN = false;\n/** Whether to re-enumerate devices when the page becomes visible. */\nconst DEFAULT_REFRESH_DEVICES_ON_VISIBLE = true;\n/** Whether to check peer connection health when the page becomes visible. */\nconst DEFAULT_CHECK_CONNECTION_ON_VISIBLE = true;\n/** Whether automatic video degradation on low bandwidth is enabled. */\nconst DEFAULT_ENABLE_AUTO_DEGRADATION = true;\n/** Bitrate in kbps below which video is automatically disabled. */\nconst DEFAULT_DEGRADATION_BITRATE_THRESHOLD_KBPS = 150;\n/** Bitrate in kbps above which video is automatically re-enabled (hysteresis). */\nconst DEFAULT_DEGRADATION_RECOVERY_THRESHOLD_KBPS = 300;\n/** Whether relay-only escalation is enabled as a last-resort recovery tier. */\nconst DEFAULT_ENABLE_RELAY_FALLBACK = true;\n/** Whether to listen for browser online/offline/connection events. */\nconst DEFAULT_ENABLE_NETWORK_CHANGE_DETECTION = true;\n/** Whether to intercept server-sent media-timeout hangups and attempt recovery. */\nconst DEFAULT_ENABLE_SERVER_HANGUP_INTERCEPTION = true;\n/** Default video track constraints applied when video is enabled without explicit constraints. */\nconst DEFAULT_VIDEO_CONSTRAINTS = {\n\twidth: { ideal: 1280 },\n\theight: { ideal: 720 },\n\taspectRatio: 16 / 9\n};\n/** Whether stereo Opus is enabled by default. */\nconst DEFAULT_STEREO_AUDIO = false;\n/** Max average bitrate for stereo Opus in bits per second. */\nconst DEFAULT_STEREO_MAX_AVERAGE_BITRATE = 51e4;\n\n//#endregion\n//#region src/core/errors.ts\nvar UnexpectedError = class extends Error {\n\tconstructor(at, options) {\n\t\tsuper(`Unexpected Error${at ? ` at ${at}` : \"\"}`, options);\n\t\tthis.at = at;\n\t\tthis.name = \"UnexpectedError\";\n\t}\n};\nvar UnimplementedError = class extends Error {\n\tconstructor(reason = \"Not Implemented\", options) {\n\t\tsuper(reason, options);\n\t\tthis.reason = reason;\n\t\tthis.name = \"UnimplementedError\";\n\t}\n};\nvar InvalidCredentialsError = class extends Error {\n\tconstructor(reason = \"Invalid Credentials\", options) {\n\t\tsuper(reason, options);\n\t\tthis.reason = reason;\n\t\tthis.name = \"InvalidCredentialsError\";\n\t}\n};\nvar WebSocketConnectionError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"WebSocketConnectionError\";\n\t}\n};\nvar TransportConnectionError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"TransportConnectionError\";\n\t}\n};\nvar WebSocketTimeoutError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"WebSocketTimeoutError\";\n\t}\n};\nvar RequestTimeoutError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"RequestTimeoutError\";\n\t}\n};\nvar RequestError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"RequestError\";\n\t}\n};\nvar RPCTimeoutError = class extends Error {\n\tconstructor(requestId, timeoutMs, options) {\n\t\tsuper(`RPC request ${requestId} timed out after ${timeoutMs}ms`, options);\n\t\tthis.requestId = requestId;\n\t\tthis.timeoutMs = timeoutMs;\n\t\tthis.name = \"RPCTimeoutError\";\n\t}\n};\nvar AuthStateHandlerError = class extends Error {\n\tconstructor(error = null, options) {\n\t\tsuper(\"Error handling authorization state update\", {\n\t\t\t...options,\n\t\t\tcause: options?.cause ?? (error instanceof Error ? error : void 0)\n\t\t});\n\t\tthis.error = error;\n\t\tthis.name = \"AuthStateHandlerError\";\n\t}\n};\nvar StorageNotAvailableError = class extends Error {\n\tconstructor(storageType = \"localStorage\", options) {\n\t\tsuper(`${storageType} is not available in this environment`, options);\n\t\tthis.storageType = storageType;\n\t\tthis.name = \"StorageNotAvailableError\";\n\t}\n};\nvar SerializationError = class extends Error {\n\tconstructor(key, originalError) {\n\t\tsuper(`Failed to serialize value for key \"${key}\": ${originalError.message}`, { cause: originalError });\n\t\tthis.key = key;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"SerializationError\";\n\t}\n};\nvar DeserializationError = class extends Error {\n\tconstructor(key, originalError) {\n\t\tsuper(`Failed to deserialize value for key \"${key}\": ${originalError.message}`, { cause: originalError });\n\t\tthis.key = key;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"DeserializationError\";\n\t}\n};\nvar StorageWriteError = class extends Error {\n\tconstructor(key, originalError) {\n\t\tsuper(`Failed to write to storage for key \"${key}\": ${originalError.message}`, { cause: originalError });\n\t\tthis.key = key;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"StorageWriteError\";\n\t}\n};\nvar StorageReadError = class extends Error {\n\tconstructor(key, originalError) {\n\t\tsuper(`Failed to read from storage \"${key}\": ${originalError.message}`, { cause: originalError });\n\t\tthis.key = key;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"StorageReadError\";\n\t}\n};\nvar DependencyError = class extends Error {\n\tconstructor(description, options) {\n\t\tsuper(`Dependency ${description} is not set or available.`, options);\n\t\tthis.description = description;\n\t\tthis.name = \"DependencyError\";\n\t}\n};\nvar CallCreateError = class extends Error {\n\tconstructor(message, error = null, direction = \"outbound\", options) {\n\t\tsuper(message, {\n\t\t\t...options,\n\t\t\tcause: options?.cause ?? (error instanceof Error ? error : void 0)\n\t\t});\n\t\tthis.message = message;\n\t\tthis.error = error;\n\t\tthis.direction = direction;\n\t\tthis.name = \"CallCreateError\";\n\t}\n};\nvar JSONRPCError = class extends Error {\n\tconstructor(code, message, data, options, requestId) {\n\t\tsuper(message, options);\n\t\tthis.code = code;\n\t\tthis.data = data;\n\t\tthis.requestId = requestId;\n\t\tthis.name = \"JSONRPCError\";\n\t}\n};\nvar InvalidParams = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.message = message;\n\t\tthis.name = \"InvalidParams\";\n\t}\n};\nvar ConversationError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.message = message;\n\t\tthis.name = \"ConversationError\";\n\t}\n};\nvar VertoInviteHandlerError = class extends Error {\n\tconstructor(error = null, options) {\n\t\tsuper(\"Error handling Verto invite\", {\n\t\t\t...options,\n\t\t\tcause: options?.cause ?? (error instanceof Error ? error : void 0)\n\t\t});\n\t\tthis.error = error;\n\t\tthis.name = \"VertoInviteHandlerError\";\n\t}\n};\nvar VertoAttachHandlerError = class extends Error {\n\tconstructor(error = null, options) {\n\t\tsuper(\"Error handling Verto attach\", {\n\t\t\t...options,\n\t\t\tcause: options?.cause ?? (error instanceof Error ? error : void 0)\n\t\t});\n\t\tthis.error = error;\n\t\tthis.name = \"VertoAttachHandlerError\";\n\t}\n};\nvar ValidationError = class extends Error {\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tthis.name = \"ValidationError\";\n\t}\n};\nvar VertoPongError = class extends Error {\n\tconstructor(originalError) {\n\t\tsuper(\"Failed to send Verto pong - call may disconnect\", { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"VertoPongError\";\n\t}\n};\nvar MessageParseError = class extends Error {\n\tconstructor(originalError) {\n\t\tsuper(\"Failed to parse incoming WebSocket message\", { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"MessageParseError\";\n\t}\n};\nvar CollectionFetchError = class extends Error {\n\tconstructor(operation, originalError) {\n\t\tsuper(`Collection fetch failed during ${operation}`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.operation = operation;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"CollectionFetchError\";\n\t}\n};\nvar MediaTrackError = class extends Error {\n\tconstructor(operation, kind, originalError) {\n\t\tsuper(`Media track ${operation} failed for ${kind}`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.operation = operation;\n\t\tthis.kind = kind;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"MediaTrackError\";\n\t}\n};\n/** True when a `getUserMedia`/`getDisplayMedia` rejection is a permission denial. */\nfunction isMediaAccessDenial(originalError) {\n\treturn originalError instanceof Error && MEDIA_ACCESS_DENIAL_NAMES.includes(originalError.name);\n}\n/**\n* Failure to acquire local media (camera, microphone, or screen capture)\n* via `getUserMedia`/`getDisplayMedia`.\n*\n* Non-fatal by default: screenshare and additional-device failures never\n* end the call, and main-connection failures degrade to receive-only when\n* possible. The wrapping site sets `fatal` to `true` only when the call\n* cannot continue (receive-only fallback disabled or no receive intent).\n*/\nvar MediaAccessError = class extends Error {\n\tconstructor(operation, media, originalError, fatal = false) {\n\t\tsuper(`Media access ${isMediaAccessDenial(originalError) ? \"denied\" : \"failed\"} for ${operation} (${media})`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.operation = operation;\n\t\tthis.media = media;\n\t\tthis.originalError = originalError;\n\t\tthis.fatal = fatal;\n\t\tthis.name = \"MediaAccessError\";\n\t}\n\t/** True when the underlying failure is a permission denial (user or policy). */\n\tget denied() {\n\t\treturn isMediaAccessDenial(this.originalError);\n\t}\n};\nvar DPoPInitError = class extends Error {\n\tconstructor(originalError, message = \"Failed to initialize DPoP key pair\") {\n\t\tsuper(message, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"DPoPInitError\";\n\t}\n};\n/**\n* Error thrown when a recovery attempt fails.\n*\n* Carries the recovery action and attempt number for diagnostic purposes.\n*/\nvar RecoveryError = class extends Error {\n\tconstructor(action, attempt, originalError) {\n\t\tsuper(`Recovery failed: ${action} (attempt ${attempt})`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.action = action;\n\t\tthis.attempt = attempt;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"RecoveryError\";\n\t}\n};\n/**\n* Error thrown when getUserMedia fails with OverconstrainedError\n* and all fallback levels have been exhausted.\n*/\nvar OverconstrainedFallbackError = class extends Error {\n\tconstructor(deviceKind, originalError) {\n\t\tsuper(`All constraint fallback levels exhausted for ${deviceKind}`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.deviceKind = deviceKind;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"OverconstrainedFallbackError\";\n\t}\n};\n/**\n* Error thrown when the preflight connectivity test fails.\n*/\nvar PreflightError = class extends Error {\n\tconstructor(phase, originalError) {\n\t\tsuper(`Preflight test failed during ${phase}`, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.phase = phase;\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"PreflightError\";\n\t}\n};\nvar DeviceTokenError = class extends Error {\n\tconstructor(message, originalError) {\n\t\tsuper(message, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"DeviceTokenError\";\n\t}\n};\nvar TokenRefreshError = class extends Error {\n\tconstructor(message, originalError) {\n\t\tsuper(message, { cause: originalError instanceof Error ? originalError : void 0 });\n\t\tthis.originalError = originalError;\n\t\tthis.name = \"TokenRefreshError\";\n\t}\n};\n\n//#endregion\n//#region src/utils/logger.ts\nconst datetime = () => (/* @__PURE__ */ new Date()).toISOString();\nconst defaultLogger = log.getLogger(\"signalwire\");\nconst originalFactory = defaultLogger.methodFactory;\ndefaultLogger.methodFactory = (methodName, logLevel, loggerName) => {\n\tconst rawMethod = originalFactory(methodName, logLevel, loggerName);\n\treturn function(...args) {\n\t\tconst prefixed = [\n\t\t\tdatetime(),\n\t\t\t\"-\",\n\t\t\t...args\n\t\t];\n\t\trawMethod.apply(void 0, prefixed);\n\t};\n};\nconst defaultLoggerLevel = defaultLogger.levels.WARN;\ndefaultLogger.setLevel(defaultLoggerLevel);\nlet userLogger = null;\n/** Replace the built-in logger with a custom implementation. Pass `null` to restore defaults. */\nconst setLogger = (logger$1) => {\n\tuserLogger = logger$1;\n};\nlet debugOptions = {};\n/** Configure debug options (e.g., `{ logWsTraffic: true }`). */\nconst setDebugOptions = (options) => {\n\tif (options == null) {\n\t\tdebugOptions = {};\n\t\treturn;\n\t}\n\tdebugOptions = {\n\t\t...debugOptions,\n\t\t...options\n\t};\n};\n/**\n* Set the log level for the built-in logger.\n* Has no effect when a custom logger is set via `setLogger()`.\n*/\nconst setLogLevel = (level) => {\n\tdefaultLogger.setLevel(level);\n};\nconst getLoggerInstance = () => {\n\treturn userLogger ?? defaultLogger;\n};\nconst shouldStringify = (payload) => {\n\tif (payload != null && typeof payload === \"object\" && \"method\" in payload) return payload.method !== \"signalwire.ping\";\n\treturn true;\n};\nconst wsTraffic = (options) => {\n\tconst { logWsTraffic } = debugOptions;\n\tif (!logWsTraffic) return;\n\tconst loggerInstance = getLoggerInstance();\n\tlet payload;\n\tif (\"raw\" in options) try {\n\t\tpayload = JSON.parse(options.raw);\n\t} catch {\n\t\tloggerInstance.debug(`[WebSocket] ${options.type.toUpperCase()}: non-JSON message`);\n\t\treturn;\n\t}\n\telse ({payload} = options);\n\tconst msg = shouldStringify(payload) ? JSON.stringify(payload, null, 2) : payload;\n\tloggerInstance.debug(`${options.type.toUpperCase()}: \\n`, msg, \"\\n\");\n};\nconst getLogger = () => {\n\tconst logger$1 = getLoggerInstance();\n\treturn new Proxy(logger$1, { get(_target, prop, _receiver) {\n\t\tif (prop === \"wsTraffic\") return wsTraffic;\n\t\tconst instance = getLoggerInstance();\n\t\tconst value = Reflect.get(instance, prop);\n\t\tif (typeof value === \"function\") return value.bind(instance);\n\t\treturn value;\n\t} });\n};\n\n//#endregion\n//#region src/operators/filterNull.ts\n/**\n* RxJS operator that filters out `null` and `undefined` values with type narrowing.\n*\n* @example\n* ```ts\n* source$.pipe(filterNull()).subscribe(value => {\n*   // value is guaranteed non-null\n* });\n* ```\n*/\nfunction filterNull() {\n\treturn filter((value) => value != null);\n}\n\n//#endregion\n//#region src/utils/getValueFrom.ts\nconst getValueFrom = (obj, path, defaultValue) => {\n\tconst keys = path.split(\".\");\n\tlet result = obj;\n\tfor (const key of keys) if (result && typeof result === \"object\" && key in result) result = result[key];\n\telse return defaultValue;\n\treturn result === void 0 ? defaultValue : result;\n};\n\n//#endregion\n//#region src/operators/filterEventAs.ts\n/**\n* RxJS operator that filters events based on a predicate and maps matching events.\n*\n* This operator combines filter and map operations:\n* 1. Only events that match the predicate are emitted\n* 2. Matching events are transformed using the map function\n*\n* @template TInput - The type of input events\n* @template TOutput - The type of output after mapping\n* @param predicate - Function to test each event. Returns true to include the event.\n* @param mapFn - Function to transform matching events\n* @returns An operator function that filters and maps events\n*\n* @example\n* ```typescript\n* interface CallEvent {\n*   type: 'call.started' | 'call.ended';\n*   id: string;\n*   timestamp: number;\n* }\n*\n* events$.pipe(\n*   isEvent(\n*     (event: CallEvent) => event.type === 'call.started',\n*     (event: CallEvent) => ({ id: event.id, timestamp: event.timestamp })\n*   )\n* ).subscribe(startEvent => {\n*   console.log('Call started:', startEvent);\n* });\n* ```\n*/\nfunction ifIsMap(predicate, mapFn) {\n\treturn pipe(filter$1(predicate), map$1(mapFn));\n}\n/**\n* Generic RxJS operator that filters events using a type guard and extracts a property.\n*\n* This is the generic version that works with any type, not just JSONRPCRequest.\n* Use this when you need to filter and extract properties from already-narrowed types.\n*\n* **Type inference**: The output type is automatically inferred from the input type and path!\n*\n* @template TInput - The type to narrow to (via type guard)\n* @template TPath - The dot-notation path to extract (inferred from parameter)\n* @param predicate - Type guard function to filter events\n* @param resultPath - Dot-notation path to extract (e.g., 'params', 'params.data')\n* @returns An operator function that filters and extracts\n*\n* @example\n* ```typescript\n* interface EventParams {\n*   event_type: string;\n*   data: { value: number };\n* }\n*\n* const isAuthEvent = (e: unknown): e is EventParams =>\n*   typeof e === 'object' && e !== null && 'event_type' in e;\n*\n* // Type of 'data' is automatically inferred as { value: number }\n* params$.pipe(\n*   filterAs(isAuthEvent, 'data')\n* ).subscribe(data => {\n*   console.log('Event data:', data.value); // TypeScript knows about .value!\n* });\n*\n* // Deeply nested properties are also inferred\n* params$.pipe(\n*   filterAs(isAuthEvent, 'data.value')\n* ).subscribe(value => {\n*   console.log(value); // Type is 'number'\n* });\n* ```\n*/\nfunction filterAs(predicate, resultPath) {\n\treturn pipe(ifIsMap(predicate, (event) => {\n\t\treturn getValueFrom(event, resultPath);\n\t}), filter$1((value) => value !== void 0));\n}\n\n//#endregion\n//#region src/operators/throwOnRPCError.ts\nconst logger = getLogger();\n/**\n* RxJS operator that throws a {@link JSONRPCError} when the RPC response contains an error.\n* Passes successful responses through unchanged.\n*/\nfunction throwOnRPCError() {\n\treturn map((response) => {\n\t\tif (response.error) {\n\t\t\tlogger.error(\"[throwOnRPCError] RPC error response:\", {\n\t\t\t\tcode: response.error.code,\n\t\t\t\tmessage: response.error.message,\n\t\t\t\tdata: response.error.data\n\t\t\t});\n\t\t\tthrow new JSONRPCError(response.error.code, response.error.message, response.error.data);\n\t\t}\n\t\tlogger.debug(\"[throwOnRPCError] RPC successful response:\", response);\n\t\treturn response;\n\t});\n}\n\n//#endregion\nexport { DEFAULT_DEGRADATION_BITRATE_THRESHOLD_KBPS as $, VAD_HOLD_MS as $t, SerializationError as A, DEFAULT_STATS_POLLING_INTERVAL_MS as At, VertoInviteHandlerError as B, DEVICE_TOKEN_ENDPOINT as Bt, MessageParseError as C, DEFAULT_REINVITE_MAX_ATTEMPTS as Ct, RecoveryError as D, DEFAULT_STATS_JITTER_SPIKE_MULTIPLIER as Dt, RPCTimeoutError as E, DEFAULT_STATS_HISTORY_SIZE as Et, TransportConnectionError as F, DEVICE_REFRESH_ENDPOINT as Ft, CREDENTIAL_ACTIVATE_TIMEOUT_MS as G, INVITE_VERSION as Gt, WebSocketConnectionError as H, DEVICE_TOKEN_REFRESH_MAX_RETRIES as Ht, UnexpectedError as I, DEVICE_STORAGE_KEY_AUDIO_INPUT as It, CREDENTIAL_REFRESH_MAX_RETRIES as J, PREFERENCES_STORAGE_KEY as Jt, CREDENTIAL_REFRESH_BUFFER_MS as K, PEER_CONNECTION_RECOVERY_POLL_MS as Kt, UnimplementedError as L, DEVICE_STORAGE_KEY_AUDIO_OUTPUT as Lt, StorageReadError as M, DEFAULT_STEREO_AUDIO as Mt, StorageWriteError as N, DEFAULT_STEREO_MAX_AVERAGE_BITRATE as Nt, RequestError as O, DEFAULT_STATS_NO_PACKET_THRESHOLD_MS as Ot, TokenRefreshError as P, DEFAULT_SYNC_DEVICES_TO_ACTIVE_CALLS as Pt, DEFAULT_CONNECTION_TIMEOUT_MS as Q, SAT_REFRESH_SCOPE as Qt, ValidationError as R, DEVICE_STORAGE_KEY_VIDEO_INPUT as Rt, MediaTrackError as S, DEFAULT_REINVITE_DEBOUNCE_TIME_MS as St, PreflightError as T, DEFAULT_STATS_BASELINE_SAMPLES as Tt, WebSocketTimeoutError as U, DEVICE_TOKEN_REFRESH_RETRY_BASE_MS as Ut, VertoPongError as V, DEVICE_TOKEN_REFRESH_BUFFER_MS as Vt, AUDIO_LEVEL_POLL_INTERVAL_MS as W, ICE_GATHERING_COMPLETE_TIMEOUT_MS as Wt, DEFAULT_AUTO_MUTE_VIDEO_ON_HIDDEN as X, RPC_ERROR_INVALID_PARAMS as Xt, CREDENTIAL_REFRESH_RETRY_BASE_MS as Y, RPC_ERROR_AUTHENTICATION_FAILED as Yt, DEFAULT_CHECK_CONNECTION_ON_VISIBLE as Z, RPC_ERROR_REQUESTER_VALIDATION_FAILED as Zt, DeviceTokenError as _, DEFAULT_RECONNECT_DELAY_MAX_MS as _t, filterNull as a, DEFAULT_ENABLE_RELAY_FALLBACK as at, JSONRPCError as b, DEFAULT_RECOVERY_DEBOUNCE_TIME_MS as bt, setLogLevel as c, DEFAULT_ICE_DISCONNECTED_GRACE_PERIOD_MS as ct, CallCreateError as d, DEFAULT_KEYFRAME_BURST_WINDOW_MS as dt, VAD_THRESHOLD as en, DEFAULT_DEGRADATION_RECOVERY_THRESHOLD_KBPS as et, CollectionFetchError as f, DEFAULT_KEYFRAME_COOLDOWN_MS as ft, DeserializationError as g, DEFAULT_RECONNECT_CALLS_TIMEOUT_MS as gt, DependencyError as h, DEFAULT_PERSIST_DEVICE_SELECTION as ht, getValueFrom as i, DEFAULT_ENABLE_NETWORK_CHANGE_DETECTION as it, StorageNotAvailableError as j, DEFAULT_STATS_RTT_SPIKE_MULTIPLIER as jt, RequestTimeoutError as k, DEFAULT_STATS_PACKET_LOSS_THRESHOLD as kt, setLogger as l, DEFAULT_ICE_GATHERING_TIMEOUT_MS as lt, DPoPInitError as m, DEFAULT_MAX_RECOVERY_ATTEMPTS as mt, filterAs as n, DEFAULT_DEVICE_POLLING_INTERVAL_MS as nt, getLogger as o, DEFAULT_ENABLE_SERVER_HANGUP_INTERCEPTION as ot, ConversationError as p, DEFAULT_KEYFRAME_MAX_BURST as pt, CREDENTIAL_REFRESH_MAX_DELAY_MS as q, PEER_CONNECTION_RECOVERY_WAIT_MS as qt, ifIsMap as r, DEFAULT_ENABLE_AUTO_DEGRADATION as rt, setDebugOptions as s, DEFAULT_ICE_CANDIDATE_TIMEOUT_MS as st, throwOnRPCError as t, DEFAULT_DEVICE_DEBOUNCE_TIME_MS as tt, AuthStateHandlerError as u, DEFAULT_ICE_RESTART_TIMEOUT_MS as ut, InvalidCredentialsError as v, DEFAULT_RECONNECT_DELAY_MIN_MS as vt, OverconstrainedFallbackError as w, DEFAULT_REINVITE_TIMEOUT_MS as wt, MediaAccessError as x, DEFAULT_REFRESH_DEVICES_ON_VISIBLE as xt, InvalidParams as y, DEFAULT_RECOVERY_COOLDOWN_MS as yt, VertoAttachHandlerError as z, DEVICE_TOKEN_DEFAULT_EXPIRE_IN as zt };\n//# sourceMappingURL=operators-BlUtq-t0.mjs.map","export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n    return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n        let code = p.charCodeAt(0).toString(16).toUpperCase();\n        if (code.length < 2) {\n            code = \"0\" + code;\n        }\n        return \"%\" + code;\n    }));\n}\nfunction base64UrlDecode(str) {\n    let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    switch (output.length % 4) {\n        case 0:\n            break;\n        case 2:\n            output += \"==\";\n            break;\n        case 3:\n            output += \"=\";\n            break;\n        default:\n            throw new Error(\"base64 string is not of the correct length\");\n    }\n    try {\n        return b64DecodeUnicode(output);\n    }\n    catch (err) {\n        return atob(output);\n    }\n}\nexport function jwtDecode(token, options) {\n    if (typeof token !== \"string\") {\n        throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n    }\n    options || (options = {});\n    const pos = options.header === true ? 0 : 1;\n    const part = token.split(\".\")[pos];\n    if (typeof part !== \"string\") {\n        throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n    }\n    let decoded;\n    try {\n        decoded = base64UrlDecode(part);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n    }\n    try {\n        return JSON.parse(decoded);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n    }\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!validate(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexport default stringify;\n","const rnds8 = new Uint8Array(16);\nexport default function rng() {\n    return crypto.getRandomValues(rnds8);\n}\n","import rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n    if (!buf && !options && crypto.randomUUID) {\n        return crypto.randomUUID();\n    }\n    return _v4(options, buf, offset);\n}\nfunction _v4(options, buf, offset) {\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? rng();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return unsafeStringify(rnds);\n}\nexport default v4;\n","import { $ as DEFAULT_DEGRADATION_BITRATE_THRESHOLD_KBPS, $t as VAD_HOLD_MS, A as SerializationError, At as DEFAULT_STATS_POLLING_INTERVAL_MS, B as VertoInviteHandlerError, Bt as DEVICE_TOKEN_ENDPOINT, C as MessageParseError, Ct as DEFAULT_REINVITE_MAX_ATTEMPTS, D as RecoveryError, Dt as DEFAULT_STATS_JITTER_SPIKE_MULTIPLIER, E as RPCTimeoutError, Et as DEFAULT_STATS_HISTORY_SIZE, F as TransportConnectionError, Ft as DEVICE_REFRESH_ENDPOINT, G as CREDENTIAL_ACTIVATE_TIMEOUT_MS, Gt as INVITE_VERSION, H as WebSocketConnectionError, Ht as DEVICE_TOKEN_REFRESH_MAX_RETRIES, I as UnexpectedError, It as DEVICE_STORAGE_KEY_AUDIO_INPUT, J as CREDENTIAL_REFRESH_MAX_RETRIES, Jt as PREFERENCES_STORAGE_KEY, K as CREDENTIAL_REFRESH_BUFFER_MS, Kt as PEER_CONNECTION_RECOVERY_POLL_MS, L as UnimplementedError, Lt as DEVICE_STORAGE_KEY_AUDIO_OUTPUT, M as StorageReadError, Mt as DEFAULT_STEREO_AUDIO, N as StorageWriteError, Nt as DEFAULT_STEREO_MAX_AVERAGE_BITRATE, O as RequestError, Ot as DEFAULT_STATS_NO_PACKET_THRESHOLD_MS, P as TokenRefreshError, Pt as DEFAULT_SYNC_DEVICES_TO_ACTIVE_CALLS, Q as DEFAULT_CONNECTION_TIMEOUT_MS, Qt as SAT_REFRESH_SCOPE, R as ValidationError, Rt as DEVICE_STORAGE_KEY_VIDEO_INPUT, S as MediaTrackError, St as DEFAULT_REINVITE_DEBOUNCE_TIME_MS, T as PreflightError, Tt as DEFAULT_STATS_BASELINE_SAMPLES, U as WebSocketTimeoutError, Ut as DEVICE_TOKEN_REFRESH_RETRY_BASE_MS, V as VertoPongError, Vt as DEVICE_TOKEN_REFRESH_BUFFER_MS, W as AUDIO_LEVEL_POLL_INTERVAL_MS, Wt as ICE_GATHERING_COMPLETE_TIMEOUT_MS, X as DEFAULT_AUTO_MUTE_VIDEO_ON_HIDDEN, Xt as RPC_ERROR_INVALID_PARAMS, Y as CREDENTIAL_REFRESH_RETRY_BASE_MS, Yt as RPC_ERROR_AUTHENTICATION_FAILED, Z as DEFAULT_CHECK_CONNECTION_ON_VISIBLE, Zt as RPC_ERROR_REQUESTER_VALIDATION_FAILED, _ as DeviceTokenError, _t as DEFAULT_RECONNECT_DELAY_MAX_MS, a as filterNull, at as DEFAULT_ENABLE_RELAY_FALLBACK, b as JSONRPCError, bt as DEFAULT_RECOVERY_DEBOUNCE_TIME_MS, c as setLogLevel, ct as DEFAULT_ICE_DISCONNECTED_GRACE_PERIOD_MS, d as CallCreateError, dt as DEFAULT_KEYFRAME_BURST_WINDOW_MS$1, en as VAD_THRESHOLD, et as DEFAULT_DEGRADATION_RECOVERY_THRESHOLD_KBPS, f as CollectionFetchError, ft as DEFAULT_KEYFRAME_COOLDOWN_MS$1, g as DeserializationError, gt as DEFAULT_RECONNECT_CALLS_TIMEOUT_MS, h as DependencyError, ht as DEFAULT_PERSIST_DEVICE_SELECTION, i as getValueFrom, it as DEFAULT_ENABLE_NETWORK_CHANGE_DETECTION, j as StorageNotAvailableError, jt as DEFAULT_STATS_RTT_SPIKE_MULTIPLIER, k as RequestTimeoutError, kt as DEFAULT_STATS_PACKET_LOSS_THRESHOLD, l as setLogger, lt as DEFAULT_ICE_GATHERING_TIMEOUT_MS, m as DPoPInitError, mt as DEFAULT_MAX_RECOVERY_ATTEMPTS, n as filterAs, nt as DEFAULT_DEVICE_POLLING_INTERVAL_MS, o as getLogger, ot as DEFAULT_ENABLE_SERVER_HANGUP_INTERCEPTION, p as ConversationError, pt as DEFAULT_KEYFRAME_MAX_BURST$1, q as CREDENTIAL_REFRESH_MAX_DELAY_MS, qt as PEER_CONNECTION_RECOVERY_WAIT_MS, rt as DEFAULT_ENABLE_AUTO_DEGRADATION, s as setDebugOptions, st as DEFAULT_ICE_CANDIDATE_TIMEOUT_MS, t as throwOnRPCError, tt as DEFAULT_DEVICE_DEBOUNCE_TIME_MS, u as AuthStateHandlerError, ut as DEFAULT_ICE_RESTART_TIMEOUT_MS$1, v as InvalidCredentialsError, vt as DEFAULT_RECONNECT_DELAY_MIN_MS, w as OverconstrainedFallbackError, wt as DEFAULT_REINVITE_TIMEOUT_MS, x as MediaAccessError, xt as DEFAULT_REFRESH_DEVICES_ON_VISIBLE, y as InvalidParams, yt as DEFAULT_RECOVERY_COOLDOWN_MS, z as VertoAttachHandlerError, zt as DEVICE_TOKEN_DEFAULT_EXPIRE_IN } from \"./operators-BlUtq-t0.mjs\";\nimport { jwtDecode } from \"jwt-decode\";\nimport { BehaviorSubject, EMPTY, EmptyError, NEVER, Observable, ReplaySubject, Subject, TimeoutError, animationFrameScheduler, asapScheduler, auditTime, catchError, combineLatest, debounceTime, defer, distinctUntilChanged, exhaustMap, filter, first, firstValueFrom, from, interval, lastValueFrom, map, merge, mergeMap, observeOn, of, pipe, race, scan, share, shareReplay, skip, skipWhile, startWith, switchMap, take, takeUntil, tap, throwError, timeout, timer, toArray, withLatestFrom } from \"rxjs\";\nimport { v4 } from \"uuid\";\nimport { distinctUntilChanged as distinctUntilChanged$1, map as map$1 } from \"rxjs/operators\";\n\n//#region src/behaviors/Destroyable.ts\nvar Destroyable = class {\n\tconstructor() {\n\t\tthis.subscriptions = [];\n\t\tthis.subjects = [];\n\t\tthis._destroyed$ = new Subject();\n\t}\n\tdestroy() {\n\t\tthis._observableCache?.clear();\n\t\tthis.subscriptions.forEach((sub) => sub.unsubscribe());\n\t\tthis.subjects.forEach((subject) => subject.complete());\n\t\tthis._destroyed$.next();\n\t\tthis._destroyed$.complete();\n\t}\n\tcachedObservable(key, factory) {\n\t\tthis._observableCache ??= /* @__PURE__ */ new Map();\n\t\tlet cached = this._observableCache.get(key);\n\t\tif (!cached) {\n\t\t\tcached = factory();\n\t\t\tthis._observableCache.set(key, cached);\n\t\t}\n\t\treturn cached;\n\t}\n\t/**\n\t* Like `cachedObservable`, but defers emissions to the microtask queue\n\t* via `observeOn(asapScheduler)`.\n\t*\n\t* Use ONLY for public-facing observable getters that external consumers\n\t* subscribe to. Prevents a class of bugs where `BehaviorSubject` or\n\t* `ReplaySubject` replays synchronously during `subscribe()`, before\n\t* the subscription variable is assigned in the caller's scope.\n\t*\n\t* Do NOT use for observables consumed internally by the SDK — internal\n\t* code using `subscribeTo()`, `firstValueFrom()`, or `withLatestFrom()`\n\t* depends on synchronous emission delivery.\n\t*/\n\tpublicCachedObservable(key, factory) {\n\t\tconst publicKey = `public:${key}`;\n\t\tthis._observableCache ??= /* @__PURE__ */ new Map();\n\t\tlet cached = this._observableCache.get(publicKey);\n\t\tif (!cached) {\n\t\t\tcached = factory().pipe(observeOn(asapScheduler));\n\t\t\tthis._observableCache.set(publicKey, cached);\n\t\t}\n\t\treturn cached;\n\t}\n\t/**\n\t* Wraps an observable so emissions are deferred to the microtask queue.\n\t*\n\t* Use ONLY for public-facing getters that expose a subject via\n\t* `.asObservable()` without going through `cachedObservable`.\n\t*\n\t* Do NOT use for observables consumed internally by the SDK.\n\t*/\n\tdeferEmission(observable) {\n\t\treturn observable.pipe(observeOn(asapScheduler));\n\t}\n\tsubscribeTo(observable, observerOrNext) {\n\t\tconst subscription = observable.subscribe(observerOrNext);\n\t\tthis.subscriptions.push(subscription);\n\t}\n\tcreateSubject() {\n\t\tconst subject = new Subject();\n\t\tthis.subjects.push(subject);\n\t\treturn subject;\n\t}\n\tcreateReplaySubject(bufferSize, windowTime) {\n\t\tconst subject = new ReplaySubject(bufferSize, windowTime);\n\t\tthis.subjects.push(subject);\n\t\treturn subject;\n\t}\n\tcreateBehaviorSubject(initialValue) {\n\t\tconst subject = new BehaviorSubject(initialValue);\n\t\tthis.subjects.push(subject);\n\t\treturn subject;\n\t}\n\t/**\n\t* Observable that emits when the instance is destroyed\n\t*/\n\tget destroyed$() {\n\t\treturn this._destroyed$.asObservable();\n\t}\n};\n\n//#endregion\n//#region src/utils/asyncRetry.ts\nconst DEFAULT_MAX_RETRIES = 10;\nconst DEFAULT_INITIAL_DELAY = 100;\nconst DEFAULT_DELAY_VARIATION = 1;\nconst increasingDelay = ({ delayLimit: upperDelayLimit = Number.MAX_SAFE_INTEGER, initialDelay = DEFAULT_INITIAL_DELAY, variation = DEFAULT_DELAY_VARIATION }) => {\n\tif (initialDelay < 0) throw new ValidationError(\"initialDelay must be gte 0\");\n\tif (upperDelayLimit < 0) throw new ValidationError(\"upperDelayLimit must be gte 0\");\n\tif (variation < 0) throw new ValidationError(\"variation must be gte 0\");\n\tif (initialDelay > upperDelayLimit) throw new ValidationError(\"initialDelay must be lte delayLimit\");\n\tlet delay = Math.min(initialDelay, upperDelayLimit);\n\treturn () => {\n\t\tif (delay === upperDelayLimit) return upperDelayLimit;\n\t\tconst currentDelay = delay;\n\t\tdelay = Math.min(delay + variation, upperDelayLimit);\n\t\treturn currentDelay;\n\t};\n};\nconst asyncRetry = async ({ asyncCallable, maxRetries: retries = DEFAULT_MAX_RETRIES, delayFn, validator, expectedErrorHandler }) => {\n\tlet remainingAttempts = retries - 1;\n\tlet wait = 0;\n\tconst promiseAttempt = async () => {\n\t\ttry {\n\t\t\tlet result;\n\t\t\tif (wait <= 0) result = await asyncCallable();\n\t\t\telse result = await new Promise((resolve, reject) => setTimeout(() => {\n\t\t\t\tasyncCallable().then(resolve).catch(reject);\n\t\t\t}, wait));\n\t\t\tif (remainingAttempts) validator?.(result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (remainingAttempts-- > 0 && !expectedErrorHandler?.(error)) {\n\t\t\t\twait = delayFn?.() ?? 0;\n\t\t\t\tgetLogger().debug(`Retrying request: ${retries - remainingAttempts} of ${retries}`);\n\t\t\t\treturn promiseAttempt();\n\t\t\t} else throw error;\n\t\t}\n\t};\n\treturn promiseAttempt();\n};\n\n//#endregion\n//#region src/controllers/HTTPRequestController.ts\nconst logger$31 = getLogger();\nconst GET_PARAMS = {\n\tmethod: \"GET\",\n\theaders: { Accept: \"application/json\" }\n};\nconst POST_PARAMS = {\n\tmethod: \"POST\",\n\theaders: {\n\t\tAccept: \"application/json\",\n\t\t\"Content-Type\": \"application/json\"\n\t}\n};\nvar HTTPRequestController = class HTTPRequestController extends Destroyable {\n\tstatic {\n\t\tthis.defaultMaxRetries = 3;\n\t}\n\tstatic {\n\t\tthis.defaultRetryDelayMinMs = 1e3;\n\t}\n\tstatic {\n\t\tthis.defaultRetryDelayMaxMs = 3e4;\n\t}\n\tstatic {\n\t\tthis.defaultRequestTimeoutMs = 3e4;\n\t}\n\tstatic {\n\t\tthis.SENSITIVE_BODY_FIELDS = new Set([\n\t\t\t\"dpop_token\",\n\t\t\t\"token\",\n\t\t\t\"jwt_token\"\n\t\t]);\n\t}\n\tconstructor(baseURL, getCredential, options = {}) {\n\t\tsuper();\n\t\tthis.baseURL = baseURL;\n\t\tthis.getCredential = getCredential;\n\t\tthis._responses$ = this.createSubject();\n\t\tthis._errors$ = this.createSubject();\n\t\tthis._status$ = this.createBehaviorSubject(\"idle\");\n\t\tthis.maxRetries = options.maxRetries ?? HTTPRequestController.defaultMaxRetries;\n\t\tthis.retryDelayMin = options.retryDelayMin ?? HTTPRequestController.defaultRetryDelayMinMs;\n\t\tthis.retryDelayMax = options.retryDelayMax ?? HTTPRequestController.defaultRetryDelayMaxMs;\n\t\tthis.requestTimeout = options.requestTimeout ?? HTTPRequestController.defaultRequestTimeoutMs;\n\t}\n\tget status$() {\n\t\treturn this._status$.asObservable();\n\t}\n\tget status() {\n\t\treturn this._status$.value;\n\t}\n\tget responses$() {\n\t\treturn this._responses$.asObservable();\n\t}\n\tget errors$() {\n\t\treturn this._errors$.asObservable();\n\t}\n\tasync request(request) {\n\t\tthis._status$.next(\"requesting\");\n\t\ttry {\n\t\t\tconst response = await this.executeWithRetry(request);\n\t\t\tthis._status$.next(\"success\");\n\t\t\tthis._responses$.next(response);\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tlogger$31.error(\"[HTTPRequestController] Request error:\", error);\n\t\t\tthis._status$.next(\"error\");\n\t\t\tconst err = error instanceof Error ? error : new Error(\"HTTP request failed\", { cause: error });\n\t\t\tthis._errors$.next(err);\n\t\t\tthrow err;\n\t\t}\n\t}\n\tasync executeWithRetry(request) {\n\t\tconst variation = Math.ceil((this.retryDelayMax - this.retryDelayMin) / Math.max(this.maxRetries - 1, 1));\n\t\tconst delayFn = increasingDelay({\n\t\t\tinitialDelay: this.retryDelayMin,\n\t\t\tvariation,\n\t\t\tdelayLimit: this.retryDelayMax\n\t\t});\n\t\treturn asyncRetry({\n\t\t\tasyncCallable: async () => this.executeRequest(request),\n\t\t\tmaxRetries: this.maxRetries,\n\t\t\tdelayFn,\n\t\t\tvalidator: (response) => {\n\t\t\t\tif (response.status >= 500 && response.status < 600) throw new UnexpectedError(`Server error: ${response.status} ${response.statusText}`);\n\t\t\t}\n\t\t});\n\t}\n\tasync executeRequest(request) {\n\t\tconst url = this.buildURL(request.url);\n\t\tconst headers = this.buildHeaders(request.headers);\n\t\tconst timeout$1 = request.timeout ?? this.requestTimeout;\n\t\tlogger$31.debug(\"[HTTPRequestController] Executing request:\", {\n\t\t\tmethod: request.method,\n\t\t\turl,\n\t\t\theaders: Object.keys(headers).reduce((acc, key) => {\n\t\t\t\tacc[key] = key === \"Authorization\" ? `${headers[key].substring(0, 20)}...` : headers[key];\n\t\t\t\treturn acc;\n\t\t\t}, {}),\n\t\t\tbody: this.sanitizeBody(request.body)\n\t\t});\n\t\tconst controller = new AbortController();\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeout$1);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: request.method,\n\t\t\t\theaders,\n\t\t\t\tbody: request.body,\n\t\t\t\tsignal: controller.signal\n\t\t\t});\n\t\t\tclearTimeout(timeoutId);\n\t\t\tconst httpResponse = await this.convertResponse(response);\n\t\t\tlogger$31.debug(\"[HTTPRequestController] Response received:\", {\n\t\t\t\tstatus: response.status,\n\t\t\t\tstatusText: response.statusText,\n\t\t\t\theaders: [...response.headers.entries()],\n\t\t\t\tbody: httpResponse.body ? httpResponse.body.substring(0, 200) : \"(empty)\"\n\t\t\t});\n\t\t\treturn httpResponse;\n\t\t} catch (error) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") throw new RequestTimeoutError(`Request timeout after ${timeout$1}ms`, { cause: error });\n\t\t\tlogger$31.error(\"[HTTPRequestController] Request failed:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tbuildURL(url) {\n\t\tconst urlString = typeof url === \"string\" ? url : url.toString();\n\t\tif (urlString.startsWith(\"http://\") || urlString.startsWith(\"https://\")) return urlString;\n\t\treturn `${this.baseURL.endsWith(\"/\") ? this.baseURL.slice(0, -1) : this.baseURL}${urlString.startsWith(\"/\") ? urlString : `/${urlString}`}`;\n\t}\n\tbuildHeaders(requestHeaders) {\n\t\tconst headers = { ...requestHeaders ?? {} };\n\t\tconst credential = this.getCredential();\n\t\tif (credential.token) {\n\t\t\theaders.Authorization = `Bearer ${credential.token}`;\n\t\t\tlogger$31.debug(\"[HTTPRequestController] Using Bearer token auth, token length:\", credential.token.length);\n\t\t} else logger$31.warn(\"[HTTPRequestController] No credentials available for authentication\");\n\t\treturn headers;\n\t}\n\t/**\n\t* Sanitizes a request body for debug logging by masking sensitive fields.\n\t*/\n\tsanitizeBody(body) {\n\t\tif (!body || typeof body !== \"string\") return body ? \"(non-string body)\" : void 0;\n\t\ttry {\n\t\t\tconst sanitized = { ...JSON.parse(body) };\n\t\t\tfor (const key of Object.keys(sanitized)) if (HTTPRequestController.SENSITIVE_BODY_FIELDS.has(key) && typeof sanitized[key] === \"string\") sanitized[key] = `${sanitized[key].substring(0, 20)}...[redacted]`;\n\t\t\treturn JSON.stringify(sanitized);\n\t\t} catch {\n\t\t\treturn body.length > 200 ? `${body.substring(0, 200)}...` : body;\n\t\t}\n\t}\n\tasync convertResponse(response) {\n\t\tconst headers = {};\n\t\tresponse.headers.forEach((value, key) => {\n\t\t\theaders[key] = value;\n\t\t});\n\t\tconst bodyText = await response.text();\n\t\treturn {\n\t\t\tstatus: response.status,\n\t\t\tstatusText: response.statusText,\n\t\t\theaders,\n\t\t\tbody: bodyText,\n\t\t\tok: response.ok,\n\t\t\turl: response.url\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/controllers/DeviceHistoryManager.ts\n/**\n* DeviceHistoryManager - Maintains a per-kind stack of recently used devices.\n*\n* When a device disappears during a call, the SDK uses this history to fall\n* back to the previously used device rather than picking an arbitrary default.\n* This handles the common scenario of AirPods disconnecting and the user\n* expecting to return to their built-in microphone.\n*\n* This is a pure data structure -- it does not extend Destroyable since it\n* holds no subscriptions or subjects.\n*\n* @see Section 5.2 of the Implementation Guide\n*/\n/** Maximum number of entries retained per device kind. */\nconst MAX_HISTORY_SIZE = 5;\n/**\n* Converts a MediaDeviceInfo to a serializable HistoryEntry.\n*/\nconst toHistoryEntry = (device, kind) => ({\n\tdeviceId: device.deviceId,\n\tlabel: device.label,\n\tgroupId: device.groupId,\n\tkind\n});\nvar DeviceHistoryManager = class {\n\tconstructor() {\n\t\tthis._stacks = {\n\t\t\taudioinput: [],\n\t\t\taudiooutput: [],\n\t\t\tvideoinput: []\n\t\t};\n\t}\n\t/**\n\t* Push a device onto the history stack for the given kind.\n\t*\n\t* If the device is already at the top of the stack, this is a no-op.\n\t* Duplicate entries deeper in the stack are removed to keep the stack clean.\n\t* The stack is capped at {@link MAX_HISTORY_SIZE} entries.\n\t*\n\t* @param kind - The device kind (audioinput, audiooutput, videoinput)\n\t* @param device - The MediaDeviceInfo to record\n\t*/\n\tpush(kind, device) {\n\t\tconst entry = toHistoryEntry(device, kind);\n\t\tconst current = this._stacks[kind];\n\t\tif (current.length > 0 && current[0].deviceId === entry.deviceId) return;\n\t\tconst filtered = current.filter((e) => e.deviceId !== entry.deviceId);\n\t\tthis._stacks[kind] = [entry, ...filtered].slice(0, MAX_HISTORY_SIZE);\n\t}\n\t/**\n\t* Pop the most recent device from the history stack for the given kind.\n\t*\n\t* @param kind - The device kind\n\t* @returns The most recent HistoryEntry, or undefined if the stack is empty\n\t*/\n\tpop(kind) {\n\t\tconst current = this._stacks[kind];\n\t\tif (current.length === 0) return;\n\t\tconst [top, ...rest] = current;\n\t\tthis._stacks[kind] = rest;\n\t\treturn top;\n\t}\n\t/**\n\t* Find the most recent device in the history that is still present in the\n\t* available device list.\n\t*\n\t* Searches the history stack from most recent to oldest. A device is\n\t* considered a match if its deviceId or (groupId + label) match an\n\t* available device.\n\t*\n\t* @param kind - The device kind\n\t* @param availableDevices - The current list of available devices\n\t* @returns The matching MediaDeviceInfo from availableDevices, or undefined\n\t*/\n\tfindInHistory(kind, availableDevices) {\n\t\tconst history = this._stacks[kind];\n\t\tfor (const entry of history) {\n\t\t\tconst exactMatch = availableDevices.find((d) => d.deviceId === entry.deviceId);\n\t\t\tif (exactMatch) return exactMatch;\n\t\t\tconst groupMatch = availableDevices.find((d) => d.groupId === entry.groupId && d.label === entry.label);\n\t\t\tif (groupMatch) return groupMatch;\n\t\t}\n\t}\n\t/**\n\t* Return a read-only snapshot of the history stack for a given kind.\n\t*\n\t* @param kind - The device kind\n\t* @returns A read-only array of HistoryEntry objects, most recent first\n\t*/\n\tgetHistory(kind) {\n\t\treturn this._stacks[kind];\n\t}\n\t/**\n\t* Clear all history stacks.\n\t*/\n\tclear() {\n\t\tthis._stacks.audioinput = [];\n\t\tthis._stacks.audiooutput = [];\n\t\tthis._stacks.videoinput = [];\n\t}\n};\n\n//#endregion\n//#region src/utils/time.ts\nfunction fromSecToMs(seconds) {\n\treturn seconds * 1e3;\n}\nfunction fromMsToSec(milliseconds) {\n\treturn Math.round(milliseconds / 100) / 10;\n}\n\n//#endregion\n//#region src/containers/PreferencesContainer.ts\nconst logger$30 = getLogger();\nvar PreferencesContainer = class PreferencesContainer {\n\tstatic get instance() {\n\t\tthis._instance ??= new PreferencesContainer();\n\t\treturn this._instance;\n\t}\n\tconstructor() {\n\t\tthis.deviceDebounceTime = DEFAULT_DEVICE_DEBOUNCE_TIME_MS;\n\t\tthis.devicePollingInterval = DEFAULT_DEVICE_POLLING_INTERVAL_MS;\n\t\tthis.reconnectCallsTimeout = DEFAULT_RECONNECT_CALLS_TIMEOUT_MS;\n\t\tthis.connectionTimeout = DEFAULT_CONNECTION_TIMEOUT_MS;\n\t\tthis.reconnectDelayMin = DEFAULT_RECONNECT_DELAY_MIN_MS;\n\t\tthis.reconnectDelayMax = DEFAULT_RECONNECT_DELAY_MAX_MS;\n\t\tthis.disableUdpIceServers = false;\n\t\tthis.relayOnly = false;\n\t\tthis.iceCandidateTimeout = DEFAULT_ICE_CANDIDATE_TIMEOUT_MS;\n\t\tthis.iceGatheringTimeout = DEFAULT_ICE_GATHERING_TIMEOUT_MS;\n\t\tthis.defaultSignalWireOptions = {\n\t\t\tskipConnection: false,\n\t\t\tskipRegister: false,\n\t\t\treconnectAttachedCalls: false,\n\t\t\tskipDeviceMonitoring: false,\n\t\t\tsavePreferences: false\n\t\t};\n\t\tthis.receiveVideo = false;\n\t\tthis.receiveAudio = true;\n\t\tthis.preferredAudioInput = null;\n\t\tthis.preferredAudioOutput = null;\n\t\tthis.preferredVideoInput = null;\n\t\tthis.inviteSubscribeScreenshare = [\"video.room.screenshare\"];\n\t\tthis.inviteSubscribeAdditionalDevice = [];\n\t\tthis.inviteSubscribeMainDevice = [\n\t\t\t\"track\",\n\t\t\t\"destroy\",\n\t\t\t\"member.updated.videoMuted\",\n\t\t\t\"layout.changed\",\n\t\t\t\"room.subscribed\",\n\t\t\t\"member.updated.audioMuted\",\n\t\t\t\"media.connected\",\n\t\t\t\"room.updated\",\n\t\t\t\"call.joined\"\n\t\t];\n\t\tthis.userVariables = {};\n\t\tthis.statsPollingInterval = DEFAULT_STATS_POLLING_INTERVAL_MS;\n\t\tthis.statsBaselineSamples = DEFAULT_STATS_BASELINE_SAMPLES;\n\t\tthis.statsNoPacketThreshold = DEFAULT_STATS_NO_PACKET_THRESHOLD_MS;\n\t\tthis.statsRttSpikeMultiplier = DEFAULT_STATS_RTT_SPIKE_MULTIPLIER;\n\t\tthis.statsPacketLossThreshold = DEFAULT_STATS_PACKET_LOSS_THRESHOLD;\n\t\tthis.statsJitterSpikeMultiplier = DEFAULT_STATS_JITTER_SPIKE_MULTIPLIER;\n\t\tthis.statsHistorySize = DEFAULT_STATS_HISTORY_SIZE;\n\t\tthis.keyframeMaxBurst = DEFAULT_KEYFRAME_MAX_BURST$1;\n\t\tthis.keyframeBurstWindow = DEFAULT_KEYFRAME_BURST_WINDOW_MS$1;\n\t\tthis.keyframeCooldown = DEFAULT_KEYFRAME_COOLDOWN_MS$1;\n\t\tthis.reinviteDebounceTime = DEFAULT_REINVITE_DEBOUNCE_TIME_MS;\n\t\tthis.reinviteMaxAttempts = DEFAULT_REINVITE_MAX_ATTEMPTS;\n\t\tthis.reinviteTimeout = DEFAULT_REINVITE_TIMEOUT_MS;\n\t\tthis.recoveryDebounceTime = DEFAULT_RECOVERY_DEBOUNCE_TIME_MS;\n\t\tthis.recoveryCooldown = DEFAULT_RECOVERY_COOLDOWN_MS;\n\t\tthis.iceDisconnectedGracePeriod = DEFAULT_ICE_DISCONNECTED_GRACE_PERIOD_MS;\n\t\tthis.iceRestartTimeout = DEFAULT_ICE_RESTART_TIMEOUT_MS$1;\n\t\tthis.maxRecoveryAttempts = DEFAULT_MAX_RECOVERY_ATTEMPTS;\n\t\tthis.enableRelayFallback = DEFAULT_ENABLE_RELAY_FALLBACK;\n\t\tthis.enableNetworkChangeDetection = DEFAULT_ENABLE_NETWORK_CHANGE_DETECTION;\n\t\tthis.enableServerHangupInterception = DEFAULT_ENABLE_SERVER_HANGUP_INTERCEPTION;\n\t\tthis.persistDeviceSelection = DEFAULT_PERSIST_DEVICE_SELECTION;\n\t\tthis.syncDevicesToActiveCalls = DEFAULT_SYNC_DEVICES_TO_ACTIVE_CALLS;\n\t\tthis.autoMuteVideoOnHidden = DEFAULT_AUTO_MUTE_VIDEO_ON_HIDDEN;\n\t\tthis.refreshDevicesOnVisible = DEFAULT_REFRESH_DEVICES_ON_VISIBLE;\n\t\tthis.checkConnectionOnVisible = DEFAULT_CHECK_CONNECTION_ON_VISIBLE;\n\t\tthis.defaultAudioConstraints = void 0;\n\t\tthis.defaultVideoConstraints = void 0;\n\t\tthis.stereoAudio = DEFAULT_STEREO_AUDIO;\n\t\tthis.enableAutoDegradation = DEFAULT_ENABLE_AUTO_DEGRADATION;\n\t\tthis.degradationBitrateThreshold = DEFAULT_DEGRADATION_BITRATE_THRESHOLD_KBPS;\n\t\tthis.degradationRecoveryThreshold = DEFAULT_DEGRADATION_RECOVERY_THRESHOLD_KBPS;\n\t\tthis.preferredVideoCodecs = [];\n\t\tthis.preferredAudioCodecs = [];\n\t}\n\tget preferredMediaOptions() {\n\t\treturn {\n\t\t\treceiveVideo: this.receiveVideo,\n\t\t\treceiveAudio: this.receiveAudio,\n\t\t\tinputAudioDeviceConstraints: this.inputAudioDeviceConstraints,\n\t\t\tinputVideoDeviceConstraints: this.inputVideoDeviceConstraints\n\t\t};\n\t}\n\tget inputAudioDeviceConstraints() {\n\t\treturn this._inputAudioDeviceConstraints;\n\t}\n\tset inputAudioDeviceConstraints(value) {\n\t\tthis._inputAudioDeviceConstraints = value;\n\t}\n\tget inputVideoDeviceConstraints() {\n\t\treturn this._inputVideoDeviceConstraints;\n\t}\n\tset inputVideoDeviceConstraints(value) {\n\t\tthis._inputVideoDeviceConstraints = value;\n\t}\n};\n/** Keys of StoredPreferences that map to number fields on PreferencesContainer. */\nconst STORED_NUMBER_KEYS = [\n\t\"connectionTimeout\",\n\t\"reconnectCallsTimeout\",\n\t\"reconnectDelayMin\",\n\t\"reconnectDelayMax\",\n\t\"iceCandidateTimeout\",\n\t\"iceGatheringTimeout\",\n\t\"deviceDebounceTime\",\n\t\"devicePollingInterval\",\n\t\"statsPollingInterval\",\n\t\"statsBaselineSamples\",\n\t\"statsNoPacketThreshold\",\n\t\"statsRttSpikeMultiplier\",\n\t\"statsPacketLossThreshold\",\n\t\"statsJitterSpikeMultiplier\",\n\t\"statsHistorySize\",\n\t\"keyframeMaxBurst\",\n\t\"keyframeBurstWindow\",\n\t\"keyframeCooldown\",\n\t\"reinviteDebounceTime\",\n\t\"reinviteMaxAttempts\",\n\t\"reinviteTimeout\",\n\t\"recoveryDebounceTime\",\n\t\"recoveryCooldown\",\n\t\"iceDisconnectedGracePeriod\",\n\t\"iceRestartTimeout\",\n\t\"maxRecoveryAttempts\",\n\t\"degradationBitrateThreshold\",\n\t\"degradationRecoveryThreshold\"\n];\n/** Keys of StoredPreferences that map to boolean fields on PreferencesContainer. */\nconst STORED_BOOLEAN_KEYS = [\n\t\"receiveVideo\",\n\t\"receiveAudio\",\n\t\"disableUdpIceServers\",\n\t\"relayOnly\",\n\t\"enableRelayFallback\",\n\t\"enableNetworkChangeDetection\",\n\t\"enableServerHangupInterception\",\n\t\"persistDeviceSelection\",\n\t\"syncDevicesToActiveCalls\",\n\t\"autoMuteVideoOnHidden\",\n\t\"refreshDevicesOnVisible\",\n\t\"checkConnectionOnVisible\",\n\t\"stereoAudio\",\n\t\"enableAutoDegradation\"\n];\n/** Collects the serializable preferences from the container. */\nfunction collectStoredPreferences() {\n\tconst container = PreferencesContainer.instance;\n\treturn {\n\t\tconnectionTimeout: container.connectionTimeout,\n\t\treconnectCallsTimeout: container.reconnectCallsTimeout,\n\t\treconnectDelayMin: container.reconnectDelayMin,\n\t\treconnectDelayMax: container.reconnectDelayMax,\n\t\trelayHost: container.relayHost,\n\t\treceiveVideo: container.receiveVideo,\n\t\treceiveAudio: container.receiveAudio,\n\t\tdisableUdpIceServers: container.disableUdpIceServers,\n\t\trelayOnly: container.relayOnly,\n\t\ticeCandidateTimeout: container.iceCandidateTimeout,\n\t\ticeGatheringTimeout: container.iceGatheringTimeout,\n\t\tdeviceDebounceTime: container.deviceDebounceTime,\n\t\tdevicePollingInterval: container.devicePollingInterval,\n\t\ticeServers: container.iceServers,\n\t\tuserVariables: container.userVariables,\n\t\tstatsPollingInterval: container.statsPollingInterval,\n\t\tstatsBaselineSamples: container.statsBaselineSamples,\n\t\tstatsNoPacketThreshold: container.statsNoPacketThreshold,\n\t\tstatsRttSpikeMultiplier: container.statsRttSpikeMultiplier,\n\t\tstatsPacketLossThreshold: container.statsPacketLossThreshold,\n\t\tstatsJitterSpikeMultiplier: container.statsJitterSpikeMultiplier,\n\t\tstatsHistorySize: container.statsHistorySize,\n\t\tkeyframeMaxBurst: container.keyframeMaxBurst,\n\t\tkeyframeBurstWindow: container.keyframeBurstWindow,\n\t\tkeyframeCooldown: container.keyframeCooldown,\n\t\treinviteDebounceTime: container.reinviteDebounceTime,\n\t\treinviteMaxAttempts: container.reinviteMaxAttempts,\n\t\treinviteTimeout: container.reinviteTimeout,\n\t\trecoveryDebounceTime: container.recoveryDebounceTime,\n\t\trecoveryCooldown: container.recoveryCooldown,\n\t\ticeDisconnectedGracePeriod: container.iceDisconnectedGracePeriod,\n\t\ticeRestartTimeout: container.iceRestartTimeout,\n\t\tmaxRecoveryAttempts: container.maxRecoveryAttempts,\n\t\tenableRelayFallback: container.enableRelayFallback,\n\t\tenableNetworkChangeDetection: container.enableNetworkChangeDetection,\n\t\tenableServerHangupInterception: container.enableServerHangupInterception,\n\t\tpersistDeviceSelection: container.persistDeviceSelection,\n\t\tsyncDevicesToActiveCalls: container.syncDevicesToActiveCalls,\n\t\tautoMuteVideoOnHidden: container.autoMuteVideoOnHidden,\n\t\trefreshDevicesOnVisible: container.refreshDevicesOnVisible,\n\t\tcheckConnectionOnVisible: container.checkConnectionOnVisible,\n\t\tstereoAudio: container.stereoAudio,\n\t\tenableAutoDegradation: container.enableAutoDegradation,\n\t\tdegradationBitrateThreshold: container.degradationBitrateThreshold,\n\t\tdegradationRecoveryThreshold: container.degradationRecoveryThreshold,\n\t\tpreferredVideoCodecs: container.preferredVideoCodecs,\n\t\tpreferredAudioCodecs: container.preferredAudioCodecs\n\t};\n}\n/** Applies stored preferences to the container. */\nfunction applyStoredPreferences(stored) {\n\tconst container = PreferencesContainer.instance;\n\tfor (const key of STORED_NUMBER_KEYS) if (stored[key] !== void 0) container[key] = stored[key];\n\tfor (const key of STORED_BOOLEAN_KEYS) if (stored[key] !== void 0) container[key] = stored[key];\n\tif (stored.relayHost !== void 0) container.relayHost = stored.relayHost;\n\tif (stored.iceServers !== void 0) container.iceServers = stored.iceServers;\n\tif (stored.userVariables !== void 0) container.userVariables = stored.userVariables;\n\tif (stored.preferredVideoCodecs !== void 0) container.preferredVideoCodecs = stored.preferredVideoCodecs;\n\tif (stored.preferredAudioCodecs !== void 0) container.preferredAudioCodecs = stored.preferredAudioCodecs;\n}\n/**\n* Public preferences API for configuring SDK behavior.\n*\n* Exposed as {@link SignalWire.preferences}. All timeout values\n* are in seconds when accessed through this class.\n*\n* When {@link enableSavePreferences} is called, preferences are\n* automatically loaded from storage and synced back on every change.\n*/\nvar ClientPreferences = class {\n\tconstructor() {\n\t\tthis._storage = null;\n\t}\n\t/**\n\t* Enables persistence of preferences to storage.\n\t* Loads any previously saved preferences and syncs future changes.\n\t*/\n\tenableSavePreferences(storage) {\n\t\tthis._storage = storage;\n\t\tthis._loadFromStorage();\n\t}\n\t/** WebSocket connection timeout in seconds. */\n\tget connectionTimeout() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.connectionTimeout);\n\t}\n\tset connectionTimeout(seconds) {\n\t\tPreferencesContainer.instance.connectionTimeout = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Timeout for reconnecting to previously attached calls, in seconds. */\n\tget reconnectCallsTimeout() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.reconnectCallsTimeout);\n\t}\n\tset reconnectCallsTimeout(seconds) {\n\t\tPreferencesContainer.instance.reconnectCallsTimeout = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Minimum reconnection backoff delay in seconds. */\n\tget reconnectDelayMin() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.reconnectDelayMin);\n\t}\n\tset reconnectDelayMin(seconds) {\n\t\tPreferencesContainer.instance.reconnectDelayMin = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Maximum reconnection backoff delay in seconds. */\n\tget reconnectDelayMax() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.reconnectDelayMax);\n\t}\n\tset reconnectDelayMax(seconds) {\n\t\tPreferencesContainer.instance.reconnectDelayMax = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Custom relay host URL. Empty string uses the default. */\n\tget relayHost() {\n\t\treturn PreferencesContainer.instance.relayHost ?? \"\";\n\t}\n\tset relayHost(value) {\n\t\tPreferencesContainer.instance.relayHost = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to receive remote video by default. */\n\tget receiveVideo() {\n\t\treturn PreferencesContainer.instance.receiveVideo;\n\t}\n\tset receiveVideo(value) {\n\t\tPreferencesContainer.instance.receiveVideo = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to receive remote audio by default. */\n\tget receiveAudio() {\n\t\treturn PreferencesContainer.instance.receiveAudio;\n\t}\n\tset receiveAudio(value) {\n\t\tPreferencesContainer.instance.receiveAudio = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Preferred audio input device for new calls. */\n\tget preferredAudioInput() {\n\t\treturn PreferencesContainer.instance.preferredAudioInput;\n\t}\n\tset preferredAudioInput(value) {\n\t\tPreferencesContainer.instance.preferredAudioInput = value;\n\t}\n\t/** Preferred audio output device for new calls. */\n\tget preferredAudioOutput() {\n\t\treturn PreferencesContainer.instance.preferredAudioOutput;\n\t}\n\tset preferredAudioOutput(value) {\n\t\tPreferencesContainer.instance.preferredAudioOutput = value;\n\t}\n\t/** Preferred video input device for new calls. */\n\tget preferredVideoInput() {\n\t\treturn PreferencesContainer.instance.preferredVideoInput;\n\t}\n\tset preferredVideoInput(value) {\n\t\tPreferencesContainer.instance.preferredVideoInput = value;\n\t}\n\t/** Default audio input track constraints. */\n\tget inputAudioConstraints() {\n\t\treturn PreferencesContainer.instance.inputAudioDeviceConstraints;\n\t}\n\tset inputAudioConstraints(value) {\n\t\tPreferencesContainer.instance.inputAudioDeviceConstraints = value;\n\t}\n\t/** Default video input track constraints. */\n\tget inputVideoConstraints() {\n\t\treturn PreferencesContainer.instance.inputVideoDeviceConstraints;\n\t}\n\tset inputVideoConstraints(value) {\n\t\tPreferencesContainer.instance.inputVideoDeviceConstraints = value;\n\t}\n\t/** Debounce time for device change events, in seconds. */\n\tget deviceDebounceTime() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.deviceDebounceTime);\n\t}\n\tset deviceDebounceTime(seconds) {\n\t\tPreferencesContainer.instance.deviceDebounceTime = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Polling interval for device enumeration, in seconds. */\n\tget devicePollingInterval() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.devicePollingInterval);\n\t}\n\tset devicePollingInterval(seconds) {\n\t\tPreferencesContainer.instance.devicePollingInterval = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to filter out UDP-based ICE servers. */\n\tget disableUdpIceServers() {\n\t\treturn PreferencesContainer.instance.disableUdpIceServers;\n\t}\n\tset disableUdpIceServers(value) {\n\t\tPreferencesContainer.instance.disableUdpIceServers = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to force TURN relay-only ICE candidates. */\n\tget relayOnly() {\n\t\treturn PreferencesContainer.instance.relayOnly;\n\t}\n\tset relayOnly(value) {\n\t\tPreferencesContainer.instance.relayOnly = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Timeout for individual ICE candidate gathering, in seconds. */\n\tget iceCandidateTimeout() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.iceCandidateTimeout);\n\t}\n\tset iceCandidateTimeout(seconds) {\n\t\tPreferencesContainer.instance.iceCandidateTimeout = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Timeout for the entire ICE gathering phase, in seconds. */\n\tget iceGatheringTimeout() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.iceGatheringTimeout);\n\t}\n\tset iceGatheringTimeout(seconds) {\n\t\tPreferencesContainer.instance.iceGatheringTimeout = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Custom ICE servers for TURN/STUN configuration. */\n\tget iceServers() {\n\t\treturn PreferencesContainer.instance.iceServers;\n\t}\n\tset iceServers(value) {\n\t\tPreferencesContainer.instance.iceServers = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Custom user variables attached to calls. */\n\tget userVariables() {\n\t\treturn PreferencesContainer.instance.userVariables;\n\t}\n\tset userVariables(value) {\n\t\tPreferencesContainer.instance.userVariables = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Stats polling interval in milliseconds. */\n\tget statsPollingInterval() {\n\t\treturn PreferencesContainer.instance.statsPollingInterval;\n\t}\n\tset statsPollingInterval(value) {\n\t\tPreferencesContainer.instance.statsPollingInterval = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Number of baseline samples for stats monitoring. */\n\tget statsBaselineSamples() {\n\t\treturn PreferencesContainer.instance.statsBaselineSamples;\n\t}\n\tset statsBaselineSamples(value) {\n\t\tPreferencesContainer.instance.statsBaselineSamples = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Duration in ms with no inbound packets before a critical issue is emitted. */\n\tget statsNoPacketThreshold() {\n\t\treturn PreferencesContainer.instance.statsNoPacketThreshold;\n\t}\n\tset statsNoPacketThreshold(value) {\n\t\tPreferencesContainer.instance.statsNoPacketThreshold = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Multiplier for RTT spike detection relative to baseline. */\n\tget statsRttSpikeMultiplier() {\n\t\treturn PreferencesContainer.instance.statsRttSpikeMultiplier;\n\t}\n\tset statsRttSpikeMultiplier(value) {\n\t\tPreferencesContainer.instance.statsRttSpikeMultiplier = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Packet loss fraction threshold (0-1) for issue detection. */\n\tget statsPacketLossThreshold() {\n\t\treturn PreferencesContainer.instance.statsPacketLossThreshold;\n\t}\n\tset statsPacketLossThreshold(value) {\n\t\tPreferencesContainer.instance.statsPacketLossThreshold = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Multiplier for jitter spike detection relative to baseline. */\n\tget statsJitterSpikeMultiplier() {\n\t\treturn PreferencesContainer.instance.statsJitterSpikeMultiplier;\n\t}\n\tset statsJitterSpikeMultiplier(value) {\n\t\tPreferencesContainer.instance.statsJitterSpikeMultiplier = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Number of seconds of metrics history to retain. */\n\tget statsHistorySize() {\n\t\treturn PreferencesContainer.instance.statsHistorySize;\n\t}\n\tset statsHistorySize(value) {\n\t\tPreferencesContainer.instance.statsHistorySize = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Maximum keyframe requests in a burst window. */\n\tget keyframeMaxBurst() {\n\t\treturn PreferencesContainer.instance.keyframeMaxBurst;\n\t}\n\tset keyframeMaxBurst(value) {\n\t\tPreferencesContainer.instance.keyframeMaxBurst = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Keyframe burst window duration in milliseconds. */\n\tget keyframeBurstWindow() {\n\t\treturn PreferencesContainer.instance.keyframeBurstWindow;\n\t}\n\tset keyframeBurstWindow(value) {\n\t\tPreferencesContainer.instance.keyframeBurstWindow = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Cooldown period in ms after keyframe burst limit is reached. */\n\tget keyframeCooldown() {\n\t\treturn PreferencesContainer.instance.keyframeCooldown;\n\t}\n\tset keyframeCooldown(value) {\n\t\tPreferencesContainer.instance.keyframeCooldown = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Minimum time in ms between re-INVITE attempts. */\n\tget reinviteDebounceTime() {\n\t\treturn PreferencesContainer.instance.reinviteDebounceTime;\n\t}\n\tset reinviteDebounceTime(value) {\n\t\tPreferencesContainer.instance.reinviteDebounceTime = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Maximum re-INVITE attempts per call. */\n\tget reinviteMaxAttempts() {\n\t\treturn PreferencesContainer.instance.reinviteMaxAttempts;\n\t}\n\tset reinviteMaxAttempts(value) {\n\t\tPreferencesContainer.instance.reinviteMaxAttempts = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Timeout in ms for a single re-INVITE attempt. */\n\tget reinviteTimeout() {\n\t\treturn PreferencesContainer.instance.reinviteTimeout;\n\t}\n\tset reinviteTimeout(value) {\n\t\tPreferencesContainer.instance.reinviteTimeout = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Recovery signal debounce window in seconds. */\n\tget recoveryDebounceTime() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.recoveryDebounceTime);\n\t}\n\tset recoveryDebounceTime(seconds) {\n\t\tPreferencesContainer.instance.recoveryDebounceTime = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Cooldown period between recovery attempts in seconds. */\n\tget recoveryCooldown() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.recoveryCooldown);\n\t}\n\tset recoveryCooldown(seconds) {\n\t\tPreferencesContainer.instance.recoveryCooldown = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Grace period before treating ICE 'disconnected' as failure, in seconds. */\n\tget iceDisconnectedGracePeriod() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.iceDisconnectedGracePeriod);\n\t}\n\tset iceDisconnectedGracePeriod(seconds) {\n\t\tPreferencesContainer.instance.iceDisconnectedGracePeriod = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Timeout for a single ICE restart attempt in seconds. */\n\tget iceRestartTimeout() {\n\t\treturn fromMsToSec(PreferencesContainer.instance.iceRestartTimeout);\n\t}\n\tset iceRestartTimeout(seconds) {\n\t\tPreferencesContainer.instance.iceRestartTimeout = fromSecToMs(seconds);\n\t\tthis._saveToStorage();\n\t}\n\t/** Maximum recovery attempts before giving up. */\n\tget maxRecoveryAttempts() {\n\t\treturn PreferencesContainer.instance.maxRecoveryAttempts;\n\t}\n\tset maxRecoveryAttempts(value) {\n\t\tPreferencesContainer.instance.maxRecoveryAttempts = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether relay-only escalation is enabled as a last-resort recovery tier. */\n\tget enableRelayFallback() {\n\t\treturn PreferencesContainer.instance.enableRelayFallback;\n\t}\n\tset enableRelayFallback(value) {\n\t\tPreferencesContainer.instance.enableRelayFallback = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether browser network change detection (online/offline) is enabled. */\n\tget enableNetworkChangeDetection() {\n\t\treturn PreferencesContainer.instance.enableNetworkChangeDetection;\n\t}\n\tset enableNetworkChangeDetection(value) {\n\t\tPreferencesContainer.instance.enableNetworkChangeDetection = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether server-sent media-timeout hangups are intercepted for recovery. */\n\tget enableServerHangupInterception() {\n\t\treturn PreferencesContainer.instance.enableServerHangupInterception;\n\t}\n\tset enableServerHangupInterception(value) {\n\t\tPreferencesContainer.instance.enableServerHangupInterception = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether device selections are persisted to storage. */\n\tget persistDeviceSelection() {\n\t\treturn PreferencesContainer.instance.persistDeviceSelection;\n\t}\n\tset persistDeviceSelection(value) {\n\t\tPreferencesContainer.instance.persistDeviceSelection = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether device changes are auto-applied to active calls. */\n\tget syncDevicesToActiveCalls() {\n\t\treturn PreferencesContainer.instance.syncDevicesToActiveCalls;\n\t}\n\tset syncDevicesToActiveCalls(value) {\n\t\tPreferencesContainer.instance.syncDevicesToActiveCalls = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to auto-mute video when the tab becomes hidden. */\n\tget autoMuteVideoOnHidden() {\n\t\treturn PreferencesContainer.instance.autoMuteVideoOnHidden;\n\t}\n\tset autoMuteVideoOnHidden(value) {\n\t\tPreferencesContainer.instance.autoMuteVideoOnHidden = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to re-enumerate devices when the page becomes visible. */\n\tget refreshDevicesOnVisible() {\n\t\treturn PreferencesContainer.instance.refreshDevicesOnVisible;\n\t}\n\tset refreshDevicesOnVisible(value) {\n\t\tPreferencesContainer.instance.refreshDevicesOnVisible = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether to check peer connection health when the page becomes visible. */\n\tget checkConnectionOnVisible() {\n\t\treturn PreferencesContainer.instance.checkConnectionOnVisible;\n\t}\n\tset checkConnectionOnVisible(value) {\n\t\tPreferencesContainer.instance.checkConnectionOnVisible = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Default audio track constraints applied when no explicit constraints are provided. */\n\tget defaultAudioConstraints() {\n\t\treturn PreferencesContainer.instance.defaultAudioConstraints;\n\t}\n\tset defaultAudioConstraints(value) {\n\t\tPreferencesContainer.instance.defaultAudioConstraints = value;\n\t}\n\t/** Default video track constraints applied when video is enabled without explicit constraints. */\n\tget defaultVideoConstraints() {\n\t\treturn PreferencesContainer.instance.defaultVideoConstraints;\n\t}\n\tset defaultVideoConstraints(value) {\n\t\tPreferencesContainer.instance.defaultVideoConstraints = value;\n\t}\n\t/** Whether stereo Opus is enabled globally. */\n\tget stereoAudio() {\n\t\treturn PreferencesContainer.instance.stereoAudio;\n\t}\n\tset stereoAudio(value) {\n\t\tPreferencesContainer.instance.stereoAudio = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Whether automatic video degradation on low bandwidth is enabled. */\n\tget enableAutoDegradation() {\n\t\treturn PreferencesContainer.instance.enableAutoDegradation;\n\t}\n\tset enableAutoDegradation(value) {\n\t\tPreferencesContainer.instance.enableAutoDegradation = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Bitrate in kbps below which video is automatically disabled. */\n\tget degradationBitrateThreshold() {\n\t\treturn PreferencesContainer.instance.degradationBitrateThreshold;\n\t}\n\tset degradationBitrateThreshold(value) {\n\t\tPreferencesContainer.instance.degradationBitrateThreshold = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Bitrate in kbps above which video is automatically re-enabled. */\n\tget degradationRecoveryThreshold() {\n\t\treturn PreferencesContainer.instance.degradationRecoveryThreshold;\n\t}\n\tset degradationRecoveryThreshold(value) {\n\t\tPreferencesContainer.instance.degradationRecoveryThreshold = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Preferred video codecs in priority order. */\n\tget preferredVideoCodecs() {\n\t\treturn PreferencesContainer.instance.preferredVideoCodecs;\n\t}\n\tset preferredVideoCodecs(value) {\n\t\tPreferencesContainer.instance.preferredVideoCodecs = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Preferred audio codecs in priority order. */\n\tget preferredAudioCodecs() {\n\t\treturn PreferencesContainer.instance.preferredAudioCodecs;\n\t}\n\tset preferredAudioCodecs(value) {\n\t\tPreferencesContainer.instance.preferredAudioCodecs = value;\n\t\tthis._saveToStorage();\n\t}\n\t/** Saves current preferences to storage (fire-and-forget). */\n\t_saveToStorage() {\n\t\tif (!this._storage) return;\n\t\tconst data = collectStoredPreferences();\n\t\tthis._storage.setItem(PREFERENCES_STORAGE_KEY, data, \"local\").catch((error) => {\n\t\t\tlogger$30.error(`[ClientPreferences] Failed to save preferences: ${String(error)}`);\n\t\t});\n\t}\n\t/** Loads preferences from storage and applies them to the container. */\n\t_loadFromStorage() {\n\t\tif (!this._storage) return;\n\t\tthis._storage.getItem(PREFERENCES_STORAGE_KEY, \"local\").then((stored) => {\n\t\t\tif (stored) applyStoredPreferences(stored);\n\t\t}).catch((error) => {\n\t\t\tlogger$30.error(`[ClientPreferences] Failed to load preferences: ${String(error)}`);\n\t\t});\n\t}\n};\n\n//#endregion\n//#region src/utils/toError.ts\n/**\n* Normalizes an unknown caught value into a proper Error instance.\n*\n* In catch blocks, the caught value is `unknown` — it could be an Error,\n* string, number, or any other value. This utility ensures a consistent\n* Error object is produced.\n*/\nfunction toError(value) {\n\tif (value instanceof Error) return value;\n\treturn new Error(String(value));\n}\n\n//#endregion\n//#region src/controllers/NavigatorDeviceController.ts\nconst logger$29 = getLogger();\n/** Maps a device kind to its storage key. */\nconst DEVICE_STORAGE_KEYS = {\n\taudioinput: DEVICE_STORAGE_KEY_AUDIO_INPUT,\n\taudiooutput: DEVICE_STORAGE_KEY_AUDIO_OUTPUT,\n\tvideoinput: DEVICE_STORAGE_KEY_VIDEO_INPUT\n};\nconst initialDevicesState = {\n\taudioinput: [],\n\taudiooutput: [],\n\tvideoinput: []\n};\nconst initialSelectedDevicesState = {\n\taudioinput: null,\n\taudiooutput: null,\n\tvideoinput: null\n};\nvar NavigatorDeviceController = class extends Destroyable {\n\tconstructor(webRTCApiProvider, storageManager) {\n\t\tsuper();\n\t\tthis.webRTCApiProvider = webRTCApiProvider;\n\t\tthis.deviceChangeHandler = () => {\n\t\t\tlogger$29.debug(\"[DeviceController] Device change detected\");\n\t\t\tthis.enumerateDevices();\n\t\t};\n\t\tthis._devicesState$ = this.createBehaviorSubject(initialDevicesState);\n\t\tthis._selectedDevicesState$ = this.createBehaviorSubject(initialSelectedDevicesState);\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis._deviceHistory = new DeviceHistoryManager();\n\t\tthis._deviceRecovered$ = this.createSubject();\n\t\tthis._audioInputDisabled$ = this.createBehaviorSubject(false);\n\t\tthis._videoInputDisabled$ = this.createBehaviorSubject(false);\n\t\tthis._lastAudioInputBeforeDisable = null;\n\t\tthis._lastVideoInputBeforeDisable = null;\n\t\tthis._persistedDevices = {};\n\t\tthis._storageManager = storageManager;\n\t\tthis.init();\n\t}\n\t/** Sets the storage manager for device persistence. */\n\tsetStorageManager(storageManager) {\n\t\tthis._storageManager = storageManager;\n\t\tthis.loadPersistedDevices();\n\t}\n\tget selectedAudioInputDeviceConstraints() {\n\t\tif (this._audioInputDisabled$.value) return false;\n\t\treturn this.deviceInfoToConstraints(this.selectedAudioInputDevice);\n\t}\n\tget selectedVideoInputDeviceConstraints() {\n\t\tif (this._videoInputDisabled$.value) return false;\n\t\treturn this.deviceInfoToConstraints(this.selectedVideoInputDevice);\n\t}\n\tdeviceInfoToConstraints(deviceInfo) {\n\t\tif (!deviceInfo?.deviceId || deviceInfo.deviceId.trim() === \"\") return {};\n\t\tconst devices = deviceInfo.kind === \"audioinput\" ? this.audioInputDevices : this.videoInputDevices;\n\t\tconst device = devices.find((device$1) => device$1.deviceId === deviceInfo.deviceId) ?? devices.find((device$1) => device$1.label === deviceInfo.label);\n\t\tif (device) return { deviceId: { exact: device.deviceId } };\n\t\treturn {};\n\t}\n\tget errors$() {\n\t\treturn this.cachedObservable(\"errors$\", () => this._errors$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\t/** Observable that emits when the SDK auto-switches a device. */\n\tget deviceRecovered$() {\n\t\treturn this._deviceRecovered$.asObservable().pipe(takeUntil(this.destroyed$));\n\t}\n\tget videoInputDisabled$() {\n\t\treturn this.cachedObservable(\"videoInputDisabled$\", () => this._videoInputDisabled$.asObservable().pipe(distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\tget audioInputDisabled$() {\n\t\treturn this.cachedObservable(\"audioInputDisabled$\", () => this._audioInputDisabled$.asObservable().pipe(distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\tget videoInputDisabled() {\n\t\treturn this._videoInputDisabled$.value;\n\t}\n\tget audioInputDisabled() {\n\t\treturn this._audioInputDisabled$.value;\n\t}\n\tget audioInputDevices$() {\n\t\treturn this.cachedObservable(\"audioInputDevices$\", () => this._devicesState$.pipe(map((state) => state.audioinput), distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\tget audioOutputDevices$() {\n\t\treturn this.cachedObservable(\"audioOutputDevices$\", () => this._devicesState$.pipe(map((state) => state.audiooutput), distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\tget videoInputDevices$() {\n\t\treturn this.cachedObservable(\"videoInputDevices$\", () => this._devicesState$.pipe(map((state) => state.videoinput), distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\tget selectedAudioInputDevice$() {\n\t\treturn this.cachedObservable(\"selectedAudioInputDevice$\", () => this._selectedDevicesState$.asObservable().pipe(map((state) => state.audioinput), distinctUntilChanged(), takeUntil(this.destroyed$), tap((info) => logger$29.debug(\"[DeviceController] Selected audio input device changed:\", info))));\n\t}\n\tget selectedAudioOutputDevice$() {\n\t\treturn this.cachedObservable(\"selectedAudioOutputDevice$\", () => this._selectedDevicesState$.asObservable().pipe(map((state) => state.audiooutput), distinctUntilChanged(), takeUntil(this.destroyed$), tap((info) => logger$29.debug(\"[DeviceController] Selected audio output device changed:\", info))));\n\t}\n\tget selectedVideoInputDevice$() {\n\t\treturn this.cachedObservable(\"selectedVideoInputDevice$\", () => this._selectedDevicesState$.asObservable().pipe(map((state) => state.videoinput), distinctUntilChanged(), takeUntil(this.destroyed$), tap((info) => logger$29.debug(\"[DeviceController] Selected video input device changed:\", info))));\n\t}\n\tget selectedAudioInputDevice() {\n\t\tif (this._audioInputDisabled$.value) return null;\n\t\treturn this._selectedDevicesState$.value.audioinput;\n\t}\n\tget selectedAudioOutputDevice() {\n\t\treturn this._selectedDevicesState$.value.audiooutput;\n\t}\n\tget selectedVideoInputDevice() {\n\t\tif (this._videoInputDisabled$.value) return null;\n\t\treturn this._selectedDevicesState$.value.videoinput;\n\t}\n\tget audioInputDevices() {\n\t\treturn this._devicesState$.value.audioinput;\n\t}\n\tget audioOutputDevices() {\n\t\treturn this._devicesState$.value.audiooutput;\n\t}\n\tget videoInputDevices() {\n\t\treturn this._devicesState$.value.videoinput;\n\t}\n\tdisableAudioInput() {\n\t\tif (!this._audioInputDisabled$.value) {\n\t\t\tthis._lastAudioInputBeforeDisable = this._selectedDevicesState$.value.audioinput;\n\t\t\tthis._audioInputDisabled$.next(true);\n\t\t\tthis._selectedDevicesState$.next({\n\t\t\t\t...this._selectedDevicesState$.value,\n\t\t\t\taudioinput: null\n\t\t\t});\n\t\t}\n\t}\n\tenableAudioInput() {\n\t\tif (this._audioInputDisabled$.value) {\n\t\t\tthis._audioInputDisabled$.next(false);\n\t\t\tconst restored = this._lastAudioInputBeforeDisable ?? this.audioInputDevices[0];\n\t\t\tthis._selectedDevicesState$.next({\n\t\t\t\t...this._selectedDevicesState$.value,\n\t\t\t\taudioinput: restored\n\t\t\t});\n\t\t\tthis._lastAudioInputBeforeDisable = null;\n\t\t}\n\t}\n\tdisableVideoInput() {\n\t\tif (!this._videoInputDisabled$.value) {\n\t\t\tthis._lastVideoInputBeforeDisable = this._selectedDevicesState$.value.videoinput;\n\t\t\tthis._videoInputDisabled$.next(true);\n\t\t\tthis._selectedDevicesState$.next({\n\t\t\t\t...this._selectedDevicesState$.value,\n\t\t\t\tvideoinput: null\n\t\t\t});\n\t\t}\n\t}\n\tenableVideoInput() {\n\t\tif (this._videoInputDisabled$.value) {\n\t\t\tthis._videoInputDisabled$.next(false);\n\t\t\tconst restored = this._lastVideoInputBeforeDisable ?? this.videoInputDevices[0];\n\t\t\tthis._selectedDevicesState$.next({\n\t\t\t\t...this._selectedDevicesState$.value,\n\t\t\t\tvideoinput: restored\n\t\t\t});\n\t\t\tthis._lastVideoInputBeforeDisable = null;\n\t\t}\n\t}\n\tselectAudioInputDevice(device) {\n\t\tif (this._audioInputDisabled$.value && device) this._audioInputDisabled$.next(false);\n\t\tconst previous = this._selectedDevicesState$.value.audioinput;\n\t\tif (previous && previous.deviceId !== device?.deviceId) this._deviceHistory.push(\"audioinput\", previous);\n\t\tthis._selectedDevicesState$.next({\n\t\t\t...this._selectedDevicesState$.value,\n\t\t\taudioinput: device\n\t\t});\n\t\tif (device) this.persistDeviceSelection(\"audioinput\", device);\n\t}\n\tselectVideoInputDevice(device) {\n\t\tlogger$29.debug(\"[DeviceController] Setting selected video input device:\", device);\n\t\tif (this._videoInputDisabled$.value && device) this._videoInputDisabled$.next(false);\n\t\tconst previous = this._selectedDevicesState$.value.videoinput;\n\t\tif (previous && previous.deviceId !== device?.deviceId) this._deviceHistory.push(\"videoinput\", previous);\n\t\tthis._selectedDevicesState$.next({\n\t\t\t...this._selectedDevicesState$.value,\n\t\t\tvideoinput: device\n\t\t});\n\t\tif (device) this.persistDeviceSelection(\"videoinput\", device);\n\t}\n\tselectAudioOutputDevice(device) {\n\t\tconst previous = this._selectedDevicesState$.value.audiooutput;\n\t\tif (previous && previous.deviceId !== device?.deviceId) this._deviceHistory.push(\"audiooutput\", previous);\n\t\tthis._selectedDevicesState$.next({\n\t\t\t...this._selectedDevicesState$.value,\n\t\t\taudiooutput: device\n\t\t});\n\t\tif (device) this.persistDeviceSelection(\"audiooutput\", device);\n\t}\n\tinit() {\n\t\tthis.loadPersistedDevices();\n\t\tthis.subscribeTo(this._devicesState$.pipe(debounceTime(PreferencesContainer.instance.deviceDebounceTime)), (devicesState) => {\n\t\t\tconst currentSelected = this._selectedDevicesState$.value;\n\t\t\tconst newAudioInput = this._audioInputDisabled$.value ? null : this.resolveDevice(\"audioinput\", devicesState.audioinput, currentSelected.audioinput, PreferencesContainer.instance.preferredAudioInput);\n\t\t\tconst newAudioOutput = this.resolveDevice(\"audiooutput\", devicesState.audiooutput, currentSelected.audiooutput, PreferencesContainer.instance.preferredAudioOutput);\n\t\t\tconst newVideoInput = this._videoInputDisabled$.value ? null : this.resolveDevice(\"videoinput\", devicesState.videoinput, currentSelected.videoinput, PreferencesContainer.instance.preferredVideoInput);\n\t\t\tif (newAudioInput !== currentSelected.audioinput || newAudioOutput !== currentSelected.audiooutput || newVideoInput !== currentSelected.videoinput) {\n\t\t\t\tconst shouldSync = PreferencesContainer.instance.syncDevicesToActiveCalls;\n\t\t\t\tthis._selectedDevicesState$.next({\n\t\t\t\t\taudioinput: shouldSync || !currentSelected.audioinput ? newAudioInput : currentSelected.audioinput,\n\t\t\t\t\taudiooutput: shouldSync || !currentSelected.audiooutput ? newAudioOutput : currentSelected.audiooutput,\n\t\t\t\t\tvideoinput: shouldSync || !currentSelected.videoinput ? newVideoInput : currentSelected.videoinput\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\tthis.enumerateDevices();\n\t}\n\t/**\n\t* Resolves the best device for a given kind, using device history\n\t* for succession when the selected device disappears.\n\t* Section 5.1 adds persisted device resolution.\n\t* Section 5.4 adds duplicate-named device handling.\n\t*/\n\tresolveDevice(kind, devices, selected, preferred) {\n\t\tif (devices.length === 0) return null;\n\t\tif (selected) {\n\t\t\tif (devices.find((device) => device.deviceId === selected.deviceId)) return selected;\n\t\t\tconst labelMatches = devices.filter((device) => device.label === selected.label);\n\t\t\tif (labelMatches.length === 1) return labelMatches[0];\n\t\t\tif (labelMatches.length > 1) {\n\t\t\t\tconst groupMatch = labelMatches.find((device) => device.groupId === selected.groupId);\n\t\t\t\tif (groupMatch) return groupMatch;\n\t\t\t\tthis.emitDeviceRecovered(kind, selected, null, \"ambiguous_match\");\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tconst fromHistory = this._deviceHistory.findInHistory(kind, devices);\n\t\t\tif (fromHistory) {\n\t\t\t\tlogger$29.debug(`[DeviceController] Device disappeared, falling back to history: ${fromHistory.label}`);\n\t\t\t\tthis.emitDeviceRecovered(kind, selected, fromHistory, \"device_disconnected\");\n\t\t\t\treturn fromHistory;\n\t\t\t}\n\t\t\tconst newDevice = (preferred ? devices.find((device) => device.deviceId === preferred.deviceId || device.label === preferred.label) : void 0) ?? devices[0];\n\t\t\tthis.emitDeviceRecovered(kind, selected, newDevice, \"fallback_to_default\");\n\t\t\treturn newDevice;\n\t\t}\n\t\tconst persisted = this._persistedDevices[kind];\n\t\tif (persisted) {\n\t\t\tconst fromPersisted = this.resolvePersistedDevice(kind, persisted, devices);\n\t\t\tif (fromPersisted) return fromPersisted;\n\t\t}\n\t\tif (preferred) {\n\t\t\tconst preferredDevice = devices.find((device) => device.deviceId === preferred.deviceId || device.label === preferred.label);\n\t\t\tif (preferredDevice) return preferredDevice;\n\t\t}\n\t\treturn devices[0];\n\t}\n\t/**\n\t* Section 5.1: Resolves a stored device preference against the current device list.\n\t* Priority: exact deviceId > groupId+label > label (single match only)\n\t*/\n\tresolvePersistedDevice(_kind, stored, devices) {\n\t\tconst exactMatch = devices.find((d) => d.deviceId === stored.deviceId);\n\t\tif (exactMatch) return exactMatch;\n\t\tconst groupLabelMatch = devices.find((d) => d.groupId === stored.groupId && d.label === stored.label);\n\t\tif (groupLabelMatch) return groupLabelMatch;\n\t\tconst labelMatches = devices.filter((d) => d.label === stored.label);\n\t\tif (labelMatches.length === 1) return labelMatches[0];\n\t\treturn null;\n\t}\n\temitDeviceRecovered(kind, previousDevice, newDevice, reason) {\n\t\ttry {\n\t\t\tthis._deviceRecovered$.next({\n\t\t\t\tkind,\n\t\t\t\tpreviousDevice,\n\t\t\t\tnewDevice,\n\t\t\t\treason\n\t\t\t});\n\t\t} catch {}\n\t}\n\tasync persistDeviceSelection(kind, device) {\n\t\tif (!this._storageManager || !PreferencesContainer.instance.persistDeviceSelection) return;\n\t\tconst stored = {\n\t\t\tdeviceId: device.deviceId,\n\t\t\tlabel: device.label,\n\t\t\tkind: device.kind,\n\t\t\tgroupId: device.groupId\n\t\t};\n\t\ttry {\n\t\t\tawait this._storageManager.setItem(DEVICE_STORAGE_KEYS[kind], stored, \"local\");\n\t\t} catch (error) {\n\t\t\tlogger$29.error(`[DeviceController] Failed to persist device selection for ${kind}:`, error);\n\t\t}\n\t}\n\tasync loadPersistedDevices() {\n\t\tif (!this._storageManager || !PreferencesContainer.instance.persistDeviceSelection) return;\n\t\tfor (const kind of [\n\t\t\t\"audioinput\",\n\t\t\t\"audiooutput\",\n\t\t\t\"videoinput\"\n\t\t]) try {\n\t\t\tconst stored = await this._storageManager.getItem(DEVICE_STORAGE_KEYS[kind], \"local\");\n\t\t\tif (stored) this._persistedDevices = {\n\t\t\t\t...this._persistedDevices,\n\t\t\t\t[kind]: stored\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger$29.error(`[DeviceController] Failed to load persisted device for ${kind}:`, error);\n\t\t}\n\t}\n\t/** Clears device history, persisted selections, and re-enumerates devices. */\n\tasync clearDeviceState() {\n\t\tthis._deviceHistory.clear();\n\t\tthis._persistedDevices = {};\n\t\tthis._lastAudioInputBeforeDisable = null;\n\t\tthis._lastVideoInputBeforeDisable = null;\n\t\tthis._audioInputDisabled$.next(false);\n\t\tthis._videoInputDisabled$.next(false);\n\t\tthis._selectedDevicesState$.next(initialSelectedDevicesState);\n\t\tawait this.enumerateDevices();\n\t}\n\tenableDeviceMonitoring() {\n\t\tthis.disableDeviceMonitoring();\n\t\tthis.webRTCApiProvider.mediaDevices.addEventListener(\"devicechange\", this.deviceChangeHandler);\n\t\tif (PreferencesContainer.instance.devicePollingInterval > 0) this._devicesPoolingSubscription = interval(PreferencesContainer.instance.devicePollingInterval).subscribe(() => {\n\t\t\tlogger$29.debug(\"[DeviceController] Polling devices due to interval\");\n\t\t\tthis.enumerateDevices();\n\t\t});\n\t\tthis.enumerateDevices();\n\t}\n\tdisableDeviceMonitoring() {\n\t\tthis.webRTCApiProvider.mediaDevices.removeEventListener(\"devicechange\", this.deviceChangeHandler);\n\t\tif (this._devicesPoolingSubscription) {\n\t\t\tthis._devicesPoolingSubscription.unsubscribe();\n\t\t\tthis._devicesPoolingSubscription = void 0;\n\t\t}\n\t}\n\tasync enumerateDevices() {\n\t\ttry {\n\t\t\tconst devicesByKind = (await this.webRTCApiProvider.mediaDevices.enumerateDevices()).reduce((acc, device) => {\n\t\t\t\tconst kind = device.kind;\n\t\t\t\treturn {\n\t\t\t\t\t...acc,\n\t\t\t\t\t[kind]: [...acc[kind], device]\n\t\t\t\t};\n\t\t\t}, {\n\t\t\t\taudioinput: [],\n\t\t\t\taudiooutput: [],\n\t\t\t\tvideoinput: []\n\t\t\t});\n\t\t\tthis._devicesState$.next(devicesByKind);\n\t\t\tlogger$29.debug(\"[DeviceController] Devices enumerated:\", {\n\t\t\t\taudioInputs: devicesByKind.audioinput.length,\n\t\t\t\taudioOutputs: devicesByKind.audiooutput.length,\n\t\t\t\tvideoInputs: devicesByKind.videoinput.length\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger$29.error(\"[DeviceController] Failed to enumerate devices:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t}\n\t}\n\tasync getDeviceCapabilities(deviceInfo) {\n\t\tif (deviceInfo.kind === \"audiooutput\") return null;\n\t\ttry {\n\t\t\tconst constraints = this.deviceInfoToConstraints(deviceInfo);\n\t\t\tconst stream = await this.webRTCApiProvider.mediaDevices.getUserMedia({\n\t\t\t\taudio: deviceInfo.kind === \"audioinput\" ? constraints : false,\n\t\t\t\tvideo: deviceInfo.kind === \"videoinput\" ? constraints : false\n\t\t\t});\n\t\t\tconst capabilities = (deviceInfo.kind === \"audioinput\" ? stream.getAudioTracks()[0] : stream.getVideoTracks()[0]).getCapabilities();\n\t\t\tstream.getTracks().forEach((t) => t.stop());\n\t\t\treturn capabilities;\n\t\t} catch (error) {\n\t\t\tlogger$29.error(\"[DeviceController] Failed to get device capabilities:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync isValidDevice(deviceInfo) {\n\t\tif (!deviceInfo || deviceInfo.kind === \"audiooutput\") return false;\n\t\ttry {\n\t\t\treturn await this.getDeviceCapabilities(deviceInfo) !== null;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\tdestroy() {\n\t\tthis.disableDeviceMonitoring();\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/dependencies/DefaultLocalStorage.ts\n/** Default storage implementation backed by browser `localStorage` and `sessionStorage`. */\nvar DefaultLocalStorage = class {\n\tconstructor() {\n\t\tif (typeof localStorage === \"undefined\") throw new StorageNotAvailableError(\"localStorage\");\n\t\tif (typeof sessionStorage === \"undefined\") throw new StorageNotAvailableError(\"sessionStorage\");\n\t\ttry {\n\t\t\tconst testKey = \"__storage_test__\";\n\t\t\tlocalStorage.setItem(testKey, \"test\");\n\t\t\tlocalStorage.removeItem(testKey);\n\t\t} catch (error) {\n\t\t\tgetLogger().error(\"LocalStorage is not accessible:\", error);\n\t\t\tthrow new StorageNotAvailableError(\"localStorage\");\n\t\t}\n\t}\n\tstorage(scope) {\n\t\treturn scope === \"local\" ? localStorage : sessionStorage;\n\t}\n\tasync setItem(key, value, scope = \"session\") {\n\t\tthis.storage(scope).setItem(key, value);\n\t\treturn Promise.resolve();\n\t}\n\tasync getItem(key, scope = \"session\") {\n\t\treturn Promise.resolve(this.storage(scope).getItem(key));\n\t}\n\tasync removeItem(key, scope = \"session\") {\n\t\tthis.storage(scope).removeItem(key);\n\t\treturn Promise.resolve();\n\t}\n\tasync clear(scope = \"session\") {\n\t\tconst store = this.storage(scope);\n\t\tconst keysToRemove = [];\n\t\tfor (let i = 0; i < store.length; i++) {\n\t\t\tconst key = store.key(i);\n\t\t\tif (key?.startsWith(\"sw:\")) keysToRemove.push(key);\n\t\t}\n\t\tfor (const key of keysToRemove) store.removeItem(key);\n\t\treturn Promise.resolve();\n\t}\n};\n\n//#endregion\n//#region src/managers/StorageManager.ts\nvar StorageManager = class {\n\tconstructor(storageImpl = new DefaultLocalStorage()) {\n\t\tthis.storageImpl = storageImpl;\n\t}\n\t/**\n\t* Validates that a value can be safely serialized to JSON\n\t* @throws SerializationError if value contains non-serializable types\n\t*/\n\tserialize(value, key) {\n\t\tif (value === void 0 || value === null) return null;\n\t\ttry {\n\t\t\treturn JSON.stringify(value);\n\t\t} catch (e) {\n\t\t\tthrow new SerializationError(key ?? \"unknown\", e);\n\t\t}\n\t}\n\t/**\n\t* Stores a value in storage\n\t* @throws InvalidStorageValueError if value contains non-serializable types\n\t* @throws SerializationError if JSON serialization fails\n\t* @throws StorageWriteError if writing to storage fails\n\t*/\n\tasync setItem(key, value, scope = \"session\") {\n\t\tconst serialized = this.serialize(value, key);\n\t\ttry {\n\t\t\tawait this.storageImpl.setItem(key, serialized, scope);\n\t\t} catch (error) {\n\t\t\tthrow new StorageWriteError(key, error);\n\t\t}\n\t}\n\t/**\n\t* Retrieves a value from storage\n\t*\n\t* This method distinguishes between:\n\t* - Storage errors (network, permission, etc.) - these are thrown\n\t* - JSON parse errors - these trigger onParseError and return raw string\n\t* - Missing keys - returns null\n\t*\n\t* @returns The parsed value, raw string (on parse error), or null\n\t* @throws StorageReadError\n\t*/\n\tasync getItem(key, scope = \"session\") {\n\t\tlet item;\n\t\ttry {\n\t\t\titem = await this.storageImpl.getItem(key, scope);\n\t\t} catch (error) {\n\t\t\tthrow new StorageReadError(key, error);\n\t\t}\n\t\tif (!item) return null;\n\t\ttry {\n\t\t\treturn JSON.parse(item);\n\t\t} catch (error) {\n\t\t\tthrow new DeserializationError(key, error);\n\t\t}\n\t}\n\t/**\n\t* Removes a value from storage\n\t* @throws Error from underlying storage implementation\n\t*/\n\tasync removeItem(key, scope = \"session\") {\n\t\ttry {\n\t\t\tawait this.storageImpl.removeItem(key, scope);\n\t\t} catch (error) {\n\t\t\tthrow new StorageWriteError(key, error);\n\t\t}\n\t}\n\t/**\n\t* Clears all SDK keys from both 'local' and 'session' scopes.\n\t* @throws StorageWriteError if clearing fails\n\t*/\n\tasync clearAll() {\n\t\ttry {\n\t\t\tawait this.storageImpl.clear(\"local\");\n\t\t\tawait this.storageImpl.clear(\"session\");\n\t\t} catch (error) {\n\t\t\tthrow new StorageWriteError(\"clearAll\", error);\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/containers/DependencyContainer.ts\nvar DependencyContainer = class {\n\tconstructor() {\n\t\tthis.persistSession = false;\n\t\tthis._webSocketConstructor = typeof WebSocket !== \"undefined\" ? WebSocket : void 0;\n\t\tthis._baseURL = this.apiHost;\n\t\tthis._credential = {};\n\t}\n\tget userId() {\n\t\treturn this.user.id;\n\t}\n\tget user() {\n\t\tif (!this._user) throw new DependencyError(\"User\");\n\t\treturn this._user;\n\t}\n\tset user(user) {\n\t\tthis._user = user;\n\t}\n\tget storage() {\n\t\tif (!this._storageManager) {\n\t\t\tthis._storageImpl ??= new DefaultLocalStorage();\n\t\t\tthis._storageManager = new StorageManager(this._storageImpl);\n\t\t}\n\t\treturn this._storageManager;\n\t}\n\tget http() {\n\t\tthis._httpRequestController ??= new HTTPRequestController(this._baseURL, () => this._credential);\n\t\treturn this._httpRequestController;\n\t}\n\tget conversationManager() {\n\t\tif (!this._conversationManager) throw new DependencyError(\"ConversationsManager\");\n\t\treturn this._conversationManager;\n\t}\n\tset conversationManager(conversationManager) {\n\t\tthis._conversationManager = conversationManager;\n\t}\n\tget WebSocket() {\n\t\tif (!this._webSocketConstructor) throw new DependencyError(\"WebSocket constructor\");\n\t\treturn this._webSocketConstructor;\n\t}\n\tset WebSocket(WebSocketConstructor) {\n\t\tthis._webSocketConstructor = WebSocketConstructor;\n\t}\n\tget deviceController() {\n\t\tthis._deviceController ??= new NavigatorDeviceController(this.webRTCApiProvider, this.storage);\n\t\treturn this._deviceController;\n\t}\n\tget webRTCApiProvider() {\n\t\tif (!this._webRTCApiProvider) {\n\t\t\tif (typeof RTCPeerConnection === \"undefined\" || typeof navigator === \"undefined\") throw new DependencyError(\"WebRTCApiProvider: RTCPeerConnection or navigator.mediaDevices is not available. Please provide a custom webRTCApiProvider in SignalWireOptions.\");\n\t\t\tthis._webRTCApiProvider = {\n\t\t\t\tRTCPeerConnection,\n\t\t\t\tmediaDevices: navigator.mediaDevices\n\t\t\t};\n\t\t}\n\t\treturn this._webRTCApiProvider;\n\t}\n\tset webRTCApiProvider(webRTCApiProvider) {\n\t\tthis._webRTCApiProvider = webRTCApiProvider;\n\t\tthis._deviceController = void 0;\n\t}\n\tget authorizationStateKey() {\n\t\treturn `sw:${this.userId}:as`;\n\t}\n\tget protocolKey() {\n\t\treturn `sw:${this.userId}:pt`;\n\t}\n\tget attachedCallsKey() {\n\t\treturn `sw:${this.userId}:att`;\n\t}\n\tgetUserFromAddressId() {\n\t\treturn this.user.addresses[0]?.id ?? \"\";\n\t}\n\tset baseURL(baseURL) {\n\t\tthis._baseURL = baseURL;\n\t\tthis._httpRequestController = void 0;\n\t}\n\tget credential() {\n\t\treturn this._credential;\n\t}\n\tset credential(credential) {\n\t\tthis._credential = credential;\n\t}\n\tset storageImpl(storageImpl) {\n\t\tthis._storageImpl = storageImpl;\n\t\tthis._storageManager = void 0;\n\t}\n\tset ch(ch) {\n\t\tif (!ch) return;\n\t\tconst firstDot = ch.indexOf(\".\");\n\t\tif (firstDot !== -1) {\n\t\t\tthis._host = ch.substring(0, firstDot);\n\t\t\tthis._domain = ch.substring(firstDot + 1);\n\t\t}\n\t\tthis._baseURL = this.apiHost;\n\t\tthis._httpRequestController = void 0;\n\t}\n\tget relayHost() {\n\t\treturn `wss://${this._host ?? \"puc\"}.${this._domain ?? \"signalwire.com\"}`;\n\t}\n\tget apiHost() {\n\t\treturn `https://fabric.${this._domain ?? \"signalwire.com\"}`;\n\t}\n};\n\n//#endregion\n//#region src/controllers/CryptoController.ts\nconst logger$28 = getLogger();\nconst DPOP_DB_NAME = \"sw-dpop\";\nconst DPOP_DB_VERSION = 1;\nconst DPOP_STORE_NAME = \"keys\";\nconst DPOP_KEY_ID = \"dpop-keypair\";\n/**\n* Base64url-encodes an ArrayBuffer (no padding, URL-safe).\n*/\nconst base64url = (buffer) => {\n\tconst bytes = new Uint8Array(buffer);\n\tlet binary = \"\";\n\tfor (const byte of bytes) binary += String.fromCharCode(byte);\n\treturn btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n};\n/**\n* Base64url-encodes a UTF-8 string.\n*/\nconst base64urlEncode = (str) => {\n\treturn base64url(new TextEncoder().encode(str).buffer);\n};\n/**\n* Computes the JWK Thumbprint per RFC 7638.\n*\n* Only supports RSA keys — the canonical JSON uses lexicographic member ordering: { e, kty, n }.\n* The thumbprint is SHA-256 of the canonical JSON, base64url-encoded.\n*\n* @throws {Error} If the JWK is not an RSA key.\n*/\nconst computeJwkThumbprint = async (jwk) => {\n\tif (jwk.kty !== \"RSA\") throw new Error(`Unsupported key type for JWK Thumbprint: ${jwk.kty}. Only RSA is supported.`);\n\tconst canonical = JSON.stringify({\n\t\te: jwk.e,\n\t\tkty: jwk.kty,\n\t\tn: jwk.n\n\t});\n\treturn base64url(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(canonical)));\n};\nasync function openDpopDB() {\n\treturn new Promise((resolve, reject) => {\n\t\tconst request = indexedDB.open(DPOP_DB_NAME, DPOP_DB_VERSION);\n\t\trequest.onupgradeneeded = () => {\n\t\t\tconst db = request.result;\n\t\t\tif (!db.objectStoreNames.contains(DPOP_STORE_NAME)) db.createObjectStore(DPOP_STORE_NAME);\n\t\t};\n\t\trequest.onsuccess = () => resolve(request.result);\n\t\trequest.onerror = () => reject(request.error ?? /* @__PURE__ */ new Error(\"Failed to open IndexedDB\"));\n\t});\n}\nasync function loadKeyPairFromDB() {\n\ttry {\n\t\tconst db = await openDpopDB();\n\t\treturn await new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DPOP_STORE_NAME, \"readonly\");\n\t\t\tconst req = tx.objectStore(DPOP_STORE_NAME).get(DPOP_KEY_ID);\n\t\t\treq.onsuccess = () => resolve(req.result ?? null);\n\t\t\treq.onerror = () => reject(req.error ?? /* @__PURE__ */ new Error(\"Failed to load key pair from IndexedDB\"));\n\t\t\ttx.oncomplete = () => db.close();\n\t\t});\n\t} catch (error) {\n\t\tlogger$28.warn(\"[DPoP] Failed to load key pair from IndexedDB:\", error);\n\t\treturn null;\n\t}\n}\nasync function saveKeyPairToDB(keyPair) {\n\ttry {\n\t\tconst db = await openDpopDB();\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DPOP_STORE_NAME, \"readwrite\");\n\t\t\ttx.objectStore(DPOP_STORE_NAME).put(keyPair, DPOP_KEY_ID);\n\t\t\ttx.oncomplete = () => {\n\t\t\t\tdb.close();\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\ttx.onerror = () => {\n\t\t\t\tdb.close();\n\t\t\t\treject(tx.error ?? /* @__PURE__ */ new Error(\"Failed to save key pair to IndexedDB\"));\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tlogger$28.warn(\"[DPoP] Failed to save key pair to IndexedDB:\", error);\n\t}\n}\nasync function deleteKeyPairFromDB() {\n\ttry {\n\t\tconst db = await openDpopDB();\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tconst tx = db.transaction(DPOP_STORE_NAME, \"readwrite\");\n\t\t\ttx.objectStore(DPOP_STORE_NAME).delete(DPOP_KEY_ID);\n\t\t\ttx.oncomplete = () => {\n\t\t\t\tdb.close();\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\ttx.onerror = () => {\n\t\t\t\tdb.close();\n\t\t\t\treject(tx.error ?? /* @__PURE__ */ new Error(\"Failed to delete key pair from IndexedDB\"));\n\t\t\t};\n\t\t});\n\t} catch (error) {\n\t\tlogger$28.warn(\"[DPoP] Failed to delete key pair from IndexedDB:\", error);\n\t}\n}\n/**\n* Controls DPoP (Demonstrating Proof-of-Possession) cryptographic operations.\n*\n* Generates an RSA-2048 key pair where the private key is non-extractable,\n* computes the JWK Thumbprint (RFC 7638) as the fingerprint, and creates\n* signed DPoP proof JWTs for both HTTP API requests and WebSocket RPC calls.\n*\n* The key pair is persisted in IndexedDB so the same fingerprint survives\n* page reloads. This keeps the Client Bound SAT and stored authorization_state\n* valid across reloads without needing to re-authenticate.\n*\n* @example\n* ```typescript\n* const crypto = new CryptoController();\n* await crypto.init();\n*\n* // Get fingerprint for SAT issuance\n* const fingerprint = crypto.fingerprint;\n*\n* // Create proof for HTTP endpoint\n* const httpProof = await crypto.createHttpProof({\n*   method: 'POST',\n*   uri: '/api/fabric/subscriber/devices/token'\n* });\n*\n* // Create proof for RPC call\n* const rpcProof = await crypto.createRpcProof({\n*   method: 'signalwire.connect'\n* });\n* ```\n*/\nvar CryptoController = class {\n\tconstructor() {\n\t\tthis._keyPair = null;\n\t\tthis._publicJwk = null;\n\t\tthis._fingerprint = null;\n\t\tthis._initialized = false;\n\t}\n\t/**\n\t* Initializes the DPoP key pair. Loads an existing key from IndexedDB\n\t* if available, otherwise generates a new one and persists it.\n\t*\n\t* The private key is non-extractable — IndexedDB stores the CryptoKey\n\t* handle via the structured clone algorithm without exposing key material.\n\t*\n\t* @returns The JWK Thumbprint (fingerprint) for the key.\n\t*/\n\tasync init() {\n\t\tif (this._initialized) return this.fingerprint;\n\t\tconst stored = await loadKeyPairFromDB();\n\t\tif (stored) try {\n\t\t\tconst testData = new TextEncoder().encode(\"dpop-key-check\");\n\t\t\tawait crypto.subtle.sign(\"RSASSA-PKCS1-v1_5\", stored.privateKey, testData);\n\t\t\tthis._keyPair = stored;\n\t\t\tthis._publicJwk = await crypto.subtle.exportKey(\"jwk\", stored.publicKey);\n\t\t\tthis._fingerprint = await computeJwkThumbprint(this._publicJwk);\n\t\t\tthis._initialized = true;\n\t\t\tlogger$28.debug(\"[DPoP] Key pair restored from IndexedDB, fingerprint:\", this._fingerprint);\n\t\t\treturn this._fingerprint;\n\t\t} catch (error) {\n\t\t\tlogger$28.warn(\"[DPoP] Stored key pair unusable, generating new one:\", error);\n\t\t\tawait deleteKeyPairFromDB();\n\t\t}\n\t\tlogger$28.debug(\"[DPoP] Generating RSA key pair\");\n\t\tthis._keyPair = await crypto.subtle.generateKey({\n\t\t\tname: \"RSASSA-PKCS1-v1_5\",\n\t\t\tmodulusLength: 2048,\n\t\t\tpublicExponent: new Uint8Array([\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t\t1\n\t\t\t]),\n\t\t\thash: \"SHA-256\"\n\t\t}, false, [\"sign\", \"verify\"]);\n\t\tthis._publicJwk = await crypto.subtle.exportKey(\"jwk\", this._keyPair.publicKey);\n\t\tthis._fingerprint = await computeJwkThumbprint(this._publicJwk);\n\t\tthis._initialized = true;\n\t\tawait saveKeyPairToDB(this._keyPair);\n\t\tlogger$28.debug(\"[DPoP] Key pair generated and persisted, fingerprint:\", this._fingerprint);\n\t\treturn this._fingerprint;\n\t}\n\t/**\n\t* The JWK Thumbprint (RFC 7638) of the public key.\n\t* Used as the `fingerprint` parameter when requesting scoped SATs.\n\t*\n\t* @throws {DPoPInitError} If {@link init} has not been called.\n\t*/\n\tget fingerprint() {\n\t\tif (!this._fingerprint) throw new DPoPInitError(\"CryptoController not initialized. Call init() first.\");\n\t\treturn this._fingerprint;\n\t}\n\t/**\n\t* Whether the controller has been initialized with a key pair.\n\t*/\n\tget initialized() {\n\t\treturn this._initialized;\n\t}\n\t/**\n\t* Creates a DPoP proof JWT for an HTTP API request.\n\t*\n\t* Used for Prime API endpoints like `/api/fabric/subscriber/devices/token`\n\t* and `/api/fabric/subscriber/devices/refresh`.\n\t*\n\t* @param params - HTTP method and URI for the proof.\n\t* @returns Signed DPoP proof JWT string.\n\t*/\n\tasync createHttpProof(params) {\n\t\tconst payload = {\n\t\t\tjti: crypto.randomUUID(),\n\t\t\thtm: params.method,\n\t\t\thtu: params.uri,\n\t\t\tiat: Math.floor(Date.now() / 1e3)\n\t\t};\n\t\tif (params.accessToken) payload.ath = base64url(await crypto.subtle.digest(\"SHA-256\", new TextEncoder().encode(params.accessToken)));\n\t\treturn this.signProof(payload);\n\t}\n\t/**\n\t* Creates a DPoP proof JWT for a WebSocket RPC call.\n\t*\n\t* Used for switchblade RPC methods like `signalwire.connect` and\n\t* `signalwire.reauthenticate`.\n\t*\n\t* @param params - RPC method name for the proof.\n\t* @returns Signed DPoP proof JWT string.\n\t*/\n\tasync createRpcProof(params) {\n\t\tconst payload = {\n\t\t\tjti: crypto.randomUUID(),\n\t\t\trpc: \"request\",\n\t\t\tmth: params.method,\n\t\t\tiat: Math.floor(Date.now() / 1e3)\n\t\t};\n\t\treturn this.signProof(payload);\n\t}\n\t/**\n\t* Releases the key pair references and removes the persisted key from IndexedDB.\n\t* After calling destroy, the controller must be re-initialized to be used again.\n\t*/\n\tdestroy() {\n\t\tthis._keyPair = null;\n\t\tthis._publicJwk = null;\n\t\tthis._fingerprint = null;\n\t\tthis._initialized = false;\n\t\tdeleteKeyPairFromDB();\n\t\tlogger$28.debug(\"[DPoP] Controller destroyed\");\n\t}\n\tget publicJwk() {\n\t\tif (!this._publicJwk) throw new DPoPInitError(\"CryptoController not initialized. Call init() first.\");\n\t\treturn this._publicJwk;\n\t}\n\tget privateKey() {\n\t\tif (!this._keyPair) throw new DPoPInitError(\"CryptoController not initialized. Call init() first.\");\n\t\treturn this._keyPair.privateKey;\n\t}\n\tasync signProof(payload) {\n\t\tconst header = {\n\t\t\ttyp: \"dpop+jwt\",\n\t\t\talg: \"RS256\",\n\t\t\tjwk: this.publicJwk\n\t\t};\n\t\tconst signingInput = `${base64urlEncode(JSON.stringify(header))}.${base64urlEncode(JSON.stringify(payload))}`;\n\t\treturn `${signingInput}.${base64url(await crypto.subtle.sign(\"RSASSA-PKCS1-v1_5\", this.privateKey, new TextEncoder().encode(signingInput)))}`;\n\t}\n};\n\n//#endregion\n//#region src/controllers/NetworkMonitor.ts\nconst logger$27 = getLogger();\n/**\n* Safely check whether we are running in a browser environment\n* with `window` and the relevant event targets.\n*/\nfunction hasBrowserNetworkEvents() {\n\treturn typeof window !== \"undefined\" && typeof window.addEventListener === \"function\";\n}\n/**\n* Attempt to read the current effective type from the Network Information API.\n* Returns `undefined` when the API is not available.\n*/\nfunction getNetworkType() {\n\tif (typeof navigator === \"undefined\") return;\n\tconst { connection } = navigator;\n\treturn connection?.effectiveType ?? void 0;\n}\n/**\n* Returns the `NetworkInformation` object when available, or `undefined`.\n*/\nfunction getNetworkConnection() {\n\tif (typeof navigator === \"undefined\") return;\n\treturn navigator.connection ?? void 0;\n}\n/**\n* Monitors browser-level network connectivity events (online / offline)\n* and, where supported, the Network Information API for connection type changes.\n*\n* Safe for non-browser environments — all event listeners are guarded by\n* feature checks and no-op gracefully when `window` is unavailable.\n*/\nvar NetworkMonitor = class extends Destroyable {\n\tconstructor() {\n\t\tsuper();\n\t\tthis._isOnline$ = this.createBehaviorSubject(typeof navigator !== \"undefined\" ? navigator.onLine : true);\n\t\tthis._networkChange$ = this.createSubject();\n\t\tthis._onOnline = this.handleOnline.bind(this);\n\t\tthis._onOffline = this.handleOffline.bind(this);\n\t\tthis._onConnectionChange = this.handleConnectionChange.bind(this);\n\t\tthis._listenersAttached = false;\n\t\tthis.attachListeners();\n\t}\n\tget isOnline$() {\n\t\treturn this._isOnline$.asObservable().pipe(takeUntil(this._destroyed$));\n\t}\n\tget isOnline() {\n\t\treturn this._isOnline$.value;\n\t}\n\tget networkChange$() {\n\t\treturn this._networkChange$.asObservable().pipe(takeUntil(this._destroyed$));\n\t}\n\tdestroy() {\n\t\tthis.removeListeners();\n\t\tsuper.destroy();\n\t}\n\tattachListeners() {\n\t\tif (!hasBrowserNetworkEvents()) {\n\t\t\tlogger$27.debug(\"NetworkMonitor: no browser environment detected, skipping event listeners\");\n\t\t\treturn;\n\t\t}\n\t\twindow.addEventListener(\"online\", this._onOnline);\n\t\twindow.addEventListener(\"offline\", this._onOffline);\n\t\tconst connection = getNetworkConnection();\n\t\tif (connection) connection.addEventListener(\"change\", this._onConnectionChange);\n\t\tthis._listenersAttached = true;\n\t\tlogger$27.debug(\"NetworkMonitor: event listeners attached\");\n\t}\n\tremoveListeners() {\n\t\tif (!this._listenersAttached) return;\n\t\tif (hasBrowserNetworkEvents()) {\n\t\t\twindow.removeEventListener(\"online\", this._onOnline);\n\t\t\twindow.removeEventListener(\"offline\", this._onOffline);\n\t\t\tconst connection = getNetworkConnection();\n\t\t\tif (connection) connection.removeEventListener(\"change\", this._onConnectionChange);\n\t\t}\n\t\tthis._listenersAttached = false;\n\t\tlogger$27.debug(\"NetworkMonitor: event listeners removed\");\n\t}\n\thandleOnline() {\n\t\tlogger$27.info(\"NetworkMonitor: browser went online\");\n\t\tthis._isOnline$.next(true);\n\t\tthis._networkChange$.next({\n\t\t\ttype: \"online\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tnetworkType: getNetworkType()\n\t\t});\n\t}\n\thandleOffline() {\n\t\tlogger$27.info(\"NetworkMonitor: browser went offline\");\n\t\tthis._isOnline$.next(false);\n\t\tthis._networkChange$.next({\n\t\t\ttype: \"offline\",\n\t\t\ttimestamp: Date.now()\n\t\t});\n\t}\n\thandleConnectionChange() {\n\t\tconst networkType = getNetworkType();\n\t\tlogger$27.info(`NetworkMonitor: connection changed — effectiveType=${networkType ?? \"unknown\"}`);\n\t\tthis._networkChange$.next({\n\t\t\ttype: \"connection_change\",\n\t\t\ttimestamp: Date.now(),\n\t\t\tnetworkType\n\t\t});\n\t}\n};\n\n//#endregion\n//#region src/controllers/PlatformCapabilities.ts\n/**\n* Detects the list of supported codecs for a given media kind\n* by calling RTCRtpSender.getCapabilities when available.\n*\n* @param kind - 'audio' or 'video'\n* @returns Array of unique codec names (e.g., ['VP8', 'VP9', 'H264'])\n*/\nfunction detectCodecs(kind) {\n\tif (typeof RTCRtpSender === \"undefined\" || typeof RTCRtpSender.getCapabilities !== \"function\") return [];\n\tconst capabilities = RTCRtpSender.getCapabilities(kind);\n\tif (!capabilities) return [];\n\tconst seen = /* @__PURE__ */ new Set();\n\tconst codecs = [];\n\tfor (const codec of capabilities.codecs) {\n\t\tconst name = extractCodecName(codec.mimeType);\n\t\tif (name && !seen.has(name)) {\n\t\t\tseen.add(name);\n\t\t\tcodecs.push(name);\n\t\t}\n\t}\n\treturn codecs;\n}\n/**\n* Extracts the codec name from a MIME type string (e.g., 'video/VP8' -> 'VP8').\n*/\nfunction extractCodecName(mimeType) {\n\tconst slashIndex = mimeType.indexOf(\"/\");\n\treturn slashIndex >= 0 ? mimeType.substring(slashIndex + 1) : mimeType;\n}\n/**\n* Checks whether insertable streams / encoded transforms are available.\n*\n* Tests for both the newer RTCRtpScriptTransform (Safari 15.4+, Chrome 128+)\n* and the older MediaStreamTrackProcessor (Chrome 94+).\n*/\nfunction detectInsertableStreams() {\n\tif (typeof globalThis === \"undefined\") return false;\n\treturn \"RTCRtpScriptTransform\" in globalThis || \"MediaStreamTrackProcessor\" in globalThis;\n}\n/**\n* Checks whether setSinkId (audio output device selection) is available.\n*/\nfunction detectAudioOutputSelection() {\n\tif (typeof HTMLMediaElement === \"undefined\") return false;\n\treturn \"setSinkId\" in HTMLMediaElement.prototype;\n}\n/**\n* Checks whether simulcast is supported by checking for RTCRtpSender.setParameters\n* and the presence of encoding parameters support.\n*/\nfunction detectSimulcast() {\n\tif (typeof RTCRtpSender === \"undefined\") return false;\n\treturn typeof RTCRtpSender.prototype.setParameters === \"function\";\n}\n/**\n* Detects platform WebRTC capabilities at call time.\n*\n* If a {@link WebRTCApiProvider} is supplied, its mediaDevices are used\n* for `getUserMedia` / `getDisplayMedia` detection. Otherwise the\n* standard `navigator.mediaDevices` is probed.\n*\n* @param provider - Optional custom WebRTC API provider\n* @returns A frozen {@link PlatformCapabilities} object\n*/\nfunction detectPlatformCapabilities(provider) {\n\tconst mediaDevices = provider?.mediaDevices ?? getNavigatorMediaDevices();\n\tconst hasGetUserMedia = typeof mediaDevices?.getUserMedia === \"function\";\n\tconst hasGetDisplayMedia = typeof mediaDevices?.getDisplayMedia === \"function\";\n\tconst capabilities = {\n\t\twebrtc: provider ? typeof provider.RTCPeerConnection === \"function\" : typeof globalThis !== \"undefined\" && \"RTCPeerConnection\" in globalThis,\n\t\tgetUserMedia: hasGetUserMedia,\n\t\tgetDisplayMedia: hasGetDisplayMedia,\n\t\tscreenShare: hasGetDisplayMedia,\n\t\tscreenShareAudio: detectScreenShareAudio(),\n\t\tsimulcast: detectSimulcast(),\n\t\tinsertableStreams: detectInsertableStreams(),\n\t\taudioOutputSelection: detectAudioOutputSelection(),\n\t\tvideoCodecs: detectCodecs(\"video\"),\n\t\taudioCodecs: detectCodecs(\"audio\")\n\t};\n\treturn Object.freeze(capabilities);\n}\n/**\n* Detects whether screen share with system audio is supported.\n*\n* This is primarily a Chromium feature. We detect it by checking\n* whether getDisplayMedia exists and the browser is Chromium-based.\n*/\nfunction detectScreenShareAudio() {\n\tif (typeof navigator === \"undefined\") return false;\n\tconst mediaDevices = getNavigatorMediaDevices();\n\tif (!mediaDevices || typeof mediaDevices.getDisplayMedia !== \"function\") return false;\n\treturn navigator.userAgent.includes(\"Chrome/\");\n}\n/**\n* Safely retrieves navigator.mediaDevices, returning null if unavailable.\n*/\nfunction getNavigatorMediaDevices() {\n\tif (typeof navigator !== \"undefined\") return navigator.mediaDevices;\n\treturn null;\n}\n\n//#endregion\n//#region src/controllers/PreflightRunner.ts\nconst logger$26 = getLogger();\nconst DEFAULT_MEDIA_TEST_DURATION_S = 10;\nconst ICE_GATHERING_TIMEOUT_MS = 1e4;\nconst SIGNALING_RTT_TIMEOUT_MS = 5e3;\nconst DEVICE_TEST_TIMEOUT_MS = 5e3;\n/**\n* Runs a multi-phase connectivity test:\n*   1. Signaling -- verify WebSocket is connected, measure RTT\n*   2. Devices -- verify getUserMedia works with selected devices\n*   3. ICE/TURN -- gather ICE candidates and check reachability\n*   4. Media/bandwidth -- dial, collect getStats(), compute bandwidth\n*\n* Extends Destroyable so all resources are cleaned up when done.\n*/\nvar PreflightRunner = class extends Destroyable {\n\tconstructor(deviceController, iceServers, isConnected, transportRttMs, dialFn, options = {}) {\n\t\tsuper();\n\t\tthis.deviceController = deviceController;\n\t\tthis.iceServers = iceServers;\n\t\tthis.isConnected = isConnected;\n\t\tthis.transportRttMs = transportRttMs;\n\t\tthis.dialFn = dialFn;\n\t\tthis._options = {\n\t\t\tduration: options.duration ?? DEFAULT_MEDIA_TEST_DURATION_S,\n\t\t\tskipMediaTest: options.skipMediaTest ?? false,\n\t\t\taudioDevice: options.audioDevice,\n\t\t\tvideoDevice: options.videoDevice\n\t\t};\n\t}\n\t/**\n\t* Execute the full preflight test and return the result.\n\t* Always cleans up resources on completion or error.\n\t*/\n\tasync run(destination) {\n\t\tconst warnings = [];\n\t\ttry {\n\t\t\tconst signaling = this.testSignaling();\n\t\t\tif (!signaling.reachable) warnings.push(\"WebSocket not connected\");\n\t\t\tconst devices = await this.testDevices();\n\t\t\tif (!devices.audioInput.working) warnings.push(\"Audio input device not working\");\n\t\t\tif (!devices.videoInput.working) warnings.push(\"Video input device not working\");\n\t\t\tconst connectivity = await this.testIceConnectivity();\n\t\t\tif (connectivity.type === \"failed\") warnings.push(\"No ICE connectivity (neither STUN nor TURN reachable)\");\n\t\t\telse if (connectivity.type === \"relay\") warnings.push(\"Only TURN relay connectivity available (no direct path)\");\n\t\t\tif (!connectivity.turnReachable) warnings.push(\"TURN servers not reachable\");\n\t\t\tlet bandwidth = null;\n\t\t\tif (!this._options.skipMediaTest) try {\n\t\t\t\tbandwidth = await this.testMediaBandwidth(destination);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$26.warn(\"[PreflightRunner] Media bandwidth test failed:\", error);\n\t\t\t\twarnings.push(\"Media bandwidth test failed\");\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tok: signaling.reachable && connectivity.type !== \"failed\" && devices.audioInput.working,\n\t\t\t\tsignaling,\n\t\t\t\tconnectivity,\n\t\t\t\tbandwidth,\n\t\t\t\tdevices,\n\t\t\t\twarnings\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger$26.error(\"[PreflightRunner] Preflight test failed:\", error);\n\t\t\tthrow new PreflightError(\"preflight\", error instanceof Error ? error : new Error(String(error)));\n\t\t} finally {\n\t\t\tthis.destroy();\n\t\t}\n\t}\n\ttestSignaling() {\n\t\treturn {\n\t\t\treachable: this.isConnected,\n\t\t\trttMs: this.transportRttMs\n\t\t};\n\t}\n\tasync testDevices() {\n\t\tconst audioDevice = this._options.audioDevice ?? this.deviceController.selectedAudioInputDevice;\n\t\tconst videoDevice = this._options.videoDevice ?? this.deviceController.selectedVideoInputDevice;\n\t\tconst audioOutputDevice = this.deviceController.selectedAudioOutputDevice;\n\t\tlet audioWorking = false;\n\t\tlet videoWorking = false;\n\t\tlet audioStream;\n\t\ttry {\n\t\t\tconst constraints = {};\n\t\t\tif (audioDevice) constraints.audio = { deviceId: { exact: audioDevice.deviceId } };\n\t\t\telse constraints.audio = true;\n\t\t\tif (videoDevice) constraints.video = { deviceId: { exact: videoDevice.deviceId } };\n\t\t\telse constraints.video = true;\n\t\t\taudioStream = await Promise.race([navigator.mediaDevices.getUserMedia(constraints), new Promise((_, reject) => setTimeout(() => reject(/* @__PURE__ */ new Error(\"getUserMedia timeout\")), DEVICE_TEST_TIMEOUT_MS))]);\n\t\t\tfor (const track of audioStream.getTracks()) {\n\t\t\t\tif (track.kind === \"audio\" && track.readyState === \"live\") audioWorking = true;\n\t\t\t\tif (track.kind === \"video\" && track.readyState === \"live\") videoWorking = true;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$26.warn(\"[PreflightRunner] Device test failed:\", error);\n\t\t} finally {\n\t\t\tif (audioStream) audioStream.getTracks().forEach((t) => t.stop());\n\t\t}\n\t\treturn {\n\t\t\taudioInput: {\n\t\t\t\tworking: audioWorking,\n\t\t\t\tdevice: audioDevice\n\t\t\t},\n\t\t\tvideoInput: {\n\t\t\t\tworking: videoWorking,\n\t\t\t\tdevice: videoDevice\n\t\t\t},\n\t\t\taudioOutput: {\n\t\t\t\tavailable: !!audioOutputDevice,\n\t\t\t\tdevice: audioOutputDevice\n\t\t\t}\n\t\t};\n\t}\n\tasync testIceConnectivity() {\n\t\tlet pc;\n\t\ttry {\n\t\t\tpc = new RTCPeerConnection({ iceServers: this.iceServers });\n\t\t\tconst peerConnection = pc;\n\t\t\tconst candidateTypes = /* @__PURE__ */ new Set();\n\t\t\tconst startTime = Date.now();\n\t\t\tconst gatheringComplete = new Promise((resolve) => {\n\t\t\t\tconst timer$1 = setTimeout(resolve, ICE_GATHERING_TIMEOUT_MS);\n\t\t\t\tpeerConnection.onicecandidate = (event) => {\n\t\t\t\t\tif (event.candidate) {\n\t\t\t\t\t\tconst candidateStr = event.candidate.candidate;\n\t\t\t\t\t\tif (candidateStr.includes(\"typ host\")) candidateTypes.add(\"host\");\n\t\t\t\t\t\tif (candidateStr.includes(\"typ srflx\")) candidateTypes.add(\"srflx\");\n\t\t\t\t\t\tif (candidateStr.includes(\"typ relay\")) candidateTypes.add(\"relay\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclearTimeout(timer$1);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t});\n\t\t\tpc.createDataChannel(\"preflight-test\");\n\t\t\tconst offer = await pc.createOffer();\n\t\t\tawait pc.setLocalDescription(offer);\n\t\t\tawait gatheringComplete;\n\t\t\tconst rttMs = Date.now() - startTime;\n\t\t\tconst stunReachable = candidateTypes.has(\"srflx\");\n\t\t\tconst turnReachable = candidateTypes.has(\"relay\");\n\t\t\tconst hasHost = candidateTypes.has(\"host\");\n\t\t\tlet type = \"failed\";\n\t\t\tif (hasHost || stunReachable) type = \"direct\";\n\t\t\telse if (turnReachable) type = \"relay\";\n\t\t\treturn {\n\t\t\t\ttype,\n\t\t\t\tturnReachable,\n\t\t\t\tstunReachable,\n\t\t\t\trttMs\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tlogger$26.warn(\"[PreflightRunner] ICE connectivity test failed:\", error);\n\t\t\treturn {\n\t\t\t\ttype: \"failed\",\n\t\t\t\tturnReachable: false,\n\t\t\t\tstunReachable: false,\n\t\t\t\trttMs: 0\n\t\t\t};\n\t\t} finally {\n\t\t\tif (pc) pc.close();\n\t\t}\n\t}\n\tasync testMediaBandwidth(destination) {\n\t\tlet call;\n\t\ttry {\n\t\t\tcall = await this.dialFn(destination, {\n\t\t\t\taudio: true,\n\t\t\t\tvideo: false\n\t\t\t});\n\t\t\tawait firstValueFrom(call.status$.pipe(filter((s) => s === \"connected\"), take(1), timeout(SIGNALING_RTT_TIMEOUT_MS)));\n\t\t\tconst durationMs = this._options.duration * 1e3;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, durationMs));\n\t\t\tconst metrics = call.networkMetrics;\n\t\t\tlet uploadKbps = 0;\n\t\t\tlet downloadKbps = 0;\n\t\t\tif (metrics.length > 0) {\n\t\t\t\tconst latest = metrics[metrics.length - 1];\n\t\t\t\tif (latest.availableOutgoingBitrate !== void 0) uploadKbps = Math.round(latest.availableOutgoingBitrate / 1e3);\n\t\t\t\tconst totalPackets = latest.audio.packetsReceived + latest.video.packetsReceived;\n\t\t\t\tif (durationMs > 0 && totalPackets > 0) downloadKbps = uploadKbps;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tuploadKbps,\n\t\t\t\tdownloadKbps\n\t\t\t};\n\t\t} finally {\n\t\t\tif (call) try {\n\t\t\t\tawait call.hangup();\n\t\t\t} catch {}\n\t\t}\n\t}\n\tdestroy() {\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/controllers/VisibilityController.ts\nconst logger$25 = getLogger();\n/**\n* Checks whether the document visibility API is available.\n*/\nfunction isVisibilityApiAvailable() {\n\ttry {\n\t\treturn typeof document !== \"undefined\" && typeof document.addEventListener === \"function\" && typeof document.visibilityState === \"string\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n/**\n* Returns the current document visibility state, defaulting to 'visible'\n* in non-browser environments.\n*/\nfunction getCurrentVisibility() {\n\ttry {\n\t\tif (typeof document !== \"undefined\" && typeof document.visibilityState === \"string\") return document.visibilityState === \"visible\" ? \"visible\" : \"hidden\";\n\t} catch {}\n\treturn \"visible\";\n}\n/**\n* VisibilityController tracks browser tab visibility state and exposes\n* it as RxJS observables. Safe for use in non-browser environments\n* where the document API is not available.\n*\n* Extends Destroyable for lifecycle management and automatic cleanup.\n*/\nvar VisibilityController = class extends Destroyable {\n\tconstructor() {\n\t\tsuper();\n\t\tthis._visibility$ = this.createBehaviorSubject(getCurrentVisibility());\n\t\tthis._visibilityChange$ = this.createSubject();\n\t\tthis._hasVisibilityApi = isVisibilityApiAvailable();\n\t\tthis._boundHandler = this._handleVisibilityChange.bind(this);\n\t\tif (this._hasVisibilityApi) {\n\t\t\tdocument.addEventListener(\"visibilitychange\", this._boundHandler);\n\t\t\tlogger$25.debug(\"VisibilityController: listening for visibilitychange events\");\n\t\t} else logger$25.debug(\"VisibilityController: document visibility API not available, defaulting to visible\");\n\t}\n\t/**\n\t* Observable of the current visibility state.\n\t* Emits 'visible' or 'hidden'. Always starts with the current state.\n\t*/\n\tget visibility$() {\n\t\treturn this._visibility$.pipe(takeUntil(this._destroyed$));\n\t}\n\t/**\n\t* The current visibility state value.\n\t*/\n\tget visibility() {\n\t\treturn this._visibility$.value;\n\t}\n\t/**\n\t* Observable that emits transition events when visibility changes.\n\t* Each event includes the previous state, new state, and timestamp.\n\t*/\n\tget visibilityChange$() {\n\t\treturn this._visibilityChange$.pipe(takeUntil(this._destroyed$));\n\t}\n\tdestroy() {\n\t\tif (this._hasVisibilityApi) {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", this._boundHandler);\n\t\t\tlogger$25.debug(\"VisibilityController: removed visibilitychange listener\");\n\t\t}\n\t\tsuper.destroy();\n\t}\n\t/**\n\t* Handle the browser's visibilitychange event.\n\t*/\n\t_handleVisibilityChange() {\n\t\tconst newState = getCurrentVisibility();\n\t\tconst previousState = this._visibility$.value;\n\t\tif (newState === previousState) return;\n\t\tthis._visibility$.next(newState);\n\t\tconst changeEvent = {\n\t\t\tfrom: previousState,\n\t\t\tto: newState,\n\t\t\ttimestamp: Date.now()\n\t\t};\n\t\tthis._visibilityChange$.next(changeEvent);\n\t\tlogger$25.debug(\"VisibilityController: visibility changed\", {\n\t\t\tfrom: previousState,\n\t\t\tto: newState\n\t\t});\n\t}\n};\n\n//#endregion\n//#region src/behaviors/Fetchable.ts\nvar Fetchable = class extends Destroyable {\n\tconstructor(fromPath, http) {\n\t\tsuper();\n\t\tthis.fromPath = fromPath;\n\t\tthis.http = http;\n\t\tthis.fetched$ = defer(() => from(this.fetch())).pipe(shareReplay(1), takeUntil(this.destroyed$));\n\t}\n\tasync fetch() {\n\t\tconst response = await this.http.request({\n\t\t\turl: this.fromPath,\n\t\t\tmethod: \"GET\",\n\t\t\theaders: { Accept: \"application/json\" }\n\t\t});\n\t\tif (response.ok && response.body) {\n\t\t\tconst data = JSON.parse(response.body);\n\t\t\tthis.populateInstance(data);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n};\n\n//#endregion\n//#region src/core/entities/User.ts\n/**\n* Authenticated user profile.\n*\n* Fetched automatically when a {@link SignalWire} connects.\n* Contains identity, contact, and organization details.\n*/\nvar User = class extends Fetchable {\n\tconstructor(http) {\n\t\tsuper(\"/api/fabric/subscriber/info\", http);\n\t}\n\tpopulateInstance(data) {\n\t\tthis.id = data.id;\n\t\tthis.email = data.email;\n\t\tthis.firstName = data.first_name;\n\t\tthis.lastName = data.last_name;\n\t\tthis.displayName = data.display_name;\n\t\tthis.jobTitle = data.job_title;\n\t\tthis.timeZone = data.time_zone;\n\t\tthis.country = data.country;\n\t\tthis.region = data.region;\n\t\tthis.companyName = data.company_name;\n\t\tthis.pushNotificationKey = data.push_notification_key;\n\t\tthis.appSettings = data.app_settings ? {\n\t\t\tdisplayName: data.app_settings.display_name,\n\t\t\tscopes: data.app_settings.scopes\n\t\t} : void 0;\n\t\tthis.addresses = data.fabric_addresses;\n\t\tthis.satClaims = data.sat_claims;\n\t}\n};\n\n//#endregion\n//#region src/core/RPCMessages/helpers.ts\nconst buildRPCRequest = (params) => {\n\treturn {\n\t\tjsonrpc: \"2.0\",\n\t\tid: params.id ?? v4(),\n\t\t...params\n\t};\n};\nconst makeRPCResponse = (params) => {\n\treturn {\n\t\tjsonrpc: \"2.0\",\n\t\t...params\n\t};\n};\n\n//#endregion\n//#region src/core/RPCMessages/RPCConnect.ts\nconst DEFAULT_CONNECT_VERSION = {\n\tmajor: 4,\n\tminor: 0,\n\trevision: 0\n};\nconst RPCConnect = (params) => {\n\treturn buildRPCRequest({\n\t\tmethod: \"signalwire.connect\",\n\t\tparams: {\n\t\t\tversion: DEFAULT_CONNECT_VERSION,\n\t\t\tevent_acks: true,\n\t\t\t...params\n\t\t}\n\t});\n};\n\n//#endregion\n//#region src/core/RPCMessages/RPCReauthenticate.ts\nconst RPCReauthenticate = (params) => {\n\tconst { dpop_token, ...authFields } = params;\n\treturn buildRPCRequest({\n\t\tmethod: \"signalwire.reauthenticate\",\n\t\tparams: {\n\t\t\tauthentication: authFields,\n\t\t\t...dpop_token ? { dpop_token } : {}\n\t\t}\n\t});\n};\n\n//#endregion\n//#region src/core/RPCMessages/RPCPing.ts\nconst RPCPingResponse = (id, timestamp) => {\n\treturn makeRPCResponse({\n\t\tid,\n\t\tresult: { timestamp: timestamp ?? Date.now() / 1e3 }\n\t});\n};\n\n//#endregion\n//#region src/core/RPCMessages/RPCExecute.ts\nconst RPCExecute = ({ method, params }) => {\n\treturn buildRPCRequest({\n\t\tmethod,\n\t\tparams\n\t});\n};\n\n//#endregion\n//#region src/core/RPCMessages/VertoMessages.ts\nconst SDK_TO_VERTO_FIELD_MAP = {\n\tid: \"callID\",\n\tdestinationNumber: \"destination_number\",\n\tremoteCallerName: \"remote_caller_id_name\",\n\tremoteCallerNumber: \"remote_caller_id_number\",\n\tcallerName: \"caller_id_name\",\n\tcallerNumber: \"caller_id_number\",\n\tfromCallAddressId: \"from_fabric_address_id\"\n};\nconst EXCLUDED_DIALOG_PARAMS = new Set([\n\t\"remoteSdp\",\n\t\"localStream\",\n\t\"remoteStream\"\n]);\n/**\n* Translate SDK fields into verto variables.\n* Returns a new object — the input is never mutated.\n*/\n/** @internal Exported for testing only. */\nconst filterVertoParams = (params) => {\n\tif (!Object.prototype.hasOwnProperty.call(params, \"dialogParams\")) return params;\n\tconst sourceDialogParams = params.dialogParams;\n\tconst filteredDialogParams = Object.entries(sourceDialogParams).reduce((acc, [key, value]) => {\n\t\tif (EXCLUDED_DIALOG_PARAMS.has(key)) return acc;\n\t\tconst mappedKey = SDK_TO_VERTO_FIELD_MAP[key] ?? key;\n\t\treturn {\n\t\t\t...acc,\n\t\t\t[mappedKey]: value\n\t\t};\n\t}, {});\n\treturn {\n\t\t...params,\n\t\tdialogParams: filteredDialogParams\n\t};\n};\nconst buildVertoRPCMessage = (method) => {\n\treturn (params = {}) => {\n\t\treturn buildRPCRequest({\n\t\t\tmethod,\n\t\t\tparams: filterVertoParams(params)\n\t\t});\n\t};\n};\nconst WebrtcVerto = (params) => {\n\treturn buildRPCRequest({\n\t\tmethod: \"webrtc.verto\",\n\t\tparams\n\t});\n};\nconst VertoInvite = buildVertoRPCMessage(\"verto.invite\");\nconst VertoBye = buildVertoRPCMessage(\"verto.bye\");\nconst VertoAttach = buildVertoRPCMessage(\"verto.attach\");\nconst VertoModify = buildVertoRPCMessage(\"verto.modify\");\nconst VertoInfo = buildVertoRPCMessage(\"verto.info\");\nconst VertoAnswer = buildVertoRPCMessage(\"verto.answer\");\nconst VertoSubscribe = buildVertoRPCMessage(\"verto.subscribe\");\nconst VertoPong = buildVertoRPCMessage(\"verto.pong\");\nconst VertoByeCauseCodes = {\n\tNORMAL_CLEARING: \"16\",\n\tUSER_BUSY: \"17\",\n\tMEDIA_TIMEOUT: \"804\"\n};\n\n//#endregion\n//#region src/core/RPCMessages/RPCEventAck.ts\nconst RPCEventAckResponse = (id) => makeRPCResponse({\n\tid,\n\tresult: {}\n});\n\n//#endregion\n//#region src/managers/AttachManager.ts\nconst logger$24 = getLogger();\nvar AttachManager = class {\n\tconstructor(storage, deviceController, reconnectCallsTimeout, attachKey) {\n\t\tthis.storage = storage;\n\t\tthis.deviceController = deviceController;\n\t\tthis.reconnectCallsTimeout = reconnectCallsTimeout;\n\t\tthis.attachKey = attachKey;\n\t\tthis.writeQueue = Promise.resolve();\n\t}\n\tasync detachAll() {\n\t\tawait this.mutate((attached) => {\n\t\t\treturn {};\n\t\t});\n\t}\n\tsetSession(session) {\n\t\tthis.session = session;\n\t}\n\tasync readAttached() {\n\t\ttry {\n\t\t\treturn await this.storage.getItem(this.attachKey) ?? {};\n\t\t} catch (error) {\n\t\t\tlogger$24.warn(\"[AttachManager] Failed to retrieve attached calls from storage\", error);\n\t\t\treturn {};\n\t\t}\n\t}\n\tasync writeAttached(attached) {\n\t\ttry {\n\t\t\tawait this.storage.setItem(this.attachKey, attached);\n\t\t} catch (error) {\n\t\t\tlogger$24.warn(\"[AttachManager] Failed to write attached calls to storage\", error);\n\t\t}\n\t}\n\t/**\n\t* Serialize a read-modify-write operation against the attached-calls\n\t* storage. The mutator receives the current state and returns the new\n\t* state. Concurrent calls queue behind the in-flight one so writes never\n\t* interleave.\n\t*/\n\tasync mutate(mutator) {\n\t\tconst next = this.writeQueue.then(async () => {\n\t\t\tconst updated = await mutator(await this.readAttached());\n\t\t\tawait this.writeAttached(updated);\n\t\t});\n\t\tthis.writeQueue = next.catch(() => void 0);\n\t\treturn next;\n\t}\n\tasync attach(call) {\n\t\tif (!call.to) {\n\t\t\tlogger$24.warn(\"[AttachManager] Skip attach for calls with no destination\");\n\t\t\treturn;\n\t\t}\n\t\tconst destination = call.to;\n\t\tconst attachment = {\n\t\t\tnodeId: call.nodeId,\n\t\t\tdestination,\n\t\t\tmediaDirections: call.mediaDirections,\n\t\t\taudioInputDevice: call.mediaDirections.audio !== \"inactive\" ? this.deviceController.selectedAudioInputDevice : null,\n\t\t\tvideoInputDevice: call.mediaDirections.video !== \"inactive\" ? this.deviceController.selectedVideoInputDevice : null,\n\t\t\tattachedAt: Date.now()\n\t\t};\n\t\tawait this.mutate((attached) => ({\n\t\t\t...attached,\n\t\t\t[call.id]: attachment\n\t\t}));\n\t}\n\tasync detach(call) {\n\t\tawait this.mutate((attached) => {\n\t\t\tconst { [call.id]: _, ...remaining } = attached;\n\t\t\treturn remaining;\n\t\t});\n\t}\n\tasync flush() {\n\t\tawait this.mutate(() => ({}));\n\t}\n\t/**\n\t* Reattach to previously active calls by sending verto.invite with\n\t* reattaching: true.\n\t*\n\t* NOTE: This currently fails with INVALID_CALL_REFERENCE because the\n\t* server's jsock UUID check rejects the new connection's UUID. A\n\t* server-side fix is needed: when reattaching: true is explicitly set\n\t* in dialogParams, FreeSWITCH's attempt_reattach() should update the\n\t* call's jsock reference to the new connection's UUID instead of\n\t* rejecting. Once that fix is deployed, this will work for both\n\t* page reloads and WebSocket reconnects.\n\t*\n\t* Failed reattach attempts are handled gracefully — the stale call\n\t* reference is cleaned up from storage.\n\t*/\n\tasync reattachCalls() {\n\t\tconst attached = await this.readAttached();\n\t\tawait this.detachExpired();\n\t\tfor (const [callId, attachment] of Object.entries(attached)) {\n\t\t\tconst { destination } = attachment;\n\t\t\tconst options = this.buildCallOptions(attachment);\n\t\t\tlet succeeded = false;\n\t\t\tfor (let attempt = 1; attempt <= 3; attempt++) try {\n\t\t\t\tawait this.session.createOutboundCall(destination, {\n\t\t\t\t\tcallId,\n\t\t\t\t\t...options\n\t\t\t\t});\n\t\t\t\tlogger$24.info(`[AttachManager] Reattached call ${callId} (attempt ${attempt})`);\n\t\t\t\tsucceeded = true;\n\t\t\t\tbreak;\n\t\t\t} catch (error) {\n\t\t\t\tlogger$24.warn(`[AttachManager] Reattach attempt ${attempt}/3 failed for call ${callId}:`, error);\n\t\t\t\tif (attempt < 3) await new Promise((r) => setTimeout(r, (attempt + 1) * 1e3));\n\t\t\t}\n\t\t\tif (!succeeded) {\n\t\t\t\tlogger$24.warn(`[AttachManager] Reattach failed after 3 attempts for call ${callId}, removing reference`);\n\t\t\t\tawait this.detach({\n\t\t\t\t\tid: callId,\n\t\t\t\t\tmediaDirections: attachment.mediaDirections\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Build CallOptions from stored attachment data for a call being reattached.\n\t* Also used by the session-level verto.attach handler.\n\t*/\n\tbuildCallOptions(attachment) {\n\t\tconst { audio: audioDirection, video: videoDirection } = attachment.mediaDirections;\n\t\tconst { audioInputDevice, videoInputDevice, nodeId } = attachment;\n\t\tconst receiveAudio = audioDirection.includes(\"recv\");\n\t\tconst receiveVideo = videoDirection.includes(\"recv\");\n\t\tconst sendAudio = audioDirection.includes(\"send\");\n\t\tconst sendVideo = videoDirection.includes(\"send\");\n\t\treturn {\n\t\t\tnodeId,\n\t\t\treceiveAudio,\n\t\t\treceiveVideo,\n\t\t\tinputAudioDeviceConstraints: sendAudio ? {\n\t\t\t\taudio: true,\n\t\t\t\t...this.deviceController.deviceInfoToConstraints(audioInputDevice)\n\t\t\t} : void 0,\n\t\t\tinputVideoDeviceConstraints: sendVideo ? {\n\t\t\t\tvideo: true,\n\t\t\t\t...this.deviceController.deviceInfoToConstraints(videoInputDevice)\n\t\t\t} : void 0,\n\t\t\treattach: true\n\t\t};\n\t}\n\t/**\n\t* Look up stored attachment data for a call id and return CallOptions\n\t* suitable for rehydrating a reattached call. Returns undefined when no\n\t* matching entry exists in storage.\n\t*\n\t* Used by the session-level verto.attach handler when the server pushes\n\t* an attach event for a call the client doesn't have an object for yet\n\t* (e.g. after a reload).\n\t*/\n\tasync consumePendingAttachment(callId) {\n\t\tconst attached = await this.readAttached();\n\t\tif (!Object.hasOwn(attached, callId)) return;\n\t\treturn this.buildCallOptions(attached[callId]);\n\t}\n\tasync detachExpired() {\n\t\tconst now = Date.now();\n\t\tconst timeout$1 = this.reconnectCallsTimeout;\n\t\tawait this.mutate((attached) => {\n\t\t\tconst remaining = { ...attached };\n\t\t\tlet changed = false;\n\t\t\tfor (const [callId, attachment] of Object.entries(attached)) if (now - attachment.attachedAt > timeout$1) {\n\t\t\t\tdelete remaining[callId];\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t\treturn changed ? remaining : attached;\n\t\t});\n\t}\n};\n\n//#endregion\n//#region src/core/capabilities/types.ts\n/**\n* Default on/off state with no permissions\n*/\nconst DEFAULT_ON_OFF = {\n\ton: false,\n\toff: false\n};\n/**\n* Default member capabilities with no permissions\n*/\nconst DEFAULT_MEMBER_CAPABILITIES = {\n\tmuteAudio: DEFAULT_ON_OFF,\n\tmuteVideo: DEFAULT_ON_OFF,\n\tdeaf: DEFAULT_ON_OFF,\n\traisehand: DEFAULT_ON_OFF,\n\tmicrophoneVolume: false,\n\tmicrophoneSensitivity: false,\n\tspeakerVolume: false,\n\tposition: false,\n\tmeta: false,\n\tremove: false,\n\taudioFlags: false,\n\tdenoise: false,\n\tlowbitrate: false\n};\n/**\n* Default call capabilities with no permissions\n*/\nconst DEFAULT_CALL_CAPABILITIES = {\n\tself: DEFAULT_MEMBER_CAPABILITIES,\n\tmember: DEFAULT_MEMBER_CAPABILITIES,\n\tend: false,\n\tsetLayout: false,\n\tsendDigit: false,\n\tvmutedHide: DEFAULT_ON_OFF,\n\tlock: DEFAULT_ON_OFF,\n\tdevice: false,\n\tscreenshare: false\n};\n\n//#endregion\n//#region src/core/capabilities/computeCapabilities.ts\n/**\n* Computes an on/off capability state from filtered flags\n*\n* Logic:\n* - `on` is true if any flag does NOT end with `.off`\n* - `off` is true if any flag does NOT end with `.on`\n*\n* This means parent permissions (without .on/.off suffix) grant both on and off\n*/\nfunction computeOnOffCapability(filteredFlags) {\n\tif (filteredFlags.length === 0) return DEFAULT_ON_OFF;\n\treturn {\n\t\ton: filteredFlags.some((flag) => !flag.endsWith(\".off\")),\n\t\toff: filteredFlags.some((flag) => !flag.endsWith(\".on\"))\n\t};\n}\n/**\n* Filters flags for a specific member capability with on/off support\n*\n* Matches:\n* - The member type itself (e.g., \"self\" grants all self capabilities)\n* - The parent capability (e.g., \"self.mute\" grants all mute capabilities)\n* - The specific capability and its on/off variants (e.g., \"self.mute.audio*\")\n*/\nfunction filterMemberOnOffFlags(flags, memberType, parent, capability) {\n\treturn flags.filter((flag) => flag === memberType || flag === `${memberType}.${parent}` || flag.startsWith(`${memberType}.${parent}.${capability}`));\n}\n/**\n* Checks if a boolean capability is granted\n*\n* Matches:\n* - The member type itself (e.g., \"self\" grants all self capabilities)\n* - The parent capability if provided (e.g., \"self.microphone\" grants volume and sensitivity)\n* - The specific capability (e.g., \"self.microphone.volume.set\")\n*/\nfunction hasBooleanCapability(flags, memberType, parent, capability) {\n\treturn flags.some((flag) => flag === memberType || parent !== null && flag === `${memberType}.${parent}` || flag.startsWith(`${memberType}.${parent ? `${parent}.` : \"\"}${capability}`));\n}\n/**\n* Computes member-level capabilities (self or member) from raw flags\n*/\nfunction computeMemberCapabilities(flags, memberType) {\n\tif (flags.filter((flag) => flag.startsWith(memberType) || flag === memberType).length === 0) return DEFAULT_MEMBER_CAPABILITIES;\n\treturn {\n\t\tmuteAudio: computeOnOffCapability(filterMemberOnOffFlags(flags, memberType, \"mute\", \"audio\")),\n\t\tmuteVideo: computeOnOffCapability(filterMemberOnOffFlags(flags, memberType, \"mute\", \"video\")),\n\t\tdeaf: computeOnOffCapability(flags.filter((flag) => flag === memberType || flag.startsWith(`${memberType}.deaf`))),\n\t\traisehand: computeOnOffCapability(flags.filter((flag) => flag === memberType || flag.startsWith(`${memberType}.raisehand`))),\n\t\tmicrophoneVolume: hasBooleanCapability(flags, memberType, \"microphone\", \"volume\"),\n\t\tmicrophoneSensitivity: hasBooleanCapability(flags, memberType, \"microphone\", \"sensitivity\"),\n\t\tspeakerVolume: hasBooleanCapability(flags, memberType, \"speaker\", \"volume\"),\n\t\tposition: hasBooleanCapability(flags, memberType, null, \"position\"),\n\t\tmeta: hasBooleanCapability(flags, memberType, null, \"meta\"),\n\t\tremove: hasBooleanCapability(flags, memberType, null, \"remove\"),\n\t\taudioFlags: hasBooleanCapability(flags, memberType, null, \"audioflags\"),\n\t\tdenoise: hasBooleanCapability(flags, memberType, null, \"denoise\"),\n\t\tlowbitrate: hasBooleanCapability(flags, memberType, null, \"lowbitrate\")\n\t};\n}\n/**\n* Computes all call capabilities from raw capability strings\n*\n* This is a pure function that transforms the raw capability strings\n* from the `call.joined` event into a structured capabilities state.\n*\n* @param capabilities - Raw capability strings from the server\n* @returns Computed capabilities state\n*/\nfunction computeCapabilities(capabilities) {\n\tif (capabilities.length === 0) return DEFAULT_CALL_CAPABILITIES;\n\treturn {\n\t\tself: computeMemberCapabilities(capabilities, \"self\"),\n\t\tmember: computeMemberCapabilities(capabilities, \"member\"),\n\t\tend: capabilities.some((cap) => cap === \"end\"),\n\t\tsetLayout: capabilities.some((cap) => cap.startsWith(\"layout\")),\n\t\tsendDigit: capabilities.some((cap) => cap.startsWith(\"digit\")),\n\t\tvmutedHide: computeOnOffCapability(capabilities.filter((flag) => flag.startsWith(\"vmuted\"))),\n\t\tlock: computeOnOffCapability(capabilities.filter((flag) => flag.startsWith(\"lock\"))),\n\t\tdevice: capabilities.some((cap) => cap === \"device\"),\n\t\tscreenshare: capabilities.some((cap) => cap === \"screenshare\")\n\t};\n}\n\n//#endregion\n//#region src/core/capabilities/SelfCapabilities.ts\n/**\n* SelfCapabilities manages the capability state for the self participant.\n*\n* Capabilities are received from the server via `call.joined` events and determine\n* what actions the current participant is allowed to perform.\n*\n* Each capability is exposed as both:\n* - An observable (e.g., `end$`) for reactive state management\n* - A synchronous getter (e.g., `end`) for immediate access\n*\n* Member-level capabilities are accessed via the grouped `self` / `member` accessors:\n* - `capabilities.self.muteAudio` (sync)\n* - `capabilities.self$` (observable)\n*\n* When a new `call.joined` event is received, the capabilities state is\n* completely replaced (not merged).\n*/\nvar SelfCapabilities = class extends Destroyable {\n\tconstructor(..._args) {\n\t\tsuper(..._args);\n\t\tthis._state$ = this.createBehaviorSubject(DEFAULT_CALL_CAPABILITIES);\n\t}\n\t/**\n\t* Updates the capabilities state from raw capability strings.\n\t* This completely replaces the current state.\n\t*\n\t* @param capabilities - Raw capability strings from the server\n\t* @internal\n\t*/\n\tupdateFromRaw(capabilities) {\n\t\tconst newState = computeCapabilities(capabilities);\n\t\tthis._state$.next(newState);\n\t}\n\t/** Observable for self member capabilities */\n\tget self$() {\n\t\treturn this.cachedObservable(\"self$\", () => this._state$.pipe(map((state) => state.self), distinctUntilChanged()));\n\t}\n\t/** Current self member capabilities */\n\tget self() {\n\t\treturn this._state$.value.self;\n\t}\n\t/** Observable for other member capabilities */\n\tget member$() {\n\t\treturn this.cachedObservable(\"member$\", () => this._state$.pipe(map((state) => state.member), distinctUntilChanged()));\n\t}\n\t/** Current other member capabilities */\n\tget member() {\n\t\treturn this._state$.value.member;\n\t}\n\t/** Observable for end call capability */\n\tget end$() {\n\t\treturn this.cachedObservable(\"end$\", () => this._state$.pipe(map((state) => state.end), distinctUntilChanged()));\n\t}\n\t/** Current end call capability */\n\tget end() {\n\t\treturn this._state$.value.end;\n\t}\n\t/** Observable for set layout capability */\n\tget setLayout$() {\n\t\treturn this.cachedObservable(\"setLayout$\", () => this._state$.pipe(map((state) => state.setLayout), distinctUntilChanged()));\n\t}\n\t/** Current set layout capability */\n\tget setLayout() {\n\t\treturn this._state$.value.setLayout;\n\t}\n\t/** Observable for send digit capability */\n\tget sendDigit$() {\n\t\treturn this.cachedObservable(\"sendDigit$\", () => this._state$.pipe(map((state) => state.sendDigit), distinctUntilChanged()));\n\t}\n\t/** Current send digit capability */\n\tget sendDigit() {\n\t\treturn this._state$.value.sendDigit;\n\t}\n\t/** Observable for vmuted hide capability */\n\tget vmutedHide$() {\n\t\treturn this.cachedObservable(\"vmutedHide$\", () => this._state$.pipe(map((state) => state.vmutedHide), distinctUntilChanged()));\n\t}\n\t/** Current vmuted hide capability */\n\tget vmutedHide() {\n\t\treturn this._state$.value.vmutedHide;\n\t}\n\t/** Observable for lock capability */\n\tget lock$() {\n\t\treturn this.cachedObservable(\"lock$\", () => this._state$.pipe(map((state) => state.lock), distinctUntilChanged()));\n\t}\n\t/** Current lock capability */\n\tget lock() {\n\t\treturn this._state$.value.lock;\n\t}\n\t/** Observable for device capability */\n\tget device$() {\n\t\treturn this.cachedObservable(\"device$\", () => this._state$.pipe(map((state) => state.device), distinctUntilChanged()));\n\t}\n\t/** Current device capability */\n\tget device() {\n\t\treturn this._state$.value.device;\n\t}\n\t/** Observable for screenshare capability */\n\tget screenshare$() {\n\t\treturn this.cachedObservable(\"screenshare$\", () => this._state$.pipe(map((state) => state.screenshare), distinctUntilChanged()));\n\t}\n\t/** Current screenshare capability */\n\tget screenshare() {\n\t\treturn this._state$.value.screenshare;\n\t}\n\t/** Observable for the full capabilities state */\n\tget state$() {\n\t\treturn this._state$.asObservable();\n\t}\n\t/** Current full capabilities state */\n\tget state() {\n\t\treturn this._state$.value;\n\t}\n};\n\n//#endregion\n//#region src/core/RPCMessages/utils.ts\nfunction toggleDeafMethod(is) {\n\treturn is ? \"call.undeaf\" : \"call.deaf\";\n}\nfunction toggleHandraiseMethod(is) {\n\treturn is ? \"call.lowerhand\" : \"call.raisehand\";\n}\n\n//#endregion\n//#region src/core/entities/Participant.ts\nconst logger$23 = getLogger();\nconst initialState = {};\n/**\n* Represents a participant in a call.\n*\n* Provides observable state (audio/video mute, hand raise, volume, etc.)\n* and control methods for the participant. See {@link SelfParticipant} for\n* the local participant with additional device control.\n*/\nvar Participant = class extends Destroyable {\n\tconstructor(id, executeMethod, deviceController) {\n\t\tsuper();\n\t\tthis.executeMethod = executeMethod;\n\t\tthis.deviceController = deviceController;\n\t\tthis._state$ = this.createBehaviorSubject(initialState);\n\t\tthis.id = id;\n\t}\n\t/** @internal */\n\tupnext(data) {\n\t\tthis._state$.next({\n\t\t\t...this._state$.value,\n\t\t\t...data\n\t\t});\n\t}\n\t/** Observable of the participant's display name. */\n\tget name$() {\n\t\treturn this.cachedObservable(\"name$\", () => this._state$.pipe(map$1((state) => state.name), distinctUntilChanged$1()));\n\t}\n\t/** Observable of the participant type (e.g. `'member'`, `'screen'`). */\n\tget type$() {\n\t\treturn this.cachedObservable(\"type$\", () => this._state$.pipe(map$1((state) => state.type), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant has raised their hand. */\n\tget handraised$() {\n\t\treturn this.cachedObservable(\"handraised$\", () => this._state$.pipe(map$1((state) => state.handraised), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant is visible in the layout. */\n\tget visible$() {\n\t\treturn this.cachedObservable(\"visible$\", () => this._state$.pipe(map$1((state) => state.visible), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant's audio is muted. */\n\tget audioMuted$() {\n\t\treturn this.cachedObservable(\"audioMuted$\", () => this._state$.pipe(map$1((state) => state.audio_muted), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant's video is muted. */\n\tget videoMuted$() {\n\t\treturn this.cachedObservable(\"videoMuted$\", () => this._state$.pipe(map$1((state) => state.video_muted), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant is deafened. */\n\tget deaf$() {\n\t\treturn this.cachedObservable(\"deaf$\", () => this._state$.pipe(map$1((state) => state.deaf), distinctUntilChanged$1()));\n\t}\n\t/**\n\t* Observable of the participant's **server-side** microphone input volume\n\t* as reported by the mix engine. This is gain applied on the bridged audio\n\t* leg (FreeSWITCH channel read volume), NOT the local browser mic. For a\n\t* local PC mic control, see {@link Call.setLocalMicrophoneGain}.\n\t*\n\t* @see {@link setAudioInputVolume}\n\t*/\n\tget inputVolume$() {\n\t\treturn this.cachedObservable(\"inputVolume$\", () => this._state$.pipe(map$1((state) => state.input_volume), distinctUntilChanged$1()));\n\t}\n\t/**\n\t* Observable of the participant's **server-side** speaker output volume as\n\t* reported by the mix engine (FreeSWITCH channel write volume). NOT the\n\t* local HTML `<audio>` element volume — set that on your own element.\n\t*\n\t* @see {@link setAudioOutputVolume}\n\t*/\n\tget outputVolume$() {\n\t\treturn this.cachedObservable(\"outputVolume$\", () => this._state$.pipe(map$1((state) => state.output_volume), distinctUntilChanged$1()));\n\t}\n\t/**\n\t* Observable of the **conference-only** microphone energy/gate sensitivity\n\t* level for this member. Routes through the conferencing mix engine and has\n\t* no effect on 1:1 WebRTC calls. Populated from `member.updated` events for\n\t* conference members.\n\t*\n\t* @see {@link setAudioInputSensitivity}\n\t*/\n\tget inputSensitivity$() {\n\t\treturn this.cachedObservable(\"inputSensitivity$\", () => this._state$.pipe(map$1((state) => state.input_sensitivity), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether echo cancellation is enabled. */\n\tget echoCancellation$() {\n\t\treturn this.cachedObservable(\"echoCancellation$\", () => this._state$.pipe(map$1((state) => state.echo_cancellation), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether auto-gain control is enabled. */\n\tget autoGain$() {\n\t\treturn this.cachedObservable(\"autoGain$\", () => this._state$.pipe(map$1((state) => state.auto_gain), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether noise suppression is enabled. */\n\tget noiseSuppression$() {\n\t\treturn this.cachedObservable(\"noiseSuppression$\", () => this._state$.pipe(map$1((state) => state.noise_suppression), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether low-bitrate mode is active. */\n\tget lowbitrate$() {\n\t\treturn this.cachedObservable(\"lowbitrate$\", () => this._state$.pipe(map$1((state) => state.lowbitrate), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether noise reduction is active. */\n\tget denoise$() {\n\t\treturn this.cachedObservable(\"denoise$\", () => this._state$.pipe(map$1((state) => state.denoise), distinctUntilChanged$1()));\n\t}\n\t/** Observable of custom metadata for this participant. */\n\tget meta$() {\n\t\treturn this.cachedObservable(\"meta$\", () => this._state$.pipe(map$1((state) => state.meta), distinctUntilChanged$1()));\n\t}\n\t/** Observable of the participant's user ID. */\n\tget userId$() {\n\t\treturn this.cachedObservable(\"userId$\", () => this._state$.pipe(map$1((state) => state.subscriber_id), distinctUntilChanged$1()));\n\t}\n\t/** Observable of the participant's address ID. */\n\tget addressId$() {\n\t\treturn this.cachedObservable(\"addressId$\", () => this._state$.pipe(map$1((state) => state.address_id), distinctUntilChanged$1()));\n\t}\n\t/** Observable of the server node ID for this participant. */\n\tget nodeId$() {\n\t\treturn this.cachedObservable(\"nodeId$\", () => this._state$.pipe(map$1((state) => state.node_id), distinctUntilChanged$1()));\n\t}\n\t/** Observable indicating whether the participant is currently speaking. */\n\tget isTalking$() {\n\t\treturn this.cachedObservable(\"isTalking$\", () => this._state$.pipe(map$1((state) => state.talking), distinctUntilChanged$1()));\n\t}\n\t/** Whether the participant is currently speaking. */\n\tget isTalking() {\n\t\treturn this._state$.value.talking ?? false;\n\t}\n\t/** Observable of the participant's layout position. */\n\tget position$() {\n\t\treturn this.cachedObservable(\"position$\", () => this._state$.pipe(map$1((state) => state.position), distinctUntilChanged$1()));\n\t}\n\t/** Current layout position. */\n\tget position() {\n\t\treturn this._state$.value.position;\n\t}\n\t/** Whether the participant is an audience member (view-only). */\n\tget isAudience() {\n\t\treturn this._state$.value.isAudience ?? false;\n\t}\n\t/** Display name of this participant. */\n\tget name() {\n\t\treturn this._state$.value.name;\n\t}\n\t/** Participant type (e.g. `'member'`, `'screen'`). */\n\tget type() {\n\t\treturn this._state$.value.type;\n\t}\n\t/** Whether the participant has raised their hand. */\n\tget handraised() {\n\t\treturn this._state$.value.handraised ?? false;\n\t}\n\t/** Whether the participant is visible in the layout. */\n\tget visible() {\n\t\treturn this._state$.value.visible ?? false;\n\t}\n\t/** Whether the participant's audio is muted. */\n\tget audioMuted() {\n\t\treturn this._state$.value.audio_muted ?? false;\n\t}\n\t/** Whether the participant's video is muted. */\n\tget videoMuted() {\n\t\treturn this._state$.value.video_muted ?? false;\n\t}\n\t/** Whether the participant is deafened (incoming audio muted). */\n\tget deaf() {\n\t\treturn this._state$.value.deaf ?? false;\n\t}\n\t/**\n\t* Current **server-side** microphone input volume as reported by the mix\n\t* engine, or `undefined` if not set. Not the local PC mic — see\n\t* {@link Call.setLocalMicrophoneGain} for browser-side control.\n\t*/\n\tget inputVolume() {\n\t\treturn this._state$.value.input_volume;\n\t}\n\t/**\n\t* Current **server-side** speaker output volume from the mix engine, or\n\t* `undefined` if not set. Not the local `<audio>` element volume.\n\t*/\n\tget outputVolume() {\n\t\treturn this._state$.value.output_volume;\n\t}\n\t/**\n\t* Current **conference-only** microphone sensitivity/gate level, or\n\t* `undefined` if not set. Applies only to conference members.\n\t*/\n\tget inputSensitivity() {\n\t\treturn this._state$.value.input_sensitivity;\n\t}\n\t/** Whether echo cancellation is enabled. */\n\tget echoCancellation() {\n\t\treturn this._state$.value.echo_cancellation ?? false;\n\t}\n\t/** Whether automatic gain control is enabled. */\n\tget autoGain() {\n\t\treturn this._state$.value.auto_gain ?? false;\n\t}\n\t/** Whether noise suppression is enabled. */\n\tget noiseSuppression() {\n\t\treturn this._state$.value.noise_suppression ?? false;\n\t}\n\t/** Whether low-bitrate mode is active. */\n\tget lowbitrate() {\n\t\treturn this._state$.value.lowbitrate ?? false;\n\t}\n\t/** Whether noise reduction (denoise) is active. */\n\tget denoise() {\n\t\treturn this._state$.value.denoise ?? false;\n\t}\n\t/** Custom metadata for this participant, or `undefined` if not set. */\n\tget meta() {\n\t\treturn this._state$.value.meta;\n\t}\n\t/** User ID of this participant, or `undefined` if not available. */\n\tget userId() {\n\t\treturn this._state$.value.subscriber_id;\n\t}\n\t/** Address ID of this participant, or `undefined` if not available. */\n\tget addressId() {\n\t\treturn this._state$.value.address_id;\n\t}\n\t/** Server node ID for this participant, or `undefined` if not available. */\n\tget nodeId() {\n\t\treturn this._state$.value.node_id;\n\t}\n\t/** Call ID for this participant's leg, or `undefined` if not available. */\n\tget callId() {\n\t\treturn this._state$.value.call_id;\n\t}\n\t/** @internal */\n\tget value() {\n\t\treturn this._state$.value;\n\t}\n\t/** Toggles the deafened state (mutes/unmutes incoming audio). */\n\tasync toggleDeaf() {\n\t\tconst method = toggleDeafMethod(this.deaf);\n\t\tawait this.executeMethod(this.id, method, {});\n\t}\n\t/** Toggles the hand-raised state. */\n\tasync toggleHandraise() {\n\t\tawait this.executeMethod(this.id, toggleHandraiseMethod(this.handraised), {});\n\t}\n\t/** Mutes the participant's audio. */\n\tasync mute() {\n\t\tawait this.executeMethod(this.id, \"call.mute\", { channels: [\"audio\"] });\n\t}\n\t/** Unmutes the participant's audio. */\n\tasync unmute() {\n\t\tawait this.executeMethod(this.id, \"call.unmute\", { channels: [\"audio\"] });\n\t}\n\t/** Toggles the participant's audio mute state. */\n\tasync toggleMute() {\n\t\treturn this.audioMuted ? this.unmute() : this.mute();\n\t}\n\t/** Mutes the participant's video. */\n\tasync muteVideo() {\n\t\tawait this.executeMethod(this.id, \"call.mute\", { channels: [\"video\"] });\n\t}\n\t/** Unmutes the participant's video. */\n\tasync unmuteVideo() {\n\t\tawait this.executeMethod(this.id, \"call.unmute\", { channels: [\"video\"] });\n\t}\n\t/** Toggles the participant's video mute state. */\n\tasync toggleMuteVideo() {\n\t\treturn this.videoMuted ? this.unmuteVideo() : this.muteVideo();\n\t}\n\t/** Toggles echo cancellation on the audio input. */\n\tasync toggleEchoCancellation() {\n\t\tawait this.executeMethod(this.id, \"call.audioflags.set\", {\n\t\t\techo_cancellation: !this.echoCancellation,\n\t\t\tauto_gain: this.autoGain,\n\t\t\tnoise_suppression: this.noiseSuppression\n\t\t});\n\t}\n\t/** Toggles automatic gain control on the audio input. */\n\tasync toggleAudioInputAutoGain() {\n\t\tawait this.executeMethod(this.id, \"call.audioflags.set\", {\n\t\t\techo_cancellation: this.echoCancellation,\n\t\t\tauto_gain: !this.autoGain,\n\t\t\tnoise_suppression: this.noiseSuppression\n\t\t});\n\t}\n\t/** Toggles noise suppression on the audio input. */\n\tasync toggleNoiseSuppression() {\n\t\tawait this.executeMethod(this.id, \"call.audioflags.set\", {\n\t\t\techo_cancellation: this.echoCancellation,\n\t\t\tauto_gain: this.autoGain,\n\t\t\tnoise_suppression: !this.noiseSuppression\n\t\t});\n\t}\n\t/** Toggles low-bitrate mode for this participant's media. */\n\tasync toggleLowbitrate() {\n\t\tawait this.executeMethod(this.id, \"call.lowbitrate.set\", { lowbitrate: !this.lowbitrate });\n\t}\n\t/**\n\t* Adjusts the **conference-only** microphone energy gate / sensitivity level\n\t* for this member. Routes through the conferencing mix engine\n\t* (`signalwire.conferencing member.set_input_sensitivity`) and has no effect\n\t* on 1:1 WebRTC calls — for those, use browser audio constraints via\n\t* {@link Call.setNoiseSuppression} / {@link Call.setAutoGainControl}.\n\t*\n\t* This is **not** a local PC mic gain control; it only changes how the\n\t* server-side mixer decides to open the mic gate on this participant.\n\t*\n\t* @param value - Sensitivity level as understood by the conference engine\n\t*   (integer, larger values are more sensitive).\n\t*/\n\tasync setAudioInputSensitivity(value) {\n\t\tawait this.executeMethod(this.id, \"call.microphone.sensitivity.set\", { sensitivity: value });\n\t}\n\t/**\n\t* Sets the **server-side** microphone volume on this participant's bridged\n\t* call leg. Applies a multiplier to the audio flowing through the mix\n\t* engine (FreeSWITCH channel read volume) — changes what other participants\n\t* hear, not what the local browser captures.\n\t*\n\t* For local PC mic gain, use {@link Call.setLocalMicrophoneGain} instead.\n\t*\n\t* @param value - Volume level (0-100).\n\t*/\n\tasync setAudioInputVolume(value) {\n\t\tawait this.executeMethod(this.id, \"call.microphone.volume.set\", { volume: value });\n\t}\n\t/**\n\t* Sets the **server-side** speaker volume on this participant's bridged call\n\t* leg (FreeSWITCH channel write volume) — what this participant hears from\n\t* the mix before it reaches their client.\n\t*\n\t* For local playback volume (the `<audio>` element the consumer attaches\n\t* `remoteStream` to), set `audioElement.volume` directly in the consumer's\n\t* code.\n\t*\n\t* @param value - Volume level (0-100).\n\t*/\n\tasync setAudioOutputVolume(value) {\n\t\tawait this.executeMethod(this.id, \"call.speaker.volume.set\", { volume: value });\n\t}\n\t/**\n\t* Sets the participant's position in the video layout.\n\t*\n\t* Requires the `member.position` capability. The gateway keys positions by the\n\t* **target member's own** `call_id`/`node_id` (see issue #19400 and the legacy\n\t* `setPositions` implementation), so this sends the participant's own call\n\t* context — matching {@link Participant.remove}. A resolved promise does not\n\t* guarantee a visible change: the backend silently returns `200` (no-op) for\n\t* non-conference targets.\n\t*\n\t* @param value - The {@link VideoPosition} to assign (e.g. `'auto'`, `'reserved-0'`).\n\t*/\n\tasync setPosition(value) {\n\t\tconst state = this._state$.value;\n\t\tconst target = {\n\t\t\tmember_id: this.id,\n\t\t\tcall_id: state.call_id ?? \"\",\n\t\t\tnode_id: state.node_id ?? \"\"\n\t\t};\n\t\tawait this.executeMethod(target, \"call.member.position.set\", { targets: [{\n\t\t\ttarget,\n\t\t\tposition: value\n\t\t}] });\n\t}\n\t/** Removes this participant from the call. */\n\tasync remove() {\n\t\tconst state = this._state$.value;\n\t\tconst target = {\n\t\t\tmember_id: this.id,\n\t\t\tcall_id: state.call_id ?? \"\",\n\t\t\tnode_id: state.node_id ?? \"\"\n\t\t};\n\t\tawait this.executeMethod(target, \"call.member.remove\", {});\n\t}\n\t/** Ends the call for this participant. */\n\tasync end() {\n\t\tawait this.executeMethod(this.id, \"call.end\", {});\n\t}\n\t/**\n\t* Replaces custom metadata for this participant.\n\t* @param _meta - Metadata object to set.\n\t* @throws {UnimplementedError} Not yet implemented.\n\t*/\n\tasync setMeta(_meta) {\n\t\tthrow new UnimplementedError();\n\t}\n\t/**\n\t* Merges values into custom metadata (unlike {@link setMeta} which replaces).\n\t* @param _meta - Metadata to merge.\n\t* @throws {UnimplementedError} Not yet implemented.\n\t*/\n\tasync updateMeta(_meta) {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** Destroys the participant, releasing all subscriptions and references. */\n\tdestroy() {\n\t\tthis.executeMethod = void 0;\n\t\tsuper.destroy();\n\t}\n};\n/**\n* The local participant in a call, with additional device and media control.\n*\n* Extends {@link Participant} with screen sharing, device selection,\n* and local media stream management.\n*/\nvar SelfParticipant = class extends Participant {\n\t/** @internal */\n\tconstructor(id, executeMethod, vertoManager, deviceController) {\n\t\tsuper(id, executeMethod, deviceController);\n\t\tthis.vertoManager = vertoManager;\n\t\tthis._studioAudio$ = this.createBehaviorSubject(false);\n\t\tthis.capabilities = new SelfCapabilities();\n\t}\n\tdestroy() {\n\t\tthis.capabilities.destroy();\n\t\tsuper.destroy();\n\t}\n\t/** Observable indicating whether studio audio (raw/unprocessed audio) mode is enabled. */\n\tget studioAudio$() {\n\t\treturn this._studioAudio$.asObservable();\n\t}\n\t/** Whether studio audio (raw/unprocessed audio) mode is currently enabled. */\n\tget studioAudio() {\n\t\treturn this._studioAudio$.value;\n\t}\n\t/**\n\t* Enables studio audio mode by disabling all audio processing.\n\t* Sets echoCancellation, noiseSuppression, and autoGainControl to false.\n\t*/\n\tasync enableStudioAudio() {\n\t\tif (this._studioAudio$.value) return;\n\t\tthis._studioAudio$.next(true);\n\t\tawait this.executeMethod(this.id, \"call.audioflags.set\", {\n\t\t\techo_cancellation: false,\n\t\t\tauto_gain: false,\n\t\t\tnoise_suppression: false\n\t\t});\n\t}\n\t/**\n\t* Disables studio audio mode by restoring all audio processing to enabled.\n\t* Sets echoCancellation, noiseSuppression, and autoGainControl to true.\n\t*/\n\tasync disableStudioAudio() {\n\t\tif (!this._studioAudio$.value) return;\n\t\tthis._studioAudio$.next(false);\n\t\tawait this.executeMethod(this.id, \"call.audioflags.set\", {\n\t\t\techo_cancellation: true,\n\t\t\tauto_gain: true,\n\t\t\tnoise_suppression: true\n\t\t});\n\t}\n\t/**\n\t* Starts sharing the local screen.\n\t*\n\t* The call is unaffected when acquisition fails.\n\t*\n\t* @throws The raw `getDisplayMedia` error. A dismissed picker or a\n\t* permission denial rejects with a `NotAllowedError` `DOMException` —\n\t* inspect `error.name` to tell benign cancels apart from real failures.\n\t*/\n\tasync startScreenShare() {\n\t\ttry {\n\t\t\tawait this.vertoManager.addScreenMedia();\n\t\t} catch (error) {\n\t\t\tlogger$23.error(\"[Participant.startScreenShare] Screen share error:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/** Observable of the current screen share status. */\n\tget screenShareStatus$() {\n\t\treturn this.vertoManager.screenShareStatus$;\n\t}\n\t/** Current screen share status. */\n\tget screenShareStatus() {\n\t\treturn this.vertoManager.screenShareStatus;\n\t}\n\t/** Stops the current screen share. */\n\tasync stopScreenShare() {\n\t\treturn this.vertoManager.removeScreenMedia();\n\t}\n\t/**\n\t* Adds an additional media input device to the call.\n\t*\n\t* The call is unaffected when acquisition fails.\n\t*\n\t* @throws The raw `getUserMedia` error (e.g. `NotAllowedError` on\n\t* permission denial) — inspect `error.name` to decide how to react.\n\t*/\n\tasync addAdditionalDevice(options) {\n\t\ttry {\n\t\t\tawait this.vertoManager.addInputDevice(options);\n\t\t} catch (error) {\n\t\t\tlogger$23.error(\"[Participant.addAdditionalDevice] Additional device error:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/** Removes an additional media input device by ID. */\n\tasync removeAdditionalDevice(id) {\n\t\treturn this.vertoManager.removeInputDevices(id);\n\t}\n\t/** Adds or replaces the primary audio input device with optional constraints or stream. */\n\tasync addAudioInputDevice({ constraints, stream } = {}) {\n\t\tconst audio = constraints ?? stream ? void 0 : true;\n\t\treturn this.vertoManager.addMainInputDevices({\n\t\t\taudio,\n\t\t\tinputAudioDeviceConstraints: constraints,\n\t\t\tinputAudioStream: stream\n\t\t});\n\t}\n\t/** Adds or replaces the primary video input device with optional constraints or stream. */\n\tasync addVideoInputDevice({ constraints, stream } = {}) {\n\t\tconst video = constraints ?? stream ? void 0 : true;\n\t\treturn this.vertoManager.addMainInputDevices({\n\t\t\tvideo,\n\t\t\tinputVideoDeviceConstraints: constraints,\n\t\t\tinputVideoStream: stream\n\t\t});\n\t}\n\t/** Adds or replaces primary input devices (audio and/or video). */\n\tasync addInputDevices(options = {}) {\n\t\tawait this.vertoManager.addMainInputDevices(options);\n\t}\n\t/** Selects the audio input device for future calls. Optionally saves as a preference. */\n\tselectAudioInputDevice(device, options = {}) {\n\t\tthis.deviceController.selectAudioInputDevice(device);\n\t\tif (options.savePreference) PreferencesContainer.instance.preferredAudioInput = device;\n\t}\n\t/** Updates the audio input track constraints for the active call. */\n\tasync setAudioInputDeviceConstraints(constraints) {\n\t\tawait this.vertoManager.updateMediaConstraints({ audio: constraints });\n\t}\n\t/** Updates both audio and video input track constraints for the active call. */\n\tasync setInputDevicesConstraints(constraints) {\n\t\tawait this.vertoManager.updateMediaConstraints(constraints);\n\t}\n\t/** Selects the video input device for future calls. Optionally saves as a preference. */\n\tselectVideoInputDevice(device, options = {}) {\n\t\tthis.deviceController.selectVideoInputDevice(device);\n\t\tif (options.savePreference) PreferencesContainer.instance.preferredVideoInput = device;\n\t}\n\t/** Updates the video input track constraints for the active call. */\n\tasync setVideoInputDeviceConstraints(constraints) {\n\t\tawait this.vertoManager.updateMediaConstraints({ video: constraints });\n\t}\n\t/** Selects the audio output device. Optionally saves as a preference. */\n\tselectAudioOutputDevice(device, options = {}) {\n\t\tthis.deviceController.selectAudioOutputDevice(device);\n\t\tif (options.savePreference) PreferencesContainer.instance.preferredAudioOutput = device;\n\t}\n\t/**\n\t* Exits studio audio mode without restoring defaults.\n\t* Called internally before individual audio flag toggles.\n\t*/\n\texitStudioModeIfActive() {\n\t\tif (this._studioAudio$.value) {\n\t\t\tlogger$23.debug(\"[SelfParticipant] Exiting studio audio mode due to individual flag toggle\");\n\t\t\tthis._studioAudio$.next(false);\n\t\t}\n\t}\n\t/** Toggles echo cancellation. Exits studio mode if active. */\n\tasync toggleEchoCancellation() {\n\t\tthis.exitStudioModeIfActive();\n\t\tawait super.toggleEchoCancellation();\n\t}\n\t/** Toggles automatic gain control. Exits studio mode if active. */\n\tasync toggleAudioInputAutoGain() {\n\t\tthis.exitStudioModeIfActive();\n\t\tawait super.toggleAudioInputAutoGain();\n\t}\n\t/** Toggles noise suppression. Exits studio mode if active. */\n\tasync toggleNoiseSuppression() {\n\t\tthis.exitStudioModeIfActive();\n\t\tawait super.toggleNoiseSuppression();\n\t}\n\t/** Mutes local audio. Falls back to local device mute if the server RPC fails. */\n\tasync mute() {\n\t\ttry {\n\t\t\tawait super.mute();\n\t\t} catch (error) {\n\t\t\tlogger$23.warn(\"[Participant.toggleAudioInput] Server Error while muting audio input, proceeding with local toggle anyway\", error);\n\t\t} finally {\n\t\t\tthis.vertoManager.muteMainAudioInputDevice();\n\t\t}\n\t}\n\t/** Unmutes local audio. Falls back to local device unmute if the server RPC fails. */\n\tasync unmute() {\n\t\ttry {\n\t\t\tawait super.unmute();\n\t\t} catch (error) {\n\t\t\tlogger$23.warn(\"[Participant.toggleAudioInput] Server Error while unmuting audio input, proceeding with local toggle anyway\", error);\n\t\t} finally {\n\t\t\tawait this.vertoManager.unmuteMainAudioInputDevice();\n\t\t}\n\t}\n\t/** Mutes local video. Falls back to local device mute if the server RPC fails. */\n\tasync muteVideo() {\n\t\ttry {\n\t\t\tawait super.muteVideo();\n\t\t} catch (error) {\n\t\t\tlogger$23.warn(\"[Participant.toggleVideoInput] Server Error while muting video input, proceeding with local toggle anyway\", error);\n\t\t} finally {\n\t\t\tthis.vertoManager.muteMainVideoInputDevice();\n\t\t}\n\t}\n\t/** Unmutes local video. Falls back to local device unmute if the server RPC fails. */\n\tasync unmuteVideo() {\n\t\ttry {\n\t\t\tawait super.unmuteVideo();\n\t\t} catch (error) {\n\t\t\tlogger$23.warn(\"[Participant.toggleVideoInput] Server Error while unmuting video input, proceeding with local toggle anyway\", error);\n\t\t} finally {\n\t\t\tawait this.vertoManager.unmuteMainVideoInputDevice();\n\t\t}\n\t}\n};\n/** Type guard that checks if a participant is the local {@link SelfParticipant}. */\nconst isSelfParticipant = (participant) => {\n\treturn participant instanceof SelfParticipant;\n};\n\n//#endregion\n//#region src/core/RPCMessages/guards/base.guards.ts\nfunction isObject(value) {\n\treturn typeof value === \"object\" && value !== null;\n}\nfunction hasProperty(obj, key) {\n\treturn key in obj;\n}\nfunction isJSONRPCRequest(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"id\") && typeof value.id === \"string\" && hasProperty(value, \"method\") && typeof value.method === \"string\";\n}\nfunction isJSONRPCResponse(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"id\") && typeof value.id === \"string\" && (hasProperty(value, \"result\") || hasProperty(value, \"error\"));\n}\nfunction isJSONRPCErrorResponse(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"id\") && typeof value.id === \"string\" && (hasProperty(value, \"error\") && isObject(value.error) && hasProperty(value.error, \"code\") && hasProperty(value.error, \"message\") || hasProperty(value, \"result\") && isObject(value.result) && hasProperty(value.result, \"code\") && value.result.code !== \"200\" && hasProperty(value.result, \"message\"));\n}\n\n//#endregion\n//#region src/core/RPCMessages/guards/events.guards.ts\n/** @internal @packageDocumentation */\n/**\n* Factory function to create Request-level type guards.\n*/\nfunction createEventRequestGuard(eventType) {\n\treturn (value) => isSignalwireRequest(value) && value.params.event_type === eventType;\n}\n/**\n* Factory function to create Metadata-level type guards.\n*/\nfunction createEventMetadataGuard(eventType) {\n\treturn (value) => isSignalwireMetadata(value) && value.event_type === eventType;\n}\nfunction isSignalwireRequest(value) {\n\treturn isJSONRPCRequest(value) && value.method === \"signalwire.event\" && isObject(value.params) && hasProperty(value.params, \"event_type\");\n}\nconst isSignalwireAuthorizationStateRequest = createEventRequestGuard(\"signalwire.authorization.state\");\nconst isWebrtcMessageRequest = createEventRequestGuard(\"webrtc.message\");\nconst isCallJoinedRequest = createEventRequestGuard(\"call.joined\");\nconst isCallLeftRequest = createEventRequestGuard(\"call.left\");\nconst isCallUpdatedRequest = createEventRequestGuard(\"call.updated\");\nconst isCallStateRequest = createEventRequestGuard(\"call.state\");\nconst isCallPlayRequest = createEventRequestGuard(\"call.play\");\nconst isCallConnectRequest = createEventRequestGuard(\"call.connect\");\nconst isRoomUpdatedRequest = createEventRequestGuard(\"room.updated\");\nconst isMemberUpdatedRequest = createEventRequestGuard(\"member.updated\");\nconst isMemberJoinedRequest = createEventRequestGuard(\"member.joined\");\nconst isMemberLeftRequest = createEventRequestGuard(\"member.left\");\nconst isMemberTalkingRequest = createEventRequestGuard(\"member.talking\");\nconst isLayoutChangedRequest = createEventRequestGuard(\"layout.changed\");\nconst isConversationMessageRequest = createEventRequestGuard(\"conversation.message\");\nconst isConversationMessageUpdatedRequest = createEventRequestGuard(\"conversation.message.updated\");\nfunction isSignalwireMetadata(value) {\n\treturn isObject(value) && hasProperty(value, \"event_type\") && typeof value.event_type === \"string\" && hasProperty(value, \"params\");\n}\nfunction isSignalwireCallMetadata(value) {\n\treturn isSignalwireMetadata(value) && (isCallJoinedMetadata(value) || isCallLeftMetadata(value) || isCallUpdatedMetadata(value) || isCallStateMetadata(value) || isCallPlayMetadata(value) || isCallConnectMetadata(value) || isRoomUpdatedMetadata(value) || isMemberUpdatedMetadata(value) || isMemberJoinedMetadata(value) || isMemberLeftMetadata(value) || isMemberTalkingMetadata(value) || isLayoutChangedMetadata(value) || isWebrtcMessageMetadata(value) || isConversationMessageMetadata(value) || isConversationMessageUpdatedMetadata(value));\n}\nconst isSignalwireAuthorizationStateMetadata = createEventMetadataGuard(\"signalwire.authorization.state\");\nconst isWebrtcMessageMetadata = createEventMetadataGuard(\"webrtc.message\");\nconst isCallJoinedMetadata = createEventMetadataGuard(\"call.joined\");\nconst isCallLeftMetadata = createEventMetadataGuard(\"call.left\");\nconst isCallUpdatedMetadata = createEventMetadataGuard(\"call.updated\");\nconst isCallStateMetadata = createEventMetadataGuard(\"call.state\");\nconst isCallPlayMetadata = createEventMetadataGuard(\"call.play\");\nconst isCallConnectMetadata = createEventMetadataGuard(\"call.connect\");\nconst isRoomUpdatedMetadata = createEventMetadataGuard(\"room.updated\");\nconst isMemberUpdatedMetadata = createEventMetadataGuard(\"member.updated\");\nconst isMemberJoinedMetadata = createEventMetadataGuard(\"member.joined\");\nconst isMemberLeftMetadata = createEventMetadataGuard(\"member.left\");\nconst isMemberTalkingMetadata = createEventMetadataGuard(\"member.talking\");\nconst isLayoutChangedMetadata = createEventMetadataGuard(\"layout.changed\");\nconst isConversationMessageMetadata = createEventMetadataGuard(\"conversation.message\");\nconst isConversationMessageUpdatedMetadata = createEventMetadataGuard(\"conversation.message.updated\");\nfunction isCallJoinedPayload(value) {\n\treturn isObject(value) && hasProperty(value, \"room_session\") && hasProperty(value, \"call_id\") && hasProperty(value, \"member_id\") && hasProperty(value, \"capabilities\");\n}\nfunction isLayoutChangedPayload(value) {\n\treturn isObject(value) && hasProperty(value, \"room_id\") && hasProperty(value, \"room_session_id\") && hasProperty(value, \"layout\");\n}\n\n//#endregion\n//#region src/managers/CallEventsManager.ts\nconst logger$22 = getLogger();\nconst initialSessionState = {};\n/** @internal */\nvar CallEventsManager = class extends Destroyable {\n\tconstructor(webRtcCallSession, options = {}) {\n\t\tsuper();\n\t\tthis.webRtcCallSession = webRtcCallSession;\n\t\tthis.options = options;\n\t\tthis.callIds = /* @__PURE__ */ new Set();\n\t\tthis.roomSessionIds = /* @__PURE__ */ new Set();\n\t\tthis._participants$ = this.createBehaviorSubject({});\n\t\tthis._self$ = this.createBehaviorSubject(null);\n\t\tthis._sessionState$ = this.createBehaviorSubject(initialSessionState);\n\t\tthis.initSubscriptions();\n\t}\n\tget participants$() {\n\t\treturn this.cachedObservable(\"participants$\", () => this._participants$.asObservable().pipe(map((participantsRecord) => Object.values(participantsRecord))));\n\t}\n\tget participants() {\n\t\treturn Object.values(this._participants$.value);\n\t}\n\tget self$() {\n\t\treturn this.cachedObservable(\"self$\", () => this._self$.asObservable().pipe(filterNull()));\n\t}\n\tisRoomSessionIdValid(roomSessionId) {\n\t\treturn this.roomSessionIds.has(roomSessionId);\n\t}\n\taddCallId(callId) {\n\t\tthis.callIds.add(callId);\n\t}\n\tisCallIdValid(callId) {\n\t\treturn this.callIds.has(callId);\n\t}\n\tget recording$() {\n\t\treturn this.cachedObservable(\"recording$\", () => this._sessionState$.pipe(map((state) => state.recording), distinctUntilChanged(), filterNull()));\n\t}\n\tget recordings$() {\n\t\treturn this.cachedObservable(\"recordings$\", () => this._sessionState$.pipe(map((state) => state.recordings), distinctUntilChanged(), filterNull()));\n\t}\n\tget streaming$() {\n\t\treturn this.cachedObservable(\"streaming$\", () => this._sessionState$.pipe(map((state) => state.streaming), distinctUntilChanged(), filterNull()));\n\t}\n\tget streams$() {\n\t\treturn this.cachedObservable(\"streams$\", () => this._sessionState$.pipe(map((state) => state.streams), distinctUntilChanged(), filterNull()));\n\t}\n\tget playbacks$() {\n\t\treturn this.cachedObservable(\"playbacks$\", () => this._sessionState$.pipe(map((state) => state.playbacks), distinctUntilChanged(), filterNull()));\n\t}\n\tget raiseHandPriority$() {\n\t\treturn this.cachedObservable(\"raiseHandPriority$\", () => this._sessionState$.pipe(map((state) => state.prioritize_handraise), distinctUntilChanged(), filterNull()));\n\t}\n\tget locked$() {\n\t\treturn this.cachedObservable(\"locked$\", () => this._sessionState$.pipe(map((state) => state.locked), distinctUntilChanged(), filterNull()));\n\t}\n\tget meta$() {\n\t\treturn this.cachedObservable(\"meta$\", () => this._sessionState$.pipe(map((state) => state.meta), distinctUntilChanged(), filterNull()));\n\t}\n\tget capabilities$() {\n\t\treturn this.cachedObservable(\"capabilities$\", () => this._sessionState$.pipe(map((state) => state.capabilities), distinctUntilChanged(), filterNull()));\n\t}\n\tget layout$() {\n\t\treturn this.cachedObservable(\"layout$\", () => this._sessionState$.pipe(map((state) => state.layout_name), distinctUntilChanged(), filterNull()));\n\t}\n\tget layouts$() {\n\t\treturn this.cachedObservable(\"layouts$\", () => this._sessionState$.pipe(map((state) => state.layouts), distinctUntilChanged(), filterNull()));\n\t}\n\tget layoutLayers$() {\n\t\treturn this.cachedObservable(\"layoutLayers$\", () => this._sessionState$.pipe(map((state) => state.layout_layers), distinctUntilChanged(), filterNull()));\n\t}\n\tget self() {\n\t\treturn this._self$.value;\n\t}\n\tget layoutLayers() {\n\t\treturn this._sessionState$.value.layout_layers ?? [];\n\t}\n\tget recording() {\n\t\treturn this._sessionState$.value.recording ?? false;\n\t}\n\tget streaming() {\n\t\treturn this._sessionState$.value.streaming ?? false;\n\t}\n\tget raiseHandPriority() {\n\t\treturn this._sessionState$.value.prioritize_handraise ?? false;\n\t}\n\tget locked() {\n\t\treturn this._sessionState$.value.locked ?? false;\n\t}\n\tget meta() {\n\t\treturn this._sessionState$.value.meta ?? {};\n\t}\n\tget layout() {\n\t\treturn this._sessionState$.value.layout_name;\n\t}\n\tget layouts() {\n\t\treturn this._sessionState$.value.layouts ?? [];\n\t}\n\tget capabilities() {\n\t\treturn this._sessionState$.value.capabilities ?? [];\n\t}\n\tisSessionEvent(id) {\n\t\treturn this.callIds.has(id) || this.roomSessionIds.has(id);\n\t}\n\tinitSubscriptions() {\n\t\tthis.subscribeTo(this.callJoinedEvent$, (callJoinedEvent) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Handling call.joined event for call/session IDs:\", {\n\t\t\t\tcallId: callJoinedEvent.call_id,\n\t\t\t\troomSessionId: callJoinedEvent.room_session_id\n\t\t\t});\n\t\t\tconst sessionState = callJoinedEvent.room_session;\n\t\t\tconst capabilities = callJoinedEvent.capabilities;\n\t\t\tthis.selfId = this.selfId ?? callJoinedEvent.member_id;\n\t\t\tthis.originCallId = this.originCallId ?? callJoinedEvent.origin_call_id;\n\t\t\tthis.callIds.add(callJoinedEvent.call_id);\n\t\t\tthis.roomSessionIds.add(callJoinedEvent.room_session_id);\n\t\t\tthis._sessionState$.next({\n\t\t\t\t...this._sessionState$.value,\n\t\t\t\trecording: sessionState.recording,\n\t\t\t\trecordings: sessionState.recordings,\n\t\t\t\tstreaming: sessionState.streaming,\n\t\t\t\tstreams: sessionState.streams,\n\t\t\t\tplaybacks: sessionState.playbacks,\n\t\t\t\tprioritize_handraise: sessionState.prioritize_handraise,\n\t\t\t\tlocked: sessionState.locked,\n\t\t\t\tmeta: sessionState.meta,\n\t\t\t\tcapabilities\n\t\t\t});\n\t\t\tthis.updateParticipants(sessionState.members);\n\t\t\tthis._self$.value?.capabilities.updateFromRaw(capabilities);\n\t\t\tif (this._self$.value?.capabilities.setLayout) this.updateLayouts();\n\t\t});\n\t\tthis.subscribeTo(this.memberUpdates$, (member) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Handling member update event for member ID:\", member);\n\t\t\tthis.upsertParticipant(member);\n\t\t});\n\t\tthis.subscribeTo(this.webRtcCallSession.memberLeft$, (memberLeftEvent) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Handling member.left event for member ID:\", memberLeftEvent.member.member_id);\n\t\t\tconst participants = { ...this._participants$.value };\n\t\t\tif (memberLeftEvent.member.member_id in participants) {\n\t\t\t\tdelete participants[memberLeftEvent.member.member_id];\n\t\t\t\tthis._participants$.next(participants);\n\t\t\t} else logger$22.warn(`[CallEventsManager] Received member.left event for unknown member ID: ${memberLeftEvent.member.member_id}`);\n\t\t});\n\t\tthis.subscribeTo(this.webRtcCallSession.callUpdated$, (callUpdatedEvent) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Handling call.updated event:\", callUpdatedEvent);\n\t\t\tconst roomSession = callUpdatedEvent.room_session;\n\t\t\tthis._sessionState$.next({\n\t\t\t\t...this._sessionState$.value,\n\t\t\t\trecording: roomSession.recording,\n\t\t\t\trecordings: roomSession.recordings,\n\t\t\t\tstreaming: roomSession.streaming,\n\t\t\t\tstreams: roomSession.streams,\n\t\t\t\tplaybacks: roomSession.playbacks,\n\t\t\t\tprioritize_handraise: roomSession.prioritize_handraise,\n\t\t\t\tlocked: roomSession.locked,\n\t\t\t\tmeta: roomSession.meta\n\t\t\t});\n\t\t});\n\t\tthis.subscribeTo(this.layoutChangedEvent$, (layoutChangedEvent) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Handling layout.changed event:\", layoutChangedEvent);\n\t\t\tthis._sessionState$.next({\n\t\t\t\t...this._sessionState$.value,\n\t\t\t\tlayout_name: layoutChangedEvent.id,\n\t\t\t\tlayout_layers: layoutChangedEvent.layers\n\t\t\t});\n\t\t\tthis.updateParticipantPositions(layoutChangedEvent);\n\t\t});\n\t}\n\tupdateParticipantPositions(layoutChangedEvent) {\n\t\tif (Object.keys(this._participants$.value).length > 0 && !layoutChangedEvent.layers.some((layer) => !!layer.member_id)) logger$22.warn(\"[CallEventsManager] No layers with member_id found in layout.changed event. Nothing to update.\");\n\t\tlayoutChangedEvent.layers.filter((layer) => !!layer.member_id).filter((layer) => {\n\t\t\tif (!(layer.member_id in this._participants$.value)) {\n\t\t\t\tlogger$22.warn(`[CallEventsManager] Skipping layout layer for unknown member_id: ${layer.member_id}`);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}).map((layer) => {\n\t\t\tthis._participants$.value[layer.member_id].upnext({ position: layer });\n\t\t\treturn this._participants$.value[layer.member_id];\n\t\t}).forEach((participant) => {\n\t\t\tif (isSelfParticipant(participant)) this._self$.next(participant);\n\t\t\tthis._participants$.next({\n\t\t\t\t...this._participants$.value,\n\t\t\t\t[participant.id]: participant\n\t\t\t});\n\t\t});\n\t}\n\tupdateLayouts() {\n\t\tif (!this.selfId) return;\n\t\tthis.webRtcCallSession.executeMethod(this.selfId, \"call.layout.list\", {}).then((response) => {\n\t\t\tthis._sessionState$.next({\n\t\t\t\t...this._sessionState$.value,\n\t\t\t\tlayouts: response.result.layouts\n\t\t\t});\n\t\t}).catch((error) => {\n\t\t\tlogger$22.error(\"[CallEventsManager] Error fetching layouts:\", error);\n\t\t});\n\t}\n\tupdateParticipants(members) {\n\t\tmembers.forEach((member) => this.upsertParticipant(member));\n\t}\n\tupsertParticipant(member) {\n\t\tif (!(member.member_id in this._participants$.value)) {\n\t\t\tconst newParticipant = this.webRtcCallSession.createParticipant(member.member_id, this.selfId);\n\t\t\tthis._participants$.next({\n\t\t\t\t...this._participants$.value,\n\t\t\t\t[member.member_id]: newParticipant\n\t\t\t});\n\t\t}\n\t\tconst participant = this._participants$.value[member.member_id];\n\t\tconst oldValue = participant.value;\n\t\tlogger$22.debug(\"[CallEventsManager] Updating participant:\", member.member_id, {\n\t\t\toldValue,\n\t\t\tnewValue: member\n\t\t});\n\t\tparticipant.upnext({\n\t\t\t...oldValue,\n\t\t\t...member\n\t\t});\n\t\tif (isSelfParticipant(participant)) this._self$.next(participant);\n\t\tthis._participants$.next(this._participants$.value);\n\t}\n\tget callJoinedEvent$() {\n\t\treturn this.cachedObservable(\"callJoinedEvent$\", () => this.webRtcCallSession.callEvent$.pipe(filter(isCallJoinedPayload), tap((event) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Call joined event:\", event);\n\t\t})));\n\t}\n\tget layoutChangedEvent$() {\n\t\treturn this.cachedObservable(\"layoutChangedEvent$\", () => this.webRtcCallSession.callEvent$.pipe(filterAs(isLayoutChangedPayload, \"layout\"), tap((event) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Layout changed event:\", event);\n\t\t})));\n\t}\n\tget memberUpdates$() {\n\t\treturn this.cachedObservable(\"memberUpdates$\", () => merge(this.webRtcCallSession.memberJoined$, this.webRtcCallSession.memberUpdated$, this.webRtcCallSession.memberTalking$).pipe(map((event) => event.member), tap((event) => {\n\t\t\tlogger$22.debug(\"[CallEventsManager] Member update event:\", event);\n\t\t})));\n\t}\n\tdestroy() {\n\t\tObject.values(this._participants$.value).forEach((participant) => {\n\t\t\tparticipant.destroy();\n\t\t});\n\t\tthis._participants$.next({});\n\t\tthis._self$.next(null);\n\t\tthis.callIds.clear();\n\t\tthis.roomSessionIds.clear();\n\t\tthis.selfId = void 0;\n\t\tthis.originCallId = void 0;\n\t\tthis.webRtcCallSession = void 0;\n\t\tthis.callSession = void 0;\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/helpers/SDPHelper.ts\n/**\n* SDPHelper - Utility functions for SDP (Session Description Protocol) parsing and validation.\n*\n* This module provides helper functions to analyze and validate SDP content,\n* particularly for ICE candidate validation in WebRTC connections.\n*/\n/** Valid SDP direction attribute values. */\nconst SDP_DIRECTIONS = new Set([\n\t\"sendrecv\",\n\t\"sendonly\",\n\t\"recvonly\",\n\t\"inactive\"\n]);\n/**\n* Extracts the media directions (audio/video) from an SDP string.\n*\n* Parses each media section (`m=audio` / `m=video`) and reads the `a=` direction\n* attribute (`sendrecv`, `sendonly`, `recvonly`, `inactive`).\n* If no explicit direction attribute is found for a media section, defaults to `sendrecv`\n* per RFC 4566.\n*\n* @param sdp - The SDP string to parse\n* @returns The extracted audio and video directions\n*\n* @example\n* ```typescript\n* const sdp = `v=0\\r\\nm=audio 9 UDP/TLS/RTP/SAVPF 111\\r\\na=sendrecv\\r\\nm=video 9 UDP/TLS/RTP/SAVPF 96\\r\\na=recvonly`;\n* extractMediaDirectionsFromSDP(sdp);\n* // { audio: 'sendrecv', video: 'recvonly' }\n* ```\n*/\nfunction extractMediaDirectionsFromSDP(sdp) {\n\tconst result = {\n\t\taudio: \"inactive\",\n\t\tvideo: \"inactive\"\n\t};\n\tif (!sdp) return result;\n\tconst lines = sdp.split(/\\r?\\n/);\n\tlet currentMediaKind = null;\n\tlet currentDirection = null;\n\tfor (const line of lines) if (line.startsWith(\"m=\")) {\n\t\tif (currentMediaKind) result[currentMediaKind] = currentDirection ?? \"sendrecv\";\n\t\tif (line.startsWith(\"m=audio\")) currentMediaKind = \"audio\";\n\t\telse if (line.startsWith(\"m=video\")) currentMediaKind = \"video\";\n\t\telse currentMediaKind = null;\n\t\tcurrentDirection = null;\n\t} else if (currentMediaKind && line.startsWith(\"a=\")) {\n\t\tconst attr = line.substring(2).trim();\n\t\tif (SDP_DIRECTIONS.has(attr)) currentDirection = attr;\n\t}\n\tif (currentMediaKind) result[currentMediaKind] = currentDirection ?? \"sendrecv\";\n\treturn result;\n}\n/**\n* Validates that an SDP string has at least one non-host ICE candidate\n* for each media section (m= line).\n*\n* Non-host candidates (srflx, prflx, relay) indicate that the SDP has\n* gathered candidates that can be used for connectivity through NAT\n* traversal mechanisms.\n*\n* @param sdp - The SDP string to validate\n* @returns true if the SDP is valid (has non-host candidates for all media sections,\n*          or has no media sections), false otherwise\n*\n* @example\n* ```typescript\n* const sdp = `v=0\n* m=audio 9 UDP/TLS/RTP/SAVPF 111\n* a=candidate:1 1 UDP 1694498815 203.0.113.1 50001 typ srflx\n* m=video 9 UDP/TLS/RTP/SAVPF 96\n* a=candidate:2 1 UDP 1694498815 203.0.113.1 50002 typ relay`;\n*\n* isValidLocalDescription(sdp); // returns true\n* ```\n*/\nfunction isValidLocalDescription(sdp) {\n\tif (!sdp) return false;\n\tconst lines = sdp.split(\"\\r\\n\");\n\tconst mediaSectionsValidCandidates = [];\n\tlet currentSection = -1;\n\tfor (const line of lines) if (line.startsWith(\"m=\")) {\n\t\tcurrentSection += 1;\n\t\tmediaSectionsValidCandidates[currentSection] = 0;\n\t} else if (line.startsWith(\"a=candidate:\")) {\n\t\tconst typeMatch = /\\styp\\s+(host|srflx|prflx|relay)/.exec(line);\n\t\tif (typeMatch && typeMatch[1] !== \"host\") mediaSectionsValidCandidates[currentSection] += 1;\n\t}\n\treturn !mediaSectionsValidCandidates.length || mediaSectionsValidCandidates.every((count) => count > 0);\n}\n/**\n* Reorders codec payload types in an SDP m= line to match the preferred order.\n*\n* For each media section (`m=audio` / `m=video`), this function parses the\n* `a=rtpmap` lines to build a payload-type-to-codec-name map, then rewrites\n* the m= line so preferred codecs appear first.\n*\n* Codecs not in the preferred list retain their original relative order after\n* the preferred ones. Preferred codecs that do not appear in the SDP are ignored.\n*\n* @param sdp - The SDP string to modify\n* @param preferredVideo - Preferred video codec names in priority order (e.g., ['VP9', 'VP8'])\n* @param preferredAudio - Preferred audio codec names in priority order (e.g., ['opus'])\n* @returns The modified SDP string with reordered codec payload types\n*\n* @example\n* ```typescript\n* const reordered = reorderCodecs(sdp, ['VP9', 'H264'], ['opus']);\n* ```\n*/\nfunction reorderCodecs(sdp, preferredVideo = [], preferredAudio = []) {\n\tif (!sdp || preferredVideo.length === 0 && preferredAudio.length === 0) return sdp;\n\tconst sections = splitIntoMediaSections(sdp);\n\tconst result = [sections[0]];\n\tfor (let i = 1; i < sections.length; i++) {\n\t\tconst section = sections[i];\n\t\tconst mLine = section.split(/\\r?\\n/)[0];\n\t\tif (mLine.startsWith(\"m=video\") && preferredVideo.length > 0) result.push(reorderSectionCodecs(section, preferredVideo));\n\t\telse if (mLine.startsWith(\"m=audio\") && preferredAudio.length > 0) result.push(reorderSectionCodecs(section, preferredAudio));\n\t\telse result.push(section);\n\t}\n\treturn result.join(\"\");\n}\n/**\n* Adds stereo=1 and sprop-stereo=1 to the Opus fmtp line in the SDP.\n*\n* This enables stereo Opus negotiation for music/podcast use cases.\n* Also sets maxaveragebitrate to accommodate stereo audio (default: 510000 bps).\n*\n* @param sdp - The SDP string to modify\n* @param maxBitrate - Maximum average bitrate in bps (default: 510000)\n* @returns The modified SDP string with stereo Opus parameters\n*\n* @example\n* ```typescript\n* const stereoSdp = enableStereoOpus(sdp);\n* // a=fmtp:111 minptime=10;useinbandfec=1;stereo=1;sprop-stereo=1;maxaveragebitrate=510000\n* ```\n*/\nfunction enableStereoOpus(sdp, maxBitrate = DEFAULT_STEREO_MAX_AVERAGE_BITRATE) {\n\tif (!sdp) return sdp;\n\tconst opusPayloadType = findOpusPayloadType(sdp);\n\tif (opusPayloadType === null) return sdp;\n\tconst lines = sdp.split(/\\r?\\n/);\n\tconst updatedLines = [];\n\tconst fmtpPrefix = `a=fmtp:${opusPayloadType} `;\n\tlet foundFmtp = false;\n\tfor (const line of lines) if (line.startsWith(fmtpPrefix)) {\n\t\tfoundFmtp = true;\n\t\tupdatedLines.push(appendStereoParams(line, maxBitrate));\n\t} else updatedLines.push(line);\n\tif (!foundFmtp) {\n\t\tconst rtpmapLine = `a=rtpmap:${opusPayloadType} `;\n\t\tconst withFmtp = [];\n\t\tfor (const line of updatedLines) {\n\t\t\twithFmtp.push(line);\n\t\t\tif (line.startsWith(rtpmapLine)) withFmtp.push(`a=fmtp:${opusPayloadType} stereo=1;sprop-stereo=1;maxaveragebitrate=${maxBitrate}`);\n\t\t}\n\t\treturn withFmtp.join(\"\\r\\n\");\n\t}\n\treturn updatedLines.join(\"\\r\\n\");\n}\n/**\n* Convenience wrapper that applies both codec reordering and stereo Opus.\n*\n* @param sdp - The SDP string to modify\n* @param audioCodecs - Preferred audio codecs in priority order\n* @param videoCodecs - Preferred video codecs in priority order\n* @returns The modified SDP string\n*/\nfunction setCodecPreferences(sdp, audioCodecs = [], videoCodecs = []) {\n\treturn reorderCodecs(sdp, videoCodecs, audioCodecs);\n}\n/**\n* Splits an SDP string into session-level + per-media sections.\n*\n* The first element is the session-level content (before the first m= line).\n* Subsequent elements each start with an m= line.\n*/\nfunction splitIntoMediaSections(sdp) {\n\treturn sdp.split(/(?=m=)/);\n}\n/**\n* Reorders codecs within a single media section based on preferred names.\n*/\nfunction reorderSectionCodecs(section, preferredNames) {\n\tconst lines = section.split(/\\r?\\n/);\n\tconst mLineParts = lines[0].split(\" \");\n\tif (mLineParts.length < 4) return section;\n\tconst payloadTypes = mLineParts.slice(3);\n\tconst ptToCodec = /* @__PURE__ */ new Map();\n\tfor (const line of lines) {\n\t\tconst match = /^a=rtpmap:(\\d+)\\s+([^\\s/]+)/.exec(line);\n\t\tif (match) ptToCodec.set(match[1], match[2]);\n\t}\n\tconst preferredNamesUpper = preferredNames.map((n) => n.toUpperCase());\n\tconst preferred = [];\n\tconst remaining = [];\n\tfor (const pt of payloadTypes) {\n\t\tconst codecName = ptToCodec.get(pt)?.toUpperCase() ?? \"\";\n\t\tif (preferredNamesUpper.indexOf(codecName) >= 0) preferred.push(pt);\n\t\telse remaining.push(pt);\n\t}\n\tpreferred.sort((a, b) => {\n\t\tconst nameA = ptToCodec.get(a)?.toUpperCase() ?? \"\";\n\t\tconst nameB = ptToCodec.get(b)?.toUpperCase() ?? \"\";\n\t\treturn preferredNamesUpper.indexOf(nameA) - preferredNamesUpper.indexOf(nameB);\n\t});\n\tconst reorderedPTs = [...preferred, ...remaining];\n\treturn [[...mLineParts.slice(0, 3), ...reorderedPTs].join(\" \"), ...lines.slice(1)].join(\"\\r\\n\");\n}\n/**\n* Finds the Opus payload type number from a=rtpmap lines in the SDP.\n*\n* @returns The payload type number as a string, or null if Opus is not found\n*/\nfunction findOpusPayloadType(sdp) {\n\tconst match = /a=rtpmap:(\\d+)\\s+opus\\/48000/i.exec(sdp);\n\treturn match ? match[1] : null;\n}\n/**\n* Appends stereo and bitrate parameters to an existing Opus fmtp line.\n*\n* Avoids duplicating parameters if they already exist.\n*/\nfunction appendStereoParams(fmtpLine, maxBitrate) {\n\tlet result = fmtpLine;\n\tif (!result.includes(\"stereo=\")) result += \";stereo=1\";\n\tif (!result.includes(\"sprop-stereo=\")) result += \";sprop-stereo=1\";\n\tif (!result.includes(\"maxaveragebitrate=\")) result += `;maxaveragebitrate=${maxBitrate}`;\n\treturn result;\n}\n\n//#endregion\n//#region src/controllers/ICEGatheringController.ts\nconst logger$21 = getLogger();\nvar ICEGatheringController = class extends Destroyable {\n\tconstructor(peerConnection, peerConnectionControllerNegotiating$, options = {}) {\n\t\tsuper();\n\t\tthis.peerConnection = peerConnection;\n\t\tthis.peerConnectionControllerNegotiating$ = peerConnectionControllerNegotiating$;\n\t\tthis.onicegatheringstatechangeHandler = () => {\n\t\t\tconst { iceGatheringState } = this.peerConnection;\n\t\t\tlogger$21.debug(`[ICEGatheringController] ICE gathering state changed to: ${iceGatheringState}`);\n\t\t\tif (iceGatheringState === \"gathering\") this._iceCandidatesState.next({\n\t\t\t\tstate: \"gathering\",\n\t\t\t\tvalidSDP: false\n\t\t\t});\n\t\t};\n\t\tthis.onicecandidateHandler = (event) => {\n\t\t\tlogger$21.debug(\"[ICEGatheringController] ICE candidate event received:\", event.candidate);\n\t\t\tthis.removeTimer(\"iceCandidateTimer\");\n\t\t\tif (event.candidate) this.iceCandidateTimer = setTimeout(() => {\n\t\t\t\tif (this.peerConnection.iceGatheringState !== \"complete\") {\n\t\t\t\t\tlogger$21.warn(\"[ICEGatheringController] ICE candidate timeout, using current SDP\");\n\t\t\t\t\tthis.handleICECandidateTimeout();\n\t\t\t\t}\n\t\t\t}, this.iceCandidateTimeout);\n\t\t\telse {\n\t\t\t\tlogger$21.debug(\"[ICEGatheringController] ICE gathering completed: null candidate received\");\n\t\t\t\tthis.removeTimer(\"iceGatheringTimer\");\n\t\t\t\tthis.handleICEGatheringComplete();\n\t\t\t}\n\t\t};\n\t\tthis._iceCandidatesState = this.createBehaviorSubject({\n\t\t\tstate: \"new\",\n\t\t\tvalidSDP: false\n\t\t});\n\t\tthis.iceCandidateTimeout = options.iceCandidateTimeout ?? DEFAULT_ICE_CANDIDATE_TIMEOUT_MS;\n\t\tthis.iceGatheringTimeout = options.iceGatheringTimeout ?? DEFAULT_ICE_GATHERING_TIMEOUT_MS;\n\t\tthis.relayOnly = options.relayOnly ?? false;\n\t\tthis.setupEventListeners();\n\t\tthis.subscribeTo(this.peerConnectionControllerNegotiating$.pipe(filter((isNegotiating) => isNegotiating)), (isNegotiating) => {\n\t\t\tif (isNegotiating) {\n\t\t\t\tthis.setupEventListeners();\n\t\t\t\tthis.iceGatheringTimer = setTimeout(() => {\n\t\t\t\t\tif (this.peerConnection.iceGatheringState !== \"complete\") {\n\t\t\t\t\t\tlogger$21.warn(\"[ICEGatheringController] ICE gathering timeout, using current SDP\");\n\t\t\t\t\t\tthis.handleICEGatheringTimeout();\n\t\t\t\t\t}\n\t\t\t\t}, this.iceGatheringTimeout);\n\t\t\t}\n\t\t});\n\t}\n\tsetupEventListeners() {\n\t\tthis.peerConnection.removeEventListener(\"icecandidate\", this.onicecandidateHandler);\n\t\tthis.peerConnection.addEventListener(\"icecandidate\", this.onicecandidateHandler);\n\t\tthis.peerConnection.removeEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\tthis.peerConnection.addEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t}\n\tget iceCandidatesState$() {\n\t\treturn this._iceCandidatesState.pipe(withLatestFrom(this.peerConnectionControllerNegotiating$), filter(([_, isNegotiating]) => isNegotiating), map(([state, _]) => state.state));\n\t}\n\tget hasValidLocalDescriptionSDP() {\n\t\tconst sdp = this.peerConnection.localDescription?.sdp;\n\t\treturn isValidLocalDescription(sdp ?? \"\");\n\t}\n\tget isRelayOnly() {\n\t\treturn this.relayOnly;\n\t}\n\tsetRelayOnly(value) {\n\t\tthis.relayOnly = value;\n\t}\n\thandleICEGatheringComplete() {\n\t\tlogger$21.debug(\"[ICEGatheringController] Handling ICE gathering complete\");\n\t\tlogger$21.debug(`[ICEGatheringController] Checking ICE gathering state: ${this.peerConnection.iceGatheringState}`);\n\t\tlogger$21.debug(\"[ICEGatheringController] ICE gathering complete\");\n\t\tthis._iceCandidatesState.next({\n\t\t\tstate: \"complete\",\n\t\t\tvalidSDP: this.hasValidLocalDescriptionSDP\n\t\t});\n\t\tthis.stopGathering();\n\t}\n\tstopGathering() {\n\t\tthis.peerConnection.removeEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\tthis.peerConnection.removeEventListener(\"icecandidate\", this.onicecandidateHandler);\n\t\tthis.clearAllTimers();\n\t}\n\thandleICEGatheringTimeout() {\n\t\tthis.removeTimer(\"iceGatheringTimer\");\n\t\tconst validSDP = this.hasValidLocalDescriptionSDP;\n\t\tif (validSDP) {\n\t\t\tlogger$21.debug(\"[ICEGatheringController] Local SDP is valid\");\n\t\t\tthis._iceCandidatesState.next({\n\t\t\t\tstate: \"timeout\",\n\t\t\t\tvalidSDP\n\t\t\t});\n\t\t\tthis.stopGathering();\n\t\t} else logger$21.debug(\"### ICE gathering timeout\\n\", this.peerConnection.localDescription?.sdp);\n\t}\n\thandleICECandidateTimeout() {\n\t\tif (this.iceCandidateTimer) this.removeTimer(\"iceCandidateTimer\");\n\t\tlogger$21.warn(\"[ICEGatheringController] ICE candidate timeout\");\n\t\tconst validSDP = this.hasValidLocalDescriptionSDP;\n\t\tif (!validSDP && !this.relayOnly) this.restartICEGatheringWithRelayOnly();\n\t\telse {\n\t\t\tlogger$21.debug(\"[ICEGatheringController] Using current SDP due to ICE candidate timeout\");\n\t\t\tthis._iceCandidatesState.next({\n\t\t\t\tstate: \"timeout\",\n\t\t\t\tvalidSDP\n\t\t\t});\n\t\t\tthis.stopGathering();\n\t\t}\n\t}\n\trestartICEGatheringWithRelayOnly() {\n\t\tlogger$21.debug(\"[ICEGatheringController] Restarting ICE gathering with relay-only candidates\");\n\t\tthis.relayOnly = true;\n\t\tthis.peerConnection.setConfiguration({\n\t\t\t...this.peerConnection.getConfiguration(),\n\t\t\ticeTransportPolicy: \"relay\"\n\t\t});\n\t\tthis.peerConnection.restartIce();\n\t}\n\tremoveTimer(timer$1) {\n\t\tif (this[timer$1]) {\n\t\t\tclearTimeout(this[timer$1]);\n\t\t\tthis[timer$1] = void 0;\n\t\t}\n\t}\n\tclearAllTimers() {\n\t\tlogger$21.debug(\"[ICEGatheringController] Clearing all timers\");\n\t\tthis.removeTimer(\"iceGatheringTimer\");\n\t\tthis.removeTimer(\"iceCandidateTimer\");\n\t}\n\tremoveEventListeners() {\n\t\tthis.peerConnection.removeEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\tthis.peerConnection.removeEventListener(\"icecandidate\", this.onicecandidateHandler);\n\t}\n\tdestroy() {\n\t\tlogger$21.debug(\"[ICEGatheringController] Destroying ICEGatheringController\");\n\t\tthis.clearAllTimers();\n\t\tthis.removeEventListeners();\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/controllers/LocalAudioPipeline.ts\nconst logger$20 = getLogger();\n/**\n* Web Audio pipeline for the local microphone stream.\n*\n* Wraps the raw mic `MediaStreamTrack` in a graph of:\n*\n* ```\n*   MediaStreamAudioSourceNode  →  GainNode  →  AnalyserNode  →  MediaStreamAudioDestinationNode\n* ```\n*\n* The {@link outputTrack} from the destination node is what callers should\n* attach to the `RTCRtpSender` in place of the raw mic track. The same\n* destination track is reused across input changes (device switch, mute /\n* unmute track replacement) so the sender reference stays stable — only the\n* source end of the graph is rebuilt.\n*\n* The pipeline owns a single {@link AudioContext}. Callers must invoke\n* {@link destroy} to release it when the call ends.\n*/\nvar LocalAudioPipeline = class extends Destroyable {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\tthis._inputSource = null;\n\t\tthis._inputStream = null;\n\t\tthis._lastSpokeAt = 0;\n\t\tthis._gain$ = this.createBehaviorSubject(1);\n\t\tthis._pttMultiplier = 1;\n\t\tthis._audioContext = (options.audioContextFactory ?? (() => new AudioContext()))();\n\t\tthis._gainNode = this._audioContext.createGain();\n\t\tthis._analyser = this._audioContext.createAnalyser();\n\t\tthis._analyser.fftSize = 2048;\n\t\tthis._analyser.smoothingTimeConstant = .3;\n\t\tthis._analyserBuffer = new Uint8Array(new ArrayBuffer(this._analyser.fftSize));\n\t\tthis._destination = this._audioContext.createMediaStreamDestination();\n\t\tthis._gainNode.connect(this._analyser);\n\t\tthis._analyser.connect(this._destination);\n\t\tthis._speakingThreshold = options.speakingThreshold ?? VAD_THRESHOLD;\n\t\tthis._speakingHoldMs = options.speakingHoldMs ?? VAD_HOLD_MS;\n\t\tthis._pollIntervalMs = options.pollIntervalMs ?? AUDIO_LEVEL_POLL_INTERVAL_MS;\n\t\tconst initial = options.initialGain ?? 1;\n\t\tthis._gain$.next(initial);\n\t\tthis.applyEffectiveGain();\n\t}\n\t/** Observable of the current gain value (0..2). */\n\tget gain$() {\n\t\treturn this._gain$.asObservable();\n\t}\n\t/** Current gain value (0..2). */\n\tget gain() {\n\t\treturn this._gain$.value;\n\t}\n\t/**\n\t* Processed output track to attach to the RTCRtpSender. Stable reference\n\t* across input changes, so `sender.replaceTrack(pipeline.outputTrack)` only\n\t* needs to be called once.\n\t*/\n\tget outputTrack() {\n\t\tconst [track] = this._destination.stream.getAudioTracks();\n\t\treturn track;\n\t}\n\t/**\n\t* Root-mean-square audio level of the input signal, 0..1. Emits on a fixed\n\t* interval (~30fps by default).\n\t*/\n\tget level$() {\n\t\treturn this.deferEmission(interval(this._pollIntervalMs, animationFrameScheduler).pipe(map(() => this.computeLevel())));\n\t}\n\t/**\n\t* Boolean VAD derived from {@link level$}. True while level ≥ threshold or\n\t* during the hold window after the last frame that crossed the threshold.\n\t*/\n\tget speaking$() {\n\t\treturn this.deferEmission(this.level$.pipe(map((level) => this.evaluateSpeaking(level)), distinctUntilChanged()));\n\t}\n\t/**\n\t* Set gain multiplier applied to the input signal. 0 = silence,\n\t* 1 = unity, 2 = 2x. Values are clamped to [0, 2]. The effective gain on\n\t* the graph also respects the current PTT state.\n\t*/\n\tsetGain(value) {\n\t\tconst clamped = Math.max(0, Math.min(2, value));\n\t\tthis._gain$.next(clamped);\n\t\tthis.applyEffectiveGain();\n\t}\n\t/**\n\t* Silence the graph when `active = false`, otherwise restore the configured\n\t* gain. Use this from a PTT handler: released → `false`, held → `true`.\n\t* Orthogonal to {@link setGain} — once PTT returns to active, the last\n\t* configured gain reappears.\n\t*/\n\tsetPTTActive(active) {\n\t\tthis._pttMultiplier = active ? 1 : 0;\n\t\tthis.applyEffectiveGain();\n\t}\n\tapplyEffectiveGain() {\n\t\tthis._gainNode.gain.value = this._gain$.value * this._pttMultiplier;\n\t}\n\t/**\n\t* Wire a new raw mic track as the pipeline's input. Replaces any previous\n\t* input source and reconnects the graph so {@link outputTrack} continues\n\t* to emit the processed audio. Pass `null` to disconnect the input (the\n\t* output track stays alive but emits silence).\n\t*\n\t* Also resumes the underlying AudioContext on attach — Chrome creates it\n\t* in a suspended state and the graph won't process (the destination\n\t* track emits silence) until resume() succeeds.\n\t*/\n\tsetInputTrack(track) {\n\t\tif (this._inputSource) {\n\t\t\ttry {\n\t\t\t\tthis._inputSource.disconnect();\n\t\t\t} catch (error) {\n\t\t\t\tlogger$20.debug(\"[LocalAudioPipeline] input disconnect warning:\", error);\n\t\t\t}\n\t\t\tthis._inputSource = null;\n\t\t}\n\t\tif (this._inputStream) this._inputStream = null;\n\t\tif (!track) return;\n\t\tthis._inputStream = new MediaStream([track]);\n\t\tthis._inputSource = this._audioContext.createMediaStreamSource(this._inputStream);\n\t\tthis._inputSource.connect(this._gainNode);\n\t\tif (this._audioContext.state === \"suspended\") this._audioContext.resume().catch((error) => {\n\t\t\tlogger$20.warn(\"[LocalAudioPipeline] AudioContext resume failed:\", error);\n\t\t});\n\t}\n\tdestroy() {\n\t\tif (this._inputSource) {\n\t\t\ttry {\n\t\t\t\tthis._inputSource.disconnect();\n\t\t\t} catch {}\n\t\t\tthis._inputSource = null;\n\t\t}\n\t\ttry {\n\t\t\tthis._gainNode.disconnect();\n\t\t\tthis._analyser.disconnect();\n\t\t} catch {}\n\t\tthis._audioContext.close().catch((error) => {\n\t\t\tlogger$20.debug(\"[LocalAudioPipeline] audio context close warning:\", error);\n\t\t});\n\t\tsuper.destroy();\n\t}\n\tcomputeLevel() {\n\t\tif (!this._inputSource) return 0;\n\t\tthis._analyser.getByteTimeDomainData(this._analyserBuffer);\n\t\tlet sum = 0;\n\t\tfor (const sample of this._analyserBuffer) {\n\t\t\tconst normalized = (sample - 128) / 128;\n\t\t\tsum += normalized * normalized;\n\t\t}\n\t\treturn Math.sqrt(sum / this._analyserBuffer.length);\n\t}\n\tevaluateSpeaking(level) {\n\t\tconst now = Date.now();\n\t\tif (level >= this._speakingThreshold) {\n\t\t\tthis._lastSpokeAt = now;\n\t\t\treturn true;\n\t\t}\n\t\treturn now - this._lastSpokeAt < this._speakingHoldMs;\n\t}\n};\n\n//#endregion\n//#region src/controllers/LocalStreamController.ts\nconst logger$19 = getLogger();\nvar LocalStreamController = class extends Destroyable {\n\tconstructor(options) {\n\t\tsuper();\n\t\tthis.options = options;\n\t\tthis.mediaTrackEndedHandler = (event) => {\n\t\t\tthis._mediaTrackEnded$.next(event);\n\t\t};\n\t\tthis._localStream$ = this.createBehaviorSubject(null);\n\t\tthis._localAudioTracks$ = this.createBehaviorSubject([]);\n\t\tthis._localVideoTracks$ = this.createBehaviorSubject([]);\n\t\tthis._mediaTrackEnded$ = this.createSubject();\n\t}\n\tget localStream$() {\n\t\treturn this._localStream$.asObservable().pipe(takeUntil(this.destroyed$));\n\t}\n\tget localAudioTracks$() {\n\t\treturn this._localAudioTracks$.asObservable().pipe(takeUntil(this.destroyed$));\n\t}\n\tget localVideoTracks$() {\n\t\treturn this._localVideoTracks$.asObservable().pipe(takeUntil(this.destroyed$));\n\t}\n\tget mediaTrackEnded$() {\n\t\treturn this._mediaTrackEnded$.asObservable().pipe(takeUntil(this.destroyed$));\n\t}\n\tget localStream() {\n\t\treturn this._localStream$.value;\n\t}\n\tget localAudioTracks() {\n\t\treturn this._localAudioTracks$.value;\n\t}\n\tget localVideoTracks() {\n\t\treturn this._localVideoTracks$.value;\n\t}\n\t/**\n\t* Build the local media stream based on the provided options.\n\t*/\n\tasync buildLocalStream() {\n\t\tlogger$19.debug(\"[LocalStreamController] Building local media stream.\");\n\t\tlet stream;\n\t\tif (this.options.inputAudioStream ?? this.options.inputVideoStream) {\n\t\t\tconst tracks = [...this.options.inputAudioStream?.getTracks() ?? [], ...this.options.inputVideoStream?.getTracks() ?? []];\n\t\t\tstream = new MediaStream(tracks);\n\t\t} else if (this.options.propose === \"screenshare\") {\n\t\t\tlogger$19.debug(\"[LocalStreamController] Requesting display media for screen sharing with audio:\", Boolean(this.options.inputAudioDeviceConstraints));\n\t\t\tstream = await this.options.getDisplayMedia({\n\t\t\t\tvideo: true,\n\t\t\t\taudio: Boolean(this.options.inputAudioDeviceConstraints)\n\t\t\t});\n\t\t\tlogger$19.debug(\"[LocalStreamController] Screen share media obtained:\", stream);\n\t\t} else {\n\t\t\tconst constraints = {\n\t\t\t\taudio: this.options.inputAudioDeviceConstraints,\n\t\t\t\tvideo: this.options.inputVideoDeviceConstraints\n\t\t\t};\n\t\t\tlogger$19.debug(\"[LocalStreamController] Requesting user media with constraints:\", constraints);\n\t\t\tstream = await this.options.getUserMedia(constraints);\n\t\t\tlogger$19.debug(\"[LocalStreamController] User media obtained:\", stream);\n\t\t}\n\t\tthis._localStream$.next(stream);\n\t\tthis._localAudioTracks$.next(stream.getAudioTracks());\n\t\tthis._localVideoTracks$.next(stream.getVideoTracks());\n\t\treturn stream;\n\t}\n\t/**\n\t* Add a local media track to the local stream.\n\t* @param track - The MediaStreamTrack to add\n\t* @returns The MediaStream (either existing or newly created)\n\t*/\n\taddTrack(track) {\n\t\tconst localStream = this._localStream$.value ?? new MediaStream();\n\t\ttrack.addEventListener(\"ended\", this.mediaTrackEndedHandler);\n\t\tlocalStream.addTrack(track);\n\t\tthis._localStream$.next(localStream);\n\t\tif (track.kind === \"video\") this._localVideoTracks$.next(localStream.getVideoTracks());\n\t\telse this._localAudioTracks$.next(localStream.getAudioTracks());\n\t\tlogger$19.debug(`[LocalStreamController] ${track.kind} track added:`, track.id);\n\t\treturn localStream;\n\t}\n\t/**\n\t* Remove a local media track from the local stream.\n\t* @param trackId - The ID of the track to remove\n\t* @returns The removed track, or undefined if not found\n\t*/\n\tremoveTrack(trackId) {\n\t\tconst stream = this._localStream$.value;\n\t\tconst track = stream?.getTracks().find((t) => t.id === trackId);\n\t\tif (!track) {\n\t\t\tlogger$19.debug(`[LocalStreamController] track not found: ${trackId}`);\n\t\t\treturn;\n\t\t}\n\t\ttrack.removeEventListener(\"ended\", this.mediaTrackEndedHandler);\n\t\tstream?.removeTrack(track);\n\t\ttrack.stop();\n\t\tthis._localStream$.next(stream);\n\t\tif (track.kind === \"video\") this._localVideoTracks$.next(stream?.getVideoTracks() ?? []);\n\t\telse this._localAudioTracks$.next(stream?.getAudioTracks() ?? []);\n\t\tlogger$19.debug(`[LocalStreamController] ${track.kind} track removed:`, trackId);\n\t\treturn track;\n\t}\n\t/**\n\t* Get or create a local stream.\n\t*/\n\tgetOrCreateLocalStream() {\n\t\treturn this._localStream$.value ?? new MediaStream();\n\t}\n\t/**\n\t* Set the local stream directly.\n\t*/\n\tsetLocalStream(stream) {\n\t\tthis._localStream$.next(stream);\n\t}\n\t/**\n\t* Add a track ended event listener to a track.\n\t*/\n\taddTrackEndedListener(track) {\n\t\ttrack.addEventListener(\"ended\", this.mediaTrackEndedHandler);\n\t}\n\t/**\n\t* Update the controller options (e.g., when media overrides are applied).\n\t*/\n\tupdateOptions(options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t}\n\t/**\n\t* Stop all local tracks and clean up.\n\t*/\n\tstopAllTracks() {\n\t\tthis._localStream$.value?.getTracks().forEach((track) => {\n\t\t\tlogger$19.debug(`[LocalStreamController] Stopping local track: ${track.kind}`);\n\t\t\ttrack.removeEventListener(\"ended\", this.mediaTrackEndedHandler);\n\t\t\ttrack.stop();\n\t\t});\n\t}\n\t/**\n\t* Clean up resources.\n\t*/\n\tdestroy() {\n\t\tthis.stopAllTracks();\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/controllers/TransceiverController.ts\nconst logger$18 = getLogger();\nconst getDirection = (send, recv) => {\n\tif (send && recv) return \"sendrecv\";\n\telse if (send && !recv) return \"sendonly\";\n\telse if (!send && recv) return \"recvonly\";\n\treturn \"inactive\";\n};\nvar TransceiverController = class extends Destroyable {\n\tconstructor(options) {\n\t\tsuper();\n\t\tthis.peerConnection = options.peerConnection;\n\t\tthis.options = options;\n\t}\n\tget useAddTransceivers() {\n\t\treturn typeof this.peerConnection.addTransceiver === \"function\";\n\t}\n\tget useAddTrack() {\n\t\treturn typeof this.peerConnection.addTrack === \"function\";\n\t}\n\tget useAddStream() {\n\t\treturn typeof this.peerConnection.addStream === \"function\" && !this.useAddTransceivers && !this.useAddTrack;\n\t}\n\tget propose() {\n\t\treturn this.options.propose;\n\t}\n\tget isAdditionalDevice() {\n\t\treturn this.propose === \"additional-device\";\n\t}\n\tget isScreenShare() {\n\t\treturn this.propose === \"screenshare\";\n\t}\n\tget isSimulcast() {\n\t\treturn Boolean(this.options.simulcast);\n\t}\n\tget isSFU() {\n\t\treturn Boolean(this.options.sfu);\n\t}\n\tget receiveVideo() {\n\t\treturn Boolean(this.options.receiveVideo);\n\t}\n\tget receiveAudio() {\n\t\treturn Boolean(this.options.receiveAudio);\n\t}\n\tget localStream() {\n\t\treturn this.options.localStreamController.localStream;\n\t}\n\tget inputAudioDeviceConstraints() {\n\t\treturn this.options.getInputAudioDeviceConstraints();\n\t}\n\tget inputVideoDeviceConstraints() {\n\t\treturn this.options.getInputVideoDeviceConstraints();\n\t}\n\tget audioDirection() {\n\t\tif (this.isAdditionalDevice) return \"sendonly\";\n\t\tconst { localStream } = this;\n\t\tconst hasAudioTrack = localStream?.getAudioTracks().some((track) => track.enabled);\n\t\tconst wantsToSendAudio = Boolean(this.inputAudioDeviceConstraints);\n\t\tconst wantsToReceiveAudio = Boolean(this.receiveAudio);\n\t\treturn getDirection(hasAudioTrack || wantsToSendAudio, wantsToReceiveAudio);\n\t}\n\tget videoDirection() {\n\t\tif (this.isAdditionalDevice || this.isScreenShare) return \"sendonly\";\n\t\tif (this.isSFU) return \"recvonly\";\n\t\tconst { localStream } = this;\n\t\tconst hasVideoTrack = localStream?.getVideoTracks().some((track) => track.enabled);\n\t\tconst wantsToSendVideo = Boolean(this.inputVideoDeviceConstraints);\n\t\tconst wantsToReceiveVideo = Boolean(this.receiveVideo);\n\t\treturn getDirection(hasVideoTrack || wantsToSendVideo, wantsToReceiveVideo);\n\t}\n\tget sendEncodings() {\n\t\tif (!this.isSimulcast) return;\n\t\treturn [\n\t\t\t\"0\",\n\t\t\t\"1\",\n\t\t\t\"2\"\n\t\t].map((rid) => ({\n\t\t\tactive: true,\n\t\t\trid,\n\t\t\tscaleResolutionDownBy: Number(rid) * 6 || 1\n\t\t}));\n\t}\n\t/**\n\t* Resolve the current MediaTrackConstraints for an input kind, normalising\n\t* boolean shorthand to an empty object. Public so the surrounding\n\t* RTCPeerConnectionController can drive its own pipeline-aware getUserMedia\n\t* call with the same effective constraints the transceiver would have used.\n\t*/\n\tgetConstraintsFor(kind) {\n\t\tconst constraints = kind === \"audio\" ? this.inputAudioDeviceConstraints : this.inputVideoDeviceConstraints;\n\t\treturn typeof constraints === \"boolean\" ? {} : constraints;\n\t}\n\ttransceiverByKind(kind) {\n\t\treturn this.peerConnection.getTransceivers().filter((t) => kind === \"both\" || t.receiver.track.kind === kind);\n\t}\n\tget audioTransceivers() {\n\t\treturn this.transceiverByKind(\"audio\");\n\t}\n\tget videoTransceivers() {\n\t\treturn this.transceiverByKind(\"video\");\n\t}\n\tasync setupTransceiverSender(track, localStream, transceiver) {\n\t\tconst isAudio = track.kind === \"audio\";\n\t\tconst direction = isAudio ? this.audioDirection : this.videoDirection;\n\t\tconst transceiverParams = {\n\t\t\tdirection,\n\t\t\tsendEncodings: isAudio ? void 0 : this.sendEncodings,\n\t\t\tstreams: direction === \"recvonly\" ? void 0 : [localStream]\n\t\t};\n\t\tlogger$18.debug(`[TransceiverController] Setting up transceiver sender for local ${track.kind} track:`, {\n\t\t\ttransceiver,\n\t\t\ttransceiverParams\n\t\t});\n\t\tif (transceiverParams.direction && [\"sendonly\", \"sendrecv\"].includes(transceiverParams.direction)) if (transceiver) {\n\t\t\tawait transceiver.sender.replaceTrack(track);\n\t\t\ttransceiver.direction = transceiverParams.direction;\n\t\t\tif (transceiverParams.streams?.some((stream) => Boolean(stream))) {\n\t\t\t\tlogger$18.debug(`[TransceiverController] Setting streams for transceiver sender for local ${track.kind} track:`, transceiverParams.streams);\n\t\t\t\ttransceiver.sender.setStreams(...transceiverParams.streams);\n\t\t\t}\n\t\t} else {\n\t\t\tlogger$18.debug(`[TransceiverController] Adding new transceiver for local ${track.kind} track:`, track.id);\n\t\t\tthis.peerConnection.addTransceiver(track, transceiverParams);\n\t\t}\n\t}\n\tstopTrackSender(kind, options = { updateTransceiverDirection: false }) {\n\t\ttry {\n\t\t\tconst transceivers = this.transceiverByKind(kind);\n\t\t\tfor (const transceiver of transceivers) if (transceiver.sender.track?.readyState === \"live\") {\n\t\t\t\tconst trackId = transceiver.sender.track.id;\n\t\t\t\ttransceiver.sender.track.stop();\n\t\t\t\tthis.options.localStreamController.removeTrack(trackId);\n\t\t\t\tif (options.updateTransceiverDirection) transceiver.direction = \"inactive\";\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$18.error(\"[TransceiverController] stopTrackSender error\", kind, error);\n\t\t\tthis.options.onError?.(new MediaTrackError(\"stopTrackSender\", kind, error));\n\t\t}\n\t}\n\tasync restoreTrackSender(kind) {\n\t\ttry {\n\t\t\tlogger$18.debug(\"[TransceiverController] restoreTrackSender called\", kind);\n\t\t\tconst constraints = {};\n\t\t\tconst transceivers = this.transceiverByKind(kind);\n\t\t\tfor (const transceiver of transceivers) {\n\t\t\t\tconst { track } = transceiver.sender;\n\t\t\t\tif (!track || track.readyState === \"ended\") {\n\t\t\t\t\tconst trackKind = track?.kind ?? transceiver.receiver.track.kind;\n\t\t\t\t\tif (trackKind === \"audio\" || trackKind === \"video\") constraints[trackKind] = this.getConstraintsFor(trackKind);\n\t\t\t\t}\n\t\t\t}\n\t\t\tlogger$18.debug(\"[TransceiverController] restoreTrackSender constraints:\", constraints);\n\t\t\tif (Object.keys(constraints).length === 0) {\n\t\t\t\tlogger$18.warn(\"[TransceiverController] restoreTrackSender: no tracks need restoration\", kind);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst newTracks = (await this.options.getUserMedia(constraints)).getTracks();\n\t\t\tlogger$18.debug(\"[TransceiverController] restoreTrackSender new tracks:\", newTracks);\n\t\t\tfor (const newTrack of newTracks) {\n\t\t\t\tthis.options.localStreamController.addTrack(newTrack);\n\t\t\t\tconst trackKind = newTrack.kind;\n\t\t\t\tconst transceiverOfKind = this.transceiverByKind(trackKind)[0];\n\t\t\t\ttransceiverOfKind.direction = trackKind === \"audio\" ? this.audioDirection : this.videoDirection;\n\t\t\t\tlogger$18.debug(\"[TransceiverController] restoreTrackSender setting direction for\", trackKind, transceiverOfKind.direction);\n\t\t\t\tawait transceiverOfKind.sender.replaceTrack(newTrack);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$18.error(\"[TransceiverController] restoreTrackSender error\", kind, error);\n\t\t\tthis.options.onError?.(new MediaTrackError(\"restoreTrackSender\", kind, error));\n\t\t}\n\t}\n\tasync replaceSenderTrack(kind, track) {\n\t\tconst transceivers = kind === \"audio\" ? this.audioTransceivers : this.videoTransceivers;\n\t\tfor (const transceiver of transceivers) await transceiver.sender.replaceTrack(track);\n\t}\n\tasync setupRemoteTransceivers(type) {\n\t\tif (type === \"answer\") return;\n\t\tfor (const kind of [\"audio\", \"video\"]) {\n\t\t\tconst transceivers = kind === \"audio\" ? this.audioTransceivers : this.videoTransceivers;\n\t\t\tfor (const transceiver of transceivers) {\n\t\t\t\tconst direction = kind === \"audio\" ? this.audioDirection : this.videoDirection;\n\t\t\t\tif ([\"inactive\", \"recvonly\"].includes(direction)) {\n\t\t\t\t\ttransceiver.direction = direction;\n\t\t\t\t\tawait transceiver.sender.replaceTrack(null);\n\t\t\t\t\ttransceiver.sender.setStreams();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.videoDirection === \"recvonly\" && this.isSFU && this.useAddTransceivers) {\n\t\t\tconst { msStreamsNumber = 5 } = this.options;\n\t\t\tfor (let i = 0; i < Number(msStreamsNumber); i++) this.peerConnection.addTransceiver(\"video\", { direction: \"recvonly\" });\n\t\t}\n\t}\n\tasync updateSendersConstraints(kind, constraints) {\n\t\tif (!constraints) {\n\t\t\tthis.stopTrackSender(kind);\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\tconst senders = this.peerConnection.getSenders().filter((sender) => sender.track?.kind === kind && sender.track.readyState === \"live\");\n\t\tfor (const sender of senders) {\n\t\t\tconst { track } = sender;\n\t\t\tif (track) {\n\t\t\t\tconst constraintsToApply = {\n\t\t\t\t\t...track.getConstraints(),\n\t\t\t\t\t...constraints\n\t\t\t\t};\n\t\t\t\ttry {\n\t\t\t\t\tawait track.applyConstraints(constraintsToApply);\n\t\t\t\t\tlogger$18.debug(`[TransceiverController] Updated ${kind} sender constraints:`, constraintsToApply);\n\t\t\t\t\tlogger$18.debug(`[TransceiverController] Updated ${kind} sender constraints:`, track.getConstraints());\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger$18.warn(`[TransceiverController] applyConstraints failed for ${kind} track ${track.id}, attempting track replacement fallback:`, error);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.replaceTrackFallback(sender, track, kind, constraintsToApply);\n\t\t\t\t\t} catch (fallbackError) {\n\t\t\t\t\t\tlogger$18.warn(`[TransceiverController] Track replacement fallback also failed for ${kind} track:`, fallbackError);\n\t\t\t\t\t\tthis.options.onError?.(new MediaTrackError(\"updateSendersConstraints\", kind, fallbackError));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Fallback when applyConstraints fails: stop the current track, acquire a new\n\t* one via getUserMedia with the merged constraints (preserving the current\n\t* deviceId), replace the sender track, and update the localStream.\n\t*\n\t* This is critical for iOS Safari where applyConstraints on audio tracks\n\t* silently fails or throws.\n\t*/\n\tasync replaceTrackFallback(sender, oldTrack, kind, mergedConstraints) {\n\t\tconst { deviceId } = oldTrack.getSettings();\n\t\tconst constraintsWithDevice = {\n\t\t\t...mergedConstraints,\n\t\t\t...deviceId ? { deviceId: { exact: deviceId } } : {}\n\t\t};\n\t\tconst trackId = oldTrack.id;\n\t\toldTrack.stop();\n\t\tthis.options.localStreamController.removeTrack(trackId);\n\t\tconst newTrack = (await this.options.getUserMedia({ [kind]: constraintsWithDevice })).getTracks().find((t) => t.kind === kind);\n\t\tif (!newTrack) throw new MediaTrackError(\"replaceTrackFallback\", kind, /* @__PURE__ */ new Error(\"getUserMedia returned no track of the requested kind\"));\n\t\tawait sender.replaceTrack(newTrack);\n\t\tthis.options.localStreamController.addTrack(newTrack);\n\t\tlogger$18.debug(`[TransceiverController] Track replacement fallback succeeded for ${kind}. New track: ${newTrack.id}`);\n\t}\n\tgetMediaDirections() {\n\t\tif (this.peerConnection.connectionState === \"connected\") return this.peerConnection.getTransceivers().reduce((acc, transceiver) => {\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[transceiver.receiver.track.kind]: transceiver.direction\n\t\t\t};\n\t\t}, {\n\t\t\taudio: \"inactive\",\n\t\t\tvideo: \"inactive\"\n\t\t});\n\t\treturn {\n\t\t\taudio: this.audioDirection,\n\t\t\tvideo: this.videoDirection\n\t\t};\n\t}\n\tupdatePeerConnection(peerConnection) {\n\t\tthis.peerConnection = peerConnection;\n\t}\n\tupdateOptions(options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t}\n};\n\n//#endregion\n//#region src/controllers/RTCPeerConnectionController.ts\nconst logger$17 = getLogger();\nvar RTCPeerConnectionController = class extends Destroyable {\n\tconstructor(options = {}, remoteSessionDescription, deviceController) {\n\t\tsuper();\n\t\tthis.options = options;\n\t\tthis.firstSDPExchangeCompleted = false;\n\t\tthis.negotiationNeeded$ = this.createSubject();\n\t\tthis.localDescription$ = defer(() => from(this.init())).pipe(switchMap(() => this.iceGatheringController.iceCandidatesState$.pipe(filter((iceCandidateState) => ![\"new\", \"gathering\"].includes(iceCandidateState)), tap(() => {\n\t\t\tthis.negotiationEnded();\n\t\t}), filter(() => this.shouldEmitLocalDescription), map(() => this.peerConnection?.localDescription), filterNull(), tap((desc) => {\n\t\t\tif (desc.type === \"answer\") this._type = \"offer\";\n\t\t}))), shareReplay(1), takeUntil(this.destroyed$));\n\t\tthis.connectionTimeout = 3e3;\n\t\tthis.oniceconnectionstatechangeHandler = () => {\n\t\t\tif (this.peerConnection) {\n\t\t\t\tconst { iceConnectionState } = this.peerConnection;\n\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] ICE connection state changed to: ${iceConnectionState}`);\n\t\t\t\tthis._iceConnectionState$.next(this.peerConnection.iceConnectionState);\n\t\t\t}\n\t\t};\n\t\tthis.onconnectionstatechangeHandler = () => {\n\t\t\tif (this.peerConnection) {\n\t\t\t\tconst { connectionState } = this.peerConnection;\n\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Connection state changed to: ${connectionState}`);\n\t\t\t\tif (connectionState === \"connected\") this.removeConnectionTimer();\n\t\t\t\tthis._connectionState$.next(this.peerConnection.connectionState);\n\t\t\t}\n\t\t};\n\t\tthis.onsignalingstatechangeHandler = () => {\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Signaling state changed to: ${this.peerConnection?.signalingState}`);\n\t\t};\n\t\tthis.onicegatheringstatechangeHandler = () => {\n\t\t\tif (this.peerConnection) this._iceGatheringState$.next(this.peerConnection.iceGatheringState);\n\t\t};\n\t\tthis.onnegotiationneededHandler = (event) => {\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Negotiation needed event received.\", event);\n\t\t\tthis.negotiationNeeded$.next();\n\t\t};\n\t\tthis.updateSelectedInputDevice = async (kind, deviceInfo) => {\n\t\t\ttry {\n\t\t\t\tconst { localStream } = this;\n\t\t\t\tif (!localStream) {\n\t\t\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] No local stream available to update input device.\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Updating selected ${kind} input device:`, localStream.getTracks());\n\t\t\t\tconst track = localStream.getTracks().find((track$1) => track$1.kind === kind);\n\t\t\t\tif (track) {\n\t\t\t\t\tthis.transceiverController?.stopTrackSender(kind);\n\t\t\t\t\tthis.localStreamController.removeTrack(track.id);\n\t\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Stopped existing ${kind} track: ${track.id}`, localStream.getTracks());\n\t\t\t\t\tif (!deviceInfo) {\n\t\t\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] ${kind} input device selected: none`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tconst streamTrack = (await this.getUserMedia({ [kind]: {\n\t\t\t\t\t\t...track.getConstraints(),\n\t\t\t\t\t\t...this.deviceController.deviceInfoToConstraints(deviceInfo)\n\t\t\t\t\t} })).getTracks().find((t) => t.kind === kind);\n\t\t\t\t\tif (streamTrack) {\n\t\t\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Adding new ${kind} track: ${streamTrack.id}`);\n\t\t\t\t\t\tthis.localStreamController.addTrack(streamTrack);\n\t\t\t\t\t\tawait this.transceiverController?.replaceSenderTrack(kind, streamTrack);\n\t\t\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Added new ${kind} track: ${streamTrack.id}`, this.localStream?.getTracks());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] ${kind} input device selected:`, deviceInfo?.label);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$17.error(`[RTCPeerConnectionController] Failed to select ${kind} input device:`, error);\n\t\t\t\tthis._errors$.next(new MediaTrackError(\"updateSelectedInputDevice\", kind, error));\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\t\tthis._isNegotiating$ = this.createBehaviorSubject(false);\n\t\tthis._memberId = null;\n\t\tthis._iceConnectionState$ = this.createReplaySubject(1);\n\t\tthis._connectionState$ = this.createReplaySubject(1);\n\t\tthis._signalingState$ = this.createReplaySubject(1);\n\t\tthis._iceGatheringState$ = this.createReplaySubject(1);\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis._iceCandidates$ = this.createReplaySubject(1);\n\t\tthis._initialized$ = this.createReplaySubject(1);\n\t\tthis._remoteDescription$ = this.createReplaySubject(1);\n\t\tthis._remoteStream$ = this.createBehaviorSubject(null);\n\t\tthis._remoteOfferMediaDirections = null;\n\t\tthis._localAudioPipeline = null;\n\t\tthis.deviceController = deviceController ?? {};\n\t\tthis.id = options.callId ?? v4();\n\t\tthis._type = remoteSessionDescription ? \"answer\" : \"offer\";\n\t\tthis.sdpInit = remoteSessionDescription ? {\n\t\t\ttype: \"offer\",\n\t\t\tsdp: remoteSessionDescription\n\t\t} : void 0;\n\t\tthis._remoteOfferMediaDirections = remoteSessionDescription ? extractMediaDirectionsFromSDP(remoteSessionDescription) : null;\n\t\tconst offerDefaults = this._remoteOfferMediaDirections ? {\n\t\t\taudio: this._remoteOfferMediaDirections.audio.includes(\"recv\"),\n\t\t\tvideo: this._remoteOfferMediaDirections.video.includes(\"recv\"),\n\t\t\treceiveAudio: this._remoteOfferMediaDirections.audio.includes(\"send\"),\n\t\t\treceiveVideo: this._remoteOfferMediaDirections.video.includes(\"send\")\n\t\t} : {};\n\t\tthis.options = {\n\t\t\t...options,\n\t\t\taudio: options.audio ?? offerDefaults.audio,\n\t\t\tvideo: options.video ?? offerDefaults.video,\n\t\t\treceiveAudio: options.receiveAudio ?? offerDefaults.receiveAudio ?? PreferencesContainer.instance.receiveAudio,\n\t\t\treceiveVideo: options.receiveVideo ?? offerDefaults.receiveVideo ?? PreferencesContainer.instance.receiveVideo\n\t\t};\n\t\tthis.localStreamController = new LocalStreamController({\n\t\t\tpropose: this.propose,\n\t\t\tinputAudioStream: this.options.inputAudioStream,\n\t\t\tinputVideoStream: this.options.inputVideoStream,\n\t\t\tinputAudioDeviceConstraints: this.inputAudioDeviceConstraints,\n\t\t\tinputVideoDeviceConstraints: this.inputVideoDeviceConstraints,\n\t\t\tgetUserMedia: async (constraints) => this.getUserMedia(constraints),\n\t\t\tgetDisplayMedia: async (options$1) => this.getDisplayMedia(options$1)\n\t\t});\n\t}\n\tget iceGatheringController() {\n\t\tif (!this._iceGatheringController) throw new DependencyError(\"ICEGatheringController is not initialized\");\n\t\treturn this._iceGatheringController;\n\t}\n\tget shouldEmitLocalDescription() {\n\t\tif (!this.peerConnection) return false;\n\t\tconst { localDescription, signalingState } = this.peerConnection;\n\t\tif (!localDescription || !isValidLocalDescription(localDescription.sdp)) return false;\n\t\treturn localDescription.type === \"offer\" && signalingState === \"have-local-offer\" || localDescription.type === \"answer\" && signalingState === \"stable\";\n\t}\n\tremoveConnectionTimer() {\n\t\tif (this.connectionTimer) {\n\t\t\tclearTimeout(this.connectionTimer);\n\t\t\tthis.connectionTimer = void 0;\n\t\t}\n\t}\n\tsetMemberId(memberId) {\n\t\tthis._memberId = memberId;\n\t}\n\tget memberId() {\n\t\treturn this._memberId;\n\t}\n\tstopTrackSender(kind, options = { updateTransceiverDirection: false }) {\n\t\tconst audioCovered = kind === \"audio\" || kind === \"both\";\n\t\tif (audioCovered && this._localAudioPipeline) this.stopRawAudioInputForPipeline();\n\t\tif (!audioCovered) this.transceiverController?.stopTrackSender(kind, options);\n\t\telse if (kind === \"both\") this.transceiverController?.stopTrackSender(\"video\", options);\n\t\telse if (!this._localAudioPipeline) this.transceiverController?.stopTrackSender(kind, options);\n\t}\n\tstopRawAudioInputForPipeline() {\n\t\tconst rawTracks = this.localStreamController.localAudioTracks;\n\t\tfor (const track of rawTracks) if (track.readyState === \"live\") {\n\t\t\ttrack.stop();\n\t\t\tthis.localStreamController.removeTrack(track.id);\n\t\t}\n\t\tthis._localAudioPipeline?.setInputTrack(null);\n\t}\n\tget isNegotiating$() {\n\t\treturn this._isNegotiating$.asObservable();\n\t}\n\tget isNegotiating() {\n\t\treturn this._isNegotiating$.value;\n\t}\n\tupdateMediaDevicesOptions(options) {\n\t\tthis.options = {\n\t\t\t...this.options,\n\t\t\t...options\n\t\t};\n\t}\n\tget iceGatheringState$() {\n\t\treturn this.cachedObservable(\"iceGatheringState$\", () => this._iceGatheringState$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget mediaTrackEnded$() {\n\t\treturn this.cachedObservable(\"mediaTrackEnded$\", () => this.localStreamController.mediaTrackEnded$.pipe(takeUntil(this.destroyed$)));\n\t}\n\tget errors$() {\n\t\treturn this.cachedObservable(\"errors$\", () => this._errors$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget iceCandidates$() {\n\t\treturn this.cachedObservable(\"iceCandidates$\", () => this._iceCandidates$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget initialized$() {\n\t\treturn this.cachedObservable(\"initialized$\", () => this._initialized$.asObservable().pipe(filter((initialized) => initialized), takeUntil(this.destroyed$)));\n\t}\n\tget remoteDescription$() {\n\t\treturn this.cachedObservable(\"remoteDescription$\", () => this._remoteDescription$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget localStream$() {\n\t\treturn this.cachedObservable(\"localStream$\", () => this.localStreamController.localStream$.pipe(takeUntil(this.destroyed$)));\n\t}\n\tget remoteStream$() {\n\t\treturn this.cachedObservable(\"remoteStream$\", () => this._remoteStream$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget localAudioTracks$() {\n\t\treturn this.cachedObservable(\"localAudioTracks$\", () => this.localStreamController.localAudioTracks$.pipe(takeUntil(this.destroyed$)));\n\t}\n\tget localVideoTracks$() {\n\t\treturn this.cachedObservable(\"localVideoTracks$\", () => this.localStreamController.localVideoTracks$.pipe(takeUntil(this.destroyed$)));\n\t}\n\tget iceConnectionState$() {\n\t\treturn this.cachedObservable(\"iceConnectionState$\", () => this._iceConnectionState$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget connectionState$() {\n\t\treturn this.cachedObservable(\"connectionState$\", () => this._connectionState$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget signalingState$() {\n\t\treturn this.cachedObservable(\"signalingState$\", () => this._signalingState$.asObservable().pipe(takeUntil(this.destroyed$)));\n\t}\n\tget type() {\n\t\treturn this._type;\n\t}\n\tget propose() {\n\t\treturn this.options.propose ?? \"main\";\n\t}\n\tget isAdditionalDevice() {\n\t\treturn this.propose === \"additional-device\";\n\t}\n\tget isMainDevice() {\n\t\treturn this.propose === \"main\";\n\t}\n\tget isScreenShare() {\n\t\treturn this.propose === \"screenshare\";\n\t}\n\tget iceServers() {\n\t\tif (!this.options.disableUdpIceServers) return this.options.iceServers ?? [];\n\t\tconst tcpTransportParam = \"transport=tcp\";\n\t\treturn (this.options.iceServers ?? []).map((server) => {\n\t\t\tconst urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\t\t\treturn {\n\t\t\t\t...server,\n\t\t\t\turls: urls.filter((url) => url.includes(tcpTransportParam))\n\t\t\t};\n\t\t});\n\t}\n\tget rtcConfiguration() {\n\t\tconst { iceServers: _iceServers, ...restOptions } = this.options;\n\t\treturn {\n\t\t\tbundlePolicy: \"max-compat\",\n\t\t\ticeCandidatePoolSize: 10,\n\t\t\ticeServers: this.iceServers,\n\t\t\ticeTransportPolicy: this.options.relayOnly ? \"relay\" : \"all\",\n\t\t\tsdpSemantics: \"unified-plan\",\n\t\t\t...restOptions\n\t\t};\n\t}\n\tget receiveVideo() {\n\t\treturn Boolean(this.options.receiveVideo);\n\t}\n\tget receiveAudio() {\n\t\treturn Boolean(this.options.receiveAudio);\n\t}\n\tget localStream() {\n\t\treturn this.localStreamController.localStream;\n\t}\n\tget remoteStream() {\n\t\treturn this._remoteStream$.value;\n\t}\n\tget inputAudioDeviceConstraints() {\n\t\tif (this.options.audio === false && !this.options.inputAudioDeviceConstraints) return false;\n\t\tconst deviceConstraints = this.deviceController.selectedAudioInputDeviceConstraints;\n\t\tif (deviceConstraints === false) return false;\n\t\tconst audioBase = typeof this.options.inputAudioDeviceConstraints === \"object\" ? this.options.inputAudioDeviceConstraints : {};\n\t\tconst audioDevice = typeof deviceConstraints === \"object\" ? deviceConstraints : {};\n\t\treturn {\n\t\t\t...audioBase,\n\t\t\t...audioDevice\n\t\t};\n\t}\n\tget inputVideoDeviceConstraints() {\n\t\tif (!this.options.video && !this.options.inputVideoDeviceConstraints) return false;\n\t\tconst deviceConstraints = this.deviceController.selectedVideoInputDeviceConstraints;\n\t\tif (deviceConstraints === false) return false;\n\t\tconst videoBase = typeof this.options.inputVideoDeviceConstraints === \"object\" ? this.options.inputVideoDeviceConstraints : {};\n\t\tconst videoDevice = typeof deviceConstraints === \"object\" ? deviceConstraints : {};\n\t\treturn {\n\t\t\t...videoBase,\n\t\t\t...videoDevice\n\t\t};\n\t}\n\tget WebRTCPeerConnectionConstructor() {\n\t\treturn this.options.webRTCApiProvider?.RTCPeerConnection ?? RTCPeerConnection;\n\t}\n\tget offerOptions() {\n\t\tconst options = { iceRestart: this.firstSDPExchangeCompleted ? true : void 0 };\n\t\tswitch (this.propose) {\n\t\t\tcase \"screenshare\":\n\t\t\tcase \"additional-device\": return {\n\t\t\t\t...options,\n\t\t\t\tofferToReceiveAudio: false,\n\t\t\t\tofferToReceiveVideo: false\n\t\t\t};\n\t\t\tcase \"main\":\n\t\t\tdefault: return {\n\t\t\t\t...options,\n\t\t\t\tofferToReceiveAudio: this.options.receiveAudio ?? true,\n\t\t\t\tofferToReceiveVideo: this.options.receiveVideo ?? Boolean(this.inputVideoDeviceConstraints)\n\t\t\t};\n\t\t}\n\t}\n\tget answerOptions() {\n\t\treturn { iceRestart: this.firstSDPExchangeCompleted ? true : void 0 };\n\t}\n\t/**\n\t* Initialize the RTCPeerConnection and setup event listeners.\n\t* Called automatically when localDescription$ is subscribed to (deferred pattern).\n\t* Uses Promise memoization to ensure initialization only happens once,\n\t* even if called concurrently.\n\t*/\n\tasync init() {\n\t\tthis.initPromise ??= this.doInit();\n\t\treturn this.initPromise;\n\t}\n\t/**\n\t* Internal initialization implementation.\n\t* Should only be called via init() to ensure single execution.\n\t*/\n\tasync doInit() {\n\t\ttry {\n\t\t\tthis.setupPeerConnection();\n\t\t\tthis.subscribeTo(this.negotiationNeeded$.pipe(auditTime(0), exhaustMap(async () => this.startNegotiation())), {\n\t\t\t\tnext: () => {\n\t\t\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Start Negotiation completed successfully\");\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Start Negotiation error:\", error);\n\t\t\t\t\tthis._errors$.next(toError(error));\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.subscribeTo(merge(this.deviceController.selectedAudioInputDevice$.pipe(map((deviceInfo) => [\"audio\", deviceInfo])), this.deviceController.selectedVideoInputDevice$.pipe(map((deviceInfo) => [\"video\", deviceInfo]))).pipe(skipWhile(() => !this.localStreamController.localStream)), async ([kind, deviceInfo]) => {\n\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Selected input device changed for:`, {\n\t\t\t\t\tkind,\n\t\t\t\t\tdeviceInfo\n\t\t\t\t});\n\t\t\t\tawait this.updateSelectedInputDevice(kind, deviceInfo);\n\t\t\t});\n\t\t\tif (this.type === \"answer\" && this.sdpInit) {\n\t\t\t\tawait this.setupRemoteTracks();\n\t\t\t\tthis._initialized$.next(true);\n\t\t\t\tthis.setupEventListeners();\n\t\t\t\tthis._isNegotiating$.next(true);\n\t\t\t\tawait this._setRemoteDescription(this.sdpInit);\n\t\t\t} else {\n\t\t\t\tawait this.setupTrackHandling();\n\t\t\t\tthis._initialized$.next(true);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Initialization error:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t\tthis.destroy();\n\t\t}\n\t}\n\tsetupPeerConnection() {\n\t\tthis.peerConnection = new this.WebRTCPeerConnectionConstructor(this.rtcConfiguration);\n\t\tthis.peerConnection.addEventListener(\"negotiationneeded\", this.onnegotiationneededHandler);\n\t\tthis._iceGatheringController = new ICEGatheringController(this.peerConnection, this.isNegotiating$, {\n\t\t\ticeCandidateTimeout: this.options.iceCandidateTimeout,\n\t\t\ticeGatheringTimeout: this.options.iceGatheringTimeout,\n\t\t\trelayOnly: this.options.relayOnly\n\t\t});\n\t\tthis.transceiverController = new TransceiverController({\n\t\t\tpeerConnection: this.peerConnection,\n\t\t\tpropose: this.propose,\n\t\t\tsimulcast: this.options.simulcast,\n\t\t\tsfu: this.options.sfu,\n\t\t\tmsStreamsNumber: this.options.msStreamsNumber,\n\t\t\treceiveAudio: this.receiveAudio,\n\t\t\treceiveVideo: this.receiveVideo,\n\t\t\tlocalStreamController: this.localStreamController,\n\t\t\tgetInputAudioDeviceConstraints: () => this.inputAudioDeviceConstraints,\n\t\t\tgetInputVideoDeviceConstraints: () => this.inputVideoDeviceConstraints,\n\t\t\tgetUserMedia: async (constraints) => this.getUserMedia(constraints),\n\t\t\tonError: (error) => {\n\t\t\t\tthis._errors$.next(error);\n\t\t\t}\n\t\t});\n\t}\n\tasync startNegotiation() {\n\t\tif (this.isNegotiating) {\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Negotiation already in progress, skipping.\");\n\t\t\treturn;\n\t\t}\n\t\tthis.setupEventListeners();\n\t\tif (this.type === \"answer\") {\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] This is an answer type still, skipping offer creation.\");\n\t\t\treturn;\n\t\t}\n\t\tthis._isNegotiating$.next(true);\n\t\tlogger$17.debug(\"[RTCPeerConnectionController] Starting negotiation.\");\n\t\ttry {\n\t\t\tconst { offerOptions } = this;\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Creating offer with options:\", offerOptions);\n\t\t\tawait this.createOffer(offerOptions);\n\t\t} catch (error) {\n\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Error during negotiation:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t}\n\t}\n\t/**\n\t* Create an SDP offer and set it as local description.\n\t*/\n\tasync createOffer(options) {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tconst offer = await this.peerConnection.createOffer(options);\n\t\tawait this.setLocalDescription(offer);\n\t}\n\tasync updateAnswerStatus({ status, sdp }) {\n\t\tlet readyToConnect = status !== \"failed\";\n\t\ttry {\n\t\t\tif (status === \"received\" && sdp) {\n\t\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Received answer SDP:\", sdp);\n\t\t\t\tawait this._setRemoteDescription({\n\t\t\t\t\ttype: \"answer\",\n\t\t\t\t\tsdp\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Error updating answer status:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t\treadyToConnect = false;\n\t\t} finally {\n\t\t\tif (readyToConnect) this.readyToConnect();\n\t\t\telse this.iceGatheringController.restartICEGatheringWithRelayOnly();\n\t\t}\n\t}\n\tasync updateOfferStatus({ status, sdp }) {\n\t\tswitch (status) {\n\t\t\tcase \"received\":\n\t\t\t\tthis._type = \"answer\";\n\t\t\t\tthis.sdpInit = {\n\t\t\t\t\ttype: \"offer\",\n\t\t\t\t\tsdp\n\t\t\t\t};\n\t\t\t\tawait this.handleOfferReceived();\n\t\t\t\tbreak;\n\t\t\tcase \"failed\":\n\t\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Offer failed to be processed by remote.\");\n\t\t\t\tbreak;\n\t\t\tcase \"sent\":\n\t\t\tdefault:\n\t\t}\n\t}\n\t/**\n\t* Accept an inbound call by creating the SDP answer.\n\t* Optionally override media options before the answer is generated.\n\t* Must be called after initialization for inbound (answer-type) connections.\n\t*/\n\tasync acceptInbound(mediaOverrides) {\n\t\tif (mediaOverrides) {\n\t\t\tconst { audio, video, receiveAudio, receiveVideo, fallbackToReceiveOnly } = mediaOverrides;\n\t\t\tthis.options = {\n\t\t\t\t...this.options,\n\t\t\t\t...audio !== void 0 ? { audio } : {},\n\t\t\t\t...video !== void 0 ? { video } : {},\n\t\t\t\t...receiveAudio !== void 0 ? { receiveAudio } : {},\n\t\t\t\t...receiveVideo !== void 0 ? { receiveVideo } : {},\n\t\t\t\t...fallbackToReceiveOnly !== void 0 ? { fallbackToReceiveOnly } : {}\n\t\t\t};\n\t\t\tthis.transceiverController?.updateOptions({\n\t\t\t\treceiveAudio: this.receiveAudio,\n\t\t\t\treceiveVideo: this.receiveVideo\n\t\t\t});\n\t\t\tthis.localStreamController.updateOptions({\n\t\t\t\tinputAudioDeviceConstraints: this.inputAudioDeviceConstraints,\n\t\t\t\tinputVideoDeviceConstraints: this.inputVideoDeviceConstraints\n\t\t\t});\n\t\t}\n\t\tawait this.setupLocalTracks();\n\t\tconst { answerOptions } = this;\n\t\tlogger$17.debug(\"[RTCPeerConnectionController] Creating inbound answer with options:\", answerOptions);\n\t\tawait this.createAnswer(answerOptions);\n\t}\n\tasync handleOfferReceived() {\n\t\tif (!this.sdpInit) throw new DependencyError(\"SDP initialization parameters are not set\");\n\t\tthis._isNegotiating$.next(true);\n\t\tawait this._setRemoteDescription(this.sdpInit);\n\t\tconst { answerOptions } = this;\n\t\tlogger$17.debug(\"[RTCPeerConnectionController] Creating answer with options:\", answerOptions);\n\t\tawait this.createAnswer(answerOptions);\n\t}\n\treadyToConnect() {\n\t\tthis.firstSDPExchangeCompleted = true;\n\t\tthis.connectionTimer = setTimeout(() => {\n\t\t\tthis.removeConnectionTimer();\n\t\t\tif (this.peerConnection?.connectionState !== \"connected\") {\n\t\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Connection timeout, restarting ICE gathering with relay only.\");\n\t\t\t\tthis.iceGatheringController.restartICEGatheringWithRelayOnly();\n\t\t\t}\n\t\t}, this.connectionTimeout);\n\t}\n\tasync setRemoteDescriptionBefore(sdp = \"\") {\n\t\treturn Promise.resolve(sdp);\n\t}\n\tasync setLocalDescription(params) {\n\t\tconst finalLocal = await this.setLocalDescriptionBefore(params.sdp);\n\t\treturn this.peerConnection?.setLocalDescription({\n\t\t\t...params,\n\t\t\tsdp: finalLocal\n\t\t});\n\t}\n\tasync setLocalDescriptionBefore(sdp = \"\") {\n\t\tlet result = sdp;\n\t\tconst preferredAudioCodecs = this.options.preferredAudioCodecs ?? PreferencesContainer.instance.preferredAudioCodecs;\n\t\tconst preferredVideoCodecs = this.options.preferredVideoCodecs ?? PreferencesContainer.instance.preferredVideoCodecs;\n\t\tconst stereo = this.options.stereo ?? PreferencesContainer.instance.stereoAudio;\n\t\tif (preferredAudioCodecs.length > 0 || preferredVideoCodecs.length > 0) {\n\t\t\tresult = setCodecPreferences(result, preferredAudioCodecs, preferredVideoCodecs);\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Applied codec preferences to SDP\", {\n\t\t\t\tpreferredAudioCodecs,\n\t\t\t\tpreferredVideoCodecs\n\t\t\t});\n\t\t}\n\t\tif (stereo) {\n\t\t\tresult = enableStereoOpus(result);\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Applied stereo Opus to SDP\");\n\t\t}\n\t\treturn Promise.resolve(result);\n\t}\n\t/**\n\t* Create an SDP answer and set it as local description.\n\t*/\n\tasync createAnswer(options) {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tconst answer = await this.peerConnection.createAnswer(options);\n\t\tawait this.setLocalDescription(answer);\n\t}\n\t/**\n\t* Setup event listeners on RTCPeerConnection for state changes.\n\t*/\n\tsetupEventListeners() {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tthis._iceConnectionState$.next(this.peerConnection.iceConnectionState);\n\t\tthis._connectionState$.next(this.peerConnection.connectionState);\n\t\tthis._signalingState$.next(this.peerConnection.signalingState);\n\t\tthis._iceGatheringState$.next(this.peerConnection.iceGatheringState);\n\t\tthis._remoteDescription$.next(this.peerConnection.remoteDescription);\n\t\tthis.peerConnection.removeEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\tthis.peerConnection.addEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\tthis.peerConnection.removeEventListener(\"iceconnectionstatechange\", this.oniceconnectionstatechangeHandler);\n\t\tthis.peerConnection.addEventListener(\"iceconnectionstatechange\", this.oniceconnectionstatechangeHandler);\n\t\tthis.peerConnection.removeEventListener(\"connectionstatechange\", this.onconnectionstatechangeHandler);\n\t\tthis.peerConnection.addEventListener(\"connectionstatechange\", this.onconnectionstatechangeHandler);\n\t\tthis.peerConnection.removeEventListener(\"signalingstatechange\", this.onsignalingstatechangeHandler);\n\t\tthis.peerConnection.addEventListener(\"signalingstatechange\", this.onsignalingstatechangeHandler);\n\t}\n\tnegotiationEnded() {\n\t\tthis._isNegotiating$.next(false);\n\t}\n\t/**\n\t* Trigger an ICE restart through the existing negotiation pipeline.\n\t*\n\t* This creates an offer with iceRestart: true and goes through the full\n\t* SDP pipeline (setLocalDescription → ICE gathering → localDescription$ emission).\n\t* The caller should NOT send the SDP manually — the existing\n\t* setupLocalDescriptionHandler in VertoManager will pick up the emission\n\t* from localDescription$ and send it as a verto.modify.\n\t*\n\t* Unlike calling pc.createOffer/setLocalDescription directly, this method:\n\t* - Sets _isNegotiating$ so ICEGatheringController arms its timers\n\t* - Waits for ICE gathering to complete before localDescription$ emits\n\t* - Goes through setLocalDescriptionBefore() for any SDP munging\n\t*/\n\tasync triggerIceRestart(relayOnly) {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tconst policyChanged = relayOnly && !this.options.relayOnly;\n\t\tif (policyChanged) try {\n\t\t\tthis.peerConnection.setConfiguration({\n\t\t\t\t...this.peerConnection.getConfiguration(),\n\t\t\t\ticeTransportPolicy: \"relay\"\n\t\t\t});\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] ICE transport policy set to relay-only\");\n\t\t} catch (error) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Failed to set relay-only policy:\", error);\n\t\t}\n\t\tthis.setupEventListeners();\n\t\tthis._isNegotiating$.next(true);\n\t\tlogger$17.debug(`[RTCPeerConnectionController] Triggering ICE restart${relayOnly ? \" (relay-only)\" : \"\"}.`);\n\t\ttry {\n\t\t\tconst offer = await this.peerConnection.createOffer({ iceRestart: true });\n\t\t\tawait this.setLocalDescription(offer);\n\t\t} catch (error) {\n\t\t\tlogger$17.error(\"[RTCPeerConnectionController] ICE restart offer failed:\", error);\n\t\t\tthis._errors$.next(toError(error));\n\t\t\tthis.negotiationEnded();\n\t\t\tif (policyChanged) this.restoreIceTransportPolicy();\n\t\t\tthrow error;\n\t\t}\n\t\tif (policyChanged) firstValueFrom(race(this._iceGatheringState$.pipe(filter((state) => state === \"complete\"), take(1)), timer(ICE_GATHERING_COMPLETE_TIMEOUT_MS).pipe(map(() => \"timeout\")))).then(() => this.restoreIceTransportPolicy()).catch((error) => {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Error waiting for ICE gathering to complete:\", error);\n\t\t\tthis.restoreIceTransportPolicy();\n\t\t});\n\t}\n\trestoreIceTransportPolicy() {\n\t\ttry {\n\t\t\tthis.peerConnection?.setConfiguration({\n\t\t\t\t...this.peerConnection.getConfiguration(),\n\t\t\t\ticeTransportPolicy: this.options.relayOnly ? \"relay\" : \"all\"\n\t\t\t});\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] ICE transport policy restored\");\n\t\t} catch (error) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Failed to restore ICE transport policy:\", error);\n\t\t}\n\t}\n\t/**\n\t* Setup track handling for remote tracks.\n\t*/\n\tasync setupTrackHandling() {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tawait this.setupLocalTracks();\n\t\tawait this.setupRemoteTracks();\n\t}\n\tasync setupLocalTracks() {\n\t\tlogger$17.debug(\"[RTCPeerConnectionController] Setting up local tracks/transceivers.\");\n\t\tif (this.hasNoLocalMediaToSend()) {\n\t\t\tif (!this.receiveAudio && !this.receiveVideo) throw new InvalidParams(\"Call requests no media: enable audio/video or receiveAudio/receiveVideo\");\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] No local media requested; negotiating receive-only.\");\n\t\t\tthis.setupReceiveOnlyTransceivers();\n\t\t\treturn;\n\t\t}\n\t\tlet localStream;\n\t\ttry {\n\t\t\tlocalStream = this.localStream ?? await this.localStreamController.buildLocalStream();\n\t\t} catch (error) {\n\t\t\tthis.handleLocalMediaFailure(error);\n\t\t\treturn;\n\t\t}\n\t\tif (this.transceiverController?.useAddStream ?? false) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Using deprecated addStream API to add local stream.\");\n\t\t\tthis.peerConnection?.addStream(localStream);\n\t\t\tif (!this.isNegotiating) {\n\t\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Forcing negotiationneeded after local tracks setup.\");\n\t\t\t\tthis.negotiationNeeded$.next();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tfor (const kind of [\"audio\", \"video\"]) {\n\t\t\tconst tracks = (kind === \"audio\" ? localStream.getAudioTracks() : localStream.getVideoTracks()).map((track, index) => ({\n\t\t\t\tindex,\n\t\t\t\ttrack\n\t\t\t}));\n\t\t\tfor (const { index, track } of tracks) {\n\t\t\t\tthis.localStreamController.addTrackEndedListener(track);\n\t\t\t\tif (this.transceiverController?.useAddTransceivers ?? false) {\n\t\t\t\t\tconst transceivers = (kind === \"audio\" ? this.transceiverController?.audioTransceivers : this.transceiverController?.videoTransceivers) ?? [];\n\t\t\t\t\tawait this.transceiverController?.setupTransceiverSender(track, localStream, transceivers[index]);\n\t\t\t\t} else {\n\t\t\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Using addTrack for local ${kind} track:`, track.id);\n\t\t\t\t\tthis.peerConnection?.addTrack(track, localStream);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t/** True for a main connection with no local media to send. */\n\thasNoLocalMediaToSend() {\n\t\tconst hasInputStreams = Boolean(this.options.inputAudioStream ?? this.options.inputVideoStream);\n\t\treturn this.propose === \"main\" && !this.localStream && !hasInputStreams && !this.inputAudioDeviceConstraints && !this.inputVideoDeviceConstraints;\n\t}\n\t/** The media kinds this connection wants to send: 'audiovideo' | 'video' | 'audio'. */\n\tget requestedMediaKinds() {\n\t\tconst wantsAudio = Boolean(this.inputAudioDeviceConstraints);\n\t\tconst wantsVideo = Boolean(this.inputVideoDeviceConstraints);\n\t\tif (wantsAudio && wantsVideo) return \"audiovideo\";\n\t\treturn wantsVideo ? \"video\" : \"audio\";\n\t}\n\t/**\n\t* Handle a local media acquisition failure with a typed, semantically\n\t* accurate MediaAccessError created at the acquisition site:\n\t* - Auxiliary connections (screenshare / additional-device) throw a\n\t*   non-fatal error — VertoManager surfaces it and the call is unaffected.\n\t* - The main connection degrades to receive-only when allowed (default),\n\t*   otherwise fails with a fatal error.\n\t*/\n\thandleLocalMediaFailure(error) {\n\t\tif (this.propose === \"screenshare\") throw new MediaAccessError(\"startScreenShare\", \"screen\", error, false);\n\t\tif (this.propose === \"additional-device\") throw new MediaAccessError(\"addInputDevice\", this.requestedMediaKinds, error, false);\n\t\tconst canReceive = this.receiveAudio || this.receiveVideo;\n\t\tif (!((this.options.fallbackToReceiveOnly ?? true) && canReceive)) throw new MediaAccessError(\"acquireLocalMedia\", this.requestedMediaKinds, error, true);\n\t\tlogger$17.warn(\"[RTCPeerConnectionController] Local media unavailable; continuing receive-only:\", error);\n\t\tthis._errors$.next(new MediaAccessError(\"acquireLocalMedia\", this.requestedMediaKinds, error, false));\n\t\tthis.setupReceiveOnlyTransceivers();\n\t}\n\t/**\n\t* Negotiate receive-only m-lines when there are no local tracks to send.\n\t* Only offer-type connections add transceivers — answer-type connections\n\t* reuse the transceivers created from the remote offer.\n\t*/\n\tsetupReceiveOnlyTransceivers() {\n\t\tif (this.type !== \"offer\") return;\n\t\tif (this.transceiverController?.useAddTransceivers ?? false) {\n\t\t\tthis.peerConnection?.addTransceiver(\"audio\", { direction: this.receiveAudio ? \"recvonly\" : \"inactive\" });\n\t\t\tthis.peerConnection?.addTransceiver(\"video\", { direction: this.receiveVideo ? \"recvonly\" : \"inactive\" });\n\t\t}\n\t\tif (!this.isNegotiating) this.negotiationNeeded$.next();\n\t}\n\tasync getUserMedia(constraints) {\n\t\treturn (this.options.webRTCApiProvider?.mediaDevices ?? navigator.mediaDevices).getUserMedia(constraints);\n\t}\n\tasync getDisplayMedia(options) {\n\t\tconst mediaDevices = this.options.webRTCApiProvider?.mediaDevices ?? navigator.mediaDevices;\n\t\tif (!mediaDevices.getDisplayMedia) throw new DependencyError(\"getDisplayMedia is not supported by the current WebRTC provider\");\n\t\treturn mediaDevices.getDisplayMedia(options);\n\t}\n\tasync setupRemoteTracks() {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tthis.peerConnection.ontrack = (event) => {\n\t\t\tlogger$17.debug(\"[RTCPeerConnectionController] Remote track received:\", event.track.kind);\n\t\t\tif (event.streams[0]) this._remoteStream$.next(event.streams[0]);\n\t\t\telse {\n\t\t\t\tconst existingTracks = this._remoteStream$.value?.getTracks() ?? [];\n\t\t\t\tconst newStream = new MediaStream([...existingTracks, event.track]);\n\t\t\t\tthis._remoteStream$.next(newStream);\n\t\t\t}\n\t\t};\n\t\tawait this.transceiverController?.setupRemoteTransceivers(this.type);\n\t}\n\tasync restoreTrackSender(kind) {\n\t\tconst audioCovered = kind === \"audio\" || kind === \"both\";\n\t\tif (audioCovered && this._localAudioPipeline) await this.restoreRawAudioInputForPipeline();\n\t\tif (!audioCovered) await this.transceiverController?.restoreTrackSender(kind);\n\t\telse if (kind === \"both\") await this.transceiverController?.restoreTrackSender(\"video\");\n\t\telse if (!this._localAudioPipeline) await this.transceiverController?.restoreTrackSender(kind);\n\t}\n\tasync restoreRawAudioInputForPipeline() {\n\t\tif (!this._localAudioPipeline) return;\n\t\tconst constraints = this.transceiverController?.getConstraintsFor(\"audio\") ?? {};\n\t\tlet stream;\n\t\ttry {\n\t\t\tstream = await this.getUserMedia({ audio: constraints });\n\t\t} catch (error) {\n\t\t\tlogger$17.error(\"[RTCPeerConnectionController] Failed to re-acquire mic for pipeline restore:\", error);\n\t\t\tthis._errors$.next(new MediaTrackError(\"restoreAudioPipelineInput\", \"audio\", error));\n\t\t\treturn;\n\t\t}\n\t\tconst newTrack = stream.getAudioTracks().at(0);\n\t\tif (!newTrack) return;\n\t\tthis.localStreamController.addTrack(newTrack);\n\t\tthis._localAudioPipeline.setInputTrack(newTrack);\n\t}\n\t/**\n\t* Return the lazily-created {@link LocalAudioPipeline}, constructing it on\n\t* first access. On creation the current audio sender's track is routed\n\t* through the pipeline (input → gain → analyser → destination) and the\n\t* sender is switched to emit the processed track. Returns `null` when no\n\t* audio sender exists yet (pre-negotiation).\n\t*/\n\tensureLocalAudioPipeline() {\n\t\tif (this._localAudioPipeline) return this._localAudioPipeline;\n\t\tif (!this.peerConnection) return null;\n\t\ttry {\n\t\t\tthis._localAudioPipeline = new LocalAudioPipeline();\n\t\t} catch (error) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Failed to create LocalAudioPipeline:\", error);\n\t\t\treturn null;\n\t\t}\n\t\tthis.subscribeTo(this.localStreamController.localAudioTracks$, () => {\n\t\t\tthis.applyLocalAudioPipelineToSender();\n\t\t});\n\t\tthis.applyLocalAudioPipelineToSender();\n\t\treturn this._localAudioPipeline;\n\t}\n\t/** The active LocalAudioPipeline, or null if it hasn't been created yet. */\n\tget localAudioPipeline() {\n\t\treturn this._localAudioPipeline;\n\t}\n\tasync applyLocalAudioPipelineToSender() {\n\t\tif (!this._localAudioPipeline || !this.peerConnection) return;\n\t\tconst raw = this.localStreamController.localAudioTracks.at(0);\n\t\tthis._localAudioPipeline.setInputTrack(raw ?? null);\n\t\tconst sender = (this.transceiverController?.audioTransceivers.at(0))?.sender ?? this.peerConnection.getSenders().find((s) => s.track?.kind === \"audio\");\n\t\tif (!sender || !raw) return;\n\t\ttry {\n\t\t\tawait sender.replaceTrack(this._localAudioPipeline.outputTrack);\n\t\t} catch (error) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] Failed to route audio sender through pipeline:\", error);\n\t\t}\n\t}\n\t/**\n\t* Add a local media track to the peer connection.\n\t* @param track - The MediaStreamTrack to add\n\t*/\n\taddLocalTrack(track) {\n\t\tif (!this.peerConnection) {\n\t\t\tconst error = new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\t\tthis._errors$.next(error);\n\t\t\tthrow error;\n\t\t}\n\t\ttry {\n\t\t\tconst localStream = this.localStreamController.addTrack(track);\n\t\t\tthis.peerConnection.addTrack(track, localStream);\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] ${track.kind} track added:`, track.id);\n\t\t} catch (error) {\n\t\t\tlogger$17.error(`[RTCPeerConnectionController] Failed to add ${track.kind} track:`, error);\n\t\t\tthis._errors$.next(new MediaTrackError(\"addLocalTrack\", track.kind, error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/**\n\t* Remove a local media track from the peer connection.\n\t* @param trackId - The ID of the track to remove\n\t*/\n\tremoveLocalTrack(trackId) {\n\t\tif (!this.peerConnection) {\n\t\t\tconst error = new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\t\tthis._errors$.next(error);\n\t\t\tthrow error;\n\t\t}\n\t\tconst sender = this.peerConnection.getSenders().find((sender$1) => sender$1.track?.id === trackId);\n\t\tif (!sender) {\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] track not found: ${trackId}`);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.peerConnection.removeTrack(sender);\n\t\t\tthis.localStreamController.removeTrack(trackId);\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] ${sender.track?.kind} track removed:`, trackId);\n\t\t} catch (error) {\n\t\t\tlogger$17.error(`[RTCPeerConnectionController] Failed to remove ${sender.track?.kind} track:`, error);\n\t\t\tthis._errors$.next(new MediaTrackError(\"removeLocalTrack\", sender.track?.kind ?? \"unknown\", error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/**\n\t* Replace all existing media tracks with a new media  track.\n\t* Convenience method for single-track scenarios.\n\t* @param track - The MediaStreamTrack to set\n\t*/\n\tsetLocalTrack(track) {\n\t\tconst existingTracks = [...track.kind === \"audio\" ? this.localStreamController.localAudioTracks : this.localStreamController.localVideoTracks];\n\t\tfor (const existingTrack of existingTracks) this.removeLocalTrack(existingTrack.id);\n\t\tthis.addLocalTrack(track);\n\t}\n\tasync updateSendersConstraints(kind, constraints) {\n\t\tawait this.transceiverController?.updateSendersConstraints(kind, constraints);\n\t}\n\t/**\n\t* Replace the current audio track with a new one using the given constraints.\n\t* Used for server-pushed audio constraint changes where applyConstraints\n\t* fails on iOS Safari. Stops the current track, acquires a new one via\n\t* getUserMedia, and replaces the sender track.\n\t*/\n\tasync replaceAudioTrackWithConstraints(constraints) {\n\t\tconst senders = this.peerConnection?.getSenders().filter((s) => s.track?.kind === \"audio\" && s.track.readyState === \"live\");\n\t\tif (!senders || senders.length === 0) {\n\t\t\tlogger$17.warn(\"[RTCPeerConnectionController] No live audio sender to replace\");\n\t\t\treturn;\n\t\t}\n\t\tfor (const sender of senders) {\n\t\t\tconst oldTrack = sender.track;\n\t\t\tif (!oldTrack) continue;\n\t\t\tconst { deviceId } = oldTrack.getSettings();\n\t\t\tconst mergedConstraints = {\n\t\t\t\t...oldTrack.getConstraints(),\n\t\t\t\t...constraints,\n\t\t\t\t...deviceId ? { deviceId: { exact: deviceId } } : {}\n\t\t\t};\n\t\t\tconst trackId = oldTrack.id;\n\t\t\toldTrack.stop();\n\t\t\tthis.localStreamController.removeTrack(trackId);\n\t\t\tconst newTrack = (await this.getUserMedia({ audio: mergedConstraints })).getAudioTracks()[0];\n\t\t\tawait sender.replaceTrack(newTrack);\n\t\t\tthis.localStreamController.addTrack(newTrack);\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Audio track replaced for server-pushed params. New track: ${newTrack.id}`);\n\t\t}\n\t}\n\t/**\n\t* Clean up resources and close the peer connection.\n\t* Completes all observables to prevent memory leaks.\n\t*/\n\tdestroy() {\n\t\tlogger$17.debug(`[RTCPeerConnectionController] Destroying RTCPeerConnectionController. ${this.propose}`);\n\t\tthis.removeConnectionTimer();\n\t\tthis._iceGatheringController?.destroy();\n\t\tthis._localAudioPipeline?.destroy();\n\t\tthis._localAudioPipeline = null;\n\t\tthis.localStreamController.destroy();\n\t\tthis.transceiverController?.destroy();\n\t\tif (this.peerConnection) {\n\t\t\tthis.stopRemoteTracks();\n\t\t\tthis.removeAllListeners();\n\t\t\tthis.peerConnection.close();\n\t\t\tthis.peerConnection = void 0;\n\t\t}\n\t\tsuper.destroy();\n\t}\n\tremoveAllListeners() {\n\t\tif (this.peerConnection) {\n\t\t\tthis.peerConnection.removeEventListener(\"icegatheringstatechange\", this.onicegatheringstatechangeHandler);\n\t\t\tthis.peerConnection.removeEventListener(\"iceconnectionstatechange\", this.oniceconnectionstatechangeHandler);\n\t\t\tthis.peerConnection.removeEventListener(\"connectionstatechange\", this.onconnectionstatechangeHandler);\n\t\t\tthis.peerConnection.removeEventListener(\"signalingstatechange\", this.onsignalingstatechangeHandler);\n\t\t\tthis.peerConnection.removeEventListener(\"negotiationneeded\", this.onnegotiationneededHandler);\n\t\t}\n\t}\n\tstopRemoteTracks() {\n\t\tthis._remoteStream$.value?.getTracks().forEach((track) => {\n\t\t\tlogger$17.debug(`[RTCPeerConnectionController] Stopping remote track: ${track.kind}`);\n\t\t\ttrack.stop();\n\t\t});\n\t}\n\tget mediaDirections() {\n\t\treturn this.transceiverController?.getMediaDirections() ?? this._remoteOfferMediaDirections ?? {\n\t\t\taudio: \"inactive\",\n\t\t\tvideo: \"inactive\"\n\t\t};\n\t}\n\tasync _setRemoteDescription(params) {\n\t\tif (!this.peerConnection) throw new DependencyError(\"RTCPeerConnection is not initialized\");\n\t\tconst finalRemote = await this.setRemoteDescriptionBefore(params.sdp);\n\t\tconst answer = {\n\t\t\t...params,\n\t\t\tsdp: finalRemote\n\t\t};\n\t\tlogger$17.debug(\"[RTCPeerConnectionController] Setting remote description:\", answer);\n\t\treturn this.peerConnection.setRemoteDescription(answer);\n\t}\n};\n\n//#endregion\n//#region src/core/RPCMessages/guards/verto.guards.ts\nfunction isVertoMethodMessage(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"id\");\n}\nfunction isVertoInviteMessage(value) {\n\tif (!isVertoMethodMessage(value)) return false;\n\tconst msg = value;\n\treturn msg.method === \"verto.invite\" && isObject(msg.params) && hasProperty(msg.params, \"sdp\") && hasProperty(msg.params, \"callID\");\n}\n/**\n* Guards inbound `verto.bye` frames (server → client). Outbound bye messages are\n* built locally and never type-guarded, so only the inbound shape is asserted.\n*/\nfunction isVertoByeInboundMessage(value) {\n\tif (!isVertoMethodMessage(value)) return false;\n\treturn value.method === \"verto.bye\";\n}\nfunction isVertoAttachMessage(value) {\n\tif (!isVertoMethodMessage(value)) return false;\n\treturn value.method === \"verto.attach\";\n}\nfunction isVertoAnswerInnerParams(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"method\") && value.method === \"verto.answer\" && isObject(value.params) && hasProperty(value.params, \"callID\");\n}\nfunction isVertoMediaInnerParams(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"method\") && value.method === \"verto.media\" && isObject(value.params) && hasProperty(value.params, \"callID\") && hasProperty(value.params, \"sdp\");\n}\nfunction isVertoMediaParamsInnerParams(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"method\") && value.method === \"verto.mediaParams\" && isObject(value.params) && hasProperty(value.params, \"mediaParams\");\n}\nfunction isVertoPingInnerParams(value) {\n\treturn isObject(value) && hasProperty(value, \"jsonrpc\") && value.jsonrpc === \"2.0\" && hasProperty(value, \"method\") && value.method === \"verto.ping\";\n}\n/**\n* Guards the params of an inbound `verto.bye` frame (top-level `callID`). Use\n* this to recognise the bye payload extracted by `vertoBye$`, e.g. when racing\n* it against a boolean answer/reject signal.\n*/\nfunction isVertoByeInboundParamsGuard(value) {\n\treturn isObject(value) && hasProperty(value, \"callID\") && typeof value.callID === \"string\";\n}\n\n//#endregion\n//#region src/managers/VertoManager.ts\nconst logger$16 = getLogger();\n/**\n* Decide what value goes on the `node_id` field of a `webrtc.verto` envelope.\n*\n* - **Reattach invite:** must carry the persisted nodeId so the server routes\n*   the new connection to the FreeSWITCH instance that holds the existing call.\n* - **Fresh invite, caller-supplied `CallOptions.nodeId`:** carry the explicit\n*   value as a steering hint (dev/staging traffic pinning). Server may honour\n*   or ignore for placement reasons.\n* - **Fresh invite, no caller nodeId:** strip to `''` = \"server picks\".\n* - **Non-invite frames** (verto.modify, verto.bye, etc.): always carry the\n*   current `_nodeId$.value` so the frame targets the node hosting the call.\n*\n* Pure function — exported for unit testing.\n*/\nfunction resolveInviteNodeId(args) {\n\treturn args.isInvite && !args.reattach && !args.explicitNodeId ? \"\" : args.currentNodeId ?? \"\";\n}\nvar VertoManager = class extends Destroyable {\n\tconstructor(callSession) {\n\t\tsuper();\n\t\tthis.callSession = callSession;\n\t}\n\tdestroy() {\n\t\tthis.callSession = void 0;\n\t\tsuper.destroy();\n\t}\n};\nvar WebRTCVertoManager = class extends VertoManager {\n\tconstructor(webRtcCallSession, attachManager, deviceController, webRTCApiProvider, options = {}) {\n\t\tsuper(webRtcCallSession);\n\t\tthis.webRtcCallSession = webRtcCallSession;\n\t\tthis.attachManager = attachManager;\n\t\tthis.deviceController = deviceController;\n\t\tthis.webRTCApiProvider = webRTCApiProvider;\n\t\tthis._rtcPeerConnections$ = this.createBehaviorSubject([]);\n\t\tthis._selfId$ = this.createBehaviorSubject(null);\n\t\tthis._signalingStatus$ = this.createReplaySubject(1);\n\t\tthis._screenShareStatus$ = this.createBehaviorSubject(\"none\");\n\t\tthis._rtcPeerConnectionsMap = /* @__PURE__ */ new Map();\n\t\tthis._screenShareTimeoutMs = 5e4;\n\t\tthis._nodeId$ = this.createBehaviorSubject(options.nodeId ?? null);\n\t\tthis.onError = options.onError;\n\t\tthis.onModifyFailed = options.onModifyFailed;\n\t\tthis.initSubscriptions();\n\t\tthis.initMainPeerConnection();\n\t}\n\tasync hold() {\n\t\tconst vertoModifyMessage = VertoModify({\n\t\t\tsessid: this.webRtcCallSession.id,\n\t\t\tdialogParams: { callID: this.webRtcCallSession.id },\n\t\t\taction: \"hold\"\n\t\t});\n\t\ttry {\n\t\t\tawait this.executeVerto(vertoModifyMessage);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Call might already be disconnected, error sending Verto hold:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync unhold() {\n\t\tconst vertoModifyMessage = VertoModify({\n\t\t\tsessid: this.webRtcCallSession.id,\n\t\t\tdialogParams: { callID: this.webRtcCallSession.id },\n\t\t\taction: \"unhold\"\n\t\t});\n\t\ttry {\n\t\t\tawait this.executeVerto(vertoModifyMessage);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Call might already be disconnected, error sending Verto unhold:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tget mediaDirections() {\n\t\treturn this.mainPeerConnection.mediaDirections;\n\t}\n\tget rtcPeerConnections$() {\n\t\treturn this._rtcPeerConnections$.asObservable();\n\t}\n\tget rtcPeerConnections() {\n\t\treturn this._rtcPeerConnections$.value;\n\t}\n\tget nodeId$() {\n\t\treturn this._nodeId$.asObservable();\n\t}\n\tget selfId$() {\n\t\treturn this._selfId$.asObservable();\n\t}\n\tget localStream() {\n\t\treturn this._rtcPeerConnectionsMap.get(this.webRtcCallSession.id)?.localStream ?? null;\n\t}\n\tget remoteStream() {\n\t\treturn this._rtcPeerConnectionsMap.get(this.webRtcCallSession.id)?.remoteStream ?? null;\n\t}\n\tget nodeId() {\n\t\treturn this._nodeId$.value;\n\t}\n\tget screenShareStatus() {\n\t\treturn this._screenShareStatus$.value;\n\t}\n\tget screenShareStatus$() {\n\t\treturn this._screenShareStatus$.asObservable();\n\t}\n\tget mainPeerConnection() {\n\t\tconst rtcPeerConnection = this._rtcPeerConnectionsMap.get(this.webRtcCallSession.id);\n\t\tif (!rtcPeerConnection) throw new DependencyError(\"Main peer connection not found\");\n\t\treturn rtcPeerConnection;\n\t}\n\tget signalingStatus$() {\n\t\treturn this.cachedObservable(\"signalingStatus$\", () => merge(this._signalingStatus$.asObservable(), this.mainPeerConnection.connectionState$.pipe(filter((connectionState) => [\n\t\t\t\"connected\",\n\t\t\t\"disconnected\",\n\t\t\t\"failed\"\n\t\t].includes(connectionState)))));\n\t}\n\tinitSubscriptions() {\n\t\tthis.subscribeTo(this.callJoinedEvent$, (event) => {\n\t\t\tconst memberNodeId = event.room_session.members.find((m) => m.call_id === event.call_id)?.node_id;\n\t\t\tif (memberNodeId) this.setNodeIdIfNull(memberNodeId);\n\t\t\tif (event.member_id) this.setSelfIdIfNull(event.member_id);\n\t\t});\n\t\tthis.subscribeTo(this.vertoMedia$, (event) => {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Received Verto media event (early media SDP):\", event);\n\t\t\tconst { sdp, callID } = event;\n\t\t\tthis.emitMainSignalingStatus(callID, \"ringing\");\n\t\t\tthis._rtcPeerConnectionsMap.get(callID)?.updateAnswerStatus({\n\t\t\t\tstatus: \"received\",\n\t\t\t\tsdp\n\t\t\t});\n\t\t});\n\t\tthis.subscribeTo(this.vertoAnswer$, (event) => {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Received Verto answer event:\", event);\n\t\t\tconst { sdp, callID } = event;\n\t\t\tthis.emitMainSignalingStatus(callID, \"connecting\");\n\t\t\tthis._rtcPeerConnectionsMap.get(callID)?.updateAnswerStatus({\n\t\t\t\tstatus: \"received\",\n\t\t\t\tsdp\n\t\t\t});\n\t\t});\n\t\tthis.subscribeTo(this.vertoMediaParams$, (event) => {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Received Verto mediaParams event:\", event);\n\t\t\tconst { mediaParams, callID } = event;\n\t\t\tconst rtcPeerConnController = this._rtcPeerConnectionsMap.get(callID);\n\t\t\tconst { audio, video } = mediaParams;\n\t\t\t(async () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (audio && rtcPeerConnController) await rtcPeerConnController.replaceAudioTrackWithConstraints(audio);\n\t\t\t\t\tif (video) await rtcPeerConnController?.updateSendersConstraints(\"video\", video);\n\t\t\t\t\tthis.webRtcCallSession.emitMediaParamsUpdated({\n\t\t\t\t\t\taudio,\n\t\t\t\t\t\tvideo,\n\t\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger$16.warn(\"[WebRTCManager] Error applying server-pushed media params:\", error);\n\t\t\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t\t}\n\t\t\t})();\n\t\t});\n\t\tthis.subscribeTo(this.vertoPing$, (vertoPing) => {\n\t\t\tthis.attachManager.attach(this.buildAttachableCall());\n\t\t\tthis.sendVertoPong(vertoPing);\n\t\t});\n\t}\n\t/**\n\t* Set node_id/selfId only when the current value is null.\n\t*\n\t* During reattach, `call.joined` and `verto.answer` events can deliver\n\t* these identifiers before the `verto.invite` RPC response (`CALL CREATED`)\n\t* arrives. These methods let early events populate them eagerly so that\n\t* downstream RPC calls (e.g. `call.layout.list`) don't fail with empty\n\t* identifiers. `processInviteResponse()` remains the authoritative source\n\t* and always overwrites unconditionally.\n\t*/\n\tsetNodeIdIfNull(nodeId) {\n\t\tif (!this._nodeId$.value && nodeId) {\n\t\t\tlogger$16.debug(`[WebRTCManager] Early node_id set: ${nodeId}`);\n\t\t\tthis._nodeId$.next(nodeId);\n\t\t}\n\t}\n\tsetSelfIdIfNull(selfId) {\n\t\tif (!this._selfId$.value && selfId) {\n\t\t\tlogger$16.debug(`[WebRTCManager] Early selfId set: ${selfId}`);\n\t\t\tthis._selfId$.next(selfId);\n\t\t}\n\t}\n\tasync sendVertoPong(vertoPing) {\n\t\ttry {\n\t\t\tconst vertoPongMessage = VertoPong({ ...vertoPing });\n\t\t\tawait this.executeVerto(vertoPongMessage);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Call might disconnect, error sending Verto pong:\", error);\n\t\t\tthis.onError?.(new VertoPongError(error));\n\t\t}\n\t}\n\tasync updateMediaConstraints(options = {}) {\n\t\tconst { audio, video } = options;\n\t\ttry {\n\t\t\tif (audio) await this.mainPeerConnection.updateSendersConstraints(\"audio\", audio);\n\t\t\tif (video) await this.mainPeerConnection.updateSendersConstraints(\"video\", video);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Error updating media constraints:\", error);\n\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\tthrow error;\n\t\t}\n\t}\n\tget selfId() {\n\t\treturn this._selfId$.value;\n\t}\n\t/** Build an AttachableCall from the current call state. */\n\tbuildAttachableCall(idOverride) {\n\t\treturn {\n\t\t\tnodeId: this.nodeId ?? void 0,\n\t\t\tid: idOverride ?? this.webRtcCallSession.id,\n\t\t\tto: this.webRtcCallSession.to,\n\t\t\tmediaDirections: this.webRtcCallSession.mediaDirections\n\t\t};\n\t}\n\t/**\n\t* Request a video keyframe via RTCP PLI/FIR.\n\t*\n\t* Uses RTCRtpReceiver.requestKeyFrame() (Chrome 124+) to send a\n\t* Picture Loss Indication to the remote sender. This is a client-side\n\t* WebRTC operation — no server RPC is needed.\n\t*\n\t* Best-effort: logs a warning on failure, never emits on errors$.\n\t*/\n\trequestKeyframe() {\n\t\ttry {\n\t\t\tconst pc = this.mainPeerConnection.peerConnection;\n\t\t\tif (!pc) {\n\t\t\t\tlogger$16.warn(\"[WebRTCManager] No peer connection for keyframe request\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst videoReceiver = pc.getReceivers().find((r) => r.track.kind === \"video\");\n\t\t\tif (!videoReceiver) {\n\t\t\t\tlogger$16.warn(\"[WebRTCManager] No video receiver for keyframe request\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (typeof videoReceiver.requestKeyFrame === \"function\") {\n\t\t\t\tvideoReceiver.requestKeyFrame();\n\t\t\t\tlogger$16.debug(\"[WebRTCManager] Keyframe requested via RTCRtpReceiver.requestKeyFrame()\");\n\t\t\t} else logger$16.debug(\"[WebRTCManager] requestKeyFrame() not supported, skipping\");\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Keyframe request failed (non-fatal):\", error);\n\t\t}\n\t}\n\t/**\n\t* Request an ICE restart via the controller's negotiation pipeline.\n\t*\n\t* Triggers an ICE restart offer on the controller, which goes through the\n\t* full SDP pipeline: createOffer → setLocalDescription → ICE gathering →\n\t* localDescription$ emission → setupLocalDescriptionHandler sends verto.modify.\n\t*\n\t* This ensures the SDP sent to the server has fully gathered ICE candidates,\n\t* real ports/IPs, and any configured SDP munging applied — matching the\n\t* same pipeline used for the initial verto.invite.\n\t*/\n\tasync requestIceRestart(relayOnly) {\n\t\ttry {\n\t\t\tconst controller = this.mainPeerConnection;\n\t\t\tif (!controller.peerConnection) {\n\t\t\t\tlogger$16.warn(\"[WebRTCManager] No peer connection for ICE restart\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait controller.triggerIceRestart(relayOnly);\n\t\t\tlogger$16.info(`[WebRTCManager] ICE restart initiated${relayOnly ? \" (relay-only)\" : \"\"}`);\n\t\t} catch (error) {\n\t\t\tlogger$16.error(\"[WebRTCManager] ICE restart failed:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/**\n\t* Request an ICE restart on ALL active peer connections (main + additional legs).\n\t*\n\t* Screen share and additional device legs each get their own ICE restart\n\t* via the controller's negotiation pipeline. The SDP flows through\n\t* localDescription$ → setupLocalDescriptionHandler → verto.modify,\n\t* ensuring ICE gathering completes before the offer is sent.\n\t*\n\t* @param relayOnly - If true, constrain to TURN relay candidates only (Tier 3).\n\t*/\n\tasync requestIceRestartAll(relayOnly) {\n\t\tconst entries = Array.from(this._rtcPeerConnectionsMap.entries());\n\t\tfor (const [id, controller] of entries) try {\n\t\t\tif (!controller.peerConnection) {\n\t\t\t\tlogger$16.debug(`[WebRTCManager] No peer connection for leg ${id}, skipping ICE restart`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait controller.triggerIceRestart(relayOnly);\n\t\t\tlogger$16.info(`[WebRTCManager] ICE restart initiated for leg ${id}${relayOnly ? \" (relay-only)\" : \"\"}`);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(`[WebRTCManager] ICE restart failed for leg ${id}:`, error);\n\t\t}\n\t}\n\t/**\n\t* Request a keyframe on video-receiving legs only.\n\t*\n\t* Screen share legs are send-only (getDisplayMedia) so they have no\n\t* video receiver to request a keyframe from — they are skipped.\n\t*/\n\trequestKeyframeAll() {\n\t\tfor (const [id, controller] of this._rtcPeerConnectionsMap) {\n\t\t\tif (controller.isScreenShare) {\n\t\t\t\tlogger$16.debug(`[WebRTCManager] Skipping keyframe for send-only screen share leg ${id}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst pc = controller.peerConnection;\n\t\t\t\tif (!pc) continue;\n\t\t\t\tconst videoReceiver = pc.getReceivers().find((r) => r.track.kind === \"video\");\n\t\t\t\tif (!videoReceiver) continue;\n\t\t\t\tif (typeof videoReceiver.requestKeyFrame === \"function\") {\n\t\t\t\t\tvideoReceiver.requestKeyFrame();\n\t\t\t\t\tlogger$16.debug(`[WebRTCManager] Keyframe requested for leg ${id}`);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tlogger$16.warn(`[WebRTCManager] Keyframe request failed for leg ${id} (non-fatal):`, error);\n\t\t\t}\n\t\t}\n\t}\n\tget callJoinedEvent$() {\n\t\treturn this.webRtcCallSession.callEvent$.pipe(filter(isCallJoinedPayload), takeUntil(this.destroyed$));\n\t}\n\tget vertoMedia$() {\n\t\treturn this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoMediaInnerParams, \"params\"), takeUntil(this.destroyed$));\n\t}\n\tget vertoAnswer$() {\n\t\treturn this.cachedObservable(\"vertoAnswer$\", () => this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoAnswerInnerParams, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\tget vertoMediaParams$() {\n\t\treturn this.cachedObservable(\"vertoMediaParams$\", () => this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoMediaParamsInnerParams, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\tget vertoBye$() {\n\t\treturn this.cachedObservable(\"vertoBye$\", () => this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoByeInboundMessage, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\tget vertoAttach$() {\n\t\treturn this.cachedObservable(\"vertoAttach$\", () => this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoAttachMessage, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\tget vertoPing$() {\n\t\treturn this.cachedObservable(\"vertoPing$\", () => this.webRtcCallSession.webrtcMessages$.pipe(filterAs(isVertoPingInnerParams, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\tasync executeVerto(message, optionals = {}) {\n\t\tconst webrtcVertoMessage = WebrtcVerto({\n\t\t\tcallID: optionals.callID ?? this.webRtcCallSession.id,\n\t\t\tnode_id: optionals.node_id ?? this._nodeId$.value ?? \"\",\n\t\t\tmessage,\n\t\t\tsubscribe: optionals.subscribe\n\t\t});\n\t\tconst response = await this.webRtcCallSession.execute(webrtcVertoMessage);\n\t\tif (response.error) {\n\t\t\tconst error = new JSONRPCError(response.error.code, response.error.message, response.error.data);\n\t\t\tthis.onError?.(error);\n\t\t\treturn response;\n\t\t}\n\t\tconst innerResult = getValueFrom(response, \"result.result\");\n\t\tif (innerResult?.error) {\n\t\t\tconst error = new JSONRPCError(innerResult.error.code, innerResult.error.message, innerResult.error.data);\n\t\t\tthis.onError?.(error);\n\t\t\treturn response;\n\t\t}\n\t\treturn response;\n\t}\n\tasync sendLocalDescription(message, rtcPeerConnController) {\n\t\tconst vertoMethod = message.method;\n\t\tconst optionalsParams = this.getSendLocalSDPOptionalParams(rtcPeerConnController, message);\n\t\ttry {\n\t\t\tconst response = await this.executeVerto(message, optionalsParams);\n\t\t\tswitch (vertoMethod) {\n\t\t\t\tcase \"verto.invite\":\n\t\t\t\t\tthis.processInviteResponse(response, rtcPeerConnController);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"verto.modify\":\n\t\t\t\t\tawait this.processModifyResponse(response, rtcPeerConnController);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$16.error(`[WebRTCManager] Error sending Verto ${vertoMethod}:`, error);\n\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\tif (vertoMethod === \"verto.modify\") this.onModifyFailed?.();\n\t\t}\n\t}\n\tasync processModifyResponse(response, rtcPeerConnController) {\n\t\tif (!response.error) {\n\t\t\tconst action = getValueFrom(response, \"result.result.result.action\");\n\t\t\tconst sdp = getValueFrom(response, \"result.result.result.sdp\");\n\t\t\tif (action === \"updateMedia\" && !!sdp) try {\n\t\t\t\tawait rtcPeerConnController.updateAnswerStatus({\n\t\t\t\t\tstatus: \"received\",\n\t\t\t\t\tsdp\n\t\t\t\t});\n\t\t\t} catch (error) {\n\t\t\t\tlogger$16.warn(\"[WebRTCManager] Error processing modify response:\", error);\n\t\t\t\tconst modifyError = error instanceof Error ? error : new Error(String(error), { cause: error });\n\t\t\t\tthis.onError?.(modifyError);\n\t\t\t}\n\t\t}\n\t}\n\temitMainSignalingStatus(callId, status) {\n\t\tconst rtcPeerConnController = this._rtcPeerConnectionsMap.get(callId);\n\t\tif (!rtcPeerConnController) {\n\t\t\tconst signalingError = new DependencyError(`Cannot emit signaling status, RTCPeerConnectionController not found for callID: ${callId}`);\n\t\t\tlogger$16.error(\"[WebRTCManager] Failed to emit signaling status:\", {\n\t\t\t\tcallId,\n\t\t\t\tstatus,\n\t\t\t\tsignalingError\n\t\t\t});\n\t\t\tthis.onError?.(signalingError);\n\t\t\treturn;\n\t\t}\n\t\tif (rtcPeerConnController.isMainDevice) this._signalingStatus$.next(status);\n\t}\n\tprocessInviteResponse(response, rtcPeerConnController) {\n\t\tif (!response.error && getValueFrom(response, \"result.result.result.message\") === \"CALL CREATED\") {\n\t\t\tthis.emitMainSignalingStatus(rtcPeerConnController.id, \"trying\");\n\t\t\tthis._nodeId$.next(getValueFrom(response, \"result.node_id\") ?? null);\n\t\t\tconst memberId = getValueFrom(response, \"result.result.result.memberID\") ?? null;\n\t\t\tconst callId = getValueFrom(response, \"result.result.result.callID\") ?? null;\n\t\t\tlogger$16.debug(\"[WebRTCManager] Verto invite response:\", {\n\t\t\t\tcallId,\n\t\t\t\tmemberId,\n\t\t\t\tresponse\n\t\t\t});\n\t\t\tthis._selfId$.next(memberId);\n\t\t\trtcPeerConnController.setMemberId(memberId);\n\t\t\tif (callId) {\n\t\t\t\tthis.webRtcCallSession.addCallId(callId);\n\t\t\t\tthis.attachManager.attach(this.buildAttachableCall(callId));\n\t\t\t} else logger$16.warn(\"[WebRTCManager] Cannot attach call, missing callId:\", {\n\t\t\t\tnodeId: this.nodeId,\n\t\t\t\tcallId\n\t\t\t});\n\t\t\tlogger$16.info(\"[WebRTCManager] Verto invite successful\");\n\t\t\tlogger$16.debug(`[WebRTCManager] nodeid: ${this._nodeId$.value}, selfId: ${this._selfId$.value}`);\n\t\t} else {\n\t\t\tlogger$16.error(\"[WebRTCManager] Verto invite failed:\", response);\n\t\t\tconst inviteError = response.error ? new JSONRPCError(response.error.code, response.error.message, response.error.data) : /* @__PURE__ */ new Error(\"Verto invite failed: unexpected response\");\n\t\t\tthis.onError?.(inviteError);\n\t\t}\n\t}\n\tget RTCPeerConnectionConfig() {\n\t\treturn {\n\t\t\ticeServers: this.webRtcCallSession.clientSession.iceServers ?? PreferencesContainer.instance.iceServers,\n\t\t\trelayOnly: PreferencesContainer.instance.relayOnly || PreferencesContainer.instance.disableUdpIceServers,\n\t\t\tdisableUdpIceServers: PreferencesContainer.instance.disableUdpIceServers,\n\t\t\ticeCandidateTimeout: PreferencesContainer.instance.iceCandidateTimeout,\n\t\t\ticeGatheringTimeout: PreferencesContainer.instance.iceGatheringTimeout\n\t\t};\n\t}\n\tinitMainPeerConnection() {\n\t\tconst { options } = this.webRtcCallSession;\n\t\tconst rtcPeerConnController = new RTCPeerConnectionController({\n\t\t\tpropose: \"main\",\n\t\t\tcallId: this.webRtcCallSession.id,\n\t\t\taudio: options.audio,\n\t\t\tvideo: options.video,\n\t\t\tinputAudioDeviceConstraints: options.inputAudioDeviceConstraints,\n\t\t\tinputVideoDeviceConstraints: options.inputVideoDeviceConstraints,\n\t\t\tinputAudioStream: options.inputAudioStream,\n\t\t\tinputVideoStream: options.inputVideoStream,\n\t\t\treceiveAudio: options.receiveAudio,\n\t\t\treceiveVideo: options.receiveVideo,\n\t\t\tfallbackToReceiveOnly: options.fallbackToReceiveOnly,\n\t\t\twebRTCApiProvider: this.webRTCApiProvider,\n\t\t\tpreferredVideoCodecs: options.preferredVideoCodecs,\n\t\t\tpreferredAudioCodecs: options.preferredAudioCodecs,\n\t\t\tstereo: options.stereo,\n\t\t\t...this.RTCPeerConnectionConfig\n\t\t}, options.initOffer, this.deviceController);\n\t\tthis.setupLocalDescriptionHandler(rtcPeerConnController);\n\t\tthis.setupVertoByeHandler();\n\t\tthis.setupVertoAttachHandler();\n\t\tthis.initObservables(rtcPeerConnController);\n\t\tthis._rtcPeerConnectionsMap.set(rtcPeerConnController.id, rtcPeerConnController);\n\t\tthis._rtcPeerConnections$.next(Array.from(this._rtcPeerConnectionsMap.values()));\n\t\tthis.subscribeTo(rtcPeerConnController.errors$, (error) => {\n\t\t\tthis.onError?.(error);\n\t\t});\n\t\tif (options.initOffer) this.handleInboundAnswer(rtcPeerConnController);\n\t}\n\tasync handleInboundAnswer(rtcPeerConnController) {\n\t\tlogger$16.debug(\"[WebRTCManager] Waiting for inbound call to be accepted or rejected\");\n\t\tconst vertoByeOrAccepted = await firstValueFrom(race(this.vertoBye$, this.webRtcCallSession.answered$).pipe(takeUntil(this.destroyed$))).catch(() => null);\n\t\tif (vertoByeOrAccepted === null) {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Inbound answer handler aborted (destroyed).\");\n\t\t\treturn;\n\t\t}\n\t\tif (isVertoByeInboundParamsGuard(vertoByeOrAccepted)) {\n\t\t\tlogger$16.info(\"[WebRTCManager] Inbound call ended by remote before answer.\");\n\t\t\tthis.callSession?.destroy();\n\t\t} else if (!vertoByeOrAccepted) {\n\t\t\tlogger$16.info(\"[WebRTCManager] Inbound call rejected by user.\");\n\t\t\ttry {\n\t\t\t\tawait this.bye(\"USER_BUSY\");\n\t\t\t} finally {\n\t\t\t\tthis._signalingStatus$.next(\"disconnected\");\n\t\t\t\tthis.callSession?.destroy();\n\t\t\t}\n\t\t} else {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Inbound call accepted, creating SDP answer\");\n\t\t\tconst answerOptions = this.webRtcCallSession.answerMediaOptions;\n\t\t\ttry {\n\t\t\t\tawait rtcPeerConnController.acceptInbound(answerOptions);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$16.error(\"[WebRTCManager] Error creating inbound answer:\", error);\n\t\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t}\n\t\t}\n\t}\n\tsetupVertoAttachHandler() {\n\t\tthis.subscribeTo(this.vertoAttach$, async (vertoAttach) => {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Received Verto attach event for existing call:\", vertoAttach);\n\t\t\tconst { callID } = vertoAttach;\n\t\t\tawait this.attachManager.attach({\n\t\t\t\tnodeId: this.nodeId ?? void 0,\n\t\t\t\tid: callID,\n\t\t\t\tto: vertoAttach.callee_id_number,\n\t\t\t\tmediaDirections: {\n\t\t\t\t\taudio: \"sendrecv\",\n\t\t\t\t\tvideo: \"inactive\"\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\tinitObservables(rtcPeerConnController) {\n\t\tthis.mediaDirections$ = rtcPeerConnController.connectionState$.pipe(filter((state) => state === \"connected\"), map(() => rtcPeerConnController.mediaDirections), startWith(rtcPeerConnController.mediaDirections), takeUntil(this.destroyed$));\n\t\tthis.localStream$ = rtcPeerConnController.localStream$.pipe(filterNull(), takeUntil(this.destroyed$));\n\t\tthis.remoteStream$ = rtcPeerConnController.remoteStream$.pipe(filterNull(), takeUntil(this.destroyed$));\n\t}\n\tsetupLocalDescriptionHandler(rtcPeerConnController) {\n\t\tthis.subscribeTo(rtcPeerConnController.localDescription$.pipe(filter((description) => description !== null), takeUntil(this.destroyed$)), (description) => {\n\t\t\tconst { type, sdp } = description;\n\t\t\tconst dialogParams = this.dialogParams(rtcPeerConnController);\n\t\t\tconst initial = !rtcPeerConnController.firstSDPExchangeCompleted;\n\t\t\tif (type === \"answer\") {\n\t\t\t\tconst vertoMessageRequest = VertoAnswer({\n\t\t\t\t\tdialogParams,\n\t\t\t\t\tsdp\n\t\t\t\t});\n\t\t\t\tthis.sendLocalDescriptionOnceAccepted(vertoMessageRequest, rtcPeerConnController);\n\t\t\t} else if (initial) {\n\t\t\t\tconst vertoMessageRequest = VertoInvite({\n\t\t\t\t\tdialogParams,\n\t\t\t\t\tsdp\n\t\t\t\t});\n\t\t\t\tthis.sendLocalDescription(vertoMessageRequest, rtcPeerConnController);\n\t\t\t} else {\n\t\t\t\tconst vertoMessageRequest = VertoModify({\n\t\t\t\t\tdialogParams,\n\t\t\t\t\tsdp,\n\t\t\t\t\taction: \"updateMedia\"\n\t\t\t\t});\n\t\t\t\tthis.sendLocalDescription(vertoMessageRequest, rtcPeerConnController);\n\t\t\t}\n\t\t});\n\t}\n\tsetupVertoByeHandler() {\n\t\tthis.subscribeTo(this.vertoBye$, () => {\n\t\t\tthis._signalingStatus$.next(\"disconnected\");\n\t\t\tthis.attachManager.detach(this.buildAttachableCall());\n\t\t\tthis.callSession?.destroy();\n\t\t});\n\t}\n\tgetSendLocalSDPOptionalParams(rtcPeerConnController, vertoMessage) {\n\t\tlet subscribe = void 0;\n\t\tif (!rtcPeerConnController.firstSDPExchangeCompleted) {\n\t\t\tsubscribe = [];\n\t\t\tif (rtcPeerConnController.isMainDevice) subscribe.push(...PreferencesContainer.instance.inviteSubscribeMainDevice);\n\t\t\telse if (rtcPeerConnController.isAdditionalDevice) subscribe.push(...PreferencesContainer.instance.inviteSubscribeAdditionalDevice);\n\t\t\telse if (rtcPeerConnController.isScreenShare) subscribe.push(...PreferencesContainer.instance.inviteSubscribeScreenshare);\n\t\t}\n\t\treturn {\n\t\t\tcallID: rtcPeerConnController.id,\n\t\t\tnode_id: resolveInviteNodeId({\n\t\t\t\tisInvite: isVertoInviteMessage(vertoMessage),\n\t\t\t\treattach: this.webRtcCallSession.options.reattach === true,\n\t\t\t\texplicitNodeId: this.webRtcCallSession.options.nodeId,\n\t\t\t\tcurrentNodeId: this._nodeId$.value\n\t\t\t}),\n\t\t\tsubscribe\n\t\t};\n\t}\n\tasync sendLocalDescriptionOnceAccepted(vertoMessageRequest, rtcPeerConnectionController) {\n\t\tlogger$16.debug(\"[WebRTCManager] Waiting for call to be accepted or ended before sending answer\");\n\t\tconst vertoByeOrAccepted = await firstValueFrom(race(this.vertoBye$, this.webRtcCallSession.answered$).pipe(takeUntil(this.destroyed$))).catch(() => null);\n\t\tif (vertoByeOrAccepted === null) {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Destroyed while waiting for call acceptance\");\n\t\t\treturn;\n\t\t}\n\t\tif (isVertoByeInboundParamsGuard(vertoByeOrAccepted)) {\n\t\t\tlogger$16.info(\"[WebRTCManager] Call ended before answer was sent.\");\n\t\t\tthis.callSession?.destroy();\n\t\t} else if (!vertoByeOrAccepted) {\n\t\t\tlogger$16.info(\"[WebRTCManager] Call was not accepted, sending verto.bye.\");\n\t\t\ttry {\n\t\t\t\tawait this.bye(\"USER_BUSY\");\n\t\t\t} finally {\n\t\t\t\tthis._signalingStatus$.next(\"disconnected\");\n\t\t\t\tthis.callSession?.destroy();\n\t\t\t}\n\t\t} else {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Call accepted, sending answer\");\n\t\t\ttry {\n\t\t\t\tthis.emitMainSignalingStatus(rtcPeerConnectionController.id, \"connecting\");\n\t\t\t\tawait this.sendLocalDescription(vertoMessageRequest, rtcPeerConnectionController);\n\t\t\t\tawait rtcPeerConnectionController.updateAnswerStatus({ status: \"sent\" });\n\t\t\t\tawait this.attachManager.attach(this.buildAttachableCall());\n\t\t\t} catch (error) {\n\t\t\t\tlogger$16.error(\"[WebRTCManager] Error sending Verto answer:\", error);\n\t\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t\tawait rtcPeerConnectionController.updateAnswerStatus({ status: \"failed\" });\n\t\t\t}\n\t\t}\n\t}\n\tdialogParams(rtcPeerConnectionController) {\n\t\tconst memberId = rtcPeerConnectionController.memberId ?? this._selfId$.value ?? void 0;\n\t\tconst attach = rtcPeerConnectionController.propose === \"main\" && !rtcPeerConnectionController.firstSDPExchangeCompleted && this.webRtcCallSession.options.reattach;\n\t\treturn {\n\t\t\tid: rtcPeerConnectionController.isMainDevice ? this.webRtcCallSession.id : rtcPeerConnectionController.id,\n\t\t\tdestinationNumber: this.webRtcCallSession.to ?? this.webRtcCallSession.from,\n\t\t\tattach,\n\t\t\treattaching: attach,\n\t\t\tcallerName: this.webRtcCallSession.fromName,\n\t\t\tcallerNumber: this.webRtcCallSession.from,\n\t\t\tremoteCallerName: this.webRtcCallSession.toName,\n\t\t\tremoteCallerNumber: this.webRtcCallSession.to,\n\t\t\tuserVariables: {\n\t\t\t\tmemberCallId: this.webRtcCallSession.id,\n\t\t\t\tmemberId,\n\t\t\t\t...this.webRtcCallSession.userVariables\n\t\t\t},\n\t\t\tscreenShare: rtcPeerConnectionController.isScreenShare,\n\t\t\tadditionalDevice: rtcPeerConnectionController.isAdditionalDevice,\n\t\t\tpingSupported: true,\n\t\t\tversion: INVITE_VERSION\n\t\t};\n\t}\n\tmuteMainAudioInputDevice() {\n\t\treturn this.mainPeerConnection.stopTrackSender(\"audio\");\n\t}\n\tmuteMainVideoInputDevice() {\n\t\treturn this.mainPeerConnection.stopTrackSender(\"video\");\n\t}\n\tasync unmuteMainAudioInputDevice() {\n\t\treturn this.mainPeerConnection.restoreTrackSender(\"audio\");\n\t}\n\tasync unmuteMainVideoInputDevice() {\n\t\treturn this.mainPeerConnection.restoreTrackSender(\"video\");\n\t}\n\t/** Get or lazily create the local audio pipeline for the main peer connection. */\n\tensureLocalAudioPipeline() {\n\t\treturn this.mainPeerConnection.ensureLocalAudioPipeline();\n\t}\n\t/** The currently-active local audio pipeline, or null if it hasn't been created. */\n\tget localAudioPipeline() {\n\t\treturn this.mainPeerConnection.localAudioPipeline;\n\t}\n\tasync addInputDevice(options = {\n\t\taudio: false,\n\t\tvideo: true\n\t}) {\n\t\treturn this.initAdditionalPeerConnection(\"additional-device\", options);\n\t}\n\t/**\n\t* Add a new input device to the main peer connection,\n\t* only if a device of the same kind is not present already.\n\t*\n\t* @see selectAudioInputDevice\n\t* @see selectVideoInputDevice\n\t* @param options - Media options specifying which input devices to add (defaults to audio only).\n\t*/\n\tasync addMainInputDevices(options = { audio: true }) {\n\t\tlet deviceKind = void 0;\n\t\tconst { mediaDirections } = this.mainPeerConnection;\n\t\tif (options.audio ?? options.inputAudioDeviceConstraints ?? (options.inputAudioStream && mediaDirections.audio.startsWith(\"send\"))) deviceKind = \"audio\";\n\t\tif (options.video ?? options.inputVideoDeviceConstraints ?? (options.inputVideoStream && !mediaDirections.video.startsWith(\"send\"))) deviceKind = deviceKind === \"audio\" ? \"both\" : \"video\";\n\t\tif (deviceKind) {\n\t\t\tthis.mainPeerConnection.updateMediaDevicesOptions(options);\n\t\t\tawait this.mainPeerConnection.restoreTrackSender(deviceKind);\n\t\t} else {\n\t\t\tconst error = new InvalidParams(\"No valid device to be added\");\n\t\t\tthis.onError?.(error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync addScreenMedia(options = { audio: false }) {\n\t\tawait this.initAdditionalPeerConnection(\"screenshare\", options);\n\t}\n\tasync initAdditionalPeerConnection(propose, options) {\n\t\tconst isScreenShare = propose === \"screenshare\";\n\t\tlet firstPeerConnectionError;\n\t\tlet rtcPeerConnController = null;\n\t\ttry {\n\t\t\tif (isScreenShare) this._screenShareStatus$.next(\"starting\");\n\t\t\trtcPeerConnController = new RTCPeerConnectionController({\n\t\t\t\t...options,\n\t\t\t\t...this.RTCPeerConnectionConfig,\n\t\t\t\tpropose,\n\t\t\t\twebRTCApiProvider: this.webRTCApiProvider\n\t\t\t}, void 0, this.deviceController);\n\t\t\tthis.setupLocalDescriptionHandler(rtcPeerConnController);\n\t\t\tif (isScreenShare) this._screenShareId = rtcPeerConnController.id;\n\t\t\tthis._rtcPeerConnectionsMap.set(rtcPeerConnController.id, rtcPeerConnController);\n\t\t\tthis._rtcPeerConnections$.next(Array.from(this._rtcPeerConnectionsMap.values()));\n\t\t\tthis.subscribeTo(rtcPeerConnController.errors$, (error) => {\n\t\t\t\tfirstPeerConnectionError ??= error;\n\t\t\t\tthis.onError?.(error, { fatal: false });\n\t\t\t});\n\t\t\tawait firstValueFrom(rtcPeerConnController.connectionState$.pipe(filter((state) => state === \"connected\"), take(1), timeout(this._screenShareTimeoutMs), takeUntil(this.destroyed$)));\n\t\t\tif (isScreenShare) this._screenShareStatus$.next(\"started\");\n\t\t\tlogger$16.info(`[WebRTCManager] Additional peer connection connected (${propose}).`);\n\t\t\treturn rtcPeerConnController.id;\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Error initializing additional peer connection:\", error);\n\t\t\tif (rtcPeerConnController) rtcPeerConnController.destroy();\n\t\t\tif (isScreenShare) this._screenShareStatus$.next(\"none\");\n\t\t\tif (firstPeerConnectionError) throw firstPeerConnectionError instanceof MediaAccessError && firstPeerConnectionError.originalError instanceof Error ? firstPeerConnectionError.originalError : firstPeerConnectionError;\n\t\t\tif (error instanceof EmptyError) {\n\t\t\t\tlogger$16.debug(\"[WebRTCManager] Additional peer connection aborted before connecting.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow error instanceof Error ? error : new Error(String(error), { cause: error });\n\t\t}\n\t}\n\tasync removeInputDevices(id) {\n\t\treturn this.removeAdditionalPeerConnection(id);\n\t}\n\tremoveMainInputDevice(options = {\n\t\tremoveAudio: false,\n\t\tremoveVideo: true\n\t}) {\n\t\tlet removeTrack = void 0;\n\t\tif (options.removeAudio) removeTrack = \"audio\";\n\t\tif (options.removeVideo) removeTrack = removeTrack === \"audio\" ? \"both\" : \"video\";\n\t\tif (removeTrack) return this.mainPeerConnection.stopTrackSender(removeTrack, { updateTransceiverDirection: true });\n\t}\n\tasync removeScreenMedia() {\n\t\tif (![\"starting\", \"started\"].includes(this._screenShareStatus$.value)) logger$16.warn(\"[WebRTCManager] No active screen share to stop.\");\n\t\tif (!this._screenShareId) {\n\t\t\tlogger$16.debug(\"[WebRTCManager] No screen share peer connection found.\");\n\t\t\treturn;\n\t\t}\n\t\tthis._screenShareStatus$.next(\"stopping\");\n\t\tawait this.removeAdditionalPeerConnection(this._screenShareId);\n\t\tthis._screenShareId = void 0;\n\t\tthis._screenShareStatus$.next(\"none\");\n\t}\n\tasync removeAdditionalPeerConnection(id) {\n\t\tconst rtcPeerConnController = this._rtcPeerConnectionsMap.get(id);\n\t\ttry {\n\t\t\tif (rtcPeerConnController) await this.executeVertoBye(rtcPeerConnController);\n\t\t} finally {\n\t\t\trtcPeerConnController?.destroy();\n\t\t\tthis._rtcPeerConnectionsMap.delete(id);\n\t\t\tthis._rtcPeerConnections$.next(Array.from(this._rtcPeerConnectionsMap.values()));\n\t\t}\n\t}\n\tasync executeVertoBye(rtcPeerConnController, cause) {\n\t\ttry {\n\t\t\tconst causeParams = cause ? {\n\t\t\t\tcause,\n\t\t\t\tcauseCode: VertoByeCauseCodes[cause]\n\t\t\t} : {};\n\t\t\tawait this.executeVerto(VertoBye({\n\t\t\t\t...causeParams,\n\t\t\t\tdialogParams: this.dialogParams(rtcPeerConnController)\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Call might already be disconnected, error sending Verto bye:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync bye(cause) {\n\t\tthis.attachManager.detach(this.buildAttachableCall());\n\t\tconst rtcPeerConnController = this._rtcPeerConnectionsMap.get(this.webRtcCallSession.id);\n\t\tif (rtcPeerConnController) await this.executeVertoBye(rtcPeerConnController, cause);\n\t}\n\tasync sendDigits(dtmf) {\n\t\tconst vertoInfoMessage = VertoInfo({\n\t\t\tsessid: this.webRtcCallSession.id,\n\t\t\tdialogParams: { callID: this.webRtcCallSession.id },\n\t\t\tdtmf\n\t\t});\n\t\ttry {\n\t\t\tawait this.executeVerto(vertoInfoMessage);\n\t\t} catch (error) {\n\t\t\tlogger$16.warn(\"[WebRTCManager] Error sending DTMF digits:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync transfer(options) {\n\t\tconst message = VertoModify({\n\t\t\t...options,\n\t\t\tdialogParams: this.dialogParams(this.mainPeerConnection),\n\t\t\taction: \"transfer\"\n\t\t});\n\t\ttry {\n\t\t\tlogger$16.debug(\"[WebRTCManager] Transferring call with options:\", options);\n\t\t\tawait this.executeVerto(message);\n\t\t} catch (error) {\n\t\t\tlogger$16.error(\"[WebRTCManager] Error transferring call:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tdestroy() {\n\t\tthis._rtcPeerConnectionsMap.forEach((rtcPeerConnController) => {\n\t\t\trtcPeerConnController.destroy();\n\t\t});\n\t\tthis._rtcPeerConnectionsMap.clear();\n\t\tthis._rtcPeerConnections$.complete();\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/controllers/RemoteAudioMeter.ts\nconst logger$15 = getLogger();\n/**\n* Read-only audio level meter for a remote MediaStream. Attaches an\n* AnalyserNode to a MediaStreamAudioSourceNode so it observes the stream\n* without affecting the caller's playback path (no GainNode, no destination).\n*\n* The server delivers all remote audio as a single mixed stream — there is\n* no per-participant demux — so this meter reports the aggregate remote\n* level, not per-member.\n*/\nvar RemoteAudioMeter = class extends Destroyable {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\tthis._source = null;\n\t\tthis._stream = null;\n\t\tthis._audioContext = (options.audioContextFactory ?? (() => new AudioContext()))();\n\t\tthis._analyser = this._audioContext.createAnalyser();\n\t\tthis._analyser.fftSize = 2048;\n\t\tthis._analyser.smoothingTimeConstant = .3;\n\t\tthis._analyserBuffer = new Uint8Array(new ArrayBuffer(this._analyser.fftSize));\n\t\tthis._pollIntervalMs = options.pollIntervalMs ?? AUDIO_LEVEL_POLL_INTERVAL_MS;\n\t}\n\t/** RMS level of the remote audio, 0..1. 0 when no stream is attached. */\n\tget level$() {\n\t\treturn this.deferEmission(interval(this._pollIntervalMs, animationFrameScheduler).pipe(map(() => this.computeLevel())));\n\t}\n\t/**\n\t* Attach (or replace) the MediaStream whose audio track is being metered.\n\t* Pass null to detach without destroying the meter.\n\t*/\n\tsetStream(stream) {\n\t\tif (this._source) {\n\t\t\ttry {\n\t\t\t\tthis._source.disconnect();\n\t\t\t} catch (error) {\n\t\t\t\tlogger$15.debug(\"[RemoteAudioMeter] source disconnect warning:\", error);\n\t\t\t}\n\t\t\tthis._source = null;\n\t\t\tthis._stream = null;\n\t\t}\n\t\tif (!stream || stream.getAudioTracks().length === 0) return;\n\t\tthis._stream = new MediaStream(stream.getAudioTracks());\n\t\tthis._source = this._audioContext.createMediaStreamSource(this._stream);\n\t}\n\tdestroy() {\n\t\tif (this._source) {\n\t\t\ttry {\n\t\t\t\tthis._source.disconnect();\n\t\t\t} catch {}\n\t\t\tthis._source = null;\n\t\t}\n\t\tthis._audioContext.close().catch((error) => {\n\t\t\tlogger$15.debug(\"[RemoteAudioMeter] audio context close warning:\", error);\n\t\t});\n\t\tsuper.destroy();\n\t}\n\tcomputeLevel() {\n\t\tif (!this._source) return 0;\n\t\tthis._analyser.getByteTimeDomainData(this._analyserBuffer);\n\t\tlet sum = 0;\n\t\tfor (const sample of this._analyserBuffer) {\n\t\t\tconst normalized = (sample - 128) / 128;\n\t\t\tsum += normalized * normalized;\n\t\t}\n\t\treturn Math.sqrt(sum / this._analyserBuffer.length);\n\t}\n};\n\n//#endregion\n//#region src/controllers/RTCStatsMonitor.ts\n/**\n* RTCStatsMonitor — per-call WebRTC stats polling, baseline calculation,\n* and network issue detection (audio/video packets, RTT, jitter, packet loss).\n*\n* Extends Destroyable for automatic RxJS cleanup.\n*/\nconst logger$14 = getLogger();\nconst DEFAULT_POLLING_INTERVAL_MS = 1e3;\nconst DEFAULT_BASELINE_SAMPLES = 10;\nconst DEFAULT_NO_AUDIO_PACKET_THRESHOLD_MS = 2e3;\nconst DEFAULT_NO_VIDEO_PACKET_THRESHOLD_MS = 3e3;\nconst DEFAULT_RTT_SPIKE_WARNING_MULTIPLIER = 3;\nconst DEFAULT_RTT_SPIKE_CRITICAL_MULTIPLIER = 5;\nconst DEFAULT_PACKET_LOSS_WARNING_PERCENT = 5;\nconst DEFAULT_PACKET_LOSS_CRITICAL_PERCENT = 10;\nconst DEFAULT_JITTER_SPIKE_MULTIPLIER = 4;\nconst DEFAULT_HISTORY_WINDOW_SECONDS = 30;\nfunction computePacketLossPercent(lost, received) {\n\tconst total = lost + received;\n\tif (total === 0) return 0;\n\treturn lost / total * 100;\n}\nfunction isInboundRtpStat(stat) {\n\treturn typeof stat === \"object\" && stat !== null && \"type\" in stat && stat.type === \"inbound-rtp\";\n}\nfunction isCandidatePairStat(stat) {\n\treturn typeof stat === \"object\" && stat !== null && \"type\" in stat && stat.type === \"candidate-pair\";\n}\nvar RTCStatsMonitor = class extends Destroyable {\n\tconstructor(peerConnection, config = {}) {\n\t\tsuper();\n\t\tthis.peerConnection = peerConnection;\n\t\tthis.running = false;\n\t\tthis.lastAudioPacketsReceived = 0;\n\t\tthis.lastAudioPacketChangeTime = 0;\n\t\tthis.lastVideoPacketsReceived = 0;\n\t\tthis.lastVideoPacketChangeTime = 0;\n\t\tthis.lastRoundTripTime = 0;\n\t\tthis.lastAvailableOutgoingBitrate = void 0;\n\t\tthis._sample$ = this.createReplaySubject(1);\n\t\tthis._baseline$ = this.createBehaviorSubject({\n\t\t\trtt: 0,\n\t\t\tjitter: 0,\n\t\t\tready: false\n\t\t});\n\t\tthis._networkIssues$ = this.createBehaviorSubject([]);\n\t\tthis._networkMetrics$ = this.createBehaviorSubject([]);\n\t\tthis.pollingIntervalMs = config.pollingIntervalMs ?? DEFAULT_POLLING_INTERVAL_MS;\n\t\tthis.baselineSampleCount = config.baselineSamples ?? DEFAULT_BASELINE_SAMPLES;\n\t\tthis.noAudioPacketThresholdMs = config.noAudioPacketThresholdMs ?? DEFAULT_NO_AUDIO_PACKET_THRESHOLD_MS;\n\t\tthis.noVideoPacketThresholdMs = config.noVideoPacketThresholdMs ?? DEFAULT_NO_VIDEO_PACKET_THRESHOLD_MS;\n\t\tthis.rttSpikeWarningMultiplier = config.rttSpikeWarningMultiplier ?? DEFAULT_RTT_SPIKE_WARNING_MULTIPLIER;\n\t\tthis.rttSpikeCriticalMultiplier = config.rttSpikeCriticalMultiplier ?? DEFAULT_RTT_SPIKE_CRITICAL_MULTIPLIER;\n\t\tthis.packetLossWarningPercent = config.packetLossWarningPercent ?? DEFAULT_PACKET_LOSS_WARNING_PERCENT;\n\t\tthis.packetLossCriticalPercent = config.packetLossCriticalPercent ?? DEFAULT_PACKET_LOSS_CRITICAL_PERCENT;\n\t\tthis.jitterSpikeMultiplier = config.jitterSpikeMultiplier ?? DEFAULT_JITTER_SPIKE_MULTIPLIER;\n\t\tthis.historyWindowSeconds = config.historyWindowSeconds ?? DEFAULT_HISTORY_WINDOW_SECONDS;\n\t}\n\t/** Current list of detected network issues (empty array = healthy). */\n\tget networkIssues$() {\n\t\treturn this._networkIssues$.asObservable();\n\t}\n\t/** Snapshot of current issues (defensive copy). */\n\tget networkIssues() {\n\t\treturn [...this._networkIssues$.value];\n\t}\n\t/** Simple boolean health indicator. */\n\tget isNetworkHealthy$() {\n\t\treturn this.cachedObservable(\"isNetworkHealthy$\", () => this._networkIssues$.pipe(map((issues) => issues.length === 0), distinctUntilChanged(), takeUntil(this.destroyed$)));\n\t}\n\t/** Whether the network is currently healthy. */\n\tget isNetworkHealthy() {\n\t\treturn this._networkIssues$.value.length === 0;\n\t}\n\t/** Rolling metrics history. */\n\tget networkMetrics$() {\n\t\treturn this._networkMetrics$.asObservable();\n\t}\n\t/** Snapshot of rolling metrics (defensive copy). */\n\tget networkMetrics() {\n\t\treturn [...this._networkMetrics$.value];\n\t}\n\t/** Emits individual critical issues for the recovery pipeline. */\n\tget criticalIssue$() {\n\t\treturn this.cachedObservable(\"criticalIssue$\", () => this._networkIssues$.pipe(mergeMap((issues) => from(issues.filter((i) => i.severity === \"critical\"))), takeUntil(this.destroyed$)));\n\t}\n\t/** Emits each raw stats sample extracted from the peer connection. */\n\tget sample$() {\n\t\treturn this._sample$.asObservable();\n\t}\n\tstart() {\n\t\tif (this.running) return;\n\t\tthis.running = true;\n\t\tconst now = Date.now();\n\t\tthis.lastAudioPacketChangeTime = now;\n\t\tthis.lastVideoPacketChangeTime = now;\n\t\tlogger$14.debug(\"[RTCStatsMonitor] Starting stats monitoring\");\n\t\tthis.subscribeTo(interval(this.pollingIntervalMs).pipe(filter(() => this.running), switchMap(() => from(this.peerConnection.getStats()).pipe(catchError((err) => {\n\t\t\tlogger$14.warn(\"[RTCStatsMonitor] Failed to get stats:\", err);\n\t\t\treturn EMPTY;\n\t\t}))), filter(() => this.running), map((report) => this.extractSample(report))), (sample) => this._sample$.next(sample));\n\t\tthis.subscribeTo(this._sample$.pipe(take(this.baselineSampleCount), toArray(), map((samples) => ({\n\t\t\trtt: samples.reduce((s, b) => s + b.roundTripTime, 0) / samples.length,\n\t\t\tjitter: samples.reduce((s, b) => s + b.audioJitter, 0) / samples.length,\n\t\t\tready: true\n\t\t}))), (baseline) => {\n\t\t\tlogger$14.debug(`[RTCStatsMonitor] Baseline established: rtt=${baseline.rtt.toFixed(1)}ms, jitter=${baseline.jitter.toFixed(1)}ms`);\n\t\t\tthis._baseline$.next(baseline);\n\t\t});\n\t\tthis.subscribeTo(this._sample$.pipe(scan((acc, sample) => ({\n\t\t\tprev: acc.current,\n\t\t\tcurrent: sample\n\t\t}), {\n\t\t\tprev: null,\n\t\t\tcurrent: null\n\t\t}), filter((pair) => pair.current !== null)), ({ prev, current }) => {\n\t\t\tconst now$1 = current.timestamp;\n\t\t\tthis.updatePacketTracking(current, now$1);\n\t\t\tconst issues = this.detectIssues(current, prev, now$1);\n\t\t\tthis._networkIssues$.next(issues);\n\t\t});\n\t\tthis.subscribeTo(this._sample$.pipe(scan((history, sample) => {\n\t\t\tconst cutoff = sample.timestamp - this.historyWindowSeconds * 1e3;\n\t\t\tconst metrics = {\n\t\t\t\ttimestamp: sample.timestamp,\n\t\t\t\taudio: {\n\t\t\t\t\tpacketsReceived: sample.audioPacketsReceived,\n\t\t\t\t\tpacketsLost: sample.audioPacketsLost,\n\t\t\t\t\tjitter: sample.audioJitter\n\t\t\t\t},\n\t\t\t\tvideo: {\n\t\t\t\t\tpacketsReceived: sample.videoPacketsReceived,\n\t\t\t\t\tpacketsLost: sample.videoPacketsLost\n\t\t\t\t},\n\t\t\t\troundTripTime: sample.roundTripTime,\n\t\t\t\tavailableOutgoingBitrate: sample.availableOutgoingBitrate\n\t\t\t};\n\t\t\treturn [...history.filter((m) => m.timestamp > cutoff), metrics];\n\t\t}, [])), (metrics) => this._networkMetrics$.next(metrics));\n\t}\n\tstop() {\n\t\tif (!this.running) return;\n\t\tthis.running = false;\n\t\tlogger$14.debug(\"[RTCStatsMonitor] Stopping stats monitoring\");\n\t}\n\tdestroy() {\n\t\tlogger$14.debug(\"[RTCStatsMonitor] Destroying RTCStatsMonitor\");\n\t\tthis.stop();\n\t\tsuper.destroy();\n\t}\n\textractSample(report) {\n\t\tlet audioPacketsReceived = 0;\n\t\tlet audioPacketsLost = 0;\n\t\tlet audioJitter = 0;\n\t\tlet videoPacketsReceived = 0;\n\t\tlet videoPacketsLost = 0;\n\t\tlet roundTripTime = 0;\n\t\tlet availableOutgoingBitrate;\n\t\treport.forEach((stat) => {\n\t\t\tif (isInboundRtpStat(stat)) if (stat.kind === \"audio\") {\n\t\t\t\taudioPacketsReceived += stat.packetsReceived ?? 0;\n\t\t\t\taudioPacketsLost += stat.packetsLost ?? 0;\n\t\t\t\taudioJitter = Math.max(audioJitter, (stat.jitter ?? 0) * 1e3);\n\t\t\t} else {\n\t\t\t\tvideoPacketsReceived += stat.packetsReceived ?? 0;\n\t\t\t\tvideoPacketsLost += stat.packetsLost ?? 0;\n\t\t\t}\n\t\t\tif (isCandidatePairStat(stat) && stat.state === \"succeeded\" && stat.nominated) {\n\t\t\t\troundTripTime = stat.currentRoundTripTime ? stat.currentRoundTripTime * 1e3 : this.lastRoundTripTime;\n\t\t\t\tavailableOutgoingBitrate = stat.availableOutgoingBitrate ?? this.lastAvailableOutgoingBitrate;\n\t\t\t}\n\t\t});\n\t\treturn {\n\t\t\taudioPacketsReceived,\n\t\t\taudioPacketsLost,\n\t\t\taudioJitter,\n\t\t\tvideoPacketsReceived,\n\t\t\tvideoPacketsLost,\n\t\t\troundTripTime,\n\t\t\tavailableOutgoingBitrate,\n\t\t\ttimestamp: Date.now()\n\t\t};\n\t}\n\tupdatePacketTracking(sample, now) {\n\t\tif (sample.audioPacketsReceived !== this.lastAudioPacketsReceived) {\n\t\t\tthis.lastAudioPacketsReceived = sample.audioPacketsReceived;\n\t\t\tthis.lastAudioPacketChangeTime = now;\n\t\t}\n\t\tif (sample.videoPacketsReceived !== this.lastVideoPacketsReceived) {\n\t\t\tthis.lastVideoPacketsReceived = sample.videoPacketsReceived;\n\t\t\tthis.lastVideoPacketChangeTime = now;\n\t\t}\n\t\tif (sample.roundTripTime > 0) this.lastRoundTripTime = sample.roundTripTime;\n\t\tif (sample.availableOutgoingBitrate !== void 0) this.lastAvailableOutgoingBitrate = sample.availableOutgoingBitrate;\n\t}\n\tdetectIssues(sample, prevSample, now) {\n\t\tconst issues = [];\n\t\tconst baseline = this._baseline$.value;\n\t\tconst audioSilenceMs = now - this.lastAudioPacketChangeTime;\n\t\tif (audioSilenceMs > this.noAudioPacketThresholdMs) issues.push({\n\t\t\ttype: \"no_inbound_audio\",\n\t\t\tseverity: \"critical\",\n\t\t\ttimestamp: now,\n\t\t\tvalue: audioSilenceMs,\n\t\t\tthreshold: this.noAudioPacketThresholdMs\n\t\t});\n\t\tconst videoSilenceMs = now - this.lastVideoPacketChangeTime;\n\t\tif (videoSilenceMs > this.noVideoPacketThresholdMs) issues.push({\n\t\t\ttype: \"no_inbound_video\",\n\t\t\tseverity: \"warning\",\n\t\t\ttimestamp: now,\n\t\t\tvalue: videoSilenceMs,\n\t\t\tthreshold: this.noVideoPacketThresholdMs\n\t\t});\n\t\tif (baseline.ready) {\n\t\t\tconst rtt = sample.roundTripTime;\n\t\t\tconst baselineRtt = baseline.rtt;\n\t\t\tif (baselineRtt > 0) {\n\t\t\t\tconst rttRatio = rtt / baselineRtt;\n\t\t\t\tif (rttRatio > this.rttSpikeCriticalMultiplier) issues.push({\n\t\t\t\t\ttype: \"high_rtt\",\n\t\t\t\t\tseverity: \"critical\",\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t\tvalue: rtt,\n\t\t\t\t\tthreshold: baselineRtt * this.rttSpikeCriticalMultiplier\n\t\t\t\t});\n\t\t\t\telse if (rttRatio > this.rttSpikeWarningMultiplier) issues.push({\n\t\t\t\t\ttype: \"high_rtt\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t\tvalue: rtt,\n\t\t\t\t\tthreshold: baselineRtt * this.rttSpikeWarningMultiplier\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst jitter = sample.audioJitter;\n\t\t\tconst baselineJitter = baseline.jitter;\n\t\t\tif (baselineJitter > 0) {\n\t\t\t\tif (jitter / baselineJitter > this.jitterSpikeMultiplier) issues.push({\n\t\t\t\t\ttype: \"high_jitter\",\n\t\t\t\t\tseverity: \"warning\",\n\t\t\t\t\ttimestamp: now,\n\t\t\t\t\tvalue: jitter,\n\t\t\t\t\tthreshold: baselineJitter * this.jitterSpikeMultiplier\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (prevSample) {\n\t\t\tconst deltaAudioReceived = Math.max(0, sample.audioPacketsReceived - prevSample.audioPacketsReceived);\n\t\t\tconst deltaAudioLost = Math.max(0, sample.audioPacketsLost - prevSample.audioPacketsLost);\n\t\t\tconst deltaVideoReceived = Math.max(0, sample.videoPacketsReceived - prevSample.videoPacketsReceived);\n\t\t\tconst deltaVideoLost = Math.max(0, sample.videoPacketsLost - prevSample.videoPacketsLost);\n\t\t\tconst totalDeltaReceived = deltaAudioReceived + deltaVideoReceived;\n\t\t\tconst lossPercent = computePacketLossPercent(deltaAudioLost + deltaVideoLost, totalDeltaReceived);\n\t\t\tif (lossPercent > this.packetLossCriticalPercent) issues.push({\n\t\t\t\ttype: \"high_packet_loss\",\n\t\t\t\tseverity: \"critical\",\n\t\t\t\ttimestamp: now,\n\t\t\t\tvalue: lossPercent,\n\t\t\t\tthreshold: this.packetLossCriticalPercent\n\t\t\t});\n\t\t\telse if (lossPercent > this.packetLossWarningPercent) issues.push({\n\t\t\t\ttype: \"high_packet_loss\",\n\t\t\t\tseverity: \"warning\",\n\t\t\t\ttimestamp: now,\n\t\t\t\tvalue: lossPercent,\n\t\t\t\tthreshold: this.packetLossWarningPercent\n\t\t\t});\n\t\t}\n\t\treturn issues;\n\t}\n};\n\n//#endregion\n//#region src/managers/CallRecoveryManager.ts\nconst logger$13 = getLogger();\nconst DEFAULT_DEBOUNCE_TIME_MS = 2e3;\nconst DEFAULT_COOLDOWN_MS = 1e4;\nconst DEFAULT_ICE_GRACE_PERIOD_MS = 3e3;\nconst DEFAULT_ICE_RESTART_TIMEOUT_MS = 5e3;\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_KEYFRAME_MAX_BURST = 3;\nconst DEFAULT_KEYFRAME_BURST_WINDOW_MS = 3e3;\nconst DEFAULT_KEYFRAME_COOLDOWN_MS = 1e4;\nconst DEFAULT_DEGRADATION_BITRATE_THRESHOLD = 150;\nconst DEFAULT_DEGRADATION_RECOVERY_THRESHOLD = 300;\nconst DEFAULT_PACKET_LOSS_RECOVERY_DELAY_SEC = 5;\n/**\n* Issue types that indicate quality degradation but NOT connectivity loss.\n* These should only trigger Tier 1 (keyframe) — never ICE restart.\n* The network path is slow or lossy, but media is still flowing.\n*/\nconst DEGRADATION_ONLY_ISSUES = new Set([\n\t\"high_rtt\",\n\t\"high_jitter\",\n\t\"high_packet_loss\"\n]);\n/**\n* Implements the tiered recovery pipeline described in Sections 2, 19, 22,\n* and 25 of the implementation guide.\n*\n* Three detection signals (stats critical, ICE state, network events) are\n* merged, debounced, and processed through tiered recovery:\n*   Tier 1 - Request video keyframe (throttled burst)\n*   Tier 2 - ICE restart via verto.modify\n*   Tier 3 - Relay-only ICE restart\n*\n* Gate checks prevent recovery when the call is not in a recoverable state.\n* A state machine tracks the pipeline: IDLE -> DEBOUNCING -> RECOVERING -> COOLDOWN.\n*/\nvar CallRecoveryManager = class extends Destroyable {\n\tconstructor(callbacks, inputs, config = {}) {\n\t\tsuper();\n\t\tthis._recoveryState$ = this.createBehaviorSubject(\"idle\");\n\t\tthis._recoveryEvent$ = this.createSubject();\n\t\tthis._bandwidthConstrained$ = this.createBehaviorSubject(false);\n\t\tthis._hasPacketLoss$ = this.createBehaviorSubject(false);\n\t\tthis._trigger$ = this.createSubject();\n\t\tthis._attemptCount = 0;\n\t\tthis._keyframeBurstCount = 0;\n\t\tthis._keyframeBurstStart = 0;\n\t\tthis._keyframeCooldownUntil = 0;\n\t\tthis._cooldownUntil = 0;\n\t\tthis._pipelineStop$ = this.createSubject();\n\t\tthis._callbacks = callbacks;\n\t\tthis._inputs = inputs;\n\t\tthis._config = {\n\t\t\tdebounceTimeMs: config.debounceTimeMs ?? DEFAULT_DEBOUNCE_TIME_MS,\n\t\t\tcooldownMs: config.cooldownMs ?? DEFAULT_COOLDOWN_MS,\n\t\t\ticeGracePeriodMs: config.iceGracePeriodMs ?? DEFAULT_ICE_GRACE_PERIOD_MS,\n\t\t\ticeRestartTimeoutMs: config.iceRestartTimeoutMs ?? DEFAULT_ICE_RESTART_TIMEOUT_MS,\n\t\t\tmaxAttempts: config.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,\n\t\t\tenableRelayFallback: config.enableRelayFallback ?? true,\n\t\t\tkeyframeMaxBurst: config.keyframeMaxBurst ?? DEFAULT_KEYFRAME_MAX_BURST,\n\t\t\tkeyframeBurstWindowMs: config.keyframeBurstWindowMs ?? DEFAULT_KEYFRAME_BURST_WINDOW_MS,\n\t\t\tkeyframeCooldownMs: config.keyframeCooldownMs ?? DEFAULT_KEYFRAME_COOLDOWN_MS,\n\t\t\tdegradationBitrateThreshold: config.degradationBitrateThreshold ?? DEFAULT_DEGRADATION_BITRATE_THRESHOLD,\n\t\t\tdegradationRecoveryThreshold: config.degradationRecoveryThreshold ?? DEFAULT_DEGRADATION_RECOVERY_THRESHOLD,\n\t\t\tenableAutoDegradation: config.enableAutoDegradation ?? true,\n\t\t\tpacketLossRecoveryDelaySec: config.packetLossRecoveryDelaySec ?? DEFAULT_PACKET_LOSS_RECOVERY_DELAY_SEC\n\t\t};\n\t\tthis.initPipeline();\n\t\tthis.initDegradationRecoveryPipeline();\n\t}\n\tget recoveryState$() {\n\t\treturn this._recoveryState$.asObservable().pipe(takeUntil(this._destroyed$));\n\t}\n\tget recoveryState() {\n\t\treturn this._recoveryState$.value;\n\t}\n\tget recoveryEvent$() {\n\t\treturn this._recoveryEvent$.asObservable().pipe(takeUntil(this._destroyed$));\n\t}\n\tget bandwidthConstrained$() {\n\t\treturn this._bandwidthConstrained$.asObservable().pipe(takeUntil(this._destroyed$));\n\t}\n\tget bandwidthConstrained() {\n\t\treturn this._bandwidthConstrained$.value;\n\t}\n\t/**\n\t* Feed an external detection signal into the recovery pipeline.\n\t* Multiple signals are debounced and collapsed automatically.\n\t*/\n\tpushTrigger(trigger) {\n\t\tthis._trigger$.next(trigger);\n\t}\n\t/**\n\t* Manual ICE restart request — bypasses cooldown and gate checks,\n\t* but skips if the pipeline is already recovering to avoid races.\n\t*/\n\tasync requestIceRestart() {\n\t\tif (this._recoveryState$.value === \"recovering\") {\n\t\t\tlogger$13.info(\"CallRecoveryManager: manual ICE restart skipped — recovery already in progress\");\n\t\t\treturn;\n\t\t}\n\t\tlogger$13.info(\"CallRecoveryManager: manual ICE restart requested\");\n\t\tthis.transitionTo(\"recovering\");\n\t\tawait this.executeIceRestart(false);\n\t\tthis.startCooldown();\n\t}\n\t/**\n\t* Manual keyframe request — subject to burst throttling only.\n\t*/\n\trequestKeyframe() {\n\t\tthis.executeKeyframe(\"manual request\");\n\t}\n\t/**\n\t* Reset all attempt counters and cooldowns. Should be called after\n\t* WebSocket reconnect or call state recovers to 'connected'.\n\t*/\n\treset() {\n\t\tlogger$13.info(\"CallRecoveryManager: resetting counters\");\n\t\tthis._attemptCount = 0;\n\t\tthis._keyframeBurstCount = 0;\n\t\tthis._keyframeBurstStart = 0;\n\t\tthis._keyframeCooldownUntil = 0;\n\t\tthis._cooldownUntil = 0;\n\t\tthis.transitionTo(\"idle\");\n\t}\n\t/**\n\t* Notify the recovery manager that a verto.modify (ICE restart SDP exchange)\n\t* failed at the signaling layer. Resets cooldown and pushes a new trigger\n\t* so recovery can re-attempt.\n\t*/\n\tnotifyModifyFailed() {\n\t\tif (this._recoveryState$.value === \"cooldown\" || this._recoveryState$.value === \"idle\") {\n\t\t\tlogger$13.info(\"CallRecoveryManager: verto.modify failed — re-entering recovery\");\n\t\t\tthis._cooldownUntil = 0;\n\t\t\tthis.transitionTo(\"idle\");\n\t\t\tthis.pushTrigger({\n\t\t\t\tsource: \"network\",\n\t\t\t\tdetail: \"modify_failed_during_recovery\"\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Feed bandwidth information for graceful degradation (Section 22).\n\t* Call this from the stats monitor with current available outgoing bitrate.\n\t*/\n\treportBandwidth(bitrateKbps) {\n\t\tif (!this._config.enableAutoDegradation) return;\n\t\tconst wasConstrained = this._bandwidthConstrained$.value;\n\t\tif (!wasConstrained && bitrateKbps < this._config.degradationBitrateThreshold) {\n\t\t\tthis._bandwidthConstrained$.next(true);\n\t\t\tthis._callbacks.disableVideo();\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"video_disabled\",\n\t\t\t\treason: `bandwidth ${bitrateKbps}kbps below threshold ${this._config.degradationBitrateThreshold}kbps`,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.warn(`CallRecoveryManager: disabling video — bandwidth ${bitrateKbps}kbps < ${this._config.degradationBitrateThreshold}kbps`);\n\t\t} else if (wasConstrained && bitrateKbps >= this._config.degradationRecoveryThreshold) {\n\t\t\tthis._bandwidthConstrained$.next(false);\n\t\t\tthis._callbacks.enableVideo();\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"video_restored\",\n\t\t\t\treason: `bandwidth ${bitrateKbps}kbps recovered above ${this._config.degradationRecoveryThreshold}kbps`,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.info(`CallRecoveryManager: restoring video — bandwidth ${bitrateKbps}kbps >= ${this._config.degradationRecoveryThreshold}kbps`);\n\t\t}\n\t}\n\t/**\n\t* Feed current network issues for degradation recovery.\n\t* When video was disabled due to bandwidth constraints, this pipeline\n\t* monitors packet loss clearance to trigger video restoration.\n\t*/\n\treportNetworkIssues(issues) {\n\t\tconst hasPacketLoss = issues.some((i) => i.type === \"high_packet_loss\");\n\t\tif (hasPacketLoss !== this._hasPacketLoss$.value) this._hasPacketLoss$.next(hasPacketLoss);\n\t}\n\t/**\n\t* Signal-only vs full reconnect distinction (Section 25).\n\t* Call this when WebSocket reconnects to determine the appropriate action.\n\t*/\n\thandleWebSocketReconnect() {\n\t\tconst pcState = this._callbacks.getPeerConnectionState();\n\t\tif (pcState === \"connected\" || pcState === \"completed\") {\n\t\t\tlogger$13.info(\"CallRecoveryManager: signal-only reconnect — peer connection still alive\");\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"signal_reconnect\",\n\t\t\t\treason: \"WebSocket reconnected, peer connection still connected\",\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t} else {\n\t\t\tlogger$13.info(\"CallRecoveryManager: full reconnect — peer connection also down\");\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"full_reconnect\",\n\t\t\t\treason: \"WebSocket reconnected, peer connection not connected — ICE restart needed\",\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tthis.pushTrigger({\n\t\t\t\tsource: \"network\",\n\t\t\t\tdetail: \"full_reconnect_after_ws\"\n\t\t\t});\n\t\t}\n\t\tthis.reset();\n\t}\n\tdestroy() {\n\t\tthis._pipelineStop$.next();\n\t\tthis._pipelineStop$.complete();\n\t\tsuper.destroy();\n\t}\n\tinitPipeline() {\n\t\tthis.subscribeTo(this._trigger$.pipe(tap(() => {\n\t\t\tif (this._recoveryState$.value === \"idle\") this.transitionTo(\"debouncing\");\n\t\t}), debounceTime(this._config.debounceTimeMs), withLatestFrom(this._inputs.signalingReady$), filter(([, signalingReady]) => this.passGateChecks(signalingReady)), map(([trigger]) => trigger), exhaustMap((trigger) => this.executeTieredRecovery(trigger)), takeUntil(merge(this._destroyed$, this._pipelineStop$))), {\n\t\t\tnext: () => {},\n\t\t\terror: (err) => {\n\t\t\t\tlogger$13.error(\"CallRecoveryManager: pipeline error\", err);\n\t\t\t\tthis.transitionTo(\"idle\");\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t* When video was disabled due to bandwidth constraints, the browser's\n\t* bandwidth estimator loses its primary probe signal (video traffic).\n\t* This means availableOutgoingBitrate may never recover to the restoration\n\t* threshold. Instead, we watch for packet loss clearance as a proxy for\n\t* network recovery: if high_packet_loss stays absent for a configurable\n\t* duration while video is degraded, we restore the video track.\n\t*/\n\tinitDegradationRecoveryPipeline() {\n\t\tif (!this._config.enableAutoDegradation) return;\n\t\tconst delayMs = this._config.packetLossRecoveryDelaySec * 1e3;\n\t\tthis.subscribeTo(combineLatest([this._bandwidthConstrained$, this._hasPacketLoss$]).pipe(switchMap(([constrained, hasPacketLoss]) => {\n\t\t\tif (constrained && !hasPacketLoss) return timer(delayMs);\n\t\t\treturn EMPTY;\n\t\t}), takeUntil(this._destroyed$)), () => {\n\t\t\tthis._bandwidthConstrained$.next(false);\n\t\t\tthis._callbacks.enableVideo();\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"video_restored\",\n\t\t\t\treason: `no packet loss for ${this._config.packetLossRecoveryDelaySec}s — restoring video`,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.info(`CallRecoveryManager: restoring video — no packet loss for ${this._config.packetLossRecoveryDelaySec}s`);\n\t\t});\n\t}\n\tpassGateChecks(signalingReady) {\n\t\tif (this._callbacks.isNegotiating()) {\n\t\t\tlogger$13.debug(\"CallRecoveryManager: gate blocked — negotiation in progress\");\n\t\t\tthis.transitionTo(\"idle\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!signalingReady) {\n\t\t\tlogger$13.debug(\"CallRecoveryManager: gate blocked — signaling not ready\");\n\t\t\tthis.transitionTo(\"idle\");\n\t\t\treturn false;\n\t\t}\n\t\tif (!this._callbacks.isCallConnected()) {\n\t\t\tlogger$13.debug(\"CallRecoveryManager: gate blocked — call not connected\");\n\t\t\tthis.transitionTo(\"idle\");\n\t\t\treturn false;\n\t\t}\n\t\tif (this.isCooldownActive()) {\n\t\t\tlogger$13.debug(\"CallRecoveryManager: gate blocked — cooldown active\");\n\t\t\tthis.transitionTo(\"cooldown\");\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n\tisCooldownActive() {\n\t\treturn Date.now() < this._cooldownUntil;\n\t}\n\texecuteTieredRecovery(trigger) {\n\t\tthis.transitionTo(\"recovering\");\n\t\tlogger$13.info(`CallRecoveryManager: starting tiered recovery — source=${trigger.source} detail=${trigger.detail}`);\n\t\treturn from(this.runTiers(trigger)).pipe(tap(() => this.startCooldown()), catchError((err) => {\n\t\t\tlogger$13.error(\"CallRecoveryManager: tiered recovery failed\", err);\n\t\t\tthis.startCooldown();\n\t\t\treturn EMPTY;\n\t\t}));\n\t}\n\tasync runTiers(trigger) {\n\t\tthis.executeKeyframe(trigger.detail);\n\t\tif (trigger.issueType && DEGRADATION_ONLY_ISSUES.has(trigger.issueType)) {\n\t\t\tlogger$13.debug(`CallRecoveryManager: degradation-only issue (${trigger.issueType}) — Tier 1 only, skipping ICE restart`);\n\t\t\treturn;\n\t\t}\n\t\tif (this._attemptCount < this._config.maxAttempts) {\n\t\t\tif (await this.executeIceRestart(false)) return;\n\t\t}\n\t\tif (this._config.enableRelayFallback && this._attemptCount < this._config.maxAttempts) {\n\t\t\tif (await this.executeIceRestart(true)) return;\n\t\t}\n\t\tif (this._attemptCount >= this._config.maxAttempts) {\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"max_attempts_reached\",\n\t\t\t\treason: `all ${this._config.maxAttempts} recovery attempts exhausted`,\n\t\t\t\tattempt: this._attemptCount,\n\t\t\t\tmaxAttempts: this._config.maxAttempts,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.warn(\"CallRecoveryManager: max recovery attempts reached\");\n\t\t}\n\t}\n\texecuteKeyframe(reason) {\n\t\tconst now = Date.now();\n\t\tif (now < this._keyframeCooldownUntil) {\n\t\t\tlogger$13.debug(\"CallRecoveryManager: keyframe request skipped — cooldown active\");\n\t\t\treturn;\n\t\t}\n\t\tif (now - this._keyframeBurstStart > this._config.keyframeBurstWindowMs) {\n\t\t\tthis._keyframeBurstCount = 0;\n\t\t\tthis._keyframeBurstStart = now;\n\t\t}\n\t\tif (this._keyframeBurstCount >= this._config.keyframeMaxBurst) {\n\t\t\tthis._keyframeCooldownUntil = now + this._config.keyframeCooldownMs;\n\t\t\tlogger$13.debug(`CallRecoveryManager: keyframe burst limit reached (${this._config.keyframeMaxBurst}), cooldown until ${this._keyframeCooldownUntil}`);\n\t\t\treturn;\n\t\t}\n\t\tthis._keyframeBurstCount += 1;\n\t\tthis._callbacks.requestKeyframe();\n\t\tthis.emitEvent({\n\t\t\taction: \"keyframe_requested\",\n\t\t\treason,\n\t\t\ttimestamp: now\n\t\t});\n\t\tlogger$13.debug(`CallRecoveryManager: keyframe requested (burst ${this._keyframeBurstCount}/${this._config.keyframeMaxBurst})`);\n\t}\n\tasync executeIceRestart(relayOnly) {\n\t\tthis._attemptCount += 1;\n\t\tconst tier = relayOnly ? \"Tier 3 (relay-only)\" : \"Tier 2 (standard)\";\n\t\tlogger$13.info(`CallRecoveryManager: ${tier} ICE restart — attempt ${this._attemptCount}/${this._config.maxAttempts}`);\n\t\tthis.emitEvent({\n\t\t\taction: \"reinvite_started\",\n\t\t\treason: `${tier} ICE restart`,\n\t\t\tattempt: this._attemptCount,\n\t\t\tmaxAttempts: this._config.maxAttempts,\n\t\t\ttimestamp: Date.now()\n\t\t});\n\t\ttry {\n\t\t\tif (await this.withTimeout(this._callbacks.requestIceRestart(relayOnly), this._config.iceRestartTimeoutMs)) {\n\t\t\t\tthis.emitEvent({\n\t\t\t\t\taction: \"reinvite_succeeded\",\n\t\t\t\t\treason: `${tier} ICE restart succeeded`,\n\t\t\t\t\tattempt: this._attemptCount,\n\t\t\t\t\tmaxAttempts: this._config.maxAttempts,\n\t\t\t\t\ttimestamp: Date.now()\n\t\t\t\t});\n\t\t\t\tlogger$13.info(`CallRecoveryManager: ${tier} ICE restart succeeded`);\n\t\t\t\tthis._attemptCount = 0;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"reinvite_failed\",\n\t\t\t\treason: `${tier} ICE restart returned false`,\n\t\t\t\tattempt: this._attemptCount,\n\t\t\t\tmaxAttempts: this._config.maxAttempts,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.warn(`CallRecoveryManager: ${tier} ICE restart failed`);\n\t\t\treturn false;\n\t\t} catch {\n\t\t\tthis.emitEvent({\n\t\t\t\taction: \"reinvite_timeout\",\n\t\t\t\treason: `${tier} ICE restart timed out after ${this._config.iceRestartTimeoutMs}ms`,\n\t\t\t\tattempt: this._attemptCount,\n\t\t\t\tmaxAttempts: this._config.maxAttempts,\n\t\t\t\ttimestamp: Date.now()\n\t\t\t});\n\t\t\tlogger$13.warn(`CallRecoveryManager: ${tier} ICE restart timed out`);\n\t\t\treturn false;\n\t\t}\n\t}\n\tasync withTimeout(promise, timeoutMs) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timeoutId = setTimeout(() => {\n\t\t\t\treject(/* @__PURE__ */ new Error(`Timeout after ${timeoutMs}ms`));\n\t\t\t}, timeoutMs);\n\t\t\tpromise.then((value) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\tresolve(value);\n\t\t\t}, (err) => {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t\treject(err instanceof Error ? err : new Error(String(err)));\n\t\t\t});\n\t\t});\n\t}\n\ttransitionTo(state) {\n\t\tconst prev = this._recoveryState$.value;\n\t\tif (prev !== state) {\n\t\t\tlogger$13.debug(`CallRecoveryManager: state ${prev} -> ${state}`);\n\t\t\tthis._recoveryState$.next(state);\n\t\t}\n\t}\n\tstartCooldown() {\n\t\tthis._cooldownUntil = Date.now() + this._config.cooldownMs;\n\t\tthis.transitionTo(\"cooldown\");\n\t\tif (this._cooldownSubscription) this._cooldownSubscription.unsubscribe();\n\t\tthis._cooldownSubscription = timer(this._config.cooldownMs).pipe(take(1), takeUntil(this._destroyed$), filter(() => this._recoveryState$.value === \"cooldown\")).subscribe(() => this.transitionTo(\"idle\"));\n\t}\n\temitEvent(event) {\n\t\tthis._recoveryEvent$.next(event);\n\t}\n};\n\n//#endregion\n//#region src/managers/ParticipantFactory.ts\n/**\n* Factory for creating Participant instances with proper dependency injection\n* Eliminates circular dependency between Call and Participant\n*/\nvar ParticipantFactory = class {\n\tconstructor(executeMethod, vertoManager, deviceController) {\n\t\tthis.executeMethod = executeMethod;\n\t\tthis.vertoManager = vertoManager;\n\t\tthis.deviceController = deviceController;\n\t}\n\t/**\n\t* Create a self participant (the local user in the call)\n\t*/\n\tcreateSelfParticipant(id) {\n\t\treturn new SelfParticipant(id, this.executeMethod, this.vertoManager, this.deviceController);\n\t}\n\t/**\n\t* Create a remote participant\n\t*/\n\tcreateParticipant(id) {\n\t\treturn new Participant(id, this.executeMethod, this.deviceController);\n\t}\n};\n\n//#endregion\n//#region src/utils/qualityScore.ts\n/** E-model base R factor for a perfect channel. */\nconst E_MODEL_BASE_R = 93.2;\n/** Delay/jitter weight factor. */\nconst E_MODEL_DELAY_WEIGHT = .024;\n/** Packet-loss weight factor. */\nconst E_MODEL_LOSS_WEIGHT = 2.5;\n/** R-factor valid range for the E-model polynomial. */\nconst R_FACTOR_MIN = 0;\nconst R_FACTOR_MAX = 100;\n/** Lower bound for MOS. */\nconst MOS_MIN = 1;\n/** Upper bound for MOS. */\nconst MOS_MAX = 5;\n/** MOS threshold boundaries (lower bound of each level). */\nconst MOS_EXCELLENT_THRESHOLD = 4;\nconst MOS_GOOD_THRESHOLD = 3.5;\nconst MOS_FAIR_THRESHOLD = 3;\nconst MOS_POOR_THRESHOLD = 2;\n/**\n* Compute a Mean Opinion Score from network metrics using the simplified\n* E-model formula (ITU-T G.107).\n*\n* ```\n* R   = 93.2 - (rtt/2 + jitter) * 0.024 - packetLoss * 2.5\n* MOS = 1 + 0.035 * R + R * (R - 60) * (100 - R) * 7e-6\n* ```\n*\n* @param rtt         Round-trip time in milliseconds\n* @param jitter      Jitter in milliseconds\n* @param packetLoss  Packet loss as a percentage (e.g. 5 means 5%)\n* @returns MOS value clamped to [1.0, 5.0]\n*/\nfunction computeMOS(rtt, jitter, packetLoss) {\n\tconst rawR = E_MODEL_BASE_R - (rtt / 2 + jitter) * E_MODEL_DELAY_WEIGHT - packetLoss * E_MODEL_LOSS_WEIGHT;\n\tconst r = Math.min(R_FACTOR_MAX, Math.max(R_FACTOR_MIN, rawR));\n\tconst mos = 1 + .035 * r + r * (r - 60) * (100 - r) * 7e-6;\n\treturn Math.min(MOS_MAX, Math.max(MOS_MIN, mos));\n}\n/**\n* Map a numeric MOS score to a human-readable quality level.\n*\n* | MOS Range   | Level       |\n* |-------------|-------------|\n* | 4.0 - 5.0   | excellent   |\n* | 3.5 - 4.0   | good        |\n* | 3.0 - 3.5   | fair        |\n* | 2.0 - 3.0   | poor        |\n* | 1.0 - 2.0   | critical    |\n*/\nfunction mosToQualityLevel(mos) {\n\tif (mos >= MOS_EXCELLENT_THRESHOLD) return \"excellent\";\n\tif (mos >= MOS_GOOD_THRESHOLD) return \"good\";\n\tif (mos >= MOS_FAIR_THRESHOLD) return \"fair\";\n\tif (mos >= MOS_POOR_THRESHOLD) return \"poor\";\n\treturn \"critical\";\n}\n\n//#endregion\n//#region src/core/entities/Call.ts\nconst logger$12 = getLogger();\n/**\n* Verto method for setting member layout positions. Its gateway DTO requires a\n* `targets` array whose entries are `{ target, position }` (NOT bare targets),\n* so {@link WebRTCCall.buildMethodParams} special-cases it. See issue #19400.\n*/\nconst POSITION_SET_METHOD = \"call.member.position.set\";\n/**\n* Ratio between the critical and warning RTT spike multipliers.\n* Warning threshold = baseline * warningMultiplier (default 3x)\n* Critical threshold = baseline * warningMultiplier * RTT_CRITICAL_TO_WARNING_RATIO\n* With default 3x warning: critical = 3 * 5/3 = 5x baseline.\n*/\nconst RTT_CRITICAL_TO_WARNING_RATIO = 5 / 3;\nconst fromDestinationParams = (destination) => {\n\tif (!destination) return {};\n\ttry {\n\t\tconst url = new URL(`destination:${destination}`);\n\t\tconst params = {};\n\t\turl.searchParams.forEach((value, key) => {\n\t\t\tparams[key] = value;\n\t\t});\n\t\treturn params;\n\t} catch (error) {\n\t\tlogger$12.warn(`Failed to parse destination URI: ${destination}`, error);\n\t\treturn {};\n\t}\n};\n/**\n* Concrete WebRTC call implementation.\n*\n* Manages the full lifecycle of a call including signaling, media streams,\n* participants, layout, and event routing. Created via {@link SignalWire.dial}\n* or received as an inbound call.\n*/\nvar WebRTCCall = class extends Destroyable {\n\tconstructor(clientSession, options, initialization, address) {\n\t\tsuper();\n\t\tthis.clientSession = clientSession;\n\t\tthis.options = options;\n\t\tthis.address = address;\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis._lastMergedStatus = \"new\";\n\t\tthis._answered$ = this.createReplaySubject();\n\t\tthis._holdState = false;\n\t\tthis._userVariables$ = this.createBehaviorSubject({ ...PreferencesContainer.instance.userVariables });\n\t\tthis._networkIssues$ = this.createBehaviorSubject([]);\n\t\tthis._networkMetrics$ = this.createBehaviorSubject([]);\n\t\tthis._isNetworkHealthy$ = this.createBehaviorSubject(true);\n\t\tthis._qualityScore$ = this.createBehaviorSubject(5);\n\t\tthis._qualityLevel$ = this.createBehaviorSubject(\"excellent\");\n\t\tthis._recoveryState$ = this.createBehaviorSubject(\"idle\");\n\t\tthis._recoveryEvent$ = this.createSubject();\n\t\tthis._bandwidthConstrained$ = this.createBehaviorSubject(false);\n\t\tthis._mediaParamsUpdated$ = this.createSubject();\n\t\tthis._customSubscriptions = /* @__PURE__ */ new Map();\n\t\tthis._pushToTalkEnabled = false;\n\t\tthis._remoteAudioMeter = null;\n\t\tthis.id = options.callId ?? v4();\n\t\tthis.to = options.to;\n\t\tthis._userVariables$.next({\n\t\t\t...this._userVariables$.value,\n\t\t\t...fromDestinationParams(options.to),\n\t\t\t...options.userVariables\n\t\t});\n\t\tthis.subscribeTo(this.webrtcMessages$, (message) => {\n\t\t\tconst userVars = getValueFrom(message, \"params.userVariables\");\n\t\t\tif (userVars) this._userVariables$.next({\n\t\t\t\t...this._userVariables$.value,\n\t\t\t\t...userVars\n\t\t\t});\n\t\t});\n\t\tconst managers = initialization.initializeManagers(this);\n\t\tthis.vertoManager = managers.vertoManager;\n\t\tthis.callEventsManager = managers.callEventsManager;\n\t\tif (options.initOffer) {\n\t\t\tthis._status$ = this.createBehaviorSubject(\"ringing\");\n\t\t\tthis._lastMergedStatus = \"ringing\";\n\t\t} else this._status$ = this.createBehaviorSubject(\"new\");\n\t\tconst { deviceController, networkChange$ } = initialization;\n\t\tthis._networkChange$ = networkChange$;\n\t\tthis.participantFactory = new ParticipantFactory(this.executeMethod.bind(this), this.vertoManager, deviceController);\n\t\tthis.subscribeTo(merge(this._status$.asObservable(), this.vertoManager.signalingStatus$).pipe(distinctUntilChanged(), takeUntil(this._destroyed$)), (status) => {\n\t\t\tthis._lastMergedStatus = status;\n\t\t\tif (status === \"connected\" && !this._statsMonitor) this.initResilienceSubsystems();\n\t\t\telse if (status === \"disconnected\") {\n\t\t\t\tthis._statsMonitor?.destroy();\n\t\t\t\tthis._statsMonitor = void 0;\n\t\t\t} else if (status === \"destroyed\" || status === \"failed\") this.stopResilienceSubsystems();\n\t\t});\n\t}\n\t/** Observable stream of errors from media, signaling, and peer connection layers. */\n\tget errors$() {\n\t\treturn this.deferEmission(this._errors$.asObservable());\n\t}\n\t/**\n\t* @internal Push an error to the call's error stream.\n\t* Fatal errors automatically transition the call to `'failed'` and destroy it.\n\t*/\n\temitError(callError) {\n\t\tif (this._status$.value === \"destroyed\" || this._status$.value === \"failed\") return;\n\t\tthis._errors$.next(callError);\n\t\tif (callError.fatal) {\n\t\t\tthis._status$.next(\"failed\");\n\t\t\tthis.destroy();\n\t\t}\n\t}\n\t/** Notify the recovery manager that a verto.modify signaling exchange failed. */\n\tnotifyModifyFailed() {\n\t\tthis._recoveryManager?.notifyModifyFailed();\n\t}\n\t/** Whether this call is `'inbound'` or `'outbound'`. */\n\tget direction() {\n\t\treturn this.options.initOffer ? \"inbound\" : \"outbound\";\n\t}\n\t/** Observable of the address associated with this call. */\n\tget address$() {\n\t\treturn this.deferEmission(from([this.address])).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Display name of the caller. */\n\tget fromName() {\n\t\treturn this.options.fromName;\n\t}\n\t/** Address URI of the caller. */\n\tget from() {\n\t\treturn this.options.from;\n\t}\n\t/** Display name of the callee. */\n\tget toName() {\n\t\treturn this.options.toName;\n\t}\n\t/** Toggles whether incoming video is received. @throws {UnimplementedError} Not yet implemented. */\n\tasync toggleIncomingVideo() {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** Toggles whether incoming audio is received. @throws {UnimplementedError} Not yet implemented. */\n\tasync toggleIncomingAudio() {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** @internal Registers an additional call ID for event routing. */\n\taddCallId(callId) {\n\t\tthis.callEventsManager.addCallId(callId);\n\t}\n\t/** List of capabilities available in the current call. */\n\tget capabilities() {\n\t\treturn this.callEventsManager.capabilities;\n\t}\n\t/** Current snapshot of all participants in the call. */\n\tget participants() {\n\t\treturn this.callEventsManager.participants;\n\t}\n\t/** The local participant, or `null` if not yet joined. */\n\tget self() {\n\t\treturn this.callEventsManager.self;\n\t}\n\t/** Toggles the call lock state, preventing or allowing new participants from joining. */\n\tasync toggleLock() {\n\t\tconst method = this.locked ? \"call.unlock\" : \"call.lock\";\n\t\tawait this.executeMethod(this.selfId ?? \"\", method, {});\n\t}\n\t/**\n\t* Toggles the hold state of the call (pauses/resumes local media transmission).\n\t*\n\t* Distinct from {@link Participant.toggleMute} which mutes individual tracks.\n\t*/\n\tasync toggleHold() {\n\t\tif (this._holdState) await this.vertoManager.unhold();\n\t\telse await this.vertoManager.hold();\n\t\tthis._holdState = !this._holdState;\n\t}\n\t/** @throws {UnimplementedError} Not yet implemented. Status tracked via {@link recording$}. */\n\tasync startRecording() {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** @throws {UnimplementedError} Not yet implemented. Status tracked via {@link streaming$}. */\n\tasync startStreaming() {\n\t\tthrow new UnimplementedError();\n\t}\n\t/**\n\t* Replaces the call's custom metadata.\n\t* @param _meta - Metadata object to set.\n\t* @throws {UnimplementedError} Not yet implemented.\n\t*/\n\tasync setMeta(_meta) {\n\t\tthrow new UnimplementedError();\n\t}\n\t/**\n\t* Merges values into the call's custom metadata (unlike {@link setMeta} which replaces).\n\t* @param _meta - Metadata to merge.\n\t* @throws {UnimplementedError} Not yet implemented.\n\t*/\n\tasync updateMeta(_meta) {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** Observable of layout layer positions for all participants. */\n\tget layoutLayers$() {\n\t\treturn this.deferEmission(this.callEventsManager.layoutLayers$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current snapshot of layout layers. */\n\tget layoutLayers() {\n\t\treturn this.callEventsManager.layoutLayers;\n\t}\n\t/**\n\t* Executes a Verto RPC method targeting a specific participant.\n\t*\n\t* Constructs call context (node_id, call_id, member_id) and sends the RPC request.\n\t*\n\t* @param target - Target member ID string, or a {@link MemberTarget} object.\n\t* @param method - Verto method name (e.g. `'call.mute'`, `'call.member.remove'`).\n\t* @param args - Parameters for the RPC method.\n\t* @returns The RPC response.\n\t* @throws {JSONRPCError} If the RPC call returns an error.\n\t*/\n\tasync executeMethod(target, method, args) {\n\t\tconst params = this.buildMethodParams(target, args, method);\n\t\tconst request = buildRPCRequest({\n\t\t\tmethod,\n\t\t\tparams\n\t\t});\n\t\ttry {\n\t\t\tconst response = await this.clientSession.execute(request);\n\t\t\tif (isJSONRPCErrorResponse(response)) throw new JSONRPCError(parseInt(response.result?.code ?? \"0\"), `Error response from method ${method}: ${response.result?.code} ${response.result?.message}`, void 0, void 0, request.id);\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tlogger$12.error(`[Call] Error executing method ${method} with params`, params, error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tbuildMethodParams(target, args, method) {\n\t\tconst self = {\n\t\t\tnode_id: this.nodeId ?? \"\",\n\t\t\tcall_id: this.id,\n\t\t\tmember_id: this.vertoManager.selfId ?? \"\"\n\t\t};\n\t\tif (method === POSITION_SET_METHOD) return {\n\t\t\t...args,\n\t\t\tself\n\t\t};\n\t\tif (typeof target === \"object\") return {\n\t\t\t...args,\n\t\t\tself,\n\t\t\ttargets: [target]\n\t\t};\n\t\treturn {\n\t\t\t...args,\n\t\t\tself,\n\t\t\ttarget: {\n\t\t\t\tnode_id: this.nodeId ?? \"\",\n\t\t\t\tcall_id: this.id,\n\t\t\t\tmember_id: target\n\t\t\t}\n\t\t};\n\t}\n\t/** Observable of the current call status (e.g. `'ringing'`, `'connected'`). */\n\tget status$() {\n\t\treturn this.publicCachedObservable(\"status$\", () => merge(this._status$.asObservable(), this.vertoManager.signalingStatus$).pipe(distinctUntilChanged(), tap((status) => {\n\t\t\tthis._lastMergedStatus = status;\n\t\t})));\n\t}\n\t/** Observable of the participants list, emits on join/leave/update. */\n\tget participants$() {\n\t\treturn this.deferEmission(this.callEventsManager.participants$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable of the local (self) participant. */\n\tget self$() {\n\t\treturn this.deferEmission(this.callEventsManager.self$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable indicating whether the call is being recorded. */\n\tget recording$() {\n\t\treturn this.deferEmission(this.callEventsManager.recording$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable indicating whether the call is being streamed. */\n\tget streaming$() {\n\t\treturn this.deferEmission(this.callEventsManager.streaming$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable indicating whether raise-hand priority is active. */\n\tget raiseHandPriority$() {\n\t\treturn this.deferEmission(this.callEventsManager.raiseHandPriority$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable indicating whether the call room is locked. */\n\tget locked$() {\n\t\treturn this.deferEmission(this.callEventsManager.locked$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable of custom metadata associated with the call. */\n\tget meta$() {\n\t\treturn this.deferEmission(this.callEventsManager.meta$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable of the call's capability flags. */\n\tget capabilities$() {\n\t\treturn this.deferEmission(this.callEventsManager.capabilities$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Observable of the current layout name. */\n\tget layout$() {\n\t\treturn this.deferEmission(this.callEventsManager.layout$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current call status. */\n\tget status() {\n\t\treturn this._lastMergedStatus;\n\t}\n\t/** Whether the call is currently being recorded. */\n\tget recording() {\n\t\treturn this.callEventsManager.recording;\n\t}\n\t/** Whether the call is currently being streamed. */\n\tget streaming() {\n\t\treturn this.callEventsManager.streaming;\n\t}\n\t/** Whether raise-hand priority is active. */\n\tget raiseHandPriority() {\n\t\treturn this.callEventsManager.raiseHandPriority;\n\t}\n\t/** Whether the call room is locked. */\n\tget locked() {\n\t\treturn this.callEventsManager.locked;\n\t}\n\t/** Current custom metadata of the call. */\n\tget meta() {\n\t\treturn this.callEventsManager.meta;\n\t}\n\t/** Current layout name, or `undefined` if not set. */\n\tget layout() {\n\t\treturn this.callEventsManager.layout;\n\t}\n\t/** Observable of available layout names. */\n\tget layouts$() {\n\t\treturn this.deferEmission(this.callEventsManager.layouts$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current snapshot of available layout names. */\n\tget layouts() {\n\t\treturn this.callEventsManager.layouts;\n\t}\n\t/** Observable of the local media stream (camera/microphone). */\n\tget localStream$() {\n\t\treturn this.deferEmission(this.vertoManager.localStream$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current local media stream, or `null` if not available. */\n\tget localStream() {\n\t\treturn this.vertoManager.localStream;\n\t}\n\t/** Observable of the remote media stream from the far end. */\n\tget remoteStream$() {\n\t\treturn this.deferEmission(this.vertoManager.remoteStream$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current remote media stream, or `null` if not available. */\n\tget remoteStream() {\n\t\treturn this.vertoManager.remoteStream;\n\t}\n\t/** Observable of custom user variables associated with the call. */\n\tget userVariables$() {\n\t\treturn this.deferEmission(this._userVariables$.asObservable());\n\t}\n\t/** a copy of the current custom user variables of the call. */\n\tget userVariables() {\n\t\treturn { ...this._userVariables$.value };\n\t}\n\t/** Merge current custom user variables of the call. */\n\tset userVariables(variables) {\n\t\tthis._userVariables$.next({\n\t\t\t...this._userVariables$.value,\n\t\t\t...variables\n\t\t});\n\t}\n\t/** Observable of current network health issues (empty array = healthy). */\n\tget networkIssues$() {\n\t\treturn this.deferEmission(this._networkIssues$.asObservable());\n\t}\n\t/** Current snapshot of network issues. */\n\tget networkIssues() {\n\t\treturn this._networkIssues$.value;\n\t}\n\t/** Simple boolean health indicator derived from stats monitor. */\n\tget isNetworkHealthy$() {\n\t\treturn this.deferEmission(this._isNetworkHealthy$.asObservable());\n\t}\n\t/** Whether the network is currently healthy. */\n\tget isNetworkHealthy() {\n\t\treturn this._isNetworkHealthy$.value;\n\t}\n\t/** Rolling history of raw network metrics (RTT, jitter, packet loss, bitrate). */\n\tget networkMetrics$() {\n\t\treturn this.deferEmission(this._networkMetrics$.asObservable());\n\t}\n\t/** Current snapshot of the metrics rolling window. */\n\tget networkMetrics() {\n\t\treturn this._networkMetrics$.value;\n\t}\n\t/** Observable of MOS quality score (1-5) computed from stats metrics. */\n\tget qualityScore$() {\n\t\treturn this.deferEmission(this._qualityScore$.asObservable());\n\t}\n\t/** Observable of simplified quality level (excellent/good/fair/poor/critical). */\n\tget qualityLevel$() {\n\t\treturn this.deferEmission(this._qualityLevel$.asObservable());\n\t}\n\t/** Observable of the recovery pipeline state machine. */\n\tget recoveryState$() {\n\t\treturn this.deferEmission(this._recoveryState$.asObservable());\n\t}\n\t/** Observable of recovery events (keyframe requested, ICE restart, etc.). */\n\tget recoveryEvent$() {\n\t\treturn this.deferEmission(this._recoveryEvent$.asObservable());\n\t}\n\t/** Observable indicating whether the call is bandwidth-constrained. */\n\tget bandwidthConstrained$() {\n\t\treturn this.deferEmission(this._bandwidthConstrained$.asObservable());\n\t}\n\t/** Observable that emits when server-pushed media params are applied. */\n\tget mediaParamsUpdated$() {\n\t\treturn this.deferEmission(this._mediaParamsUpdated$.asObservable());\n\t}\n\t/**\n\t* @internal Emit a media params update event.\n\t* Called by the VertoManager when server-pushed media params are applied.\n\t*/\n\temitMediaParamsUpdated(event) {\n\t\tthis._mediaParamsUpdated$.next(event);\n\t}\n\t/** Request a video keyframe via RTCP PLI/FIR. */\n\trequestKeyframe() {\n\t\tthis.vertoManager.requestKeyframe?.();\n\t}\n\t/** Force an ICE restart / re-INVITE. */\n\tasync requestIceRestart() {\n\t\tawait this.vertoManager.requestIceRestart?.();\n\t}\n\t/**\n\t* @internal Initialize resilience subsystems when the call reaches 'connected'.\n\t* Called from within the status subscription to wire stats and recovery.\n\t*/\n\tinitResilienceSubsystems() {\n\t\tconst pc = this.rtcPeerConnection;\n\t\tlogger$12.debug(`[Call] initResilienceSubsystems: pc=${pc ? \"exists\" : \"undefined\"}, connectionState=${pc?.connectionState}`);\n\t\tif (!pc) {\n\t\t\tlogger$12.warn(\"[Call] No peer connection available, skipping resilience init\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst prefs = PreferencesContainer.instance;\n\t\t\tthis._statsMonitor = new RTCStatsMonitor(pc, {\n\t\t\t\tpollingIntervalMs: prefs.statsPollingInterval,\n\t\t\t\tbaselineSamples: prefs.statsBaselineSamples,\n\t\t\t\tnoAudioPacketThresholdMs: prefs.statsNoPacketThreshold,\n\t\t\t\trttSpikeWarningMultiplier: prefs.statsRttSpikeMultiplier,\n\t\t\t\trttSpikeCriticalMultiplier: prefs.statsRttSpikeMultiplier * RTT_CRITICAL_TO_WARNING_RATIO,\n\t\t\t\tpacketLossWarningPercent: prefs.statsPacketLossThreshold * 100,\n\t\t\t\tpacketLossCriticalPercent: prefs.statsPacketLossThreshold * 200,\n\t\t\t\tjitterSpikeMultiplier: prefs.statsJitterSpikeMultiplier,\n\t\t\t\thistoryWindowSeconds: prefs.statsHistorySize\n\t\t\t});\n\t\t\tthis._recoveryManager = new CallRecoveryManager({\n\t\t\t\trequestKeyframe: () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (this.vertoManager.requestKeyframeAll) this.vertoManager.requestKeyframeAll();\n\t\t\t\t\t\telse this.vertoManager.requestKeyframe?.();\n\t\t\t\t\t} catch {}\n\t\t\t\t},\n\t\t\t\trequestIceRestart: async (relayOnly) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tif (this.vertoManager.requestIceRestartAll) await this.vertoManager.requestIceRestartAll(relayOnly);\n\t\t\t\t\t\telse await this.vertoManager.requestIceRestart?.(relayOnly);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn this.waitForPeerConnectionConnected();\n\t\t\t\t},\n\t\t\t\tdisableVideo: () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.vertoManager.muteMainVideoInputDevice();\n\t\t\t\t\t\tlogger$12.debug(\"[Call] Recovery manager disabled video\");\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tlogger$12.debug(\"[Call] Recovery manager failed to disable video\");\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tenableVideo: () => {\n\t\t\t\t\tthis.vertoManager.unmuteMainVideoInputDevice().catch(() => {\n\t\t\t\t\t\tlogger$12.debug(\"[Call] Recovery manager failed to enable video\");\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tisNegotiating: () => this.vertoManager.mainPeerConnection.isNegotiating,\n\t\t\t\tisCallConnected: () => this._lastMergedStatus === \"connected\",\n\t\t\t\tgetPeerConnectionState: () => pc.connectionState\n\t\t\t}, { signalingReady$: this.clientSession.authenticated$ }, {\n\t\t\t\tdebounceTimeMs: prefs.recoveryDebounceTime,\n\t\t\t\tcooldownMs: prefs.recoveryCooldown,\n\t\t\t\ticeGracePeriodMs: prefs.iceDisconnectedGracePeriod,\n\t\t\t\ticeRestartTimeoutMs: prefs.iceRestartTimeout,\n\t\t\t\tmaxAttempts: prefs.maxRecoveryAttempts,\n\t\t\t\tenableRelayFallback: prefs.enableRelayFallback,\n\t\t\t\tkeyframeMaxBurst: prefs.keyframeMaxBurst,\n\t\t\t\tkeyframeBurstWindowMs: prefs.keyframeBurstWindow,\n\t\t\t\tkeyframeCooldownMs: prefs.keyframeCooldown\n\t\t\t});\n\t\t\tthis.subscribeTo(this._statsMonitor.networkIssues$, (issues) => {\n\t\t\t\tthis._networkIssues$.next(issues);\n\t\t\t\tthis._recoveryManager?.reportNetworkIssues(issues);\n\t\t\t});\n\t\t\tthis.subscribeTo(this._statsMonitor.isNetworkHealthy$, (healthy) => {\n\t\t\t\tthis._isNetworkHealthy$.next(healthy);\n\t\t\t});\n\t\t\tthis.subscribeTo(this._statsMonitor.networkMetrics$, (metrics) => {\n\t\t\t\tthis._networkMetrics$.next(metrics);\n\t\t\t\tif (metrics.length > 0) {\n\t\t\t\t\tconst latest = metrics[metrics.length - 1];\n\t\t\t\t\tconst totalRecv = latest.audio.packetsReceived + latest.video.packetsReceived;\n\t\t\t\t\tconst totalLost = latest.audio.packetsLost + latest.video.packetsLost;\n\t\t\t\t\tconst lossPct = totalRecv + totalLost > 0 ? totalLost / (totalRecv + totalLost) * 100 : 0;\n\t\t\t\t\tconst mos = computeMOS(latest.roundTripTime, latest.audio.jitter, lossPct);\n\t\t\t\t\tthis._qualityScore$.next(mos);\n\t\t\t\t\tthis._qualityLevel$.next(mosToQualityLevel(mos));\n\t\t\t\t\tif (latest.availableOutgoingBitrate !== void 0) this._recoveryManager?.reportBandwidth(latest.availableOutgoingBitrate / 1e3);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.subscribeTo(this._statsMonitor.criticalIssue$, (issue) => {\n\t\t\t\tthis._recoveryManager?.pushTrigger({\n\t\t\t\t\tsource: \"stats\",\n\t\t\t\t\tdetail: `${issue.type}: ${issue.severity}`,\n\t\t\t\t\tissueType: issue.type\n\t\t\t\t});\n\t\t\t});\n\t\t\tthis.subscribeTo(this._recoveryManager.recoveryState$, (state) => {\n\t\t\t\tthis._recoveryState$.next(state);\n\t\t\t});\n\t\t\tthis.subscribeTo(this._recoveryManager.recoveryEvent$, (event) => {\n\t\t\t\tthis._recoveryEvent$.next(event);\n\t\t\t\tif (event.action === \"max_attempts_reached\") {\n\t\t\t\t\tlogger$12.warn(\"[Call] All recovery attempts exhausted, terminating call\");\n\t\t\t\t\tthis.emitError({\n\t\t\t\t\t\tkind: \"network\",\n\t\t\t\t\t\tfatal: true,\n\t\t\t\t\t\terror: /* @__PURE__ */ new Error(\"Call recovery failed: all attempts exhausted\"),\n\t\t\t\t\t\tcallId: this.id\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.subscribeTo(this._recoveryManager.bandwidthConstrained$, (constrained) => {\n\t\t\t\tthis._bandwidthConstrained$.next(constrained);\n\t\t\t});\n\t\t\tif (this._networkChange$) this.subscribeTo(this._networkChange$, (event) => {\n\t\t\t\tif (event.type === \"offline\") this._recoveryManager?.pushTrigger({\n\t\t\t\t\tsource: \"network\",\n\t\t\t\t\tdetail: \"browser went offline\"\n\t\t\t\t});\n\t\t\t\telse if (event.type === \"online\") this._recoveryManager?.handleWebSocketReconnect();\n\t\t\t});\n\t\t\tthis.subscribeTo(this.clientSession.authenticated$.pipe(skip(1), filter(Boolean)), () => {\n\t\t\t\tlogger$12.debug(\"[Call] WebSocket reconnected — notifying recovery manager\");\n\t\t\t\tthis._recoveryManager?.handleWebSocketReconnect();\n\t\t\t});\n\t\t\tthis._statsMonitor.start();\n\t\t\tlogger$12.debug(\"[Call] Resilience subsystems initialized for call\", this.id);\n\t\t} catch (error) {\n\t\t\tlogger$12.warn(\"[Call] Failed to initialize resilience subsystems:\", error);\n\t\t}\n\t}\n\t/**\n\t* Wait for the underlying RTCPeerConnection to reach 'connected' after\n\t* triggering an ICE restart. Resolves true on success, false on failure\n\t* or if the state doesn't transition within the configured timeout.\n\t*\n\t* Polls connectionState directly because the recovery manager already\n\t* wraps this call in its own withTimeout(); a separate listener-based\n\t* implementation would race the outer timeout in subtle ways.\n\t*/\n\tasync waitForPeerConnectionConnected() {\n\t\tconst pc = this.rtcPeerConnection;\n\t\tif (!pc) return false;\n\t\tconst deadline = Date.now() + PEER_CONNECTION_RECOVERY_WAIT_MS;\n\t\tfor (;;) {\n\t\t\tconst state = pc.connectionState;\n\t\t\tif (state === \"connected\") return true;\n\t\t\tif (state === \"failed\" || state === \"closed\") return false;\n\t\t\tif (Date.now() >= deadline) return false;\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, PEER_CONNECTION_RECOVERY_POLL_MS));\n\t\t}\n\t}\n\t/**\n\t* @internal Stop and destroy resilience subsystems (on disconnect/destroy).\n\t* Clears references so they can be re-created on reconnect.\n\t*/\n\tstopResilienceSubsystems() {\n\t\ttry {\n\t\t\tthis._statsMonitor?.destroy();\n\t\t\tthis._recoveryManager?.destroy();\n\t\t} catch {}\n\t\tthis._statsMonitor = void 0;\n\t\tthis._recoveryManager = void 0;\n\t}\n\t/** @internal */\n\tcreateParticipant(memberId, selfId) {\n\t\tif (memberId === (selfId ?? this.vertoManager.selfId)) return this.participantFactory.createSelfParticipant(memberId);\n\t\treturn this.participantFactory.createParticipant(memberId);\n\t}\n\t/** Observable of the current audio/video send/receive directions. */\n\tget mediaDirections$() {\n\t\treturn this.deferEmission(this.vertoManager.mediaDirections$).pipe(takeUntil(this._destroyed$));\n\t}\n\t/** Current audio/video send/receive directions. */\n\tget mediaDirections() {\n\t\treturn this.vertoManager.mediaDirections;\n\t}\n\tget participantsId$() {\n\t\treturn this.cachedObservable(\"participantsId$\", () => this.participants$.pipe(map((participants) => participants.map((participant) => participant.id))));\n\t}\n\t/**\n\t* Executes a raw JSON-RPC request on the client session.\n\t*\n\t* Lower-level than {@link executeMethod} — allows full control over the RPC request structure.\n\t*\n\t* @param request - Complete JSON-RPC request object.\n\t* @param options - Optional RPC execution options (timeout, etc.).\n\t* @returns The RPC response.\n\t* @throws {JSONRPCError} If the RPC call returns an error response.\n\t*/\n\tasync execute(request, options) {\n\t\treturn this.clientSession.execute(request, options);\n\t}\n\t/** Observable of the local participant's member ID. */\n\tget selfId$() {\n\t\treturn this.vertoManager.selfId$;\n\t}\n\t/** Local participant's member ID, or `null` if not joined. */\n\tget selfId() {\n\t\treturn this.vertoManager.selfId;\n\t}\n\t/** Observable of the server node ID handling this call. */\n\tget nodeId$() {\n\t\treturn this.vertoManager.nodeId$;\n\t}\n\t/** Server node ID handling this call, or `null`. */\n\tget nodeId() {\n\t\treturn this.vertoManager.nodeId;\n\t}\n\tisCallSessionEvent(event) {\n\t\ttry {\n\t\t\tlogger$12.debug(\"[Call] Checking if event is for this call session:\", event);\n\t\t\tconst callId = getValueFrom(event, \"params.params.callID\") ?? getValueFrom(event, \"params.call_id\");\n\t\t\tconst roomSessionId = getValueFrom(event, \"params.room_session_id\");\n\t\t\tlogger$12.debug(`[Call] Extracted session identifiers callID: ${callId} and roomSessionID: ${roomSessionId} from event:`);\n\t\t\treturn callId === this.id || !!callId && this.callEventsManager.isCallIdValid(callId) || !!roomSessionId && this.callEventsManager.isRoomSessionIdValid(roomSessionId);\n\t\t} catch (error) {\n\t\t\tlogger$12.error(\"[Call] Error checking if event is for this call session:\", error);\n\t\t\treturn false;\n\t\t}\n\t}\n\tget callSessionEvents$() {\n\t\treturn this.cachedObservable(\"callSessionEvents$\", () => this.clientSession.signalingEvent$.pipe(filter((event) => this.isCallSessionEvent(event)), tap((event) => {\n\t\t\tlogger$12.debug(\"[Call] Received call session event:\", event);\n\t\t}), takeUntil(this.destroyed$), share()));\n\t}\n\t/** Observable of call-updated events. */\n\tget callUpdated$() {\n\t\treturn this.publicCachedObservable(\"callUpdated$\", () => this.callSessionEvents$.pipe(filterAs(isCallUpdatedMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of member-joined events, emitted when a remote participant joins the call. */\n\tget memberJoined$() {\n\t\treturn this.publicCachedObservable(\"memberJoined$\", () => this.callSessionEvents$.pipe(filterAs(isMemberJoinedMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of member-left events, emitted when a participant leaves the call. */\n\tget memberLeft$() {\n\t\treturn this.publicCachedObservable(\"memberLeft$\", () => this.callSessionEvents$.pipe(filterAs(isMemberLeftMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of member-updated events (mute, volume, etc.). */\n\tget memberUpdated$() {\n\t\treturn this.publicCachedObservable(\"memberUpdated$\", () => this.callSessionEvents$.pipe(filterAs(isMemberUpdatedMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of member-talking events (speech start/stop). */\n\tget memberTalking$() {\n\t\treturn this.publicCachedObservable(\"memberTalking$\", () => this.callSessionEvents$.pipe(filterAs(isMemberTalkingMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of call state-change events. */\n\tget callStates$() {\n\t\treturn this.publicCachedObservable(\"callStates$\", () => this.callSessionEvents$.pipe(filterAs(isCallStateMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Observable of layout-changed events. */\n\tget layoutUpdates$() {\n\t\treturn this.publicCachedObservable(\"layoutUpdates$\", () => this.callSessionEvents$.pipe(filterAs(isLayoutChangedMetadata, \"params\"), takeUntil(this.destroyed$)));\n\t}\n\t/** Underlying `RTCPeerConnection`, for advanced use cases. */\n\tget rtcPeerConnection() {\n\t\treturn this.vertoManager.mainPeerConnection.peerConnection;\n\t}\n\t/** Observable of raw signaling events as plain objects. */\n\tget signalingEvent$() {\n\t\treturn this.publicCachedObservable(\"signalingEvent$\", () => this.callEvent$.pipe(map((event) => JSON.parse(JSON.stringify(event)))));\n\t}\n\t/**\n\t* Subscribe to a custom signaling event type on this call.\n\t*\n\t* Returns a cached observable that filters `callSessionEvents$` for events\n\t* whose `event_type` matches the given string. The observable completes\n\t* when the call is destroyed.\n\t*\n\t* Unlike `signalingEvent$` (which only emits known call-level event types),\n\t* this method also matches custom/user-defined event types.\n\t*\n\t* The SDK does not validate event type strings --- the server decides\n\t* whether a given type is valid.\n\t*\n\t* @param eventType - The event type to subscribe to (e.g. `'my.custom.event'`).\n\t* @returns An observable that emits matching signaling events.\n\t*\n\t* @example\n\t* ```ts\n\t* call.subscribe('my.custom.event').subscribe(event => {\n\t*   console.log('Custom event:', event);\n\t* });\n\t* ```\n\t*/\n\tsubscribe(eventType) {\n\t\tconst cached = this._customSubscriptions.get(eventType);\n\t\tif (cached) return cached;\n\t\tconst filtered$ = this.callSessionEvents$.pipe(filter((event) => event.event_type === eventType), map((event) => JSON.parse(JSON.stringify(event))), takeUntil(this._destroyed$));\n\t\tthis._sendVertoSubscribe(eventType).then(() => {\n\t\t\tthis._customSubscriptions.set(eventType, filtered$);\n\t\t}, (error) => {\n\t\t\tthis._customSubscriptions.delete(eventType);\n\t\t\tlogger$12.warn(`[Call] verto.subscribe for '${eventType}' failed, not caching:`, error);\n\t\t});\n\t\tthis._customSubscriptions.set(eventType, filtered$);\n\t\treturn filtered$;\n\t}\n\tget webrtcMessages$() {\n\t\treturn this.cachedObservable(\"webrtcMessages$\", () => this.callSessionEvents$.pipe(filterAs(isWebrtcMessageMetadata, \"params\"), tap((event) => logger$12.debug(\"[Call] Event is a WebRTC message event:\", event)), takeUntil(this.destroyed$), share()));\n\t}\n\tget callEvent$() {\n\t\treturn this.cachedObservable(\"callEvent$\", () => this.callSessionEvents$.pipe(filterAs(isSignalwireCallMetadata, \"params\"), tap((event) => logger$12.debug(\"[Call] Event is a call event:\", event)), takeUntil(this.destroyed$), share()));\n\t}\n\tget layoutEvent$() {\n\t\treturn this.cachedObservable(\"layoutEvent$\", () => this.callEvent$.pipe(filterAs(isLayoutChangedMetadata, \"params\")));\n\t}\n\t/**\n\t* Hangs up the call and releases all resources.\n\t*\n\t* Sends a Verto `bye` to the server, transitions status to `'disconnecting'`,\n\t* then destroys the call. After this, the call instance is no longer usable.\n\t*\n\t* @example\n\t* ```ts\n\t* await call.hangup();\n\t* ```\n\t*/\n\tasync hangup() {\n\t\tthis._status$.next(\"disconnecting\");\n\t\ttry {\n\t\t\tawait this.vertoManager.bye();\n\t\t} finally {\n\t\t\tthis.destroy();\n\t\t}\n\t}\n\t/**\n\t* Sends DTMF digits on the call.\n\t*\n\t* @param dtmf - The digit string to send (e.g. `'1234#'`).\n\t*\n\t* @example\n\t* ```ts\n\t* await call.sendDigits('1234#');\n\t* ```\n\t*/\n\tasync sendDigits(dtmf) {\n\t\treturn this.vertoManager.sendDigits(dtmf);\n\t}\n\t/** Observable of WebRTC-specific signaling messages. */\n\t/** Observable of call-level signaling events. */\n\t/** Observable of layout-changed signaling events. */\n\t/**\n\t* Accepts an inbound call, optionally overriding media options for the answer.\n\t*\n\t* @param options - Optional media constraints for the answer (audio/video).\n\t*\n\t* @example\n\t* ```ts\n\t* // Accept with defaults\n\t* call.answer();\n\t*\n\t* // Accept audio-only\n\t* call.answer({ audio: true, video: false });\n\t* ```\n\t* @see {@link reject} to decline the call instead.\n\t* @see {@link answered$} to observe the acceptance state.\n\t*/\n\tanswer(options) {\n\t\tthis._answerMediaOptions = options;\n\t\tthis._answered$.next(true);\n\t}\n\t/** Media options provided when answering. Used internally by the VertoManager. */\n\tget answerMediaOptions() {\n\t\treturn this._answerMediaOptions;\n\t}\n\t/**\n\t* Rejects an inbound call, preventing media negotiation.\n\t*\n\t* @see {@link answer} to accept the call instead.\n\t* @see {@link answered$} to observe the rejection state.\n\t*/\n\treject() {\n\t\tthis._answered$.next(false);\n\t}\n\t/** Observable that emits `true` when answered, `false` when rejected. */\n\tget answered$() {\n\t\treturn this.deferEmission(this._answered$.asObservable());\n\t}\n\t/**\n\t* Sets the call layout and, optionally, individual participant positions.\n\t*\n\t* The gateway `call.layout.set` DTO has **no** `positions` member, so when\n\t* `positions` is provided this method issues a `call.member.position.set`\n\t* request per member (via {@link Participant.setPosition}, which keys each\n\t* position by that member's own call context) alongside `call.layout.set`\n\t* (issue #19400, Flag #6).\n\t*\n\t* **These operations are NOT atomic.** The layout is applied first, then each\n\t* member position sequentially, so members may briefly flash into their\n\t* default slots before being moved to the requested positions.\n\t*\n\t* @param layout - Layout name (must be one of {@link layouts}).\n\t* @param positions - Optional map of member IDs to {@link VideoPosition} values.\n\t*   When omitted or empty, only the layout is changed.\n\t* @throws {InvalidParams} If the layout is not in the available {@link layouts}.\n\t*\n\t* @example\n\t* ```ts\n\t* await call.setLayout('grid-responsive', {\n\t*   [participantId]: 'reserved-0',\n\t* });\n\t* ```\n\t*/\n\tasync setLayout(layout, positions) {\n\t\tif (!this.layouts.includes(layout)) throw new InvalidParams(`Layout ${layout} is not available in the current call layouts: ${this.layouts.join(\", \")}`);\n\t\tconst selfId = await firstValueFrom(this.selfId$.pipe(filter((id) => id !== null)));\n\t\tawait this.executeMethod(selfId, \"call.layout.set\", { layout });\n\t\tconst positionEntries = Object.entries(positions ?? {});\n\t\tif (positionEntries.length === 0) return;\n\t\tfor (const [memberId, position] of positionEntries) {\n\t\t\tconst participant = this.participants.find((p) => p.id === memberId);\n\t\t\tif (!participant) {\n\t\t\t\tlogger$12.warn(`[Call] setLayout: member ${memberId} not found in participants; skipping position ${position}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait participant.setPosition(position);\n\t\t}\n\t}\n\t/**\n\t* Transfers the call to another destination.\n\t*\n\t* @param options - Transfer configuration including the target destination.\n\t* @see {@link status$} to observe the transfer progress.\n\t*/\n\tasync transfer(options) {\n\t\treturn this.vertoManager.transfer(options);\n\t}\n\t/**\n\t* Set the local microphone gain as a percentage applied before transmission.\n\t*\n\t*   - `0`   = silent\n\t*   - `100` = unity (no change, default)\n\t*   - `200` = 2× digital boost (max; expect clipping / noise amplification)\n\t*\n\t* Values are clamped to [0, 200]. Engages the local audio pipeline on\n\t* first use (one-time cost).\n\t*\n\t* Note: this is a **digital** multiplier applied in a Web Audio GainNode\n\t* between your mic track and the RTCRtpSender — it does not change the\n\t* physical mic's hardware sensitivity. Browsers' autoGainControl can\n\t* fight the setting; call {@link setAutoGainControl}(false) for\n\t* predictable behaviour.\n\t*\n\t* @param value - Gain percentage (0..200; 100 = unity).\n\t*/\n\tsetLocalMicrophoneGain(value) {\n\t\tconst pipeline = this.vertoManager.ensureLocalAudioPipeline();\n\t\tif (!pipeline) {\n\t\t\tlogger$12.warn(\"[Call] setLocalMicrophoneGain: audio pipeline unavailable\");\n\t\t\treturn;\n\t\t}\n\t\tconst percent = Math.max(0, Math.min(200, value));\n\t\tpipeline.setGain(percent / 100);\n\t}\n\t/** Observable of the current local microphone gain (0..200, where 100 = unity). */\n\tget localMicrophoneGain$() {\n\t\tconst pipeline = this.vertoManager.ensureLocalAudioPipeline();\n\t\tif (!pipeline) return of(100).pipe(takeUntil(this._destroyed$));\n\t\treturn this.publicCachedObservable(\"localMicrophoneGain$\", () => pipeline.gain$.pipe(map((multiplier) => multiplier * 100), takeUntil(this._destroyed$)));\n\t}\n\t/**\n\t* Observable of the RMS audio level of the local microphone, 0..1.\n\t* Emits at ~30fps while a mic track is active. Engages the local audio\n\t* pipeline on first subscription.\n\t*/\n\tget localAudioLevel$() {\n\t\tconst pipeline = this.vertoManager.ensureLocalAudioPipeline();\n\t\tif (!pipeline) return of(0).pipe(takeUntil(this._destroyed$));\n\t\treturn this.publicCachedObservable(\"localAudioLevel$\", () => pipeline.level$.pipe(takeUntil(this._destroyed$), share()));\n\t}\n\t/**\n\t* Observable that is `true` while the local participant is speaking\n\t* (RMS level above the VAD threshold, with hold time to avoid flicker).\n\t*/\n\tget localSpeaking$() {\n\t\tconst pipeline = this.vertoManager.ensureLocalAudioPipeline();\n\t\tif (!pipeline) return of(false).pipe(takeUntil(this._destroyed$));\n\t\treturn this.publicCachedObservable(\"localSpeaking$\", () => pipeline.speaking$.pipe(takeUntil(this._destroyed$), share()));\n\t}\n\t/**\n\t* Enable push-to-talk: while {@link setPushToTalkActive} has been called\n\t* with `false`, the microphone gain is forced to 0; calling\n\t* {@link setPushToTalkActive} with `true` restores the configured gain.\n\t* Use this instead of mute/unmute for instant talk/silence transitions\n\t* because it doesn't rebuild the track.\n\t*\n\t* This method installs the pipeline but does not attach any keyboard\n\t* listener — consumers bind the key themselves and call\n\t* {@link setPushToTalkActive} on keydown/keyup.\n\t*/\n\tenablePushToTalk() {\n\t\tconst pipeline = this.vertoManager.ensureLocalAudioPipeline();\n\t\tif (!pipeline) {\n\t\t\tlogger$12.warn(\"[Call] enablePushToTalk: audio pipeline unavailable\");\n\t\t\treturn;\n\t\t}\n\t\tpipeline.setPTTActive(false);\n\t\tthis._pushToTalkEnabled = true;\n\t}\n\t/** Disable push-to-talk; mic gain returns to the configured value. */\n\tdisablePushToTalk() {\n\t\tthis.vertoManager.localAudioPipeline?.setPTTActive(true);\n\t\tthis._pushToTalkEnabled = false;\n\t}\n\t/**\n\t* While push-to-talk is enabled, sets the talk state. `true` = transmitting,\n\t* `false` = silent. No-op if push-to-talk has not been enabled.\n\t*/\n\tsetPushToTalkActive(active) {\n\t\tif (!this._pushToTalkEnabled) return;\n\t\tthis.vertoManager.localAudioPipeline?.setPTTActive(active);\n\t}\n\t/**\n\t* Toggle echo cancellation on the local mic at runtime. Applied via\n\t* `track.applyConstraints`; browsers that don't honour runtime constraints\n\t* (notably iOS Safari) fall back to re-acquiring the track with the new\n\t* constraint set and plumbing the replacement through the local audio\n\t* pipeline if one is active.\n\t*/\n\tasync setEchoCancellation(enabled) {\n\t\tawait this.vertoManager.updateMediaConstraints({ audio: { echoCancellation: enabled } });\n\t}\n\t/** Toggle browser noise suppression on the local mic at runtime. */\n\tasync setNoiseSuppression(enabled) {\n\t\tawait this.vertoManager.updateMediaConstraints({ audio: { noiseSuppression: enabled } });\n\t}\n\t/** Toggle browser automatic gain control on the local mic at runtime. */\n\tasync setAutoGainControl(enabled) {\n\t\tawait this.vertoManager.updateMediaConstraints({ audio: { autoGainControl: enabled } });\n\t}\n\t/**\n\t* Observable of the aggregate remote audio level, 0..1 RMS. The server\n\t* delivers a single mixed audio stream for all remote participants — this\n\t* meter reports that mix. Per-participant audio is not available client-side.\n\t*\n\t* Engages a shared AudioContext on first subscription (cheap — one\n\t* AnalyserNode, no GainNode, no destination) so it does not affect the\n\t* caller's audio element playback.\n\t*/\n\tget remoteAudioLevel$() {\n\t\treturn this.publicCachedObservable(\"remoteAudioLevel$\", () => {\n\t\t\tthis._remoteAudioMeter ??= new RemoteAudioMeter();\n\t\t\tconst meter = this._remoteAudioMeter;\n\t\t\tthis.subscribeTo(this.vertoManager.remoteStream$, (stream) => {\n\t\t\t\tmeter.setStream(stream);\n\t\t\t});\n\t\t\treturn meter.level$.pipe(takeUntil(this._destroyed$), share());\n\t\t});\n\t}\n\t/** Destroys the call, releasing all resources and subscriptions. */\n\tdestroy() {\n\t\tif (this._status$.value === \"destroyed\") return;\n\t\tthis._status$.next(\"destroyed\");\n\t\tthis.stopResilienceSubsystems();\n\t\tthis._remoteAudioMeter?.destroy();\n\t\tthis._remoteAudioMeter = null;\n\t\tthis.vertoManager.destroy();\n\t\tthis.callEventsManager.destroy();\n\t\tsuper.destroy();\n\t}\n\t/**\n\t* @internal Send a verto.subscribe message to add an event type to the\n\t* server's subscription list for this call. Returns the underlying RPC\n\t* promise so callers can decide whether to cache the observable on success\n\t* or retry on failure.\n\t*/\n\tasync _sendVertoSubscribe(eventType) {\n\t\tconst message = VertoSubscribe({\n\t\t\tsessid: this.id,\n\t\t\teventChannel: [eventType]\n\t\t});\n\t\tconst params = {\n\t\t\tcallID: this.id,\n\t\t\tnode_id: this.vertoManager.nodeId ?? \"\",\n\t\t\tmessage\n\t\t};\n\t\tawait this.clientSession.execute(WebrtcVerto(params));\n\t}\n};\n\n//#endregion\n//#region src/managers/CallFactory.ts\n/**\n* Infers the semantic error category from a raw Error thrown by VertoManager\n* or an RTCPeerConnection layer.\n*/\nfunction inferCallErrorKind(error) {\n\tif (error instanceof RPCTimeoutError) return \"timeout\";\n\tif (error instanceof JSONRPCError) return \"signaling\";\n\tif (error instanceof MediaTrackError) return \"media\";\n\tif (error instanceof MediaAccessError) return \"media\";\n\tif (error instanceof WebSocketConnectionError || error instanceof TransportConnectionError) return \"network\";\n\treturn \"internal\";\n}\n/** JSON-RPC error codes that ClientSessionManager treats as recoverable at the\n* session level. Surfacing one of these against an in-flight call should not\n* destroy the call, because the session will reauthenticate and any pending\n* RPC can then be retried. */\nconst RECOVERABLE_RPC_CODES = new Set([\n\tRPC_ERROR_REQUESTER_VALIDATION_FAILED,\n\tRPC_ERROR_AUTHENTICATION_FAILED,\n\tRPC_ERROR_INVALID_PARAMS\n]);\n/** Determines whether an error should be fatal (destroy the call). */\nfunction isFatalError(error) {\n\tif (error instanceof VertoPongError) return false;\n\tif (error instanceof MediaTrackError) return false;\n\tif (error instanceof MediaAccessError) return error.fatal;\n\tif (error instanceof RPCTimeoutError) return false;\n\tif (error instanceof JSONRPCError && RECOVERABLE_RPC_CODES.has(error.code)) return false;\n\treturn true;\n}\n/**\n* Factory for creating WebRTCCall instances with proper manager wiring.\n* Eliminates circular dependencies by centralizing Call and Manager creation.\n*/\nvar CallFactory = class {\n\tconstructor(sessionManager, deviceController, attachManager, webRTCApiProvider, networkChange$) {\n\t\tthis.sessionManager = sessionManager;\n\t\tthis.deviceController = deviceController;\n\t\tthis.attachManager = attachManager;\n\t\tthis.webRTCApiProvider = webRTCApiProvider;\n\t\tthis.networkChange$ = networkChange$;\n\t}\n\t/**\n\t* Create a new WebRTCCall with properly initialized managers\n\t*/\n\tcreateCall(address, options) {\n\t\treturn new WebRTCCall(this.sessionManager, options, {\n\t\t\tinitializeManagers: (callInstance) => {\n\t\t\t\treturn {\n\t\t\t\t\tvertoManager: new WebRTCVertoManager(callInstance, this.attachManager, this.deviceController, this.webRTCApiProvider, {\n\t\t\t\t\t\tnodeId: options.nodeId,\n\t\t\t\t\t\tonError: (error, options$1) => {\n\t\t\t\t\t\t\tconst callError = {\n\t\t\t\t\t\t\t\tkind: inferCallErrorKind(error),\n\t\t\t\t\t\t\t\tfatal: options$1?.fatal ?? isFatalError(error),\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t\tcallId: callInstance.id\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcallInstance.emitError(callError);\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonModifyFailed: () => {\n\t\t\t\t\t\t\tcallInstance.notifyModifyFailed();\n\t\t\t\t\t\t}\n\t\t\t\t\t}),\n\t\t\t\t\tcallEventsManager: new CallEventsManager(callInstance)\n\t\t\t\t};\n\t\t\t},\n\t\t\tdeviceController: this.deviceController,\n\t\t\tnetworkChange$: this.networkChange$\n\t\t}, address);\n\t}\n};\n\n//#endregion\n//#region src/behaviors/Collection.ts\nconst logger$11 = getLogger();\nvar Fetcher = class {\n\tconstructor(endpoint, params, http) {\n\t\tthis.endpoint = endpoint;\n\t\tthis.http = http;\n\t\tthis.filter = (_item) => true;\n\t\tthis.mapper = (item) => item;\n\t\tthis.nextUrl = `${this.endpoint}?${params}`;\n\t}\n\tasync next() {\n\t\tif (!this.nextUrl) {\n\t\t\tthis.hasMore = false;\n\t\t\treturn [];\n\t\t}\n\t\tconst response = await this.http.request({\n\t\t\t...GET_PARAMS,\n\t\t\turl: this.nextUrl\n\t\t});\n\t\tif (response.ok && !!response.body) {\n\t\t\tconst result = JSON.parse(response.body);\n\t\t\tthis.nextUrl = result.links.next;\n\t\t\tthis.hasMore = !!this.nextUrl;\n\t\t\treturn result.data.filter(this.filter).map(this.mapper);\n\t\t}\n\t\tlogger$11.error(\"Failed to fetch entity\");\n\t\treturn [];\n\t}\n\tasync id(v) {\n\t\tconst response = await this.http.request({\n\t\t\t...GET_PARAMS,\n\t\t\turl: `${this.endpoint}/${String(v)}`\n\t\t});\n\t\tif (response.ok && !!response.body) return JSON.parse(response.body);\n\t}\n};\nvar EntityCollection = class extends Destroyable {\n\tconstructor(fetchController, update$, onError) {\n\t\tsuper();\n\t\tthis.fetchController = fetchController;\n\t\tthis.update$ = update$;\n\t\tthis.onError = onError;\n\t\tthis.collectionData = /* @__PURE__ */ new Map();\n\t\tthis.observablesRegistry = /* @__PURE__ */ new Map();\n\t\tthis.upsertData = (data) => {\n\t\t\tif (!data.id) return;\n\t\t\tconst existing = this.collectionData.get(data.id) ?? {};\n\t\t\tconst updated = {};\n\t\t\tconst allKeys = new Set([...Object.keys(existing), ...Object.keys(data)]);\n\t\t\tfor (const key of allKeys) {\n\t\t\t\tconst existingVal = existing[key];\n\t\t\t\tconst newVal = data[key];\n\t\t\t\tif (newVal !== void 0 && existingVal !== void 0 && typeof existingVal === \"object\" && existingVal !== null && !Array.isArray(existingVal) && typeof newVal === \"object\" && newVal !== null && !Array.isArray(newVal)) updated[key] = {\n\t\t\t\t\t...existingVal,\n\t\t\t\t\t...newVal\n\t\t\t\t};\n\t\t\t\telse if (newVal !== void 0) updated[key] = newVal;\n\t\t\t\telse updated[key] = existingVal;\n\t\t\t}\n\t\t\tthis.collectionData.set(data.id, updated);\n\t\t\tthis.observablesRegistry.get(data.id)?.next(updated);\n\t\t\tthis._values$.next(Array.from(this.collectionData.values()));\n\t\t};\n\t\tthis._loading$ = this.createBehaviorSubject(false);\n\t\tthis._values$ = this.createReplaySubject(1);\n\t\tthis._hasMore$ = this.createBehaviorSubject(true);\n\t\tthis.subscribeTo(this.update$, this.upsertData);\n\t\tthis.hasMore$ = defer(() => from(this.init())).pipe(switchMap(() => this._hasMore$), distinctUntilChanged(), shareReplay(1), takeUntil(this.destroyed$));\n\t}\n\tget loading$() {\n\t\treturn this._loading$.asObservable();\n\t}\n\tget loading() {\n\t\treturn this._loading$.value;\n\t}\n\tget values$() {\n\t\treturn this._values$.asObservable();\n\t}\n\tget hasMore() {\n\t\treturn this.fetchController.hasMore ?? true;\n\t}\n\tget updated$() {\n\t\treturn this.cachedObservable(\"updated$\", () => this._loading$.pipe(distinctUntilChanged(), skip(1), filter((loading) => !loading), map(() => void 0), takeUntil(this.destroyed$)));\n\t}\n\tget values() {\n\t\treturn Array.from(this.collectionData.values());\n\t}\n\tasync init() {\n\t\tif (this.fetchController.hasMore === false) {\n\t\t\tthis._hasMore$.next(false);\n\t\t\treturn;\n\t\t}\n\t\tawait this.fetchMore();\n\t}\n\tasync fetchMore() {\n\t\ttry {\n\t\t\tthis._loading$.next(true);\n\t\t\t(await this.fetchController.next()).forEach(this.upsertData);\n\t\t\tthis._hasMore$.next(this.fetchController.hasMore ?? false);\n\t\t\tthis._loading$.next(false);\n\t\t} catch (error) {\n\t\t\tlogger$11.error(`Failed to fetch initial collection data`, error);\n\t\t\tthis._hasMore$.next(this.fetchController.hasMore ?? false);\n\t\t\tthis._loading$.next(false);\n\t\t\tthis.onError?.(new CollectionFetchError(\"fetchMore\", error));\n\t\t}\n\t}\n\tasync tryFetch(key, value) {\n\t\ttry {\n\t\t\tthis._loading$.next(true);\n\t\t\tconst data = await this.fetchController[key]?.(value);\n\t\t\tthis._loading$.next(false);\n\t\t\tif (data) this.upsertData(data);\n\t\t\treturn data;\n\t\t} catch (error) {\n\t\t\tlogger$11.error(`Failed to fetch data for (${String(key)}:${String(value)}) :`, error);\n\t\t\tthis._loading$.next(false);\n\t\t\tthis.onError?.(new CollectionFetchError(`tryFetch(${String(key)})`, error));\n\t\t}\n\t}\n\tget$(id) {\n\t\tif (!this.observablesRegistry.has(id)) {\n\t\t\tthis.observablesRegistry.set(id, new ReplaySubject(1));\n\t\t\tconst data = this.collectionData.get(id);\n\t\t\tif (data) this.observablesRegistry.get(id)?.next(data);\n\t\t\telse this.tryFetch(\"id\", id);\n\t\t}\n\t\treturn this.observablesRegistry.get(id)?.asObservable();\n\t}\n\tasync find$(key, value) {\n\t\tconst data = Array.from(this.collectionData.values()).find((item) => item[key] === value) ?? await this.tryFetch(key, value);\n\t\treturn data ? this.get$(data.id) : void 0;\n\t}\n\tloadMore() {\n\t\tif (this.fetchController.hasMore !== false) this.fetchMore();\n\t}\n\tdestroy() {\n\t\tthis.observablesRegistry.forEach((subject) => subject.complete());\n\t\tthis.observablesRegistry.clear();\n\t\tsuper.destroy();\n\t}\n};\nvar EntityCollectionTransformed = class {\n\tconstructor(originalCollection, filter$2 = (i) => !!i, mapper = (item) => item) {\n\t\tthis.originalCollection = originalCollection;\n\t\tthis.filter = filter$2;\n\t\tthis.mapper = mapper;\n\t}\n\tget loading$() {\n\t\treturn this.originalCollection.loading$;\n\t}\n\tget loading() {\n\t\treturn this.originalCollection.loading;\n\t}\n\tget hasMore$() {\n\t\treturn this.originalCollection.hasMore$;\n\t}\n\tget hasMore() {\n\t\treturn this.originalCollection.hasMore;\n\t}\n\tget values() {\n\t\treturn this.originalCollection.values.filter(this.filter).map(this.mapper);\n\t}\n\tget values$() {\n\t\treturn this._values$ ??= this.originalCollection.values$.pipe(map((values) => values.filter(this.filter).map(this.mapper)));\n\t}\n\tget$(id) {\n\t\tconst original$ = this.originalCollection.get$(id);\n\t\treturn !original$ ? original$ : original$.pipe(pipe(filter(this.filter), map(this.mapper)));\n\t}\n\tasync find$(key, value) {\n\t\tconst original$ = await this.originalCollection.find$(key, value);\n\t\treturn !original$ ? original$ : original$.pipe(pipe(filter(this.filter), map(this.mapper)));\n\t}\n\tloadMore() {\n\t\tthis.originalCollection.loadMore();\n\t}\n\tdestroy() {\n\t\tthis.originalCollection.destroy();\n\t}\n};\n\n//#endregion\n//#region src/core/entities/Address.ts\n/**\n* Represents a contact or room in the directory.\n*\n* Provides identity metadata, conversation history, text messaging,\n* and activity state for an address entry.\n*/\nvar Address = class extends Destroyable {\n\tconstructor(addressId, conversationManager, addressProvider) {\n\t\tsuper();\n\t\tthis.addressId = addressId;\n\t\tthis.conversationManager = conversationManager;\n\t\tthis.addressProvider = addressProvider;\n\t\tthis.initConversationMessages = async () => {\n\t\t\tthis._conversationMessages = this._conversationMessages ?? await this.conversationManager.getConversationMessageCollection(this.id);\n\t\t\tif (this._conversationMessages.hasMore) this._conversationMessages.loadMore();\n\t\t\treturn this._conversationMessages;\n\t\t};\n\t\tthis.textMessages$ = defer(this.initConversationMessages).pipe(map(() => this.textMessage), shareReplay(1), takeUntil(this.destroyed$));\n\t\tthis.history$ = defer(this.initConversationMessages).pipe(map(() => this.history), shareReplay(1), takeUntil(this.destroyed$));\n\t\tthis._state$ = this.createBehaviorSubject(null);\n\t}\n\t/** @internal */\n\tupnext(state) {\n\t\tconst update = {\n\t\t\t...this._state$.value,\n\t\t\t...state\n\t\t};\n\t\tthis._state$.next(update);\n\t}\n\t/** @internal */\n\tget state() {\n\t\treturn this._state$.value;\n\t}\n\t/** Unique address identifier. */\n\tget id() {\n\t\treturn this.addressId;\n\t}\n\t/** Address name (resource identifier). */\n\tget name() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.name;\n\t}\n\t/** ISO timestamp of when the address was created. */\n\tget createdAt() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.created_at;\n\t}\n\t/** Default communication channel URI (video for rooms, audio otherwise). */\n\tget defaultChannel() {\n\t\treturn this.type === \"room\" ? this.channels.video : this.channels.audio;\n\t}\n\t/** Observable of the human-readable display name. */\n\tget displayName$() {\n\t\treturn this.cachedObservable(\"displayName$\", () => this._state$.pipe(filterNull(), map((state) => state.display_name), takeUntil(this.destroyed$)));\n\t}\n\t/** Human-readable display name. */\n\tget displayName() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.display_name;\n\t}\n\t/** Observable of the preview image URL. */\n\tget previewUrl$() {\n\t\treturn this.cachedObservable(\"previewUrl$\", () => this._state$.pipe(filterNull(), map((state) => state.preview_url), takeUntil(this.destroyed$)));\n\t}\n\t/** Preview image URL. */\n\tget previewUrl() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.preview_url;\n\t}\n\t/** Observable of the cover image URL. */\n\tget coverUrl$() {\n\t\treturn this.cachedObservable(\"coverUrl$\", () => this._state$.pipe(filterNull(), shareReplay(1), map((state) => state.cover_url), takeUntil(this.destroyed$)));\n\t}\n\t/** Cover image URL. */\n\tget coverUrl() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.cover_url;\n\t}\n\t/** Observable of the underlying resource ID. */\n\tget resourceId$() {\n\t\treturn this.cachedObservable(\"resourceId$\", () => this._state$.pipe(filterNull(), shareReplay(1), map((state) => state.resource_id), takeUntil(this.destroyed$)));\n\t}\n\t/** Underlying resource ID. */\n\tget resourceId() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.resource_id;\n\t}\n\t/** Observable of the resource type (e.g. `'room'`, `'subscriber'`). */\n\tget type$() {\n\t\treturn this.cachedObservable(\"type$\", () => this._state$.pipe(filterNull(), shareReplay(1), map((state) => state.type), takeUntil(this.destroyed$)));\n\t}\n\t/** Resource type (e.g. `'room'`, `'subscriber'`). */\n\tget type() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.type;\n\t}\n\t/** Observable of available communication channels (audio, video, messaging). */\n\tget channels$() {\n\t\treturn this.cachedObservable(\"channels$\", () => this._state$.pipe(filterNull(), shareReplay(1), map((state) => state.channels), takeUntil(this.destroyed$)));\n\t}\n\t/** Available communication channels. */\n\tget channels() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.channels;\n\t}\n\t/** Whether the address (room) is locked. */\n\tget locked() {\n\t\tif (!this._state$.value) throw new DependencyError(\"state not initialized\");\n\t\treturn this._state$.value.locked;\n\t}\n\t/** Observable indicating whether the address (room) is locked. */\n\tget locked$() {\n\t\treturn this.cachedObservable(\"locked$\", () => this._state$.pipe(filterNull(), shareReplay(1), map((state) => state.locked), takeUntil(this.destroyed$)));\n\t}\n\t/**\n\t* Sends a text message to this address.\n\t*\n\t* @param text - The message text to send.\n\t*\n\t* @example\n\t* ```ts\n\t* await address.sendText('Hello!');\n\t* ```\n\t*/\n\tasync sendText(text) {\n\t\treturn this.conversationManager.sendText(text, this.id);\n\t}\n\t/**\n\t* Collection of text messages for this address, with pagination support.\n\t*\n\t* Returns `undefined` until {@link textMessages$} has been subscribed to (lazy-loaded).\n\t* Filters to `'chat'` subtype messages from the conversation.\n\t*\n\t* @see {@link textMessages$} to trigger lazy loading.\n\t* @see {@link sendText} to send a new message.\n\t*/\n\tget textMessage() {\n\t\tif (!this._conversationMessages) return;\n\t\tthis._textMessages$ = this._textMessages$ ?? new EntityCollectionTransformed(this._conversationMessages, (item) => item.subtype === \"chat\", (item) => ({\n\t\t\tid: item.id,\n\t\t\ttext: item.text,\n\t\t\tcreated: item.ts,\n\t\t\tfromAddress$: this.addressProvider.get$(item.from_fabric_address_id)\n\t\t}));\n\t\treturn this._textMessages$;\n\t}\n\t/**\n\t* Collection of call history entries for this address, with pagination support.\n\t*\n\t* Returns `undefined` until {@link history$} has been subscribed to (lazy-loaded).\n\t* Filters to `'log'` subtype messages including kind, status, start/end times.\n\t*\n\t* @see {@link history$} to trigger lazy loading.\n\t*/\n\tget history() {\n\t\tif (!this._conversationMessages) return;\n\t\tthis._history$ = this._history$ ?? new EntityCollectionTransformed(this._conversationMessages, (item) => item.subtype === \"log\", (item) => ({\n\t\t\tid: item.id,\n\t\t\tkind: item.kind,\n\t\t\tstatus: item.details.status,\n\t\t\tstarted: item.details.start_time,\n\t\t\tended: item.details.end_time,\n\t\t\tfromAddress$: this.addressProvider.get$(item.from_fabric_address_id)\n\t\t}));\n\t\treturn this._history$;\n\t}\n\t/** Observable of active call states for this address. @throws {UnimplementedError} Requires presence support. */\n\tget activity$() {\n\t\tthrow new UnimplementedError();\n\t}\n\t/** Active call states for this address. @throws {UnimplementedError} Requires presence support. */\n\tget activity() {\n\t\tthrow new UnimplementedError();\n\t}\n};\n\n//#endregion\n//#region src/core/utils.ts\nconst logger$10 = getLogger();\nconst isRPCConnectResult = (e) => {\n\tlogger$10.debug(\"isRPCConnectResult check:\", e);\n\tif (!e || typeof e !== \"object\") return false;\n\tconst result = e;\n\tconst is = typeof result.identity === \"string\" && typeof result.protocol === \"string\" && typeof result.authorization === \"object\" && typeof result.authorization.jti === \"string\" && typeof result.authorization.project_id === \"string\" && typeof result.authorization.fabric_subscriber === \"object\";\n\tlogger$10.debug(\"isRPCConnectResult check result:\", is);\n\treturn is;\n};\nvar PendingRPC = class PendingRPC {\n\tstatic {\n\t\tthis.defaultTimeoutMs = 5e3;\n\t}\n\tconstructor(request, responses$, options) {\n\t\tthis.id = v4();\n\t\tlogger$10.debug(`[PendingRPC(${this.id}) request:${request.id}: method:${request.method}] Creating PendingRPC`);\n\t\tthis.request = request;\n\t\tconst timeoutMs = options?.timeoutMs ?? PendingRPC.defaultTimeoutMs;\n\t\tconst signal = options?.signal;\n\t\tthis.promise = new Promise((resolve, reject) => {\n\t\t\tif (signal?.aborted) {\n\t\t\t\treject(new DOMException(\"The operation was aborted\", \"AbortError\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlet isSettled = false;\n\t\t\tconst subscription = race(responses$.pipe(filter((result) => result.id === request.id), take(1)), new Observable((subscriber) => {\n\t\t\t\tconst timer$1 = setTimeout(() => {\n\t\t\t\t\tsubscriber.error(new RPCTimeoutError(request.id, timeoutMs));\n\t\t\t\t}, timeoutMs);\n\t\t\t\treturn () => clearTimeout(timer$1);\n\t\t\t}), signal ? new Observable((subscriber) => {\n\t\t\t\tconst abortHandler = () => {\n\t\t\t\t\tsubscriber.error(new DOMException(\"The operation was aborted\", \"AbortError\"));\n\t\t\t\t};\n\t\t\t\tsignal.addEventListener(\"abort\", abortHandler);\n\t\t\t\treturn () => signal.removeEventListener(\"abort\", abortHandler);\n\t\t\t}) : NEVER).subscribe({\n\t\t\t\tnext: (response) => {\n\t\t\t\t\tisSettled = true;\n\t\t\t\t\tif (response.error) {\n\t\t\t\t\t\tconst rpcError = new JSONRPCError(response.error.code, response.error.message, response.error.data, void 0, request.id);\n\t\t\t\t\t\tlogger$10.debug(`[PendingRPC(${this.id}) request:${request.id}] Rejecting promise with RPC error:`, rpcError);\n\t\t\t\t\t\treject(rpcError);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogger$10.debug(`[PendingRPC(${this.id}) request:${request.id}] Resolving promise with response:`, response);\n\t\t\t\t\t\tresolve(response);\n\t\t\t\t\t}\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t},\n\t\t\t\terror: (error) => {\n\t\t\t\t\tlogger$10.debug(`[PendingRPC(${this.id}) request:${request.id}] Rejecting promise with error:`, error);\n\t\t\t\t\tisSettled = true;\n\t\t\t\t\treject(error);\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t},\n\t\t\t\tcomplete: () => {\n\t\t\t\t\tlogger$10.debug(`[PendingRPC(${this.id}) request:${request.id}] Observable completed`);\n\t\t\t\t\tif (!isSettled) reject(new RPCTimeoutError(request.id, timeoutMs));\n\t\t\t\t\tsubscription.unsubscribe();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\tasync then(onfulfilled, onrejected) {\n\t\treturn this.promise.then(onfulfilled, onrejected);\n\t}\n\tasync catch(onrejected) {\n\t\treturn this.promise.catch(onrejected);\n\t}\n\tasync finally(onfinally) {\n\t\treturn this.promise.finally(onfinally);\n\t}\n};\n\n//#endregion\n//#region src/managers/ClientSessionManager.ts\nconst logger$9 = getLogger();\n/**\n* Decide whether an error emitted on `call.errors$` during dial should\n* abort the dial. A non-fatal MediaAccessError means the call degraded to\n* receive-only and still connects — everything else rejects `dial()` with\n* the real cause.\n*\n* Pure function — exported for unit testing.\n*/\nfunction shouldAbortDial(callError) {\n\treturn callError.fatal || !(callError.error instanceof MediaAccessError);\n}\nconst getAddressSearchURI = (options) => {\n\tconst to = options.to?.split(\"?\")[0];\n\tconst from$1 = options.from?.startsWith(\"subscriber://\") ? options.from.replace(\"subscriber://\", \"\") : options.from;\n\tconst name = to ?? from$1;\n\tif (!name) throw new UnexpectedError(\"Error building Address name\");\n\treturn name;\n};\nvar ClientSessionManager = class extends Destroyable {\n\tconstructor(getCredential, transport, storage, authorizationStateKey, deviceController, attachManager, webRTCApiProvider, dpopManager, networkChange$) {\n\t\tsuper();\n\t\tthis.getCredential = getCredential;\n\t\tthis.transport = transport;\n\t\tthis.storage = storage;\n\t\tthis.authorizationStateKey = authorizationStateKey;\n\t\tthis.attachManager = attachManager;\n\t\tthis.dpopManager = dpopManager;\n\t\tthis.callCreateTimeout = 6e3;\n\t\tthis.agent = `signalwire-js/4.0.0`;\n\t\tthis.eventAcks = true;\n\t\tthis.authorizationState$ = this.createReplaySubject(1);\n\t\tthis.connectVersion = {\n\t\t\tmajor: 4,\n\t\t\tminor: 0,\n\t\t\trevision: 0\n\t\t};\n\t\tthis._authorization$ = this.createBehaviorSubject(void 0);\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis._authState$ = this.createBehaviorSubject({ kind: \"unauthenticated\" });\n\t\tthis._wasClientBound = false;\n\t\tthis._userInfo$ = this.createBehaviorSubject(null);\n\t\tthis._calls$ = this.createBehaviorSubject({});\n\t\tthis._iceServers$ = this.createBehaviorSubject([]);\n\t\tattachManager.setSession(this);\n\t\tthis.callFactory = new CallFactory(this, deviceController, attachManager, webRTCApiProvider, networkChange$);\n\t\tthis.initialized$ = defer(() => from(this.init())).pipe(shareReplay(1), takeUntil(this.destroyed$));\n\t}\n\tget incomingCalls$() {\n\t\treturn this.cachedObservable(\"incomingCalls$\", () => this.calls$.pipe(map((calls) => calls.filter((call) => call.direction === \"inbound\"))));\n\t}\n\tget incomingCalls() {\n\t\treturn Object.values(this._calls$.value).filter((call) => call.direction === \"inbound\");\n\t}\n\tget userInfo$() {\n\t\treturn this._userInfo$.asObservable();\n\t}\n\tget userInfo() {\n\t\treturn this._userInfo$.value;\n\t}\n\tget calls$() {\n\t\treturn this.cachedObservable(\"calls$\", () => this._calls$.pipe(map((calls) => Object.values(calls))));\n\t}\n\tget calls() {\n\t\treturn Object.values(this._calls$.value);\n\t}\n\tget iceServers() {\n\t\treturn this._iceServers$.value;\n\t}\n\tget authorization$() {\n\t\treturn this._authorization$.asObservable();\n\t}\n\tget authorization() {\n\t\treturn this._authorization$.value;\n\t}\n\tget errors$() {\n\t\treturn this._errors$.asObservable();\n\t}\n\tget authenticated$() {\n\t\treturn this._authState$.pipe(map((state) => state.kind === \"authenticated\"), distinctUntilChanged());\n\t}\n\tget authenticated() {\n\t\treturn this._authState$.value.kind === \"authenticated\";\n\t}\n\t/**\n\t* Whether this session is client-bound (using a Client Bound SAT).\n\t* When client-bound, DPoP proof creation failures are treated as\n\t* authentication errors rather than silently degraded.\n\t* @internal\n\t*/\n\tget clientBound() {\n\t\treturn this._wasClientBound;\n\t}\n\t/** @internal Current auth state for debugging/testing. */\n\tget authState() {\n\t\treturn this._authState$.value;\n\t}\n\t/**\n\t* Set the directory instance\n\t* Called by SignalWire after directory is created\n\t* @internal\n\t*/\n\tsetDirectory(directory) {\n\t\tthis._directory = directory;\n\t}\n\tasync execute(request, options) {\n\t\ttry {\n\t\t\treturn await this.transport.execute(request, options);\n\t\t} catch (error) {\n\t\t\tlogger$9.debug(\"[Session] Execute Error\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\tthrow error;\n\t\t}\n\t}\n\tsend(message) {\n\t\tthis.transport.send(message);\n\t}\n\tasync init() {\n\t\tawait this.loadAuthorizationStateFromStorage();\n\t\tthis.setupMessageHandlers();\n\t\treturn true;\n\t}\n\tsetupMessageHandlers() {\n\t\tlogger$9.debug(\"[Session] Setting up message handlers\");\n\t\tthis.subscribeTo(this.authStateEvent$, async (authStateEvent) => {\n\t\t\tlogger$9.debug(\"[Session] Authorization state event received:\", authStateEvent);\n\t\t\ttry {\n\t\t\t\tawait this.updateAuthorizationStateInStorage(authStateEvent.authorization_state);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$9.error(\"[Session] Failed to handle authorization state update:\", error);\n\t\t\t\tthis._errors$.next(new AuthStateHandlerError(error));\n\t\t\t}\n\t\t});\n\t\tthis.subscribeTo(this.transport.connectionStatus$.pipe(filter((status) => status === \"disconnected\" || status === \"reconnecting\")), () => {\n\t\t\tif (this._authState$.value.kind === \"authenticated\") this._authState$.next({ kind: \"unauthenticated\" });\n\t\t});\n\t\tthis.subscribeTo(this.transport.connectionStatus$.pipe(filter((status) => status === \"connected\"), exhaustMap(() => {\n\t\t\tlogger$9.debug(\"[Session] Connection established, initiating authentication\");\n\t\t\treturn from(this.authenticate()).pipe(catchError((error) => {\n\t\t\t\tthis.handleAuthenticationError(error).catch((err) => {\n\t\t\t\t\tlogger$9.error(\"[Session] Error handling authentication failure:\", err);\n\t\t\t\t});\n\t\t\t\treturn EMPTY;\n\t\t\t}));\n\t\t})), void 0);\n\t\tthis.subscribeTo(this.vertoInvite$, async (invite) => {\n\t\t\tlogger$9.debug(\"[Session] Verto invite received:\", invite);\n\t\t\ttry {\n\t\t\t\tawait this.createInboundCall(invite);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$9.error(\"[Session] Error handling Verto invite:\", error);\n\t\t\t\tthis._errors$.next(new VertoInviteHandlerError(error));\n\t\t\t}\n\t\t});\n\t\tthis.subscribeTo(this.vertoAttach$, async (attach) => {\n\t\t\tlogger$9.debug(\"[Session] Verto attach received:\", attach);\n\t\t\ttry {\n\t\t\t\tawait this.handleVertoAttach(attach);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$9.error(\"[Session] Error handling Verto attach:\", error);\n\t\t\t\tthis._errors$.next(new VertoAttachHandlerError(error));\n\t\t\t}\n\t\t});\n\t}\n\tasync loadAuthorizationStateFromStorage() {\n\t\ttry {\n\t\t\tconst storedState = await this.storage.getItem(this.authorizationStateKey);\n\t\t\tthis.authorizationState$.next(storedState ?? void 0);\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"Failed to retrieve authorization state from storage:\", error);\n\t\t\tthis.authorizationState$.next(void 0);\n\t\t}\n\t}\n\tasync updateAuthorizationStateInStorage(authorizationState) {\n\t\tif (!authorizationState) {\n\t\t\tlogger$9.debug(\"[Session] Removing authorization state from storage\");\n\t\t\ttry {\n\t\t\t\tawait this.storage.removeItem(this.authorizationStateKey);\n\t\t\t\tthis.authorizationState$.next(void 0);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$9.error(\"Failed to remove authorization state from storage:\", error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tlogger$9.debug(\"[Session] Updating authorization state in storage\");\n\t\t\tawait this.storage.setItem(this.authorizationStateKey, authorizationState);\n\t\t\tthis.authorizationState$.next(authorizationState);\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"Failed to retrieve authorization state from storage:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tget authStateEvent$() {\n\t\treturn this.cachedObservable(\"authStateEvent$\", () => this.signalingEvent$.pipe(tap((msg) => {\n\t\t\tlogger$9.debug(\"[Session] Received incoming message:\", msg);\n\t\t}), filterAs(isSignalwireAuthorizationStateMetadata, \"params\"), tap((event) => {\n\t\t\tlogger$9.debug(\"[Session] Authorization state event received:\", event.authorization_state);\n\t\t})));\n\t}\n\tget signalingEvent$() {\n\t\treturn this.cachedObservable(\"signalingEvent$\", () => this.transport.incomingEvent$.pipe(filterAs(isSignalwireRequest, \"params\"), share()));\n\t}\n\tget vertoInvite$() {\n\t\treturn this.cachedObservable(\"vertoInvite$\", () => this.signalingEvent$.pipe(filter(isWebrtcMessageMetadata), filter((event) => isVertoInviteMessage(event.params)), map((event) => ({\n\t\t\tnode_id: event.node_id,\n\t\t\t...event.params.params\n\t\t}))));\n\t}\n\tget vertoAttach$() {\n\t\treturn this.cachedObservable(\"vertoAttach$\", () => this.signalingEvent$.pipe(filter(isWebrtcMessageMetadata), filter((event) => isVertoAttachMessage(event.params)), map((event) => ({\n\t\t\tnode_id: event.node_id,\n\t\t\t...event.params.params\n\t\t}))));\n\t}\n\tget contexts() {\n\t\treturn [];\n\t}\n\tget eventing() {\n\t\treturn [];\n\t}\n\tget topics() {\n\t\treturn [];\n\t}\n\tget authentication() {\n\t\tconst credential = this.getCredential();\n\t\tif (!credential.token) throw new DependencyError(\"Credential token is undefined\");\n\t\treturn { jwt_token: credential.token };\n\t}\n\tasync connect() {\n\t\tawait firstValueFrom(this.initialized$);\n\t\tawait this.transport.connect();\n\t\tawait firstValueFrom(this.authenticated$.pipe(takeUntil(this.destroyed$), filter(Boolean), take(1), timeout({ first: 15e3 })));\n\t}\n\tasync handleAuthenticationError(error) {\n\t\tlogger$9.error(\"Authentication error:\", error);\n\t\tconst isRecoverableAuthError = error instanceof JSONRPCError && (error.code === RPC_ERROR_REQUESTER_VALIDATION_FAILED || error.code === RPC_ERROR_INVALID_PARAMS || error.code === RPC_ERROR_AUTHENTICATION_FAILED);\n\t\tconst hasStoredState = await firstValueFrom(this.authorizationState$.pipe(take(1))) !== void 0;\n\t\tif (isRecoverableAuthError && hasStoredState) {\n\t\t\tlogger$9.debug(\"[Session] Recoverable auth error — cleaning up stored state and reconnecting fresh\");\n\t\t\ttry {\n\t\t\t\tawait this.cleanupStoredConnectionParams();\n\t\t\t} catch (cleanupError) {\n\t\t\t\tlogger$9.error(\"Failed to cleanup stored connection params:\", cleanupError);\n\t\t\t} finally {\n\t\t\t\tthis.transport.reconnect();\n\t\t\t}\n\t\t} else this._errors$.next(error);\n\t}\n\t/**\n\t* Clear the resume state (authorization_state + protocol) only.\n\t*\n\t* This is the stale-auth-state recovery helper used by handleAuthError:\n\t* the server rejected a reconnect, so the resume state is discarded and a\n\t* fresh connect follows. Attach records are deliberately preserved — the\n\t* session lives on through the reconnect and reattachCalls() needs the\n\t* stored call references afterwards. Do NOT add detachAll() here.\n\t*\n\t* For public teardown (disconnect/destroy), use {@link teardownSessionState}\n\t* instead, which clears the attach records as well.\n\t*/\n\tasync cleanupStoredConnectionParams() {\n\t\tawait this.transport.setProtocol(void 0);\n\t\tawait this.updateAuthorizationStateInStorage(void 0);\n\t\tthis._authorization$.next(void 0);\n\t}\n\t/**\n\t* Public-teardown helper for disconnect()/destroy(). Clears the resume\n\t* state (authorization_state + protocol) AND the attach records as one\n\t* atomic unit.\n\t*\n\t* The two stores are coupled: the backend only honors attach records\n\t* within the session identified by the resume state, so ending the\n\t* session must clear both. Clearing one without the other strands records\n\t* no future session can honor (disconnect) or revives a session the\n\t* developer explicitly ended (destroy).\n\t*\n\t* Distinct from {@link cleanupStoredConnectionParams}, which keeps the\n\t* attach records for the stale-auth-state recovery path.\n\t*/\n\tasync teardownSessionState() {\n\t\tawait this.cleanupStoredConnectionParams();\n\t\tawait this.attachManager.detachAll();\n\t}\n\tasync updateAuthState(authorization_state) {\n\t\ttry {\n\t\t\tawait this.storage.setItem(this.authorizationStateKey, authorization_state);\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"Failed to update authorization state in storage:\", error);\n\t\t\tthis._errors$.next(new AuthStateHandlerError(error));\n\t\t}\n\t}\n\tasync reauthenticate(token, dpopToken, options) {\n\t\tlogger$9.debug(\"[Session] Re-authenticating session\");\n\t\ttry {\n\t\t\tlet resolvedDpopToken = dpopToken;\n\t\t\tif (!resolvedDpopToken && this.dpopManager?.initialized) try {\n\t\t\t\tresolvedDpopToken = await this.dpopManager.createRpcProof({ method: \"signalwire.reauthenticate\" });\n\t\t\t} catch (error) {\n\t\t\t\tif (this.clientBound) throw error;\n\t\t\t\tlogger$9.warn(\"[Session] Failed to create DPoP proof for reauthenticate:\", error);\n\t\t\t}\n\t\t\tconst request = RPCReauthenticate({\n\t\t\t\tproject: this._authorization$.value?.project_id ?? \"\",\n\t\t\t\tjwt_token: token,\n\t\t\t\t...resolvedDpopToken ? { dpop_token: resolvedDpopToken } : {}\n\t\t\t});\n\t\t\tawait lastValueFrom(from(this.transport.execute(request)).pipe(throwOnRPCError(), take(1), catchError((err) => {\n\t\t\t\tlogger$9.error(\"[Session] Re-authentication RPC failed:\", err);\n\t\t\t\tthrow err;\n\t\t\t})));\n\t\t\tif (options?.clientBound) this._wasClientBound = true;\n\t\t\tlogger$9.debug(\"[Session] Re-authentication successful, updating stored auth state\");\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"[Session] Re-authentication failed:\", error);\n\t\t\tthis._errors$.next(new AuthStateHandlerError(error));\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync authenticate() {\n\t\tlogger$9.debug(\"[Session] Starting authentication process\");\n\t\tconst persistedParams = await firstValueFrom(combineLatest({\n\t\t\tprotocol: this.transport.protocol$,\n\t\t\tauthorization_state: this.authorizationState$\n\t\t}).pipe(take(1)));\n\t\tlogger$9.debug(\"[Session] Persisted params:\\n\", {\n\t\t\tprotocol: persistedParams.protocol,\n\t\t\tauthStateLength: persistedParams.authorization_state?.length\n\t\t});\n\t\tconst hasReconnectState = persistedParams.authorization_state && persistedParams.protocol;\n\t\tconst storedToken = this.getCredential().token;\n\t\tconst isReconnect = hasReconnectState && storedToken;\n\t\tlet dpopToken;\n\t\tif (isReconnect) logger$9.debug(\"[Session] Reconnecting with stored jwt_token + authorization_state\");\n\t\telse if (this.onBeforeReconnect && this.clientBound) {\n\t\t\tlogger$9.debug(\"[Session] Refreshing credentials before fresh connect\");\n\t\t\tawait this.onBeforeReconnect();\n\t\t}\n\t\tif ((!isReconnect || this.clientBound) && this.dpopManager?.initialized) try {\n\t\t\tdpopToken = await this.dpopManager.createRpcProof({ method: \"signalwire.connect\" });\n\t\t} catch (error) {\n\t\t\tif (this.clientBound) throw error;\n\t\t\tlogger$9.warn(\"[Session] Failed to create DPoP proof for connect, proceeding without:\", error);\n\t\t}\n\t\tconst rpcConnectRequest = RPCConnect({\n\t\t\tauthentication: isReconnect ? { jwt_token: storedToken } : this.authentication,\n\t\t\tversion: this.connectVersion,\n\t\t\tagent: this.agent,\n\t\t\tcontexts: this.contexts,\n\t\t\teventing: this.eventing,\n\t\t\ttopics: this.topics,\n\t\t\tevent_acks: this.eventAcks,\n\t\t\t...dpopToken ? { dpop_token: dpopToken } : {},\n\t\t\t...isReconnect ? {\n\t\t\t\tauthorization_state: persistedParams.authorization_state,\n\t\t\t\tprotocol: persistedParams.protocol\n\t\t\t} : {}\n\t\t});\n\t\tconst response = await lastValueFrom(from(this.transport.execute(rpcConnectRequest)).pipe(throwOnRPCError(), map((res) => res.result), filter(isRPCConnectResult), tap(() => {\n\t\t\tlogger$9.debug(\"[Session] Response passed filter, processing authentication result\");\n\t\t}), take(1), catchError((err) => {\n\t\t\tlogger$9.error(\"[Session] Authentication RPC failed:\", err);\n\t\t\tthrow err;\n\t\t})));\n\t\tlogger$9.debug(\"[Session] Processing authentication result:\", {\n\t\t\thasProtocol: !!response.protocol,\n\t\t\thasAuthorization: !!response.authorization,\n\t\t\thasIceServers: !!response.ice_servers\n\t\t});\n\t\tif (response.protocol) await this.transport.setProtocol(response.protocol);\n\t\tthis._authorization$.next(response.authorization);\n\t\tthis._iceServers$.next(response.ice_servers ?? []);\n\t\tthis._authState$.next({ kind: \"authenticated\" });\n\t\tlogger$9.debug(\"[Session] Authentication completed successfully\");\n\t}\n\tasync disconnect() {\n\t\tthis.transport.disconnect();\n\t\tthis._authState$.next({ kind: \"unauthenticated\" });\n\t\tawait this.teardownSessionState();\n\t}\n\tasync createInboundCall(invite) {\n\t\tconst callSession = await this.createCall({\n\t\t\tnodeId: invite.node_id,\n\t\t\tcallId: invite.callID,\n\t\t\tinitOffer: invite.sdp,\n\t\t\ttoName: invite.callee_id_name,\n\t\t\tto: invite.callee_id_number,\n\t\t\tfromName: invite.caller_id_name,\n\t\t\tfrom: invite.caller_id_number,\n\t\t\tdisplayDirection: invite.display_direction,\n\t\t\tuserVariables: invite.userVariables\n\t\t});\n\t\tthis._calls$.next({\n\t\t\t[`${callSession.id}`]: callSession,\n\t\t\t...this._calls$.value\n\t\t});\n\t}\n\t/**\n\t* Handle a server-pushed verto.attach event at the session level.\n\t*\n\t* On page reload the server detects the reconnected session and pushes\n\t* verto.attach for any active calls. If a call object already exists\n\t* (network blip, no reload), the per-call handler in VertoManager deals\n\t* with it. This method only creates a new call object when no existing\n\t* one matches the callID.\n\t*/\n\tasync handleVertoAttach(attach) {\n\t\tconst { callID } = attach;\n\t\tif (callID in this._calls$.value) {\n\t\t\tlogger$9.debug(`[Session] Verto attach for existing call ${callID}, deferring to per-call handler`);\n\t\t\treturn;\n\t\t}\n\t\tconst storedOptions = await this.attachManager.consumePendingAttachment(callID);\n\t\tlogger$9.debug(`[Session] Creating reattached call for callID: ${callID}`);\n\t\tconst callSession = await this.createCall({\n\t\t\tnodeId: attach.node_id,\n\t\t\tcallId: callID,\n\t\t\ttoName: attach.callee_id_name,\n\t\t\tto: attach.callee_id_number,\n\t\t\tfromName: attach.caller_id_name,\n\t\t\tfrom: attach.caller_id_number,\n\t\t\treattach: true,\n\t\t\t...storedOptions\n\t\t});\n\t\tthis._calls$.next({\n\t\t\t[`${callSession.id}`]: callSession,\n\t\t\t...this._calls$.value\n\t\t});\n\t}\n\tasync createOutboundCall(destination, options = {}) {\n\t\tconst destinationURI = destination instanceof Address ? destination.defaultChannel : destination;\n\t\tlet callSession;\n\t\ttry {\n\t\t\tcallSession = await this.createCall({\n\t\t\t\tto: destinationURI,\n\t\t\t\t...options\n\t\t\t});\n\t\t\tawait firstValueFrom(race(callSession.selfId$.pipe(filter((id) => Boolean(id)), take(1), timeout(this.callCreateTimeout)), callSession.errors$.pipe(filter(shouldAbortDial), take(1), switchMap((callError) => throwError(() => callError.error)))));\n\t\t\tthis._calls$.next({\n\t\t\t\t[`${callSession.id}`]: callSession,\n\t\t\t\t...this._calls$.value\n\t\t\t});\n\t\t\treturn callSession;\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"[Session] Error creating outbound call:\", error);\n\t\t\tcallSession?.destroy();\n\t\t\tconst callError = new CallCreateError(error instanceof TimeoutError ? \"Call create timeout\" : \"Call creation failed\", error, \"outbound\");\n\t\t\tthis._errors$.next(callError);\n\t\t\tthrow callError;\n\t\t}\n\t}\n\tasync createCall(options = {}) {\n\t\ttry {\n\t\t\tconst addressURI = getAddressSearchURI(options);\n\t\t\tlet address;\n\t\t\ttry {\n\t\t\t\tif (!this._directory) throw new DependencyError(\"Directory not initialized\");\n\t\t\t\tconst addressId = await this._directory.findAddressIdByURI(addressURI);\n\t\t\t\tif (!addressId) throw new DependencyError(`Address name: ${addressURI} not found`);\n\t\t\t\taddress = this._directory.get(addressId);\n\t\t\t\tif (!address) throw new DependencyError(`Address ID: ${addressId} not found`);\n\t\t\t} catch {\n\t\t\t\tlogger$9.warn(`[Session] Directory lookup failed for ${addressURI}, proceeding with raw URI`);\n\t\t\t}\n\t\t\tconst callSession = this.callFactory.createCall(address, { ...options });\n\t\t\tthis.subscribeTo(callSession.status$.pipe(filter((status) => status === \"destroyed\"), take(1)), () => {\n\t\t\t\tconst { [`${callSession.id}`]: _, ...remainingCalls } = this._calls$.value;\n\t\t\t\tthis._calls$.next(remainingCalls);\n\t\t\t});\n\t\t\treturn callSession;\n\t\t} catch (error) {\n\t\t\tlogger$9.error(\"[Session] Error creating call session:\", error);\n\t\t\tthrow new CallCreateError(\"Call create error\", error, options.initOffer ? \"inbound\" : \"outbound\");\n\t\t}\n\t}\n\tdestroy() {\n\t\tfor (const call of Object.values(this._calls$.value)) call.hangup();\n\t\tsuper.destroy();\n\t}\n};\nvar ClientSessionWrapper = class {\n\tconstructor(clientSessionManager) {\n\t\tthis.clientSessionManager = clientSessionManager;\n\t}\n\tget authenticated$() {\n\t\treturn this.clientSessionManager.authenticated$;\n\t}\n\tget authenticated() {\n\t\treturn this.clientSessionManager.authenticated;\n\t}\n\tget signalingEvent$() {\n\t\treturn this.clientSessionManager.signalingEvent$;\n\t}\n\tget iceServers() {\n\t\treturn this.clientSessionManager.iceServers;\n\t}\n\tasync execute(request, options) {\n\t\treturn this.clientSessionManager.execute(request, options);\n\t}\n\tget incomingCalls$() {\n\t\treturn this.clientSessionManager.incomingCalls$;\n\t}\n\tget incomingCalls() {\n\t\treturn this.clientSessionManager.incomingCalls;\n\t}\n\tget calls$() {\n\t\treturn this.clientSessionManager.calls$;\n\t}\n\tget calls() {\n\t\treturn this.clientSessionManager.calls;\n\t}\n};\n\n//#endregion\n//#region src/utils/isString.ts\nconst isString = (obj) => typeof obj === \"string\";\n\n//#endregion\n//#region src/managers/ConversationsManager.ts\nconst logger$8 = getLogger();\nvar ConversationMessagesFetcher = class extends Fetcher {\n\tconstructor(groupId, http) {\n\t\tsuper(`/api/fabric/conversations/${groupId}/messages`, \"page_size=100\", http);\n\t\tthis.groupId = groupId;\n\t}\n};\nvar ConversationMessageCollection = class extends EntityCollection {\n\tconstructor(groupId, update$, http, onError) {\n\t\tsuper(new ConversationMessagesFetcher(groupId, http), update$, onError);\n\t}\n};\nvar ConversationsManager = class {\n\tconstructor(clientSession, http, getUserAddressId, onError) {\n\t\tthis.clientSession = clientSession;\n\t\tthis.http = http;\n\t\tthis.getUserAddressId = getUserAddressId;\n\t\tthis.onError = onError;\n\t\tthis.groupIds = /* @__PURE__ */ new Map();\n\t}\n\tasync join(addressId) {\n\t\tconst userFromAddressId = this.getUserAddressId();\n\t\ttry {\n\t\t\tconst response = await this.http.request({\n\t\t\t\t...POST_PARAMS,\n\t\t\t\turl: `/api/fabric/conversations/join`,\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tfrom_fabric_address_id: userFromAddressId,\n\t\t\t\t\tfabric_address_ids: [addressId, userFromAddressId]\n\t\t\t\t})\n\t\t\t});\n\t\t\tif (response.ok && !!response.body) {\n\t\t\t\tconst data = JSON.parse(response.body);\n\t\t\t\tif (isString(data.group_id)) {\n\t\t\t\t\tthis.groupIds.set(addressId, data.group_id);\n\t\t\t\t\treturn data.group_id;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow new ConversationError(\"Join Failed - Unexpected response\");\n\t\t} catch (error) {\n\t\t\tlogger$8.error(\"[ConversationsManager] Failed to join conversation:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync getConversationMessageCollection(addressId) {\n\t\tconst groupId = this.groupIds.get(addressId) ?? await this.join(addressId);\n\t\treturn Promise.resolve(new ConversationMessageCollection(groupId, this.clientSession.signalingEvent$.pipe(filterAs(isConversationMessageMetadata, \"params\"), tap((event) => logger$8.debug(\"[ConversationsManager ] Conversation Event:\", event)), map((params) => ({ ...params }))), this.http, this.onError));\n\t}\n\tasync sendText(text, destinationAddressId) {\n\t\tconst groupId = this.groupIds.get(destinationAddressId) ?? await this.join(destinationAddressId);\n\t\tconst userFromAddressId = this.getUserAddressId();\n\t\ttry {\n\t\t\tif ((await this.http.request({\n\t\t\t\t...POST_PARAMS,\n\t\t\t\turl: \"/api/fabric/messages\",\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tgroup_id: groupId,\n\t\t\t\t\tfrom_fabric_address_id: userFromAddressId,\n\t\t\t\t\ttext\n\t\t\t\t})\n\t\t\t})).ok) return;\n\t\t\tthrow new ConversationError(\"Send Text Failed - Unexpected response\");\n\t\t} catch (error) {\n\t\t\tlogger$8.error(\"[ConversationsManager] Failed to send text message:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/managers/DeviceTokenManager.ts\nconst logger$7 = getLogger();\n/**\n* Resolves the token expiry timestamp (epoch seconds) using a 3-tier priority chain:\n* 1. `data.expires_at` — server-provided absolute timestamp\n* 2. `data.expires_in` — server-provided relative lifetime\n* 3. Fallback to `DEVICE_TOKEN_DEFAULT_EXPIRE_IN` with a warning\n*/\nfunction resolveExpiresAt(data) {\n\tif (data.expires_at) return data.expires_at;\n\tif (data.expires_in) return Math.floor(Date.now() / 1e3) + data.expires_in;\n\tlogger$7.warn(\"[DeviceToken] Could not determine token expiry, using default\");\n\treturn Math.floor(Date.now() / 1e3) + DEVICE_TOKEN_DEFAULT_EXPIRE_IN;\n}\n/**\n* Resolves the token TTL in seconds from a fresh response.\n* Called at token receive time so `expires_at - now` reflects the original lifetime.\n*\n* 1. `data.expires_in` — server-provided TTL directly\n* 2. `data.expires_at - now` — derive TTL from absolute timestamp\n* 3. Fallback to `DEVICE_TOKEN_DEFAULT_EXPIRE_IN`\n*/\nfunction resolveExpireIn(data) {\n\tif (data.expires_in) return data.expires_in;\n\tif (data.expires_at) return Math.max(data.expires_at - Math.floor(Date.now() / 1e3), 1);\n\treturn DEVICE_TOKEN_DEFAULT_EXPIRE_IN;\n}\n/**\n* Manages the Client Bound SAT lifecycle: activation, token exchange,\n* reauthentication, and automatic refresh scheduling.\n*\n* Extends {@link Destroyable} for automatic RxJS subscription and subject cleanup.\n* Uses a reactive pipeline (`BehaviorSubject` + `switchMap(timer())`) instead of\n* raw `setTimeout` for refresh scheduling.\n*/\nvar DeviceTokenManager = class extends Destroyable {\n\tconstructor(dpopManager, http, errorHandler, getCredential) {\n\t\tsuper();\n\t\tthis.dpopManager = dpopManager;\n\t\tthis.http = http;\n\t\tthis.errorHandler = errorHandler;\n\t\tthis.getCredential = getCredential;\n\t\tthis._currentToken$ = this.createBehaviorSubject(null);\n\t\tthis._refreshInProgress = false;\n\t\tthis._paused = false;\n\t\tthis._effectiveExpireIn = DEVICE_TOKEN_DEFAULT_EXPIRE_IN;\n\t\tthis.subscribeTo(this._currentToken$.pipe(filter(Boolean), switchMap((tokenData) => {\n\t\t\tconst expiresAt = resolveExpiresAt(tokenData);\n\t\t\tconst refreshIn = Math.max(expiresAt * 1e3 - Date.now() - DEVICE_TOKEN_REFRESH_BUFFER_MS, 1e3);\n\t\t\tlogger$7.debug(`[DeviceToken] Scheduling Client Bound SAT refresh in ${refreshIn}ms`);\n\t\t\treturn timer(refreshIn);\n\t\t})), () => {\n\t\t\tthis.executeRefresh();\n\t\t});\n\t}\n\t/** Current token TTL in milliseconds. Used to extend cached credential expiry on refresh. */\n\tget effectiveExpireIn() {\n\t\treturn this._effectiveExpireIn;\n\t}\n\t/**\n\t* Activates the Client Bound SAT flow when the user's token has\n\t* `sat:refresh` scope.\n\t*\n\t* Returns an {@link ActivationResult} indicating whether the manager\n\t* took ownership of refresh duties. The caller must use the `activated`\n\t* boolean to decide whether to keep its own refresh path armed — when\n\t* `activated` is `false`, the caller is responsible for refresh.\n\t*\n\t* Steps on success:\n\t* 1. Check user's `sat_claims` for `sat:refresh` scope\n\t* 2. Call `/api/fabric/subscriber/devices/token` with a DPoP proof\n\t* 3. Reauthenticate the session with the Client Bound SAT + DPoP proof\n\t* 4. Emit token to trigger the reactive refresh pipeline\n\t*/\n\tasync activate(user, session, updateCredential) {\n\t\tconst { satClaims } = user;\n\t\tif (!satClaims?.scope?.includes(SAT_REFRESH_SCOPE)) {\n\t\t\tlogger$7.debug(\"[DeviceToken] No sat:refresh scope, skipping Client Bound SAT activation\");\n\t\t\treturn {\n\t\t\t\tactivated: false,\n\t\t\t\treason: \"no-scope\"\n\t\t\t};\n\t\t}\n\t\tthis._session = session;\n\t\tthis._updateCredential = updateCredential;\n\t\ttry {\n\t\t\tconst cached = this._currentToken$.value;\n\t\t\tif (cached && this.isTokenFresh(cached)) {\n\t\t\t\tlogger$7.debug(\"[DeviceToken] Reusing cached Client Bound SAT — skipping /devices/token\");\n\t\t\t\tconst rpcProof$1 = await this.dpopManager.createRpcProof({ method: \"signalwire.reauthenticate\" });\n\t\t\t\tawait session.reauthenticate(cached.token, rpcProof$1, { clientBound: true });\n\t\t\t\tupdateCredential({ token: cached.token });\n\t\t\t\treturn { activated: true };\n\t\t\t}\n\t\t\tconst tokenData = await this.obtainToken();\n\t\t\tif (!tokenData.expires_at && !tokenData.expires_in && satClaims.expires_at) tokenData.expires_at = satClaims.expires_at;\n\t\t\tthis._effectiveExpireIn = resolveExpireIn(tokenData);\n\t\t\tconst rpcProof = await this.dpopManager.createRpcProof({ method: \"signalwire.reauthenticate\" });\n\t\t\tawait session.reauthenticate(tokenData.token, rpcProof, { clientBound: true });\n\t\t\tupdateCredential({ token: tokenData.token });\n\t\t\tlogger$7.info(\"[DeviceToken] Client Bound SAT activated successfully\");\n\t\t\tthis._currentToken$.next(tokenData);\n\t\t\treturn { activated: true };\n\t\t} catch (error) {\n\t\t\tlogger$7.error(\"[DeviceToken] Failed to activate Client Bound SAT:\", error);\n\t\t\tthis.errorHandler(new DPoPInitError(error, \"Failed to activate Client Bound SAT\"));\n\t\t\treturn {\n\t\t\t\tactivated: false,\n\t\t\t\treason: \"endpoint-failed\"\n\t\t\t};\n\t\t}\n\t}\n\t/**\n\t* Returns true when the cached token has enough headroom before expiry to\n\t* be safely reused on reactivation. The headroom matches the refresh\n\t* buffer, so a token within the refresh window is treated as stale (the\n\t* reactive pipeline is about to refresh it anyway).\n\t*/\n\tisTokenFresh(token) {\n\t\treturn resolveExpiresAt(token) * 1e3 - Date.now() > DEVICE_TOKEN_REFRESH_BUFFER_MS;\n\t}\n\t/**\n\t* Obtains a Client Bound SAT from `/api/fabric/subscriber/devices/token`.\n\t* Returns the full {@link DeviceTokenResponse} including expiry metadata.\n\t*/\n\tasync obtainToken() {\n\t\tconst dpopProof = await this.dpopManager.createHttpProof({\n\t\t\tmethod: \"POST\",\n\t\t\turi: DEVICE_TOKEN_ENDPOINT\n\t\t});\n\t\tconst response = await this.http.request({\n\t\t\turl: DEVICE_TOKEN_ENDPOINT,\n\t\t\t...POST_PARAMS,\n\t\t\tbody: JSON.stringify({\n\t\t\t\tdpop_token: dpopProof,\n\t\t\t\texpire_in: DEVICE_TOKEN_DEFAULT_EXPIRE_IN\n\t\t\t})\n\t\t});\n\t\tif (!response.ok || !response.body) throw new DeviceTokenError(`Failed to obtain device token: ${response.status} ${response.statusText}`);\n\t\tconst data = JSON.parse(response.body);\n\t\tif (!data.token) throw new DeviceTokenError(\"Device token response missing token field\");\n\t\treturn data;\n\t}\n\t/**\n\t* Refreshes the Client Bound SAT via `/api/fabric/subscriber/devices/refresh`.\n\t*\n\t* Creates a fresh DPoP proof, calls the refresh endpoint, reauthenticates\n\t* the WebSocket session, and returns the new token data (scheduling is\n\t* handled by the reactive pipeline).\n\t*/\n\tasync refreshToken(session, currentToken, updateCredential) {\n\t\tlogger$7.debug(\"[DeviceToken] Refreshing Client Bound SAT\");\n\t\tconst dpopProof = await this.dpopManager.createHttpProof({\n\t\t\tmethod: \"POST\",\n\t\t\turi: DEVICE_REFRESH_ENDPOINT,\n\t\t\taccessToken: currentToken\n\t\t});\n\t\tconst response = await this.http.request({\n\t\t\turl: DEVICE_REFRESH_ENDPOINT,\n\t\t\t...POST_PARAMS,\n\t\t\tbody: JSON.stringify({\n\t\t\t\tdpop_token: dpopProof,\n\t\t\t\texpire_in: this._effectiveExpireIn\n\t\t\t})\n\t\t});\n\t\tif (!response.ok || !response.body) throw new TokenRefreshError(`Failed to refresh device token: ${response.status} ${response.statusText}`);\n\t\tconst data = JSON.parse(response.body);\n\t\tif (!data.token) throw new TokenRefreshError(\"Device token refresh response missing token field\");\n\t\tif (!data.expires_at && !data.expires_in) data.expires_in = this._effectiveExpireIn;\n\t\tthis._effectiveExpireIn = resolveExpireIn(data);\n\t\tconst rpcProof = await this.dpopManager.createRpcProof({ method: \"signalwire.reauthenticate\" });\n\t\tawait session.reauthenticate(data.token, rpcProof);\n\t\tupdateCredential({ token: data.token });\n\t\tlogger$7.info(\"[DeviceToken] Client Bound SAT refreshed successfully\");\n\t\treturn data;\n\t}\n\t/**\n\t* Executes a refresh with retry and exponential backoff.\n\t* On success, emits to `_currentToken$` to schedule the next refresh.\n\t* On all retries exhausted, emits to `errorHandler`.\n\t*/\n\tasync executeRefresh() {\n\t\tif (this._paused) {\n\t\t\tlogger$7.debug(\"[DeviceToken] Manager paused, skipping refresh\");\n\t\t\treturn;\n\t\t}\n\t\tif (this._refreshInProgress) {\n\t\t\tlogger$7.debug(\"[DeviceToken] Refresh already in progress, skipping\");\n\t\t\treturn;\n\t\t}\n\t\tconst session = this._session;\n\t\tconst updateCredential = this._updateCredential;\n\t\tif (!session || !updateCredential) {\n\t\t\tlogger$7.warn(\"[DeviceToken] Cannot refresh: session or updateCredential not set\");\n\t\t\treturn;\n\t\t}\n\t\tif (!session.authenticated) {\n\t\t\tlogger$7.debug(\"[DeviceToken] Session not authenticated, deferring refresh\");\n\t\t\treturn;\n\t\t}\n\t\tthis._refreshInProgress = true;\n\t\ttry {\n\t\t\tconst currentToken = this.getCredential().token;\n\t\t\tif (!currentToken) throw new TokenRefreshError(\"No current token available for refresh\");\n\t\t\tconst newTokenData = await this.retryRefresh(session, currentToken, updateCredential);\n\t\t\tthis._currentToken$.next(newTokenData);\n\t\t} catch (error) {\n\t\t\tlogger$7.error(\"[DeviceToken] Automatic Client Bound SAT refresh failed:\", error);\n\t\t\tthis.errorHandler(error instanceof TokenRefreshError ? error : new TokenRefreshError(\"Automatic token refresh failed\", error));\n\t\t} finally {\n\t\t\tthis._refreshInProgress = false;\n\t\t}\n\t}\n\t/**\n\t* Retries `refreshToken()` up to `DEVICE_TOKEN_REFRESH_MAX_RETRIES` times\n\t* with exponential backoff (1s, 2s, 4s).\n\t*/\n\tasync retryRefresh(session, currentToken, updateCredential) {\n\t\tlet lastError;\n\t\tfor (let attempt = 0; attempt < DEVICE_TOKEN_REFRESH_MAX_RETRIES; attempt++) try {\n\t\t\treturn await this.refreshToken(session, currentToken, updateCredential);\n\t\t} catch (error) {\n\t\t\tlastError = error;\n\t\t\tif (attempt < DEVICE_TOKEN_REFRESH_MAX_RETRIES - 1) {\n\t\t\t\tconst delay = DEVICE_TOKEN_REFRESH_RETRY_BASE_MS * Math.pow(2, attempt);\n\t\t\t\tlogger$7.warn(`[DeviceToken] Refresh attempt ${attempt + 1} failed, retrying in ${delay}ms`);\n\t\t\t\tawait new Promise((resolve) => setTimeout(resolve, delay));\n\t\t\t}\n\t\t}\n\t\tthrow lastError instanceof Error ? lastError : new TokenRefreshError(\"All refresh retries exhausted\", lastError);\n\t}\n\t/**\n\t* Stops the reactive refresh pipeline from firing. Use when the underlying\n\t* session is being torn down (e.g., during {@link SignalWire.disconnect})\n\t* so a scheduled refresh cannot fire against a destroyed session.\n\t*\n\t* The manager's state (cached token, effective TTL, subscriptions) is\n\t* preserved — call {@link resume} to re-enable firing after reconnect.\n\t*/\n\tpause() {\n\t\tthis._paused = true;\n\t}\n\t/** Re-enables the reactive refresh pipeline after a previous {@link pause}. */\n\tresume() {\n\t\tthis._paused = false;\n\t}\n\t/** Cleans up the manager, cancelling the reactive pipeline and all subscriptions. */\n\tdestroy() {\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/managers/CredentialRefreshCoordinator.ts\nconst logger$6 = getLogger();\nconst defaultDeviceTokenManagerFactory = (dpopManager, http, errorHandler, getCredential) => new DeviceTokenManager(dpopManager, http, errorHandler, getCredential);\n/**\n* Centralizes credential-refresh ownership across the two competing\n* mechanisms — developer-provided `CredentialProvider.refresh()` and the\n* Client Bound SAT path via {@link DeviceTokenManager}.\n*\n* Maintains the invariant: **at most one refresh mechanism is armed at a\n* time, and at least one is armed whenever the current credential has an\n* `expiry_at`**.\n*\n* Replaces the previous design where refresh state was distributed across\n* `SignalWire` (timer field, scheduler method, activation helper) and\n* `DeviceTokenManager` (reactive pipeline). Centralizing the invariant in\n* one component eliminates the bug class that produced issue #19074.\n*\n* Race-safety:\n* - `_activating` flag prevents overlapping `activate()` calls from racing.\n* - `_activationGeneration` lets late resolutions detect they've been\n*   preempted by a newer activation (e.g., reconnect during in-flight\n*   `obtainToken`).\n*/\nvar CredentialRefreshCoordinator = class extends Destroyable {\n\tconstructor(dpopManager, deps) {\n\t\tsuper();\n\t\tthis.deps = deps;\n\t\tthis._activating = false;\n\t\tthis._activationGeneration = 0;\n\t\tif (dpopManager?.initialized) this._deviceTokenManager = (deps.deviceTokenManagerFactory ?? defaultDeviceTokenManagerFactory)(dpopManager, deps.http, (error) => deps.notifier.onError(error), () => deps.store.read());\n\t}\n\t/** True when the Client Bound SAT path is available (DPoP initialized). */\n\tget clientBoundSATAvailable() {\n\t\treturn this._deviceTokenManager !== void 0;\n\t}\n\t/** True when the developer-provided refresh timer is currently armed. */\n\tget developerRefreshArmed() {\n\t\treturn this._developerTimerId !== void 0;\n\t}\n\t/**\n\t* Arms the developer-provided refresh timer to fire shortly before\n\t* `expiresAt`. Replaces any previously scheduled developer refresh.\n\t*\n\t* Idempotent — multiple calls just reschedule. On retry exhaustion,\n\t* invokes `deps.onRefreshExhausted` so the orchestrator can disconnect.\n\t*/\n\tscheduleDeveloperRefresh(provider, expiresAt, attempt = 0) {\n\t\tif (this._developerTimerId !== void 0) clearTimeout(this._developerTimerId);\n\t\tconst refreshInterval = attempt === 0 ? Math.max(expiresAt - Date.now() - CREDENTIAL_REFRESH_BUFFER_MS, 1e3) : Math.min(CREDENTIAL_REFRESH_RETRY_BASE_MS * Math.pow(2, attempt) * (.5 + Math.random() * .5), CREDENTIAL_REFRESH_MAX_DELAY_MS);\n\t\tthis._developerTimerId = setTimeout(async () => {\n\t\t\ttry {\n\t\t\t\tif (!provider.refresh) throw new InvalidCredentialsError(\"Credential provider does not support refresh\");\n\t\t\t\tconst newCredentials = await provider.refresh();\n\t\t\t\tthis.deps.store.write(newCredentials);\n\t\t\t\tthis.deps.store.persist(newCredentials);\n\t\t\t\tlogger$6.info(\"[Coordinator] Credentials refreshed successfully.\");\n\t\t\t\tif (newCredentials.expiry_at) this.scheduleDeveloperRefresh(provider, newCredentials.expiry_at, 0);\n\t\t\t} catch (error) {\n\t\t\t\tconst nextAttempt = attempt + 1;\n\t\t\t\tlogger$6.error(`[Coordinator] Credential refresh failed (attempt ${nextAttempt}/${CREDENTIAL_REFRESH_MAX_RETRIES}):`, error);\n\t\t\t\tthis.deps.notifier.onError(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t\tif (nextAttempt < CREDENTIAL_REFRESH_MAX_RETRIES) this.scheduleDeveloperRefresh(provider, expiresAt, nextAttempt);\n\t\t\t\telse {\n\t\t\t\t\tlogger$6.error(\"[Coordinator] Credential refresh exhausted all retries. Disconnecting.\");\n\t\t\t\t\tthis.deps.notifier.onError(new TokenRefreshError(\"Credential refresh failed after max retries\"));\n\t\t\t\t\tthis.deps.notifier.onRefreshExhausted();\n\t\t\t\t}\n\t\t\t}\n\t\t}, refreshInterval);\n\t}\n\t/**\n\t* Cancels any scheduled developer-provided refresh. Idempotent.\n\t*\n\t* @internal Used by the coordinator's own activation flow. External\n\t* callers should use {@link suspend} for disconnect-time quiescence —\n\t* `suspend()` also pauses the internal Client Bound SAT pipeline.\n\t*/\n\tcancelDeveloperRefresh() {\n\t\tif (this._developerTimerId !== void 0) {\n\t\t\tclearTimeout(this._developerTimerId);\n\t\t\tthis._developerTimerId = void 0;\n\t\t}\n\t}\n\t/**\n\t* Suspends both refresh paths — cancels the developer timer and pauses\n\t* the internal reactive pipeline. Use when the underlying session is\n\t* being torn down (e.g., {@link SignalWire.disconnect}). The next\n\t* {@link activate} call re-enables the internal pipeline.\n\t*\n\t* The internal manager's cached token survives — see\n\t* {@link DeviceTokenManager.pause} — so a subsequent reconnect can\n\t* skip the `/devices/token` exchange entirely.\n\t*/\n\tsuspend() {\n\t\tthis.cancelDeveloperRefresh();\n\t\tthis._deviceTokenManager?.pause();\n\t}\n\t/**\n\t* Asks the Client Bound SAT path to take over refresh. If it accepts,\n\t* the developer-provided timer (if any) is cancelled. If it declines, the\n\t* developer timer remains armed and a `credential_refresh_fallback`\n\t* warning is emitted.\n\t*\n\t* **Idempotent** — re-entrant calls during an in-flight activation are\n\t* dropped. Use `_activationGeneration` to detect stale resolutions\n\t* (e.g., a reconnect-triggered activate() that races with an earlier one).\n\t*/\n\tasync activate(user, session) {\n\t\tif (this._activating) {\n\t\t\tlogger$6.debug(\"[Coordinator] activate() in flight; ignoring re-entrant call\");\n\t\t\treturn;\n\t\t}\n\t\tif (!this._deviceTokenManager) return;\n\t\tthis._deviceTokenManager.resume();\n\t\tconst generation = ++this._activationGeneration;\n\t\tthis._activating = true;\n\t\ttry {\n\t\t\tconst result = await this.withActivationTimeout(this._deviceTokenManager.activate(user, session, (cred) => this.deps.store.merge(cred)));\n\t\t\tif (generation !== this._activationGeneration) {\n\t\t\t\tlogger$6.debug(\"[Coordinator] activate() result discarded (preempted by newer activation)\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (result.activated) {\n\t\t\t\tthis.cancelDeveloperRefresh();\n\t\t\t\tlogger$6.debug(\"[Coordinator] Developer refresh disabled — Client Bound SAT owns refresh\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tlogger$6.warn(`[SignalWire] [SW-REFRESH-FALLBACK] Client Bound SAT declined (reason=${result.reason}); using developer-provided refresh handler.`);\n\t\t\tthis.deps.notifier.onWarning({\n\t\t\t\tcode: \"credential_refresh_fallback\",\n\t\t\t\tsource: \"CredentialProvider\",\n\t\t\t\treason: result.reason,\n\t\t\t\tmessage: `Client Bound SAT activation declined (${result.reason}); using developer-provided refresh.`\n\t\t\t});\n\t\t} finally {\n\t\t\tthis._activating = false;\n\t\t}\n\t}\n\tdestroy() {\n\t\tthis.cancelDeveloperRefresh();\n\t\tthis._deviceTokenManager?.destroy();\n\t\tthis._deviceTokenManager = void 0;\n\t\tsuper.destroy();\n\t}\n\t/**\n\t* Races the manager's `activate()` against a hard timeout. A wedged HTTP\n\t* layer (e.g., proxy issues) could otherwise hang the activation\n\t* indefinitely, leaving the session with no refresh mechanism while the\n\t* `_activating` guard blocks subsequent retries.\n\t*\n\t* On timeout, the manager is paused immediately. The inner `activate()`\n\t* may still complete in the background and emit to `_currentToken$`,\n\t* which would normally arm the reactive refresh pipeline; pausing\n\t* prevents that pipeline from firing while the developer refresh path\n\t* is the active mechanism — preserving the \"at most one mechanism\n\t* armed\" invariant. The next `activate()` call resumes the manager.\n\t*/\n\tasync withActivationTimeout(inner) {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst timer$1 = setTimeout(() => {\n\t\t\t\tthis._deviceTokenManager?.pause();\n\t\t\t\tresolve({\n\t\t\t\t\tactivated: false,\n\t\t\t\t\treason: \"activation-timeout\"\n\t\t\t\t});\n\t\t\t}, CREDENTIAL_ACTIVATE_TIMEOUT_MS);\n\t\t\tinner.then((result) => {\n\t\t\t\tclearTimeout(timer$1);\n\t\t\t\tresolve(result);\n\t\t\t}, (error) => {\n\t\t\t\tclearTimeout(timer$1);\n\t\t\t\tthis.deps.notifier.onError(error instanceof Error ? error : new Error(String(error)));\n\t\t\t\tresolve({\n\t\t\t\t\tactivated: false,\n\t\t\t\t\treason: \"endpoint-failed\"\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n};\n\n//#endregion\n//#region src/managers/DiagnosticsCollector.ts\nconst logger$5 = getLogger();\n/** Default maximum number of diagnostic events to retain in the ring buffer. */\nconst DEFAULT_MAX_EVENTS = 1e3;\n/**\n* Returns the user agent string, safely handling non-browser environments.\n*/\nfunction getUserAgent() {\n\ttry {\n\t\tif (typeof navigator !== \"undefined\" && navigator.userAgent) return navigator.userAgent;\n\t} catch {}\n\treturn \"unknown\";\n}\n/**\n* DiagnosticsCollector maintains a ring buffer of diagnostic events\n* for structured export. It records connection, call, device, recovery,\n* and error events during a session, and can serialize them into a\n* plain object for support tickets or debugging.\n*\n* Extends Destroyable for lifecycle management.\n*/\nvar DiagnosticsCollector = class extends Destroyable {\n\tconstructor(options) {\n\t\tsuper();\n\t\tthis._events = [];\n\t\tthis._calls = [];\n\t\tthis._deviceChanges = [];\n\t\tthis._eventRecorded$ = this.createSubject();\n\t\tthis._sdkVersion = options.sdkVersion;\n\t\tthis._maxEvents = options.maxEvents ?? DEFAULT_MAX_EVENTS;\n\t\tlogger$5.debug(\"DiagnosticsCollector initialized\", {\n\t\t\tsdkVersion: this._sdkVersion,\n\t\t\tmaxEvents: this._maxEvents\n\t\t});\n\t}\n\t/**\n\t* Observable that emits each time a diagnostic event is recorded.\n\t*/\n\tget eventRecorded$() {\n\t\treturn this._eventRecorded$.asObservable();\n\t}\n\t/**\n\t* Record a diagnostic event into the ring buffer.\n\t*\n\t* @param category - The event category (connection, call, device, recovery, error).\n\t* @param event - A short description of the event.\n\t* @param details - Optional additional details as a key-value map.\n\t*/\n\trecord(category, event, details) {\n\t\tconst entry = {\n\t\t\ttimestamp: Date.now(),\n\t\t\tcategory,\n\t\t\tevent,\n\t\t\t...details !== void 0 ? { details } : {}\n\t\t};\n\t\tthis._events = this._appendToBuffer(this._events, entry);\n\t\tthis._eventRecorded$.next(entry);\n\t}\n\t/**\n\t* Shorthand to record a device change event.\n\t*\n\t* @param event - Description of the device change.\n\t* @param details - Optional additional details.\n\t*/\n\trecordDeviceChange(event, details) {\n\t\tconst entry = {\n\t\t\ttimestamp: Date.now(),\n\t\t\tcategory: \"device\",\n\t\t\tevent,\n\t\t\t...details !== void 0 ? { details } : {}\n\t\t};\n\t\tthis._deviceChanges = this._appendToBuffer(this._deviceChanges, entry);\n\t\tthis._events = this._appendToBuffer(this._events, entry);\n\t\tthis._eventRecorded$.next(entry);\n\t}\n\t/**\n\t* Record a call summary for diagnostic export.\n\t*\n\t* @param summary - The call diagnostic summary to add.\n\t*/\n\trecordCallSummary(summary) {\n\t\tthis._calls = this._appendCallToBuffer(this._calls, summary);\n\t\tthis.record(\"call\", \"call_summary\", {\n\t\t\tcallId: summary.callId,\n\t\t\tdirection: summary.direction,\n\t\t\tduration: summary.duration,\n\t\t\tfinalStatus: summary.finalStatus\n\t\t});\n\t}\n\t/**\n\t* Export the current diagnostic buffer as a structured plain object.\n\t* This can be JSON.stringify'd and attached to support tickets.\n\t*/\n\texport() {\n\t\treturn {\n\t\t\tsdkVersion: this._sdkVersion,\n\t\t\tuserAgent: getUserAgent(),\n\t\t\texportedAt: Date.now(),\n\t\t\tevents: [...this._events],\n\t\t\tcalls: [...this._calls],\n\t\t\tdeviceChanges: [...this._deviceChanges]\n\t\t};\n\t}\n\t/**\n\t* Clear all diagnostic buffers, resetting to empty state.\n\t*/\n\tclear() {\n\t\tthis._events = [];\n\t\tthis._calls = [];\n\t\tthis._deviceChanges = [];\n\t\tlogger$5.debug(\"DiagnosticsCollector buffers cleared\");\n\t}\n\tdestroy() {\n\t\tlogger$5.debug(\"DiagnosticsCollector destroyed\");\n\t\tsuper.destroy();\n\t}\n\t/**\n\t* Append an entry to a buffer array, enforcing the max size via ring buffer semantics.\n\t* Returns a new array (immutable pattern).\n\t*/\n\t_appendToBuffer(buffer, entry) {\n\t\tconst updated = [...buffer, entry];\n\t\tif (updated.length > this._maxEvents) return updated.slice(updated.length - this._maxEvents);\n\t\treturn updated;\n\t}\n\t/**\n\t* Append a call summary to the calls buffer, enforcing max size.\n\t* Returns a new array (immutable pattern).\n\t*/\n\t_appendCallToBuffer(buffer, entry) {\n\t\tconst updated = [...buffer, entry];\n\t\tif (updated.length > this._maxEvents) return updated.slice(updated.length - this._maxEvents);\n\t\treturn updated;\n\t}\n};\n\n//#endregion\n//#region src/utils/arrays.ts\nconst isEmptyArray = (a) => {\n\treturn (a?.length ?? 0) === 0;\n};\n\n//#endregion\n//#region src/utils/warmup.ts\nconst warmup = (observable) => {\n\tobservable.pipe(take(1)).subscribe();\n};\n\n//#endregion\n//#region src/managers/DirectoryManager.ts\nconst logger$4 = getLogger();\nvar AddressFetcher = class extends Fetcher {\n\tconstructor(http) {\n\t\tsuper(\"/api/fabric/addresses\", \"sort_by=name&sort_order=asc\", http);\n\t}\n\tasync name(name) {\n\t\tconst response = await this.http.request({\n\t\t\t...GET_PARAMS,\n\t\t\turl: `${this.endpoint}?name=${encodeURIComponent(name)}`\n\t\t});\n\t\tif (response.ok && !!response.body) {\n\t\t\tconst result = JSON.parse(response.body);\n\t\t\tif (!isEmptyArray(result.data)) return result.data[0];\n\t\t}\n\t\tlogger$4.error(\"Failed to fetch addresses\");\n\t}\n};\n/** Collection of address states with reactive updates and pagination. */\nvar AddressStateCollection = class extends EntityCollection {\n\tconstructor(update$, http, onError) {\n\t\tsuper(new AddressFetcher(http), update$, onError);\n\t}\n};\n/**\n* Manages the directory of {@link Address} entries with paginated loading.\n*\n* Implements the {@link Directory} interface and provides reactive access to\n* addresses via observables, along with pagination and lookup methods.\n*/\nvar DirectoryManager = class extends Destroyable {\n\tconstructor(http, clientSession, conversationManager, onError) {\n\t\tsuper();\n\t\tthis.http = http;\n\t\tthis.conversationManager = conversationManager;\n\t\tthis.onError = onError;\n\t\tthis.addNewAddress = (id) => {\n\t\t\tconst address = new Address(id, this.conversationManager, this);\n\t\t\tconst observable = this._statesCollection.get$(id)?.pipe(filterNull(), map((data) => {\n\t\t\t\taddress.upnext(data);\n\t\t\t\treturn address;\n\t\t\t}));\n\t\t\tif (observable) {\n\t\t\t\twarmup(observable);\n\t\t\t\tthis._observableRegistry.set(id, observable);\n\t\t\t}\n\t\t\tthis._addressesInstances.set(id, address);\n\t\t};\n\t\tthis._addresses$ = this.createBehaviorSubject([]);\n\t\tthis._addressesInstances = /* @__PURE__ */ new Map();\n\t\tthis._observableRegistry = /* @__PURE__ */ new Map();\n\t\tthis._statesCollection = new AddressStateCollection(clientSession.signalingEvent$.pipe(filterAs(isConversationMessageUpdatedMetadata, \"params\"), map((_) => ({}))), this.http, this.onError);\n\t\tthis.initSubscriptions();\n\t}\n\t/** Whether addresses are currently being loaded from the server. */\n\tget loading() {\n\t\treturn this._statesCollection.loading;\n\t}\n\tinitSubscriptions() {\n\t\tthis.subscribeTo(this._statesCollection.updated$, () => {\n\t\t\tconst existing = Array.from(this._addressesInstances.values().map((address) => address.id));\n\t\t\tconst newStates = this._statesCollection.values.filter((state) => !existing.includes(state.id));\n\t\t\tif (!isEmptyArray(newStates)) {\n\t\t\t\tnewStates.forEach((state) => this.addNewAddress(state.id));\n\t\t\t\tthis._addresses$.next(Array.from(this._addressesInstances.values()));\n\t\t\t}\n\t\t});\n\t}\n\t/** Observable stream of all addresses in the directory. */\n\tget addresses$() {\n\t\treturn this._addresses$.asObservable();\n\t}\n\t/** Current snapshot of all loaded addresses. */\n\tget addresses() {\n\t\treturn this._addresses$.value;\n\t}\n\t/** Observable indicating whether more addresses can be loaded. */\n\tget hasMore$() {\n\t\treturn this._statesCollection.hasMore$;\n\t}\n\t/** Observable of the current loading state. */\n\tget loading$() {\n\t\treturn this._statesCollection.loading$;\n\t}\n\t/**\n\t* Loads the next page of addresses from the server.\n\t*\n\t* No-op if {@link hasMore$} is `false`. Loading state is observable via {@link loading$}.\n\t* New addresses are appended to {@link addresses$} when the page loads.\n\t*/\n\tloadMore() {\n\t\tif (this._statesCollection.hasMore) this._statesCollection.loadMore();\n\t}\n\t/**\n\t* Returns a reactive observable for a specific address by ID.\n\t* @param id - The address ID to observe.\n\t* @returns An observable of the address, or `undefined` if not found.\n\t*/\n\tget$(id) {\n\t\tif (!this._observableRegistry.has(id)) this.addNewAddress(id);\n\t\treturn this._observableRegistry.get(id);\n\t}\n\t/**\n\t* Returns an address by ID from the local cache.\n\t* @param addressId - The address ID to look up.\n\t* @returns The address, or `undefined` if not found.\n\t*/\n\tget(addressId) {\n\t\treturn this._addressesInstances.get(addressId);\n\t}\n\t/**\n\t* Finds an address ID by its resource name (URI).\n\t*\n\t* Searches locally loaded addresses first, then queries the server if not found.\n\t* The resource name is the {@link Address.name} identifier, distinct from display name.\n\t*\n\t* @param name - The resource name to search for (exact match, e.g. `'/public/conference'`).\n\t* @returns The address ID, or `undefined` if no match is found locally or on server.\n\t*/\n\tasync findAddressIdByURI(name) {\n\t\tlet addressId = this._addressesInstances.values().find((addr) => addr.name === name)?.id;\n\t\tif (!addressId) {\n\t\t\tconst found$ = await this._statesCollection.find$(\"name\", name);\n\t\t\tif (found$) {\n\t\t\t\tconst state = await firstValueFrom(found$);\n\t\t\t\tthis.addNewAddress(state.id);\n\t\t\t\taddressId = state.id;\n\t\t\t}\n\t\t}\n\t\treturn addressId;\n\t}\n};\n\n//#endregion\n//#region src/controllers/WebSocketController.ts\nconst logger$3 = getLogger();\nvar WebSocketController = class WebSocketController extends Destroyable {\n\tstatic {\n\t\tthis.DEFAULT_RECONNECT_DELAY_MIN_MS = 1e3;\n\t}\n\tstatic {\n\t\tthis.DEFAULT_RECONNECT_DELAY_MAX_MS = 3e4;\n\t}\n\tstatic {\n\t\tthis.DEFAULT_CONNECTION_TIMEOUT_MS = 1e4;\n\t}\n\tconstructor(WebSocketConstructor, endpoint, outgoingMessages$, options = {}) {\n\t\tsuper();\n\t\tthis.WebSocketConstructor = WebSocketConstructor;\n\t\tthis.endpoint = endpoint;\n\t\tthis.outgoingMessages$ = outgoingMessages$;\n\t\tthis.messageQueue = [];\n\t\tthis.shouldReconnect = false;\n\t\tthis.boundHandleOpen = () => this.handleOpen();\n\t\tthis.boundHandleClose = (event) => this.handleClose(event);\n\t\tthis.boundHandleError = () => this.handleError();\n\t\tthis.boundHandleMessage = (event) => this.handleMessage(event);\n\t\tthis._status$ = this.createBehaviorSubject(\"disconnected\");\n\t\tthis._incomingMessages$ = this.createSubject();\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis.reconnectDelayMin = options.reconnectDelayMin ?? WebSocketController.DEFAULT_RECONNECT_DELAY_MIN_MS;\n\t\tthis.reconnectDelayMax = options.reconnectDelayMax ?? WebSocketController.DEFAULT_RECONNECT_DELAY_MAX_MS;\n\t\tthis.connectionTimeout = options.connectionTimeout ?? WebSocketController.DEFAULT_CONNECTION_TIMEOUT_MS;\n\t\tthis.currentReconnectDelay = this.reconnectDelayMin;\n\t\tthis.subscriptions.push(this.outgoingMessages$.subscribe((data) => {\n\t\t\tthis.send(data);\n\t\t}));\n\t}\n\tget status$() {\n\t\treturn this._status$.asObservable();\n\t}\n\tget incomingMessages$() {\n\t\treturn this._incomingMessages$.asObservable();\n\t}\n\tget errors$() {\n\t\treturn this._errors$.asObservable();\n\t}\n\tconnect() {\n\t\tif (this._status$.value === \"connecting\" || this._status$.value === \"connected\") return;\n\t\tthis.shouldReconnect = true;\n\t\tthis._status$.next(\"connecting\");\n\t\tthis.createWebSocket();\n\t}\n\tdisconnect() {\n\t\tthis.shouldReconnect = false;\n\t\tthis.clearReconnectTimer();\n\t\tthis.clearConnectionTimeout();\n\t\tconst currentStatus = this._status$.value;\n\t\tif (currentStatus === \"connected\" || currentStatus === \"connecting\" || currentStatus === \"reconnecting\") if (this.socket) {\n\t\t\tthis._status$.next(\"disconnecting\");\n\t\t\tthis.socket.close();\n\t\t} else this._status$.next(\"disconnected\");\n\t\telse this._status$.next(\"disconnected\");\n\t}\n\treconnect() {\n\t\tthis.shouldReconnect = true;\n\t\tthis._status$.next(\"reconnecting\");\n\t\tthis.scheduleReconnection();\n\t}\n\tsend(data) {\n\t\tif (this._status$.value === \"connected\" && this.socket?.readyState === 1) {\n\t\t\tlogger$3.wsTraffic({\n\t\t\t\ttype: \"send\",\n\t\t\t\traw: data\n\t\t\t});\n\t\t\tthis.socket.send(data);\n\t\t} else this.messageQueue.push(data);\n\t}\n\tcreateWebSocket() {\n\t\ttry {\n\t\t\tthis.closeExistingSocket();\n\t\t\tthis.socket = new this.WebSocketConstructor(this.endpoint);\n\t\t\tthis.setupWebSocketListeners();\n\t\t\tthis.startConnectionTimeout();\n\t\t} catch (error) {\n\t\t\tconst err = error instanceof Error ? error : new UnexpectedError(\"Failed to create WebSocket\");\n\t\t\tthis._errors$.next(err);\n\t\t\tthis.handleConnectionError();\n\t\t}\n\t}\n\t/**\n\t* Closes the existing socket and removes its event listeners to prevent\n\t* phantom 'open'/'close' events from firing on the orphaned socket.\n\t*/\n\tcloseExistingSocket() {\n\t\tif (!this.socket) return;\n\t\tconst oldSocket = this.socket;\n\t\tthis.socket = void 0;\n\t\tthis.removeWebSocketListeners(oldSocket);\n\t\ttry {\n\t\t\toldSocket.close();\n\t\t} catch {}\n\t}\n\tsetupWebSocketListeners() {\n\t\tif (!this.socket) return;\n\t\tthis.socket.addEventListener(\"open\", this.boundHandleOpen);\n\t\tthis.socket.addEventListener(\"close\", this.boundHandleClose);\n\t\tthis.socket.addEventListener(\"error\", this.boundHandleError);\n\t\tthis.socket.addEventListener(\"message\", this.boundHandleMessage);\n\t}\n\tremoveWebSocketListeners(socket) {\n\t\ttry {\n\t\t\tsocket.removeEventListener(\"open\", this.boundHandleOpen);\n\t\t\tsocket.removeEventListener(\"close\", this.boundHandleClose);\n\t\t\tsocket.removeEventListener(\"error\", this.boundHandleError);\n\t\t\tsocket.removeEventListener(\"message\", this.boundHandleMessage);\n\t\t} catch {}\n\t}\n\thandleOpen() {\n\t\tthis.clearConnectionTimeout();\n\t\tthis._status$.next(\"connected\");\n\t\tthis.currentReconnectDelay = this.reconnectDelayMin;\n\t\tthis.flushMessageQueue();\n\t}\n\thandleClose(_event) {\n\t\tthis.clearConnectionTimeout();\n\t\tif (this.shouldReconnect) {\n\t\t\tthis._status$.next(\"reconnecting\");\n\t\t\tthis.scheduleReconnection();\n\t\t} else this._status$.next(\"disconnected\");\n\t}\n\thandleError() {\n\t\tconst error = new WebSocketConnectionError(\"WebSocket connection error\");\n\t\tthis._errors$.next(error);\n\t\tthis.handleConnectionError();\n\t}\n\thandleMessage(event) {\n\t\tlogger$3.wsTraffic({\n\t\t\ttype: \"recv\",\n\t\t\traw: event.data\n\t\t});\n\t\tthis._incomingMessages$.next(event);\n\t}\n\thandleConnectionError() {\n\t\tthis.reconnect();\n\t}\n\tscheduleReconnection() {\n\t\tthis.clearReconnectTimer();\n\t\tconst jitteredDelay = this.currentReconnectDelay * (.5 + Math.random() * .5);\n\t\tthis.reconnectTimer = setTimeout(() => {\n\t\t\tif (this.shouldReconnect) {\n\t\t\t\tthis._status$.next(\"connecting\");\n\t\t\t\tthis.createWebSocket();\n\t\t\t\tthis.increaseReconnectDelay();\n\t\t\t}\n\t\t}, jitteredDelay);\n\t}\n\tincreaseReconnectDelay() {\n\t\tthis.currentReconnectDelay = Math.min(this.currentReconnectDelay * 2, this.reconnectDelayMax);\n\t}\n\tstartConnectionTimeout() {\n\t\tthis.clearConnectionTimeout();\n\t\tthis.connectionTimeoutTimer = setTimeout(() => {\n\t\t\tif (this._status$.value === \"connecting\") {\n\t\t\t\tconst error = new WebSocketTimeoutError(\"WebSocket connection timeout\");\n\t\t\t\tthis._errors$.next(error);\n\t\t\t\tif (this.socket) this.socket.close();\n\t\t\t}\n\t\t}, this.connectionTimeout);\n\t}\n\tclearConnectionTimeout() {\n\t\tif (this.connectionTimeoutTimer) {\n\t\t\tclearTimeout(this.connectionTimeoutTimer);\n\t\t\tthis.connectionTimeoutTimer = void 0;\n\t\t}\n\t}\n\tclearReconnectTimer() {\n\t\tif (this.reconnectTimer) {\n\t\t\tclearTimeout(this.reconnectTimer);\n\t\t\tthis.reconnectTimer = void 0;\n\t\t}\n\t}\n\tflushMessageQueue() {\n\t\twhile (this.messageQueue.length > 0 && this.socket?.readyState === 1) {\n\t\t\tconst message = this.messageQueue.shift();\n\t\t\tif (message !== void 0) this.socket.send(message);\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/core/RPCMessages/guards/methods.guards.ts\nfunction isSignalwirePingRequest(value) {\n\treturn isJSONRPCRequest(value) && value.method === \"signalwire.ping\";\n}\n\n//#endregion\n//#region src/managers/TransportManager.ts\nconst logger$2 = getLogger();\nvar TransportManager = class extends Destroyable {\n\tconstructor(storage, protocolKey, webSocketConstructor, relayHost, onError) {\n\t\tsuper();\n\t\tthis.storage = storage;\n\t\tthis.protocolKey = protocolKey;\n\t\tthis.onError = onError;\n\t\tthis.protocol$ = this.createReplaySubject(1);\n\t\tthis.isConnecting = false;\n\t\tthis.isConnected = false;\n\t\tthis.ackEvent = () => {\n\t\t\treturn tap((message) => {\n\t\t\t\tif (isSignalwireRequest(message)) try {\n\t\t\t\t\tlogger$2.debug(\"[Transport] Sending event ack\", { eventId: message.id });\n\t\t\t\t\tthis.send(RPCEventAckResponse(message.id));\n\t\t\t\t} catch (error) {\n\t\t\t\t\tlogger$2.error(\"[Transport] Failed to send event acknowledgment:\", error);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tthis.replySignalwirePing = () => {\n\t\t\treturn filter((message) => {\n\t\t\t\tif (isSignalwirePingRequest(message)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlogger$2.debug(\"[Transport] Received ping, sending pong\", { pingId: message.id });\n\t\t\t\t\t\tthis.send(RPCPingResponse(message.id));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tlogger$2.error(\"[Transport] Failed to send ping response:\", error);\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t};\n\t\tthis.discardStaleEvents = () => {\n\t\t\treturn filter((message) => {\n\t\t\t\tif (!isSignalwireRequest(message)) return true;\n\t\t\t\tconst eventChannel = message.params.event_channel;\n\t\t\t\tif (!eventChannel) return true;\n\t\t\t\tif (message.params.event_type.startsWith(\"conversation.\")) {\n\t\t\t\t\tlogger$2.debug(`[Transport] Received conversation event: ${message.params.event_type} (event_channel: ${eventChannel})`);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tconst currentProtocol = this._currentProtocol;\n\t\t\t\tif (!currentProtocol) return true;\n\t\t\t\tif (!eventChannel.includes(currentProtocol)) {\n\t\t\t\t\tconst eventType = message.params.event_type;\n\t\t\t\t\tlogger$2.warn(`[Transport] Discarding stale event: ${eventType} (event_channel does not match current protocol)`);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t});\n\t\t};\n\t\tthis._outgoingMessages$ = this.createSubject();\n\t\tthis._webSocketConnections = new WebSocketController(webSocketConstructor, relayHost, this._outgoingMessages$.asObservable(), {\n\t\t\tconnectionTimeout: PreferencesContainer.instance.connectionTimeout,\n\t\t\treconnectDelayMin: PreferencesContainer.instance.reconnectDelayMin,\n\t\t\treconnectDelayMax: PreferencesContainer.instance.reconnectDelayMax\n\t\t});\n\t\tthis.subscribeTo(this._webSocketConnections.errors$, (error) => {\n\t\t\tthis.onError?.(error);\n\t\t});\n\t\tthis.initialized$ = defer(() => from(this._init())).pipe(shareReplay(1), takeUntil(this.destroyed$));\n\t\tthis._jsonRPCMessage$ = this._webSocketConnections.incomingMessages$.pipe(map((event) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(event.data);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$2.error(\"[Transport] Failed to parse incoming message:\", error);\n\t\t\t\tthis.onError?.(new MessageParseError(error));\n\t\t\t\treturn null;\n\t\t\t}\n\t\t}), filter((message) => message !== null && (isJSONRPCResponse(message) || isJSONRPCRequest(message))), catchError((error) => {\n\t\t\tlogger$2.error(\"[Transport] Message processing error:\", error);\n\t\t\tthis.onError?.(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\treturn EMPTY;\n\t\t}), share(), takeUntil(this.destroyed$));\n\t\tthis._jsonRPCResponse$ = this._jsonRPCMessage$.pipe(filter(isJSONRPCResponse));\n\t\tthis._incomingEvent$ = this._jsonRPCMessage$.pipe(this.ackEvent(), this.replySignalwirePing(), filter((message) => !isJSONRPCResponse(message)), this.discardStaleEvents(), share(), takeUntil(this.destroyed$));\n\t}\n\tasync setProtocol(protocol) {\n\t\tthis._currentProtocol = protocol;\n\t\tthis.protocol$.next(protocol);\n\t\tawait this._updateProtocolInStorage(protocol);\n\t}\n\tget incomingEvent$() {\n\t\treturn this._incomingEvent$;\n\t}\n\tget connectionStatus$() {\n\t\treturn this._webSocketConnections.status$;\n\t}\n\tasync connect() {\n\t\tif (this.isConnecting || this.isConnected) {\n\t\t\tlogger$2.warn(\"[Transport] Already connecting or connected\");\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.isConnecting = true;\n\t\t\tthis.subscribeTo(this.initialized$, () => {\n\t\t\t\tthis._webSocketConnections.connect();\n\t\t\t\tconst connectionSub = this._webSocketConnections.status$.pipe(filter((status) => status === \"connected\" || status === \"disconnected\"), take(1), timeout(1e4)).subscribe({\n\t\t\t\t\tnext: (status) => {\n\t\t\t\t\t\tif (status === \"connected\") {\n\t\t\t\t\t\t\tthis.isConnecting = false;\n\t\t\t\t\t\t\tthis.isConnected = true;\n\t\t\t\t\t\t\tlogger$2.debug(\"[Transport] Connection established\");\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.isConnecting = false;\n\t\t\t\t\t\t\tconst error = new TransportConnectionError(\"Failed to connect\");\n\t\t\t\t\t\t\tlogger$2.error(\"[Transport] Connection failed\");\n\t\t\t\t\t\t\tthis.onError?.(error);\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\terror: (err) => {\n\t\t\t\t\t\tthis.isConnecting = false;\n\t\t\t\t\t\tlogger$2.error(\"[Transport] Connection error:\", err);\n\t\t\t\t\t\tthis.onError?.(err instanceof Error ? err : new Error(String(err), { cause: err }));\n\t\t\t\t\t\treject(err);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis.subscriptions.push(connectionSub);\n\t\t\t\tthis.subscribeTo(this._webSocketConnections.status$.pipe(filter((status) => status === \"disconnected\")), () => {\n\t\t\t\t\tlogger$2.debug(\"[Transport] Disconnected\");\n\t\t\t\t\tthis.isConnected = false;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\treconnect() {\n\t\tthis._webSocketConnections.reconnect();\n\t}\n\tasync execute(request, options) {\n\t\tthis.send(request);\n\t\treturn new PendingRPC(request, this._jsonRPCResponse$, options).promise;\n\t}\n\tsend(message) {\n\t\tconst payload = JSON.stringify(message);\n\t\tthis._outgoingMessages$.next(payload);\n\t}\n\tdisconnect() {\n\t\tlogger$2.debug(\"[Transport] Disconnecting\");\n\t\tthis.isConnected = false;\n\t\tthis.isConnecting = false;\n\t\tthis._webSocketConnections.disconnect();\n\t}\n\tdestroy() {\n\t\tlogger$2.debug(\"[Transport] Destroying\");\n\t\tthis.disconnect();\n\t\tsuper.destroy();\n\t\tthis._webSocketConnections.destroy();\n\t}\n\tasync _loadProtocolFromStorage() {\n\t\ttry {\n\t\t\tconst storedProtocol = await this.storage.getItem(this.protocolKey);\n\t\t\tthis._currentProtocol = storedProtocol ?? void 0;\n\t\t\tthis.protocol$.next(storedProtocol ?? void 0);\n\t\t} catch (error) {\n\t\t\tlogger$2.error(\"Failed to retrieve protocol from storage:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync _updateProtocolInStorage(protocol) {\n\t\tif (!protocol) {\n\t\t\ttry {\n\t\t\t\tawait this.storage.removeItem(this.protocolKey);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$2.error(\"Failed to remove protocol from storage:\", error);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tconst storedProtocol = await this.storage.getItem(this.protocolKey);\n\t\t\tif (!storedProtocol || storedProtocol !== protocol) await this.storage.setItem(this.protocolKey, protocol);\n\t\t} catch (error) {\n\t\t\tlogger$2.error(\"Failed to update protocol in storage:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync _init() {\n\t\tawait this._loadProtocolFromStorage();\n\t\treturn true;\n\t}\n};\n\n//#endregion\n//#region src/clients/SignalWire.ts\nconst logger$1 = getLogger();\nconst buildOptionsFromDestination = (destination) => {\n\tif (typeof destination === \"string\") {\n\t\tconst queryStartIndex = destination.indexOf(\"?\");\n\t\tif (queryStartIndex !== -1) {\n\t\t\tconst queryString = destination.substring(queryStartIndex + 1);\n\t\t\tconst channel = new URLSearchParams(queryString).get(\"channel\");\n\t\t\tif (channel === \"video\") return {\n\t\t\t\taudio: true,\n\t\t\t\tvideo: true,\n\t\t\t\treceiveVideo: true\n\t\t\t};\n\t\t\telse if (channel === \"audio\") return {\n\t\t\t\taudio: true,\n\t\t\t\tvideo: false\n\t\t\t};\n\t\t}\n\t}\n\treturn {};\n};\n/**\n* Main entry point for the SignalWire Browser SDK.\n*\n* Manages authentication, WebSocket transport, call creation, and media devices.\n*\n* @example\n* ```ts\n* const client = new SignalWire(credentialProvider);\n* client.isConnected$.subscribe(connected => console.log('Connected:', connected));\n* const call = await client.dial('/public/my-room');\n* ```\n*/\nvar SignalWire = class extends Destroyable {\n\t/**\n\t* Creates a new SignalWire client and begins connecting.\n\t*\n\t* @param credentialProvider - Provider that supplies authentication credentials.\n\t* @param options - Configuration options (connection, device monitoring, preferences).\n\t*/\n\tconstructor(credentialProvider, options = {}) {\n\t\tsuper();\n\t\tthis.preferences = new ClientPreferences();\n\t\tthis._user$ = this.createBehaviorSubject(void 0);\n\t\tthis._directory$ = this.createBehaviorSubject(void 0);\n\t\tthis._isConnected$ = this.createBehaviorSubject(false);\n\t\tthis._isRegistered$ = this.createBehaviorSubject(false);\n\t\tthis._errors$ = this.createReplaySubject(1);\n\t\tthis._warnings$ = this.createReplaySubject(10);\n\t\tthis._options = {};\n\t\tthis._deps = new DependencyContainer();\n\t\tthis._credentialProvider = credentialProvider;\n\t\tthis._options = {\n\t\t\t...PreferencesContainer.instance.defaultSignalWireOptions,\n\t\t\t...options\n\t\t};\n\t\tif (this._options.storageImplementation) this._deps.storageImpl = this._options.storageImplementation;\n\t\tif (this._options.persistSession) this._deps.persistSession = true;\n\t\tif (this._options.webSocketConstructor) this._deps.WebSocket = this._options.webSocketConstructor;\n\t\tif (this._options.savePreferences) this.preferences.enableSavePreferences(this._deps.storage);\n\t\tif (this._options.webRTCApiProvider) this._deps.webRTCApiProvider = this._options.webRTCApiProvider;\n\t\tif (this._options.logger !== void 0) setLogger(this._options.logger);\n\t\tif (this._options.logLevel) setLogLevel(this._options.logLevel);\n\t\tif (this._options.debug) setDebugOptions(this._options.debug);\n\t\tthis._deviceController = this._deps.deviceController;\n\t\tif (!this._options.skipDeviceMonitoring) this._deviceController.enableDeviceMonitoring();\n\t\tthis.subscribeTo(this._deviceController.errors$, (error) => {\n\t\t\tthis._errors$.next(error);\n\t\t});\n\t\tthis.initResilienceSubsystems();\n\t\tthis.resolveCredentials().then(() => {\n\t\t\tthis.init().catch((error) => {\n\t\t\t\tlogger$1.error(\"[SignalWire] Initialization error:\", error);\n\t\t\t\tthis._deps.storage.removeItem(\"sw:cached_credential\");\n\t\t\t\tthis._deps.storage.removeItem(\"sw:cached_credential\", \"local\");\n\t\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t});\n\t\t}).catch((error) => {\n\t\t\tlogger$1.error(\"[SignalWire] Initialization error:\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t});\n\t}\n\t/**\n\t* Initializes DPoP if not already set up. Returns the fingerprint on success.\n\t*/\n\tasync initDPoP() {\n\t\tif (this._dpopManager?.initialized) return this._dpopManager.fingerprint;\n\t\ttry {\n\t\t\tthis._dpopManager = new CryptoController();\n\t\t\tconst fingerprint = await this._dpopManager.init();\n\t\t\tlogger$1.debug(\"[SignalWire] DPoP initialized, fingerprint available\");\n\t\t\treturn fingerprint;\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] DPoP initialization failed, proceeding without DPoP:\", error);\n\t\t\tthis._dpopManager = void 0;\n\t\t\treturn;\n\t\t}\n\t}\n\t/**\n\t* Resolves credentials using cache-first strategy when persistSession is enabled.\n\t*\n\t* 1. If persistSession → check localStorage for cached credential\n\t* 2. If cached and not expired → use it (skip provider.authenticate())\n\t* 3. If no cache or expired → call provider.authenticate()\n\t* 4. If no provider AND no cache → throw\n\t*/\n\tasync resolveCredentials() {\n\t\tconst fingerprint = await this.initDPoP();\n\t\tthis._refreshCoordinator = new CredentialRefreshCoordinator(this._dpopManager, {\n\t\t\thttp: this._deps.http,\n\t\t\tnotifier: {\n\t\t\t\tonError: (error) => this._errors$.next(error),\n\t\t\t\tonWarning: (warning) => this._warnings$.next(warning),\n\t\t\t\tonRefreshExhausted: () => void this.disconnect()\n\t\t\t},\n\t\t\tstore: {\n\t\t\t\tread: () => this._deps.credential,\n\t\t\t\twrite: (credential) => {\n\t\t\t\t\tthis._deps.credential = credential;\n\t\t\t\t},\n\t\t\t\tmerge: (partial) => {\n\t\t\t\t\tthis._deps.credential = {\n\t\t\t\t\t\t...this._deps.credential,\n\t\t\t\t\t\t...partial\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tpersist: (credential) => this.persistCredential(credential)\n\t\t\t}\n\t\t});\n\t\tif (this._credentialProvider) return this.validateCredentials(this._credentialProvider, void 0, fingerprint);\n\t\tfor (const scope of this._deps.persistSession ? [\"local\", \"session\"] : [\"session\"]) try {\n\t\t\tconst cached = await this._deps.storage.getItem(\"sw:cached_credential\", scope);\n\t\t\tif (cached?.token) {\n\t\t\t\tlogger$1.debug(`[SignalWire] Using cached credential from ${scope}Storage`);\n\t\t\t\treturn await this.validateCredentials(void 0, cached);\n\t\t\t}\n\t\t} catch {}\n\t\tthrow new InvalidCredentialsError(\"No credential provider and no cached session. Provide a CredentialProvider or enable persistSession with a prior login.\");\n\t}\n\tasync validateCredentials(credentialProvider, credentials, fingerprint) {\n\t\tconst _fingerprint = fingerprint ?? (this._dpopManager?.initialized ? this._dpopManager.fingerprint : void 0);\n\t\tconst _credentials = credentials ?? (credentialProvider ? await credentialProvider.authenticate(_fingerprint ? { fingerprint: _fingerprint } : void 0) : void 0);\n\t\tif (!_credentials) throw new InvalidCredentialsError(\"No credentials available.\");\n\t\tif (_credentials.token) try {\n\t\t\tconst decodeHeader = jwtDecode(_credentials.token, { header: true });\n\t\t\tthis._deps.ch = decodeHeader.ch;\n\t\t} catch (error) {\n\t\t\tlogger$1.error(\"[SignalWire] Invalid JWT token provided in credentials:\", error);\n\t\t\tthrow new InvalidCredentialsError(\"Invalid JWT token provided in credentials.\", { cause: error });\n\t\t}\n\t\tif (!_credentials.token && !_credentials.authorizationState) {\n\t\t\tlogger$1.error(\"[SignalWire] No valid authentication credentials provided.\");\n\t\t\tthrow new InvalidCredentialsError(\"No valid authentication credentials provided.\");\n\t\t}\n\t\tif (!this._deps.persistSession && _credentials.expiry_at && _credentials.expiry_at < Date.now()) {\n\t\t\tlogger$1.error(\"[SignalWire] Provided credentials have expired.\");\n\t\t\tthrow new InvalidCredentialsError(\"Provided credentials have expired.\");\n\t\t}\n\t\tif (_credentials.expiry_at && credentialProvider?.refresh) this._refreshCoordinator?.scheduleDeveloperRefresh(credentialProvider, _credentials.expiry_at);\n\t\telse if (_credentials.expiry_at && !credentialProvider?.refresh) {\n\t\t\tlogger$1.warn(`[SignalWire] [SW-NO-REFRESH-HANDLER] Credential has expiry_at=${_credentials.expiry_at} but no refresh handler. Session will terminate at expiry unless the SAT has 'sat:refresh' scope.`);\n\t\t\tthis._warnings$.next({\n\t\t\t\tcode: \"credential_no_refresh_handler\",\n\t\t\t\tsource: \"CredentialProvider\",\n\t\t\t\tmessage: \"Credential has expiry_at but no refresh handler. Session will terminate at expiry unless the SAT carries 'sat:refresh' scope.\",\n\t\t\t\texpiresAt: _credentials.expiry_at\n\t\t\t});\n\t\t}\n\t\tthis._deps.credential = _credentials;\n\t\tthis.persistCredential(_credentials);\n\t\tif (this.isConnected && this._clientSession.authenticated && _credentials.token) try {\n\t\t\tawait this._clientSession.reauthenticate(_credentials.token);\n\t\t\tlogger$1.info(\"[SignalWire] Session refreshed with new credentials.\");\n\t\t} catch (error) {\n\t\t\tlogger$1.error(\"[SignalWire] Failed to refresh session with new credentials:\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t}\n\t}\n\t/** Persist credential to localStorage when persistSession is enabled. */\n\tpersistCredential(credential) {\n\t\tif (!credential.token) return;\n\t\tthis._deps.storage.setItem(\"sw:cached_credential\", credential);\n\t\tif (this._deps.persistSession) this._deps.storage.setItem(\"sw:cached_credential\", credential, \"local\");\n\t}\n\tasync init() {\n\t\tthis._user$.next(new User(this._deps.http));\n\t\tif (!this._options.skipConnection) await this.connect();\n\t\tif (!this._options.reconnectAttachedCalls && this._attachManager) await this._attachManager.flush();\n\t\tif (!this._options.skipRegister) try {\n\t\t\tawait this.register();\n\t\t} catch (error) {\n\t\t\tlogger$1.error(\"[SignalWire] Registration failed:\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t}\n\t\tthis.handleAttachments();\n\t}\n\tasync handleAttachments() {\n\t\tif (!this._attachManager) {\n\t\t\tlogger$1.error(\"[SignalWire] AttachManager not initialized\");\n\t\t\treturn;\n\t\t}\n\t\tif (!this._options.reconnectAttachedCalls) return;\n\t\ttry {\n\t\t\tawait this._attachManager.reattachCalls();\n\t\t} catch (error) {\n\t\t\tlogger$1.error(\"[SignalWire] Failed to reattach calls:\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t}\n\t}\n\t/**\n\t* Establishes the WebSocket connection and authenticates the session.\n\t*\n\t* ## Reconnection behavior\n\t*\n\t* After a successful connection the underlying {@link WebSocketController}\n\t* automatically attempts to reconnect whenever the socket closes\n\t* unexpectedly (e.g. network change, server restart). Reconnection uses an\n\t* **exponential back-off** strategy:\n\t*\n\t* - First retry after `reconnectDelayMin` (default **0.1 s**).\n\t* - Each subsequent retry doubles the delay up to `reconnectDelayMax`\n\t*   (default **3 s**).\n\t* - The delay resets to `reconnectDelayMin` once a connection succeeds.\n\t* - A per-attempt `connectionTimeout` (default **10 s**) aborts the\n\t*   attempt and schedules the next retry if the server does not respond.\n\t*\n\t* Calling {@link disconnect} stops the reconnection loop entirely.\n\t*\n\t* ## Message handling during temporary disconnections\n\t*\n\t* While the socket is not in the `connected` state, **outgoing messages\n\t* are queued** in an internal buffer. Once the connection is\n\t* re-established the queue is flushed in order so no outgoing RPC call is\n\t* lost.\n\t*\n\t* **Incoming** server-to-client messages that arrive while the socket is\n\t* down are *not* buffered by the SDK — they are expected to be\n\t* re-delivered by the server after the session is re-authenticated.\n\t* Active RPC calls that were awaiting a response will time out\n\t* (default **5 s**) and reject with an `RPCTimeoutError`; callers should\n\t* handle this and retry if appropriate.\n\t*\n\t* The connection status can be observed via the `status$` observable on\n\t* the transport layer, which emits `'connecting'`, `'connected'`,\n\t* `'reconnecting'`, `'disconnecting'`, or `'disconnected'`.\n\t*/\n\tasync connect() {\n\t\tawait this.teardownTransportAndSession();\n\t\ttry {\n\t\t\tconst user = this._user$.value;\n\t\t\tif (!user) throw new UnexpectedError(\"User not initialized before connect\");\n\t\t\tif (!await firstValueFrom(user.fetched$)) throw new UnexpectedError(\"Failed to fetch user information - fetched$ emitted false\");\n\t\t\tthis._deps.user = user;\n\t\t} catch (error) {\n\t\t\tlogger$1.error(`[SignalWire] Failed to fetch user information: ${error instanceof Error ? error.message : \"Unknown error\"}. This usually means the user token is invalid or expired.`);\n\t\t\tthrow new UnexpectedError(\"Error fetching user information\", { cause: error });\n\t\t}\n\t\tconst errorHandler = (error) => {\n\t\t\tthis._errors$.next(error);\n\t\t};\n\t\tthis._transport = new TransportManager(this._deps.storage, this._deps.protocolKey, this._deps.WebSocket, PreferencesContainer.instance.relayHost ?? this._deps.relayHost, errorHandler);\n\t\tthis._attachManager = new AttachManager(this._deps.storage, this._deps.deviceController, PreferencesContainer.instance.reconnectCallsTimeout, this._deps.attachedCallsKey);\n\t\tthis._clientSession = new ClientSessionManager(() => this._deps.credential, this._transport, this._deps.storage, this._deps.authorizationStateKey, this._deps.deviceController, this._attachManager, this._deps.webRTCApiProvider, this._dpopManager, this._networkMonitor?.networkChange$);\n\t\tthis._publicSession = new ClientSessionWrapper(this._clientSession);\n\t\tthis._clientSession.onBeforeReconnect = async () => {\n\t\t\tif (!this._credentialProvider) return;\n\t\t\ttry {\n\t\t\t\tconst fingerprint = this._dpopManager?.initialized ? this._dpopManager.fingerprint : void 0;\n\t\t\t\tlogger$1.debug(\"[SignalWire] Credential expired, refreshing before reconnect\");\n\t\t\t\tconst newCredentials = await this._credentialProvider.authenticate(fingerprint ? { fingerprint } : void 0);\n\t\t\t\tthis._deps.credential = newCredentials;\n\t\t\t\tif (newCredentials.expiry_at && this._credentialProvider.refresh) this._refreshCoordinator?.scheduleDeveloperRefresh(this._credentialProvider, newCredentials.expiry_at);\n\t\t\t\tlogger$1.debug(\"[SignalWire] Credential refreshed successfully for reconnect\");\n\t\t\t} catch (error) {\n\t\t\t\tlogger$1.error(\"[SignalWire] Failed to refresh credentials for reconnect:\", error);\n\t\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t};\n\t\tthis.subscribeTo(this._clientSession.errors$, (error) => {\n\t\t\tthis._errors$.next(error);\n\t\t});\n\t\tawait this._clientSession.connect();\n\t\tawait this._refreshCoordinator?.activate(this._deps.user, this._clientSession);\n\t\tthis.subscribeTo(this._clientSession.authenticated$.pipe(skip(1), filter(Boolean)), async () => {\n\t\t\ttry {\n\t\t\t\tawait this._refreshCoordinator?.activate(this._deps.user, this._clientSession);\n\t\t\t} catch (error) {\n\t\t\t\tlogger$1.error(\"[SignalWire] Refresh re-arm after reconnect failed (non-fatal):\", error);\n\t\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tlogger$1.debug(\"[SignalWire] Re-registering user after reconnect\");\n\t\t\t\tawait this.register();\n\t\t\t\tlogger$1.debug(\"[SignalWire] User re-registered successfully after reconnect\");\n\t\t\t} catch (error) {\n\t\t\t\tlogger$1.error(\"[SignalWire] Re-registration failed after reconnect:\", error);\n\t\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t}\n\t\t});\n\t\tconst conversationManager = new ConversationsManager(this._clientSession, this._deps.http, () => this._deps.getUserFromAddressId(), errorHandler);\n\t\tconst directory = new DirectoryManager(this._deps.http, this._clientSession, conversationManager, errorHandler);\n\t\tthis._directory$.next(directory);\n\t\tthis._clientSession.setDirectory(directory);\n\t\tthis._isConnected$.next(true);\n\t\tthis._diagnosticsCollector?.record(\"connection\", \"connected\");\n\t\tthis.subscribeTo(this._clientSession.authenticated$.pipe(skip(2), filter(Boolean)), () => {\n\t\t\tthis._diagnosticsCollector?.record(\"connection\", \"reconnected\");\n\t\t});\n\t}\n\t/**\n\t* Observable that emits the {@link User} profile once fetched,\n\t* or `undefined` before authentication completes.\n\t*\n\t* @example\n\t* ```ts\n\t* client.user$.subscribe(u => {\n\t*   if (u) console.log('Logged in as', u.email);\n\t* });\n\t* ```\n\t*/\n\tget user$() {\n\t\treturn this.deferEmission(this._user$.asObservable());\n\t}\n\t/** Current user snapshot, or `undefined` if not yet authenticated. */\n\tget user() {\n\t\treturn this._user$.value;\n\t}\n\t/**\n\t* Observable that emits the {@link Directory} instance once the client is connected,\n\t* or `undefined` while disconnected. Subscribe to this to safely wait for the directory\n\t* to become available without risking an error.\n\t*\n\t* @example\n\t* ```ts\n\t* client.directory$.subscribe(dir => {\n\t*   if (dir) dir.addresses$.subscribe(console.log);\n\t* });\n\t* ```\n\t*/\n\tget directory$() {\n\t\treturn this.deferEmission(this._directory$.asObservable());\n\t}\n\t/**\n\t* Current directory snapshot, or `undefined` if the client is not yet connected.\n\t* Prefer {@link directory$} when you need to react to the directory becoming available.\n\t*/\n\tget directory() {\n\t\treturn this._directory$.value;\n\t}\n\t/** Observable that emits when the user registration state changes. */\n\tget isRegistered$() {\n\t\treturn this.deferEmission(this._isRegistered$.asObservable());\n\t}\n\t/** Whether the user is currently registered. */\n\tget isRegistered() {\n\t\treturn this._isRegistered$.value;\n\t}\n\t/** Whether the client is currently connected. */\n\tget isConnected() {\n\t\treturn this._isConnected$.value;\n\t}\n\t/** Observable that emits when the connection state changes. */\n\tget isConnected$() {\n\t\treturn this.deferEmission(this._isConnected$.asObservable());\n\t}\n\t/** Observable that emits `true` when the client is both connected and authenticated. */\n\tget ready$() {\n\t\treturn this.publicCachedObservable(\"ready$\", () => this._isConnected$.pipe(switchMap((connected) => connected ? this._clientSession.authenticated$ : of(false))));\n\t}\n\t/** Observable stream of errors from transport, authentication, and devices. */\n\tget errors$() {\n\t\treturn this.deferEmission(this._errors$.asObservable());\n\t}\n\t/**\n\t* Observable stream of non-fatal SDK warnings.\n\t*\n\t* Subscribe to detect SDK behaviors that affect session liveness or developer-facing\n\t* contracts but do not warrant disconnection — e.g., a fallback from Client Bound SAT\n\t* refresh to the developer-provided `refresh()` because the SAT lacks `sat:refresh`\n\t* scope. Discriminated by `code`.\n\t*\n\t* Independent from {@link errors$}: existing error consumers are not notified.\n\t*/\n\tget warnings$() {\n\t\treturn this.deferEmission(this._warnings$.asObservable());\n\t}\n\t/** Platform WebRTC capabilities detected at construction time. */\n\tget platformCapabilities() {\n\t\tthis._platformCapabilities ??= detectPlatformCapabilities(this._options.webRTCApiProvider);\n\t\treturn this._platformCapabilities;\n\t}\n\t/** Observable that emits when the SDK auto-switches a device. */\n\tget deviceRecovered$() {\n\t\treturn this.deferEmission(this._deviceController.deviceRecovered$);\n\t}\n\t/**\n\t* Export a structured diagnostic bundle for support/debugging.\n\t* Includes connection events, call summaries, and device changes.\n\t*/\n\texportDiagnostics() {\n\t\tconst devices = {\n\t\t\taudioInput: this.audioInputDevices,\n\t\t\taudioOutput: this.audioOutputDevices,\n\t\t\tvideoInput: this.videoInputDevices\n\t\t};\n\t\tconst base = {\n\t\t\tsdkVersion: \"unknown\",\n\t\t\tuserAgent: typeof navigator !== \"undefined\" ? navigator.userAgent : \"unknown\",\n\t\t\tcapabilities: this.platformCapabilities,\n\t\t\tevents: [],\n\t\t\tcalls: [],\n\t\t\tdeviceChanges: [],\n\t\t\tdevices\n\t\t};\n\t\tif (!this._diagnosticsCollector) return base;\n\t\tconst raw = this._diagnosticsCollector.export();\n\t\treturn {\n\t\t\t...base,\n\t\t\tsdkVersion: raw.sdkVersion,\n\t\t\tuserAgent: raw.userAgent,\n\t\t\tevents: raw.events,\n\t\t\tcalls: raw.calls,\n\t\t\tdeviceChanges: raw.deviceChanges,\n\t\t\tdevices\n\t\t};\n\t}\n\t/**\n\t* Initialize resilience subsystems. Non-fatal: any failure is logged and\n\t* the SDK continues working without the failing subsystem.\n\t*/\n\tinitResilienceSubsystems() {\n\t\ttry {\n\t\t\tthis._platformCapabilities = detectPlatformCapabilities(this._options.webRTCApiProvider);\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Failed to detect platform capabilities:\", error);\n\t\t}\n\t\ttry {\n\t\t\tthis._networkMonitor = new NetworkMonitor();\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Failed to initialize NetworkMonitor:\", error);\n\t\t}\n\t\ttry {\n\t\t\tthis._visibilityController = new VisibilityController();\n\t\t\tthis.subscribeTo(this._visibilityController.visibilityChange$.pipe(filter((event) => event.to === \"visible\" && PreferencesContainer.instance.refreshDevicesOnVisible)), () => {\n\t\t\t\tlogger$1.debug(\"[SignalWire] Page visible, re-enumerating devices\");\n\t\t\t\ttry {\n\t\t\t\t\tthis._deviceController.disableDeviceMonitoring();\n\t\t\t\t\tthis._deviceController.enableDeviceMonitoring();\n\t\t\t\t} catch {}\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Failed to initialize VisibilityController:\", error);\n\t\t}\n\t\ttry {\n\t\t\tthis._diagnosticsCollector = new DiagnosticsCollector({ sdkVersion: \"4.0.0-rc.2\" });\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Failed to initialize DiagnosticsCollector:\", error);\n\t\t}\n\t}\n\t/**\n\t* Disconnects the WebSocket and tears down the current session.\n\t*\n\t* Ends the session identified by the protocol and clears its persisted\n\t* resume state (`authorization_state` + protocol) and attach records\n\t* together — a later {@link connect} with the same credentials starts a\n\t* fresh session and cannot reattach to the ended session's calls.\n\t* Credentials and device preferences are preserved. To temporarily stop\n\t* receiving inbound calls while keeping the session alive, use\n\t* `unregister()` instead.\n\t*\n\t* The client can be reconnected by calling {@link connect} again,\n\t* which creates a fresh transport and session.\n\t*/\n\tasync disconnect() {\n\t\tthis._refreshCoordinator?.suspend();\n\t\tthis._diagnosticsCollector?.record(\"connection\", \"disconnected\");\n\t\tawait this.teardownTransportAndSession();\n\t\tthis._isConnected$.next(false);\n\t}\n\t/**\n\t* Tear down the current transport / session / attach manager. Safe to call\n\t* when nothing has been initialized yet (e.g. first connect()).\n\t*/\n\tasync teardownTransportAndSession() {\n\t\tconst session = this._clientSession;\n\t\tconst transport = this._transport;\n\t\tif (session) {\n\t\t\ttry {\n\t\t\t\tawait session.disconnect();\n\t\t\t} catch (error) {\n\t\t\t\tlogger$1.warn(\"[SignalWire] Error disconnecting previous session:\", error);\n\t\t\t}\n\t\t\tsession.destroy();\n\t\t}\n\t\tif (transport) transport.destroy();\n\t\tthis._clientSession = void 0;\n\t\tthis._publicSession = void 0;\n\t\tthis._transport = void 0;\n\t\tthis._attachManager = void 0;\n\t}\n\tasync waitAuthentication() {\n\t\tawait firstValueFrom(this.ready$.pipe(filter((ready$1) => ready$1 === true)));\n\t}\n\t/**\n\t* Registers the user as online to receive inbound calls and events.\n\t*\n\t* Waits for authentication to complete before sending the registration.\n\t* If the initial attempt fails, reauthentication is attempted automatically.\n\t*\n\t* @throws {InvalidCredentialsError} If registration and reauthentication both fail.\n\t*/\n\tasync register() {\n\t\ttry {\n\t\t\tawait this.waitAuthentication();\n\t\t\tawait this._transport.execute(RPCExecute({\n\t\t\t\tmethod: \"subscriber.online\",\n\t\t\t\tparams: {}\n\t\t\t}));\n\t\t\tthis._isRegistered$.next(true);\n\t\t\treturn;\n\t\t} catch (error) {\n\t\t\tif (!this._deps.credential.token) {\n\t\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tlogger$1.debug(\"[SignalWire] Failed to register user, trying reauthentication...\");\n\t\t\ttry {\n\t\t\t\tawait this._clientSession.reauthenticate(this._deps.credential.token);\n\t\t\t\tlogger$1.debug(\"[SignalWire] Reauthentication successful, retrying register()\");\n\t\t\t\tawait this._transport.execute(RPCExecute({\n\t\t\t\t\tmethod: \"subscriber.online\",\n\t\t\t\t\tparams: {}\n\t\t\t\t}));\n\t\t\t\tthis._isRegistered$.next(true);\n\t\t\t} catch (reauthError) {\n\t\t\t\tlogger$1.error(\"[SignalWire] Reauthentication failed during register():\", reauthError);\n\t\t\t\tconst registerError = new InvalidCredentialsError(\"Failed to register user, and reauthentication attempt also failed. Please check your credentials.\", { cause: reauthError instanceof Error ? reauthError : new Error(String(reauthError), { cause: reauthError }) });\n\t\t\t\tthis._errors$.next(registerError);\n\t\t\t\tthrow registerError;\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t* Unregisters the user, going offline for inbound calls.\n\t*\n\t* The WebSocket connection remains open; use {@link disconnect} to fully close it.\n\t*/\n\tasync unregister() {\n\t\ttry {\n\t\t\tawait this._transport.execute(RPCExecute({\n\t\t\t\tmethod: \"subscriber.offline\",\n\t\t\t\tparams: {}\n\t\t\t}));\n\t\t\tthis._isRegistered$.next(false);\n\t\t} catch (error) {\n\t\t\tlogger$1.error(\"[SignalWire] Failed to unregister user:\", error);\n\t\t\tthis._errors$.next(error instanceof Error ? error : new Error(String(error), { cause: error }));\n\t\t\tthrow error;\n\t\t}\n\t}\n\t/**\n\t* Places an outbound call to the given destination.\n\t*\n\t* Waits for authentication before dialing. Media options are merged from\n\t* saved preferences, destination query parameters (e.g. `?channel=video`),\n\t* and the provided `options` (highest priority).\n\t*\n\t* Returns a {@link Call} in `'ringing'` state. Subscribe to {@link Call.status$}\n\t* to track progression through `'connected'` → `'disconnected'`.\n\t*\n\t* @param destination - Address URI string (e.g. `'/public/my-room'`) or {@link Address} instance.\n\t* @param options - Media and dial options (audio/video, device constraints). Overrides defaults.\n\t* @returns The created {@link Call} instance.\n\t* @throws {Error} If authentication is not complete or call creation fails.\n\t*\n\t* @example\n\t* ```ts\n\t* const call = await client.dial('/public/conference', {\n\t*   audio: true,\n\t*   video: true,\n\t* });\n\t* call.status$.subscribe(status => console.log('Call:', status));\n\t* ```\n\t*/\n\tasync dial(destination, options = {}) {\n\t\tconst computed_options = {\n\t\t\t...PreferencesContainer.instance.preferredMediaOptions,\n\t\t\t...buildOptionsFromDestination(destination),\n\t\t\t...options\n\t\t};\n\t\tawait this.waitAuthentication();\n\t\tlogger$1.debug(\"[SignalWire] Dialing with options:\", computed_options);\n\t\treturn this._clientSession.createOutboundCall(destination, computed_options);\n\t}\n\t/**\n\t* Runs a multi-phase connectivity test against the given destination.\n\t*\n\t* The test checks:\n\t*   1. **Signaling** -- WebSocket connected, RTT measurement\n\t*   2. **Devices** -- getUserMedia succeeds with selected (or specified) devices\n\t*   3. **ICE/TURN** -- gathers ICE candidates to verify STUN/TURN reachability\n\t*   4. **Media/bandwidth** (unless `skipMediaTest`) -- dials the destination,\n\t*      collects getStats() for `duration` seconds, computes bandwidth estimates\n\t*\n\t* @param destination - A destination to dial for the media test (e.g. `'/private/network-test'`).\n\t* @param options - Preflight options (duration, skipMediaTest, device overrides).\n\t* @returns A {@link PreflightResult} describing connectivity health.\n\t*\n\t* @example\n\t* ```ts\n\t* const result = await client.preflight('/private/network-test', { duration: 5 });\n\t* if (!result.ok) console.warn('Connectivity issues:', result.warnings);\n\t* ```\n\t*/\n\tasync preflight(destination, options) {\n\t\tconst iceServers = this._clientSession.iceServers ?? PreferencesContainer.instance.iceServers ?? [];\n\t\tconst isConnected = this._isConnected$.value;\n\t\treturn new PreflightRunner(this._deviceController, iceServers, isConnected, 0, async (dest, opts) => this.dial(dest, opts), options).run(destination);\n\t}\n\t/** The underlying client session for advanced RPC operations. */\n\tget session() {\n\t\treturn this._publicSession;\n\t}\n\t/** Observable list of available audio input (microphone) devices. */\n\tget audioInputDevices$() {\n\t\treturn this.deferEmission(this._deviceController.audioInputDevices$);\n\t}\n\t/** Current snapshot of available audio input devices. */\n\tget audioInputDevices() {\n\t\treturn this._deviceController.audioInputDevices;\n\t}\n\t/** Observable list of available audio output (speaker) devices. */\n\tget audioOutputDevices$() {\n\t\treturn this.deferEmission(this._deviceController.audioOutputDevices$);\n\t}\n\t/** Current snapshot of available audio output devices. */\n\tget audioOutputDevices() {\n\t\treturn this._deviceController.audioOutputDevices;\n\t}\n\t/** Observable list of available video input (camera) devices. */\n\tget videoInputDevices$() {\n\t\treturn this.deferEmission(this._deviceController.videoInputDevices$);\n\t}\n\t/** Current snapshot of available video input devices. */\n\tget videoInputDevices() {\n\t\treturn this._deviceController.videoInputDevices;\n\t}\n\t/** Observable of the currently selected audio input device. */\n\tget selectedAudioInputDevice$() {\n\t\treturn this.deferEmission(this._deviceController.selectedAudioInputDevice$);\n\t}\n\t/** Observable of the currently selected audio output device. */\n\tget selectedAudioOutputDevice$() {\n\t\treturn this.deferEmission(this._deviceController.selectedAudioOutputDevice$);\n\t}\n\t/** Observable of the currently selected video input device. */\n\tget selectedVideoInputDevice$() {\n\t\treturn this.deferEmission(this._deviceController.selectedVideoInputDevice$);\n\t}\n\t/** Currently selected audio input device, or `null` if none. */\n\tget selectedAudioInputDevice() {\n\t\treturn this._deviceController.selectedAudioInputDevice;\n\t}\n\t/** Currently selected audio output device, or `null` if none. */\n\tget selectedAudioOutputDevice() {\n\t\treturn this._deviceController.selectedAudioOutputDevice;\n\t}\n\t/** Currently selected video input device, or `null` if none. */\n\tget selectedVideoInputDevice() {\n\t\treturn this._deviceController.selectedVideoInputDevice;\n\t}\n\t/** Media track constraints for the selected audio input device. Returns `false` when disabled. */\n\tget selectedAudioInputDeviceConstraints() {\n\t\treturn this._deviceController.selectedAudioInputDeviceConstraints;\n\t}\n\t/** Media track constraints for the selected video input device. Returns `false` when disabled. */\n\tget selectedVideoInputDeviceConstraints() {\n\t\treturn this._deviceController.selectedVideoInputDeviceConstraints;\n\t}\n\t/** Converts a `MediaDeviceInfo` to track constraints suitable for `getUserMedia`. */\n\tdeviceInfoToConstraints(deviceInfo) {\n\t\treturn this._deviceController.deviceInfoToConstraints(deviceInfo);\n\t}\n\t/** Sets the preferred audio input device. */\n\tselectAudioInputDevice(device) {\n\t\tthis._deviceController.selectAudioInputDevice(device);\n\t}\n\t/** Sets the preferred video input device. */\n\tselectVideoInputDevice(device) {\n\t\tthis._deviceController.selectVideoInputDevice(device);\n\t}\n\t/** Sets the preferred audio output device. */\n\tselectAudioOutputDevice(device) {\n\t\tthis._deviceController.selectAudioOutputDevice(device);\n\t}\n\t/**\n\t* Apply the currently selected audio output device to an HTMLMediaElement\n\t* (e.g. the `<audio>` or `<video>` element the consumer attached the\n\t* remote stream to). Uses `HTMLMediaElement.setSinkId` under the hood.\n\t* Returns a `Promise<boolean>`: `true` if the sink was applied,\n\t* `false` if the browser doesn't support `setSinkId` or no device is\n\t* selected.\n\t*\n\t* @example\n\t* ```ts\n\t* audioEl.srcObject = call.remoteStream;\n\t* await client.applySelectedAudioOutputDevice(audioEl);\n\t* ```\n\t*/\n\tasync applySelectedAudioOutputDevice(element) {\n\t\tconst device = this._deviceController.selectedAudioOutputDevice;\n\t\tif (!device?.deviceId) return false;\n\t\tconst withSink = element;\n\t\tif (typeof withSink.setSinkId !== \"function\") {\n\t\t\tlogger$1.warn(\"[SignalWire] setSinkId not supported on this element / browser\");\n\t\t\treturn false;\n\t\t}\n\t\ttry {\n\t\t\tawait withSink.setSinkId(device.deviceId);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Failed to apply audio output device:\", error);\n\t\t\treturn false;\n\t\t}\n\t}\n\t/** Starts monitoring for media device changes (connect/disconnect). */\n\tenableDeviceMonitoring() {\n\t\tthis._deviceController.enableDeviceMonitoring();\n\t}\n\t/** Stops monitoring for media device changes. */\n\tdisableDeviceMonitoring() {\n\t\tthis._deviceController.disableDeviceMonitoring();\n\t}\n\t/**\n\t* Returns the capabilities of a media device.\n\t* @param deviceInfo - The device to query.\n\t* @returns The device capabilities, or `null` if unavailable.\n\t*/\n\tasync getDeviceCapabilities(deviceInfo) {\n\t\treturn this._deviceController.getDeviceCapabilities(deviceInfo);\n\t}\n\t/**\n\t* Checks whether a device is still available and usable.\n\t* @param deviceInfo - The device to validate, or `null`.\n\t* @returns `true` if the device is valid and available. Returns `false` for `null`, audio output devices, or unavailable devices.\n\t*/\n\tasync isValidDevice(deviceInfo) {\n\t\treturn this._deviceController.isValidDevice(deviceInfo);\n\t}\n\t/** Injects a storage manager into the device controller for persistence. */\n\tsetStorageManager(storageManager) {\n\t\tthis._deviceController.setStorageManager(storageManager);\n\t}\n\t/** Clears all device state and re-enumerates. */\n\tasync clearDeviceState() {\n\t\treturn this._deviceController.clearDeviceState();\n\t}\n\t/** Forces a device re-enumeration. */\n\tasync enumerateDevices() {\n\t\treturn this._deviceController.enumerateDevices();\n\t}\n\t/** Disables audio input (receive-only mode). No audio track will be acquired. */\n\tdisableAudioInput() {\n\t\tthis._deviceController.disableAudioInput();\n\t}\n\t/** Re-enables audio input, restoring the last selection or auto-selecting. */\n\tenableAudioInput() {\n\t\tthis._deviceController.enableAudioInput();\n\t}\n\t/** Disables video input (receive-only mode). No video track will be acquired. */\n\tdisableVideoInput() {\n\t\tthis._deviceController.disableVideoInput();\n\t}\n\t/** Re-enables video input, restoring the last selection or auto-selecting. */\n\tenableVideoInput() {\n\t\tthis._deviceController.enableVideoInput();\n\t}\n\t/** Observable that emits `true` when video input is disabled (receive-only). */\n\tget videoInputDisabled$() {\n\t\treturn this.deferEmission(this._deviceController.videoInputDisabled$);\n\t}\n\t/** Observable that emits `true` when audio input is disabled (receive-only). */\n\tget audioInputDisabled$() {\n\t\treturn this.deferEmission(this._deviceController.audioInputDisabled$);\n\t}\n\t/** Whether video input is currently disabled. */\n\tget videoInputDisabled() {\n\t\treturn this._deviceController.videoInputDisabled;\n\t}\n\t/** Whether audio input is currently disabled. */\n\tget audioInputDisabled() {\n\t\treturn this._deviceController.audioInputDisabled;\n\t}\n\t/**\n\t* Triggers the browser's media permission dialog and captures the user's device selections.\n\t*\n\t* @param options - Which permissions to request.\n\t* @param options.audio - Whether to request audio permission.\n\t* @param options.video - Whether to request video permission.\n\t* @returns The permission result with selected devices.\n\t*/\n\tasync requestMediaPermissions(options = {\n\t\taudio: true,\n\t\tvideo: true\n\t}) {\n\t\tconst constraints = {\n\t\t\taudio: options.audio ?? false,\n\t\t\tvideo: options.video ?? false\n\t\t};\n\t\tlet audioGranted = false;\n\t\tlet videoGranted = false;\n\t\tlet selectedAudioDevice;\n\t\tlet selectedVideoDevice;\n\t\ttry {\n\t\t\tconst tracks = (await this._deps.webRTCApiProvider.mediaDevices.getUserMedia(constraints)).getTracks();\n\t\t\tfor (const track of tracks) {\n\t\t\t\tconst settings = track.getSettings();\n\t\t\t\tif (track.kind === \"audio\") {\n\t\t\t\t\taudioGranted = true;\n\t\t\t\t\tif (settings.deviceId) selectedAudioDevice = this.audioInputDevices.find((d) => d.deviceId === settings.deviceId);\n\t\t\t\t} else if (track.kind === \"video\") {\n\t\t\t\t\tvideoGranted = true;\n\t\t\t\t\tif (settings.deviceId) selectedVideoDevice = this.videoInputDevices.find((d) => d.deviceId === settings.deviceId);\n\t\t\t\t}\n\t\t\t\ttrack.stop();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger$1.warn(\"[SignalWire] Media permission request failed:\", error);\n\t\t}\n\t\tawait this._deviceController.enumerateDevices();\n\t\tif (audioGranted && selectedAudioDevice) {\n\t\t\tconst audioDeviceId = selectedAudioDevice.deviceId;\n\t\t\tselectedAudioDevice = this.audioInputDevices.find((d) => d.deviceId === audioDeviceId) ?? selectedAudioDevice;\n\t\t}\n\t\tif (videoGranted && selectedVideoDevice) {\n\t\t\tconst videoDeviceId = selectedVideoDevice.deviceId;\n\t\t\tselectedVideoDevice = this.videoInputDevices.find((d) => d.deviceId === videoDeviceId) ?? selectedVideoDevice;\n\t\t}\n\t\tif (audioGranted && selectedAudioDevice && !this.selectedAudioInputDevice) this.selectAudioInputDevice(selectedAudioDevice);\n\t\tif (videoGranted && selectedVideoDevice && !this.selectedVideoInputDevice) this.selectVideoInputDevice(selectedVideoDevice);\n\t\treturn {\n\t\t\taudio: audioGranted,\n\t\t\tvideo: videoGranted,\n\t\t\tselectedAudioDevice,\n\t\t\tselectedVideoDevice\n\t\t};\n\t}\n\t/**\n\t* Clears all SDK-persisted state and resets to defaults.\n\t*\n\t* This clears device preferences, device history, authorization state,\n\t* attached call IDs, and all SDK storage keys, then re-enumerates devices.\n\t*/\n\tasync resetToDefaults() {\n\t\tawait this._deps.storage.clearAll();\n\t\tconst prefs = PreferencesContainer.instance;\n\t\tprefs.preferredAudioInput = null;\n\t\tprefs.preferredAudioOutput = null;\n\t\tprefs.preferredVideoInput = null;\n\t\tawait this._deviceController.clearDeviceState();\n\t}\n\t/**\n\t* Destroys the client, clearing timers and releasing all resources.\n\t*\n\t* Intentionally destroying the client ends its session: the resume state\n\t* (`authorization_state` + protocol) and the attach records are both\n\t* cleared. Credentials and device preferences are preserved — use\n\t* {@link resetToDefaults} for a full wipe. To temporarily stop receiving\n\t* inbound calls while keeping the session alive, use `unregister()`.\n\t*/\n\tdestroy() {\n\t\tthis._refreshCoordinator?.destroy();\n\t\tthis._refreshCoordinator = void 0;\n\t\tthis._dpopManager?.destroy();\n\t\tthis._clientSession.teardownSessionState();\n\t\tthis._transport.destroy();\n\t\tthis._clientSession.destroy();\n\t\ttry {\n\t\t\tthis._networkMonitor?.destroy();\n\t\t} catch {}\n\t\ttry {\n\t\t\tthis._visibilityController?.destroy();\n\t\t} catch {}\n\t\ttry {\n\t\t\tthis._diagnosticsCollector?.destroy();\n\t\t} catch {}\n\t\tthis._networkMonitor = void 0;\n\t\tthis._visibilityController = void 0;\n\t\tthis._diagnosticsCollector = void 0;\n\t\tsuper.destroy();\n\t}\n};\n\n//#endregion\n//#region src/dependencies/EmbedTokenCredentialProvider.ts\nconst logger = getLogger();\n/** Credential provider that exchanges an embed token for a SAT via the host's token endpoint. */\nvar EmbedTokenCredentialProvider = class {\n\tconstructor(host, embedToken) {\n\t\tthis.host = host;\n\t\tthis.embedToken = embedToken;\n\t}\n\tasync fetchSAT() {\n\t\tconst url = `https://${this.host}/api/fabric/embeds/tokens`;\n\t\tconst timeout$1 = 1e4;\n\t\tconst controller = new AbortController();\n\t\tconst timeoutId = setTimeout(() => controller.abort(), timeout$1);\n\t\ttry {\n\t\t\tconst response = await fetch(url, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify({ token: this.embedToken }),\n\t\t\t\tsignal: controller.signal\n\t\t\t});\n\t\t\tclearTimeout(timeoutId);\n\t\t\tif (response.ok) return (await response.json()).token;\n\t\t\tthrow new RequestError(`Failed to fetch SAT using embed token: ${response.status} ${response.statusText}`);\n\t\t} catch (error) {\n\t\t\tclearTimeout(timeoutId);\n\t\t\tif (error instanceof Error && error.name === \"AbortError\") throw new RequestTimeoutError(`Request timeout after ${timeout$1}ms`, { cause: error });\n\t\t\tlogger.error(\"[EmbedCredentialProvider] Request failed:\", error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\tasync authenticate() {\n\t\treturn {\n\t\t\ttoken: await this.fetchSAT(),\n\t\t\texpiry_at: Date.now() + 3600 * 1e3\n\t\t};\n\t}\n\tasync refresh() {\n\t\treturn this.authenticate();\n\t}\n};\n\n//#endregion\n//#region src/utils/embeddableCall.ts\n/**\n* Creates a call using an embed token for simple, embeddable integrations.\n*\n* Handles client creation, authentication, and dialing in a single call.\n*\n* @param options - Embed token, host, and destination.\n* @returns The created {@link Call} instance.\n*/\nasync function embeddableCall(options) {\n\tconst { to, embedToken, host } = options;\n\tconst requiredFailed = [];\n\tif (!to) requiredFailed.push(\"to\");\n\tif (!embedToken) requiredFailed.push(\"embedToken\");\n\tif (!host) requiredFailed.push(\"host\");\n\tif (requiredFailed.length > 0) return Promise.reject(new DependencyError(`Missing required options: ${requiredFailed.join(\", \")}`));\n\tconst client = new SignalWire(new EmbedTokenCredentialProvider(host, embedToken));\n\tconst call = await client.dial(to);\n\tcall.status$.pipe(first((status) => status === \"destroyed\")).subscribe(() => {\n\t\tclient.disconnect();\n\t});\n\treturn call;\n}\n\n//#endregion\n//#region src/dependencies/StaticCredentialProvider.ts\n/**\n* Credential provider that returns a fixed set of credentials.\n*\n* Use when the token is already available (e.g. from a backend endpoint).\n*\n* @example\n* ```ts\n* const provider = new StaticCredentialProvider({ token: 'my-sat-token' });\n* const client = new SignalWire(provider);\n* ```\n*/\nvar StaticCredentialProvider = class {\n\tconstructor(credentials) {\n\t\tthis.credentials = credentials;\n\t}\n\t/** Returns the static credentials. */\n\tasync authenticate() {\n\t\treturn Promise.resolve(this.credentials);\n\t}\n};\n\n//#endregion\n//#region src/index.ts\n/**\n* Library version from package.json, injected at build time.\n*/\nconst version = \"4.0.0-rc.2\";\n/**\n* Flag indicating the library has been loaded and is ready to use.\n* For UMD builds: `window.SignalWire.ready`\n* For ES modules: `import { ready } from '@signalwire/js'`\n*/\nconst ready = true;\n/**\n* Emits 'signalwire:js:ready' event when the library is loaded.\n*\n* Scripts that might load BEFORE the library (check flag first):\n*    ```js\n*    if (window.SignalWire?.ready) {\n*      // Library already loaded, use it directly\n*      initApp();\n*    } else {\n*      window.addEventListener('signalwire:js:ready', () => initApp());\n*    }\n*    ```\n*/\nconst emitReadyEvent = () => {\n\tif (typeof window !== \"undefined\") {\n\t\tconst event = new CustomEvent(\"signalwire:js:ready\", { detail: { version: \"4.0.0-rc.2\" } });\n\t\twindow.dispatchEvent(event);\n\t}\n};\nemitReadyEvent();\n\n//#endregion\nexport { Address, CallCreateError, ClientPreferences, CollectionFetchError, DPoPInitError, DeviceTokenError, EmbedTokenCredentialProvider, InvalidCredentialsError, MediaAccessError, MediaTrackError, MessageParseError, OverconstrainedFallbackError, Participant, PreflightError, RecoveryError, SelfCapabilities, SelfParticipant, SignalWire, StaticCredentialProvider, TokenRefreshError, UnexpectedError, User, VertoPongError, WebRTCCall, embeddableCall, getLogger, isSelfParticipant, ready, setDebugOptions, setLogLevel, setLogger, version };\n//# sourceMappingURL=index.mjs.map","/**\n * Call Media Component\n *\n * Renders the remote video stream with aspect-ratio-aware sizing.\n *\n * Input precedence (most specific wins): `.stream` > `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider (sw-call-widget): -->\n * <sw-call-media></sw-call-media>\n *\n * <!-- With an explicit Call: -->\n * <sw-call-media .call=${call}></sw-call-media>\n *\n * <!-- With a raw remote stream: -->\n * <sw-call-media .stream=${remoteStream}></sw-call-media>\n * ```\n *\n * @csspart container - Outer container that holds the video and overlay layers.\n * @csspart video     - The `<video>` element rendering the remote stream.\n *\n * @slot - Default slot for overlay layers (e.g. `<sw-self-media>`, `<sw-participants>`).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { attachMediaStream, detachMediaStream } from '../utils/video.js';\nimport { getLogger } from '@signalwire/js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-media')\nexport class SwCallMedia extends LitElement {\n  static styles = css`\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n      overflow: hidden;\n    }\n\n    .mcu-content {\n      position: relative;\n      width: 100%;\n      height: 100%;\n      margin: 0 auto;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background-color: var(--bg-page, #0e0e18);\n      overflow: hidden;\n    }\n\n    /* Fill the parent box. The video element below uses object-fit: contain\n       so the stream letterboxes into whatever rectangle the parent gives us\n       — no JS sizing pass required. */\n    .padding-wrapper {\n      position: relative;\n      width: 100%;\n      height: 100%;\n    }\n\n    /* Outer rounding is owned by sw-ui-call-layout's :host border-radius +\n       overflow:hidden. Rounding here too carves a notch out of the right\n       edge of the video cell that exposes whatever sits behind the widget\n       (page / modal backdrop) as a black sliver in light mode. */\n    .mcu-wrapper {\n      position: absolute;\n      inset: 0;\n      overflow: hidden;\n    }\n\n    .mcu-video {\n      width: 100%;\n      height: 100%;\n      display: block;\n      object-fit: contain;\n    }\n\n    .mcu-layers {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      pointer-events: none;\n    }\n  `;\n\n  /**\n   * Explicit Call — when set, subscribes directly to its observables instead\n   * of relying on context. Overridden by `.stream` if both are set.\n   */\n  @property({ type: Object }) call?: Call;\n\n  /**\n   * Explicit remote MediaStream — highest precedence. Bypasses both `.call`\n   * and context. Useful for raw rendering with no SDK at all.\n   */\n  @property({ attribute: false }) stream: MediaStream | null = null;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  @consume({ context: devicesContext, subscribe: true })\n  @state()\n  private _devicesState?: DevicesState;\n\n  private _remoteStreamValue: MediaStream | null = null;\n  private _lastTrackSignature = '';\n  private _subscriptions: Subscription[] = [];\n\n  // ── Lifecycle ──────────────────────────────────────────────────────\n\n  connectedCallback() {\n    super.connectedCallback();\n    if (!this.stream && this.call) this._setupDirectSubscriptions();\n    if (this.stream) {\n      this._remoteStreamValue = this.stream;\n      this._lastTrackSignature = this._computeTrackSignature(this.stream);\n    }\n  }\n\n  protected updated(changedProperties: Map<string, unknown>): void {\n    super.updated(changedProperties);\n\n    // Direct call prop changed — re-subscribe (only meaningful when `.stream` isn't set)\n    if (changedProperties.has('call')) {\n      this._cleanupDirectSubscriptions();\n      if (!this.stream && this.call) this._setupDirectSubscriptions();\n    }\n\n    // Explicit `.stream` prop wins — attach it and skip everything else.\n    if (changedProperties.has('stream')) {\n      this._cleanupDirectSubscriptions();\n      const stream = this.stream;\n      const signature = this._computeTrackSignature(stream);\n      if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n        this._remoteStreamValue = stream;\n        this._lastTrackSignature = signature;\n        const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n        if (video) attachMediaStream(video, stream);\n      }\n    }\n\n    // Context-driven: stream or its track set changed.\n    // WebRTC delivers tracks one at a time via ontrack, and the SDK re-emits\n    // the same MediaStream reference each time — so we must also re-attach when\n    // the track set changes, otherwise Chromium may never render a video track\n    // added after the initial srcObject assignment.\n    if (!this.stream && !this.call && changedProperties.has('_callState')) {\n      const stream = this._callState?.remoteStream ?? null;\n      const signature = this._computeTrackSignature(stream);\n      if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n        this._remoteStreamValue = stream;\n        this._lastTrackSignature = signature;\n        const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n        if (video) attachMediaStream(video, stream);\n      }\n    }\n\n    // Audio output device changed\n    if (changedProperties.has('_devicesState')) {\n      this._applySinkId(this._devicesState?.selectedAudioOutput?.deviceId ?? '');\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._cleanupDirectSubscriptions();\n    this._cleanupVideoElement();\n  }\n\n  // ── Direct call subscriptions (legacy / standalone) ────────────────\n\n  private _setupDirectSubscriptions(): void {\n    if (!this.call) return;\n    this._subscriptions.push(\n      this.call.remoteStream$.subscribe((stream: MediaStream | null) => {\n        const signature = this._computeTrackSignature(stream);\n        if (stream === this._remoteStreamValue && signature === this._lastTrackSignature) {\n          return;\n        }\n        this._remoteStreamValue = stream;\n        this._lastTrackSignature = signature;\n        this.requestUpdate();\n        const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n        if (video) attachMediaStream(video, stream);\n      })\n    );\n  }\n\n  private _computeTrackSignature(stream: MediaStream | null): string {\n    if (!stream) return '';\n    return stream.getTracks().map((t) => `${t.kind}:${t.id}`).sort().join('|');\n  }\n\n  private _cleanupDirectSubscriptions(): void {\n    this._subscriptions.forEach((sub) => sub.unsubscribe());\n    this._subscriptions = [];\n  }\n\n  // ── Audio output ───────────────────────────────────────────────────\n\n  private _applySinkId(deviceId: string): void {\n    const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement & {\n      setSinkId?: (sinkId: string) => Promise<void>;\n    };\n    if (!video?.setSinkId) return;\n    video.setSinkId(deviceId).catch((err) => {\n      logger.error('[SwCallMedia] Failed to set audio output device:', err);\n    });\n  }\n\n  // ── Cleanup ─────────────────────────────────────────────────────────\n\n  private _cleanupVideoElement(): void {\n    const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n    if (video) detachMediaStream(video);\n  }\n\n  // ── Render ─────────────────────────────────────────────────────────\n\n  render() {\n    return html`\n      <div class=\"mcu-content\" part=\"container\">\n        <div class=\"padding-wrapper\">\n          <div class=\"mcu-wrapper\">\n            <video\n              class=\"mcu-video\"\n              part=\"video\"\n              autoplay\n              playsinline\n              muted\n              .srcObject=${this._remoteStreamValue}\n            ></video>\n          </div>\n          <div class=\"mcu-layers\">\n            <slot></slot>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-media': SwCallMedia;\n  }\n}\n","/**\n * Self Media Component\n *\n * Renders local video overlay with positioning from layoutLayers.\n *\n * Input precedence (most specific wins): `.call` > context.\n * `.stream` is not applicable — this component requires `layoutLayers` and\n * `self.id`, which only come from a Call.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-self-media mirror></sw-self-media>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-self-media .call=${call} mirror></sw-self-media>\n * ```\n *\n * @csspart container - Positioned overlay container matching the layout layer rect.\n * @csspart video     - The `<video>` element rendering the local stream.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport type { CallSelfParticipant } from '@signalwire/js';\n\n@customElement('sw-self-media')\nexport class SwSelfMedia extends LitElement {\n  static styles = css`\n    :host {\n      display: contents;\n    }\n\n    .local-overlay {\n      box-sizing: border-box;\n    }\n\n    video {\n      display: block;\n    }\n  `;\n\n  @property({ type: Boolean, reflect: true }) mirror = false;\n\n  /** Explicit Call — when set, subscribes directly and bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  @state() private _directLocalStream: MediaStream | null = null;\n  @state() private _directLayoutLayers: LayoutLayer[] = [];\n  @state() private _directSelf: CallSelfParticipant | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('call')) {\n      this._teardownDirect();\n      if (this.call) this._setupDirect(this.call);\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._teardownDirect();\n  }\n\n  private _setupDirect(call: Call): void {\n    this._directSubscriptions.push(\n      call.localStream$.subscribe((s) => (this._directLocalStream = s)),\n      call.layoutLayers$.subscribe((l) => (this._directLayoutLayers = l)),\n      call.self$.subscribe((s) => (this._directSelf = s))\n    );\n  }\n\n  private _teardownDirect(): void {\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n    this._directLocalStream = null;\n    this._directLayoutLayers = [];\n    this._directSelf = null;\n  }\n\n  private _getSelfLayer(): LayoutLayer | undefined {\n    const selfId = this.call ? this._directSelf?.id : this._callState?.self?.id;\n    if (!selfId) return undefined;\n    const layers = this.call ? this._directLayoutLayers : this._callState?.layoutLayers ?? [];\n    return layers.find((layer) => layer.member_id === selfId);\n  }\n\n  render() {\n    const layer = this._getSelfLayer();\n    if (!layer) return null;\n\n    const localStream = this.call\n      ? this._directLocalStream\n      : this._callState?.localStream ?? null;\n    const hasVideoTracks = (localStream?.getVideoTracks().length ?? 0) > 0;\n    if (!hasVideoTracks) return null;\n\n    const style = `\n      position: absolute;\n      top: ${layer.y}%;\n      left: ${layer.x}%;\n      width: ${layer.width}%;\n      height: ${layer.height}%;\n      opacity: ${layer.visible ? 1 : 0};\n      overflow: hidden;\n      transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;\n      pointer-events: none;\n    `;\n\n    const videoStyle = this.mirror\n      ? 'transform: scale(-1, 1); -webkit-transform: scale(-1, 1);'\n      : '';\n\n    return html`\n      <div class=\"local-overlay\" part=\"container\" style=\"${style}\">\n        <video\n          class=\"local-video\"\n          part=\"video\"\n          style=\"width: 100%; height: 100%; object-fit: cover; ${videoStyle}\"\n          autoplay\n          playsinline\n          muted\n          disablePictureInPicture\n          .srcObject=${localStream}\n        ></video>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-self-media': SwSelfMedia;\n  }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{nothing as t,noChange as i}from\"../lit-html.js\";import{Directive as r,PartType as s,directive as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends r{constructor(i){if(super(i),this.it=t,i.type!==s.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=n(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n","import backspace from './backspace.svg?raw';\nimport download from './download.svg?raw';\nimport copy from './copy.svg?raw';\nimport cameraOff from './camera-off.svg?raw';\nimport cameraOn from './camera-on.svg?raw';\nimport checkCircle from './check-circle.svg?raw';\nimport chevronUp from './chevron-up.svg?raw';\nimport close from './close.svg?raw';\nimport fullscreenExit from './fullscreen-exit.svg?raw';\nimport fullscreen from './fullscreen.svg?raw';\nimport handRaise from './hand-raise.svg?raw';\nimport infoCircle from './info-circle.svg?raw';\nimport micOff from './mic-off.svg?raw';\nimport micOn from './mic-on.svg?raw';\nimport phoneCall from './phone-call.svg?raw';\nimport person from './person.svg?raw';\nimport phoneEnd from './phone-end.svg?raw';\nimport room from './room.svg?raw';\nimport screenShare from './screen-share.svg?raw';\nimport screenShareOff from './screen-share-off.svg?raw';\nimport sendIcon from './sendIcon.svg?raw';\nimport settings from './settings.svg?raw';\nimport speakerOff from './speaker-off.svg?raw';\nimport speakerOn from './speaker-on.svg?raw';\nimport spinner from './spinner.svg?raw';\nimport swLogo from './sw-logo.svg?raw';\nimport transcript from './transcript.svg?raw';\n\nexport const ICONS = {\n  backspace,\n  download,\n  copy,\n  'camera-off': cameraOff,\n  'camera-on': cameraOn,\n  'check-circle': checkCircle,\n  'chevron-up': chevronUp,\n  close,\n  'fullscreen-exit': fullscreenExit,\n  fullscreen,\n  'hand-raise': handRaise,\n  'info-circle': infoCircle,\n  'mic-off': micOff,\n  'mic-on': micOn,\n  person,\n  'phone-call': phoneCall,\n  'phone-end': phoneEnd,\n  room,\n  'screen-share': screenShare,\n  'screen-share-off': screenShareOff,\n  'send-icon': sendIcon,\n  settings,\n  'speaker-off': speakerOff,\n  'speaker-on': speakerOn,\n  spinner,\n  'sw-logo': swLogo,\n  transcript\n} as const;\n\nexport type IconName = keyof typeof ICONS;\n","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n  <path d=\\\"M21 4H8l-7 8 7 8h13a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2z\\\"></path>\\n  <line x1=\\\"18\\\" y1=\\\"9\\\" x2=\\\"12\\\" y2=\\\"15\\\"></line>\\n  <line x1=\\\"12\\\" y1=\\\"9\\\" x2=\\\"18\\\" y2=\\\"15\\\"></line>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\"><path d=\\\"M19 9h-4V3H9v6H5l7 7 7-7zm-8 2V5h2v6h1.17L12 13.17 9.83 11H11zm-6 7h14v2H5z\\\"/></svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><rect x=\\\"9\\\" y=\\\"9\\\" width=\\\"13\\\" height=\\\"13\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\\\"/></svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M21 6.5l-4 4V7c0-.55-.45-1-1-1H9.82L21 17.18V6.5zM3.27 2L2 3.27 4.73 6H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.21 0 .39-.08.54-.18L19.73 21 21 19.73 3.27 2z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M17 10.5V7c0-.55-.45-1-1-1H4c-.55 0-1 .45-1 1v10c0 .55.45 1 1 1h12c.55 0 1-.45 1-1v-3.5l4 4v-11l-4 4z\\\"/>\\n</svg>\\n\"","export default \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><path d=\\\"M22 11.08V12a10 10 0 1 1-5.93-9.14\\\"/><polyline points=\\\"22 4 12 14.01 9 11.01\\\"/></svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n  <polyline points=\\\"18 15 12 9 6 15\\\"/>\\n</svg>\\n\"","export default \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2.5\\\" stroke-linecap=\\\"round\\\"><line x1=\\\"18\\\" y1=\\\"6\\\" x2=\\\"6\\\" y2=\\\"18\\\"/><line x1=\\\"6\\\" y1=\\\"6\\\" x2=\\\"18\\\" y2=\\\"18\\\"/></svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\"><path d=\\\"M21 7c0-1.1-.9-2-2-2-.28 0-.55.06-.79.18C17.93 3.95 16.84 3 15.5 3c-.62 0-1.19.21-1.65.56C13.46 2.63 12.53 2 11.5 2 10.53 2 9.68 2.57 9.25 3.38 9.05 3.15 8.68 3 8.5 3 7.67 3 7 3.67 7 4.5V12l-1.75-1.75A1.76 1.76 0 003.5 9.5c-.98 0-1.5.85-1.5 1.51V11c0 .32.08.64.23.92L6.5 19.5C7.35 21 8.96 22 10.74 22H17c2.21 0 4-1.79 4-4V7zM19 18c0 1.1-.9 2-2 2h-6.26c-1.07 0-2.04-.6-2.52-1.55L4.16 11.3V11c0-.15.07-.2.12-.24.07-.04.14-.04.2.01L8 14.29V4.5c0-.14.09-.3.28-.37.19-.07.34.05.41.13l.31.32V10h2V3.5c0-.28.22-.5.5-.5s.5.22.5.5V10h2V4.5c0-.28.22-.5.5-.5s.5.22.5.5V10h2V7c0-.28.22-.5.5-.5s.5.22.5.5v11z\\\"/></svg>\\n\"","export default \"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"12\\\"/><circle cx=\\\"12\\\" cy=\\\"8\\\" r=\\\"0.5\\\" fill=\\\"currentColor\\\"/></svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M19 11h-1.7c0 .74-.16 1.43-.43 2.05l1.23 1.23c.56-.98.9-2.09.9-3.28zm-4.02.17c0-.06.02-.11.02-.17V5c0-1.66-1.34-3-3-3S9 3.34 9 5v.18l5.98 5.99zM4.27 3L3 4.27l6.01 6.01V11c0 1.66 1.33 3 2.99 3 .22 0 .44-.03.65-.08l1.66 1.66c-.71.33-1.5.52-2.31.52-2.76 0-5.3-2.1-5.3-5.1H5c0 3.41 2.72 6.23 6 6.72V20h2v-2.28c.91-.13 1.77-.45 2.54-.9L19.73 21 21 19.73 4.27 3z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3zm5.91-3c-.49 0-.9.36-.98.85C16.52 14.2 14.47 16 12 16s-4.52-1.8-4.93-4.15c-.08-.49-.49-.85-.98-.85-.61 0-1.09.54-1 1.14.49 3 2.89 5.35 5.91 5.78V20c0 .55.45 1 1 1s1-.45 1-1v-2.08c3.02-.43 5.42-2.78 5.91-5.78.1-.6-.39-1.14-1-1.14z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M6.62 10.79c1.44 2.83 3.76 5.15 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M12 9c-1.6 0-3.15.25-4.6.72v3.1c0 .39-.23.74-.56.9-.98.49-1.87 1.12-2.66 1.85-.18.18-.43.28-.7.28-.28 0-.53-.11-.71-.29L.29 13.08c-.18-.17-.29-.42-.29-.7 0-.28.11-.53.29-.71C3.34 8.78 7.46 7 12 7s8.66 1.78 11.71 4.67c.18.18.29.43.29.71 0 .28-.11.53-.29.71l-2.48 2.48c-.18.18-.43.29-.71.29-.27 0-.52-.11-.7-.28-.79-.74-1.69-1.36-2.67-1.85-.33-.16-.56-.5-.56-.9v-3.1C15.15 9.25 13.6 9 12 9z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7 3c1.93 0 3.5 1.57 3.5 3.5S13.93 13 12 13s-3.5-1.57-3.5-3.5S10.07 6 12 6zm7 13H5v-.23c0-.62.28-1.2.76-1.58C7.47 15.82 9.64 15 12 15s4.53.82 6.24 2.19c.48.38.76.97.76 1.58V19z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M20 4H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2h5v2H7v2h10v-2h-2v-2h5c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 12H4V6h16v10z\\\"/>\\n  <path d=\\\"M12 7.5l-4 4h2.5v3h3v-3H16l-4-4z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M3.28 2.22 1.87 3.63l2.15 2.15C4.01 5.85 4 5.92 4 6v10c0 1.1.9 2 2 2h5v2H9v2h10v-2h-2v-2h.17l3.2 3.2 1.41-1.41L3.28 2.22zM6 16V7.78L14.22 16H6z\\\"/>\\n  <path d=\\\"M20 4H7.83l2 2H20v10.17l1.94 1.94c.04-.13.06-.26.06-.4V6c0-1.1-.9-2-2-2z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" width=\\\"24\\\" height=\\\"24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n  <line x1=\\\"22\\\" y1=\\\"2\\\" x2=\\\"11\\\" y2=\\\"13\\\"></line>\\n  <polygon points=\\\"22 2 15 22 11 13 2 9 22 2\\\"></polygon>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\">\\n  <circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\" stroke=\\\"rgba(255,255,255,0.15)\\\" stroke-width=\\\"2.5\\\"/>\\n  <path d=\\\"M12 2a10 10 0 0 1 10 10\\\" stroke=\\\"white\\\" stroke-width=\\\"2.5\\\" stroke-linecap=\\\"round\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"96 354 338 374\\\" fill=\\\"currentColor\\\">\\n  <path d=\\\"M105.97,489.32c0.16-5.21,2.93-11.81,8.36-17.24c33.26-33.18,66.56-66.33,99.8-99.53c6.92-6.91,15.08-10.45,24.83-9.06c11.55,1.65,19.62,8.12,23.38,19.22c3.77,11.12,1.16,21.14-7.02,29.43c-15.91,16.14-31.97,32.12-48.04,48.1c-17.48,17.38-34.98,34.74-52.58,52c-8.93,8.76-20.84,10.92-31.8,6.13C112.3,513.73,105.78,503.52,105.97,489.32z\\\"/>\\n  <path d=\\\"M128.81,527.07c3.79-0.17,6.91-0.08,9.97-0.49c8.02-1.06,14.88-4.54,20.56-10.34c6.38-6.52,12.79-13,19.33-19.66c1.23,1.09,1.98,1.7,2.66,2.38c24.61,24.6,49.24,49.19,73.81,73.83c8.07,8.1,10.9,17.87,7.66,28.86c-3.12,10.58-10.39,17.35-21.17,19.77c-9.33,2.1-18.23,0.31-25.07-6.47C187.38,586.02,158.45,556.8,128.81,527.07z\\\"/>\\n  <path d=\\\"M401.7,562.4c-15.03-1.53-25.7,4.26-34.72,14.22c-4.89,5.4-10.23,10.39-15.51,15.69c-1.1-0.98-1.86-1.59-2.56-2.28c-24.63-24.62-49.29-49.21-73.86-73.89c-8.07-8.1-10.89-17.89-7.56-28.89c3.19-10.56,10.47-17.31,21.28-19.68c9.56-2.1,18.45,0,25.44,6.92c28.65,28.38,57.1,56.96,85.61,85.47C400.25,560.39,400.57,560.92,401.7,562.4z\\\"/>\\n  <path d=\\\"M424.3,594.33c0.03,10.31-2.8,17.06-8.37,22.62c-33.38,33.3-66.75,66.6-100.19,99.85c-11.62,11.55-28.55,12.12-40.06,1.56c-12.12-11.13-12.6-29.39-0.75-41.47c15.05-15.34,30.32-30.47,45.56-45.63c18.31-18.2,36.65-36.36,55.06-54.45c8.91-8.75,20.84-11.07,31.77-6.1C418.43,575.74,423.92,584.63,424.3,594.33z\\\"/>\\n</svg>\\n\"","export default \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\">\\n  <path d=\\\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\\\"/>\\n  <line x1=\\\"9\\\" y1=\\\"9\\\" x2=\\\"15\\\" y2=\\\"9\\\"/>\\n  <line x1=\\\"9\\\" y1=\\\"13\\\" x2=\\\"13\\\" y2=\\\"13\\\"/>\\n</svg>\\n\"","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { ICONS } from './icons';\nimport type { IconName } from './icons';\n\nconst DEFAULT_SIZE = 24;\n\n/**\n * Inline SVG icon component. All SVG raw imports are isolated inside the icons folder.\n *\n * @attr name - Icon name (e.g. \"mic-on\", \"camera-off\"). See IconName for all values.\n * @attr size - Size in pixels applied as width and height on the SVG (default: 24).\n *\n * @example\n * <sw-ui-icon name=\"mic-on\"></sw-ui-icon>\n * <sw-ui-icon name=\"phone-end\" size=\"32\"></sw-ui-icon>\n * <sw-ui-icon name=\"settings\" slot=\"icon\"></sw-ui-icon>\n *\n * The inline SVG inherits `color` from the host (use `currentColor` in\n * stylesheets). Sizing is controlled via the `size` attribute, not CSS parts.\n */\n@customElement('sw-ui-icon')\nexport class SwUiIcon extends LitElement {\n  static styles = css`\n    :host {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      line-height: 0;\n    }\n\n    svg {\n      display: block;\n    }\n  `;\n\n  @property({ reflect: true }) name: IconName = 'close';\n  @property({ type: Number }) size: number = DEFAULT_SIZE;\n\n  render() {\n    const raw = ICONS[this.name];\n\n    if (!raw) {\n      return html``;\n    }\n\n    const sized = raw.replace('<svg', `<svg width=\"${this.size}\" height=\"${this.size}\"`);\n\n    return html`${unsafeHTML(sized)}`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-icon': SwUiIcon;\n  }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { attachMediaStream, detachMediaStream } from '../utils/video.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport type { Call } from '../types/index.js';\nimport './UI/icons/sw-ui-icon.js';\n\n/**\n * Local camera preview. Adapts its aspect-ratio to match the actual\n * video track (landscape or portrait).\n *\n * Input precedence : `.stream`/`.videoMuted` > `.call` > context.\n *\n * @prop {MediaStream|null} stream     - explicit stream (overrides .call and context)\n * @prop {boolean}          videoMuted - explicit muted flag (overrides context)\n * @prop {Call}             call       - explicit Call object (overrides context)\n * @prop {boolean}          mirror     - mirror the video horizontally\n *\n * @csspart video       - The `<video>` element.\n * @csspart placeholder - Camera-off overlay shown while muted.\n *\n * @cssprop [--sw-local-camera-aspect=16/9] - Aspect ratio; auto-set from track settings when available.\n */\n@customElement('sw-local-camera')\nexport class SwLocalCamera extends LitElement {\n  /** Explicit stream — highest precedence. */\n  @property({ attribute: false }) stream: MediaStream | null = null;\n\n  /** Explicit muted flag — overrides devicesContext.videoMuted. */\n  @property({ type: Boolean, reflect: true, attribute: 'video-muted' }) videoMuted?: boolean;\n\n  /** Explicit Call — used when `.stream` is not set. Bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @property({ type: Boolean, reflect: true }) mirror = false;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  @consume({ context: devicesContext, subscribe: true })\n  @state()\n  private _devicesState?: DevicesState;\n\n  @state() private _directLocalStream: MediaStream | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  /** Detected aspect ratio from the video track, e.g. \"16 / 9\" or \"9 / 16\". */\n  @state() private _aspectRatio = '16 / 9';\n\n  /** Last stream reference attached to the video element — used to skip no-op re-attaches. */\n  private _attachedStream: MediaStream | null = null;\n\n  static styles = css`\n    :host {\n      display: block;\n      width: 100%;\n      aspect-ratio: var(--sw-local-camera-aspect, 16 / 9);\n      position: relative;\n      background: #000;\n      border-radius: inherit;\n    }\n\n    video {\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      display: block;\n      border-radius: inherit;\n    }\n\n    :host([mirror]) video {\n      transform: scaleX(-1);\n    }\n\n    .muted-overlay {\n      position: absolute;\n      inset: 0;\n      z-index: 1;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--bg-page);\n      border-radius: inherit;\n    }\n\n    .muted-overlay sw-ui-icon {\n      color: var(--bg-surface-raised);\n    }\n  `;\n\n  private get _effectiveStream(): MediaStream | null {\n    if (this.stream) return this.stream;\n    if (this.call) return this._directLocalStream;\n    return this._callState?.localStream ?? null;\n  }\n\n  private get _effectiveMuted(): boolean {\n    return this.videoMuted ?? this._devicesState?.videoMuted ?? false;\n  }\n\n  protected firstUpdated(): void {\n    // Mirror the anti-pause handler from createVideoElement so Safari/Firefox\n    // camera-switch pauses don't leave the preview stuck.\n    const video = this.shadowRoot?.querySelector('video') as HTMLVideoElement | null;\n    if (video) {\n      video.addEventListener('pause', () => {\n        if (!this._effectiveMuted) {\n          video.play().catch(() => {});\n        }\n      });\n    }\n  }\n\n  protected updated(changedProperties: Map<string, unknown>): void {\n    super.updated(changedProperties);\n\n    if (changedProperties.has('call')) {\n      this._teardownDirect();\n      if (this.call) this._setupDirect(this.call);\n    }\n\n    const effectiveStream = this._effectiveStream;\n\n    // Only re-attach when the stream reference genuinely changes.\n    // The SDK mutates the same MediaStream object (adds/removes tracks) so\n    // setting srcObject to the same reference is a browser no-op and can\n    // cause a black frame flash on every unrelated context update.\n    const streamRefChanged =\n      changedProperties.has('stream') ||\n      changedProperties.has('call') ||\n      changedProperties.has('_directLocalStream') ||\n      (changedProperties.has('_callState') && effectiveStream !== this._attachedStream);\n\n    if (streamRefChanged) {\n      const video = this.shadowRoot?.querySelector('video') as HTMLVideoElement | null;\n      if (video) {\n        this._attachedStream = effectiveStream;\n        attachMediaStream(video, effectiveStream);\n        this._detectAspectRatio();\n      }\n    }\n\n    // Ensure playback resumes after unmute or after a new stream is attached.\n    // Do NOT guard with video.paused — after mute/unmute the element can be in\n    // a \"stalled\" or \"waiting\" state where paused===false but nothing plays.\n    if (\n      changedProperties.has('videoMuted') ||\n      changedProperties.has('_devicesState') ||\n      streamRefChanged\n    ) {\n      if (!this._effectiveMuted) {\n        const video = this.shadowRoot?.querySelector('video') as HTMLVideoElement | null;\n        if (video) {\n          video.play().catch(() => {});\n        }\n      }\n    }\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    const video = this.shadowRoot?.querySelector('video') as HTMLVideoElement | null;\n    if (video) detachMediaStream(video);\n    this._teardownDirect();\n  }\n\n  private _setupDirect(call: Call): void {\n    this._directSubscriptions.push(\n      call.localStream$.subscribe((s) => (this._directLocalStream = s))\n    );\n  }\n\n  private _teardownDirect(): void {\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n    this._directLocalStream = null;\n  }\n\n  /** Read the video track settings and set the CSS custom property. */\n  private _detectAspectRatio(): void {\n    const stream = this._effectiveStream;\n    if (!stream) return;\n\n    const track = stream.getVideoTracks()[0];\n    if (!track) return;\n\n    const settings = track.getSettings();\n    const w = settings.width;\n    const h = settings.height;\n\n    if (w && h && w > 0 && h > 0) {\n      this._aspectRatio = `${w} / ${h}`;\n      this.style.setProperty('--sw-local-camera-aspect', this._aspectRatio);\n    }\n  }\n\n  render() {\n    return html`\n      <video part=\"video\" autoplay playsinline muted></video>\n      ${this._effectiveMuted\n        ? html`<div part=\"placeholder\" class=\"muted-overlay\">\n            <sw-ui-icon name=\"camera-off\" size=\"28\"></sw-ui-icon>\n          </div>`\n        : null}\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-local-camera': SwLocalCamera;\n  }\n}\n","import { css } from 'lit';\n\n/**\n * Defensive reset for inheritable CSS properties that cross the shadow\n * boundary. Host pages frequently set these on `body` or layout wrappers\n * (`text-align: center`, `text-transform: uppercase`, etc.) and they would\n * otherwise inherit into our shadow trees and distort component rendering.\n *\n * Properties intentionally NOT reset: `color`, `font-family`, `font-size`.\n * Those are how design tokens flow into components — consumers legitimately\n * theme by inheriting these from an ancestor.\n *\n * Slotted content is unaffected: slotted nodes inherit from their flat-tree\n * parent (the host's tree), not from `:host`, which is the desired behavior\n * for user-provided slot content.\n */\nexport const hostReset = css`\n  :host {\n    text-align: start;\n    letter-spacing: normal;\n    word-spacing: normal;\n    text-transform: none;\n    text-indent: 0;\n    line-height: normal;\n    font-style: normal;\n    font-weight: normal;\n    font-variant: normal;\n    white-space: normal;\n    text-shadow: none;\n  }\n`;\n","/**\n * SwParticipants Component\n *\n * Renders member overlays based on layoutLayers.\n * Excludes self member and provides slot for <self-media> child component.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <sw-participants></sw-participants>\n * <sw-participants .call=${call}></sw-participants>\n * ```\n *\n * @slot - Default slot for overlay content.\n * @slot controls-{memberId} - Per-participant menu content (e.g. `sw-participant-controls`).\n *\n * @fires sw-participant-mute-audio - User muted/unmuted a participant's audio. Detail: `{ participant, memberId }`.\n * @fires sw-participant-mute-video - User muted/unmuted a participant's video. Detail: `{ participant, memberId }`.\n * @fires sw-participant-remove     - User removed a participant. Detail: `{ participant, memberId }`.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallParticipant, CallSelfParticipant } from '@signalwire/js';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { hostReset } from './UI/host-reset.js';\n\n@customElement('sw-participants')\nexport class SwParticipants extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: contents;\n    }\n\n    .member-overlay {\n      box-sizing: border-box;\n      box-shadow: inset 0 0 0 8px rgba(255, 0, 0, 0.8);\n      background-color: rgba(255, 0, 0, 0.1);\n    }\n\n    .member-overlay.is-self {\n      box-shadow: inset 0 0 0 8px rgba(0, 0, 255, 0.8);\n      background-color: rgba(0, 0, 255, 0.1);\n    }\n\n    .menu-trigger {\n      position: absolute;\n      top: 12px;\n      left: 12px;\n      width: 36px;\n      height: 36px;\n      border-radius: 50%;\n      background: rgba(0, 0, 0, 0.6);\n      border: 2px solid rgba(255, 255, 255, 0.3);\n      color: white;\n      cursor: pointer;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      transition:\n        background 0.2s ease,\n        transform 0.2s ease,\n        border-color 0.2s ease;\n      z-index: 20;\n    }\n\n    .menu-trigger:hover {\n      background: rgba(0, 0, 0, 0.8);\n      border-color: rgba(255, 255, 255, 0.6);\n      transform: scale(1.1);\n    }\n\n    .menu-trigger:focus {\n      outline: none;\n      border-color: #044cf6;\n      box-shadow: 0 0 0 3px rgba(4, 78, 246, 0.4);\n    }\n\n    .menu-trigger svg {\n      width: 20px;\n      height: 20px;\n    }\n\n    .menu-dropdown {\n      position: absolute;\n      top: 12px;\n      left: 56px;\n      background: rgba(31, 41, 55, 0.95);\n      backdrop-filter: blur(8px);\n      border-radius: 8px;\n      padding: 8px 0;\n      min-width: 160px;\n      box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n      z-index: 30;\n      opacity: 0;\n      visibility: hidden;\n      transform: translateX(-10px);\n      transition:\n        opacity 0.2s ease,\n        transform 0.2s ease,\n        visibility 0.2s ease;\n    }\n\n    .menu-dropdown.open {\n      opacity: 1;\n      visibility: visible;\n      transform: translateX(0);\n    }\n\n    .menu-item {\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      padding: 8px 16px;\n      color: white;\n      font-size: 14px;\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n      cursor: pointer;\n      transition: background 0.15s ease;\n      border: none;\n      background: none;\n      width: 100%;\n      text-align: left;\n    }\n\n    .menu-item:hover {\n      background: rgba(255, 255, 255, 0.1);\n    }\n\n    .menu-item svg {\n      width: 16px;\n      height: 16px;\n      flex-shrink: 0;\n    }\n\n    .menu-item.danger {\n      color: #ef4444;\n    }\n\n    .menu-item.danger:hover {\n      background: rgba(239, 68, 68, 0.2);\n    }\n  `];\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  /** Explicit Call — when set, subscribes directly and bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @state() private _directLayoutLayers: LayoutLayer[] = [];\n  @state() private _directParticipants: CallParticipant[] = [];\n  @state() private _directSelf: CallSelfParticipant | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  @state()\n  private _openMenuId: string | null = null;\n\n  private _handleOutsideClick = (e: Event): void => {\n    const target = e.target as Element;\n    if (!target.closest('.menu-trigger') && !target.closest('.menu-dropdown')) {\n      this._openMenuId = null;\n    }\n  };\n\n  private _handleEscape = (e: KeyboardEvent): void => {\n    if (e.key === 'Escape' && this._openMenuId !== null) {\n      this._openMenuId = null;\n    }\n  };\n\n  connectedCallback() {\n    super.connectedCallback();\n    document.addEventListener('click', this._handleOutsideClick);\n    document.addEventListener('keydown', this._handleEscape);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    document.removeEventListener('click', this._handleOutsideClick);\n    document.removeEventListener('keydown', this._handleEscape);\n    this._teardownDirect();\n  }\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('call')) {\n      this._teardownDirect();\n      if (this.call) {\n        this._directSubscriptions.push(\n          this.call.layoutLayers$.subscribe((l) => (this._directLayoutLayers = l)),\n          this.call.participants$.subscribe((p) => (this._directParticipants = p)),\n          this.call.self$.subscribe((s) => (this._directSelf = s))\n        );\n      }\n    }\n  }\n\n  private _teardownDirect(): void {\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n    this._directLayoutLayers = [];\n    this._directParticipants = [];\n    this._directSelf = null;\n  }\n\n  // ── Helpers ────────────────────────────────────────────────────────\n\n  private _toggleMenu(memberId: string, e: Event): void {\n    e.stopPropagation();\n    this._openMenuId = this._openMenuId === memberId ? null : memberId;\n  }\n\n  private _getParticipant(memberId: string) {\n    const participants = this.call ? this._directParticipants : this._callState?.participants ?? [];\n    return participants.find((p) => p.id === memberId);\n  }\n\n  private async _handleMuteAudio(memberId: string, e: Event): Promise<void> {\n    e.stopPropagation();\n    const participant = this._getParticipant(memberId);\n    if (!participant) return;\n    try {\n      if (participant.audioMuted) {\n        await participant.unmute();\n      } else {\n        await participant.mute();\n      }\n      this.dispatchEvent(\n        new CustomEvent('sw-participant-mute-audio', {\n          detail: { participant, memberId },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    } catch {\n      // Silently handle error\n    }\n    this._openMenuId = null;\n  }\n\n  private async _handleMuteVideo(memberId: string, e: Event): Promise<void> {\n    e.stopPropagation();\n    const participant = this._getParticipant(memberId);\n    if (!participant) return;\n    try {\n      if (participant.videoMuted) {\n        await participant.unmuteVideo();\n      } else {\n        await participant.muteVideo();\n      }\n      this.dispatchEvent(\n        new CustomEvent('sw-participant-mute-video', {\n          detail: { participant, memberId },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    } catch {\n      // Silently handle error\n    }\n    this._openMenuId = null;\n  }\n\n  private async _handleRemove(memberId: string, e: Event): Promise<void> {\n    e.stopPropagation();\n    const participant = this._getParticipant(memberId);\n    if (!participant?.remove) return;\n    try {\n      await participant.remove();\n      this.dispatchEvent(\n        new CustomEvent('sw-participant-remove', {\n          detail: { participant, memberId },\n          bubbles: true,\n          composed: true,\n        })\n      );\n    } catch {\n      // Silently handle error\n    }\n    this._openMenuId = null;\n  }\n\n  // ── Render ─────────────────────────────────────────────────────────\n\n  private _renderMenuIcon() {\n    return html`\n      <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n        <circle cx=\"12\" cy=\"6\" r=\"2\" />\n        <circle cx=\"12\" cy=\"12\" r=\"2\" />\n        <circle cx=\"12\" cy=\"18\" r=\"2\" />\n      </svg>\n    `;\n  }\n\n  private _renderMenuDropdown(memberId: string) {\n    const participant = this._getParticipant(memberId);\n    const isOpen = this._openMenuId === memberId;\n\n    return html`\n      <div\n        class=\"menu-dropdown ${isOpen ? 'open' : ''}\"\n        role=\"menu\"\n        aria-label=\"Participant actions\"\n      >\n        <button\n          class=\"menu-item\"\n          role=\"menuitem\"\n          @click=${(e: Event) => this._handleMuteAudio(memberId, e)}\n          aria-label=\"${participant?.audioMuted ? 'Unmute audio' : 'Mute audio'}\"\n        >\n          ${participant?.audioMuted ? 'Unmute' : 'Mute'}\n        </button>\n        <button\n          class=\"menu-item\"\n          role=\"menuitem\"\n          @click=${(e: Event) => this._handleMuteVideo(memberId, e)}\n          aria-label=\"${participant?.videoMuted ? 'Enable video' : 'Disable video'}\"\n        >\n          ${participant?.videoMuted ? 'Enable video' : 'Disable video'}\n        </button>\n        <button\n          class=\"menu-item danger\"\n          role=\"menuitem\"\n          @click=${(e: Event) => this._handleRemove(memberId, e)}\n          aria-label=\"Remove participant\"\n        >\n          Remove\n        </button>\n      </div>\n    `;\n  }\n\n  private _renderOverlay(layer: LayoutLayer, isSelf: boolean) {\n    const memberId = layer.member_id!;\n    const classes = `member-overlay${isSelf ? ' is-self' : ''}`;\n\n    const style = `\n      position: absolute;\n      top: ${layer.y}%;\n      left: ${layer.x}%;\n      width: ${layer.width}%;\n      height: ${layer.height}%;\n      opacity: ${layer.visible ? 1 : 0};\n      overflow: visible;\n      transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;\n      pointer-events: auto;\n      z-index: 10;\n    `;\n\n    return html`\n      <div class=\"${classes}\" part=\"overlay\" style=\"${style}\">\n        ${!isSelf\n          ? html`\n              <button\n                class=\"menu-trigger\"\n                part=\"menu-trigger\"\n                @click=${(e: Event) => this._toggleMenu(memberId, e)}\n                aria-label=\"Participant menu\"\n                aria-expanded=\"${this._openMenuId === memberId}\"\n                aria-haspopup=\"menu\"\n              >\n                ${this._renderMenuIcon()}\n              </button>\n              ${this._renderMenuDropdown(memberId)}\n            `\n          : null}\n        <slot name=\"controls-${memberId}\"></slot>\n      </div>\n    `;\n  }\n\n  render() {\n    const layers = this.call ? this._directLayoutLayers : this._callState?.layoutLayers ?? [];\n    const selfId = this.call ? this._directSelf?.id : this._callState?.self?.id;\n\n    const overlays = layers\n      .filter((layer) => layer.member_id)\n      .map((layer) => this._renderOverlay(layer, layer.member_id === selfId));\n\n    return html`\n      ${overlays}\n      <slot></slot>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-participants': SwParticipants;\n  }\n}\n","/**\n * Per-participant control panel.\n *\n * Takes a `participant-id` and looks up the participant.\n * Shows mute audio, mute video, volume, pin, and remove actions based on\n * the `capabilities` list from the call state.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @prop {string} participantId - ID of the participant to control\n * @prop {Call}    call         - explicit Call object (overrides context)\n * @prop {boolean} showVolume   - show volume slider\n * @prop {boolean} showPin      - show pin/spotlight button\n *\n * @fires sw-participant-volume-change - Volume slider changed. Detail: `{ participantId: string, volume: number }`.\n * @fires sw-participant-pin-toggle    - Pin/unpin clicked. Detail: `{ participantId: string, pinned: boolean }`.\n *\n * Themed via the SignalWire DTCG tokens (`--bg-page`, `--bg-surface`, `--bg-surface-raised`,\n * `--fg-default`, `--border-default`, `--radius-md`, `--shadow-md`, `--type-family-body`,\n * `--type-size-small`, `--interactive-button-destructive-bg`,\n * `--interactive-button-destructive-hover`, `--transition-fast`).\n */\n\nimport { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallParticipant } from '@signalwire/js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport './UI/icons/sw-ui-icon.js';\nimport { hostReset } from './UI/host-reset.js';\n\nconst logger = getLogger();\n\n@customElement('sw-participant-controls')\nexport class SwParticipantControls extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: block;\n      font-family: var(--type-family-body);\n      font-size: var(--type-size-small);\n    }\n\n    .panel {\n      display: flex;\n      flex-direction: column;\n      gap: 6px;\n      padding: 10px;\n      background: var(--bg-page);\n      border: 1px solid var(--border-default);\n      border-radius: var(--radius-md);\n      min-width: 180px;\n      box-shadow: var(--shadow-md);\n      color: var(--fg-default);\n    }\n\n    .name {\n      font-size: 0.8125rem;\n      font-weight: 500;\n      padding-bottom: 6px;\n      border-bottom: 1px solid var(--border-default);\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    .actions {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n    }\n\n    button {\n      all: unset;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      padding: 6px 10px;\n      border-radius: var(--radius-md);\n      font-size: 0.75rem;\n      cursor: pointer;\n      background: var(--bg-surface);\n      color: var(--fg-default);\n      transition: background var(--transition-fast);\n    }\n\n    button:hover {\n      background: var(--bg-surface-raised);\n    }\n\n    button.active {\n      background: var(--interactive-button-destructive-bg);\n      color: #fff;\n    }\n\n    button.active:hover {\n      background: var(--interactive-button-destructive-hover);\n    }\n\n    button.danger {\n      color: var(--interactive-button-destructive-bg);\n    }\n\n    button.danger:hover {\n      background: var(--interactive-button-destructive-bg);\n      color: #fff;\n    }\n\n    .volume-control {\n      display: flex;\n      flex-direction: column;\n      gap: 4px;\n      padding: 4px 0;\n    }\n\n    .volume-label {\n      display: flex;\n      align-items: center;\n      gap: 6px;\n      font-size: 0.7rem;\n      color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n    }\n\n    input[type='range'] {\n      width: 100%;\n      height: 4px;\n      appearance: none;\n      background: var(--border-default);\n      border-radius: 2px;\n      outline: none;\n      cursor: pointer;\n    }\n\n    input[type='range']::-webkit-slider-thumb {\n      appearance: none;\n      width: 12px;\n      height: 12px;\n      background: #3b82f6;\n      border-radius: 50%;\n      cursor: pointer;\n    }\n\n    input[type='range']::-moz-range-thumb {\n      width: 12px;\n      height: 12px;\n      background: #3b82f6;\n      border-radius: 50%;\n      border: none;\n      cursor: pointer;\n    }\n\n    .empty {\n      font-size: 0.7rem;\n      color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n      text-align: center;\n      padding: 6px;\n    }\n  `];\n\n  @property({ type: String, attribute: 'participant-id' })\n  participantId = '';\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-volume' })\n  showVolume = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-pin' })\n  showPin = false;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  /** Explicit Call — when set, subscribes directly and bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @state() private _directParticipants: CallParticipant[] = [];\n  @state() private _directCapabilities: string[] = [];\n\n  private _directSubscriptions: Subscription[] = [];\n\n  @state() private _volume = 100;\n  @state() private _isPinned = false;\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('call')) {\n      this._directSubscriptions.forEach((s) => s.unsubscribe());\n      this._directSubscriptions = [];\n      this._directParticipants = [];\n      this._directCapabilities = [];\n      if (this.call) {\n        this._directSubscriptions.push(\n          this.call.participants$.subscribe((p) => (this._directParticipants = p)),\n          this.call.capabilities$.subscribe((c) => (this._directCapabilities = c))\n        );\n      }\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n  }\n\n  // ── Derived state ──────────────────────────────────────────────────\n\n  private get _participant() {\n    const participants = this.call ? this._directParticipants : this._callState?.participants ?? [];\n    return participants.find((p) => p.id === this.participantId);\n  }\n\n  private get _capabilities(): string[] {\n    return this.call ? this._directCapabilities : this._callState?.capabilities ?? [];\n  }\n\n  private get _canMuteAudio(): boolean {\n    return this._capabilities.includes('memberMuteAudio');\n  }\n\n  private get _canMuteVideo(): boolean {\n    return this._capabilities.includes('memberMuteVideo');\n  }\n\n  private get _canRemove(): boolean {\n    return this._capabilities.includes('memberRemove');\n  }\n\n  // ── Actions ────────────────────────────────────────────────────────\n\n  private async _toggleAudioMute() {\n    const p = this._participant;\n    if (!p) return;\n    try {\n      if (p.audioMuted) {\n        await p.unmute();\n      } else {\n        await p.mute();\n      }\n    } catch (err) {\n      logger.error('[ParticipantControls] Toggle audio failed:', err);\n    }\n  }\n\n  private async _toggleVideoMute() {\n    const p = this._participant;\n    if (!p) return;\n    try {\n      if (p.videoMuted) {\n        await p.unmuteVideo();\n      } else {\n        await p.muteVideo();\n      }\n    } catch (err) {\n      logger.error('[ParticipantControls] Toggle video failed:', err);\n    }\n  }\n\n  private async _remove() {\n    const p = this._participant;\n    if (!p?.remove) return;\n    try {\n      await p.remove();\n    } catch (err) {\n      logger.error('[ParticipantControls] Remove failed:', err);\n    }\n  }\n\n  private _onVolumeChange(e: Event) {\n    this._volume = parseInt((e.target as HTMLInputElement).value, 10);\n    this.dispatchEvent(\n      new CustomEvent('sw-participant-volume-change', {\n        detail: { participantId: this.participantId, volume: this._volume },\n        bubbles: true,\n        composed: true,\n      })\n    );\n  }\n\n  private _togglePin() {\n    this._isPinned = !this._isPinned;\n    this.dispatchEvent(\n      new CustomEvent('sw-participant-pin-toggle', {\n        detail: { participantId: this.participantId, pinned: this._isPinned },\n        bubbles: true,\n        composed: true,\n      })\n    );\n  }\n\n  // ── Render ─────────────────────────────────────────────────────────\n\n  render() {\n    const p = this._participant;\n    if (!p) return html`<div class=\"panel\"><div class=\"empty\">Participant not found</div></div>`;\n\n    const hasActions = this._canMuteAudio || this._canMuteVideo || this._canRemove || this.showVolume || this.showPin;\n\n    return html`\n      <div class=\"panel\" part=\"panel\">\n        <div class=\"name\" part=\"name\">${p.name ?? 'Participant'}</div>\n\n        <div class=\"actions\">\n          ${!hasActions ? html`<div class=\"empty\">No actions available</div>` : nothing}\n\n          ${this._canMuteAudio\n            ? html`\n                <button class=${p.audioMuted ? 'active' : ''} @click=${this._toggleAudioMute}>\n                  <sw-ui-icon name=${p.audioMuted ? 'mic-off' : 'mic-on'} size=\"14\"></sw-ui-icon>\n                  ${p.audioMuted ? 'Unmute' : 'Mute'}\n                </button>\n              `\n            : nothing}\n\n          ${this._canMuteVideo\n            ? html`\n                <button class=${p.videoMuted ? 'active' : ''} @click=${this._toggleVideoMute}>\n                  <sw-ui-icon name=${p.videoMuted ? 'camera-off' : 'camera-on'} size=\"14\"></sw-ui-icon>\n                  ${p.videoMuted ? 'Enable video' : 'Disable video'}\n                </button>\n              `\n            : nothing}\n\n          ${this.showVolume\n            ? html`\n                <div class=\"volume-control\">\n                  <label class=\"volume-label\">\n                    <sw-ui-icon name=\"speaker-on\" size=\"14\"></sw-ui-icon>\n                    Volume: ${this._volume}%\n                  </label>\n                  <input\n                    type=\"range\"\n                    min=\"0\"\n                    max=\"100\"\n                    .value=${String(this._volume)}\n                    @input=${this._onVolumeChange}\n                  />\n                </div>\n              `\n            : nothing}\n\n          ${this.showPin\n            ? html`\n                <button class=${this._isPinned ? 'active' : ''} @click=${this._togglePin}>\n                  <sw-ui-icon name=\"settings\" size=\"14\"></sw-ui-icon>\n                  ${this._isPinned ? 'Unpin' : 'Pin'}\n                </button>\n              `\n            : nothing}\n\n          ${this._canRemove\n            ? html`\n                <button class=\"danger\" @click=${this._remove}>\n                  <sw-ui-icon name=\"close\" size=\"14\"></sw-ui-icon>\n                  Remove\n                </button>\n              `\n            : nothing}\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-participant-controls': SwParticipantControls;\n  }\n}\n","/**\n * Audio Level Component\n *\n * Visual audio level indicator that renders real-time audio levels from a MediaStream\n * via Web Audio API. Displays configurable number of bars with color transitions\n * based on audio intensity.\n *\n * Input precedence (most specific wins): `.stream` > `.call` (uses `localStream`)\n * > context (uses `localStream`).\n *\n * @example\n * ```html\n * <sw-audio-level .stream=${mediaStream} bars=\"5\" orientation=\"vertical\"></sw-audio-level>\n * <sw-audio-level .call=${call}></sw-audio-level>\n * <sw-audio-level></sw-audio-level> <!-- inside provider -->\n * ```\n *\n * @cssprop [--interactive-status-success=#22c55e] - Color for low audio levels.\n * @cssprop [--interactive-status-warning=#ffd700] - Color for medium audio levels.\n * @cssprop [--interactive-button-destructive-bg=#dc2626] - Color for high audio levels.\n * @cssprop [--sw-audio-bar-width=4px] - Width of each audio level bar.\n * @cssprop [--sw-audio-bar-gap=2px] - Gap between audio level bars.\n * @cssprop [--sw-audio-bar-radius=2px] - Border radius of each bar.\n * @cssprop [--sw-audio-bar-background=#404040] - Background color of inactive bars.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { getLogger } from '@signalwire/js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call } from '../types/index.js';\n\nconst logger = getLogger();\n\n@customElement('sw-audio-level')\nexport class SwAudioLevel extends LitElement {\n  static styles = css`\n    :host {\n      --sw-audio-bar-width: 4px;\n      --sw-audio-bar-gap: 2px;\n      --sw-audio-bar-radius: 2px;\n      --sw-audio-bar-background: rgba(255, 255, 255, 0.2);\n\n      display: inline-flex;\n    }\n\n    .container {\n      display: flex;\n      align-items: flex-end;\n      justify-content: center;\n      gap: var(--sw-audio-bar-gap);\n    }\n\n    :host([orientation='horizontal']) .container {\n      flex-direction: row;\n      align-items: center;\n    }\n\n    :host([orientation='vertical']) .container,\n    .container {\n      flex-direction: row;\n      align-items: flex-end;\n    }\n\n    .bar {\n      width: var(--sw-audio-bar-width);\n      background: var(--sw-audio-bar-background);\n      border-radius: var(--sw-audio-bar-radius);\n      transition:\n        height 0.05s ease-out,\n        width 0.05s ease-out,\n        background-color 0.1s ease;\n      min-height: 4px;\n    }\n\n    :host([orientation='horizontal']) .bar {\n      height: var(--sw-audio-bar-width);\n      width: 4px;\n      min-width: 4px;\n      min-height: auto;\n    }\n\n    .bar.active {\n      /* Color is set dynamically via inline style */\n    }\n\n    .bar.level-low {\n      background-color: var(--interactive-status-success);\n    }\n\n    .bar.level-medium {\n      background-color: var(--interactive-status-warning);\n    }\n\n    .bar.level-high {\n      background-color: var(--interactive-button-destructive-bg);\n    }\n  `;\n\n  /**\n   * Explicit MediaStream to analyze — highest precedence.\n   */\n  @property({ type: Object }) stream?: MediaStream;\n\n  /**\n   * Explicit Call — when set, analyzes the call's `localStream`.\n   * Bypassed by `.stream` if both are set.\n   */\n  @property({ type: Object }) call?: Call;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  @state() private _directLocalStream: MediaStream | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  private get _effectiveStream(): MediaStream | undefined {\n    if (this.stream) return this.stream;\n    if (this.call) return this._directLocalStream ?? undefined;\n    return this._callState?.localStream ?? undefined;\n  }\n\n  /**\n   * Number of bars to display (default: 5)\n   */\n  @property({ type: Number }) bars = 5;\n\n  /**\n   * Orientation of the bars: 'vertical' or 'horizontal'\n   */\n  @property({ type: String, reflect: true }) orientation: 'vertical' | 'horizontal' = 'vertical';\n\n  /**\n   * When true, automatically calls getUserMedia({ audio: true }) to acquire\n   * a microphone stream instead of requiring the consumer to set `.stream`.\n   */\n  @property({ type: Boolean, reflect: true, attribute: 'auto-request' }) autoRequest = false;\n\n  /**\n   * Maximum height/width of bars in pixels\n   */\n  @property({ type: Number }) maxSize = 32;\n\n  /**\n   * Current audio levels for each bar (0-1)\n   */\n  @state() private _levels: number[] = [];\n\n  /**\n   * Web Audio API context\n   */\n  private _audioContext?: AudioContext;\n\n  /**\n   * Analyser node for frequency data\n   */\n  private _analyser?: AnalyserNode;\n\n  /**\n   * Source node connected to the MediaStream\n   */\n  private _source?: MediaStreamAudioSourceNode;\n\n  /**\n   * Animation frame ID for cleanup\n   */\n  private _animationFrameId?: number;\n\n  /**\n   * Frequency data buffer\n   */\n  private _dataArray?: Uint8Array<ArrayBuffer>;\n\n  /**\n   * Whether we own the stream and must stop its tracks on cleanup.\n   */\n  private _ownsStream = false;\n\n  /** Guard against concurrent getUserMedia calls (connectedCallback + first updated both fire). */\n  private _micRequested = false;\n\n  /**\n   * Lifecycle: Component connected to DOM\n   */\n  connectedCallback() {\n    super.connectedCallback();\n    this._levels = new Array(this.bars).fill(0);\n    const eff = this._effectiveStream;\n    if (this.autoRequest && !eff) {\n      this._requestMicStream();\n    } else if (eff) {\n      this._activeStream = eff;\n      this.setupAudioAnalysis();\n    }\n  }\n\n  /** Stream currently wired to the analyser — used to detect real changes. */\n  private _activeStream?: MediaStream;\n\n  /**\n   * Lifecycle: React to property changes\n   */\n  protected updated(changedProperties: Map<string, unknown>): void {\n    super.updated(changedProperties);\n\n    if (changedProperties.has('call')) {\n      this._directSubscriptions.forEach((s) => s.unsubscribe());\n      this._directSubscriptions = [];\n      this._directLocalStream = null;\n      if (this.call) {\n        this._directSubscriptions.push(\n          this.call.localStream$.subscribe((s) => (this._directLocalStream = s))\n        );\n      }\n    }\n\n    if (changedProperties.has('autoRequest') && this.autoRequest && !this._effectiveStream) {\n      this._requestMicStream();\n    }\n\n    const reactsToInput =\n      changedProperties.has('stream') ||\n      changedProperties.has('call') ||\n      changedProperties.has('_directLocalStream') ||\n      changedProperties.has('_callState');\n\n    if (reactsToInput) {\n      const next = this._effectiveStream;\n      if (next !== this._activeStream) {\n        this.cleanupAudioAnalysis();\n        this._activeStream = next;\n        if (next) this.setupAudioAnalysis();\n      }\n    }\n\n    if (changedProperties.has('bars')) {\n      this._levels = new Array(this.bars).fill(0);\n    }\n  }\n\n  /**\n   * Lifecycle: Component disconnected from DOM\n   */\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.cleanupAudioAnalysis();\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n  }\n\n  /**\n   * Public method to release all audio resources immediately\n   * Call this before stopping the MediaStream tracks to ensure proper cleanup\n   */\n  public releaseResources(): void {\n    this.cleanupAudioAnalysis();\n    this.stream = undefined;\n  }\n\n  /**\n   * Request a microphone stream via getUserMedia for auto-request mode.\n   */\n  private _requestMicStream(): void {\n    if (this._micRequested) return;\n    this._micRequested = true;\n\n    navigator.mediaDevices\n      .getUserMedia({ audio: true })\n      .then((mediaStream) => {\n        // Component may have been removed while getUserMedia was pending.\n        // Stop the tracks immediately rather than leaking the mic capture.\n        if (!this.isConnected) {\n          mediaStream.getTracks().forEach((t) => t.stop());\n          return;\n        }\n        this._ownsStream = true;\n        this.stream = mediaStream;\n      })\n      .catch((err) => {\n        this._micRequested = false;\n        logger.error('[SwAudioLevel] Failed to acquire microphone:', err);\n      });\n  }\n\n  /**\n   * Setup Web Audio API for audio level analysis\n   */\n  private setupAudioAnalysis(): void {\n    const stream = this._activeStream ?? this._effectiveStream;\n    if (!stream) return;\n\n    // Check if stream has audio tracks\n    const audioTracks = stream.getAudioTracks();\n    if (audioTracks.length === 0) {\n      logger.warn('[SwAudioLevel] MediaStream has no audio tracks');\n      return;\n    }\n\n    try {\n      // Create AudioContext\n      this._audioContext = new AudioContext();\n\n      // Resume in case the browser started the context suspended (autoplay policy)\n      if (this._audioContext.state === 'suspended') {\n        void this._audioContext.resume();\n      }\n\n      // Create analyser node\n      this._analyser = this._audioContext.createAnalyser();\n      this._analyser.fftSize = 256;\n      this._analyser.smoothingTimeConstant = 0.8;\n\n      // Create source from MediaStream\n      this._source = this._audioContext.createMediaStreamSource(stream);\n      this._source.connect(this._analyser);\n\n      // Create data array for frequency data\n      const bufferLength = this._analyser.frequencyBinCount;\n      this._dataArray = new Uint8Array(bufferLength);\n\n      // Start animation loop\n      this.startAnimationLoop();\n    } catch (error) {\n      logger.error('[SwAudioLevel] Failed to setup audio analysis:', error);\n    }\n  }\n\n  /**\n   * Cleanup Web Audio API resources\n   */\n  private cleanupAudioAnalysis(): void {\n    // Cancel animation frame\n    if (this._animationFrameId !== undefined) {\n      cancelAnimationFrame(this._animationFrameId);\n      this._animationFrameId = undefined;\n    }\n\n    // Disconnect source\n    if (this._source) {\n      this._source.disconnect();\n      this._source = undefined;\n    }\n\n    // Disconnect analyser (not strictly necessary but good practice)\n    if (this._analyser) {\n      this._analyser.disconnect();\n      this._analyser = undefined;\n    }\n\n    // Close AudioContext\n    if (this._audioContext && this._audioContext.state !== 'closed') {\n      this._audioContext.close().catch((err) => logger.error('[SwAudioLevel] Close failed:', err));\n      this._audioContext = undefined;\n    }\n\n    // Stop tracks if we acquired the stream via auto-request\n    if (this._ownsStream && this.stream) {\n      this.stream.getTracks().forEach((t) => t.stop());\n      this._ownsStream = false;\n    }\n\n    this._activeStream = undefined;\n\n    this._micRequested = false;\n\n    // Clear data array\n    this._dataArray = undefined;\n\n    // Reset levels\n    this._levels = new Array(this.bars).fill(0);\n  }\n\n  /**\n   * Start the animation loop for updating levels\n   */\n  private startAnimationLoop(): void {\n    const updateLevels = () => {\n      const analyser = this._analyser;\n      const dataArray = this._dataArray;\n      if (!analyser || !dataArray) {\n        return;\n      }\n\n      // Get frequency data\n      analyser.getByteFrequencyData(dataArray);\n\n      // Calculate levels for each bar by sampling frequency ranges\n      const levels: number[] = [];\n      const binCount = dataArray.length;\n      const binsPerBar = Math.floor(binCount / this.bars);\n\n      for (let i = 0; i < this.bars; i++) {\n        const startBin = i * binsPerBar;\n        const endBin = Math.min(startBin + binsPerBar, binCount);\n\n        // Average the frequency values for this bar's range\n        let sum = 0;\n        for (let j = startBin; j < endBin; j++) {\n          sum += dataArray[j] ?? 0;\n        }\n        const average = sum / (endBin - startBin);\n\n        // Normalize to 0-1 range\n        levels.push(average / 255);\n      }\n\n      this._levels = levels;\n      this.requestUpdate();\n\n      // Schedule next frame\n      this._animationFrameId = requestAnimationFrame(updateLevels);\n    };\n\n    this._animationFrameId = requestAnimationFrame(updateLevels);\n  }\n\n  /**\n   * Get the color class based on level\n   */\n  private getLevelClass(level: number): string {\n    if (level > 0.7) return 'level-high';\n    if (level > 0.4) return 'level-medium';\n    if (level > 0.05) return 'level-low';\n    return '';\n  }\n\n  /**\n   * Get the active class if level is above threshold\n   */\n  private isActive(level: number): boolean {\n    return level > 0.05;\n  }\n\n  /**\n   * Render the component\n   */\n  render() {\n    // Ensure we have the right number of levels\n    const levels = this._levels.length === this.bars ? this._levels : new Array(this.bars).fill(0);\n\n    // Aggregate level (peak across bars), normalized 0–100 for aria-valuenow.\n    const peak = levels.reduce((a: number, b: number) => Math.max(a, b), 0);\n    const ariaValue = Math.round(peak * 100);\n\n    return html`\n      <div\n        class=\"container\"\n        part=\"container\"\n        role=\"meter\"\n        aria-label=\"Audio input level\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        aria-valuenow=${ariaValue}\n      >\n        ${levels.map((level, index) => {\n          const isActive = this.isActive(level);\n          const levelClass = this.getLevelClass(level);\n          const size = Math.max(4, level * this.maxSize);\n\n          const style =\n            this.orientation === 'horizontal' ? `width: ${size}px;` : `height: ${size}px;`;\n\n          return html`\n            <div\n              class=\"bar ${isActive ? 'active' : ''} ${levelClass}\"\n              part=\"bar ${isActive ? 'bar-active' : ''}\"\n              style=\"${style}\"\n              data-bar-index=\"${index}\"\n              aria-hidden=\"true\"\n            ></div>\n          `;\n        })}\n      </div>\n    `;\n  }\n}\n\n/**\n * Declare global type for TypeScript\n */\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-audio-level': SwAudioLevel;\n  }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { DropUpItem } from './UI/controls/sw-ui-dropup.js';\nimport type {\n  FullscreenToggleDetail,\n  ScreenShareToggleDetail,\n  HandRaiseToggleDetail,\n  SettingsChangeDetail,\n} from './UI/controls/sw-ui-control-bar.js';\nimport { getLogger } from '@signalwire/js';\nimport type { CallSelfParticipant } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\n\nconst logger = getLogger();\n\n/**\n * Connected control bar that bridges `devicesContext` and `callStateContext`\n * to the pure `sw-ui-control-bar` UI component.\n *\n * Input precedence (most specific wins): `.call` > context.\n * When `.call` is set, the control bar drives screen-share / hand-raise /\n * hang-up directly from the Call. Mic/camera/speaker toggles still require\n * `devicesContext` — without it those buttons render in their default state.\n *\n * @prop {Call}    call             - explicit Call object (overrides context)\n * @prop {boolean} showScreenShare  - show the screen-share button\n * @prop {boolean} showHandRaise   - show the hand-raise button\n * @prop {boolean} showTranscript  - show the transcript toggle button\n * @prop {boolean} transcriptActive - current transcript panel visibility\n *\n * @fires sw-call-hangup - Re-dispatched when the user clicks hang-up so external\n *                         consumers (e.g. React parents) can react. No detail.\n */\n@customElement('sw-call-controls')\nexport class SwCallControls extends LitElement {\n  static styles = css`\n    :host {\n      display: block;\n    }\n  `;\n\n  @consume({ context: devicesContext, subscribe: true })\n  @state()\n  private _devices!: DevicesState;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  /** Explicit Call — when set, drives call-state actions directly. */\n  @property({ type: Object }) call?: Call;\n\n  @state() private _directSelf: CallSelfParticipant | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  @state() private _fullscreen = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-screen-share' })\n  showScreenShare = true;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-hand-raise' })\n  showHandRaise = true;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-transcript' })\n  showTranscript = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'transcript-active' })\n  transcriptActive = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-settings' })\n  showSettings = true;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-fullscreen' })\n  showFullscreen = true;\n\n  // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('call')) {\n      this._teardownDirect();\n      if (this.call) {\n        this._directSubscriptions.push(\n          this.call.self$.subscribe((s) => (this._directSelf = s))\n        );\n      }\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._teardownDirect();\n  }\n\n  private _teardownDirect(): void {\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n    this._directSelf = null;\n  }\n\n  private get _effectiveSelf(): CallSelfParticipant | null {\n    return this.call ? this._directSelf : this._callState?.self ?? null;\n  }\n\n  // ── Helpers ───────────────────────────────────────────────────────────────\n\n  private _toDropupOptions(\n    devices: MediaDeviceInfo[],\n    selected: MediaDeviceInfo | null\n  ): DropUpItem[] {\n    // Before getUserMedia permission, browsers may return devices with\n    // empty deviceId/label. Deduplicate empty-ID entries into one\n    // placeholder so the chevron doesn't show multiple blank rows.\n    const seen = new Set<string>();\n    const result: DropUpItem[] = [];\n    for (const d of devices) {\n      const id = d.deviceId || `__default_${d.kind}`;\n      if (seen.has(id)) continue;\n      seen.add(id);\n      result.push({\n        id,\n        label: d.label || (d.deviceId ? d.deviceId.slice(0, 12) : 'Default'),\n        selected: d.deviceId === selected?.deviceId,\n      });\n    }\n    return result;\n  }\n\n  // ── Handlers ─────────────────────────────────────────────────────────────\n\n  private _onMicToggle() {\n    this._devices?.toggleAudioMute();\n  }\n\n  private _onCameraToggle() {\n    this._devices?.toggleVideoMute();\n  }\n\n  private _onSpeakerToggle() {\n    this._devices?.toggleSpeakerMute();\n  }\n\n  private _onFullscreenToggle(e: CustomEvent<FullscreenToggleDetail>) {\n    this._fullscreen = e.detail.fullscreen;\n  }\n\n  private _onScreenShareToggle(e: CustomEvent<ScreenShareToggleDetail>) {\n    const self = this._effectiveSelf;\n    if (!self) return;\n\n    if (e.detail.active) {\n      self.startScreenShare().catch((err) => {\n        logger.error('[CallControls] Screen share failed:', err);\n      });\n    } else {\n      self.stopScreenShare().catch((err) => {\n        logger.error('[CallControls] Stop screen share failed:', err);\n      });\n    }\n  }\n\n  private _onHandRaiseToggle(_e: CustomEvent<HandRaiseToggleDetail>) {\n    const self = this._effectiveSelf;\n    if (!self) return;\n\n    self.toggleHandraise().catch((err) => {\n      logger.error('[CallControls] Hand raise failed:', err);\n    });\n  }\n\n  private _onHangUp() {\n    const hangup = this.call ? () => this.call!.hangup() : this._callState?.hangup;\n    hangup?.().catch((err) => {\n      logger.error('[CallControls] Hangup failed:', err);\n    });\n    // Re-dispatch as sw-call-hangup so external consumers (e.g. React) can react.\n    this.dispatchEvent(new CustomEvent('sw-call-hangup', { bubbles: true, composed: true }));\n  }\n\n  private _onDeviceChange(e: CustomEvent<{ kind: 'mic' | 'camera' | 'speaker'; deviceId: string }>) {\n    if (!this._devices) return;\n    const { kind, deviceId } = e.detail;\n    const find = (list: MediaDeviceInfo[]) => list.find((d) => d.deviceId === deviceId) ?? null;\n\n    if (kind === 'mic')     this._devices.selectAudioInput(find(this._devices.audioInputDevices));\n    if (kind === 'camera')  this._devices.selectVideoInput(find(this._devices.videoInputDevices));\n    if (kind === 'speaker') this._devices.selectAudioOutput(find(this._devices.audioOutputDevices));\n  }\n\n  private _onSettingsChange(e: CustomEvent<SettingsChangeDetail>) {\n    if (!this._devices) return;\n    const { settingId } = e.detail;\n    const toggles: Record<string, () => Promise<void>> = {\n      'echo-cancellation': () => this._devices.toggleEchoCancellation(),\n      'auto-gain': () => this._devices.toggleAutoGain(),\n      'noise-suppression': () => this._devices.toggleNoiseSuppression(),\n    };\n    const toggle = toggles[settingId];\n    if (toggle) {\n      toggle().catch((err) => logger.error('[CallControls] Settings toggle failed:', err));\n    }\n  }\n\n  private _buildSettingsItems(): DropUpItem[] {\n    return [\n      { id: 'echo-cancellation', label: 'Echo Cancellation', selected: this._devices.echoCancellation },\n      { id: 'auto-gain', label: 'Auto Gain', selected: this._devices.autoGain },\n      { id: 'noise-suppression', label: 'Noise Suppression', selected: this._devices.noiseSuppression },\n    ];\n  }\n\n  // ── Render ────────────────────────────────────────────────────────────────\n\n  render() {\n    if (!this._devices && !this.call) return html``;\n\n    const self = this._effectiveSelf;\n    const isScreenSharing = self?.screenShareStatus === 'started';\n    const isHandRaised = self?.handraised ?? false;\n\n    const d = this._devices;\n    return html`\n      <sw-ui-control-bar\n        exportparts=\"bar,logo,button,chevron\"\n        .micMuted=${d?.audioMuted ?? false}\n        .cameraMuted=${d?.videoMuted ?? false}\n        .speakerMuted=${d?.speakerMuted ?? false}\n        .fullscreen=${this._fullscreen}\n        .screenSharing=${isScreenSharing}\n        .handRaised=${isHandRaised}\n        .transcriptActive=${this.transcriptActive}\n        .showScreenShare=${this.showScreenShare}\n        .showHandRaise=${this.showHandRaise}\n        .showTranscript=${this.showTranscript}\n        .showSettings=${this.showSettings && !!d}\n        .showFullscreen=${this.showFullscreen}\n        .micDevices=${d ? this._toDropupOptions(d.audioInputDevices, d.selectedAudioInput) : []}\n        .cameraDevices=${d ? this._toDropupOptions(d.videoInputDevices, d.selectedVideoInput) : []}\n        .speakerDevices=${d ? this._toDropupOptions(d.audioOutputDevices, d.selectedAudioOutput) : []}\n        .settingsItems=${d ? this._buildSettingsItems() : []}\n        @sw-mic-toggle=${this._onMicToggle}\n        @sw-camera-toggle=${this._onCameraToggle}\n        @sw-speaker-toggle=${this._onSpeakerToggle}\n        @sw-fullscreen-toggle=${this._onFullscreenToggle}\n        @sw-screen-share-toggle=${this._onScreenShareToggle}\n        @sw-hand-raise-toggle=${this._onHandRaiseToggle}\n        @sw-call-hangup=${this._onHangUp}\n        @sw-device-change=${this._onDeviceChange}\n        @sw-settings-change=${this._onSettingsChange}\n      ></sw-ui-control-bar>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-controls': SwCallControls;\n  }\n}\n","/**\n * Call Status Component\n *\n * Displays current call state with status text and duration timer.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-call-status></sw-call-status>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-call-status .call=${call}></sw-call-status>\n * ```\n *\n * @csspart container   - Outer status container.\n * @csspart status-text - Text label of the current status.\n * @csspart duration    - Elapsed-time label (only rendered when connected).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { hostReset } from './UI/host-reset.js';\n\n@customElement('sw-call-status')\nexport class SwCallStatus extends LitElement {\n  static styles = [hostReset, css`\n      :host {\n        display: inline-flex;\n        align-items: center;\n        gap: 8px;\n        font-family: var(--type-family-body);\n        font-size: var(--type-size-small);\n      }\n\n      .container {\n        display: inline-flex;\n        align-items: center;\n        gap: 8px;\n        padding: 8px 12px;\n        border-radius: var(--radius-md);\n        color: var(--fg-default);\n      }\n\n      .status-indicator {\n        width: 10px;\n        height: 10px;\n        border-radius: 50%;\n        flex-shrink: 0;\n      }\n\n      .status-indicator.new {\n        background-color: var(--bg-surface-raised);\n      }\n      .status-indicator.connecting,\n      .status-indicator.ringing,\n      .status-indicator.trying,\n      .status-indicator.recovering {\n        background-color: var(--interactive-status-warning);\n        animation: pulse 1.5s ease-in-out infinite;\n      }\n      .status-indicator.connected {\n        background-color: var(--interactive-status-success);\n      }\n      .status-indicator.disconnecting {\n        background-color: var(--interactive-button-destructive-bg);\n        animation: pulse 1s ease-in-out infinite;\n      }\n      .status-indicator.disconnected,\n      .status-indicator.failed {\n        background-color: var(--interactive-button-destructive-bg);\n      }\n      .status-indicator.destroyed {\n        background-color: var(--bg-surface-raised);\n      }\n\n      @keyframes pulse {\n        0%,\n        100% {\n          opacity: 1;\n          transform: scale(1);\n        }\n        50% {\n          opacity: 0.5;\n          transform: scale(1.1);\n        }\n      }\n\n      .status-text {\n        font-weight: 500;\n        white-space: nowrap;\n      }\n      .status-text.trying,\n      .status-text.connecting,\n      .status-text.ringing,\n      .status-text.recovering {\n        color: var(--interactive-status-warning);\n      }\n      .status-text.disconnecting {\n        color: var(--interactive-button-destructive-bg);\n      }\n      .status-text.connected {\n        color: var(--interactive-status-success);\n      }\n      .status-text.disconnected,\n      .status-text.failed {\n        color: var(--interactive-button-destructive-bg);\n      }\n      .status-text.new,\n      .status-text.destroyed {\n        color: var(--bg-surface-raised);\n      }\n\n      .duration {\n        font-variant-numeric: tabular-nums;\n        opacity: 0.6;\n        font-size: 0.85em;\n      }\n    `];\n\n  /** Explicit Call — when set, subscribes directly to its observables and bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  /** Status from a directly-subscribed `.call` — `null` when context is the source. */\n  @state() private _directStatus: CallStatus | null = null;\n\n  @state() private _callStartTime: number | null = null;\n  @state() private _duration = '0:00';\n\n  private _durationInterval: number | null = null;\n  private _prevStatus: CallStatus = 'new';\n  private _directSubscriptions: Subscription[] = [];\n\n  private get _effectiveStatus(): CallStatus {\n    return this.call ? this._directStatus ?? 'new' : this._callState?.status ?? 'new';\n  }\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n\n    if (changed.has('call')) {\n      this._teardownDirect();\n      if (this.call) this._setupDirect(this.call);\n    }\n\n    if (changed.has('call') || changed.has('_callState') || changed.has('_directStatus')) {\n      const status = this._effectiveStatus;\n      if (status !== this._prevStatus) {\n        if (status === 'connected' && this._prevStatus !== 'connected') {\n          this._startDurationTimer();\n        } else if (status !== 'connected') {\n          this._stopDurationTimer();\n        }\n        this._prevStatus = status;\n      }\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._stopDurationTimer();\n    this._teardownDirect();\n  }\n\n  private _setupDirect(call: Call): void {\n    this._directSubscriptions.push(\n      call.status$.subscribe((s) => {\n        this._directStatus = s;\n      })\n    );\n  }\n\n  private _teardownDirect(): void {\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n    this._directStatus = null;\n  }\n\n  private _startDurationTimer(): void {\n    this._callStartTime = Date.now();\n    this._duration = '0:00';\n    this._durationInterval = window.setInterval(() => {\n      if (this._callStartTime) {\n        const elapsed = Math.floor((Date.now() - this._callStartTime) / 1000);\n        const hours = Math.floor(elapsed / 3600);\n        const minutes = Math.floor((elapsed % 3600) / 60);\n        const secs = elapsed % 60;\n        this._duration =\n          hours > 0\n            ? `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n            : `${minutes}:${secs.toString().padStart(2, '0')}`;\n      }\n    }, 1000);\n  }\n\n  private _stopDurationTimer(): void {\n    if (this._durationInterval) {\n      clearInterval(this._durationInterval);\n      this._durationInterval = null;\n    }\n    this._callStartTime = null;\n    this._duration = '0:00';\n  }\n\n  private getStatusText(): string {\n    const status = this._effectiveStatus;\n    switch (status) {\n      case 'new':\n        return 'Ready';\n      case 'trying':\n        return 'Trying...';\n      case 'connecting':\n        return 'Connecting...';\n      case 'ringing':\n        return 'Ringing...';\n      case 'connected':\n        return 'Connected';\n      case 'recovering':\n        return 'Reconnecting...';\n      case 'disconnecting':\n        return 'Disconnecting...';\n      case 'disconnected':\n        return 'Disconnected';\n      case 'failed':\n        return 'Failed';\n      case 'destroyed':\n        return 'Ended';\n      default: {\n        const _exhaustive: never = status;\n        return String(_exhaustive);\n      }\n    }\n  }\n\n  render() {\n    const status = this._effectiveStatus;\n    const statusText = this.getStatusText();\n\n    return html`\n      <div class=\"container\" part=\"container\">\n        <span class=\"status-indicator ${status}\" aria-hidden=\"true\"></span>\n        <span class=\"status-text ${status}\" part=\"status-text\" role=\"status\" aria-live=\"polite\">\n          ${statusText}\n        </span>\n        ${status === 'connected'\n          ? html`<span class=\"duration\" part=\"duration\">${this._duration}</span>`\n          : null}\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-status': SwCallStatus;\n  }\n}\n","import { ContextProvider } from '@lit/context';\nimport type { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { callStateContext } from './call-state-context.js';\nimport type { CallState } from './call-state-context.js';\nimport type { ContextHost } from './types.js';\n\nconst noop = () => Promise.resolve();\nconst noopVoid = () => {};\n\n// Frozen so accidental mutation of the shared empty arrays/objects\n// (`meta`, `participants`, `layouts`, `layoutLayers`, `capabilities`) throws\n// instead of silently corrupting every consumer that read the empty state.\nconst EMPTY_CALL_STATE: CallState = Object.freeze({\n  id: '',\n  direction: 'outbound',\n  to: undefined,\n  status: 'new',\n  recording: false,\n  streaming: false,\n  locked: false,\n  raiseHandPriority: false,\n  meta: Object.freeze({}) as Record<string, unknown>,\n  participants: Object.freeze([]) as unknown as CallState['participants'],\n  self: null,\n  remoteStream: null,\n  localStream: null,\n  mediaDirections: Object.freeze({ audio: 'inactive', video: 'inactive' }) as CallState['mediaDirections'],\n  layout: undefined,\n  layouts: Object.freeze([]) as unknown as string[],\n  layoutLayers: Object.freeze([]) as unknown as CallState['layoutLayers'],\n  address: undefined,\n  capabilities: Object.freeze([]) as unknown as string[],\n  hangup: noop,\n  toggleLock: noop,\n  toggleHold: noop,\n  setLayout: noop,\n  startRecording: noop,\n  startStreaming: noop,\n  sendDigits: noop,\n  answer: noopVoid,\n  reject: noopVoid,\n}) as CallState;\n\n/**\n * ReactiveController that flattens all Call observables into a plain CallState\n * object provided via Lit context. Consumer components get automatic re-renders\n * on any change. \n *\n * Usage in a provider component:\n *\n *   private _callState = new CallStateContextController(this);\n *\n *   // When a call arrives:\n *   this._callState.connect(call);\n *\n *   // When the call ends:\n *   this._callState.disconnect();\n */\nexport class CallStateContextController {\n  private _provider: ContextProvider<typeof callStateContext>;\n  private _subscriptions: Subscription[] = [];\n  private _state: CallState = { ...EMPTY_CALL_STATE };\n  private _batching = false;\n\n  constructor(host: ContextHost) {\n    this._provider = new ContextProvider(host, {\n      context: callStateContext,\n      initialValue: this._state,\n    });\n    host.addController(this);\n  }\n\n  hostConnected() {}\n  hostDisconnected() {\n    this.disconnect();\n  }\n\n  connect(call: Call) {\n    this.disconnect();\n\n    // Batch the synchronous initial-replay storm: each BehaviorSubject below\n    // emits its current value on subscribe, which would otherwise trigger\n    // ~16 consecutive setValue() calls (and consumer re-renders) within a\n    // single microtask. Collect them and publish once at the end.\n    this._batching = true;\n\n    // Static identity — set once, never changes for the lifetime of this call\n    this._patch({\n      id: call.id,\n      direction: call.direction,\n      to: call.to,\n    });\n\n    // Wire up actions — bound to this call instance\n    this._patch({\n      hangup: () => call.hangup(),\n      toggleLock: () => call.toggleLock(),\n      toggleHold: () => call.toggleHold(),\n      setLayout: (layout, positions = {}) => call.setLayout(layout, positions),\n      startRecording: () => call.startRecording(),\n      startStreaming: () => call.startStreaming(),\n      sendDigits: (digits) => call.sendDigits(digits),\n      answer: () => call.answer(),\n      reject: () => call.reject(),\n    });\n\n    this._subscriptions = [\n      call.status$.subscribe((status) =>\n        this._patch({ status })\n      ),\n      call.recording$.subscribe((recording) =>\n        this._patch({ recording })\n      ),\n      call.streaming$.subscribe((streaming) =>\n        this._patch({ streaming })\n      ),\n      call.locked$.subscribe((locked) =>\n        this._patch({ locked })\n      ),\n      call.raiseHandPriority$.subscribe((raiseHandPriority) =>\n        this._patch({ raiseHandPriority })\n      ),\n      call.meta$.subscribe((meta) =>\n        this._patch({ meta })\n      ),\n      call.participants$.subscribe((participants) =>\n        this._patch({ participants })\n      ),\n      call.self$.subscribe((self) =>\n        this._patch({ self })\n      ),\n      call.remoteStream$.subscribe((remoteStream) =>\n        this._patch({ remoteStream })\n      ),\n      call.localStream$.subscribe((localStream) =>\n        this._patch({ localStream })\n      ),\n      call.mediaDirections$.subscribe((mediaDirections) =>\n        this._patch({ mediaDirections })\n      ),\n      call.layout$.subscribe((layout) =>\n        this._patch({ layout })\n      ),\n      call.layouts$.subscribe((layouts) =>\n        this._patch({ layouts })\n      ),\n      call.layoutLayers$.subscribe((layoutLayers) =>\n        this._patch({ layoutLayers })\n      ),\n      call.address$.subscribe((address) =>\n        this._patch({ address })\n      ),\n      call.capabilities$.subscribe((capabilities) =>\n        this._patch({ capabilities })\n      ),\n    ];\n\n    this._batching = false;\n    this._publish();\n  }\n\n  disconnect() {\n    this._subscriptions.forEach((s) => s.unsubscribe());\n    this._subscriptions = [];\n    this._patch({ ...EMPTY_CALL_STATE });\n  }\n\n  private _patch(partial: Partial<CallState>) {\n    this._state = { ...this._state, ...partial };\n    if (!this._batching) this._publish();\n  }\n\n  private _publish() {\n    this._provider.setValue(this._state);\n  }\n}\n","import { ContextProvider } from '@lit/context';\nimport { type Subscription, switchMap, of } from 'rxjs';\nimport type { DeviceController, Call } from '../types/index.js';\nimport { devicesContext } from './devices-context.js';\nimport type { DevicesState } from './devices-context.js';\nimport type { ContextHost } from './types.js';\n\nconst noop = () => Promise.resolve();\n\n// Frozen so the shared empty-array references can't be mutated by a\n// consumer who reads the empty state.\nconst EMPTY_STATE: DevicesState = Object.freeze({\n  audioInputDevices: Object.freeze([]) as unknown as DevicesState['audioInputDevices'],\n  audioOutputDevices: Object.freeze([]) as unknown as DevicesState['audioOutputDevices'],\n  videoInputDevices: Object.freeze([]) as unknown as DevicesState['videoInputDevices'],\n  selectedAudioInput: null,\n  selectedAudioOutput: null,\n  selectedVideoInput: null,\n  audioMuted: false,\n  videoMuted: false,\n  speakerMuted: false,\n  selectAudioInput: () => {},\n  selectAudioOutput: () => {},\n  selectVideoInput: () => {},\n  toggleAudioMute: noop,\n  toggleVideoMute: noop,\n  toggleSpeakerMute: noop,\n  echoCancellation: true,\n  autoGain: true,\n  noiseSuppression: true,\n  toggleEchoCancellation: noop,\n  toggleAutoGain: noop,\n  toggleNoiseSuppression: noop,\n}) as DevicesState;\n\n/**\n * ReactiveController that bridges DeviceController + Call into a clean\n * DevicesState provided via Lit context. Consumers need zero RxJS.\n *\n * Usage in a provider component:\n *\n *   private _devices = new DevicesContextController(this);\n *\n *   // Wire up devices (can be done before a call exists):\n *   this._devices.connectDevices(deviceController);\n *\n *   // Wire up call (mute state, server-driven changes):\n *   this._devices.connectCall(call);\n *\n *   // Tear down individually or all at once:\n *   this._devices.disconnectCall();\n *   this._devices.disconnect();\n */\nexport class DevicesContextController {\n  private _provider: ContextProvider<typeof devicesContext>;\n  private _dc: DeviceController | null = null;\n  private _deviceSubs: Subscription[] = [];\n  private _callSubs: Subscription[] = [];\n  private _state: DevicesState = { ...EMPTY_STATE };\n\n  constructor(host: ContextHost) {\n    this._provider = new ContextProvider(host, {\n      context: devicesContext,\n      initialValue: this._state,\n    });\n    host.addController(this);\n  }\n\n  hostConnected() {}\n  hostDisconnected() {\n    this.disconnect();\n  }\n\n  // ── Device controller ───────────────────────────────────────────────────\n\n  connectDevices(dc: DeviceController) {\n    this._dc = dc;\n    this._deviceSubs.forEach((s) => s.unsubscribe());\n\n    this._patch({\n      selectAudioInput: (d) => dc.selectAudioInputDevice(d),\n      selectAudioOutput: (d) => dc.selectAudioOutputDevice(d),\n      selectVideoInput: (d) => dc.selectVideoInputDevice(d),\n    });\n\n    this._deviceSubs = [\n      dc.audioInputDevices$.subscribe((devices) =>\n        this._patch({ audioInputDevices: devices })\n      ),\n      dc.audioOutputDevices$.subscribe((devices) =>\n        this._patch({ audioOutputDevices: devices })\n      ),\n      dc.videoInputDevices$.subscribe((devices) =>\n        this._patch({ videoInputDevices: devices })\n      ),\n      dc.selectedAudioInputDevice$.subscribe((device) =>\n        this._patch({ selectedAudioInput: device })\n      ),\n      dc.selectedAudioOutputDevice$.subscribe((device) =>\n        this._patch({ selectedAudioOutput: device })\n      ),\n      dc.selectedVideoInputDevice$.subscribe((device) =>\n        this._patch({ selectedVideoInput: device })\n      ),\n    ];\n\n    dc.enableDeviceMonitoring();\n  }\n\n  /** Force device re-enumeration (call after getUserMedia grants permission). */\n  refreshDevices(): void {\n    if (this._dc) {\n      this._dc.enableDeviceMonitoring();\n    }\n  }\n\n  // ── Call / mute state ───────────────────────────────────────────────────\n\n  connectCall(call: Call) {\n    this.disconnectCall();\n\n    // Track the current self participant so actions always call the live instance\n    const selfSub = call.self$.subscribe((self) => {\n      this._patch({\n        toggleAudioMute: self ? () => self.toggleMute() : noop,\n        toggleVideoMute: self ? () => self.toggleMuteVideo() : noop,\n        toggleSpeakerMute: self ? () => self.toggleDeaf() : noop,\n        toggleEchoCancellation: self ? () => self.toggleEchoCancellation() : noop,\n        toggleAutoGain: self ? () => self.toggleAudioInputAutoGain() : noop,\n        toggleNoiseSuppression: self ? () => self.toggleNoiseSuppression() : noop,\n      });\n    });\n\n    // switchMap: re-subscribes to the new self's observables whenever self changes.\n    // Falls back to `false` while self is null (e.g. before join, after leave).\n    const audioMutedSub = call.self$\n      .pipe(switchMap((self) => (self ? self.audioMuted$ : of(false))))\n      .subscribe((muted) => this._patch({ audioMuted: muted }));\n\n    const videoMutedSub = call.self$\n      .pipe(switchMap((self) => (self ? self.videoMuted$ : of(false))))\n      .subscribe((muted) => this._patch({ videoMuted: muted }));\n\n    const speakerMutedSub = call.self$\n      .pipe(switchMap((self) => (self ? self.deaf$ : of(false))))\n      .subscribe((deaf) => this._patch({ speakerMuted: deaf }));\n\n    const echoCancellationSub = call.self$\n      .pipe(switchMap((self) => (self ? self.echoCancellation$ : of(true))))\n      .subscribe((enabled) => this._patch({ echoCancellation: enabled }));\n\n    const autoGainSub = call.self$\n      .pipe(switchMap((self) => (self ? self.autoGain$ : of(true))))\n      .subscribe((enabled) => this._patch({ autoGain: enabled }));\n\n    const noiseSuppressionSub = call.self$\n      .pipe(switchMap((self) => (self ? self.noiseSuppression$ : of(true))))\n      .subscribe((enabled) => this._patch({ noiseSuppression: enabled }));\n\n    this._callSubs = [\n      selfSub,\n      audioMutedSub, videoMutedSub, speakerMutedSub,\n      echoCancellationSub, autoGainSub, noiseSuppressionSub,\n    ];\n  }\n\n  disconnectCall() {\n    this._callSubs.forEach((s) => s.unsubscribe());\n    this._callSubs = [];\n    this._patch({\n      audioMuted: false,\n      videoMuted: false,\n      speakerMuted: false,\n      toggleAudioMute: noop,\n      toggleVideoMute: noop,\n      toggleSpeakerMute: noop,\n      echoCancellation: true,\n      autoGain: true,\n      noiseSuppression: true,\n      toggleEchoCancellation: noop,\n      toggleAutoGain: noop,\n      toggleNoiseSuppression: noop,\n    });\n  }\n\n  // ── Full teardown ───────────────────────────────────────────────────────\n\n  disconnect() {\n    this._deviceSubs.forEach((s) => s.unsubscribe());\n    this._deviceSubs = [];\n    this.disconnectCall();\n    this._patch({ ...EMPTY_STATE });\n  }\n\n  // ── Internal ────────────────────────────────────────────────────────────\n\n  private _patch(partial: Partial<DevicesState>) {\n    this._state = { ...this._state, ...partial };\n    this._provider.setValue(this._state);\n  }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { Call, DeviceController } from '../types/index.js';\nimport { CallStateContextController } from '../context/CallStateContextController.js';\nimport { DevicesContextController } from '../context/DevicesContextController.js';\n\n/**\n * Context provider element that bridges an external `Call` and/or\n * `DeviceController` into Lit context so any descendant web component\n * (sw-call-media, sw-call-controls, sw-participants, etc.) receives live\n * state without manual property wiring.\n *\n * Usage:\n *   ```html\n *   <sw-call-provider id=\"provider\">\n *     <sw-call-media></sw-call-media>\n *     <sw-call-controls></sw-call-controls>\n *   </sw-call-provider>\n *   ```\n *   ```js\n *   provider.call = activeCall;\n *   provider.deviceController = signalWireClient;\n *   ```\n *\n * @prop {Call}             call             - Active call object\n * @prop {DeviceController} deviceController - Device controller for input/output device management\n *\n * @slot - Default slot. Descendants consume the provided contexts.\n */\n@customElement('sw-call-provider')\nexport class SwCallProvider extends LitElement {\n  static styles = css`:host { display: contents; }`;\n\n  @property({ attribute: false }) call: Call | undefined = undefined;\n  @property({ attribute: false }) deviceController: DeviceController | undefined = undefined;\n\n  private _callState = new CallStateContextController(this);\n  private _devices = new DevicesContextController(this);\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n\n    if (changed.has('call')) {\n      if (this.call) {\n        this._callState.connect(this.call);\n        this._devices.connectCall(this.call);\n      } else {\n        this._callState.disconnect();\n        this._devices.disconnectCall();\n      }\n    }\n\n    if (changed.has('deviceController') && this.deviceController) {\n      this._devices.connectDevices(this.deviceController);\n    }\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    this._callState.disconnect();\n    this._devices.disconnect();\n  }\n\n  render() {\n    return html`<slot></slot>`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-provider': SwCallProvider;\n  }\n}\n","/**\n * Dialpad Component\n *\n * A 12-key telephone keypad (0-9, *, #) for entering phone numbers\n * and sending DTMF tones during active calls. Pure UI component — no\n * call logic. Use `sw-call-dialpad` for a version that integrates with\n * a call context.\n *\n * @example\n * ```html\n * <sw-dialpad show-call-button></sw-dialpad>\n * ```\n *\n * Long-press behavior:\n * - Long-press the `0` key → inserts `+` (international prefix).\n * - Long-press the backspace button → clears the entire buffer.\n *\n * @fires sw-digit-press       - Fired when a digit button is pressed. Detail: `{ digit: string, digits: string }`\n * @fires sw-dialpad-backspace - Fired when the backspace button is pressed (or long-pressed to clear). Detail: `{ digits: string }`\n * @fires sw-dial              - Fired when the call button is pressed. Detail: `{ digits: string }`\n * @fires sw-dialpad-input     - Fired when free-text input changes (only when `allow-text` is set). Detail: `{ digits: string }`\n *\n * @cssprop [--interactive-button-primary-bg=#044ef4] - Primary accent color.\n * @cssprop [--interactive-button-primary-hover=#0342cf] - Primary color on hover.\n * @cssprop [--interactive-status-success=#22c55e] - Success/call button color.\n * @cssprop [--interactive-button-destructive-bg=#dc2626] - Danger/hangup button color.\n * @cssprop [--bg-surface=#181a28] - Component background.\n * @cssprop [--fg-default=#f0f0f4] - Text color.\n * @cssprop [--fg-muted=#a0a0aa] - Muted text color.\n * @cssprop [--border-default=rgba(255,255,255,0.12)] - Border color.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport '../icons/sw-ui-icon.js';\nimport { hostReset } from '../host-reset.js';\n\nconst DTMF_PATTERN = /^[0-9*#]$/;\nconst LONG_PRESS_MS = 500;\n\n/**\n * Key layout for standard telephone keypad\n */\nconst KEYS = [\n  { digit: '1', letters: '' },\n  { digit: '2', letters: 'ABC' },\n  { digit: '3', letters: 'DEF' },\n  { digit: '4', letters: 'GHI' },\n  { digit: '5', letters: 'JKL' },\n  { digit: '6', letters: 'MNO' },\n  { digit: '7', letters: 'PQRS' },\n  { digit: '8', letters: 'TUV' },\n  { digit: '9', letters: 'WXYZ' },\n  { digit: '*', letters: '' },\n  { digit: '0', letters: '+' },\n  { digit: '#', letters: '' }\n] as const;\n\n@customElement('sw-ui-dialpad')\nexport class SwUiDialpad extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      --sw-dialpad-display-size: 32px;\n      --sw-dialpad-key-size: 24px;\n      display: block;\n      font-family: var(--type-family-body);\n    }\n\n    .container {\n      display: flex;\n      flex-direction: column;\n      gap: var(--sp-3);\n      padding: var(--sp-4);\n      max-width: 280px;\n      background: var(--bg-surface);\n      border-radius: var(--radius-md);\n    }\n\n    .display {\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding: var(--sp-3) var(--sp-4);\n      background: var(--bg-surface-raised);\n      border-radius: var(--radius-md);\n      min-height: 48px;\n    }\n\n    .display-input {\n      flex: 1;\n      font-size: var(--sw-dialpad-display-size);\n      font-weight: 500;\n      font-family: var(--type-family-body);\n      color: var(--fg-default);\n      background: transparent;\n      border: none;\n      outline: none;\n      letter-spacing: 2px;\n      text-align: center;\n      width: 100%;\n    }\n\n    .display-input::placeholder {\n      color: var(--fg-muted);\n      font-size: var(--type-size-body);\n      letter-spacing: normal;\n    }\n\n    .backspace-button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 40px;\n      height: 40px;\n      background: transparent;\n      border: none;\n      border-radius: var(--radius-md);\n      cursor: pointer;\n      color: var(--fg-muted);\n      transition:\n        background-color 0.15s ease,\n        color 0.15s ease;\n    }\n\n    .backspace-button:hover {\n      background: var(--interactive-dropdown-hover);\n      color: var(--fg-default);\n    }\n\n    .backspace-button:disabled {\n      opacity: 0.3;\n      cursor: not-allowed;\n    }\n\n    .backspace-button sw-ui-icon {\n      pointer-events: none;\n    }\n\n    .keypad {\n      display: grid;\n      grid-template-columns: repeat(3, minmax(0, 72px));\n      justify-content: center;\n      gap: var(--sp-2);\n    }\n\n    .key {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      min-width: 0;\n      aspect-ratio: 1;\n      background: var(--bg-surface);\n      border: 1px solid var(--border-default);\n      border-radius: var(--radius-full);\n      cursor: pointer;\n      transition:\n        background-color 0.1s ease,\n        transform 0.1s ease;\n      user-select: none;\n      -webkit-user-select: none;\n      -webkit-tap-highlight-color: transparent;\n    }\n\n    .key:hover {\n      background: var(--bg-surface-raised);\n    }\n\n    .key:active,\n    .key.pressed {\n      background: var(--interactive-dropdown-hover);\n      transform: scale(0.95);\n    }\n\n    .key-digit {\n      font-size: var(--sw-dialpad-key-size);\n      font-weight: 500;\n      color: var(--fg-default);\n      line-height: 1;\n    }\n\n    .key-letters {\n      font-size: var(--type-size-caption);\n      color: var(--fg-muted);\n      text-transform: uppercase;\n      letter-spacing: 1px;\n      margin-top: 2px;\n      min-height: 14px;\n    }\n\n    .call-button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 100%;\n      height: 56px;\n      background: var(--interactive-status-success);\n      border: none;\n      border-radius: var(--radius-md);\n      cursor: pointer;\n      color: white;\n      font-size: var(--type-size-body);\n      font-weight: 600;\n      font-family: var(--type-family-body);\n      transition: background-color 0.15s ease;\n      gap: var(--sp-2);\n    }\n\n    .call-button:hover {\n      background: #0ea472;\n    }\n\n    .call-button:active {\n      background: #0d9668;\n    }\n\n    .call-button:disabled {\n      opacity: 0.5;\n      cursor: not-allowed;\n    }\n\n    .call-button sw-ui-icon {\n      pointer-events: none;\n    }\n  `];\n\n  /** Whether to display the call button below the keypad. */\n  @property({ type: Boolean, reflect: true, attribute: 'show-call-button' })\n  showCallButton: boolean = false;\n\n  /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). Keypad buttons still append DTMF digits. */\n  @property({ type: Boolean, reflect: true, attribute: 'allow-text' })\n  allowText: boolean = false;\n\n  /** Placeholder text shown in the digit display input. */\n  @property({ type: String })\n  placeholder: string = 'Enter number';\n\n  @state() private digits: string = '';\n  @state() private pressedKey: string | null = null;\n\n  private _longPressTimer: ReturnType<typeof setTimeout> | null = null;\n  private _longPressFired = false;\n\n  private _startLongPress(action: () => void) {\n    this._cancelLongPress();\n    this._longPressFired = false;\n    this._longPressTimer = setTimeout(() => {\n      this._longPressFired = true;\n      this._longPressTimer = null;\n      action();\n    }, LONG_PRESS_MS);\n  }\n\n  private _cancelLongPress() {\n    if (this._longPressTimer !== null) {\n      clearTimeout(this._longPressTimer);\n      this._longPressTimer = null;\n    }\n  }\n\n  override disconnectedCallback() {\n    this._cancelLongPress();\n    super.disconnectedCallback();\n  }\n\n  private _clearAll() {\n    if (this.digits.length === 0) return;\n    this.digits = '';\n    this.dispatchEvent(\n      new CustomEvent('sw-dialpad-backspace', {\n        detail: { digits: this.digits },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  private _pressDigit(digit: string) {\n    this.digits += digit;\n    this.pressedKey = digit;\n\n    this.dispatchEvent(\n      new CustomEvent('sw-digit-press', {\n        detail: { digit, digits: this.digits },\n        bubbles: true,\n        composed: true\n      })\n    );\n\n    setTimeout(() => {\n      this.pressedKey = null;\n    }, 100);\n  }\n\n  private _backspace() {\n    if (this.digits.length === 0) return;\n    this.digits = this.digits.slice(0, -1);\n    this.dispatchEvent(\n      new CustomEvent('sw-dialpad-backspace', {\n        detail: { digits: this.digits },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  private _dial() {\n    if (this.digits.length === 0) return;\n    this.dispatchEvent(\n      new CustomEvent('sw-dial', {\n        detail: { digits: this.digits },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  /**\n   * Handle keyboard input on the display field.\n   * We intercept all keys and manage state ourselves to prevent the browser\n   * from accumulating non-DTMF characters in the input value.\n   */\n  private _onKeyDown(e: KeyboardEvent) {\n    const { key } = e;\n\n    if (this.allowText) {\n      if (key === 'Enter' && this.showCallButton) {\n        e.preventDefault();\n        this._dial();\n      }\n      return;\n    }\n\n    if (DTMF_PATTERN.test(key)) {\n      e.preventDefault();\n      this._pressDigit(key);\n    } else if (key === 'Backspace') {\n      e.preventDefault();\n      this._backspace();\n    } else if (key === 'Enter' && this.showCallButton) {\n      e.preventDefault();\n      this._dial();\n    } else if (key !== 'Tab' && !e.ctrlKey && !e.metaKey) {\n      // Block all other printable characters\n      e.preventDefault();\n    }\n  }\n\n  private _onInput(e: Event) {\n    if (!this.allowText) return;\n    const value = (e.target as HTMLInputElement).value;\n    this.digits = value;\n    this.dispatchEvent(\n      new CustomEvent('sw-dialpad-input', {\n        detail: { digits: this.digits },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  render() {\n    return html`\n      <div class=\"container\" part=\"container\">\n        <div class=\"display\" part=\"display\">\n          <input\n            type=${this.allowText ? 'text' : 'tel'}\n            class=\"display-input\"\n            .value=${this.digits}\n            placeholder=${this.placeholder}\n            @keydown=${this._onKeyDown}\n            @input=${this._onInput}\n            aria-label=\"Phone number input\"\n          />\n          <button\n            class=\"backspace-button\"\n            @click=${() => {\n              if (this._longPressFired) { this._longPressFired = false; return; }\n              this._backspace();\n            }}\n            @pointerdown=${() => this._startLongPress(() => this._clearAll())}\n            @pointerup=${() => this._cancelLongPress()}\n            @pointerleave=${() => this._cancelLongPress()}\n            @pointercancel=${() => this._cancelLongPress()}\n            ?disabled=${this.digits.length === 0}\n            aria-label=\"Delete last digit (long-press to clear)\"\n          >\n            <sw-ui-icon name=\"backspace\" size=\"24\"></sw-ui-icon>\n          </button>\n        </div>\n\n        <div class=\"keypad\" part=\"keypad\" role=\"group\" aria-label=\"Telephone keypad\">\n          ${KEYS.map(\n            (key) => html`\n              <button\n                class=\"key ${this.pressedKey === key.digit ? 'pressed' : ''}\"\n                part=\"key ${this.pressedKey === key.digit ? 'key-pressed' : ''}\"\n                @click=${() => {\n                  if (this._longPressFired) { this._longPressFired = false; return; }\n                  this._pressDigit(key.digit);\n                }}\n                @pointerdown=${key.digit === '0'\n                  ? () => this._startLongPress(() => this._pressDigit('+'))\n                  : undefined}\n                @pointerup=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n                @pointerleave=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n                @pointercancel=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n                aria-label=\"${key.digit}${key.letters ? `, ${key.letters}` : ''}${\n                  key.digit === '0' ? ' (long-press for +)' : ''\n                }\"\n              >\n                <span class=\"key-digit\">${key.digit}</span>\n                <span class=\"key-letters\">${key.letters}</span>\n              </button>\n            `\n          )}\n        </div>\n\n        ${this.showCallButton\n          ? html`\n              <button\n                class=\"call-button\"\n                part=\"call-button\"\n                @click=${this._dial}\n                ?disabled=${this.digits.length === 0}\n                aria-label=\"Call ${this.digits}\"\n              >\n                <sw-ui-icon name=\"phone-call\" size=\"20\"></sw-ui-icon> Call\n              </button>\n            `\n          : null}\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-dialpad': SwUiDialpad;\n  }\n}\n","/**\n * Call Dialpad Component\n *\n * Wrapper around `sw-dialpad` that integrates with a Call.\n * When a call is connected, digit presses send DTMF tones.\n * When no call is active, the dial event bubbles up for the parent to handle.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <sw-call-dialpad></sw-call-dialpad>\n * <sw-call-dialpad .call=${call}></sw-call-dialpad>\n * <sw-call-dialpad show-call-button @sw-dial=${onDial}></sw-call-dialpad>\n * ```\n *\n * @csspart container    - Outer dialpad container.\n * @csspart display      - Number / text display field.\n * @csspart keypad       - Grid of digit keys.\n * @csspart key          - Individual digit button.\n * @csspart key-pressed  - Digit button while pressed.\n * @csspart call-button  - The call button (when `show-call-button`).\n *\n * @fires sw-digit-press - A digit was pressed. Detail: `{ digit: string, digits: string }`.\n * @fires sw-dial        - User pressed the call button. Detail: `{ digits: string }`.\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport './UI/controls/sw-ui-dialpad.js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-dialpad')\nexport class SwCallDialpad extends LitElement {\n  @consume({ context: callStateContext, subscribe: true })\n  @state()\n  private _callState?: CallState;\n\n  /** Explicit Call — when set, drives DTMF directly and bypasses context. */\n  @property({ type: Object }) call?: Call;\n\n  @state() private _directStatus: CallStatus | null = null;\n\n  private _directSubscriptions: Subscription[] = [];\n\n  /** Whether to display the call button below the keypad. */\n  @property({ type: Boolean, reflect: true, attribute: 'show-call-button' })\n  showCallButton = false;\n\n  /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). */\n  @property({ type: Boolean, reflect: true, attribute: 'allow-text' })\n  allowText = false;\n\n  /** Placeholder text shown in the digit display input. */\n  @property({ type: String })\n  placeholder = 'Enter number';\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('call')) {\n      this._directSubscriptions.forEach((s) => s.unsubscribe());\n      this._directSubscriptions = [];\n      this._directStatus = null;\n      if (this.call) {\n        this._directSubscriptions.push(\n          this.call.status$.subscribe((s) => (this._directStatus = s))\n        );\n      }\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._directSubscriptions.forEach((s) => s.unsubscribe());\n    this._directSubscriptions = [];\n  }\n\n  private _onDigitPress(e: CustomEvent<{ digit: string; digits: string }>) {\n    const { digit } = e.detail;\n    const status = this.call ? this._directStatus : this._callState?.status;\n    if (status !== 'connected') return;\n\n    const send = this.call\n      ? (d: string) => this.call!.sendDigits(d)\n      : this._callState?.sendDigits;\n    send?.(digit).catch((err: unknown) => {\n      logger.error('Failed to send DTMF:', err);\n    });\n  }\n\n  render() {\n    return html`\n      <sw-ui-dialpad\n        exportparts=\"container,display,keypad,key,key-pressed,call-button\"\n        ?show-call-button=${this.showCallButton}\n        ?allow-text=${this.allowText}\n        placeholder=${this.placeholder}\n        @sw-digit-press=${this._onDigitPress}\n      ></sw-ui-dialpad>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-dialpad': SwCallDialpad;\n  }\n}\n","import { createContext } from '@lit/context';\nimport type { TranscriptEntry } from '../components/UI/sw-ui-transcript-view.js';\n\nexport type { TranscriptEntry };\n\nexport interface TranscriptState {\n  entries: TranscriptEntry[];\n}\n\nexport const transcriptContext = createContext<TranscriptState>('transcript');\n","/**\n * ChatState — AI transcript FSM.\n *\n * Accumulates signaling events into a renderable chat history. The key\n * property is that an AI partial and a user partial can coexist (e.g. when\n * the user barges mid-response), and both are rendered — ordered by which\n * party spoke most recently.\n *\n * Event semantics:\n *   - `ai.response_utterance` → AI chunk; buffer into `_aiPartial`.\n *   - `ai.completion`         → AI finished. Promote partial to complete.\n *                                If `barged`, `lastSpoken` flips to user.\n *   - `ai.partial_result`     → User partial; replace `_userPartial`.\n *   - `ai.speech_detect`      → User finished. Promote partial (or insert\n *                                directly) with the server's final text.\n */\nexport type Speaker = 'ai' | 'user';\nexport type EntryState = 'partial' | 'complete';\n\nexport interface ChatEntry {\n  speaker: Speaker;\n  text: string;\n  state: EntryState;\n}\n\nexport class ChatState {\n  private _entries: ChatEntry[] = [];\n  private _aiPartial: ChatEntry | null = null;\n  private _userPartial: ChatEntry | null = null;\n  private _lastSpoken: Speaker | null = null;\n\n  /** Invoked after any state change. Overridable by consumers. */\n  public onUpdate: () => void = () => {};\n\n  /** Completed entries plus any live partials, in render order. */\n  public getHistory(): ChatEntry[] {\n    const out = [...this._entries];\n    if (this._aiPartial && this._userPartial) {\n      if (this._lastSpoken === 'user') {\n        out.push(this._aiPartial, this._userPartial);\n      } else {\n        out.push(this._userPartial, this._aiPartial);\n      }\n    } else if (this._aiPartial) {\n      out.push(this._aiPartial);\n    } else if (this._userPartial) {\n      out.push(this._userPartial);\n    }\n    return out;\n  }\n\n  public get hasAny(): boolean {\n    return (\n      this._entries.length > 0 ||\n      this._aiPartial !== null ||\n      this._userPartial !== null\n    );\n  }\n\n  public get lastSpoken(): Speaker | null {\n    return this._lastSpoken;\n  }\n\n  public reset(): void {\n    this._entries = [];\n    this._aiPartial = null;\n    this._userPartial = null;\n    this._lastSpoken = null;\n    this.onUpdate();\n  }\n\n  public onUserPartial(text: string): void {\n    if (!text) return;\n    this._userPartial = { speaker: 'user', text, state: 'partial' };\n    this._lastSpoken = 'user';\n    this.onUpdate();\n  }\n\n  public onUserComplete(text: string): void {\n    if (!text) {\n      // No final text — drop any lingering partial silently.\n      this._userPartial = null;\n      this.onUpdate();\n      return;\n    }\n    this._entries = [\n      ...this._entries,\n      { speaker: 'user', text, state: 'complete' },\n    ];\n    this._userPartial = null;\n    this._lastSpoken = 'user';\n    this.onUpdate();\n  }\n\n  public onAiChunk(text: string): void {\n    if (!text) return;\n    if (!this._aiPartial) {\n      this._aiPartial = { speaker: 'ai', text, state: 'partial' };\n    } else {\n      const merged = `${this._aiPartial.text} ${text}`\n        .replace(/\\s+/g, ' ')\n        .trim();\n      this._aiPartial = { ...this._aiPartial, text: merged };\n    }\n    this._lastSpoken = 'ai';\n    this.onUpdate();\n  }\n\n  public onAiComplete(text: string, barged: boolean): void {\n    if (this._aiPartial) {\n      const finalText = text.length > 0 ? text : this._aiPartial.text;\n      this._entries = [\n        ...this._entries,\n        { speaker: 'ai', text: finalText, state: 'complete' },\n      ];\n      this._aiPartial = null;\n    } else if (text.length > 0) {\n      this._entries = [\n        ...this._entries,\n        { speaker: 'ai', text, state: 'complete' },\n      ];\n    }\n    this._lastSpoken = barged ? 'user' : 'ai';\n    this.onUpdate();\n  }\n}\n","import type { ReactiveController, LitElement } from 'lit';\nimport { ContextProvider } from '@lit/context';\nimport type { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport { transcriptContext } from './transcript-context.js';\nimport type { TranscriptEntry, TranscriptState } from './transcript-context.js';\nimport { ChatState } from './chat-state.js';\nimport type { ChatEntry } from './chat-state.js';\n\nconst logger = getLogger();\n\n/**\n * AI signaling events the transcript FSM consumes. `user_event` is\n * intentionally excluded — it's owned by `UserEventController`.\n */\nconst AI_EVENT_TYPES = [\n  'ai.partial_result',\n  'ai.speech_detect',\n  'ai.response_utterance',\n  'ai.completion',\n] as const;\n\ntype AiEventType = (typeof AI_EVENT_TYPES)[number];\n\n/** Strip `{confidence=0.95}` markers the backend sometimes appends to ASR text. */\nfunction stripConfidence(text: string): string {\n  return text.replace(/\\s*\\{confidence=[\\d.]+\\}\\s*/g, '').trim();\n}\n\nfunction asString(v: unknown): string {\n  return typeof v === 'string' ? v : '';\n}\n\n/**\n * Reactive controller that turns AI signaling events from a Call into\n * rendered transcript entries via `transcriptContext`.\n *\n * - `setCall(call)` binds/unbinds the FSM to a call's event streams.\n * - `injectEntry(entry)` appends an externally-sourced entry (e.g. a\n *   `display_content` system bubble pushed by `UserEventController`).\n */\nexport class TranscriptController implements ReactiveController {\n  private _host: LitElement;\n  private _provider: ContextProvider<typeof transcriptContext>;\n  private _chat = new ChatState();\n  private _injected: TranscriptEntry[] = [];\n  private _subscriptions: Subscription[] = [];\n\n  constructor(host: LitElement) {\n    this._host = host;\n    this._provider = new ContextProvider(host, {\n      context: transcriptContext,\n      initialValue: { entries: [] },\n    });\n\n    this._chat.onUpdate = () => this._publish();\n    host.addController(this);\n  }\n\n  hostConnected(): void {}\n\n  hostDisconnected(): void {\n    this._teardownSubscriptions();\n  }\n\n  setCall(call: Call | undefined): void {\n    this._teardownSubscriptions();\n    this._chat.reset();\n    this._injected = [];\n    this._publish();\n\n    if (!call) return;\n\n    for (const eventType of AI_EVENT_TYPES) {\n      const sub = call.subscribe(eventType).subscribe({\n        next: (event) => {\n          try {\n            this._route(eventType, this._extractParams(event));\n          } catch (err) {\n            logger.warn(`[TranscriptController] handler for ${eventType} threw`, err);\n          }\n        },\n        error: (err) => {\n          logger.warn(`[TranscriptController] subscription error on ${eventType}`, err);\n        },\n      });\n      this._subscriptions = [...this._subscriptions, sub];\n    }\n  }\n\n  get state(): TranscriptState {\n    return this._provider.value;\n  }\n\n  /** Append an externally-sourced entry (used by UserEventController for display_content). */\n  injectEntry(entry: TranscriptEntry): void {\n    this._injected = [...this._injected, entry];\n    this._publish();\n  }\n\n  private _extractParams(event: Record<string, unknown>): Record<string, unknown> {\n    const params = event['params'];\n    if (params && typeof params === 'object') {\n      return params as Record<string, unknown>;\n    }\n    return event;\n  }\n\n  private _route(eventType: AiEventType, params: Record<string, unknown>): void {\n    switch (eventType) {\n      case 'ai.partial_result':\n        this._chat.onUserPartial(asString(params['text']));\n        break;\n      case 'ai.speech_detect': {\n        const text = stripConfidence(asString(params['text']));\n        this._chat.onUserComplete(text);\n        break;\n      }\n      case 'ai.response_utterance': {\n        const text = asString(params['utterance'] ?? params['text']);\n        this._chat.onAiChunk(TranscriptController._stripVoiceDirectives(text));\n        break;\n      }\n      case 'ai.completion': {\n        const text = asString(params['text']);\n        this._chat.onAiComplete(\n          TranscriptController._stripVoiceDirectives(text),\n          params['type'] === 'barged'\n        );\n        break;\n      }\n    }\n  }\n\n  private _teardownSubscriptions(): void {\n    for (const sub of this._subscriptions) {\n      try {\n        sub.unsubscribe();\n      } catch {\n        /* noop */\n      }\n    }\n    this._subscriptions = [];\n  }\n\n  private static _stripVoiceDirectives(text: string): string {\n    // TTS directives look like ~LN(English (United States))-; and can appear either\n    // at the start (\"~LN(...)-; actual text\") or in the middle when the server appends\n    // the same text again for the TTS engine (\"actual text ~LN(...)-; repeated text\").\n    const match = /\\s*~[A-Z]+\\(.*?\\)-;\\s*/i.exec(text);\n    if (!match) return text.trim();\n    const before = text.slice(0, match.index).trim();\n    const after = text.slice(match.index + match[0].length).trim();\n    return (before || after).trim();\n  }\n\n  private _toTranscriptEntry(entry: ChatEntry, index: number): TranscriptEntry {\n    return {\n      id: `chat-${index}-${entry.speaker}-${entry.state}`,\n      type: entry.speaker === 'ai' ? 'agent' : 'user',\n      state: entry.state,\n      text: entry.text,\n    };\n  }\n\n  private _publish(): void {\n    const chatEntries = this._chat\n      .getHistory()\n      .map((e, i) => this._toTranscriptEntry(e, i));\n    const entries = [...chatEntries, ...this._injected];\n    this._provider.setValue({ entries });\n    this._host.requestUpdate();\n  }\n}\n","import type { ReactiveController, LitElement } from 'lit';\nimport type { Subscription } from 'rxjs';\nimport { getLogger } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport type { DisplayContentPayload } from '../components/UI/layout/sw-ui-content-drawer.js';\n\nconst logger = getLogger();\nconst USER_EVENT_TYPE = 'user_event';\nconst ALLOWED_FORMATS = ['text', 'markdown', 'code', 'html'] as const;\ntype AllowedFormat = (typeof ALLOWED_FORMATS)[number];\n\nfunction asFormat(v: unknown): AllowedFormat {\n  return (ALLOWED_FORMATS as readonly string[]).includes(v as string)\n    ? (v as AllowedFormat)\n    : 'text';\n}\n\n/**\n * Raw shape of the params object inside a `user_event` signaling event.\n * The `type` field routes to either the content drawer or the pass-through.\n */\ninterface UserEventParams extends Record<string, unknown> {\n  type?: string;\n}\n\n/**\n * Reactive controller that subscribes to `user_event` on a Call and routes\n * each event by its `type` field:\n *\n * - `display_content` → dispatches `sw-display-content` on the host so the\n *   call-widget can open the content drawer.\n *\n * - everything else   → dispatches `signalwire-address:event` on the host\n *   so the embedding page can handle custom agent events.\n *\n * Always active once `setCall()` is called — no opt-in required.\n */\nexport class UserEventController implements ReactiveController {\n  private _host: LitElement;\n  private _subscription?: Subscription;\n\n  constructor(host: LitElement) {\n    this._host = host;\n    host.addController(this);\n  }\n\n  hostConnected(): void {}\n\n  hostDisconnected(): void {\n    this._subscription?.unsubscribe();\n    this._subscription = undefined;\n  }\n\n  setCall(call: Call | undefined): void {\n    this._subscription?.unsubscribe();\n    this._subscription = undefined;\n\n    if (!call) return;\n\n    this._subscription = call.subscribe(USER_EVENT_TYPE).subscribe((event) => {\n      logger.debug('[UserEventController] user_event arrived', event);\n      const params = event['params'] as UserEventParams | undefined;\n      if (!params) return;\n      this._route(params);\n    });\n  }\n\n  private _route(params: UserEventParams): void {\n    if (params.type === 'display_content') {\n      this._handleDisplayContent(params);\n    } else {\n      this._handlePassThrough(params);\n    }\n  }\n\n  private _handleDisplayContent(params: UserEventParams): void {\n    const payload: DisplayContentPayload = {\n      content: (params['content'] as string | undefined) ?? '',\n      format: asFormat(params['format']),\n      title: params['title'] as string | undefined,\n      language: params['language'] as string | undefined,\n    };\n\n    this._host.dispatchEvent(\n      new CustomEvent<DisplayContentPayload>('sw-display-content', {\n        detail: payload,\n        bubbles: true,\n        composed: true,\n      })\n    );\n  }\n\n  private _handlePassThrough(params: UserEventParams): void {\n    this._host.dispatchEvent(\n      new CustomEvent('signalwire-address:event', {\n        detail: params,\n        bubbles: true,\n        composed: true,\n      })\n    );\n  }\n}\n","import { LitElement, css, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport '../icons/sw-ui-icon.js';\n\n/**\n * Fluid call layout that adapts to any container shape.\n *\n * Uses the container's **aspect ratio** (not just width) to decide whether\n * the transcript pane sits beside the video (landscape) or below it\n * (portrait / narrow). The video area is always maximised.\n *\n * ```\n * Wide (landscape):                Narrow (portrait):\n * ┌────────────────┬─────────┐    ┌─────────────────┐\n * │     VIDEO      │ TRANSCR │    │      VIDEO       │\n * │  (maximised)   │ (side)  │    │   (maximised)    │\n * ├────────────────┴─────────┤    ├──────────────────┤\n * │        CONTROLS           │    │    CONTROLS      │\n * └──────────────────────────┘    ├──────────────────┤\n *                                  │    TRANSCRIPT    │\n *                                  └──────────────────┘\n * ```\n *\n * @slot video            - main video content\n * @slot background       - element behind the video (e.g. `<sw-ui-background>`)\n * @slot floating-video   - picture-in-picture overlay (absolute, bottom-right)\n * @slot controls         - control bar beneath the video\n * @slot transcript       - transcript panel (side or bottom)\n *\n * @prop {boolean} transcript - show / hide the transcript pane\n * @prop {boolean} loading    - show a spinner overlay on the video area\n * @prop {boolean} shadow     - apply a drop shadow to the host\n * @prop {boolean} fullscreen - (read-only) reflects the current fullscreen state\n *\n * @method toggleTranscript()  - flip the transcript pane open / closed\n * @method toggleFullscreen()  - enter or exit fullscreen\n * @method requestFullscreen() - inherited, enters fullscreen\n * @method exitFullscreen()    - static, exits fullscreen\n *\n * @cssprop --sw-call-layout-radius [0]                   - border-radius on external corners\n * @cssprop --sw-call-layout-shadow                     - box-shadow when `shadow` is set\n * @cssprop --sw-call-layout-loading-bg [rgba(0,0,0,0.6)]    - loading overlay background\n * @cssprop --loading-spinner-size [48]        - spinner icon size (px, number)\n * @cssprop --sw-call-layout-transcript-transition [350ms ease-in-out] - open/close transition\n * @cssprop --sw-call-layout-pip-width [clamp(100px, 20%, 200px)]  - PiP container width\n * @cssprop --sw-call-layout-pip-radius [8px]               - PiP border-radius\n * @cssprop --sw-call-layout-pip-shadow [0 2px 8px rgba(0,0,0,0.5)] - PiP box-shadow\n * @cssprop --sw-call-layout-pip-bottom [12px]              - PiP offset from bottom\n * @cssprop --sw-call-layout-pip-right [12px]               - PiP offset from right\n */\n@customElement('sw-ui-call-layout')\nexport class SwUiCallLayout extends LitElement {\n  @property({ type: Boolean, reflect: true }) transcript = false;\n  @property({ type: Boolean, reflect: true }) loading = false;\n  @property({ type: Boolean, reflect: true }) shadow = false;\n  @state() private _fullscreen = false;\n\n  /** Reflects as an attribute so CSS can target `:host([fullscreen])`. */\n  get fullscreen(): boolean {\n    return this._fullscreen;\n  }\n\n  toggleTranscript(): void {\n    this.transcript = !this.transcript;\n  }\n\n  toggleFullscreen(): void {\n    if (document.fullscreenElement) {\n      document.exitFullscreen().catch(() => {});\n    } else {\n      this.requestFullscreen().catch(() => {});\n    }\n  }\n\n  private _onFullscreenChange = (): void => {\n    const isFs = document.fullscreenElement === this;\n    if (this._fullscreen !== isFs) {\n      this._fullscreen = isFs;\n      if (isFs) {\n        this.setAttribute('fullscreen', '');\n      } else {\n        this.removeAttribute('fullscreen');\n      }\n    }\n  };\n\n  connectedCallback(): void {\n    super.connectedCallback();\n    document.addEventListener('fullscreenchange', this._onFullscreenChange);\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    document.removeEventListener('fullscreenchange', this._onFullscreenChange);\n  }\n\n  static styles = css`\n    /* ================================================================== *\n     *  HOST                                                              *\n     * ================================================================== */\n    :host {\n      display: block;\n      width: 100%;\n      height: 100%;\n      border-radius: var(--sw-call-layout-radius, var(--radius-md));\n      overflow: hidden;\n      font-family: var(--type-family-body);\n      container-type: size;\n    }\n\n    :host([shadow]) {\n      box-shadow: var(--sw-call-layout-shadow, var(--shadow-md));\n    }\n\n    /* ================================================================== *\n     *  FULLSCREEN                                                        *\n     * ================================================================== */\n    :host([fullscreen]) {\n      border-radius: 0;\n      box-shadow: none;\n      width: 100vw;\n      height: 100vh;\n      background: black;\n    }\n\n    /* ================================================================== *\n     *  GRID — wide (landscape) default                                   *\n     * ================================================================== */\n    .root {\n      display: grid;\n      height: 100%;\n      grid-template-rows: 1fr auto;\n      grid-template-columns: 1fr 0fr;\n      grid-template-areas:\n        'video transcript'\n        'controls controls';\n    }\n\n    :host([transcript]) .root {\n      grid-template-columns: 1fr minmax(180px, 0.25fr);\n    }\n\n    /* ================================================================== *\n     *  VIDEO AREA                                                        *\n     * ================================================================== */\n    .video {\n      grid-area: video;\n      display: grid;\n      grid-template: 1fr / 1fr;\n      position: relative;\n      overflow: hidden;\n      min-height: 0;\n      min-width: 0;\n    }\n\n    /* ── Background layer ───────────────────────────────────────────── */\n    slot[name='background'] {\n      display: contents;\n    }\n\n    ::slotted([slot='background']) {\n      grid-area: 1 / 1;\n      z-index: 0;\n      overflow: hidden;\n    }\n\n    /* ── Video content layer ────────────────────────────────────────── */\n    .video-content {\n      grid-area: 1 / 1;\n      z-index: 1;\n      min-height: 0;\n      min-width: 0;\n    }\n\n    /* ── Floating PiP ───────────────────────────────────────────────── */\n    .floating-video {\n      position: absolute;\n      bottom: var(--sw-call-layout-pip-bottom, 12px);\n      right: var(--sw-call-layout-pip-right, 12px);\n      width: var(--sw-call-layout-pip-width, clamp(80px, 20%, 200px));\n      max-width: calc(100% - var(--sw-call-layout-pip-right, 12px) * 2);\n      max-height: calc(100% - var(--sw-call-layout-pip-bottom, 12px) * 2);\n      border-radius: var(--sw-call-layout-pip-radius, var(--radius-md));\n      box-shadow: var(--sw-call-layout-pip-shadow, var(--shadow-md));\n      overflow: hidden;\n      z-index: 3;\n    }\n\n    /* ── Loading overlay ────────────────────────────────────────────── */\n    .loading-overlay {\n      grid-area: 1 / 1;\n      z-index: 4;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      background: var(--sw-call-layout-loading-bg, rgba(0, 0, 0, 0.6));\n    }\n\n    .spinner {\n      animation: spin 1s linear infinite;\n      color: rgba(255, 255, 255, 0.85);\n    }\n\n    @keyframes spin {\n      to {\n        transform: rotate(360deg);\n      }\n    }\n\n    /* ================================================================== *\n     *  CONTROLS                                                          *\n     * ================================================================== */\n    .controls {\n      grid-area: controls;\n      position: relative;\n      z-index: 10;\n      overflow: visible;\n      min-width: 0;\n    }\n\n    /* ================================================================== *\n     *  TRANSCRIPT PANE                                                   *\n     * ================================================================== */\n    .transcript-pane {\n      grid-area: transcript;\n      overflow: hidden;\n      min-width: 0;\n      min-height: 0;\n\n      /* Animate width via grid + clip the overflow during collapse */\n      transition: opacity 350ms ease-in-out;\n      opacity: 0;\n    }\n\n    :host([transcript]) .transcript-pane {\n      opacity: 1;\n    }\n\n    .transcript-inner {\n      height: 100%;\n      width: 100%;\n      overflow: hidden;\n      display: flex;\n      flex-direction: column;\n    }\n\n    /* ================================================================== *\n     *  NARROW / PORTRAIT — aspect-ratio <= ~4:3                          *\n     * ================================================================== */\n    @container (max-aspect-ratio: 4/3) {\n      .root {\n        grid-template-rows: 1fr auto 0fr;\n        grid-template-columns: 1fr;\n        grid-template-areas:\n          'video'\n          'controls'\n          'transcript';\n      }\n\n      /* Cap the video so it doesn't hog all space — leave room for\n         transcript.  minmax(0, 3fr) keeps the video dominant but allows\n         the transcript row to claim meaningful space. */\n      :host([transcript]) .root {\n        grid-template-columns: 1fr;\n        grid-template-rows: minmax(0, 3fr) auto minmax(120px, 2fr);\n      }\n    }\n\n    /* ================================================================== *\n     *  VERY WIDE — show transcript narrower                              *\n     * ================================================================== */\n    @container (min-aspect-ratio: 21/9) {\n      :host([transcript]) .root {\n        grid-template-columns: 1fr minmax(160px, 0.15fr);\n      }\n    }\n\n    /* ================================================================== *\n     *  TINY CONTAINER GUARDS                                             *\n     * ================================================================== */\n    @container (max-width: 240px) {\n      .floating-video {\n        display: none;\n      }\n    }\n\n    @container (max-width: 200px), (max-height: 200px) {\n      .transcript-pane {\n        display: none;\n      }\n    }\n  `;\n\n  render() {\n    return html`\n      <div class=\"root\">\n        <div class=\"video\">\n          <slot name=\"background\"></slot>\n          <div class=\"video-content\">\n            <slot name=\"video\"></slot>\n          </div>\n          <div class=\"floating-video\">\n            <slot name=\"floating-video\"></slot>\n          </div>\n          ${this.loading\n            ? html`<div class=\"loading-overlay\">\n                <sw-ui-icon\n                  class=\"spinner\"\n                  name=\"spinner\"\n                  .size=${48}\n                ></sw-ui-icon>\n              </div>`\n            : nothing}\n        </div>\n        <div class=\"controls\">\n          <slot name=\"controls\"></slot>\n        </div>\n        <div class=\"transcript-pane\">\n          <div class=\"transcript-inner\">\n            <slot name=\"transcript\"></slot>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-call-layout': SwUiCallLayout;\n  }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\n/**\n * Resizes itself to an appropriate modal size based on viewport size\n * @slot items to hold inside responsive modal\n */\n@customElement('sw-ui-responsive-container')\nexport class SwUiResponsiveContainer extends LitElement {\n  static styles = css`\n    .container {\n      margin: 0 auto;\n\n      /* Default: small monitors */\n      width: 90vw;\n\n      /* Maintain 16:9 baseline */\n      aspect-ratio: 16 / 9;\n\n      /* Height cap: (16/9 height) + 300px */\n      max-height: calc((100vw * 9 / 16) + 300px);\n\n      /* Prevent overflow issues */\n      overflow: hidden;\n    }\n\n    /* 1. Larger monitors (MacBook Air 13\" and up ~1280px+) */\n    @media (min-width: 1280px) {\n      .container {\n        width: 80vw;\n\n        /* Adjust cap relative to actual width */\n        max-height: calc((80vw * 9 / 16) + 300px);\n      }\n    }\n\n    /* 3. Mobile devices (portrait) */\n    @media (max-width: 600px) {\n      .container {\n        width: calc(100vw - 40px);\n\n        aspect-ratio: auto; /* let it flow naturally */\n        max-height: none;\n        height: 85svh;\n      }\n    }\n\n    /* 4. Edge cases: very small but not mobile (e.g., 500x400, landscape phones) */\n    @media (max-height: 500px) and (min-width: 600px) {\n      .container {\n        width: 90vw;\n\n        /* Cap height more aggressively */\n        max-height: 90vh;\n\n        /* Drop strict aspect ratio if needed */\n        aspect-ratio: auto;\n      }\n    }\n\n    /* Optional: landscape phones treated like small monitors */\n    @media (max-width: 900px) and (orientation: landscape) {\n      .container {\n        width: 90vw;\n        max-height: 90vh;\n      }\n    }\n  `;\n\n  render() {\n    return html`<div class=\"container\"><slot></slot></div>`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-responsive-container': SwUiResponsiveContainer;\n  }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\n/**\n * Wrap elements with this to make them modal.\n *\n * @slot   - Dialog content.\n * @fires sw-modal-close - Cancelable. Fired on ESC or backdrop click; call\n *                         `preventDefault()` to keep the modal open.\n */\n\n@customElement('sw-ui-modal')\nexport class SwUiModal extends LitElement {\n  static styles = css`\n    :host {\n      --sw-modal-duration: 0.2s;\n      --sw-modal-animation: bounce-in var(--sw-modal-duration) ease-out;\n      --sw-modal-close-animation: bounce-out var(--sw-modal-duration) ease-out;\n      --sw-modal-backdrop-animation: backdrop-in var(--sw-modal-duration) ease-out;\n      --sw-modal-backdrop-close-animation: backdrop-out var(--sw-modal-duration) ease-out;\n    }\n    dialog {\n      border: none;\n      padding: 0;\n      background: transparent;\n      animation: var(--sw-modal-animation);\n      animation-fill-mode: backwards;\n    }\n\n    dialog::backdrop {\n      background: rgba(0, 0, 0, 0.5);\n      animation: var(--sw-modal-backdrop-animation);\n    }\n\n    @keyframes bounce-in {\n      from {\n        opacity: 0;\n        transform: scale(0.8) translateY(20px);\n      }\n      30% {\n        opacity: 1;\n      }\n      70% {\n        transform: scale(1.1) translateY(-5px);\n      }\n      to {\n        transform: scale(1) translateY(0);\n      }\n    }\n    @keyframes slide-up {\n      from {\n        transform: translateY(1000px);\n      }\n\n      to {\n        transform: translateY(0);\n      }\n    }\n\n    @keyframes backdrop-in {\n      from {\n        opacity: 0;\n      }\n      to {\n        opacity: 1;\n      }\n    }\n\n    @keyframes bounce-out {\n      from {\n        opacity: 1;\n        transform: scale(1) translateY(0);\n      }\n      30% {\n        transform: scale(1.1) translateY(-5px);\n      }\n      70% {\n        opacity: 1;\n      }\n      to {\n        opacity: 0;\n        transform: scale(0.8) translateY(20px);\n      }\n    }\n\n    @keyframes backdrop-out {\n      from {\n        opacity: 1;\n      }\n      to {\n        opacity: 0;\n      }\n    }\n\n    dialog.closing {\n      animation: var(--sw-modal-close-animation);\n    }\n\n    dialog.closing::backdrop {\n      animation: var(--sw-modal-backdrop-close-animation);\n    }\n  `;\n\n  @property({ type: Boolean, reflect: true })\n  open = false;\n\n  @query('dialog')\n  private dialog!: HTMLDialogElement;\n\n  private _savedOverflow: string | null = null;\n\n  updated(changed: Map<string, unknown>) {\n    if (changed.has('open')) {\n      if (this.open) {\n        this._savedOverflow = document.body.style.overflow;\n        this.dialog.showModal();\n        document.body.style.overflow = 'hidden';\n      } else if (this.dialog.open) {\n        this._animateClose();\n      }\n    }\n  }\n\n  private _animateClose(): void {\n    this.dialog.classList.add('closing');\n    const onClose = (e: AnimationEvent) => {\n      if (e.target !== this.dialog) return;\n      this.dialog.removeEventListener('animationend', onClose);\n      this.dialog.classList.remove('closing');\n      this.dialog.close();\n      if (this._savedOverflow !== null) {\n        document.body.style.overflow = this._savedOverflow;\n        this._savedOverflow = null;\n      }\n    };\n    this.dialog.addEventListener('animationend', onClose);\n  }\n\n  /** ESC key — intercept native close and route through `_requestClose`. */\n  private _handleCancel = (e: Event): void => {\n    e.preventDefault();\n    this._requestClose();\n  };\n\n  /** Backdrop click — the `<dialog>` itself is the backdrop target. */\n  private _handleBackdropClick = (e: MouseEvent): void => {\n    if (e.target === this.dialog) {\n      this._requestClose();\n    }\n  };\n\n  /** Dispatch a cancelable `sw-modal-close`; only close if not prevented. */\n  private _requestClose(): void {\n    const ev = new CustomEvent('sw-modal-close', {\n      bubbles: true,\n      composed: true,\n      cancelable: true,\n    });\n    if (this.dispatchEvent(ev)) {\n      this.open = false;\n    }\n  }\n\n  connectedCallback(): void {\n    super.connectedCallback();\n    this.updateComplete.then(() => {\n      this.dialog.addEventListener('cancel', this._handleCancel);\n      this.dialog.addEventListener('click', this._handleBackdropClick);\n    });\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    this.dialog.removeEventListener('cancel', this._handleCancel);\n    this.dialog.removeEventListener('click', this._handleBackdropClick);\n  }\n\n  render() {\n    return html`<dialog part=\"dialog backdrop\">\n      <div part=\"panel\"><slot></slot></div>\n    </dialog>`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-modal': SwUiModal;\n  }\n}\n","import{noChange as t}from\"../lit-html.js\";import{directive as e,Directive as r,PartType as s}from\"../directive.js\";\n/**\n * @license\n * Copyright 2018 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const n=\"important\",i=\" !\"+n,o=e(class extends r{constructor(t){if(super(t),t.type!==s.ATTRIBUTE||\"style\"!==t.name||t.strings?.length>2)throw Error(\"The `styleMap` directive must be used in the `style` attribute and must be the only part in the attribute.\")}render(t){return Object.keys(t).reduce(((e,r)=>{const s=t[r];return null==s?e:e+`${r=r.includes(\"-\")?r:r.replace(/(?:^(webkit|moz|ms|o)|)(?=[A-Z])/g,\"-$&\").toLowerCase()}:${s};`}),\"\")}update(e,[r]){const{style:s}=e.element;if(void 0===this.ft)return this.ft=new Set(Object.keys(r)),this.render(r);for(const t of this.ft)null==r[t]&&(this.ft.delete(t),t.includes(\"-\")?s.removeProperty(t):s[t]=null);for(const t in r){const e=r[t];if(null!=e){this.ft.add(t);const r=\"string\"==typeof e&&e.endsWith(i);t.includes(\"-\")||r?s.setProperty(t,r?e.slice(0,-11):e,r?n:\"\"):s[t]=e}}return t}});export{o as styleMap};\n//# sourceMappingURL=style-map.js.map\n","export default \"data:image/webp;base64,UklGRrhbAgBXRUJQVlA4IKxbAgDQpAydASpgC2AGPpFInkwlpDAtIpRJAgASCWdu3Pzez/bHz/88sJ45W///ZR+jzp///mf/3enzz9/+vPD///Rh/W///e/uRfwr/v9ZR7qOXqXy78vyyI/5X/sfYC/XD04s8ygH/p/Sry0+k/5sTgGKy4vVn5PSh8s+acg//T5MfUeVH7z/m+c7/0+qj+Mf7H2Cv4j/Of1q/y/wg/9nsF/er1Nfu3+9Hvv+oj/ueoz/u/T79Tf/z+pF5wf/3/eX/6/K3/Xv+n+8X/w+Rf9hf//7AH//9vH+Af//rd/YvM19e/xf+r4//pn5j/P9njuf85v1n+l/5v9v6q/1X87f2P8H/mvg3/p/+vwX+e/+7/mv9B7gv4v/LP91/cPa/72/8H/R+EtdT/zf632Bfa37L/4P8r/q/goms/ouoD/a/TDvff3P/j9gH9jesX/uf/r/j/nX7jP2P/b//j/ffAJ+vv/n/zXt1////6fC396v///6PiH/eP///+UH5S/azFl+z5k9SAgAAo3B+hOJGW/WAUTV43dbIyU8iyHhEA88Ysv33Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3Be4L3BeMiCgRUnPB/MN4SwE0Mf5nP/utPcE3XLfwm1CPn0Zkocz4JfjMy/VQvdupkZGMWZj8GgPQcM2ZJSBjNt/yOXaLcdBRwypUeJGuHe720MxZEMpoG0REO+NncrBB0NN+ZBZDweSycx7NsQC+Krj+cuLXaiebxXoQnpHnZ6F7gvcF7gvcF/E3UbsfqvkPaxuEOn5glre1ouFJ00a/RQVKe1CvAgPx0KPu3TdEWQ8JmeFl++7Xmj52i+meKSS9mR/gX78FYSLPwTLOtPhXqOj1UfIqjdWFm89HlwkGudIXtWIsJHoxB7P9XnZPOhe3+ju7YK5+DEpFV81TIeExeMDl7gvcFdPZknjGue38HrHTgbCDg9SLVYDZqMfivIjX2Kr6EOpbK2yem6Qvm+L18OVcWTeUeYX4m68qQWx6VW6uzJPGLJ2mT0gwY2tSHTu6J/kiqkXO05TSXcF+WvwewKOZ+wsIAPZ64a3/KZ0JtXMgRb8IgKk3TNsixMll+25+h34KQxlTbCrzrz2SykFq6F7gvyNZkWQ8bq7YgHw5F8IogqaU9OSezdPu4F02L+jI1tpd2H43tP7KiOioY6Lq+TysztQ0dM9G+7fQdmg26SYkcOVqsd8kd6IIB8H9wXuDw+DKVEMvqEAI96degwWtQLN3yTT1tbB472YPAwW9v9LW2ys/TzxoCZtkUzEY41nRsixNPZg8Ysv2z0XuC9wXuJVNrz+JffeNACqCx8kgtGyLIfm9P8nV5vB6JwTxjuHsWiMZuLhtCl0bJfXZFkRItRCM0LwIUOXc1whrh5jeHZ6VywALvpDzxoEDl7ViDtS49PZgBqzIsgx7Z33Be39zlDIshzDZ7Vl7g0FtTRCdZH3FM/59+TN3d5aC+QPdjLjXdtjst9RTyueWm4xZcWXQqeZFZej4CpNzwZcAALPihMBPT8Fh0FqGW+bZFkP1siMjDWOWrZcqZssAAPRTjA30tZlUgx9m2IB326NRYmSy/be2QWQXTX3Be4L2q9lE88al22/Ow2GTdgKeh/azxom5c6PlkX6vzUX43G668BYKCA3H6eNdAW0ZiSMZH9waDiLoX5G0nAvOkXumYOzPGLHsGkD77jaga0ku9cnTB7hakjMNb82yBEPySy/fawHnYfygn4k3iUbyeMFvanJFEWQXTX8kEFkPCMQ4t79F5rAcTjBghK/AdXd1bfjIKF7JBRYdEBL3AvrV44vOKI6A2NGogyMDemf5QNE9FJtADtm2oFYvM+gAiwjz+W41MffzPe42Fm9g+gzI35ZJvUT6+QMTJpV2XSHGOwsZZ2mKPnO6rirofN5C60edhu8MWFgcvdud1Xkpfo1FkOY5h5kpJch4RBApgs5ArDfBCwf1uWr1NtA16zLfW7tVq+v2Umwpynd3v9wV7YrX96kBFuPmKO9GVHP0wI3GpIFQuHrpxNB+4bZHRZ87WekcLTVbVVm0ConnkXj2LxYtA+WuWxfHu3aKgsv34ONmn7aefAc6Y/a9dasUIT+NQN/DV4ppIgUtKbVWPT8z1ZuzEC2/3ABObIul/FDdotj5Mb+KpB2qM1mQHoweMWX77gvcF5KjARD+R0NBbUz17oeGNdQUgUlBjqWxOLxD442gjGIXFhg4c6LSTpvZ85ptK7g0FMXeLqfiy/fgmX77uL8k83NiMen9JIOa4l4g/vVMT8JEcF+Gmu7Jg8al3Lbcs43JfLY/71jvnFftfu+sMYIlxqB6UIG7gvJUWZOQtE7/Jz2rEGPunICgPN83h2XtWIMfdOWH18D7pntHmIhyXRMluyAO3Ia+mRjWcyyFOhS+i2GmUf0nrFMB3Vyz0yzwb1D+abtijC62QlaRTqZ4YsoEQWX77gvcF+WYuiZAklC+khrCinuy/LWgInXh3+dbCVSPzoO5mlIYB3gcZxPhTvVhXdwQgo9VNnFGqBFuNOlwsNjsqwFaA+rnwxomxXMGgJLQxzu7xWfrNKHhEA77dGosh8TwW9qxBlVmywALIeLeDfN3fcNsrP9QGZ1F/s0qtvmY3xOYSXmcKkMPZ0fdtpnVOKArUpzUqBiOF7ZlqD3loneT/JeLEgw7JFON4fbH5VAThnxhGL31x2p/3NJ6NBcIcRH75ZZR2qlEJxYZOHdhyuVIrY5ZVM/lV9QDhXd9T6ATm27sxBuAgH9uFtQ/9tibqkJFiBAm5MO54oTaN0zCoSP0aiyC6+zbIERBAPN83d/JBVDvxC0TzxjWXCEerAPa91C8hEXKB5Uj8r1JEGeyeN+TgE4JnEQiyZStPfvMLDcksA7WeBaYWvCuQYU7MMNp9m9DNTUk3j403mhO0WT0EUQGWSDCHeL4vcpJZ1MU9/0OTOxOpbCjycJtourXiwRs0SffMpeR2VARA1V6m2mQFSQ/RFlxOz2+nJ8Bm8eF7Ut3s2ZD3uG5XzsLhTRErD8yE1euIptf6mPVNft+l6iYrfNOEdejZJlKxjUXxQjZFiaezBvm8hcybGBy9waCip2aH6imRZal59zTwmwUDHSui8Ncdvamknup6PN2zFb01XGUfAMk2UsPugmrT3BgGsKxv/R9g9/iBHoE4J7zUAeS0rQAWWc+He8H5E839bDvct0QAjVaLI8JAQIDrMQFIYCoVEf1Q1fs/GjMJrHvDEdM9o2TDJa27WnTWUIqEaNMpFt5Q+oc0Z8AiD4nj2lqIayIWREnJ79Xkzl/2RAAsgxzGLL9t7NmRahGyKVnhiy/fcG2P1ScJ2RZaqpaeEq+blLyUS8Zwjk05OiAjZ2IcgskZ8o3kTZ+nwNvWEWBadWDEl28m5d1ga1TtW8wmTtIW+7kMVX8Kteqa+tBXoHuv3+swAUy7s7Cl0M4T4rNy5XDxvZbbTT8c/nNWTAl6BjFp4ZOXTHXhfJ2RCWe7n8uXawawHnMJa0kgrL2NujU1RgcvIcACyHg8p7Kg9MMDl7U5IRsizLVEwQtFLwsv2z0XjAKSUL3CJDJ1PpbEfYM9B+rtmfNhfE+zyd2XgWZTVT+Za3gH9PGoDZ54x3UJOOCSOqZBCZXcP1RLT3FS3qDsSlfjL9us56XZRaaCzxqHmx8WEBa1bUImBDHhzqvGPDD+fCW0fv1//35brIpwxcSyb2HygulcrMIM4qjo1n29eSf85cWAosh33JjD7nbCr1LlnwX7+SCCxJ4Le4bbbL3bEl0WXJr2PnQWe3B70pcaE9P8s/zlK0w3/O7MoQvzR1zGDrCrnSeFI5e4L2k89KnBglwV0JY4bkd/JsS0QCC7SP7zQMhTJqQldQMFM7zruDtHQYmD+Ms3L23bSiiMZcLSooA3rQlenW5xSA0nq2HsslC/I1iwABEPyTBrDlDdc39E7Ve5gqQ88YsI4QkO+4wOX41YVediCBF/t0ajAREA/HIHZe+hmbaXo32/VhzwdxYz0mPnaMPs2XiZ0h1EnhpTFnzLIOpv0rc+O3QQnd9AuM3Bryio3YDM7TYNXBFs+J6DjmofUxHDXlRygNzV343LShxkIAaVZws2Wdr0aA3gWOpMKwchn0mpPWYeLhpkWQ8Hh4lqZAPgL+QSgZsyW/kS+DgAWQ8Ign89U0l8hfHWsgJJfXZFno9tbfLHuXGuA9KBgQPLdGeoRIQm01IOzPcFda5QdPcsPoBOu/qDIcHs3jV4y09DM7Hhyi9L62PCZKpmcSzMNSPMazAyGGG8KX1pgFWKbupm/+/8C+qO+Rrk96KZtRL4xm1mRYmS1q6Fb2bNKC5ZcMWYDsrPR4Ysv32/uLZ8jmN97fpBPIsgudrDlf2PXU25iKhTDEDLiVXdEXbg6LFBwBvuUcOQdw+MTmypygzp2wPzk+S1TGnoZ7GHF3ihQTX/sHbI224BIGYUywwL7hYaEAs0S42cANsNBmvXFgpDafxd0dQFb9QwZgrpElSIkrUHym33+IMNd4g/kN/00pT9j/G8vD/YvU7tYopUPXhCQ5Z8F++Q4AFkOWfBfvu3Oj3OUMnfxiwjG/0dci67vQKciWC8yXxEENk22zkjE5xJBj/7c4gHnlDKdEyGTVaeIGnIJLUas2XOyFUgc0X9Ip0m8eBrTphwI5Y18gu0+Dza5wLmRu2q4oW3bpmL19MSrZRk7XwSrCHW35qCpYUYOPpX5PUXBJCYcEw+A9FS6JKTKwcvih+FqJ+EFRPNg0Z5rlMy/UWA7QFUPkBe/FI4ZIlB+cSgwn5OxW20cwrU5cDCmfCoCvhUTIhtQk7B4t85QyW8s+DAdyYA9wb/fSFpARg8yUNBbT11DiGU9joy+GMnog83EPCIB54uhiWWxo+ryUbZYni7PIR8uWIIWpWeBl5KQShGFD7ODDrSvHlB6F1RN+HUlLRqWksBGkJDNa2bhhOU1MVkYoe60fTwVyAyRtpEqt0IaA4F4LZqMi5/9GLMuCuSSCt6u1O2GDUk+b8t15uxybDwsAfFcOzTy+zhyTaPZP8NMDXAqqubp7M9uaU/3F5iQGMTnP9RMunZZ7+aUSfovcSwOVvZ38ESEZWXGcNZytFHlRXJpoE1XuRsLVq8F0tB3vNKfQ4UJltbB5kibklXQEQ/iXn2BinwX77httsvyRq1iXwjVEkWWPIVyUX1ligjnUx0OP6tvzsdQQMINmbBfxJejxoc+Dqo/dBkOnljUtSmA4V9pMApn1xGhKnnREFLgR0iZSVJ5b3v/W3oRmjuluKL8nnFMdD/6UUzZMKNQa7aZKRzS0XzB6qFCPMRmgz2ip1tJ/7xX0Xn1FkTK3fovQJ+4K/N0xkqYd5LhdLkuu2XEi1ba0B550tMyUBpPLzITfLPKUwq87D+KTWH8nVB/070C1weib6CVcJO2TDrduZ6uePILbjggq55MO6ckA6dz1IMi7poxW9Hhiy/kRzh9I8HAp6pDPPPPX9YGrz/qF3vxZOMldk7vOK+Kj7vCN088buseQDl7x1YDLbGJ3Ii1+ItmsljKbuOha30A52q8W/U7v+aT7iRyR2J1T80GHH1X4OUR/JZ4E2WwDIVyjVt48Mp+Pm+M0Vf29cQ9ywjdZY2i5LQ1h3OaWXzHy+psYuUUesl0ZKWaCYAWuG9nfU38YZG8yEd8BrL8j5x5lO/K5ifeaJA4H+1QSgqf8KFKgBbg6okNBfdLzgRRUlo+ikBORf0RpHNzGXTWJ0km/JtxM5q94nm+hFz+j1SjKXEp4+ZSJ+cwUXtCGbb3FHvyq03Svym6rjIs88W+LCXyJ5vD3V3vUn4tayUf5yCIj58iEc3vBKXm4vAYGWJK1IfQZezB7tV3hHBySiZyze2fMoWUdl5A2l9Q6dP4iBJNQKvpooIP8uUAGXhRuYFTQK83CmIHRBL4CLD577h/t7Z1tB2IT7xEsFRTXe5W+nNvx+pKZp/+9FckCy0fjNooG+BleYEYtGPrl3wuQrpcHjsQhpVHndz/rhuhZbAVrrwTXYT5rM0Z+tpHih6ML+RaB+SNR+WyHqr+Esp8a5frOu8jtVxjo5LN2YFxKuu0SsNIzAoTHiTOR+OM8/xrhrsBuBgt7ViLBguxhpGR6G4USPefjsOXMAwQVfXKnjbU13Gpk/ogLkaYSnqWrlbbNtsEm7vkMd2PJ2RSr6RtZiiyHhJ50KqnFLG2cmpa8d+eupumTxRnUtm0m0AktmePAKLUKmbKMtJFKzGV0zbSf6jSN2q9Oafmbh18axLrzr5FVgOwJHTewbqK+TFQ8x0u7an1+nQZ+Y9FerXTjsmvoVRw61UhERxD0bRkGe04NmCLt0ILELkskVwEVx2AR3OhBc19UIpRtlE2MPfeJiIeqqSNExP1+bbsBTjFwomEEza6fRGAjTBQz0G8egRvH/yplCpRVYoMZ+OM0eMuMyoSiYnJ1eIK4Cdh0yA1nLYlqo8CqVxF3kYhx1boCSti8+wXgm2VUqMfLoJ2MmRAXFw6ricxiR+jZLPhYz8cpFkrZY5PLaCfwE1eQ2Jg8lil3PW68N95lWWl0Jc+C6r7yyKQFfwzWbXwAaaarnUqqEHovhwl/htpEQSjNsKOF7f3FhLhEA88YtauffpjMBcljlka93Cr1ASU64Ffh2VpP/DBEwId2umUO6NOVTyrXkmL/2ZvFWnUSAOFRogzt2Fq/ATrQ7KpXgrUL1o/ADF4M8Veu9GyH/n2zlDirXaccj7lF5p3Lr097TL5hH/qpG4yenzKptrlbpwobhoRfm1XBUu58PSbPZ/7C23v+XpKSjRq4iVGWehjpk+sHsuaW8FsW0pwUB5NPcwwbUkMmDz4PwcUhXoxpvuMKA6vOLqq3HXH/A3fMlulai1q+f5DDOMtlGTqwNhVpv1sTwzkXCIKL9N9uGbL7CVh7l0TCBfluEd+pBSh8/LU/lsE1tnH5lPpz2pyQg2liAQJeUipEEdhxVIhVD3Zu5Atw/Ugxkv4XHuMcba8TJKAlW0fyC1XK3O8I2kZ3Vohtow0CUWC5aGBcbd4CGLFz7z5gjGRYMgHwF++4bXuJ5myHhEA+dPCyyYUe3oG+UNWeiP/wUC1hnWzVqv2qXzS/43QhtX/zPKrJSq/HJ2rlJeLlcf9YjIs+7inQeKwYqLTHan1wyLScyIwwrYBG/UK/DKJgRZM+tL+Ue6ykmKn6BGSYHUvPqj/FkNWF4wfP5n7Uu+Uaf5J1S27qV+I2y6ikU+pPGBaFf0FJb7YhtKa6wJumG0OnA8+QGGzerZLwELZ/53+e7OrlIjDtnAS4fKXIb28fW7iOmIp1elFIab1as/OX9cMENKFZhrL86aii8oYKy2rs/W7lhyYOJ+1n7B09VVj8SIEUWLc/VI8fZFnv92AaQGKC1yhms2DH14xQ/zGpDyh85QJ4LW352G3cI6fRSzui8WgnOJEVKjNgwqRArYc76HVVHhdAx+8a+rqgCOqas8rSn8Yn4LQQUQIIKkXrUePrnAmoeMsyCSfsb7gydXHYJ5BDRH+BSJMo+L2VwLtdwA35DBaxe+YNWL3otdvh4xZmOslIeeMWYDsvb955UYOtZePSc+Z3uePUAb4DXKiGRmHWRAIGSLCgEAVPIiHwaxL0UUxVcPx19NxDdjK6ZtkW3f44gkUUMRD9W6hWK/YCw1ngkkuuEthCY+bQ4FCFmA1Ab+IzjsI39ULa2b4YmvUXE5MZCE+K3F1W5Em52eGKxIXLgqf8EaHJSF0iDwqX69tQHfPC+3M4G+zv56qE83k1GXJUpMineCyYk/MwzKV5FaEu6X55bqs2DkVGGx7Rq3RuYDYk6QqobfEllLWQI9mBZL2E62LuO2IgM4D+02CocIMMgpQp9w8pSLOL3oQ5/cA2Yj906uTkkx4GVuTBBiHWIo8gMDVR1b3QyUw8AP3gARSgccXxvNs7AFFnXIvlBYAFkPB1qm9kkGrX+DwpR/iOBLWNon3qjsPkk6X5su3ETtfkAKYlo8aRc3HnieveFsAD1T8WhK/a5bRtCtmJiPBJ1rknfTvfadJfw7/YvL/cxi5/NfcMGeeL1NS4ZNwPFrWnPUyhn6AewWclELL99v7nKGRZDwmSeMRgu7YQXw5TYdz2KTStmzyEufQU6NMkNjl3XaCWCPpDWjQVO6QVukeY++b2nGOPUDXGnOSyb9s/JHQvcF7f3Cy+v4id46vP91qjZeyAqqs9E2z5uZKrLzL/t+KJQtFdp7B70E+wA/XgEDmozfk7gg96p8qsV2fzj44oMHJcOYmmJwDtYQtDjQ6wpd9fPHATI8GVSpXHMJdykXSEmY4Cw9kD6Tj25vRMAOiNGk9+RQIvCBl2y72jPrULWjT+08ho+RHM5QK6QlcS6Rg+rLeWKdkSDgU06wuNqgEHhqnhf57RarpcIKP6zuYdfylYXkwfobsPOWrjZWR/+gtORXd9S/TsklpTYIfJ3mP3a4/32cZ2W7SQ7N0K6YKiFx+773By10tADSxnZ+rjc6iXxQGSKciHS7ptTg5BchzJsSBV+gdtMRfLtxf3tR2Hv3D1s2PcwvCNL2yb4GP2LJSFx9kRuts5eTb8zIlFp7VKMVW3BOPrbP6dIxu+Ee4/eR3JsvDXvGPGR0AVus03cxUPgxgWroXkMZzDxjXP/jwh+1Kve2VDcXzB4iq1RuxxTYxFREhZS295RgAO4HvnKugIaJ/VtByP9UfSOhWfp54GC4ANwirGlk4NxrmDWF328inI3HCRTLPWYRfiI/LkAa5FcjXAzOCq6C3EcGjXSPIW4f0mbfzGs1DO65cZBlZOyy8+Ci4yJ5v+sNJS5NlspPfV1usggKrNFHfLUAgiA5sUod0QryKTxG3KYHq6MsRJKmPdjKtMPyLgBnqRRFvlRWmRGBP1k6zjPfqrNp/3R/KkOkikBvhd036PSvzbu9Ee3XX0HHgirl9xdfCN8LIG9tEanCplhJ3LTNioiovHQ5BVTp0TDxKY6QV0Vy3m5hvLtnHNYjqN5QJEpC+3zR2xqOZxaES8e+hTZpWAcYxlvk1BDlu/ZNpInRppV3lZuYlVGYutJ2ch0VdwpYFFQEc+OBIOd4y4+uKA/WvImXbSJjDmZ5o23tUx5p35iRaRk+KB5XhuFIYSAWE5VpFTP/wGDV5vGG7ULL9s/TzzNv2Z4xZftRz+mFs1gKqsyS3kbz4u5gEdq3Kw/qWnkMYBwueWAwuu2JunaGDJZ5vkgDjkVqe0yc2++VytZAb8Ju86WwquPnpKw/ARUEea9pP3xIveEuCiNjliTzWVgtQQD93cu0E2L3VxE4+HMNH6CHXdOmLq1DEM/LVFA2WoMbDbLcBv7NwNnT3u4HxsT4NRhxLFvXCVGqN3fyCeAIVmglI4VWkb29DXf761qcgDiEMA2N6pJHHTZXfzgyrCvMWOs/KlV2IILbcZGzaunACh6SoAE5VuynJVyKGcwnfI89grFHYH+38g9/wj3FV0+kG1/TMnjDHYGz068M+jo4JNOdHiwcab2WK5t/wD+vZFhSn10GSiml19xLesFFXxNq8b/yF5xkXb+eS51y+ocbQueWlh9NxprkZ/PFMPglg9H09361XYKJCfYuUn6WT/m1q0SDH1iaeb+edkH5M5ufVhHQksk3rvtoIZn4ISj0+4vDgxIGit6SNSAGppWhT6Q5ao1TuzKtRe1J2tzXNzfDCqXJ9S3LY0NCBqJejwxZfvuC/I1h2DwJILzZkrj4tUEBj/Oddn6lNelkEf2+IC3R3OIWcLVt3qua95lEc4lbMqQuWsX5uA7+MOLBBL8EZdRN7jaiGLeSnfSL2MUr6eMbVjHpQKjDVsx7r/jYincIRAJZWr3AYXeIFliJSsCrCgYWe7dDDPkAN4gRQXkUsF8OrEKw8uapSwZPzJkAqOCrarku0AMURKgrO37EOVu+yrNsnzCpGg6A6dDDqKOZ9O5kBBYFETK7i75zxW9LVEA2wdqBV9Dqr9SVJb2ZEoSJtuzF0xUe6e756pwG7vymSf3Fmq4yeUuYV9+2jXan8VhgDGO46wJGd/E051PazRexzYxvAWajb9XuyYvhylsBITCrTxLimL9c1c+1Z4I91TIs4+GfAKiHKlpKzABcRmJ168V2dA1yjZJ+CL8ZCLyQ5uzNYAL6TsDw6ANoMU/Vyt0CoB5DUvpWzg4ZNbw8gg/zi562HtwfJXaC951/ISrh1qx8qcVYl0Tn1Wh5DJ/W6gq/3ktC+eCbHWh4ygN7uZ654sokISG52EU42KTle5yhkWQ8IoT7gp5nviSK+AQbsAz7gLJZ3BRQRQah+iLQn4EQgQzMqhkkM9Wn64ttdiEBPaWzu80oRPCbGWv3dIEA1S7klBOFqfumOOfEosvjsC4zRMILDTQ6QGK4xR2667IUcekJeHw/NR5CJI0w9Epfe0VqEqB4MNYn+P4C3/zbmmFBor1fIJPF6WSzWOgfTy58bVPk2ZqJoCPwGbkrIHKYjl/KNFBOZKDVX0G7qLzQNhrFqaN9YHjk8sA3S4o8aRPB3idYlYEmCjffcUQl+DVE+65mB7BMK/UeNX//ZM/oS5t5VR49kgZxZ/mvMyUsn6QMClTRqEXXHAPAJntJm9gUEsIobuHh1db0N60+0sbsOBpsHD8jZqDqpJ2A0v5o/IZcOf7Fx4hQ3cALgDdV7Vc5DZX1YRry/iZIietk7UmKYPce92MtOOkF/PTyHXjW0h/BH8RnhoFQJwx8KhgoQED+hnRlYbhR8d0mv/pkhZpwvyiiV2lS08qbfljiOTpkmwxgc75pPEt+5QdKzD+lMpertymxpDsPgQqnQIKq74pI9BtLNz8RE5l2zzzJQvcF7gvb9l4v8crwxHG3w2m/yJpxIpcJmDdDzB44WNFxM5FBI4VEPouU+MLENJOZnWU7xI1eOa8Htz9JPGYwyBOuUxKNAk84j/6HyEKqP16LRNuJ+XJ6nTl3sjaSae2gODzP294LoEnsukpXJDdYBIBzZt8YsVhqjcl/9EXTbK2C92PiWeZOKfiYlYERD6IlCsda5g4BgFR5TUBF6NaFgURxC9D+ciU5MUwxVVKUigEZ75EOZ/o+fvSS76Ih8Ft7jh6HFwfChUoGv1Smoi0vn5vLI4io7i2Z/OVvz537vNnYA2DhQrOhpai3cDxXG8CWiArblSbRycLiu8Z4VLgFWwrJ6l0I6n2DSLCHKznX1OpFyC3cn1FvNSu3Annk7JBdeDa03QFPBJXTJdciGPI+dtkCDR/D8MZCEo7t+vYZ+WtxxWIEik8u3KxflB0Mb+ED3hBWbDIT8zJ2RTFyzNrA+eQC0AYt93JTmcf4PQ+SKlbXlwHzxke1OOGTz2Q2BMO6ckWQ8IgHnmhQxMvCyGs+FxSu0y/Sq/GGK29D8zuBPpJHCSjgzfz0hUNO07LCp6ki6k90NGRZFc/CG45B5GmeruOE+yi9nrCUDURsLQZB/JQRVvMitAqdY2MOPDJJt38/O/z3V2YBWT93H2QGMOFE16DC3LOUWHFpWTFwopftvaHPepMDpHl8ost5iqfFb7qS5XyoGScvZgvOZUYOZpKdSb6E8wpLZFowvPgtjVKcV1JEbBxXuOF/ndzJXg5cLKU/zKAITvcYnwbxuGTTgTg0VH15xXnSPcNGhoB9VMC79Y9DYclsy808gTbEneEBc/Fa50AJciF8kysLIlS4ShZBPNUjcKVkc5e1vMa6k6xNlXDoTriJIC0R/vqz+DWh32TJmDbQ64PDREstiiOzPISQ4surUHuFnkwIr3gyrEYDag1oZpQZdpU9HMDRCiYXcISO65IsOhJZ+0u36oFgACYH+6r3O8+2kzG98q/g4GsoMl+9QQXNYoZLfCIB32kct/2DeMzH91iDqyA17Ap2P7Yx8N85jqJ/xRCNLKWg3F4Nf9v7ijMLunlXbjrDZwD8MmaL6HkwVmnIeO5RQl0trTlnvfLAXnJL7aaIBujUwfLb6mi+evuDACSEBEeZdvlsKGY1hG4/OCBEajVWdI1kCokaS4Tiu7oQT6k57Dk/78hdeKYG7mImUqWWVNLFsRCsbpqkxSYTCUUWlIJpGkZbvrOS969zVNHAHf8fQu0kYcT1R0niyGd4NMxSPLo4nLHGAC6IgA6ajk2kKGCQxrnFwed1NTwg7jnIy0CXPtJanyQpX2G5+K4fBUCTLxUjmkBUtVH+8/rgZXB1KaC3UvMi3kUnFXsfFXJX6NVsZx8BPLbm2RZFoidT84SGvJJnG8W1c4OhOf+1ml3DdLsE2guR2FoDIhCzZH2jAX+F8FirfJ2oyKFDLjRvW7K54paRpC3YSOwSQgrfkTvs/ahoKLAQYZ4lX0I74VAB58hekhdovDZ18PGLHUhrhUT13r1UzTdx8L6vOxAPPFvijPRtomH08N3yIyQe2Y/wfc6n4lakxbw2KKX1ESlElBC4JpV8+AtP55omeDGCFuHVHRrXJzKiH1yargS9g3xm2OsnDPHgABpt+84/Q6YDUk4aetxH614EN2aMcQRjQwRAf2dSrB3JrWLD1COSk6ZTi0KxN3iAdizF/b8SGjzi2tWbMBAaKRg2Dv38p8g2D1haTVtk13Ubz0lz4DGbdCBMgoQYyuHyGApwlWUus64jwBffMpgzJte0wIRezdcJYia9M3WBEapV8lvAs2K7Qys2c7015la/By5StvW1GAj2gAn6gVyF3IgZFn1va18fCQPzg64rcrZTC+YYKBiAGjsO20NjVAR7UgjxoLAxzcvTKnYFNPaSdQoGVRLFmXqUjLdsq2gZ6qJuZiRXnqhQxRJU7gB4dgyeoG34rGbvj2/03MpnKZs1EKecyr8vJrgfsolmPl5+AqAVd/DPPjJOHLLO/NbvzPnJMAiISGkgGdGyAepl0FLnOms6MFhYL6vOxAPPAbFfNMixMVXrVJ23fM+ZqqvZWUlPssonfYt02KOM3xenDsGM2gs+KATBo9HAlJrkFlUQJPJUvAr5ACFTE8DhazsIuSmNzdbcW3FK5HAxQP7amJeNkyO8AXOaDR7V7JMU4ejhHkdat/svHZFlXwkbhUPNdKlnACslLVSfYKQ/NYh8y97V/YpJv324Yw+ldxkjAcbTxKzNMJ/EyKIz01YYP3bp4W9cv6Cq4jHk6gLTazdf+Ey051+uOxwOo4bY2vaJ4mjGobjACKdgEsWemoclYHN/gruR6rWYzp7g0V9jleiqVZMhF19+tGbq7tS7WHFHjt6uptYRDN6/DBqtzx/7YF8etGC7dDB5ggoCS7ldfmIWN7hBKAxHKyPLAGZ91cXbPdR9k6Ds722FERpTxI2uImzT/9NhVlfXPrOn3aY0TBcyt4QxP2VQ9X0olu7glXQI03p1YVe0CyHpqPHko8Z/Q+2aP7CIB55kiX0BvgO+mmojD6QrOU8qkyGY6fX23Ash4RAL4MUvsHkrBRcM7CDJNUm6vw7H+0x9rrT3wozxwLk4Fx4P7jTx1ps1SIbdoknYrBTi/ZgSIOklEchuzmK3X4zWccHYF0sYHUzWuPe+GJvGeTlEkO2rzXR3dqszqNzMycIJUqf1CdrnY1bXIxl8Kh/rJMXHdpsJZ3qrm6yMpK3LT6S0ClG6xbcUTzUUYwoVAq/a5391xkJ+F6ha49xgkL4WQ7j3lOB6iNZ1QuHvmS0+DEkamm4Mr7EWMYyCYSjPV0muyL4gkccxKZIWt7cFLj9g2mDnomvfJFzVaxk/qXMeoL2L+4MdhPONsYO+GG2KHRjOA2XHUBJxRenjw8q7RACpgWI5wnOzFhhMgX1bbpMP9C5Si3JIfYGz1h9ItiXjUR0t1aRbPut8scgNzRxMbBqusQVUqgXglhmcGLKUvLwfyX6Nt6xK/5KGBH32ZW70rx14u98WgmGmueWpEAg7gyrrmRvQZPjA4L3fCKzy4QLeK4kbIsh32nRvqJGsBgXRWRdkv1MhRM8fXfIQ3Uy/Hs8wwyVULstBOpJTCgC4YtPVjkfQkY2P/Vz16Y/MkURZDvuDFLyOYuGigqewYQRBFmunue9SMbJas9uEMlP8+W7j3Zrbp7HSLywVRQFm+bLQTtSBbprfDUIxKpxv8Rv1iuEluCzWhVoSY/UgZvFh7ZNZIOfQqEmN++Gl5+SDdOPujN6JhS+x2oH1Le6axBPGYECHjTd+9DaX0kzEQOAUrg4z4aA32qiW8+oz1U3TIoPW+afJYO7IFxPmf51yLi9/IolyezxONyKcEL2fbNMnOAie44R3y4quLMkTLhHZmYIeK/ul8MVrcMAMNAl7SMaJY3YuCb+W8bHSSJxP26ebiY8Y1VrUuqDjPhjyHAlsn0qWvPYFXGpTonDu3lg9gudFiuXObsIYVoAtUSIuSpWbe+vqaOfqVsqeEpehGzT9PSHZpSLHYRGn/DAnmrTvwOURCc8dUdiupBzbgmf+3BU4rti+LTbvlxLFQtvyeh25Yly1oTq8unUrCuybNKiPS8s83stB4PJd44TLZgM5hB5gJ/oxKeMjjcIWX77gvcFX9MtGzeGI32VNFv+F57iRHJgZpvZYjXeRgK9al5KykvTuWHmiS609mQE1YsCWX/rz5Djxu4dHj4x5G9xfque4Kzz7mCY5TMNzHaSVtpN/P/zqUlTYY+6l8s4bzq3IyKAvNPhQw2lmKzrdnvzy77MOJfOJIcENKQVCrsoMjxCDwVFhrKsjJYaFISHvP0lYu32FfGwtLZe3Aaxqa/0QXanjRDMqQllKRpZahRVcT+tQPcqpfRRfTsUg8l9lARpDIrO0/wAceLSxF3AM2WYpegXN15qO35KgbXCSWZDUxaprBTkPpVnb1qWe/acwpAD9BTbbh9B2CCflWeXllwE+eF+TSs2ppcsI8ree/swkJFeWQCOVT76pJHJPKoTlM2z+L6n1NfPENC144qTnh8tt4q6Z5AOwo8kAEIvOzntM44pbS5rjqZNUj7pXaAPJBqNuBDkQfLhEfuMSihOmvD+0AEebn4lMJaRWk8Dyk1+wH+aNwz/xGB+WrlIN5XNI7hiNXeDDx4W51Iz3a6erRz3CjQl3kpiQig0IO7gvcF7U3Mn5cjafZpq9v048oXeyXsjuXOunqeF76a8BjgiTowbeG41LcDRyf+B6zZuRJk0KRUs3Es5/eUAy6LzdXw8qISI/4cZRQmWrefc3+02H3Kl6Klvx2y1HYwAHfxby87t8PkDoAUKI2HX6YhMd9K+VFJzxIzAFxaoyNDuZJd0C1U9TlbgthebiHWKlpOX5lY69pNkw6JkLBYtXZbPWcjSscbRvDFsYRVcWnJHkHkSijJAuaagSkv7DSWRWUt8uKTCGrNDyK/hZZpcLWDOPEQicPApXwNlU5xgVGkLgCMuaHnupPollYMZ6diQsqr5VMiBzG+wFDjSbOIMfYsCcy0RutjhXkG0/gPo99p4lsT6/pF5gu1j5NOrNGCEQ30Anbem3kYa2TALQ2nkmxJQY+3ZPRi19bI4X9A287iUa9lJ93PTnFfNDNQAGj/h+cBGG1Xy00zeOesGY76dvYQzZNIvGNLv1VDVpcYLUDsg9mLFQwBkCDSt/q4Z+ywkCuM/sj1RPPKfn3M6qouGdoINT5Bbb9VDU2TqR7pkRhHJnU9UefpI1S6sGUQv3rzDwWjhUWMqhWLUgmxfL+/fcd8S4qoR0xJtiznEL6+lZXV3RyGcj5Zj4Rx/fcFatAKdSo6xblEv9Wz0LnAJccvUE9W5qHebjFy/NmkZM6gvthIykAlaf7lzCKBeNa+TAia6CHiLhOPXF305vn52rpkB5ik7V+ShDkwn1IJZdZze+LfotrwgCTD+H9epHwV1tmHJgBBp1mzBkSBTs//a6YeV4IIqJiBToBUFshfLHeQkd8hi5soN7Wn6XdC7vf8nwgs35Hltg8KFCrD+zrb/4nK1SDqrQTxJPSGtozXmhfzmRpwQ2R4e4V5T4xpHgC0n6mylOMMcGXqN5xYXkD4fbEhvO2CkSYCQiHG2Rd6JqylABhzIstYW8NLtK8eZPvJY4vnlk2wRfYacplq7qyjhMYJzJNMfsayJAm9ufFihIeEnkzZg+4+L09IuSzym3No8iOwcF+fTkyLWtFm9sSph9WJa+H5gNoPKVtzcMsyrnb2TlxvQzhBhHn4QcUFk6LtABmtR9Vg3K9whPO0LlFy7ie8D9LFGzMvy2T3yU4nNzEqGee9flW6WlXvTCAr8pKjJ2Jdl5O6XiOzgFi8hB187Jj8d3mqq7BZXR2Dr6QmMebcriXOnN9pw2rM7K4jcpAH3A14OsbJyrNE5Mkd5jcXPd1+NxrecW0rD53VVhynGFdy5B/zAktYy8lOGNgJu34DE1RrZsRnQIvpcws8avEjpe51DVTpwjw7RT1KtBiagNePkn6w9/gKNsrOkRfczcvouppaRHBWtwKSykOYQs4KBYR1GDd8mDhXN6O09+IyJ+0uC1uPx5B10/USg2jSzMLUKGHMezFO74i4yVj+EHoODefp0aF3VHrmudpTs3uG5MkR9neAxwfkJQ0IggF8GKfBbB5jsQMck5FKikXvFFJdFVgilc+GD2H5Y5uRyMPgnP3b5vL27lREyviwsKYzOoDrYRy8UZZaA2QCT6Z3JeHaRaNOqnoC1GtEWMiJb8qK/t4+35Xht4zhDA9URWwLZLlKA3sUM5c5xGZhp/K1HlThnqkfGQW93B5DJJAbwiHyIv6vmEXY0IIX8ZjxP81wGGl7stZOnXjfdQm5oquTmf9HZukyzfkSUsnK49pqZCIi5devFauij7pq8imySQU8Bh7/HDHBP+zbYpXo9XK08pI6nokUu/wbl6FiQGmdsAy3zH0C2vcUxIc2hNzr2HwiwNGhAP+ZfS40IQOYWBMwMKGmATAQcegNLQEAU5ny2RSv85XpL6/RFRUb+UKUTY+C3FDDOsjp6zXF7RBAvSnnWXFLa5sWXIVu8CTGV6ir8F+oEoeqwbtiFRVFw60/Budr0kGps4iWavW7uN9+3R4ffWsxJ1W+WpvQxFXbKZu1oltwOKiH1cD/m4xJ2djrZhV7R7Mg3P4yLrsPh2ArTc4D6HFHuVkjm/xKp9M5zdreIixn7oFpvvDPpacP0XXF/Jsr1OmKwiNes4coGPxKmHlsvkjuS4EtDbkdmv1OQ8G6majOKrFEVDrFsmk0Ug+xl/LHG2Y5DnsKIDLy9BbdMO0qoAMEQZHbtkC2NABk5vX8OprnbIdO/2M0xLOngBNlsl7n/a8bZMU4wT5s8zY31dFICSPXVnf6DfqprAaLWkmlu4eL/QakkNd9ClBAfGTfhWlBkiUABHFUJ6NZpJVnAdEeIqKAs7XEqNurHKf55w1pkAPa604HiqczWz25p2BPsq7PeQ5d6Oz+MiekL5BgLWP1wYBK+Y7anDXUq1BcAIdmj84/plir+TmysaoIJz/MW8DCE7WcnbSPhiSbHK1v232ZFkOMpc1okPSXjrqerNu2bN+6ZsuZUzlSGQIPdRlLRl56FxIcUyPFm55cAv8iC04v8k8gXE6u0KLtelPi+oCMjzasTHgjZl/24GbnbCIB9epkQP0jnfNsWTbEkNdGeNs4kekoDSnygNU8BRGunRxeFQn0o3GkxfghMufclHojGs2y9Ad/gBRVCQO3QB7U64irbpZCY7QyUJp/Zbz+b+qltk6SlUuknzPSs5LH0HvBmVtT/dxOfQRPDZ9TqKrgve6OjJJhm3BH+2RR3x/wIxHAV1z/BSgqKX34/mQqF9hlNZften/G5rYKPrvfah/wzFr2WXWY2mRJy2oD3186ietDjuJszuZdgvfIuKkDQ+tNjCVZBwNbRgGCWIt3imtjpGLRiBBrisI4EKfg27/wMh3cb5lXO1zsC60Z40gAOoLSy9CB0ZOeckH62Yt8TVXd1fCU8nfBpbUPgcTroaRflTCKlsrP/HYgvH8IIFz9Ci/9o64iMKilJbVzRuDxiz8Q0+DIF93LYGNApCqivNV3tPjzUVrZ+h0aYlNl0/XHtX3+GbbFtUfNpa1G/EUxG5ZhYgOFEWQ8IgF8GKWR0yZo8NQfflBZfIDdpUtJ2UK6NNjrtb+ld8UyEzO6xzC+wfOPmxVo87WJv7OZo2u+sC7tdHAcD768/GYJPEP3XhTb2s3YzWUzjbs6y7jDno+xpsnexGKftJaaac8abZGo1TarrqDLRgorhJsLClNKXJAFaxbTMlH5viMWY8BACyOY3KUrrtpbWqMY2+B2yXVqZZblgk2tQkDQt+vlAbSF2Z7AhblWpMsTfXU5tlWNEcvxyBN/fwErZUcD3Ezr/IGZElmLdkkybSLNtauQwSPxpqq3J2P7cbhngxxbLGElOH/WLCmD+0mwnpqrE4jHbJb2uvy4eloWqaQK7ZGGNzwrtv0d3Be1OMECKf37gWu2FKmjv208m2mG/fcGIujDxW7kcCMExIqNdZKtVwbFZCD90HQADFQUL4V7WonSiCPKC8n3VtGgaXrRlt9pr0V7EA83h50jpHm6O+8DR3YQ3VrnTQyqh2ekGl24iEUW7d7A5WtCOky3ocU3sz6NzQl7x8zfkVRCK4PG4wukrb/VUw1sl82qCOT/gFyj7S4c9ktGSM2Hrdj58bvuLwPG+okRCH6BypyjhCJiECDMm+Yc9Q9vZDtaqfFbRNe+16nMaXrDUcTMDIXK7BpOCLecG9jtMIl6DMKVCtvG/GzkBYhqNwls64K2vgrM5cuPVe76zby7sToXSzQ1fNLMYYMvOZ3PcjOo5JEwbTn5FqwWvuqvqqCu4ILPob2dzrCcOsMlnNocu3wVk35nBddcfLgi40LBB90C/AL4DxE3VWlRbvB4DZCsM9h1FpDPpwh+KHkSnQUf61rUyqXRFuJVfz+diAeix1FFgyMvx5RRODSrW/zlTzjpfWtoxZWZ94DjQuUyq/O8ZM/fesZr30P23kT3BfjVV7iiv1DsiqTZwALEnaNl0EWBN6UKcLgfWQMxcu/HV2dEe0uk7EagxwXEhk91CpoWZaSKkOtnTF6Ze2qJLxFsVkw9LZXz9YCN/kS8sLo3axk15z8P+htiCfpZkGmtYVXeOjUsLsCMfEugNLfSknouMAK0B4k28zo4pfxWhbd2aUslVMsipP1AqyOEBABl1QegAps7dv40dGGSRpHBnCpFCfCLDKQgLLtKUYb2KS/uYq2ycpFA2z6pdD+OD6ogsLpwBYmfRlRpHNvg9a77CJn1IEXyseQVHUZ8BOnl+qWiRDKtS35dwVwqZjsC6mR4SJrCaOsDE1tAOarFB2AYpxY18W+hmPdll7ezILpHU55jk0x7IG5aqPhSJPbeVvieK3qUOj2xIB54DYsM/MkuhOimSvNFFWoxQkd8JiASkTu8QwfL1tFeAQbweNS04or4l7FvenfymbPAcLGYmIYyphHG3ikSP+RC7duFXRrAT94VYsMa6K59DReSAXnfw2vGDTYCCrHYXfD7hmsZxKQzMG4352bEugYqhefZXoWkJowYaXrP8rwGznr4Zqhsq+7Lz9A5bPofgswUE3TKugyvTzbfYtZ39Fw4zLB43hfupGh6SnHOvZGMiHSMGYLRd+eHP3hEPBHfJu+gIyvKXZZxwrxw3azwe5xqmysOWJGLlHIwjLX2hy2OrP1cmeRQ5nrM/g4zrbuWQZPxI46w+wbKaHVFKRmjC159C5nMkgBYe/Quw+ZZT12JnA96D8jOUKuaMAB2ip1RJ5Ybrp7ajTNEDD97C7Z5d5bZGhqFH6MyLvt/Or3RaytCDNiBBjrl6geiEiBOXnwhy0FMOSLThmB/GQl+7yuKMHi3zJ2IB58ilwedyGph3KGzDtaxYEXepL+SSy3/j5xo+bvCDK9FZ/q87bmP76ZLs4rO4BAmzB4ysmkICQfhJP+iQsdCE9G+QgHyE7AemvLOTDbBOn1GoA8Yy/cl713NfbfV74346sx8jfrs2Upy0x5P+zw5izwsXoTqDKmpi6iypYDcS7Hkq4cYw9pLCh2+BXEk8WafMNtTMQCaiQo7lyO4uLAfE8cuB8PmjIusn4sAWsUwUxichTkOjwQ8CCCfgr+Ztgk9AYoaQ+9GluiXtUmAFNPT6YSx8QvUpFJNQu5/TAwSYgSIy5q1v4GaEe8abtY/BWUz7UiCeUPdQPtxF317454wdn5hmervomdpUi8J2He/f7Dz8bCpCwE5SKBL6gpK5LYnXlhNSf4DYkUYIt5h4xItQci6UeUgqn7r7DWR3T40YewqtQRhqFgk7T7oODRyShjQnb8Za6FXnYgHfVqiMYvw3J+TF95QJoAlLYQRWly30CA13am6F/biIB55JG4B3V9duwP0PSuDTM7OrP5bKAFXk5f7TPoB0jzUhAHfymgKchm9wD90ddsnkgbqqCMB2riWF6lwGlTPHhuMuTl4wz9KA3plbdtLJAiq6CkMJ5sq8j9BeqrOfX22MFJhCy9HYdsMA1pLFd0c1H96kjkz/BzVVwab3lqYOwptcrEX7OxyvgNUtL3KAOBCmmxx+xb4S/EPjTrQF5WjTvty7TJOAWZKyM7OU8yg2oLnO8B9yB5Zq52+ylPjPQVVVzCOO7QzxgLV1OPuB4Ia3IZtOox+RfuLQt/h3+IYBBKMmk/B/b91knVC+naVBGAcmWyRfu5CJGEjG0LQmXSagth7rUza/vFCfVC9jLQRi8crrDcyxjnp6IgEnKjpB2bXmW1apqApL5ePIYQH8n16avMkI2RZDll8JSz/yWoDyi++BVGuQOJuCEbIshzHMN6G+x5nKw09zVaaEXSHOhTLAZU2EP/nsWfb9mJhWufUfFY1ZfFtyUu4/47on+DVEwLHmsvoDAWICXEddnONsXb990kFHD+/ZZ1i2A33Y6FZmAEMNhDf5SCoSDn6OULxzSFwPPBNttqH2nDvtvykf/l0W4iQLNanDrV4CzHOu5Ut5Pmq3n/PBeU1YXAtVluD7cmWuyxTuDOXLPIDMvhgLto9sx5d/kztlIfh8zJ6LPaCNyBXgm0HZaFp1u7TG6KD2j4MMJb6FQNKYEDnX9ZctsKr10kzm12tACNTr36sNQh20R51svId3LhUiXBNLcNTry9fl2CG8/XxawZUe81IwUoRmv6l1xlawlquPhtA5PM5/6sFO9MVjjCntQMHkoIlceNeD+MtdJdbK0G7gvcGVJSJGb+xlkcCyHhDbucoZFkGOYxJe7FrEWzjnjGJGVQcNsjOjb7S1ELJqvH7zTWpwKzgnHvPK7carcX9AxVND+hpfqlS/X6I/Feg3GxA5g7l5DEsqCcO0Qx+rc7fI+AfWGT7JTa4YDn5iY2YWaN+TBsMLO8F/GE+x1+H8+SfzRuTujIm7dnGr1da9M89lF6KvnBc188cR+Q+eLllV1LMbKXnR62iZ7Jk94AYnIwFpOYBZNMFkmIGDlyWPHZcNXi0ewKY1N4YwldQoaYq042RjLpkvujyoEU7aBitpOXNSZsDRiOk0SsIXoN3WZoAA8zGRhF2enxHlwBkbm8ULt4mWquIaBQTjP5+iWnkDta6IXBB1ipqSx40dkcxY0e5bcFslOUUNvAl0Ax83ueRuqIKJfwH6qPI/yDlwfDS8Mc2AA+e5ICWidjBh7En65TLL98huOfIIf2lFPy3GLdZKvc5QyLIMdsQprlrmHWF/r5K1BD5Gow2ebw+IW/1OIsxrBMlxYijILb82QVZHpnmgQ8Me+om3KxeIjpoqnxcObbA7umnBnbzJBJISSnv7u9tlHEUhEfSzxZf5QOE3330JCHH4W954SRjiQqP+gkorLUPwS8GeNB+lfW2xqxUwygEoA8kReGvnOFHy+UIs2rIHeI+TiWzX9Yq8T+JxLawFq2bUHlGoNlzpRcrJPrLrUoWIdpGkcOUHE3DpR8jvqZv+4umzzh/ybElRLqrQTBxHDQUUphNgNQhCVvWTmxQnWtNdJ7imPhbfboMvXfd90MZUl2ZYoBubwLbChOOBkcPbQdz0j6HXHluusDrvpG4/8JGOxVxgCAbHWbjojGM24JnG3BwNPcQzMedIBs5w3sflEwphc9kCKJB7kQteiBYsuKKU0ohVLOXUjPWmt8c1Jw9N7id9Pmshl+4PY+w0a2gMaLjumbYEQeeqZtkWT0RccvU/nsY7tYOC8hsuKZsoyDQHCgYYBlt3a2j36KpeCndXhov+z2RZgFmPj6+h00M4+mqQ3wIMjvKn4rpBLSy2wr+ZYxl33VkK/WuRx5sFuromTb8YqFTpy+GwP0ONrtHdM77VSqGpX2kFv6wC7M6XSgxnhJzBjQvv7b+fn4lGtAvTBwclQSDcoDWP5TsY2DuPB8apRiZsytShjXCdaaK8m4kqmi72OJF5fmjh0p5JbHFk51JxKjQEq474LfhhYFmoKlBGDLEmBiuR+fIqPtPzQc3PmzG56JezrGVPwBJ/+MBL8n0bCbyG7rri3ucUT+TXoskeTUU6zoQmFJk8uMvjQQoeHF0k5YocuJZL/f7gH8ATL5q2ZMLqDNCq65C1BGlyg5lMGivhyMWIW88UWyBcWGSr9QQsX1vcoaTpdQDK0GP8i1fJhkKR2zmtHqHvaBUYxVxVUOHJ7I2opJZSHnjFrNejwxZfvuAdYvOHEbIsnlhKep0nX+hRmyteHStGLElAGP4l86czp9Knanwy+T8EI8gSqz9/vcJHu9nCeV2xedvShz0L511Hv9/yH1WD+HyHzZBZDxF0gUrIKZf/pao2+EOjMuifotwIhaIvS5bNqggCL1pM56OnDBh16CKBaWnRdwT52zJMH4oUvplQGG1tsnkWe4QHOuptAzvE9lmexC5Kebb7koPnOchvAb6NLHuNjnyBszhCdYzWr5tTF9qOc8Ir+6mYUiLYR6D130a7RGfgxI8exnxCgYIbOJN7kjk5cgmqKAFN3YA/Q3wiBr88th0rBOdPTaD+mcvgBENoHqXSOLL5jnnyJULbx439itKkyBlttwziHkYvtL9ypdTFqc5nPGdiwEVVzHZNeWO4lkyQ8rLEkxBtom8P5DOghp1GLJd2vsNVtGddO1EH5M2yAfyvnnjFl++RgVfbYabLXaQvb/N/nsN1ivHEzzZ8H/Gq/Me/NNVuYUQ6HvWlil7q+zxNqjt1POpi6MrdHHCK9F1LPlONfjV/Q4nOQMACROZGr043oEtXjZziDzd3QHeIRshAim25MwbWckeQFMW9HveVzAtROcCr7BqQ5zSHwglAPwLDQ92Mtw2hus/bhMXqYdniYLXNsb6VBhNHiUsG/IhQNaMXThJcHh/WnU8eHEzINU8z+VCoO4C/i96geOu6fjVZ+dQ1c9+i54uIDA0OYSZWm/ABrZBj3dN9y8cytOWuKiICMuYGZDqcK6x9WezcQANRC9fehN5I12b7ACZoshPNG7Gnck1aqENMSQ/F6yhMpYZyPClSWvHjiRYg5MX9/pdyCjAtwRArkeXVmGUEpsiUzYNJUfBh7w2A4pJQey3fo0C1h7Nr/MfvgL99wXuDHCueT9Lk1r3nvDSM4AFLOZ4ZYoCiCTJKUp8wWwIYlpAZBFg6Dw7eQeIBeCkrQX1HK0zmQkyswGqNBKooNT07k85HNW+8cEtKClSei5s3Ga7VlocAkXTcNrdPB21axTv0rMjXcQryodbZ/nakgg2nhmO+DGXcTHCArt3iKaVJfoVFKSvtHC40MMjOtQGbkO6McSWSSorCYxWdnM6jGCcfw2JI/ZvQo9ptvlaZEXvrVO183/dB3PCK94IrqOXMMN0EQdnJJYqsdDc3s+3c7IQpf5yacwMcTYlFU1yJMFqec6NjPG0RVCDly1G1DFKSEbJs8HgmxexY4MdVXJX1Q5JhTrUkhlwOrZUpuFGPo2oUyGpR35/i3lZ+RK0pQN7VyRfCz0qXuyHzqlL33Z5PY1f/wPC8mQMqFMF8PlpOPZuXfopB3wlkFttdVgWbwy97mTFiBwzlvYD7l0KS14QMB/uPFZwI3BkAwuXE0s7RINQstM8eGLL99wXu3gvBvTF9n5G1W28FCGENTf8L3wWsVTtMi3uWUAYrzLuPPcQ3TW723R1qC9xl8qhi4c5HhnTXKhLUov2TOZkxr9q+CLvodRzGkDBAnSWggAHODYtYUq5BjDQjadyUtZHKz5SgqbqUvd1qavbSmrmSpLwglfzWb9U2IVQ3AOg5NEO7uxDlrOwIEa9sXndtnSc+QcJCucJDp3cradG1yvBvdodqJUSMxhp1xp9Y0l1ixywmaUaU4UqWIv6vPFlu9YBjHmH0R1a1+lYGuDGXj6hGSgtM20bRqI8pougaUUnFZw+B60S//wLK3TG/7G6iWgkDyq06PTNs/lcvqwUpA9REy+jVigpkSk95Doftf0LcRnjFw32SxqjEHFu7T/q05Rmkr7536y6l2BIbjSrX5QKuRRVv3a/sJ9E7/hSiC7CLm9qSagirImBsHb6IMzBcJRaSp6dI/AX77gvcF8ynhTb3FM2UYlTLpXVnJF7IbZvzE3kh609GAWQ6CmwtiSoV+hqFStBav2nCvMWX7D+7LVZXAmN0m5NCHBcmvm/qP2WSOqoBrxVQ5+wQOrcEjRC7RRIzpSPGxLReRgAtYD0K/sR1PwyUWzVtiAJZ39vaq+tRlxmo6x0+VLv8h7Bhh/d+9ld+2DSGu/kXm7cuW5EPB20ygBaYc987Pj6KM3xNYzb9VLTVraGlEDHRrhapddATEkpef8JdWQIcTIU+y7rCHP09isyT7MEQj4H18EKr1sE4oSXjkyyanSMTL2pBn0ZSspFMPed2Jo3zsL2ltbIpikEAzmuJL/Z/Lo3N3t1mDZnHrvAIvgec6UO5cgichmoVgQohZglZCRAGk9MhTIhsz1FpH4VZmIuIPSlsZugq2837xTMAXRqeqFfnA6m4i8/ZpFSC/1ldC9wXuC/+F19m2AbxvNSLhSQCQmUrRhBZkxJcoWGRTZLRAva48IgpRUusqeUS+ShibkeKg3MfY2i+CrDLAI7DpqMGtTGVqFEm1NrB3S8sQT7uhCkhAQIoLwmlDLJRDZ1qejK3EX+Yvh5ih/l0j4BywJyd1BK76daHCwf+KMuZJvbCwPedvxeM7L3V2/nCC7AqjBkOZoxK07bKmivam8BswexQAVoqv4cGYb/RlPcmQkndWDcq9lOJO/lC5LxHj6C2p7j1b51uuwxH8MetYrikyZP1b7FZQdUrEO9vEccDSm9IJ35JjrBRVXvQAjCm8FyTC/Fa5VOSBU5bcYRMADy/NyHJDHJxBzbAN8YjJqHAZTSpfEgaQOObml5ZpcLt0f9VAlInf1ypiy+1nTvfn5412kDxsa8AsAqHhEA87f9fS/QYZx5O0w4PFw24EARTvxAkXyJDMUq4vgjfEOabPQvkUCKep7djRdq9nS4AO5OenLZwAIlVoFJ8a2i3LI256HKuxZR1aD/JIR/u46OtsfKn36zlI5cxbxD43vSkm4oVFJs8U+oSdMMQnlDbW2925m1Gyjw26WIOZRWBwntcc2qdW7N47hLhvUynJ7+KLDS63a3DFiwGUw4phGvooZb65GLL/heJ4xpSTN+B+EhPHIfxPNcFICBGObcuxDlGEmUPDd/g+Q93G5qVbbiIt8iOygQ/o5jDBhgGWJ4+7hvDzmmHfyhLJUVWHClNsZ0N4tgo4p2vVuxasPmFAT+SZOO/XhD3reB489888Ysv33BeSosycSwKm4PFvmTGUAkdu6QUjTvBrGnJzpH2lsFmq1MFKTfO8oYqZ2cDB7fuhoRceWyJ+P+eFASJao7pDHHA2X/sC8m9CyeiNaD25+D+rzrwh0v2HbA7eCYsREgCKPTKYPtlEOEa+jI2wHoZt8iwvvEH15j5JPi1PlQMzANBW4FbLWqvgtYAHv9tI4OQSRaHsnkI8ZDL99yqUwj+YSVEHdKFshb5J9HhYcWvyzA8DD4WjFFclFDFmbv/JHq9fZoEYKX9KguUsovlhK0duJBnYFYnEOgxx2wDcsxqS+6lLECJrZ72ZJ1SMjrlzExkICXgNkA+6ogQrAjDxkc/Qkfxd0jsm2EJsUdBpokdraCYK1DifF6ieeMWWkMYsaKeAd2ds8/P/x5j5M8UaGc0VWz12u6ZCWfimKX+w9fe70CwPQFXqMo6LHXfLEM4v+f7qdUwHcF6wrjKqwAbXWGtjG6y3d42Po2tFzVXmVQuw7Q2L4GV47gciyPRLg5MBxoIcacuywQMTeb+DD+6YchNUIgvmh3gmvWJ5MQBKi/bFxt8w60Kzr+BIi6cTVP2Llne4qGy0U6HhEEqqOlKybrFmgn7inP9Q6GNJ6qj2SUGhCxOJb3R6fLs8mpIDGCTJjMWt0kMerSfSWJBOu+N9nZiapuSeo+2WPCHhEA88ZXbC8jQOlCdMUGSusom2up9pPpBb0lD4KwMixVNwmuQicUiKstymuShe4L3BeStQJOxy/0J8MuyV0X8ziu+wrkb9JNCHhBNQa9ajiSzhwdnMHHSWRoeEKEO2KnBZF2E22PsHC/5YgtqdIDIkQIAPMxXPn7LfEQCtWv/MvMehfxUrSuniqEVJBSNNkTfM9+vb7r1EyewyBSD+JvFQiCJyzfJRLED1mVoer/Md1ra88JRv8ZMycNIA6rHQwjybgB3xU1BluA3027oTB3rzx7cyY8O5gomlmC5K/cF/2/hXA/y7cSUi+GDbonoFzVfU+yM1cJXVTRvZiJTr3lui/D20KkLKi7+h7XGO1P0OYSUY5VcsHRNjDD4kK227EHzXfD2JFRErDQxZH4UNb99wX5PjKKdpmytiDHUFJ4hUByOWJFh4pDXmEt9P8U7HvGws+9L5AdOCQJ4N8iCylFUYBYiE/pW3XDe8HuY+PFUEAUB530PGisD8/ZG6ugno+kZgCqzUFjIihn84eCSo9Y25GLTmlFDNXp55FNDaQkQ1GYEZZfdyuK7pyPSWn09o1Yo7AnvyLG0dMmSMlAPNHEwPsE4ekALkmetNqbzr7OmcKsy/1NvAb6h84z/hq6sYHSH8E7hltgI3jxgkcq0dK1jUNr/BwlV42RYqmqhSTZ4bG+yz6QpuMXKXXQphaesKrOmxVopIE10rtmvd8eKoo+54Q77iq4/kxwSZIeP2oZlm46b28vM804bQGarzlo8ZXDrZB7p1FH0POnQ25KuQaTzvVynk9pqApe3s2W+/j7FvD/bFnubfeltI2WnxXlzQfST4yeBbGJM/r9t0qepwM1DanVjqI2jFJhP17mBwXkrXLm0Pz+k4vMHx25AnYcPm7XY6tjkglqA4ysWGZs1Q3SiI5LVRwEx0Z8e38rUs5AJ3eJKw1cuX/YYjOZlVft63gUEuyIYopz9gAhKrM3U2zshAymAgCAzkCDpWooFzLQN4wQQsoCMEuEs+Q8Ih4UMFfPk1VhsyRgJbwnFcrtkxxA1DCnHyGl3/48SOnexBQj/OxAPN4gM8leK7CdvcAQUzDc5E13RzvAB523h5XnTMEFrNAOEk9ToeSLApe18Ir7kEl0EspG4UsqG4yFrIFaMkQcxVHRS9DGHTgfqF7axPAUyMcge16+OtFpsgdN5Z8F/mZw4hpvD/SR7JW3BxEO8D0UhLKH8Cbjqt/79t5l7BYb10C+utYwfL3TVgQ+fna7/I2hSYw3itBNfKmyLSAdccl6rmt1HCszDA800XU+IKEmrLQNZJ4xz41TlMgkaDcmfdAl2hUAtVBaCGv1b7fw1yt1EwVWVmLgv33raZkKmCoZ7HZTbT10DqPpeefiwd39OfvSUsWNnOI2U5uKZvMREVM2yBNwKbjRH0zVRzbIsh4RRY1YupxzfpH6ErQQbJblf+Cfxw3BEHwBlGr0t1BpjTcGyNvvg0iImzf5qYOdebFeO4qjVX76PmHwfgeUzbIyDx0TWa9b7Gtbe7UUhpZSsydiAhbK6lybJIdd7sKxjLbUmpcOVWP0n7sPwSqLuC9wiudcr0Yc0gfDWJYaczbg/nLfLu6B9ifAqRquJvTTdYvzODlVkc0hSS71e0VK218cR2NaEEVH9AJp58qB77pOixq1xM92SvOz4HvzXmRjqNYQHpJTQLqANbB4xZmOsVzlyvcQ9bDBvi/xmzNz7lMHkUKTxx/XkN31Cs/1edhpBtOzLKxQ9It9eOrmnd07zRf+WQU1vhqXPFCMoyD8XOEjD5Xs11S33rHbWIQsAyPF7xByjxRBQanfjMR2bmoR8+UYKGiB4zcmHdNAb2vSaGyBZHlXRDD+0qfAu9MT93lEx/c2DBi3GLLF4fReOeQ2O/vI/9YjjzUOVgA55lwCNZkYnjYnFxBdO0irEZ9g3GinbxYNp+daXsgKWxzI5Nr05Ou171lws8cQf/2nDnthzJj7R8y1DSnaBVOTHyVCtDBIcriaUPuiHySAp4rkIE+CpE06GwN2rcD38oxb3Be1OfvdtSDeEbLZ8ai33OKMFvadKKX5j4FZwgOWxYfvnyxjSgjcWYEL7cj+thR1+BRkTi08YABd00Ip2rL3KSpr7NzhUuucaTfxU+UdqwG2e/sWtkMkXPufwWW/0AHpZDwhpFNqbUTzeIVdUxuDyP0A/23GmYR7tEWi3KH09ItZptWavWrAqlIv8nHDUrIhIsL2pupb8STWQbkIP3J/7n08/bH6tSctffdUeqsKfmE68abI7yQMTCoGQIoJcg/ALKfzJvI7xSEY46nNqRIqQL/gj+Mt+DbFarLUKwzafpwspZU0BQ8DtcYsvqaZHpY8iPKofJiZg9BnaiixJ2OZAOkdHbzXZ3W6eEC6KZtrja5QmuhxT0yniJhX0mTY8QXRxvh4RsjqE94+bzCJPSsd6Vb4DMe9Bu3V5c0UrmDqxHQhkUdsjwXDlbpR3p/c6o0Y1MF0YHqhEvyGhLtzILpHU1XG9KHN3khY6Jz+lKGaduNFieW/G87Epo3Oi2/qRU2kasFAGMp7W5CRcDAHMkA9UzjKvVJc7VlHd1kQ5bJSjs/LYwHAUh8qubTanhj6HPsR6RMWtT37SzDOzf7tp2Y0mDDie+OFzgvecZnMX2w6laip5cQRWuLgkjAvYy7MyCxwN1KVWI5kv8NPYIQvgCeAHjFhHAAsiVJ3mzbcuZ3T/YP3kx7Z2z9PPAbH5xr75d04djjLGFTxeSCajx++Fn8lXtLGwRQMN0hdYNVJvR3dNw8Hks4Z3IAYs83iL5f1uLALUGp/FN8KqJsjaISpiRwkRfx0QBF079KIJjmMWZIB1vJ2tRzUPId9thtHtbgOpjFmJWdLdXAdrO00+ithNGYA+/bMzF2hWIcG7voIHgbOLGoA0266ZGWUBc9z5gX/RgWyIIqijD56oMopQvcF7c7sGw+CILQqeqTpLR7ZskRcyA9PZlmV6WG1WUd15trpObFtRA4a+4v3Jr3lM0S3HX1iqQmiU1l/ScIwtqrvtu44i9m8TDYLpIHt2cQiteZAAqsMo5siTomc8yKjhwJqh7rl/02mfmxRT4L99wiZ/XS917+aHs1CntOnH76UL2/zTIpfnHBifSPTTJdgjgVW2+NeQV5LD5rC6xtqiMaUmSQqKahdg28unxNu2rL6ZtA6oxth/I6F73niIdctJ6gb3N5vozjudjUymBfSqt0Ll0QY+52wDrhsDi3ejoONMC+tQW8w8YstGbaUfX3B9rns1enn4xLztVq/8HWs/HlwvaAOh9TSJWTanZynK5vaRp0Grz4qxOiwi6qPNnBvlnyV/BBAPPXHsftpKKmx9Qb1qFxECvj9YZmmwE20FxDZItD1WBVKqKv2QA2RPmK9KW0jW5jXD9jaz2hKkK18F0SbRBImOwNZnFV0Q60eFYCPbCa9BCAsLzrFNIbdA82eScbSMqXhQRpKZIDkDygHDOwC2nOJGyLIeGuOKDU9SzCXGKKMb9s/TzxjCQkhwS2vJib8zU2XziDozmU3CHQzauYu383MhEnwggFv+zG+LtzINYiy/fcF5Bt7XsyVHJ3P8zh10uOxrF7ap2DIlYxr1woPnWbBlvwlgj+7sFMfF4Mt6MSnbPPGLL6o8Dfpm2zf27qxLQrP8B8QXw1v/q7BK6Rw9DLQW78d/7WKQmQ/pMJ08tktYKpZRlTgLUDOfmKjNqZCaXtiYwHHHSuCdW98CupC8t2iiW88MPMH5X/No5QreIsJ/ItxEdnhHVRZ9pN/CThhGM6il/H+oM6Np+sEupEG9XxPWZUNd2zIFJgT0HwjLxVsUW9RJ0uleohXMweMWX78dwyxB+cp21I1++vf07uExKZITXhESXsUmZDk+tBeKdh/5vak1dDySzUAGswngWOZAOm2UjBICEETUl4V2EeTtWRn8he4L49uHeVOK/u12KpFpx0PCG3cySZKXCIB5wSzJZKeGTCm3qVL8D6KWUT3GLr4Nm3VFWbkxTEKAilHHQwKIkeLZ1DVoE1FWEuJPigYjerrFUcm2y2MkIt523DniSLVICO3LJGINxZh7ed5YfIwd6RfZFfpkxTeX9tUDzKQ9tf6nCyA0JqD9Q4AvdadqLGLyWZTigSi0pJJo3TwiKx26vJFkPCIB54TzFZDTvNxB4y7JoyXj62UAYIWiYIWied/nkOrEg/YzQBG2H8T6iijIO/5HLeXF5JCKQdMV/PuauGX8A36ZnCTgSVBdHdwVnoxbJk5PxZZ7XzDNThwJ0OkHw5s/CJUtj0DsfoXzxaOiWOWI/dvP0m1rijPf6CpP+NyjhqOWEHzMWNZmB+3pjI4agHokjBOOzw5jYcE5BRboSfYK2FyOw4ZoZEGmODAFmD9ilx73qeULlyu4DN0zSH80th3VtsGfJUcQEfyfCBqfGLwxd9wXuC8i4r11x7zarWZpl5cUzZRjfvuC92wziM2zZtYmSzFgeu2GAMB99wstwrEn2ofZJioGeNxFcrCwrcdQ4ZFkF1CFAd6wfX7ZKACeLJFkPClursyTwGx+mL/eg8A+MVpT13dnwLoMrz8ipLr1iiwi4jAKzAfUp2G3TjMbA3kgTHIShW7mjcBZhw5+P8eiUn6C5t5HFmxztIr7yg5I2Ml/IP4Kt2RkML/6N6FPnLK945pEHL3jKDiXZYBJXXav2awsh4RANaYf8yOu1/KDdH9nCVNsyNkYvJFPI6F5KiyHhG6fGYjdzFVCvifUOkvcNsrezYoyDwgplww5MgM1uzTCsKyioWwGCAXxTVsQ5tEX3kW6M5Lr8BHUKXCGoZIsGRZlqP3MnY3TlAMCNx8UYkrgqUo7QMxZfT+qYUWFfi88/01Vp8ItXJ75VIAHiAyC14SoP9lbodMylSgBcaJMUeWU9TO2EyX64uHvI67fBFaCSho/vuNuOsnLr0hWPU71MgXd6kzqCCEdyx3qo9N7gvarRXpwmVyfy6wb+5k7EA88hTp77X5Gh0c08LpHTNlGTV3YZPN3+0fLULap7LSUsBp1qoNMEyz4Q8I4VRkdA1TOQH5w2ZJ+4sJcIgP9yV1x6eAk57VpsBiZGHCmGEhF4r5yekVoZVRH6jYUtazrYRZKJ2c33Z2tD2/ylVXzT3VpDkHxYpiYO3M6CG+FGcG678s6dMoJlVqlHEXQvbpvfhYPQ7r6dRFlukkhimOnnjFoJq2e1FkFsfOx/l8UzdMTLJvq55vxOJ6ThUflKiHX4+MUlTibyZLL99y4/QdCz4oEDwijolk1BPpv/jvwffcGA4IQMSHkZ2UfNPEkKe81J572ar4tAMETjAaJKGoGo8Hnbm9suo2hVuhG3EAqb+aUVo+EufIUAzpn515pUcfRmRtcUudrdnz0RkQXMAxJMA57Zcc2J4gWQBLJ0DD+ZkPvZDpkA9UzbID0U4quP5Mb6mmRS+eeLfOUMDVxl5a+GTCdmNgK8Lo8A32usaRL1wTe7IYx6xzSe0tYgGpY1xvBCvYgF8VGazZ8y/3nFw+RcReeO09o5VNnWOrKa46mgNe48dRhicPFyW/rgFgZwvNiqQd3xcRy3aMAIvMBZctSZ1VnYoYB1pZPb+QBUTZWI+DWxIE5cu+QuUBkkYSDMZGe2d9wYyWR7Z3yVqCHhDbzTIstkRWutktavEMHjEm8kK9eDPwbFvzsN2NSIiDld4XYaPAOrwNL08YIPCIB6J4ba7DZRmIciHjItA2EAtE0mekp/PYgvs+BbN0OpyI/cXQD1KRmsvcHNx4Oo5O03u4kD16Kx5eTlolohQrKfBftyzmBaOOHm6yZaM2yBgDxiTaZtgG8YsI4AFiTwW/I1n3/JTxPIWeQ4BU9BEEKkMCjfdMSbYrVBEC+zGLL9+Sxl6PQAV0G7YmJxUlOVj3BAMLBMtUTz0OnHrcj9WjAqMOLKuRjeqckNm6mB8H6JJZfFJKkgcBQky6fUfzzA4Gtg8XDTIphV5KfBftoQZsN17gz996MHgWOZO/gNeC2FF3LP9Xnm8V5kU2Wp0uCoCm0AoocNuK0DUYt6jDmFCbMM7sul733EPUDvSDwiAgCM8cQpLxtloBmBcEmFttdqnsWFgcvb/5R1YoMb59qtxFFiZLL6mqYmWTgOI6IfOYPvuFpdvJ4BRIsweA2LMAsyDz7Yehe7dTIsh6qWbjPwlzleKlrLycRIBbLGVjVPfjlmEVz3LmbhcYo972H8TrwAaong6sXqifX3IHhBKuHpAT+TieXxsQDzfDJc8IeENvNMil9UlZKRUlZHMYkfo1FMyhrh4FjmRSr5wMcRNx+HeqTw4L2/uKgdhoix808Acogh0NAkiZItJXC0ArNh7szu/YcqhRw+6Jx1IBoMPqbrrhKbcyVTa1ZumeldvR74hhytANbprlAf5LY/R7wyvhL1I3vfs5g++1WjZAPXEjYBvFw3+evDscyAeqZtgV41zyVFkOYSpm2RZRVkVRjFl++1Nyys1G36saiLNB5/2HyZzeB4FsdlB+1j2uiLB5m2zAH5DfvR4lJfZ7m6OvdyGDiJ1qN3hU74lXJizpyajpJ5xMqCg0lrW/szxi6Rxgcrb87MYH32/zTIB8TnumFnhiwqZtf6LIZXXlPZg/+LCXCIB326RZDwiAd9pHOQu+e2H8HbPjd1sCwK5MTfIcUdnXheBtvQ1HHyviD5Qe/Uzz4yr0MJqmBVkQNYmuy+hzAuDQ0wPTWXuExHbmPjGX0bIpfPN8MpKxRTtM2VsQEtrI6Nf6H33BW43xEA88Cx1Mh4RAO+2wiAfOyya47L4acp04SbgWAVDo43GKbPmX/i/GAJCDuFUAHHk7/GLsBAADflLvyebNVcZgU89sD6EO7nj9nQWXFERtgeqJ5vgfdLtRRZDmG/fJiMrrw7HMgPRvwsv33BW352G3mmRZDwht6O7gvcF7U3Qq87Drb4022Fsnfhk6njC1O8rSa6H+at0xyAZcG3yFwmhXcAkWNpRf3NokOf1US7oeIE0VrhJvrWXubMHmcrv5o3bW3lonRS14PhqCcx/fhRjIVXd7NiOaU0dyHAAsSdjmRS+l3fMnYfxO9FiZLM0Oh4AFiTscyLEngt7gvam589Bt0L3BWejwxZi89G0QB5q/crDiy7ei8lkVwgoPP1iVHlwgtusRtlloAXOVemLo0BvF5xKwQzdUR2SoXRe0RY3kTI20Mtxg+e7zNRE/pjZGDeK8CmZH32pxj6+SoshyztMwkvcF5DGc/wtDv7grP088Yss9qvo7uC9wXkMY377ktdBRMiVHmHBuNsLUtyzFBA3FQ+SuajeMw5XWjAORvs/Te8dztZSJ/Bt0JDwmWbndq2v2OZacBxvK3E5MPtpy80T97qRjqILMzc/jvubD4kfYTGCWB9m3yk7+UzbAO7O+Q4AFkF0kdB4eC3u3Ok8MWX7Z6K2/OxAPN4e+TW4xZ+MJ2T8H86DHyEY2ZkwnMAr58eeQePQp+bHt8z1P+D1HaZFpmlnfBvDHjooVUu1XQxKKmpteULuGuZQKzrQAfKTRRn995hjkuKjIS8ncLr4kZY1BuE2M6JddazgE4BEr8h4W0fJrcDBb2q0bIpWeGLLSGMesjmMWWjPaMoxv33CyxrYQbcTcs9GLMB2XkMU+C/fcF7idMmYZXGPEW4nhUlbBNYBRLzam+kzkaCN7OhR6/pTSs3LdRYCaQNbpy1cXTT0G7plBrm26jH05N4/repxbmDNMM4tTOxT8EQWl3qunh3lNTfD/HIfoPYBDyJGwngv2z/V5Mb99qtxFFiTwW9qtGyLLZd+zN8D7tdb7FOSLILmjGtg8Y1y2wK96LIeEQDz0VoYziHNI6I/n1qU5HXVB4jGOUFq8/5PWlJIIEUjeM3J4yUc+tf+BM4MqbUEVm4RI8MQlKzxZ8KHN1jz+w9NmvYgG0poNWxX2xBS7MnWNhPC1uW2H8jy12G7wxZfU0yLE09mLFwwW9qckI6Z5fbCrzsQEb9ThEA83vMT9HdwXuC9wXygswdEx/2cRCG0n9DXRZaAy6Y0DPnA8UryHVkUtAa/xtIgZlcPVDwJukc1CNxHfUCDg7T/h+Liz3Cn7p7GkbF5XbE3ZSRiOPAEH3eiSOTPgkUy4gHqwOjxNEDeBDkOGnRqKYWUzTZYAFkHApskWJrBbgi3pE3TMJPDHafnr+U9P2FL99qboVediAeeCBtgvmWpBWbWV4+Y9mE7licu+YX131Z9xTcV2Ajv7WFrIYWCHtiVyN4Kjhhp8Gx26oiqHf3BWqpCLiAhxxKFkAAP7oHJVdPhf8DdzOxsL/8DdzOxsI8GsNuFLyDyT5ZVBBI8nCcYN1AQSQyoJG9qU6V4GplooIaUuPWVt36v+h4dHHd0UtyKZ2+wzOj6P2vASZsYRQAv5sF8vY4vfTfa5RVMIbX35AjqVpDrRxNBL/4pwwaw2CzqS4XJywUllvNOJP3I4J6tpFymj2kcNqzY8674Mged8tkQ4vjXS7F+grTfW+Wk0FPLtzi6vgpMIGxRu3GN/r5SaTVvCekHai/rBAwjl3N3n8i1aK7vKr3tTLYnfOS8zEYdoNJv1P2G7x7SZmvnXGWfp+nvmOhNpnFhVdOXBvQzPP/Z+wCnKGA+mW/gZ0GCjyKYTO/Xy+7VQWND+Oe/K3cLRB92K2F9/NdufxENjhoZUsKCPi7xjRp2vsWNG7TGMNOcV4G/E8IfxmYFRXPQnfxlP1gAH7l4G4pjJQRR1hfCEsDdrWEQwnVuVhzGIjB44Z33mwDNXH2N2adV3WxcXIaTKgByCrZ0B2APOMKQqefWOZvx9wrsXmd8sVY6ChM0l/2PcPfg9N4zhwyy5zvmNLF35ifReAoVOhJh3co56bChHurh6/91ku63raZ0RgJ9iSnr6eODiR7X2v9ETI66NaHE/ku25UW8fSpej2vhxjupQTBgc2EGrzkmrgNKYdjChjS0Kl19fS6mke7U72hP6zw3s9bhf6qxoVx5Z788NjtVLQZQwzaUNV1uScT+tHwrF+GEkSk9opXu8LdkSgg2OmrNWcl9m0JuBobexVonVMkzukjOvMG75SF8trcx6J3vJ7zv8yqLrLuMYytcwJcjtcwpC6OuTQO71XCCruKjOXbmZnBOkpnObh6Rrc0zatrtcyFRUzb1W+q6716OX4lmmfKWFPhBMFYxUvldXVYYYqw2wjZjyRK9yz2CwXvLWTDu5enpkPBCDNVFyHIRqj9bGRt9xjN+h5mKzyjtyyv+8LXXJaACtTF9tB6d/BgMCUK65KKkBNF/hKaD/IMgS7DT5roxVwc24XsFaV8qPsAUX+16ov43BfuRxKjylPS1JiOo4S0ZfAS5S38vzlbNv/mCL/GHFLTM9mP04rOe3lAMH6QQDJ9wwT1gXTNwXT3pPVURKJsXlR3cIJMlH1HZVHYAvAtFSJhd0keiByqFxlvI4j58G443pSyWIT4uxbuZGEOPgExaXfICJG6VGXOLviQ+50fQOP49iqSXg1ph7cb/fehPVvaX9VIAdW2GeTHZ6StuXxMRmGBKEb+fekEipOaPCeQbmCpAkTa+PrVoVUKwOY4cYGolDCG62tz3m428xd9YC86H9BnOuaxhdRw1bFc+P8mFRRt/SdbHs380N8Ntk/Acq1bH3a+oo5mmzxQ3rt6FNzMOkhBSet0+jWfcUaZfTQTQQ97UduxH4Y2coBgtepS0xegTliCXdkRMZ0PmkDmrx7Nsl5Ukokzz1dIe38f0/bpp1QqByq1mTb15oVD86p/MQbgAIa2mS+KBvfSLRw7WK7L+P1DgSVNCHQFn7d7vZrLQVyGc71SXDJrLkwTul4LETyRZa4aMcmLMZiF3Ua9Ndq0DdBsBJmD9LPwl7Vqb5E0ucGYScux1FtbozaOiRr7csSmAKlVns/mOaknpWRYhKgD4oyZBbpUdFQ0MUXzlcVVN7st9KsXYT2xx637ovPtB169igtBn6gF6WiJDj8jezCCfGgDckWq1Co9HEhI6437peN3KA1x+KE9/18kHeQ3AC4IKT044b5yl7WPHYSUnSelf+F3t5MhMypMAl8Yxf8F1R/2/3Ndi6QYHwQBW4zgRBisifK0zgjMx7K83MT20V2c/XR0s16iXvMXivfOw+VluUkFd+pnTJ4L6nSYdbeEjPfJ/7eXVhDggDuNhJc3jueJTyX9fKQDjA3S2LcBW7jsVuCsTXbkCwSuELjS22SL/oGuKO2nTmBfp9F9Df/WTWBnCcVAWFU5X27u68JluVoQ2pg+M5dkNuMcc6OZH3l0Hr+mNdL6+UXwzVhla/kzUUs05jvWotYmeA8rPmhgn0kcUTsIKKxtHn1C9bzKzUmNVJPhtLE50UV/ZnL3avPsw/JKZbXJF5HYgCHnfkxrhe+gwvmOShO+1W84dC38G6k7vinaOMftrls+8mGMMV6EUUgnBxKz7QF1RGB6BCx1bF0kSGyvQ1uTS5V+JwaQoEqIgi22zUvMol7i1mTSUO0cpqPAWodRz/GZyqbxXRWX7qTU5ix8meC9NoPLqfA0h/RKRMyuQ25UD4j4fzDHp2ZbUah21SBXqH2cGyn5ceJuRvIiAD+IDD7kJhyfMyYIVnImwwm1mGkvEMj3TejJ23fSGNIMCJXLWH+sF2swldNMdVuCrxaavAZpEnEnNw0Bs73Vi4PGLh5gsbI4bWGxuqOU7YW/4Gxr2byQZ6a24wK0coEVqHJ4MuCKGb2jCNRgE0FtiHPGhvwvGi6GAORLMLqkP/P/HGj6U5n3eyWCdfTumN61wcheWP7F0O3oXY3D1S2yJDNjzgxqhjsHA93Rgp0JXC0IMBRBSLyR1vaXIwSpFQv++wqCLv66OibRsy0E4Xtnq0a3Dw6Qy4gl/mpCT6tO11PVNuLKSrwHjcXPuK2taV+ufDm1BcUkvLu+JDbhO7+eIj2i52EErO1FNxeqLH3j9I4GvLwWnWlxJNxUBp56urcAI1PA5w/JAVVHDleOAdebCVRrFqEm/kw+UF5rQXT3BhLEBKgTAd9wAoGADUFYeWEPxvIbZlEovQf340R8kgxZkAqkKFND3YV/h6nGDnJJm8wP3a5+q343j0RJavgV0+f2kqMFH4/Abm4KwlZEMV4nnpO5ZUG2rRubG8/Oc1RQr47xRXGDwUzicJOHz2VIGKa5RS2mACBJB6Rek9pwGRRNL1DbfVkoaDqJ9ZlgedHqhzPBPMr6WlwPpJ4FCsZCv+VcqLsSrd34RCn69YMN66TZI2PIViLP9nodMltbiMSQtaV4kH0Y/9h1qy5iRfioKQUbc1KuLVRl8VfyOuHaFdxajOLdcmKrfGDxmHUQnINKwrE0ZqoKyIUwWCa3S9u2yJegT4Fx2mvkneqdJRCb6wh56paZsbqjukFIJSE3/pEkJeQbkTChh8FD9YoNEy3M9WOJnPbCkRxhqjAuZhPbymaJc5m38h/u977dGdWqUVNeP1Z+Z6V6ELtmJMEkR6J5z6WeDKzXMPzm8T2mQet8MXh2sTXW/ZrkOCC6cSXY7et+rc+akx66gN+7LVZYUQDCjWIF6i189tZsnBJlkXIre4MAcJFd08EgcZMvwKY4qvL+7p2mB3fxtTYuYmjHb5QDhDfysBq94CCg33ZD+aDaab9qEjgjKGgW1V2DWgZbOPJtA2Chj+KOudI7ZDqPBy1o/n2niKNcBu7EBMIxWaP6/f/da4pTnn+UpaD2OAv2Hsc1kIoyuUXDzgkgYCd3GwPOFj05GoZQu/zCZ/GJUfzroqoXvbHULDFhiXJ03SOdPAvSMqPRUFfPaG5yuphG8c2ra4cQm9Q/bZdrc6KKBWx/WADoJl/snwMFi3mx7ckjYCZLGigheK4Xeb/4hFrHmbKli6/zcJTC/vtjqRoYGCDLbD24yC+TP6JUg2tQjoJYyNVGafTFcS0luUjCYHbyPRdb9i3iEqGcjA/oqL1ncSs9C3UvFavGQ0aJFbzZ3yFeRfGjolBTADEMrQnXzWifADru9GHXifwdOWWHRQx2O/MQK4CzEN90Qzfvse255PHx7cHY8NX+KtANhyttLotjylR8cYN8M/zTUZbu56jt0MS+ZbR9MBWznb1lqzbtuNEAI6occFsL+ukt0I09q0zthSe2WwNo689W1DTWVaLcoWc56rvxIAuYg+t4z1yhdhwvq46FAUL6/oonxP4yKKCaMthrbhSctxaHxsAHJ5mCK0e3w9Gii3KSUgUXtomsgAAlKeoSKZiu4lmRIsL+9aQA0PFRHXxWIAAGswAA9kAE7kQIATzADprXjmsWOejUgTakDIWCgdCClRTxsuAsMW4j+8mXO3EgmkWLmq0QfhzpzRUbGgKgA5h0orxHjgodEEz8rkLMcgBQcgn2i4+4YDpmMZRTmkFwM40/bMu/dTCU/gR0Sz8dkzsU9dyYzi7HATTJx8D8gJdba7EdYU9qynKG1mLZAEMN370pk7bvuXq1Tuh5SGHnNSJi0lB/fIGwH2VAwbPI9TApry7CZ0VaC2exn2oxDSX2Een5CaVvl8DdkT26iKVwvCq2pON+6BE+frEytEsVSFXjjr7Z/XOy/+Srd8A4k1k3+jW+aX7HSczqLyZ5Joe4xtb6pO43SavYkSO6jKaMuFoeXcN1V/oc4LzJJvcKplZZ+zWBSpG7H9mRRqg54TiMlHy3qL708LQ44FWicnM3OKoTKBsGAxnxDkFYptdC5B+hIguAMt1StlK15BO38tcmoAarJAg3jbNaxfNUOaMr8pTqEBRTTeQD0YxvRGFK3jWCGnWnKRAsnEYoBxS+8FBJlcHqx8YhUo1VjqLkAdhQFdh34Ql5VDcbbkc5tp5lkmm6CJf2U4HZ602AJ4l7ElI4o3OxREmWJuNES/rsJlvF0hXN76DMqgc6OLjIWr7N9CZ1yZqhOioPwjUzk03diNxuhlKwLGFsAygvVM50o1sJ9Da1FMWAhhKf6umArqQKesTPoGCLyGAR1SIBX4z4VmuLgb8n+3sEAcHEMq3h3ib7dLO6r+duuOA7jUmrZCftsfxHRYz47K1wqmyccAXQmaycBimnV4caK/Qsu404OM1599lBi7BtdL/j+BLUk9Cj9Oss98AnvS5doM3LmiWt/Cfk9/cZfFjgaoQQhKwU1upMPl8tlypPLUk7oVHeT/MX6/7NA9vyisrzHygqrVEzuV3FSnjcGBflSbHFyTO0ZpMRaDS8DncgjAae9WLIDwsM8Zta4bUk08az0urrofNnB6r2hAxLQBCOX98smYqRKm7dQnXoq3l250yV5u4a5vh4U/fyauXLKooZCu2k1ZA80L355w3WUeH6jCLVf0/THx/zkC3TyTretK1zPh26WffMIcyz/nTlYV9KRa38dgARmnsK3FJilYURFUxSJKgnhXcWWLMI7TUDzlZIYvPfq56xSi2t+4HvYWHQuHqPWBXjDxkn53JCEo9AYTs+IJOrmlUauQZUdq6URKRkl5Bf1ZpMY52OF330/MXWT4C67GO3FltG+i3YbGZL4XSgW88Gu9KgSEKcmr6c6J45yB8+Kdz35kXsulGKqhsYBD6gyi2GybZc+JvgAAABiaUAs5dJMUAACYbkB8nOcoBZMxj+Edgnuxy85ej1GQAoLYfKvtR9JPsVV8AXR8qhDfWvy0ut8VfkSJJJzX7Z32xFtlkkjWIZ7pWTmrtV0OqhKSwO86OMLasjfsQWelSRq6ZSsrBUjd3IOCXyt5BP4M1mFBffA9MjLzYQP39rgu5kvQ56F4RQGm/ToP6hjIclnk0ogXf17oKBSOcyGydkQT1kycpg+Deyat3jmn0+WTAsvIHmH+5d+Oe42pnD/Qd8poMQgyqORI1o3bdn7cA0pZ1cAn9vEtr8gbPUnvhoEaVHpYHKdnQmIZ646IDmvXduNu3IU0C3RMycw50C2Vqqkrf5/E57s5SuBq0FzwaZwG4a10HMiKlCC2stJaYqNpPdi28v3iiRzzTjcbSJapG2AycOLjeB2wNC+vs95lBHwZclUXH+bdfeDpHV6JHaQuJTtGhQJUx76sWEdu9BNqQwRagTM+RT4tXW18Ox3avmwXId+MYwuodwPnQevEJO3Jnhy5V/PFk0xPVW0Jr3tbJkmHE+GUvZHma1tc4lkuD5nyDqyHo7tFxM2VhH3ssTExzT2oxDVumEyeYvRgJS0ly1+wk8rzjij+IThowHHoQqF3ZFCvxNd1IeK4BaYWh73rx1lmygeMHjqM70IoKH8oITzsTxtc9ccEWTg+5LEfbZU/eZYLk8GYtH9xaQfCFwC5qKPmMa4GxZodjjQEaXgh6srOLuTV0E5GVTIzz9nM3v9u+PP6m9ceCssF2faH269z3ivveuvXeABcNsDV4aS10OwY8LtkBhhAkMTUPqrSSQyuGQ+tjoiK8xcInRLElqTwhjAsInsbxC2jY5FfD14cXRdP+r4SgVVK9yU3esjFK1n3t2rDcC0y5DDP1Llgvl6dlSXRtxde78EYMwzXLrAN16cPbZ7RLQwC0BMCwvEnW4ntghqEwGPO/TlqMSntC+vuZZVK4M/UhssIRQiJxB59+SI89DVp4K78TX45tzSWgzXcE9nPWry6avqFlqhckfcCmSz/9//4sRbPDEFLl1WMTwB13V92g+s+vF3j02Mmhuw3SSc875b6UmeZV/r8ms1J2H137ePKQwSjEdCbgwsOomLPXW0AjEB4Xde1xaEltzm56KKWMRb9f1UHzNZfuu9MuUhXZ8O9t813KXjlf5rb1lH4h5RMlp8v01t6Owtu/tQ0esLg5VAwiqDuPkqKTBrzAijMnWsqNPNBPw6Io1WAN0tDRcL5kpo4RQ7vFKXsIAD3kbDFIzEkM9wAXLBWIZMAB/RVdtmDIAAgjg6b+RMbUg000GCa9VB/YGt7epi+YmoIZD4t5GTGLuEoOjqfrdGRK7vl15ejZEr0tgXuFplo2J2GOvEdw1UYe47G+xPAQtkmjfAFoatCbqJUGePnnpPlhQi20l1o9JDSuLA98rB/vMxTkFlKZuN4E5aXX8IQrXOA2kd2HMlMJdoCgirFfj4l3gNQ/JMEjgXMXHGEnJ8DZCYY3MFMuONGiObkonuhslBxhyb2NKvClkufKy25+7+Cn/8nfo7tz+HQ9nTC8WqhBj69z2UrhAERqnZdF/uey50wIKM1kGolt5nb67vnSAzoLLd15ysBqvKaPoXFJRyGLYW8/QOUD9gVhmPVQagvNzZL/ouoi2LKYsyl834pR3GiSkCrRd1ipoWNws/POBNd671TSim6KLBgGobr7V7136AEmemUvOjbzvXgwku0YUIz+3+rMKxmfNvGtdMupqBH1QNSksbIYwzuFOy8F+Zl3AJT3YsL99j5GLWx3Z3Ham5gjDPOgs6zx+pTa8vYQ/o92H1E51iRAm8qpkSxyyEodSlyarYvmYreTJXTtitf22CLKE0t7qiy9JPNJ+LUVlYKd1nTinHjETkoGJdTReOVDzvh8Q1UVZgEuq80GNBBxhs9XXdI8jYRK05COeO1QKPa4SK12UyEsaRgm7Tx2r6WXLsLH5Z1oB7zFnitum8sC1clSsR0IqIfz48Cf/ExQWSM3B3X5l9ZPQ4tVDJR56ZSXKUBbZYju4y9eZRwsoctnZkHLnM5u2VdBZIQh91aaB8oLwMPeC9P9McLTlR+D5DVef+tieo0Rtv44oPKOrV0KEBH9+fNUvxMHmuIqgUSz4a6jDMb3GRnNFkVNt7cJUAKJgsIm8L7OueQzyGJ9QWxYNjH8HEz3CUOV2bRkinDlvOLZeIKqmDoZP4yCcLr4Zii1QTTwLbjCaotV/p0YS6FKL1DhScJnKrWwDBDlYfSVzXjf5xvHKYAUrPH24KN+l68OJOOVxVbo+/w8oxsYctPtOek9XuZu15J0TCYQSUdSsaXJhjhbxVGaOHhAfScXj5TRcpZeAm2bvbqRtS04ny2VgPeBL4yhP2xexDhyGcGUaZiujNzBtPDJv3ZVfpvyMwVWbDzGyFTEKPKjByZU9fvFAWLu6MMm7qQjwKhdxmWD4O2YMWQGaUuhtSlzO9CghsCNBtt4OF6gkNF7QvCTLXLOrAWZWusQmSf4Sf7ZvuCOub2XNBGe46RBRe6nb7UhZEmnK6biEXD8Ca20Y4w78hsEWyqBURFd++0N3CKUMW6PW0wjf4gApaImIAAAAAAajBFoTdkWwgAAAUxWW+FUMgZmpl5VhdpVZUL0Hswz4Qyn6DnMAP1QbXmiDt+XruwxW4dUY7DpI3JGdQJMtMEE8CnRNp0wiFnV4AMCEED9+PtWLoN1Bqwz8xO1YlKt1rYLzHrOyS03SaZpi2S8/P1MNl1XMg6rsiGDk1+3P7+lIY9hsRNcrxHkj5yYRc/Gnsey2F92AWhSavl04LYJBl/kQZZjLmhbNPRqL7LCA+3O9Y9ZqiAzcyrxehbt2w8Q16moTHH5yxJ7frIz1PQmrZ+p571VxxoybVJMsiqmgliK7rq6GfjWZpAe6ACQN+p0dzWkpP+lVqUCCDzqH7C7mehKn01bYjnBk3Pa/PUBKLw/aioJqrXnpZB97cLXWYFEKl4cCL38hfnkCOMCYJycoCybX23ObQyR+vVgOoPxExNdOu5hLaYZXuZfz5b2f0s7e6iqukv9Q6camCIFj1yhUvDIi8myTOSQ0zvJCttzAWiEf+A5DBGvOgBl3I29cYC6P4/5b2l3RlL/kDNn1tmIohvwtlUGJTLAmiTyRocAA5ZZiB5SdZj3MX4C2fEVKxq+7TX4UxRWzO9hHZAIxWQermDo9jSqevfqOWMidfls841/kv9AS7a5JqDS9XD12zLbKjA5NbwL5iv5pS1B29BNHdJkehGUJreqro8ExRM+5mXx2Xdvogx75HJAGBvHNLa3MA4l8KL8euzegoiFw5PeHyX92v35S6ef8Ky3jyr0t+rCmldFR2AiVXDq5UG3CN/W0Q2O+tZAjYAaj8UR61Ah9BzSS4kM76wnyT1tDwwJ8IM6LivbAqa/zB4vFbn1RM7DDat0WfUtirBrboKr1MH4ruPTiWzl4SFt1BBRkX9XGV+L7oczA6OioiYdlQWhcn8ZDqzbNPIAbheB+opRDaOYYDHpsLEAn3m/Wvmv+Sbg8u2JjE4J/7y0z90L0twoBGzGd5lgAyuGL4/ac3XsA/yBYxSUydlSH1kpMI0cv8XdqUUlQ6rxZQshGpTE4R5e3dagmLFg3A4XS7bi9T5YRADjcLGnAF0VZO+NNFg4SmGjkTwiV2GB8C3hv8vJsiO+34EO+bBIC5i7nAmET2YVMS+NsbJ867La4mTESrYKEW5KZ1qWTRFXjePL9HatjWegsFeK2nhLD1P7uDXLy9/1II9vhA1JiSCsES9k921WOs+Ba8p8PTxQjFxzfm7bKe44eHsoUMS+SbcQhi1rded6HbRyd2JxaaDL6yIYOdecBlqyICgAAAABWJTMAj3gorSOJEQtWs3YX9Sk6zOScXFm729JS5sP1LN1iIAWbwKAtJrTmVlCJmFJKRobAG7d2WFNzOtq19As6e/GIrH5mnbVdqu1EFZcNazBT2GV+FHfyCKfF4cckqOcQLfjmsJgqFEEfCiumbSS+0kStwkCLxJmCCP6r4aqGoFb4hC4pIxMzz5SVejj73GKROmPoloBOeuD+XuXESYFRb8uSpLJl1G2G/6PgF1FDOcw9wDamSjfI7t1ZLG4foOXOg6mqSz/hX2qJNRDQYVA09ZroraQfkAEpDIuYT0T/aTze00vUvAVQ2P6ZHILogl9QJOvUfxto4xZ4FhIpZ7bRl6b0Od9KB9oKdNUNPW7FAfKvMkrDc1AQMjKrgkaTZRjbk2t+KKnmV0HYv+yBq8gG5ZJD77A5G1SNBUy869i28WFfxqZRvw7aRAqzdo1AgIaCnF9tbrRK4TG7qQrzfo5WllW5eZC+W+dLPhIfrOo3DYcGJw0fuBdJr7R03xT1t+L5XuI8U9Oz6Nc9JbS4A4bnvOvIVjLjbnoA1kFlFMxQ1Fv9kt6oNWy2iDsbwibAJu40gNWCr0tjVkDLgd7WrlbNsLdIqpsEvJvInnE9olOzRlMQuAYxmES7TPwi25DpZPL7HXoskz1G8YzJMgwUM40GI3123OpDntw4KdgkasQNMzT1ZQb9JEk8U6Jiq0++BYDCIYYlblBpdkWlVoxv81HXl+FTVA4+fEQJewmqms3mDjWrR1o7C2oUVQT9jeUFRxUdSGMb/mYUfjh96CW2yiZIYDoUv9NgKuPEWAtON/2QCmtardsTmdi7Rtx43o9pnT2y51uRm9x2es5jLEqS6Vj7aoy6YCN+bELAOcFJq5Dwrine2uHo80CMHIvLebDzg8bGzsrZ2XJQ+5BEV2eopTuCi4uT9LRG2AzJn1DPauLeqKOhdiv6XwmBssv8vCqBkTeW3Xpnuhcsl13QfyFh46BRjbcX8xAHHJuLCjRD0IoxXO+AVbbgqZuTEI0R3VJy/3n98MFht9h9tzzj5QVuNNoOE5prnRKpKc8/ccAY3YLJ0fBHH3BCVR3AXZaKms/c4oTqn/VQqb8zC4KBm2N5b/gNlQoDObcg2DSXKAwiPQEIU2o8UGaUGw4GTAAAAABeQ/c0T3+ca5uAPB5MJzbVVioiSk4vNC6jftq8FAl1I9bGYYqMW9xr46gzm+h+8YKXcsinVCIM/jS+8+dBJpQPY5+UaWhM6NPRJ7rxBK4X4TXE4dA+0vrz2Mhs0MhzvfLN0xvnC/FQ6fGI8eTocmVu+0Uxd+gQJr8X2O0cdQmSgjhqvc2UiPNfFQDB3nrlUUSbIEgp6F3O+YWyOL66Kp3suTjvbOylGghgv6L/IbafgymNpHZ0uyRikcOMnO8gCtY4+HGxZQM2EGdT4CqJwzNX2D7Gb9OSAqgQhIceBkkCWaWDJYGFn54G7T0A0R5we6L1rS7DnLdnXlAVrqmzD2/RH5Albs5AvO2eojoVx3xtEdBHU6/83UIcRarcbZ72uKkZIYmBR0ZymAqQbP0ZHo0VVE0dgSbQjI2+zImo5TVWYBM43UYCFMyO4qwet1skegJJkTz9371xdbZCANf9JxkyvicFlipfxlIaD+HbLfbfddXpa2XBrobMl35TRduhXitAahGPq58GjJ5Cj57Z3Ltzk2lg1RAvPa55Ym+9Qrp6cwjgljX29vTHEvVX+2bev2tb2H7QEvR7iFpgNkg3kcrJm+7Dd1ebaq3Pskn1jTuUU+Nn12brZwc1qstkavMWkuK0Pn0QBQqRtgwZrggzocw0TbBQhL2A4l4BWolKGCu+TE14cshG90f4YxQrUIKjLiJaUfyDHBLCJe5TUmVQSQ/1hoFOEIm1D2g28ukp0fBYZXfhoL/bY0wKjibEB7QRcP5CLCAiC/KCyUT9RUslif2K3iOytTUM8VhMJh+yMK9g7TBUSggX/KKFAVOfc0oG+WwU3aM1QMI7Y1d0wIhXUwpPlLTnO1hzMFMA3sKa9FjrHcFkCieVenAjUKyr5FeHbcoJXol2OG/gbmNr9gbPDIJyz3ePRVmQPLi/VdKfPT7MQ43nBl31a+1Z1BrdnXcHpjahpKTGUJrGrn4dB7ltQC6YWiaAyqoJbVFJ99R0FNa+l8YXBgihScUntU55UAjD0goyNQp3GIOVaKlS7I6kJD2mbc6jpSMYfAShP3aDUeePnHmhRb1CKImjK0D3OPp9E19MpecS22z2wFjN39HRaZ6K7GlLgC1kBHDjzaAJAIAYsgAQETy4wtAIW0gO2n++EfhKRCL3tnUSk/D6YITCMUOC5fj0Y8X8Iz/dtuhxnA1v+i6wxOtAl5s51H5j09Y49d3tA7AaWZS4pVFQu2VItac3iue4WXJMqQ8pPlZhS7QjVcQB7SBcvZwoI+ocf+4O89TLZMaVEIr4+njDRpSvQvijquxAdbQm4OtQsklOb6f5ypehStjy6Y6smwhGbRWZCYiqAAKtvVRZ5pNZ3knLkeOwNIwDeekj0m9aq2/UFhN1dMecsN25GX9Bbz729hP4zOZIogFmcs+Kd8sqg0pmqWGUazSoMHI1fkI9gSULluRMpSLbfKGiEudLeDUyOtCepIvW3eDeBLqQnZWzyD7FtiOVhkthTIFHK7bq1iLxkf1xLC+RkM8zNA+nOS8mB2B/y2XjPdZACIzH1YoK2oKM+rV7xBJt9IGmbBRNMV/G7st8wal8cNbvLPpaQKOBeVSUqgtXwRjfqoVX0/O2BIvQmpjnywxGAw7z1fLlZ5rnQLPLBP2Fq9h3vuu3/xs1gh0lLOdSMxREs6vx7hNg2Y94srvyyzfD1TKfTTo8fibLI9oXaQlcR/OdYE8m+3e5qM34QUzxdfbTjQMZ+RLjZgzMgZrDR7q2e7vz+FHLUTszoUbsFJ8x5ROVLus/+JQVVgGaD3L509IG65PJNUgjV9/J6frFSGkiZrc2Bw1eMUNlPDYYWCLGOVVLHzga88KCLjxYF8pPhrnTForwKjtGJU3yoyKvpRVuoq0x9tPDYYsp3X+L+khPR/mEw4v8Xscbf823E8t1opbAkj0tjCEzPXQih/PKJcDeIlDLWbndNw+9RbhmF6M/iE2NzgT/22ZWDtZNXBYm3hRpNNfMJ+n7ntUv8XzlOYEEgBuo6ZYLJASri5PzQjiK4LdCCRAGnrmipsbcQOG6/EWvgPDi8tULUjSzEQMEbT2tRgMKngU5PxO+3rkI9pFudSxTa32ZuAtJeEiCxsMooDGsBx4GVlh8bfdQVVZKjLRXh9/MA7ogbhz6DFmjyM3e8bLWe73o7gY/uLa3zwc6mRMKTp51chPbT9rBbRB0HOMvVN5fshUJRSBaYh67l1XhtM4em4GL4laBs1ISeC7Y4AQG8IVbmOr4DAo1GDVNYHwkAAAAaL1usvfRVUaroz2Pc7PekI15Pg2dx6P05aHm7aKndpscroUMcT6dO+WbATHe9Y8vzGKZyXJcE/fElC4ObGTjqGic05cbWLKXqfLmv3HWQe1dStJfq0UZU1cIgJHHnql2VuMbD0wP1zM4J1h9XXtAPG1ohNnF7kvJin/jEJ0sUxXElIg/ROt0ufQOqGPzCRjnBClZG/lwD7cCrRl/W0WR4MtkGaXSlQbYZTgKRRtNQFzqesvoPF8nxphrDX+pOsbABcbBcvANCsM/powOzarYK/JFoqVajrO/kSDaoYvGI1wh5U8t0CEtMkAuhc6up+ZQP1v9kMcJO/D0AQCzsLDTY38/oP39p/qkZ/ZhqFHrAvXHrjNcY5aADfFAm6TN/tczNW5scQLye5enxtKXnpEqq+LZQt3pZO86ABlXcGhOYFD4yiUvZTEGn5J9Wnr1kvjcoJgCj64MrH55a+NjIncPB1z1/wC32mrnQa/04FbjDpIp7RWRMTx6/Tq64EtrCAHJu2MrC5/y9c5LSLFt83MTN6QZ/w8MJEpQY6sr58KcHpxHtya0ried31jj1pfHcx2mZtNQgM2rZssYVStKGko6GcD5IE7XNpkofZA4bfGVRlcYphMrL/XnZnzkdbCd1gNQXM9F+v9ifhWLwkBGBuDySbCa7ptFb7g7HjYVwMj1IS5ZtxgSJ+M4M8AnP2ORLGFan+YPts85OBJbXXmdGO/q5wUm9QCzz/5brQJdPfpEke/DBBSiTdUd5qwWNrfQ8tG2l0PqNTGPwFNzgV+IawkvUJBZnpHYmrRh2UCr/LgW+B9iRK0da04vXhEQFbBSuharMEfpFXcMGdBOd4pWfUO44SiROUKZZ5S7shBsfdyGFO2F1ZfaOVIzuWla6aaf3E/htToR4uGZY64dOfElVjTBtwoZFJkme3sBc+QIYtTUDuZsd97pGdWxWw9mXituUKYugKjrn41fxvNYfbKdn+PmN2Y1OwtNR+dk0RJfv17cYKMC1Ih7GMFGyPgvhfjGCdu1jcrhaPeZGotYAg3ta3wWzBJwkJKfT0h3OZIvVZCgDAjU8JYwu1+KNfxS2tefg5FEBTI8cBXWJQPZ1ZdB6F0+uVQzQFlWsWvDgVtowYa66d2ir9v1cRJevMV3UTZYt5wAwBG5JY8ukH8W7ZiSLyrscFwvae8MvdnAAFNGAAAAAACMYqNjU3xBcwXaBHZtAlWO8ZjegJUl1fEmjTnQqns/FLJK1hY8JLpE/UMhQhE6cD/Va6uL0yjfctVvX5KlFiP2+B42QN12X8R/UrDKZ1z59tMu7r6D66jSP3fr0BLzg53Z6oFQMYKocmgVR0QL1NWs2u1sNT5YpTenL9hjWu//3p1KEYC/1F2TsC6d54f6dbFD5uQjRtnv+NIvIArPe1wcuL5F6IGvPN/0hM5MLiQVagXH4ED966shT6WWriH0B5GbzcNZlbzEYvH0YMbWbw7y7MRGTY4+YFmdnAvxd+khEuZnCRThy0L3+NzPEJW//aCsl17ezfIz/pEsLUdemzZLPhLgKoi3+2GS1DLTwrizudVGORsAGnsV0FnQEi2lxWoC7zeL0SSvBAlKa1/pgu/ya0E+Xuhd8+trN47gPAYR02CoxbAzzSAMBOZbk+4AXQ8xFmEwby9IEVZJUTTZhTRGoYBXBKQEpbfVMPyRA+3zdA2acPG9T6xrxG4vVKAS4Dhm+nH1QNO+dqraSFpYH9XHeyGrbfUgVFvfj7WMjmWcdXO3dxH92I2mG3PGTZR3KjgbbgtFq2u9NlC+wCkWKhcIc9HAU/8jz9W0MPKcKAP3XsbIsaktcv2hFqjG7GjuUXoeoxisxGiAWvORdF8dYS8HqISFVMMsJcx0yMbzGuEclhflr5qWu/dGHWHxYJF2F8hYEWxz9ti2LoBdenNW2sj2UHj7GkT5qRS5s8rOKPJ8wQC6hIWK1WHs8NIgLO+6ySjrryfL8KJooeoOwCHJd7AlNUIKAr6spSkkssU8aawJ0bTnz4u9s4O3xLmM7qM4Kck293IFxWaQtLNt2afNRIme+FcLuVJbbatv2kMEkSRxi3X5aUYttZONxgpdC0OeKuRMCK2jVpTz4u4O/QgqOiNiSRY6HyO96/lUv2wuNnoXefwE1xtbwKXcBJu8uzWC0x0wMEgafQS5JHFGAyyK1cZAV2qhZIRUdxuwXNBUoiibW6q1MHd6IDBIv83D02AzvYPFd+TNnTocK0ydlqsopUmpUvULj5ca3lMjyfZyJzBYpfLrxeLXRWAFeSh8KrVL9q6D+ZEn8W3cKWtoFGs7UyucTvO/UepIV0Kjnhz5PSRF0XxrGsuG+FD+QAAAAAAALhhW5vy5AADbTJRl73Sj26Vo+cElNlgN/0XJ13l7EG6mXKumyV6EyfQqsLVHvhyQ5X7CMjqYChUEiZVdPm2DOZ6yAReKB9tf+FQcV+tKiPUvErTw/nS2lpXFTeGt5K0ddOAq+9OW6vATnMaf6bduFMyVM+nQCe/EIXX41XnRS+i78MiCJLcSfNHGqYhVz+YX34XzPYnSO2sXyVSlNNmWG8/5nLI+Nzrbhtc7Ua6qY6oGGjjUJLEDyQhAwzhUezvS5dJSJ/SrFvQ0+tBGNH1d2ogVeAm0aWxK7hJnywk8NAJKri6Z0KAn2no9Izj59XwHJ/WXK6uhp+taypQUYWzuFXUM1WmCFUjtFm2P7tW1IFDk257aGOnBuvtIVzQdtU3yx7AoQ4Z8/tw/iL6WoHKpzWq89gqoBScUJm/ykttY5VjKNE9VkOUoVI4XD0ignwwKhFxix14WNVG5yn3+4heeA/OYQiaHmHbFLCeP7MvhKkI4cUcTMLisv/imSqoylsvmKJc3UNa72XI9lFik5CkRMVYH1qDralofaRLAcRmtXNR7tbIHPo+wg2DW869QqjgunNyhoK0i52ab+lWDRFALqbj5dAj5yJDhJBWCVGjgMNUI9UP/BYCHFd5Tur/NctSS6BWLuKImfTPXoBrVrVtZEhfWfbpM6PVk9RTFb0rld900fNnW3GzUjRZZpVJUhUcySWPYlAN/4LAQPDq230NyDTv1+ljW3PRi2jPXJP3TKUKg9EhfBQIhp9w14sHIlAV8u9YSIsJw6DMRQ5hAT8NjX4MmR4G3gSG+a2cPt8n56j13NGGZHDtHoJ5PLOIjZqL6Liug1yExqkr9Bvrn1vVFUI6rzh9hbCOsOQZ4F/rDRSCUkjjQul364NrhOrcA4nJ3XlT0m+MpniP1QodSEygC1mNIvGFyUjmYdUnNCC4J5kU+bKQjwylV6CC9NpBpU263WjiO6xjZLgSeSE+MCisVh4OCTFq1lpMmcj175X6hfNr2E7ySSlGASD8NUXwUnZLPb9nhok1R4aY1aGDiB7CSiVvhFQnmODNBCu55LkE14accP3TbPHcgVuOBvCfNgRstIQqRlRJ0kJ4Ri2aPZ+iR9Py5Amb6Z8cTxzVmg+ML+rnWz1x5kDTAomsIu1t812TMIQ0ZeVxBtP7t5ujwgHUI+j/ctXbUwEGU0VfHAy067OaVIqrPMShsyqSShiEjGPCEnMZGoAAAI/nEAAAW4BkyAK7r+C2pSEZjirmK+KJpe3HdlM1TjjT0kZqfOqW/KkszEWs4XWG43RZTR2u88oVsaORB7THifCzr93IlKKtWHxfy2G6Ey1L7yYXnKVFgS4Pmu1fW6gc7lxgZCNpO3MeQ1u5SNWjYvkTOijWxhw0MW4+ExYpO5SVL6+Lsw+LBKgQDl00TbhiNcg+GSTg68PfxZ8ChKuwUEAHwJDD8+6HvMO1F1Tk6Uk/9EgK1eJ0MtjIcnUEgJR2jOpMp8AmTwGbPzHDFt7fb0nPQ9+rPvnoVFT/wabPVpB18I+ZbZ6Nl3eo/uKuQhFBeORO+TQ5/eXSHldzl9TbofnN5XNhWS++pK0SNcqHYs0cBg49Ma07qFRSbse34NgOipK3ZCQQzfhvvxqoPII2RhiE5+X2DrY+vP1p3M3LjtdWy7A5O4cm1UIvxTTePQA/S43/XGUJTDWC26uvfComXk7BMttIPQLunuCdzipmw1mKNLXC4RFdxfRa4q+S1gYPqC4BW2agENJo8Fqdhmb4ijDRacIEWMeiHbYFbsmUHPTkcf1uIHXY20/yd6br6AgUxFPMD9Lhc3CMHab4LImRlzhtSN/QH6B2aY1CX+b9KJjY2m3SOAbvUUEC6X67bbyCda45FH8iKdy8Tz+9CXazvArYudbTqq2OuvnuGSa4ygCkY3OrZuWs2x0+SlWudNDp1cN0URPDLTJ/bomD+/g1L+pHTy7D4c2W5oBtTGwFqn29IyqjIdBTvqTlIbmYQ/xZiJwUhRQ2iRIOn0mKXyeSUIb/0ZgZ+vNGdc8hhMHELn2VELfcYnE57lM7EhHD1W7je1dNTwpEYXhZt3IjPf6PaWhoI8F/C3YQy8bB6d42dW5qJNSr24V0jZF2m/HPUYEb0r7LGFF6yzxSyH3QdhkkYX55uVbaFcIJ7bClfVnQ7W92fYKm7ctl4SJwrUIhUvndPaUST296lLVtgYwz3l65w24MxqpXgOi4S6Ul1r1b9fzF69hR4eR+XOmChQUiOCCbvQFhIbyXd8gxXiT4lIMKnfSp/APMI5rkIvzmjPutSl986aqj3y4bwsIYrPW10wIJ9FYT4XYNoSudpYLrrm0slsD6Ivb3WFHUYEDb04zKLYVq12mIgOReVJtPXrOZomIMBiSIUYt2T8JnLW1eKBf2kTswkDQMGt9oWNxN2k0HGWAKD/tSBuCIQABjSAAAASgSAQW5UwGAr2PXedFSh0kx4VWueFN0CtGzMJe7z045j7p4+NcCQbaaiRg21e45UwzS/YiFzYKQSsS3mW0v8qhEh4XGYcvCrrFVupY6E3VT0Dx8ixjqKGP2pc642wsgYV7E/SsWF5IxaHrUqaigphfwmy6iKC0RdqpVJrulG6OStHJBJleFJa4/9gPjoG+SPiXSMJUM7tWEKHMTXeWupJ3WFC6HbX7+zCKAxe770Il1UL+LoUE1TQ9NBb2UbOW4u3MMvW2toExrBN9VVgYGL2AlFNWt68YuC0124F2gx+I8rdudcDjYhsoKwVsKjPaTvJYfYCJ/9kE+Cvpl3k6p7IYTitsYTNMEm2QdbUox5n8KQHgCn/6Q8Jb+WU9pVT0Z9zbAdxhpWy43uGCij00mBuarNkNeYZShwE5E3SDMtLXLdw+gT7axLM+bgUqf0yDSZQbuVeogg2L5lq2wFu8kAa3FcEX5zfML9ZIA6dA6uyJk+nabzdNj4bQSP3SLOhNzMoZxFsn1ioxj5X1ecBlfMsRNu6a3YV01bXF8u2r7C+ZeI3YlMdOd/7EBX+t0mlAX+Xi1Xd4wKyeQsuz2lhU8DzZtP4njA9HNho8x5NIWdV9sD4S2TkitHaX5sdIY4r+631+UGGALMR0GDoPPmS1Bq25iZrmrK2V5w3F9FSfRfsZkgAeMr5aroG3w26S8tADQHMRUEBVmu31VPZ/thO4ZXvXQm7Neidn+/deRrnCWzHefI7Y8bd3OaPXxJhb450QJ3+iR1Q93EeXWywKlf/eiez1XS8bJg3xHSLF7GQK9k7eTqKFmUv+Lf1ZgsiwWfDpbZkZjQMA6TeRMw4FWPTMhCrSbYkG1EciYIHYIwnmkytN2BG4CFGlGGjhnzq0h9pudgOfbuG5c7Mtl8tai1rELqWaFYH1kuPp3w5t8xV7elHWwn/mMlDZKjRJWE7G/CsQ6DS1bYbwUigu10HjnXgT1a6vgSHkRCEdpqmq8etew7WdO2t/gXDqkTwN/3nNpKDlQl6lA/UNeyhPb+H9ay6uRgfqhGenkUZHbrRsIcvAQHfx3kSkbB3LkXRA0FtIlZHbrQo2e/xZTgRne+DUbOkrX7BpvAjKAx4HD7u47ltimGx0dr5e/r7SzRSs9q72bcNmlDsfM3BqOCKflFkAKVppS4otEm/eYgsEmjI8p0jRa0cIgAjAgFbt2GlAk3HKgktaJhZt7CJkPptsGcybmLRp/3bQybi34hlMw+61yKF8KUE/0gn7U7NPennjf96zUofGP8bj9sw8qdCa00xO4XNt4WVUcWZrNEAd8/SIJg6eEWi5kcuXYlQUYwFVPiy+XN2IzjKYtUkpb8K5JsPWwwh20zNUebrptGFomE6PzDjS4WLGBJ6ZcKPPRlk7yDLEAamW2UP7i4xucNA+OkS+ssF4iOM/vZCcyvO+42k0b4TpaTuFdH4cfZeqLQKFYKCYt560YztK/+jD3wXrq4e65PHWeZArrLUZm4ogJejGwlNiBtLng8biC1cFfYWwdbAlQEo/Om7xrXwBp4ULm8ko+p2ucEF1sREvzKVHoFy9sMPdDqBegeyhcUl0FPoaRnc9yHNPP0ZoVPFRmD9dAKXjVtfzpCvVNxaVFzLtcpsRVKyRgoxs/45FVnr2U1yTuRf4vYoKRjRdw/dMgB+FbF+dqRu99Cv83guOu6j4WsnR/iPlc8HbixUvN6oqewrxUtMgl9oy6Qdr/wAWAWpj3yHyN0ryMPcIKiURe5iqiJjbdUXVi7tELKGymAtB06w2nnjqbSlp8J3YKU0L1ooi5aJObjYhVaqVzpnC22olKKwU8daM5H8RfEBS69EX+NBPRX+fKQRyLo/KQoSC4MvEULj6IxyCRvkqPuBZJisdOf7MxGiCG9BkIoOFOBaF2Vq5+ZI6AgxDmfAYv4QtayrZE1EparhzF0fyTEm7xTMq3VZlvb9V2pV0/NRCY5FTUZYJEudTbsMSMBuQkPvKJoVX0/05b/gbpRdzXe/iUdpsSvUrMCmLzjyoV7DWzgrBTpfokg0WoZ+bOEftzVTXU1vb35LBUYw/qwIcufU8yFu29TqOaI/AnY51j0rtSZXEo62EUbrNWjhNPB5Pj7X0tgVXzIvn1tiWBwlA94M8HwE7sHakRowPO0VOe6swpnbBjhFFEaxaNpwCCAGGXJ+B78C9FSjpMtaifyMdIR/4Cl1e85HSwHNHDSN2E0j9azDlyQH6mEUYhIVR98TJmUu8Dz91wbLvrm/1sCJ4DZe2eXtDpSMFGtSmdS7KbeFPvqbQQtDA5UZpLAUQTBZqiwk8lDW38AR26z7HlhdZu9XBZhZBlA+lx+lgmG1XyNKigQFHAwA7NLi9UcVg4eZ1+Mju88Wq/vgQFUNVfNiaPU7ybhgt7ctgMazT4UgG1K4hBX5kKyCxtMNzsosr9iMelyXVsRk8rb1/SuavvfAcCYXXcMXyIAAAK9gAAAAAAAAV4guSu40IAnxXecC/DEDbh58Supha1j4+fo9tsYDEED6jssrjsG6SUksAeMTmLyxpbO4tZEMg7S7UoOOgwRX3LVgcDQCRz2vL+iVBW220bl3CG8q8GAaeU9Sv8ft1mJbYSnmjuJ2DPQzxSXlkU4MuXTd94EJ/lLJoeR5XIfWuJ9vFX46C3nPoyG5LbpUjaWqNaybm1j7kwII66hcMgFOJhMCQ/qKBlg03StWckyBRSpzlKq8+vtTxOR5l8BYVWuXRktCcoDPJYXRDjahfgvDbKfed55344iTBClifRItES+C7na+BGuFUj+rT6YmhkG/tIbx8tuwKRBR04tO2xKKsg0ROsvJvZVmvjaMI94qcqPxbc63h4bGP7q4M1RDwpgT8LBbTwVtbpBiIkgk2f+dw8p0pEsHmSY+f5B5j9f4xAtbLi6AwW43tOwWMwjRS2yOI8kB6tuIRT/laZkz6/EZRXaIfxpJNvC2mnsxMW8gBYD0YEPIqPWiCwRF88j/+n/aVs00HZ9w1Rnr5X7BXUk8uCQRfIK9rY8eBDLECRcZ92Q7zoEmVSdQEy5e+hOYK1vHPfkUkNzSDYSd1tWINbAzYDaAgs8YxenRhW06d9xaRhSeudbL1Eaz7325SOHIqALSJvbPtr4rjFVxKnERnNwf88j7keTSChhPVU4PrXk1RJVmo9Jft+yRUq7gC8xtd7s/JcQOn1hEgfwaawq01HrqYknMbLhE5WZ8u4ck/nbChfjs3sMDGYM6q2Nh/NPmctcPAW4bXr8JVRXI399dlrB9F4r5MsHXgYz/aliJWYw5TaTe/omSyTaF/AMH/cHz6uqZ1st4trnoEBs6guJyZS9kh5gIp3Fn8wmCZIJzrUsfeO9ukRpYSngTyP3YnRz6ZUdx/z6NkbX7xKspqW/FIKjh3m/W6rkS8akJMu1xdDee4R3U/tEoPpbAc4CA6cBL/kA/0Nf9hgvN7MPFhJIi4PiarAEN0+C7amcmYdO7BbEzuWD4yKl2zkIhVxlM+P+qCdEB0bhru8h6DQbutnAngW50q2O5zkTzZWm5f/x58TVwarzH5Kb14b7vwxeI0dQp7WpTEe+RK7DKJrLolUc4M58BW1QM2EbWdf7i8H9/Le1BkyAAIA6Oe3DvzMOYXnfKbkzoMgAAAAAAJSO3MAACw0LplmBXGqQsIPwQBRohaDgvKEETWYiE2q/yM3NtCEl+Gg7JJwxJEcvqa2s7KhoNe07touHcy83i76/ybEhLaM0yVsiZK63a8XvQiTud62hW5CgzLWlOVrlfRUJ+wadXns6+OHg4nnBCMv0rJCiGpRNieX51/3k8hbOEnEFf42nmwg8XS0B5qKyN/hn7eKEMObU+Yd1GtimctifxsDO9l3b/2XMXTT5ytq0Ppxl/MN1aPiAmDD9a24QB/c4ECEOJcRrd5Qzeyi6Op2xROKws62sZCaWt+Y3GiBmgJxCDJQSrOhVoKuwp3J5z53LAf1ZJASJCwCpPXeRjYAntbASXhLMeL1GDwI2Mfou1bXxao8MaW3sMXaqGZr2NSNK9Vi23lSB7wLSUwhfTTRakS6xjbPouf6UK9R3yTTg+zj9h5HJ52lJATSTOy7nJ6wnJh1ZKK/+HArYVb5YTfXQmiOsWYl7ixtA0Zt3D+FDiTP684zg/vKsYVEyxSHuM8d0x0/Awa/WirN7IwtZA+AbVv4OQl8dJkcwsYLz7N2KW+JAcGqfr56sUJZAFgilDs6Ri9QYOcuiQC6+CyA1Rsl3hTsaV1NqlBMR7WW5H6iOW81ozxkzBfFDFy2WGxaoMB4Psgq8MlIVjmyH9/qCD/nxI4fiH/pOS1aT3FDjx/vVzoG3fS6wz4ZoaMp8KHjebgQFKPfdqvUnAPvryvV/n1a44XTuVDNA0ri3AsQOH8S8PE7hLVhJOKzLwXFsjFvOAQm+oWVijgNwWor1Eo52qiTvUVKPcvWJVlry5XmAB0G+Mt9REb25e8dQ4VNVF/AjHCprdnRl8pZbfr94/d+TTrmg5/DbsNV+ygV3u1nRhyTTA/eELHfP8XlzzvTunBa+d7JXwxSyIiC2PIRu9FFC7m8yoTpUdXb7Gad6UdT5pU6F4OjjAWg1OXTBaMdG2NN8TvvTXGeBhZGLVN2DceHQ0LOL6P/jQb8E8hgUE2tOjMDpQZ58A1dYNVq1x9q3MchCqG2MzVcFy4NKSLuPhlouGF4uV6EqAIjopZS8OC6WIyugSsmA1MzhureAglL/sp8zwBwhcIBgBQ7Xj2VyTvW6O4ek7JKf/WIseJiUGSYblXXRMe+lsi5OPoRizISIPdfYW2MOsVua/ZvusfxLEThRnuOUlni84yQB1vNoH0B52xVjHE36FpihdWs5KOmc+L2C2Wya2KllUZhFUjPwkhg6RB/iLXPIITQJUd3xetGw0I/Gi8xpA0QA2ul7z4dCMOpUic7TABkyAAAAAAGhIAMY8yFUN41lbSVN2oCqk62ZM6WuRsuxj7F8VTQxThW86FOPpkYdFTdGUV1DcnDmsAN4ucz74mvxgGknV5ReZyGxHFpACOMPipjHXlLKRGgjJ363Uuk/ybhzpOpFeCfuF8FIR+GapFH0CJ3fC9jyeYLMUm+t8MbW47QadlipBMAV2pkTR7IbMW5Gspt1y+IfSTAilgRdI3drc4fO5yfQmDjJeocg3xAE4WDAdaIHZoQiCyUyQYsqYb3E3t/HOdtkcqz84QCedS0ihJBcPgoI5DE0lT1LrdJPSQfRYDc78oCjChmitejDfx8Ol6WvpsvVEdg4dAS8eWQx5eCnkVrdKMZ/c1Y4SJ64sxvUPMRGtx3DoJKfA+10DsIES0V19cKLIc7qc7jd7yIiuEwKASnJR4RwjvzeDi2+3oVgt6OgqmrTy9cJBIUTp3bib3CNFqf0TglH2nHqiwcTkxzk8XFalDzg6I/MWe+5B9h8XT74JkvzjANjR1tgoClTFVA0yuxAWUsUWwzPr1uUYaoFWh7fbriRhIfePGYBQi8O+ebcrFn9+bgqpXzbTkKyQ3MaHNGOQYFxAG4/gGrj8ZErywHJQ+iwRSzDSNhp0jz4shKI8reL9iIsPeWRkOciKw/jqPuUilQU5L6Fy2oYmeSyVJcUYltluJ8AC5dRdRAecDj25SysZdj9UiMfW1/moXb/7QOuRCS4wlISIVT7Zp9WPCOz4/AoaG6qlYctzu8pMOhRckHbakqQlUzLgWDnqFI5rDlkPIT16ehOKEkCj0CXSvZEZdsK/SLj2NJ098gkqXdsIJz10wO3hYvIM+4JLaGty/xfIipvwogMgkcKblWC2M+Y1SscWA7hLPBmIjYt3dm5BlZgFRAhl60uYllbJ5Boe7dZ2pKZ5UEory5w/e4u7jH1a+a7z4oDbj1WnV7rgy4VqXXGEnklvKwnr6QPGzxxWidvKPHohYelPZhtDSI6gQS68T3Gf5Pym69I3iB+bYquSDU4KnuFvEXupUaiLegoTINPH69AjV8iZJC7pJZMgANms7OLuU29sWLsII7EoT/luym9t9bcxxYzTNy5RqIVQoVBRMTpodaGWd8dkpnE6qIEFda4IL6NEEeahH7joAF2gAAAAACIqGoAAJv4SGdbKVV72jZ9+zu+gt+opDCRur09BRgyO1b4IjfIM89gymP0wX6mFudNA9jS9zugh0VRJ0DbCdGdnIWLnUNnF+itSVmEV7wVEw/Pw5PwOwjuEwFLqHL0LBOMgh0R7xlrlq1Fba4XQVs78ukj9VjOu+HtC4XsBLdwW5kH7mhe6q4X3akRL5vTZnR3YjpFdgo50lDzryICE9rHcZiGPxsLf0vEbHArpqC0OHRcIIR69bvEG9KCKteqx/cmu6ox6vyD8lL8sM8FsWQpj2IEMuwqCUhxbrtk+dWZeq++TZE35EwhSNFiXyoLbbw6CbZBYkC2YY1Vu7sgFNSvNJfatFHrE7zsTsdKRFDpD1TyJO0YpbOEAbtbZw62oQ6nGlTOHqJljT1kk5657g3yPaRhxUHvVzYTvVeISoqjEbwnAgKdNa9uvaQoovk2ysbD/WTwWsNDn7bgz4eDhwPO/NU9XoFszWpPIs//a3om8a4Z+bTq7zL8F+3kPV/W9+h9jRPVrkV3ycrVf+9NAgtQOkusOcq5g1j9ztPHLH87uEJS8VSpfpIPlsCQq2gT2DNhQPcYKLA/9+Rq56JXI3hfaQtrMHKN+1cfT609LfUky1C8Hhf6y6T2CX+aQ5Wzsb3GaGj+6iaXK6A1txm5YF3zLxp5Pl2QbxpaCNUWjFHTu3pHcD+PWG/uTpqnbaKqcLuI07mTZAoKJMYNy4OWqE3TcfTC9sSQthpJNqThhdpTGy+bybF5gcohw9xfG2SBViFOt5+WZWUu2AFEHMD1iXZBUS+PXvm1U5+oLnaQtUQ1fbMzAYuO9Uy7NiYVxxfpLSwP5osWpL3XBc1nmdwWFJef19Z4E5aS2/PLWGIbYYXf+c9q4f55AtIjHaPJE0pUYwUad1eTIgINf5qEv6ucUTNCKo597xYa/pgqkjbk2E4girb7CZwUzulkSFgGuDYERMmraGKBJ2xY8j4wn2lKjvTpbgDTCdR79f1F0T+e6Wt44u12YnrneiLFXYbsKEYTadgrkLTWP5rfArfvQZBVzsjsDa4T2DvAqt1TSvqTYbkv4C6ukBRdiakvXhag1dIe91UmcAAANwADOkDAgEAAF8dCC5YKErLiQcPgLOupnr323+8OaLWm7nmN9tz/VE6deITCiFoIJBPpC1RgIJXYHRefVgK73+a27tb8l813F4TYYI2DTkWt1uS2mU6RfChYlDp7Wi6uZlNMwLJMwlOrtgUvEVE+R+InyHR/ddultWjAMqotq0KVGXOLLtnQTNUFR78yJTTcyIVl7Bo33c5FnLFTw+1YQscpKKdrTxckG1WCreqEs9QFuSaahKYF/bkHlM1KvIjJLG4enYYxDwLPaGIoLd+zF6C2g5+Cb+KSKCc99wFsHDygjCd7uxttdhd+HXQtQu7yftIP3CjqZYliUWDrw+W+cdWAwiDS2QWKbt7uU9v8NxQGEmPRQfxqDg1oqyO6Y7seWRQ2twf73ghU/bEA+/eHlhnfeTbTQJlvOUQqsJLOR6Qimbu4nCbfGy7R/5lCd2PEJKwyTZjPDato4JBC2nK6aAAiEECaymfeIAVVOUltBIXzJ3tG2Pbds9MYMv84bzVBooB97N2E7+lS2Y0Mitg5yCaei+MXx5x/wnHSlGeEdXdgT8mJ3GIVDmiUlqmBGLujmKETwn8MtEzaNabRuobVxvpBirSHIeveviCAjfF0Z8dmbeBkZV6Qw4JbS+Y8lC+ekFhfexMKv/sP6Ax9iyO9zBPWXyTUJkhY3DPeOeZSwZpPElLf4X2EjnmGZUI7Ij/tSfpXa2AtAQ3zbgxo6tuFaaL4D6/NehfOBMOSKB0idKZZC6f4F34wMsOBPIrrYlX5OCo/4wlWnUArcmXy2hw6QB6q6F2PjFcog+3y2G7fiz3oHK0qrGkd6J5j8scMHhdfnWPz4dMQ7x8fjC7Rxj/gtZD/WKzCeb113KdjuX8TD8bzAQ1yOowCQQRoLVhnaSQc10ounUnu+MOzlz2F2HenYkVlzpbq7Y8ORaZLOSvW7d3wSAmZJVcjOkt8w743aFIFMaVUgZ+pykufidgAMDGMAfpFbgLGaW5oBXiAAABaMAAALsQCxC/mzBTVoSzWJvB4s8yS/wOgku6iq5FxxkgCVkh9jqjf5RlTChe4DTtx/2JcbFzAsM9dvSpj+tmdwdmkIBfsJkeh9zThDhoVZp34LolGj+kiJJpNKi6ev6+rN5ShhuXckk27DF80I/pyrZtGyiP8/gf2S0zbgpl+gMT1b9gKaCuS+IO/N3nN8aXZhd/j9cSfqYDRm/x8NcsnkQjN5uZnqP4umjwv2SNlEwqzB67DbjCbcXBtuFLHm1gbma5vlf1bFOHcwjhi63EftIduIqO5xo6Yz8bpF2C914GaX7Tv1BGpJxbhp0VnWtw70S1spL85a/oIDRTHSzvIOHhgR00YVDS4usJAsdRwCzas/37Vww39wx8oTkBd1DBTz90jkbBb0YJrBQsNMFv15XoDM4fopzfL7WM6TbYhMI9aNYYlWtMFinj9qryv2b0RfqWMTfqg22Ft8tRt3dqYYAejzkqW+Z7A37gJ2J5FJcPXjCE4/UI5kZOxLgQpWr5HvwqPMdFFqaX1q8qs0iIVSMmGoaVo+sz1B0wPKHpFcBMJtM/yIOxaPsGRMa9FHbGKLnWnEEHZKdqC8LZaPHw0Qyl0UN768mCgOPRIg2pUM7J4urWB+iZ9bUretlZYzbryMQFyYB3z00tJYg3Zlz5M7rPK4q8I+ynG8A9ApC+BAtzxEy/qiUa6sg5H7GFVI+UicqE5f/1eloU/OEGi8DUNYzqTeduzG6au2IhgiyxntDpWi90bcdpB9hKtFF3+LN0W1HpVsYlFD3qZAHBNjYCIfz3HTOAIh9aKdJ9q6sk30ppAxToKje1yIUin5OUOgCB76C7THtVfLxKpO6brq/Ggp2vtvTWfoq5l4eaPe9bWIcOEW67LozTqQpibeozTOVhCEanLfSE0OSJ7yYo/4MuaLxSbVUEuxjB/ix9UQVc4by7Mj7VpbThw7oXPdj+Hrusk7J+kXLpeoofCcK2SrqAlPLfM3/AHqlcrUqfUE70BSCdRJzXoGi6MMJWgoXD9OvsM537JMZHeDQSTyDB0aVpZP8ecEA/FrL1FyZfQf/trDP2AYKWcq9nWoTycJLc46olO1RLhAAAHGf8KGBu4uSMsfF714xW0cOTnwlfh0GpIPwSrywwZLH74q/XeM42ljhJyoZdFVlgePY5kvFYHXTh2ylh3tHdFjVhVGRuhMqMFKhZerxJVW3tJc0CB8CGmA3gkGy9J3NSG1HRGXg0vsyEL+W3kSdc2q6h4wpMLrTV6XFT2JSMhnjH2yAQSEhE84taep9Cu2yoStRNV7QeS4JaBmsORf5NunJPlV14mz8WZtsUfGlZA/ANOrbi4InnSqC/f4Bif5YcUtctD8WmTGKiVsn7Pcut6pSyWPvAVIHvbr/OkaJIClp38rN0jdrJw/C+ZM9NiVdCOYZl7FAEAzOXSS2CGCe9QQhinOcoQnyPvsHw3y7bjW3zagVoDVokS2OWqCc7+iPw/pTjwVzC8SoRWn/7iTTft4YSzJDFxarfBsgn1YBaHxs65PUemcs6R3/gMiIh2H7J3V35bco9ZW2zEt489fzZBGtKIuOrAck77id15ZNE2IJkNwS9uz8AF+6UTBTPsv6JQnr4zjiXTvx/YjLrozrLJro/ZmhsDCX8Zla64zzDio7eQOiRRpm75ZGWmWbeEimKSKg9/zY0k6RNfXD8N5naW/B2aqGv3f/xMdmbuzGc02wiiiHKJ97bOJ+dfsjuNi62PbtOD15Z86Lkh9Dbk9jzZX3ilXesErdlz0HSYK+MWozyv//BcwYI+aimm60uHaH8QyEWfEC1iCaczXQ6L90oYqtl5hrka5hUxOOWLMqH+eaobpY3APghL4wKxbyFgDoVJEqatBS7HtlUhjiVHKrjl94CZ7NvPcS+ZjCRpUU3Ei6MgMGapyV4LvaVTUp1CawpRR2n5f2eHW+Vgj7248OWUE71Xnn8b0dx+R9iD7K8aUgoQ0ogQnAS+yXsG15iWJVMgBenDJxrhEpNLd1y8q2qUZ62xs9ONTZmUZxmcxxeS2uWQl1K/IMFYS+fXdnyweBSuvmCvwJ6CWhKDEBCkZxtxadrMIdo/93ZHhMiJyjz5CEV9F4HXwQuRdEBb2G0t1bRhOHkbarmcKmY+02oSAfFG3xkzJWADrnTq3u9pScwx3MQqZkABQGIQ1bmdvWsagz92uwB2X9UoFWA8YdiAWBfMLBLyQAlNkB2h2tZJ0cvLhYXqKJiB1/XyECl/4PSNrSoYVhBl/clee9lULgdJInZGjOQ6yky5SWQIAAACU97vEAAANCQw/X5reaFeStJ8+o7q7rjnOWgqZhzeKh5FLHAz9GZIlHLvFxoOJY4jI2GpMmb2LwOU5e1sYL+fph8pMuAEVURyVsa7JyabrFA1Fruh8P59fgk2Onj6hU03gIlFyDqw6NbRWgDffL7Y0EevFC0Fy8THXX6GSeKEqM+YDmCgRT2ShVemwY+rcNHW4gfu50snst0hQj7coN1DBSfyDXeQnZyy0i05Jj2LczKPw2oty4t7VP+2225pgDcq/1hXZhKeBhpU9iCu8ESbzbSi3e0bNct8HqTcfgdEwL32w1zlENm/Bf6psn9kjp6VCEK0VBAvFf4+7t1zcyBlPbHS6ympaXCns8Y3WzFcn+l1trNygAIzpQu6p3guAvzmsDNW0zeavkEhSW66hc+9ZV+sM8sQAVigcF/scTperLkcj6WVykZ6s2NRCCV0fqXbuea2b6HoUv6nSfilcUDNdRNCVeiYWaZ5+A8rbF5Vv/a/JDBK5jqQWiSfjS1DjkAXm3WwoFJEPn6awKY0usCVHNIg9lUIreCBDDQitmdkaaHXMzRVxXlcz4iuNYn7NOFaZMFu9hyXKZYiVHV0c98BaN3tlg0I+iaYgNdUBuSHFvKLihButsD5o34K+1EMFMB+UHCJHMPmOr+N9JTfVKLf4u0/EWFL/HwRbzyYXTZRs8B1V+tIC0pT4eo3xDl6DZlprRddO8iZRkLR0jrPHSfgXaH3+XlU4+CAWH67f93b4Rsvg6xbGsNszNdbAzqP0VQ+hnl/tZQAkg6VwnxPx0x3fN76LMW5yJBY5Wfl8TIwdgVyPtcBRv9uEUob/VS1cwiwCOycFvjlWeq+sC97IrBLw/wF5h2cGSDy7frAAFE5I6HRbTyL+zzPgu2GUYi9WXTN5KOgvsIdV0xAv6qViFabMC+4GeyD60NQh6fSC0ioizYWeVQRbBCUNIFiVPjP9n6fF5p8cCLkm/z3GXE7AOxWmeC6ZBtwDttxuYoesdZRtWVUjw2Wid0BpmvPSvrQpvJ40CWCSJX0FJmXYda5qJ2wDCRwAE5IUTFBPTUyL0ayYtT7G75mV8BY3JRmA9VhcfouGvRMCIlEZo3W0kwXtOI1mSek0LEt3d2nZLgq0DStXuytRG/UNwIBqk7mNbxD9FYm7t2htpcGgF4LAqiMgBgNHPzJYBuZFN1dpVtvy49sMIlKhTY6U6hzI/545PteNju++BOxUXqwgX0TVUxldDxGafowWvgKOYt+l5a6Fbfe9jHIbC1al060fd+HnIHmg0aceTq3vcxUGy1SPiAADxkXjgAAAAXQIHoghBOpmJaGoGTvHL/N35xHyzrWjECiqQiovPcQGS0zPaChB2h1aHYkJDN9nhDlapUG0huOY1VHeXr27z/QkQMzCbSF6lggqDntD1ikiMlELFrQtdMT4B4+WWoPyf+UaI2DRrGKi9Z9/GSw6vzryZiB2DL4PWlJpmRlD505YJhT4eWiUi/kqmZ8GsR0DUyMAXq57ihs4XoY6RTtghf1Gc9bQTXfDcEwlvHmpXDSj2W3CrXCVHF83IaLcYqjrZ3YZgMCehedFA0YBtt14pg+Fwnoqe/b1cLnFnm9i0wftC7WNQtqZY+GjJhCYPZ5xWOnpsg3mjQf3KV2DDnnh5UoI8DdCEaRJReiVGUcR9AQIvvBHbVBPE4TQSkWpkXLUaGnyxjKI/SH+mnnE5brLX5QrFfHyQwEcgD4gSh1L5mwuEmVunQ5SxRcwSoRYRcAn1tQ9Qte1aXH28DW3wc79ED1dU32fdUI3EBioI+PeQ+EK4Y6wsa6/kFQqzkAX/OhjLlPZlkrHuhV4fI+BCDiDfN/2o+icGQWqsEOxQRnLMlkQtIhAQVI7CVIgRyb8UaSw5wFq6gnYMOxFJYo939Xbz57Sh/gLNdvOyRYL3OHWcyzmg4Fb86zeX6XgeQYq+Ms07+FU1XhlvEbXMXZHJeHwuuaxSmegm6gNdBMqIDfOg7geqV1K7x0wfeJOt4BUYvGczxh5iIwh7IrOdhHLiMEnEbtd68/PZDi13w5xaAMItANuLkD92ZXCQQOTlYIgIR2YX048BhEch8bvsW19rBShBDhb514pWh1v8m1MvTUMjpvvFrTTRe7Blq3daW2iik2YHgvijItBAFodlIxRKUDUcmWIlDJ6ONd0m3rcE/HfRkx2fleZPFINLsxQYAxRJgZC9xm8ou85UQdQxozl8eE080RRcnPUI7JfS/EjAHV3BUXBnMRmKLSZLzNFCBB1bO88do1MxsNtjSJlCu/eCKzwHfoA7Hp2yZ4pVMZ/FNQXer5UQN9Vd3Icr+PJ/lKGGcVJX+a5bA1DW6zhvXJcCBuef1VSwLzJw66oLRNPBhyeUFRGEm+BMnmzqf2BhTqGbzFrWEu5yO073nrtZx3yAAJNDd6A4n0zqY44Eyseymww9hMln9Cuk4TRswF1HFjlI9ZWJ22J0jzbNmeFSowRaAHGLGYmrL7YaU41727axGCp8tOWcKhDY/erle+hgqpjoCcfeucLaBwuujS+tIwEEy90FlJta7GVTyPXCr/JOb8WSx8fjt98y2ljxVx2SMbzr88vePjYk6LtFDKNbLHlBNmc5oNEm7fhTOhL+1J4SUKYOHdFePqfSzYUFamGYzWI3SvEt7zospuCB5UoFwUtldaGa6r5PsQwHcDFgjwgAMWRlxKhIAIsRtbwTbiNpYMLxyamRsYGp/aBp+U057udsg9ZtGcCCMrtZIrQ0akNqtdmCIWiuDbbWa3HQCGfrpRQ3GwUlPe/VS9HusiHI8I4DvRk2L+svbyQ85l4A5RM3XsTUs5E4rnmuDlCHhymC+1nV0WzIfR2aw60/MLF4jVovm9fgPOCoy3OKIdtPygDQPdklVc+8mtGsmc/vWMQyL0V/Kt9rxCXKijKp8XeANOQvhuuv942qTHxQ62G4C/mVa5xTilGGmbpMGej59FK2IXGt50XWRvrHuy4qR0oJD9mDZ4itQggVgmITAkQR/mosWTd4ZQLMFlbHNfsc71Llg50ps8ati3gYepSOfDfcSkyQwuDQLxBpoR4NIecDFoXAwXjKI+TVklwfaxneHas59SWt7N4zbydAFGCy3+jrOZNQwwT/y6oPGU54eQCbD4PDy5/bX3tufB9v7PxgEAUDUde5u0K3b9ZaBVYYtKqXAfFbAQNQ6M5Pjv4joS/hJJNWZCUXjFQWg8p7ZA39rILacMw2e4cM4ABDL1MzBc1l8zVc6HwOInEx2QRxfvReGx6cLH6djiEC7WvgFowfxoItzSx2MMYHNxOTydm6RaoV0zeruMDMBvS94sfUjmah3JHmkXHJuoLL6qMf0KzBnxmbLfZwkNKyJTiyoydBSbQRSHh3031osuah5MSCeIDCO/1YM87zvmzxszAJTatqp31qnzy4+TcOXaiSEVNyK/VvwaUGPVYGzfwhcbR9xT5lySYRtDQdcxO/hIbREKgX/UTExPhlJZmGk6ZfSlU2a/z8L2yOdLJgDoUEQaeLsCzIyl4Y5RVbZbUlVcaLFMK/1A7/go9hv3mX+8/5XEjCCcMwXHvpZnWZOdMwZoSCCxlPKiQMd6r5tyj7F9MCRID1RceebVDufjTwfJeSgL+97uqR30JgmPwzQ+62YU24oWlifmKdpFjB6oPAtOwGB6hUNfRO4IVkirZJSiNCAs1TqXiw1WVnfp57y/McLdr2LsWL4QvKv0Mt5eC9tZIf9ySfoZF426t6yj46Ngx7Xc48fNPCakGOJbqCmi4xFTUj3n2HlnK6alZzIp+VFpK2kP2HtYK/bIH8yyB4LQjMJnrDOsq19dwyThPF9V8B44y8mTz0UIvsuSltAxYmNwCGEjvuWU16UfN15qNvnWSANVi8lapUZ7ZKOWM/FpOKT2u/4hQ9PcU0BClXH5J/EQCAzxiVdrdfPUOgFZyvb69RTE0onxA5iNokCWs9aUiPdbExQb9S+s1Mah5ucT8h4oacgTF2dymZ0YDJoQmS/OHcgKtFIJwPBX6JtZRsagfdi0tkRs6EA+TUZ5NGIU63C+4SQcH+ixGSLORRurnWaXuPuEp6y1O9fv1kh13JqC6WA3D7GY3rYOZWxSh3jTmtuljiPKjvDfF0+rrsGj7tew2ysAAANKQA75AAlGVvqDTRQiiTdqTNta4MH8LqFmTAE1et15hwspjn1EXHn62PToRCZhktC1unvRCvfDzAFBMGcCoBvwUhlmBC8vDfEUZTm8GADKjhF4xovKojbRQcSSaRSEnn2QI2O2K4WodBaAD964aNQbcJHCCuWtppfrLubpBnClPJLTm3AXvn5p8XapISk7ZW9V9eFaa6ACTBONKQMGYLTqpKCH0Mw0y+P2REZ/j4q2sSBByMeAVG1J54m6MOAFDPitLAYhqOCny3KpsEMQe1bqZq0JwQM++IDCujE1jhbuBOLRimY73P0L7qItdneksvTQmZk9pldZi2Kd2Ovm7MS+04Lo4ZZygASo6FdH1LQhN6IBqScQswge9lP4M4RP9LKQyo4kBorMsD+jrfTMMq0L4qCtO5L20erzw5e6S/LsttUiyDiCxFwwzHVZcJTgiqeN/fKVxsmILVRpKfpSr5ZtY7920Ad6DUr7f5FKUv6l+WnmUuVT12qiI4Xdhp8KGdcP1cD+BVKPIViwN9eSIe5teASBIkQ234Evkexo0E/a9NZk1AJI5PsIC5WjUx296P+WKXwWRRsQ1Tak3KF4hin8sUvLfSOBkI2+6DVhww6Kkle/3ROBrnqBKIcMHRPzFOu9fvLbw8ig9S40KFEbFCUjhYt1PL9cG0IHO3EyldhBI0TblBOaD4fIKs4HmFQ+aaqTvuSbFq6ngxZKSWASgxOP6x43QVjJqjDXEgmGSPX9Bko7NhQVe29zNhuJ124igcUZoqZH6cL+2vWKTaGwN7f9K5+mQ0yJymHbzcIEPx7CCnurdXWnEjTUtEImC1q5DpdBU4IEVTpRJUgYW2EjAYT48L9EcjOhuAqq2cAvYkRHHuurz3Pbh4g8e9Lod7S9DEmV+/Lm5hTbGfE7Ze/Em33sWkR+O1O6nulnfWZ1HF/oWondeEbWV31rhD8asK2ACyQKemEPDc6CRehYrsDPQ8g2CVqgL9ydqhb63M/PNvWJJJ83nTWb1z/g7GOiyyVwQ3N6XTIbjFhsfYt+eSi8qP9R7Gwou0n36W7iygxM23WUSgsssDHmP3zW3qWMk81iwa5FaKkoHjok+7p/rnuU0U7Nv3xnL/uRhV6tIOmWGYFRfQkW1nuzkebZC+D8iDi5JDhlKEPqO4JI9Moeh7Ey/0bVcLHGr+KOjymB/ay5KcJHLE+XkThvwHjCVSRECuj6tWLkqTBOIHEYwPmjrQhdlvoNnHSHAjFTYdStxJdZAjDagot4fU1CK3rifVnT7U1fajggnrHrggclR4NXouPrtgftLXJB1Vhgy6Q5r4zjN5pNcqIZ11ZTPpCvIvFieOCxHQu0L07TltvNaa+nqEMy8M318XltaOcy5iEys8M8rf7t2AT+K3ySAOYhFKmm9Yb/9aoCiDOL8T6eLAzmuzRBUFXEaR0LlTZ5oTesGeH6U7yTRLTXq6Ao4bGktX/yNDkP5DpRFK3sfViFhFEjwINSzP6elkwxxwWGqz8uhx6B3o7Poq0IrIJluZtGip7XiE2d2Cr4ceA3GEh5Dcs9oAXaPAAAAtV0hzIMO4wuqIiDg/G3spkMBwnQ31gvW9/kHGKddDFfy/cThviHWJzUZS024uTbEZYy3Bcz9Tgt1J1WxTjxHldSqekogE5TgX+SD6VhVznnf5e2uDqUL1J628vUEzhT6o/tkCA6wGTBP4i28U1lDfjFcKJ8c7x4DaNMSmvUsq1u1kKTS2xntZ9i/A0+UAvAGSj0r4T8Li1cicV1CnfllDNj2g+YokCNuSdgTwhTagYJjVfvjuRqNdUX1hWwyfLIryYS2waGyFJOitAWN6ThK8PxIKGNMawMw8YnFZfdbDhRj+soPfAbgIk/AfxMv6K1AFEwskWHguGdAlPDyNlnux+B+EhcFK1U191qCEXSf5k0WmLqccQmfUqXGFbCwIVndzBAXrDbAtPndHYxVgFTO0kzIRqUpKAPvcDKTr0jzmsWg9JgWxtS5rP/e5r2HSGd3lvxdPQQuA+hDr17FnW2nbT3zhUQpB9cN1c2MbHJauFtdnlBpuS7sv/BE4ZBs7/aI+FWoL4Dst5GfbHzq0zFTG40lJr0W6C3IF6WgQwnhhc1Pi3ODwwrw544GeQxnq9AHSoNGrCfmmWlnsN+yjXE8M/pUu97iIZ4HwX05zUPUaL+WZKdKTfAwmwUmR85PKhURbs5QdOcFFTzXGdfz4DAPdp0bfJAjfseUDUjY29TuDlkqBkGh/sNrE5QpPGGbp3O55E48biiXaJOkFCAVHzZkh93IcDoOvAoat3iSSIVWKSy4g3PhekaqW9TU/P6r0Vy9P4KS1BQcQM9TZOfpjXx2ZJiNqQfWeTobVk2WU5/7Dq7OwV/OhjwUhE05gSF6Ayex3Lyp2UJtilz1GdTEw2T6G4lelGkxFucdN4/I2AEq5ZGbeT4mZdg5uVPh7mD62U0AQkVPjGAnYKVOJGIZo9f45M+uRWd8l3X1qbTvVGwbtuy0lbo5d2EVyvQ8uaiMQchH0iCc1R2iTHXDMIeYFHLVgbsmZsMz6lEyHFfieBznjZLPlVzOq/llvuLtdHu21LJt/6CjRt4Na2FoqQVIIbRk7D5aRXjXhA0kdwOUIGZIFeeHRGCqZk2OqFSFHn8jv3yRgJJCWVhxypXo280vat3NONeAYnDZkscczK9q5YN1wWflEHH+zGRnqnH8piRKMzO8OVCQ6LcsV0FKIkpH+4VtBPzugVkDNOeT7XNlAtTA+IJ8YyDPo6WayliDyszhIPcKzmLmjA+aVWriRy+xi6wUwH89EiU38Br4CveenLqg417cOeN0mNuGybnmJjx5ReEMMW8QnlZ4bXWrHsc5iWnv3E1og8/8KHEru5tKybUYRWUoSFZu2QNpUBM/7kjoFXxDa5t144MbhzUqOtuRLr8i12Uro8+hrM/B4teci0d39ucZcYrYN/c8EFFAB8kcizSdZR1J6bWqeoKa8z20Jg9qSwxtZbJt0VPssatKOU0aCUcnwqjGwo5V6baoUkhYOEzVxp64JEqcKTw6diytPT7yvXEjnU82oH0BTBLVnReYl68A5PVNqKv1QNC7FkVeda7Jfyz1DcDJoOy7s9H8m9tEWoMdt7K2XI1qcPQWj3rHtUfNIRT43vjhuDP0SzxOBZXuwlKqmncIcjo1X3iu9kRdPdhsbN8jW0X12sizfQksN2E0cKTpJam8pfxEV9i49wKDZ0xjp0YeZcQdmtSKUQeYmc8QvSHg+IGzHgWSIMlke3ZaomToTsVT0OG/RYeFOAJdjEEiWjmyHTE68J3llDwcswxkMJvRg4hnL758I2IGBge6FaWKBshHH5YgjHEXV+Ot4l8LugFk/OBTUMMOWi018ilGSxppgfQaoUlk5upbVKHx447STgVMnCKRGhX5wMp1V+PvoKsOmMYmwGzO7JOEGEZYy5mlKDKtg3/sXvw+88naKbJlb1Ub5wg8p7mxaeA0Xnmm2UO0N5GtnzodRw1agYWNM1MDKi8cIK1jzfvpugCgSNqQkzBhAAAAAcX6EIAfSZeH/sDp2IKTP/3UVX65rc257AvCYIkiC4KM+d0GREV6XwVQV2DWqAA2Qu/8mcu6YQDLSFIH7mMdCshf69CYc/U55BZQpbWPGMjsB4vgD2EdeLa2vjkQscbpXOk7LQKEiMH6JVKciFiOSMCiOVgns8ONnkRpNFjhehfpkv6vW6F4FraSjyUOCoREUui7ersttuiIBhHcQm3gI7mZRWgg1u4It1rLwvQqXWCkIn9z9zw0d4Jw3lW7/iesUn0Cd8LUzWzsqhSwNROeYJEERNaUkL+8Wy9W8hzZJhXawxmG9Abwzk1iD8IyZThLvo5I8gaDxXSCX+a5EjpwZLYlcAQPgW01MdJBFBuDjbwESCgNVI0CYvBAh+UBcrEdruwLDaJzJ21lzB4yyKrgzVFUc68hw8rXUxUemP0ydNYeIGMUOsBSXKt8imGsP0eR3j25CD27wfXxdWZqZpfnyNgviQFYzG5V7wOT/S26dTV8zTKaMhh0mFttPCIHUlyY2mO/egAeuHDEvx8cOcwLEC0Aby01g1jPS/gCSWhVqWBJD4bv5GKXURxr0vjwubmvDUyqw1itnfUN1UEnCEcMigKXb4bfB87k6GMw5BXCdpKc3ywuCMYg5nYiQwe+aESzQlWkkUffMJyk2DowU3pOJbK//sfsOHLzB80LBQ623Rxl/FNDWNeK6V0H7t8B0UOtXcb1iTc4C7RF4OMqAia65vHu8KTCdHgBgwedhbNFQ3DyPbsebI1WnwHilw2CYHjKkAJWtlpe5Ul0zTreHBBEW3i1yoRGoHHji9V9Ofz97aPYS2LQ+L5G2a2lzZzzvQxOedxKv1jS49SnvNgHqurh9oT+58p1jPHEpjaz/mvmy3FbUBZkIuZpFQyJubIthQ9WVVC5ub8fm10JaKix/ISYvTY3KYut6S+s/2OnOKXMn/KTIC0yHb/3G+T2UTILPqerc5GMQZDutoA9eIywSh5AWDoFa8vTHLRw+NvTM8Yem+K6GmZ20WDCY9cBHkMTzKwjovVWOM6ZdG3n9QqbjQaulGQ09cFZN3aF4m43ADVio+SQRStffrI5o6+oshdAbrVoFj/X59Yuy0iKm7aaPnLwQCl4AAIWzq27rTdMsJNH0o48aKklOGlVkA4C1DLTbfvtXYSkqYNQuT8gG/XdpoRVCPhivTaeORoUCyVnJHaD+hhZJlkuzI9nsLJ3sz9mmylulrNl4TT+n+xXTUfhZ+ajxTvz9KB0lYqqS8Rj+ngF9JFfCJWNWe3CA/0lAWjDzzsVWRQWW1rhrkPdEY/Ontxi83ZynXsOCnrv0mWXOQRAZCMMxDYBN5Wzb9rWk98z3m5Z0+3ZDVvyOv2Lej2I89aJn6dDUj3kQ+l9tiZSBWBac7zkFTm8JgGHi3WdPsaH4vPgDIpQXMlOS/jD99qCv96QXSx4wFVU1XFSMAa/S+LH+4Tu4iXBBIfPKT++gWgo9AlB5WZ/UsluaoKsjbimOZRFhCmZethTh0DfBKWh0ysYvqJ/zUT6IpE7YLDtH61fR8/wX7ANiVvM3uYKRfUJ/fjLZKF5IrfgxvzVv2ebnLB3STaRZ7BRz0J7Xr1Mz3BvUJGCnG1UIuqa1HEpNDdxpcoyTYJ7ekwaKULEBlopgP9MpmNvgRc/fFtBck1SmONz2Q3T3Cwv8kKto5bEwFFN64qgG4/r5sbHhxMOVTufly5DbYldRVh5m1doypC2fZKWlBxnYa8XKB1dhm8g85dCdaqy4dmarYUvLdL2KGtUF8D6MbHy/u0YbgCMmyMTs8KGbAEtZ1gVNWMtIGLKGY7e6kZfgPYlVxDWOFiToMNstWKglXq/gA16Sht3Dkw0gZLoSqyvG+4eNkHBr+Rr8inKIDXPqD8vAqEUk60t3wTL89mzpvZwrThI6dOfwit2A3arJF9LGk6jFTMhn5dgNgtuc/+bWTm7a2OElNberBWqFpDuYiPzSE4iHkIT0YGLGVL2w5NN+3FYtbat7jZ+pRrr3uurVAs5NgVvh/pX0x0xIm+k2E1DLovHJdIttAGqeX3fW0Q0jApTBwvaQJBkaCo9YflqdIinHF0F/fv6Trf/se26VjppGh5lS4hu/1hH0jQznfZ0Y+475WTa/73Tf3Gg9lA5TFV6dzDlfhMT4w18HdoX2yj7RLnkOy5Esja21tk2j12hUarzQTQoWR+HyttxmA6hReurvOC/OEa9t3tT8Zt4we9a0ymRQlJBBbF1Ym2YQ4RLXm8iSHu6pbpEYu5lUQGRW1vy+P3M2EN6ug8AAAATVvnltB0WIIOu70c0QyTxO+NozhJLOX7D5SLoeYEWz5+CM0imxLTMfLFS3EP+DH3+r1GpCSi3udJOyJ5SoHf0BhG8dH2Gz4/poahtU8D5LSB60ESiAe4G/jBkK4Lb5Bn6Sk9bfwxOVO3r7QbAUR+qUaGitXLVxgNYQuTyBcgUeepTnsvxWcqFRdLdzhulc+Svxuxr7eLd10cjXNFbCZrVLo3FIy2fZHwVCNFeEiicnY2jNQ7bCm6Idrvt0nrtegZS7vlv7eM/jWcFWIcrX6hkmlmpO6H24+SSRwWhKbLXBJqYIImHtPMlNsFH++NiE/ua6FfYZD3X9UEyx5PaTgtdFLMY9bunqWN84zSl66y31Gh5fGHMkGEw0GbTvaNRub/ht0Fep0Y9zN7tSMtKWD3DhkoK9j2uX5Ycx7qI3CWHGYd+8cqWoTIlBd9MveRMDFDeYCglkSpX7wPi6ZY1jatCky+/fe1OkFGzKMmtCoOLcW0rlUXEmqAAFqBLwvl0aI31x9HVEYL1zQ9Z3GKcnib+SXGUpNbvVyggfza/4GL1bRnMUvfY/24adyWoR6hAm/9sHHqQx5SviWOZxkay6P9Zn9rvtttq03YlVKSqbwwvZ4rgmwbQZ03B+uBWlNTsyl1xTZwNUAkwLN7gGVZyuSzEtLgju/wqzRPUzkhcM40h6jwta98FMBiiq8yzh+1SJsTNLrZ/GDOm+wAbQvt+Fz71okFTSji0eWjiEwWVpNijvuUZEU5B1ROrIRQxtWad3MbASiUMpiCNBkNwTyxUz4HSq6XvPOv96EJTXQSYY466gh9zXNbzSq7SouwiM2FmHz8d9M5JR1Am2Ak/C4uEdgqYNmwIb77jO+wsJLbscaZJrJl3S9vCDqc0nkmMYNQ0VtiZ+DaH+Hcm4MZ8dNCKryR77jqVZ1k0Xqi2o/b/l0r9fAZB70EA7pO7Q9wWYTASljalG2+rbLw32MBZD3r77bUGv72e1x0NolmmgNlb26qICaQGFfGAO6DY5T6xaOH7W0zF4sKvXErB8prD+mQGuhLHMONXvmVay20YLREOlfbHAlouejmvVAUksyeuLIgZyx83RUmvbTfeBMTl3njVM1dJZNfFVFwF7HUA577RJkBl4n20P1gnc3OYVDT6kPfMWhxgkZfeEHkI1IsyV63L+JFZnJx7xVzc5XHvm+PDHJ6lkHIeojt6cRCSC/sFdcAM9tLJieH+8/avZFyBjN6PXP+C3ol6mbeY3P/h+SbxKH8ko9trlV7b2fuNQG9aHJ4evfNF70wgP9ewjaDivGQACz4/e/qvc5IbKWESlNSJyaxFROV+QvKceVdxjXiHnLLRcblvbu/kyID1Bg6YOmzzIdvXGEMlEQuhoGtIM7WXXD+viLFF0ZG8fWkik9/UCxVmUJw9ZS8A7LvJ5j2tpZ5+FhjNWIDltb+t0SvjjOQ8asHs/fnXP2Iofv1XjqSxWOlc3jpKRxltoJL3dJhMMfsUVcUB5P5/eMsWyvcMFT9/T2HHbvK1Gb7B/vF/z+uLoyIcAsiq1dB8Dy4rsa4GDY7dEU27Ip5aylF6ujzRnBU+EW71JQGf12eGmaMXfAcXSeIbRROLZpBVyHj0RpTCLZ+O3oLHIF9IPIQSEh0nKGRJqD3gcM5bSIz1snrgBUFzu174sKKVo+oXPK3ms/QC344kM5VEmuTeydeCidZ+EmWmASSxRPURtq7GJ67bslKmx6sR7a782IvmK86iEELoneCxgtf9sUMoV5/KR43/rxcORPMGpxr24A9SjWHHfNGj89coSOPwEVGAnJXX+xkpjx4cvVKTKqCFkoQs3ocGMogDAUsQUueEmiut7lXV6W77hmaX62BEFOMvcBXYTVMnkdky/SkJnur7QRVT3/PpD82wsX31Ohfxq27JsHTZZVY7s1Oj3DC+X33wjswVLmRq1mlbyd/EYl+LcvIpousqL9ZhhPOtV19M9wcULTxnDxbnz+aT00lRqGC+067Gsyl3YLDrTMKmw4WID5IeYsgk/VE7YQbvuY1sASg8HZ49q0mGJoHBRVxZAXkwKOF953DdAwPLikkhwB0ZTgR5vZZ9ZFE2GjvbgfBUKkN9B1j6mSFNWH0kumEMyWDYwkDT+oradP80zVTviJ1Y1hNxYijP8tpUTP5bXMOQ7XPyfeb/K1gj4MjJsi4cM62efbj0chQxcl7Qg6cIgsuqQzIwcBEIq6lIs2j2QGr9cI4ngmXEBMb1IgXgT5Py9BUACfwWLqpTN2dz2dlN0vRDZfp3IFMjIlhZddg+3fYzxZaNLD38uCvYuJpGFJd+L7ATMAwjq18TRmX+p+J2mgZv9R2EPl3TW3pTbhwQjXZmWnheWun7Ppa7z8JJ/Bi+Zqpp4BGlT9wL4DHZain6tPTZgul2JX0WfbKU7sMAVIviPShQ9b5oVbE3mAuk7kdjRguKoUjroho4gMmRxhsGupu0EFemn66VUNnbEDAmCshxkvAggPF2oOrab+y9FyXslqmoQr7KCO2hc37VpSerPBHlrKX9PBPgqbSgXYizIxbUsKrEFSAHMg775NBbZSB+iCvEADDjkJB9udJorRTBRDzGZ76dRi0ZxVVX+HJmAVyt+JGEMgOISEmQ/wqffcFITto3hahobseClWJZ7ri2gqxVvzGkPbLPmoMEVyr4PhnvWj/i8EB96ssPR0JG+IkZnN2zAKGsljTj5DttyqE5La/U7NOTFEkwXSF0Eumyf/cOSb6KAiVVYBUKc32dIj79Zh2ZAsZqljlZqGmvanoLFa+nLDAQtlxSkyJaxfCwoLYRa5qDPgzRO0fmNShwK8qFMDA/STLL+NNQXes72tMtttxfm77nYR5k3XjCAZEkqr8pWwEZdxpsuAQzHMEcVOKOE/wS0ficPTLPJjK1vhR7hXVliw7yI2thN3GuUxDVNTXnojO6tRy6OS5CmEztPt7iHSTRRnW6p/O4t01zJhq/pVeHDoo/cXfuIYSqxzDAeaguLhQVBQfiMbpGCDjcA47JZcYk8sCqjXMK01AuXgcyvehwbaGN8qFQmq3oFIPkAYCUj3BzuwJ5f/6MI6Nr6O/ZBhRCDIV7VMQUpnBVzKMLKt6nfokDXAltwRkZ30PNo4a3QaTpmZAyu0kZWX7+lUDJ3lBXhJv3m1DsDU+f8U3UViaumrTFgiyg6OpugvjxgNjjwNFFfO8zlm/i5iw9k7Ar0RHY2RNepblBqx7GzFIOLqB5o4koRLzA6UOUYhXg7+OtV51k22Du6+YfQhHXdgZ8Vl3nWDu+Fjz6f6j3B+w1pREAViZgEc5eTUauWtKaDX5pMiOXBq52ti4/gahj27wQuRagUHtTAtrmOLdoAaqen1p6CDzelqjDaHtes5UXj72KI9bqYdlFEGqsk4wG+lkQUCRaYsIicuhrsjYZEs/3drzVJ20DCLBQMWbZdWj10c029x1WLCJM2D8kLVl/5DDOLn+SjGYNIWyzqQwPaj0O6mDG7gKf63wGuGdpiMpWxP8Pxf9aSwh1iLxTuIwu3BVF54LHmf2q3jg4La1aTZkFdGwo2K64sKNAwl4ddfrT+un/f4l/wuufdWpbDgXjv29hIvF+vSYHHl8/JaTZK3ToZpCF7aJ8gjXWteotn84t3D143CwNCt8VfRJHlTHWBdk78q6r5qmLmnmE+/jqeScC6LO08clBzq3bU6x0y/gJCsuR4i09+83q/+Y8M/mSoyt4t+e+Xyx42N/VOexzJtysXDPOPLCgeQ7Pidzar4fdior568rGvJdQUG96O1WOHVHyMvQrGybd8KlZk1SNlHsgqtg5TqShcjWFKFIVUiJ4emWgtrfN8eSDTXCoIrvDr77Inw3sUuzdzXk+9c56ckARbK5PcqKC9TwZ7ypmLhf6ijk2jBchs0Qyz531hgtijjlUWeSf2qXWqFK+DtPYkdZCVwMtm8lQZhARgsks9p2dA5j1bQo0C6+j1KqAp8I+bTVI3tp8JnUYf3QzVA5OQpmfQZMw6a5Xlucp/7IedzA6887DnslShY9ogoiOyEiAwWkAEvFstMJFQEGb6zkY9htyZPzJReMRXTdmLqLTALMiaD5DCCQhfw4udyh/Qi0pxYCmlO6jvPb8JZQTKhUYv9DKn4UQ/ycXuDxI/6qp/AV/GI3uODfxs14n1mbb/Z/jIaaDPcUi0IVdeUyDkk2gtchHuN/JSiy02/S1ecAkAdHvU0GJdMIxMzokVTKxrwgNytlJOFqJ3Sm7OrByHn5DaeU9zKyv/HUvAZxB0XA32l/yJq5G6HYeyyJbyDOHyt3orMTYh3rADYnn9eySN3/7tD+mdZj7ZzGTZ/qLuBtHr5MwnJZw+7hjV/T3XyGkZ4ZdpH4vJkkNfQjHqIDCEAfD9RyQb161h2tzFu0UzKKSP+o23Ve1GWFLbIsgUdeC1NVZjYcc++DqAynksh8QngAhs3gDiTBA7vKnPly37KR+m1WlnJyYS2vFaZXGatka9aKavBBXPSTBvwRz3AwjPfNy29V+Jjx6PMhPpNneyYPhWN9rYOqk6FhjPl9uYV/sPTgqQqSDY9sSEDUSD++nv2ykl1wLGGXCCTAjx9Xl1/loF55cSKyC0VSlacDTnOHzlHPdvldgOG8Ihoca2f8MR1gUuw/bZAyDJ7Dd/5EsQLayAMbcLSKX0cwKLul0xKnWod7rJITsTG3dqEnlAA+AC9hPulw5CY8dPwRUz0NIMi9j+AvvJOUisdKGYKsmn1iK8SAmZzES5+DGPgu0ZhYQ40dqhNmzoHF6WOD3IA8Q8/Ym4eSB1afJkv32r0tzOg3NhOIYWP38ca4kJ/aG+J4nuYMRD5/ViQgj4IONi8YqY0UykAL/zQkrSJUlFcRpqTmrSVGEggReig2oVrgWuYSN91M6PjKBqNCyxPZK/WuxQKDXqrdTR7jYd/sKNqsiXxZ9SXIfkFQm9DD498Yynfhxa1ZXwWO4UnAkbHUg+Gz5f7jqInxDihHZRRk9yD6pxxRBhHo+rYnVnIXEPZL5pj78EOnOZEKr3+zq37F/EivY0HYS29spWH0JMC1Sv6u8UeljpdSJE0ppymY2Z2RjTV7tqpltXo7oVtMPkF2QuHTR+lRmt3ZQIbqRF0elq/jMGWc0ucS/gfned4yGlwR0WHd+H0epCScF/8e6XQCTjUYj0hkBzeI8F5mxJhiam706eKNifR5XAYT5MYtnSdGdarO+ddqPZgN57DkQAbzgAdOG8M7YR5qXy6qFH67VpdUxoicPDpkws2GocI0FzSEg2igp92RZyiyQV1NcwEUsWTo3uK1tSVouJ8d2p5LPK9Etw1bPkPNr08ZuZnFlxboFg1kgOmehKrNXl7zLu6A55ZTY8MOGyp0S2K7tAZ6lS66KEpLjaLn+rcmOUa5MskAZenMUwa2Zd7TKG0zA33jgcbwFFDSwcj4OjbbQ5z1eC1USg2PoMW2wChMSyQNbbTlX8GXfBOG+uECuvNoOYLU6r5/h6EA7zQFJxqm7hKD416aplB5f1gcnFFxrfczxBtxrkpJNp2iUt5KWN1Bf4qb8UzpXrgGfG6XCAsgfBW6BNX9TbdsM/8BvG8aK2dZ9ZOY/PA9IeZir2fZ7WiY17n1cfJhKqoQTcybyoATisEmddnsrq8i9I9FuKZrQWRCXEShIMa1SUxLHiWC2tLnOQS5GKaiZN/czMtv/O9OZHCFkcghdY28xtzu1A+MdZWQStS0Ck/JIQvxIrEbIVOh3a8+5qwAl+nJL9l6jVy4UXbd1ugC08UT+d/n5IYIcfA9hinzdROs9H8ahxSdZZPMQJfBA6u+MVmLzn6JHxGI0HYC1zSbdYI7W27zhK0TAOCfP8nfKFTTh98sQ323KnQeJ1MbGE+eNSvObLLnQWR7rxOhT95Njp+T4QkfxBVatFw34aa1ml/xQKlJExZnTOqALbkHnrviIQK5/o8lwQPGrGYVsoKGcH0TURYR/MNjrJExJQ1PuISTzdHtmoYRY5TleFaseRPXy9Y/n3+fVfYJbOwlIpfHmmXYVnu1ZVeHGxfzluq/I+Smucw/Kl2bBxHdEyMgEQYAOUxiPtIOT7qQxXOCEMuxX9+KQhTxDC2NYb6bINICLPMkEBtpkj/Y8eHs1wdFOGc92icvX2aqwxofLR7rQVkXQnxGw8mAWsnQkVXO2Zwqgl9EhE0RWvbtvYfLFxA1C/pdoDR9P3mkiXBwl4S35oWYT/m4YwT1YEo1tHDPC0CnFLoaeeIYBpAFPTKtvxqZbXuFmcUCeX+HgZ5tob7bgK4fV9FmFMpxFdbxkGQVySMzWShRrE5ngLgA4hCAMuqm7TXa7QaW0asSOESunphSXpUg1KR0OcxmPbC3oX8Rsgt2H+5XzCBEM08nddhBgVP4ZwQleKRdMjAzsbLJn4t9rU2CN+eMuUC36mQH1mGYssYy0jBIg+MUHeRXNxvWPH9L5RIQ+4HAxpUkdaGMuoyf42IgmXu7DdJs86ztaFpY2QrvUksYgu/KJnIdtMLp++K1S3FAyu3geiKaoqpGY3i586OVvzVo1mI9RXP4XBoxIltUSe7zIM/6MZyyYOXuSbU/p56qwthKYoP6HySl5R5EweSM9sJr+VsOOdfrGvb+Txmt24XEcJLkXBIjPvXgA1GunagZG4dw9BgODdZxYU2DPdSBhPFxXED5xlFMidozRzYJ5PfRqMblTdhh35VayK8bBMdEC2eC8vCkHJknY78ejJEru1tL8YGcRQZd60+nzpmbGPeAHUO0jA0ku3qMHW9HxI4sueQN2viBHqx1Wx2FcgmeQ3YKAichavTzBYlB2YFXFkho83gSfnM027iWTUcdml649jFQ76uZHnkUAK0Pkf9iSQES3YFq39ehjtAZGD5+EExO6X/RxPbfGhnJ9clUoxmKsMxwZrPujVZDAM/pPJCAzwOziv7ySPMCnBHxdy+PaQ62AO8hp7HpXswYOgN+c/wk8PLowedQi3QV8pvGxpfvUyVzLMbEE5kcYJtq0NW9ABFw6fToSAB9candKtPdKDQYpZvlBA1lx7MJf8dXoykkEEZU+oDEYyudPVpsO20K1csYA0i6TyinsSPIPsveV+wW96PeiG9Cq3ztXW2MLf9TSxuGDW4f5ZXF68pSOiGGXY/j4S8JLlCE4bLWFtt/QGcEErGuhAsy2L8V5MIhsDhqPZxr2tscnyAFoH3OdcCDw4o6P/NrZjZMjXAT3sFPMWnH/lGvfzcI055bGnLsD38Fx2bZ7QFeH6VeGx527aEegyuTub1uoDiVnGw9iypO3aDaQ5DvHd+oIfyg9ytz0F1zCwII18O8NT8+EB2dm/DEuFg/f/QIQJgdUnwyP4cd32LVwLGb/XscQenLCgR2WD8ejKQTevmvf15BeTmuKCjmyrkfkHgzjyRDlA6BGVZL0h8prYlRXAxrL/NlY0Gj3bHUdvR2+eMD79L+KlD5U3bibIk7xg7E2jBEfS9RisvjtdnyXjC9Lgk0UzI4dNc4zCIF8zFnS0IFSs9h6KSCtZdaMGaMTGBpQvyoOpL/qw3ksHV4ANL+hZflcjTbhNwSWYOnAnomPy8ZaNzQKnOS9joE3W/vAgHnb0Km8LCY+mU1gH80uZh5hLIF7YnrY4EGkOuE1xRA3503CT2GqN0nHmEUtgYq9GPnKwyCItFv/qQySlQPP+r1X9/oIox7f/D4zwafJ4tyVsAGZOyBZEm2e8m9SdFliJAAz+fHq8ClvA1v+LGRwVvNODLekL0uC6mjR28+Bgv2rJGzumNX7vrdT57wWnAwRypOwtL9r5cqt2VC9XWEXVmzpU78YRtifgntP+nuQ1AvsitkJvQmJ+nynLwEnMiESSeV3yZ+veKiVsEyrJjyRB2DuBG4b+RIt6R/AxdXJqZb5pu50BewXbV4J9U553La6WMGXXV2vlULYF4W0FX72FF/6cBqsFRThKZj3yIUAABLYBKVxRS/d2SgxIJcqx8vJXcJp0O5AJDpBiuOLoJLqLaCqOPIETCr3hMemA+8XkzxfWEd89QaGXg0/GQVktPQrG5Yt30n+aF3WDoDH8ILjq8JWp86Ph6o4R3/BkHcRkNFMHgWvbTKOUjo5Km79l260oFm+Gn9BV0BOp0GW9jM0lh9BXyL8x9CI+Lhc0IkrW6xP1J2+DygBRZtfILgobvpSOabcXV8Lzkl2KAMipt8q5FwCK7G0IbuQ+uQ2ATo0c96p9yEfIBDPSlmulDmMbLPZ0Ot9EB7HR/q9/JTZ9b08f4Z1CbPKZPt53bgjYz1p7i3tQ+oqBwSmoollbLEuFQrcgfhKOXTvjdI+SdSgFXsZ7ZzHyvAMOiv4m43HTbw7v4qZDO0QtDazTyIqvjfUGHN4srrj/qXe5+Xil89/0Uj+cffpwevneD8o734fNvKlYEoqIVn2hixoQpg1U++OunmItpJ5dpBsuvQRZDC8nqPTEAptHWBWi2PC5u0qjjLlTI3RsH1rdKZPCEIuB85PQzY9TCNNNpwg1zf6u+QyMi35kTaHN6wTTrAY+jKFm09ZlefQBvQtgqTxq4Umbg6lX4JP4dHagCjG10H2g/nBlNsxG9x0yms4c0jNKh+FAutGjneVAEd55wwG/CI5DqOXcgtQdffzuaqSf8v8tAaXyR13eHmS3fxv0J58I2jGZVC6lHC1W39JI4n+5XtqS67K6tY35LRp7RPyASoZ8KZKjbw/rIspNikb6/fseEoM6Sgq16/slIPXpfXS7Q1nMws7a88tMSFiXgCHxIDQnHQSnD6H3kxfiUxYRIe5vvxbkBGEQjgpxShFh3wjwwF9CVbnbvoUlTkGZZ4WEdfEjtI2r4EQT6p23MQgXRjJqpqdWvkP1lNBrNYYy++MO5KYUmxx/HVfhbVKARgzTengzabgVTqPe+7Fk5PgpVicN+G+qV0ef0psfYhyZDxWnU6NmqGgIPFGcEyEoK9WG2nOcFxJmCkyawVxp2vJhJV1BEyU/Ti2F6UdPQRv0k456TSWhLSq+XHaxoPW2SK3unrJKQFcwEj4ohwqfVTfDY+k9Taa1JdAeoepkydteU+SrS2irU2gSj7YXj5X2wj3qTw+zokRNyQPJN2eNnbYcBenRSx7HybwQIboo4cmmLs7aUfwiaO4hMfjY662yrqCN2oSkfBWY4zlTNBnGeogmMjGC6Br1RQwmTByhJYgNixjLp1jveZJdXo23IoR1Gt5dlY8HbpO6bxmhYbmUAIyP4mojYmDlVfRFe+/WcgzBsTCn2f5SAknHbzitd/bWd2DcjqYQffzq8fs2xdsRtK0VrA6XO8ACkWG7skKMxP3Y0T/ladxrWgbqOsPGQXH0WOtPryBfg7+z0xDqciBL2+1QrTIoQxNTS066n2K2swBVSQYNeAKw2HFD1NoyRvH++gZrbq0NL5JBnouvouWTIbhzYJpKCeDnTMrhH8IWFe12YyQS2q9msgnLycIoHWtg1XBn+79FQ6Dx3uYiPFWstMPaU9P/rNRIZ60eVQN6g/W0d9rznDIxDPqTlop27NcLWBn2g1t0ZF9hg7MWcNCUnr3yPAOJkXJ4nvnPs9fMXvgIdKABy5ZNSBo8QWreaSB/ARSx9Hf0VsGJvRoH5G16cRzxRuEbBO+H4g63/0PFO65kWpYwOXNCC2WMU2lhOgyY0HPqGOQEzwHxzDyayoWx/s1NvO1dzcfSvZf1e1PY/q2QmDInJSWwanr0KxIA8hTUwCG/HRaz6Z6FQ9IcMZVTho9lfmLzl7W/QRZwKxGdNNIiMvBapd4vaCXHgGf3+nKDXf5q1vyym6L7+7WwxyIa3uCDnLuiIy8Mo/tMW2iwFQHyEuiq2gSaBErNrSDVmCfC5Gb3ZsyWsCU42efQNDsw7b9Y/MHeKl5hxIvfyRABbjLnRqxCSjBBRPRB+fHwOsnan1RIUpm/wRATPPEiBAwfihX0yMW+KyNMROZUVUhAchTJmOu9iJtoztzP3xeN05wkCJckw4iRdwICUppV5NlHSflDPj7ACPcGPKZIvrTQIpH/bxhkTbDOh17LQAQOZyV4vZl0zeM/A6QlXanCTmQAju9cp7QyYHz4JRyhyuUbFNjXnNbah2fe8sMPiJsAfOwwfCPlqUfZIKCWWKcRVVxvw9pPIe7DP1pyD9+ioAuiOj+MDr4EUb0knIcULMS6btqHm7StdxtkvQiLXrFns1yXtE4KHe8OPmSJngVaDLdglsvfrSbAkkokkaOWeelNSXx/0OJ4zOdAQb0FI+UBoGrxACgMKPXQuYPXaO/qbIRdE2MMF7OuYKwQGyYHaysoOIoev4Hg3kzbHFxxx8Lz/ox59UzRXtpP219t/FKi5j94GWXGRTPrPHqD3DPYLngVwf5WLSG8/cy5Oy+Vojb5CXBlzO2fHJFD7oHhouOjkT0Yka3lD3RK5E6b7POVHirLpAjt4ZUAfW8g8nH/1ZYqEo+p60sM6A3IHkLW7/fJSeHd5KpMHj2flzR3B6Ypz6p7/0Jfl6YN4MF9Y0olSKxJtEfLxjkKXbsCKS1SJzc9IXzHx3vyhBuN0DBOkbSUDThyWvkVozI1XIa4BXR6TF/GSl7K+aYPH0Yo8pVzKhVaJZ3/fIHSMYzfrgoJgtA9XTIDYOm9WS8QXPDMWYtwqw5Vf6OEc9QdXOAeGiq3ImWwYNM3pmO8aBfX+9mhlj7p737MdbJ9ZW557/hBUDH+M9TJj4hozIyco22ddPfk37PI2LwBPy+NBpQ2TiVkiG8XDIacpDvSRCvkakDwAJVMd4xfWRIQSI80dBUIVzFWAKV5rAmI66hobTXUdnrsAc3YgAfuJ3WJzedm+yUjBM3J5jJpRQ/3YX2ZKHKjfZvbz/UiSm0PiNCv5Cutf88RUyIlR6LxyVpG9AAAthCJWFxztZVPQLbGzL2Zs4nsOoaYSCGZ1xjgpWk4q23GbucNtp9Di7I15piqlsT72mgI/WV6LwS9F6x0IZPXh0vEAybf1myPrCEFP4wcuoKkIe5bNxgyrlESTgy3vRbKkMptNJ1q8qs59x3fS/s1Oazploj3JJeGE+L7iyqLinqc5JCbVzfANVjhf24U0Edm6+yp/t6WFp8S6xjzuWuDb1PN/PohD0fhyNx9pWZuft6KS1kDYOzcgmhTUP6kQSUrXgGoC0bW7PHWpjhup9RUykGpHgFc10NgI9FTrO4OzOpGdNeNzuItHOtuoS0uWCwCl3p9bUFUIG6l++mUXtNX6EMFgUtTN8QyPRZHetN9JWf6DmyIIKCyyq8YKGe5RkJ+03xZD2OFGm4F0NPbQilAjhsrvuoMCXUnwJn1yca7V1piMGKWM5cx5QMcVIHY/TNhSSCsTeh3tYeDDSHVld6DaTQ6duwtmY2gHT/QMXsiX6zg3yy6v3c1ofj4OYtbpopNP+dHWmbQmfV+xQnd79ebcTUYfrfl9F2EpJEe5BBjLBnU8U/ZkYbInKQvY+7pI/pP2xAgONieCIrs+EaH9Dchu5XG1zJ7figkGBKf1+wic0UIJ346kftfpGBtIrzvltaO75PtIOLFP/jKBJyEznIb7R1AJXfZQPeZ5k4bp3qe0q8Qa7Nlnm9nzPQfpFmo1pcUjDpV101OPA1l2J1U5l91z95J/k+MBJwOKgd6xMaDXOr+Ab9JQsOMSyTvHvOiwo29XYN+xImN0QiA3azF0T6CtKIgSNvmnE2nq2VdzVEjzsGxOQhG/pp7158MMc8gQmeB9w7oyGsp5xsZMCsp3DBlhpH279mlaUI5RG7n+7YhXQnCEmmIOsXIrCrrTN+Itc9tex8Uq1gJHAcqUHobVDfraE+YJMK3vAnpU/GCyPDJxnGPsWoxeJJjMcdc91liUbgi1uS7emm2T6nVqs89bNG5nQi5LfVuVBMSmVSVgL51d5J0woGqXqkJ+1A0vqgdjsQwW8NGbFQHTrWveKzYuHCUxj4ymeIaT/xM9dmmjLtmX/1tlbDcD3k43GH1H4AEvJbiXbwC0XvWKfOA4eRRx+Y6U4v/Wwa9+LLFKytaHO2JA0fedQSWi3XwtB+/QV3KK7Yw8i3AFA9aY0LIvZ4wh3OaUKav7qKqUmDisCzBab/sUGxyNI0eQKCYg0p08qPhUL+Pn5eHCV4uGT/s6dJi33sQuIl1XfG4Mw/pentJol+T61xegc4FrUXfqCgEl3EN68gqebXtUyuu+M2DkenBDHu2keQI6VCZ5RmwSl5gI0vecy1p0mnsei3bbjqEf9tuL0JyC52FONdF34wnfgpKehTzmfN37kJAzvUWgVqN6gnNsRFMjYDo03Eycx3jV1lrUlD05m5/syjUb7wWIohF+gqs+WjwkeFEutYwsZo4jvxo91kwLPs1+KQ7HRlpybSUghOAiwkhlw2qAmG22YEpfjvSfqDLgv6Y2Xbpcdb+MB2K3hw5SpbJeRg5l88c2jSRSmM9lkWU/9GVa+JsDyArxnjlmQmolgn7LHEgSZMBmkAKk5qRJF/3myIyOiS5nPg4Op77V6293vUwGf7f70Sr40o2iObwencXym6glSs5ag5GEP6Ke8Sm0oOMUYTJaZkH/ZV3ZEiE2D81b2LOvaUVW8685pDlT8XhEyN0ZANlvlRDU2QlQAb+pTjo/6DcU0ozq6k0dE5zF2JX2ZUQP2rBw4JJNs96wCK2cjch9Vy4j1GHfLCDajPutRVk23YOtKD6ByqkhxXBFQLf/ij76z0rEyhpiCspMyAFidCrwQU/xlRQ5cjxqO9N0cXDjtWIBX0QqpO2pfLuYv9ZyqvXbq0tZknHkqjQeqCEVDKv3HXoqEr83f15zf2XbmC6OByF199kP0lkTM6vewUyhiAft3cU70h8yLnYwQkqDJAfTCOhnhEQj3bwSD/Spm8BklwqA0ldpZ+mHpxAo0V8KLZtjbYAp0eX3TGZ/xmYIJjzFw3EveBXvz8kIkSkY4rbUjD8exj25+dC0HokOxx0LNcQfq0Yy7t/TT9pv7k/2eUVCE7CvwOLU39UXN4MY0nTgjS3+XOMmnH9kjOa5NC8JmzICXWDNPsvKLSTn7cdlDmkS40sRt9Fvu+xLIxN9AMkP5e5x4IVhGKcrl2pQ8gBN9orOVoJCPd1h37Iheuc9OU4hwiJNcKk8TclppUQqLPNuipb26DY3jvB5GXQdEABuhVzLTpahtkKg04pMDtUrBlR8YpJCsp8pd5b+P+G+tnfUM961krfFaQH3S7PGa67+gvQwg6AUeqZVa1RLEn6LmR9FXRZpWxvccGkyMOU6zSzvu6JdJssVZQMw0onpYYEMEVVRBlkNWRc8opF8faplkPJvlUs7Ho/GVe74nxekllDgRtvc+3R1Q4Fwgh/4BUEtGeIbqmoX40sYVuZPgqU9ykucPwOdfrSV+D3jGzGi4b1OrXC1o+XmiMflBLLiGZPmcZT4u52IiZVJ13VRX+MwObYXJ8nlaFmz9WF53aASY0gv8jcJC7fw2w+XUGYRUNlqDtRz3NmkKvRq5k8jsu/fZ6LpAqIikekQ3tDbZQUunAGlz+xIQaAXa8lDoZGGmy5snUbBcHnc/BCtcRBOt7ja06uvc1ezv2Ca6l7taCl8avcj2ViI9LFsPxSPdYYQERPHNh1bt9Cd/NsZ3rCwzKvxmaLDlKftBCCcBS+CbkNi7t+nykjuaYngztoh+vgbRNtRYnUxAz3foY6YDWCWiX11ZFV7D8A/HVrj28zWAE6deDb8AUQ12oqNNST/awt8+4JH0TPO9gB5Eiv/qGHjlR5GgzQhnf9sIcCWkrgUiXw6sYe5qaB1zwPfgpF/1wjZXm4rCi2Ea0q3L4d31Nuk7NDG32ZXBh5LczI8GlqyXrzoGn9IukrYOTGtca9JDh6WNNQAAAAHXmBY16EbSwYHfnSouQfNqWaKiIUAbAENB7g81DPrKKgKjA7hu5eUbIcwJM5r7ZenxRV71AIDEc+ieKFnVHqslGkTbQI/TKHW14gQtiZcODII8V+YTicpBKd5/yX9dR+nUJyRzHgSnsj1ssrcljBAdPjw3rxtPlh+VACLox61v9WKlMUkGjRQzAM4E4eNBExvnN11+9IJZL1O/dSIGEEmlmI4NfRc+MbBoLYXIQQ0td203IURwPamivvQ2ZG2zbaDvY5ADnuoGiQqMtGly9w/rzCLIDaY+72wJ9gBKzKZz3Zqkoq2NWRue3ti+H+8+vkzu26YVVDiPSKACjESb4EB/qhFsCWlRfeJmCsSPUMFcffNmAqfWxk3dQVcVKYQ+BYm7afUrHN6LK8QPxfZfNrGExAxzGgZh6Q0gz+cLaE/5gK15C4diLPEp1qVcsSIn352GTPvXR9mM71Jav9ck5mJWNrwUwm34wDgz7wlLRYHRF9qHayRXsGULPV1erN9bxcI1Oxyb/2a6uLMMKpwycEUASUs4g53Q2KiHOWzumubmJTM6sjokC/taqJrfXpJ9B32Uzf9hHuFRuaP3pOaGfvfk9nnWYprrqJih7dWOmTPhEE9eN06uarMYeZ1KERg0NsqCKp94yj4Sn3JF42frOQmQNIVrkfJaOC6bweFImji8FCkjk94YtuDTZgkiIPEQtzPcqVOfDeBOTvjCrP2HDyCsW9WhurAMoi0R13K2+uuoYn9XKQU9JenKXhbgd/+J6zO3Y/AOm8UQdoRMHpBuG1BuHYb17ocxjXs6gWxTgzUCk9OFHYhGyLR5Ws5z6IdnZtuQQ74r1kiqDF2925/KHtmHIema5ZKY5qm4pMfaMsUqYsL0dHJ1Co3SMpGFzXmrZuSJUVUF4mkDqC9nYb83GL78nxhbhIvytH04bwTK7ehcSEBhJq4E2b5xTm7sdXhqrqhBOQ4oyeqnxxJjRrgA8V+xeutGnV+Yduc04cG1YMm2oSO5PtfGWMO51ZAVWPmVv7L50+J+rzCjg5mEHa20gKOr2cunFi4/ytAIn5lItwto9s/C0megzUGPrFE4fBej9P+CdxqDKTNOeOP0obb1yXmbD38TIcVDx7acyWA/xIAPekjVcyd0ze4Vjdk6SBubtmA117HnQSnrNap+5zmPc78GHNUFKGYkJz8pfwDf/X0m++jzA36FQ01S6njB1gV4CrP/H9B/S6Qd9MX373izWR9cScRx7aaDoKAojW67C756LAm4czfFGoKr9Wrg07DQSoaLaCNYtZo2bDcIExB6/GPX6ji661uZsL+3UZNMq1YqoLyZngE86aOmeHs8zGeDyjAR+M9re/LQ8mkV3drn0M+WJ+z31j9RGD+jRMRH/EekpIbBJI88QfbCV8ia54hh2Fx20T82cG5boa3/kfbLJVboveFt7BVIWxRR+UJ5k6aUKJh2aNIzIYJGROU+NCMZxV0sR3iuluBHgQStbzOZcmHc8YUDye5sxOXUrmmS22bNwZHFBRNDczDkY7Q+4ypJnfaVw1wXwsxusKb4+jptz8xM+/yIlbG8FJQAu8gd2wG3+zgAzGlt01dmvzFWvZ1HRAuk9Ei2ZXmCMNqr4i58gIbAwJWAUWcQgHrVEzG5JHWX0BcG1Fwqyw7IW2Hzcbrq7Bv2+/HLihFuLSCRKFX5gpWtiZxRQDyQUn0IgtI5c2oNPOYDga/oRwIhC/F66+8qwAhrgoKNkTp4DL4wN8N9b8L4xmeOwb5/JZH6NsTNbx8muH53Y4ux8SQxGGYwTrsYtC6DlFsglqCYugi7JH464usHG4bOrRVz4nNDZa3PIgKxSs2+0JSEdA1ADtoD6NadIzAqhg744ZLmdaDRGkFo+ah1j1tz4ag5TUb6Wo3b2VXhQnaTHWOgHmHFUMNEF+RxovrnKuPTeUxzxYl+nA5FAsGO9MZ4T3YxCf8d4rht/0Cx4nXA9WFM/mcV9I3n2NkxeVYETXznE3nxYPo4d9R3dDM61bUYMdko9chgs10XgzFUpz43T8Db6D/n53bL1yhaGFdDlDP+ilINsRHEVyrvrGYtx6HW5vM9BgBBGFSCayXVB2bCz2DIWmQPkr7HVU8EdVvpfT6N/rA3L9j9hvpqc9cx/Sqs9cZNIlRNldQNUHw1mzIdZ9aLRPRQX5qrLMZlBAG4KOgpsQ9SJQxCi0F2h5LFKaYK/mo16/S47R//I1ok6N5ycKsvhAysThBXivPokKM+Thdfl0iKQVA4RaFAXDIL3fLOai2H6XQbCjD4iufN+NDvYAkji7g1TUEEBEZzeL0PAclnMa8SB683zXnO3ZHITck5cSTqJPaEPLTUAAT+EX0Khut8VXqDYyOfoc9bhvxHDAKYA3in9zoE2sZX9Kg0ZP7EBjeX11rJWTTipCR4RluFGxEiHxP7pZz73GzGJ+RTXOdOtLq+bEP9af7x1c3QB0xQZOQUsinAdlXbscn3YGAXD9D01v6YnaV8WVtZHDWmMx4Gb6a1zIaK2ms7L33R1aAv1u4+3LbKC/VVgMu0xB7yEoIDhtKX/aB84WNGi4tB6Z4u4M2HU3kCJZO52SxngjtZrjXMa6svF7qB6YldNZGTivell1NbIRdvxTlkt/EG9+iERyM869T4+a4kt5wA8BC3n+iiuB1+0L+2Ne+t47C+dlfOJtAymnuRWSet6Af3E8DArOaPkVxhFW7relsG0gNyt9Ad3Bg/wcAfLO1ExvSCZJUMZTlewICkQWs1dxm8SnYVXVGwOJaULF5trWz9y6dq2X25lmmXB9LMbxOrr+vh2HErl7d2l8b+Q7zln1QeEBg/M0VUdYn4WoTQ7ee/Lkvry0+eOSz8+5tTanlh5byPyO5jLc0WQj8QKYgAQMnKZ9bENQ2KBQe0FL8V2Wyvd7+z6ujJbSZk/0Gt8ZYDMHndIwtSBCpuiI+6+ifSX4fwFgN+Ii7gI37+2BOxoBeilKi5Ze8Qa3eRus0+UTxntlkaqJldWQRJlF37XHIXFIJOTtyjEeU/GDgF+uEAFI8bFoUygmOy42nrXi6QXRnNLtn90yUS9dY7A4v16QcDK2WFJCkgnSWo3x5FTulEmZZfe8fvfosxnE255csx3OHgIhUrTUzhorRlnt6bqyerqf53xvorCRuImH2o2WIQDSYaDPVXa5wT5zdRBUuoCvKvoNk4XcO17sajP02gzhzECuXlWQrMetSBgYY4xC6VtBaDcfAYpwFBMA0Mrvrba4Zdl5AIHYQLMGRFB+48aPgtnC14n84Kz0F4PfOUcqEqFJJg0y5b1qzsPt5o951FyLhdJqgiYja0xzUuPVoHiNTROkJeuNNRRz/FL1UmEv8h4MEcRa+j3/FHYC0++85yeUhwnh35KyNzrgxIbcnzpPaI1FRnpnhfzzzN7sI63G/tszaUiELJCF2GFpJ/ylvvxyAVe2SgpcU6E5A5N+bB33bOqd9WrtVqECu5mwlLfNXThAgl8sUi7bcQeCv95wf4IpBhkyd3XJIOCP2yG5OwsrkvNCLOADRyNOncbkshPOpYs8Xtv9ZmAFl4KxTbw35WigLCzkD6JOt4LLvQn+YhE1ZdswEwq9z1KGBGmofbsZQRkleh7e+dHFp7BNpvryKt36+XuEOIwXaqMqCvA+gBEbcXCW/B2lFLnFMYVRYhkhGdnDMow/syR61A99EGePbTpbSDWmXoiX/nykIe+Aaz4kMNJkjUrjYzWstVcLYuBvOrKNgIcMilrdPvgk0X5HiycGE3JopdztNhk6c3hLpaNc0zG4xhynWue/PUqMtWuaX4P5qfmNYClRgPTA1GlD/8xmJjKfBLH63JdOks8TJS75B/3gpdZFKbxXerjgwiHAoNGY+k9yHGblq8TS7iQrolOgEojI9JCfSt1CpPWzZIlZJBSvoJlTkXosrBwBbY2zW2rrOxMA1gyAqpZr6EL6Dote2JCWyI9nRVW6BEGRcjhFY0COAxWr1mnyFbZcS7PLWB54lj1qRCTUd4wEPIPPqxpuCjY0z0gMSUzJK+8VtNoMLcwcgyBddUNUOhpHi4qWMlYzhQb/0vnZCiRSWfWvxaXuIlxmvV8LGbyniMH8B16guUZ9Y7FUCJj1EQAFgG+ZnEhNs2AJPMxkJ16ZaVzL1aOxPE6kIG0++4PMtEMicIklXK5CJuxAk1y8NgOpBN17hVmhSTi4k/hpci4hR4sG7e1TiCr/QmwR4PUkeFrEXaRAu9Efcwx8hUH/fEg31P2H67H6ZGhxXzvp+DshBcS1RK5FeUv2ilQpiqFzuoibHUSkjtZrQwRuKCmr840CmllTvnOo5ubr4XYP3VZgenPeZVCzzLQKpzM0AQdbI6barQXMmbrEZOjeQE0XCCfrF8PBTWONHoZdaaPKSu5FIimeddgukGSrzJJybCZx1qkSmrdL5FiubYWBwKioOtt66J6t1Jqeq970n3YyjlUoHYw5rv3Nj8BbuI2a7wldM+Mss5Qid+qf8qolZQJnDcH+qY9rEQvatIM2V6h9JNj1DF8Rz5bgr3W7JlRBbFp29NaIzF7QrqrOG4MaZdqEVBuM7ufjY/j5UjQQeoDHbsxv6WZAjCH/PstvOqFnAabgNhvRXqM/4ubsAzR7uc2Mpnpj9uFsWSjSu5n/PK9CSWhtze8+hmlSu+/9LEPGVSaLGaTIuUf7YjvuB3jQdd3lg4MKvhd6iyYTZN0fcokMgz71K913sxU30HiSKXjwFwJMJ4AxuORT1gCZaXtz+tIZ+SqrhERe+uSR1iOIXYSJO+JOS5hPk52uPmvKeY7QdSZyDnT6Tp27FCcu4imZ2aNb0evpdYOVhnYvlpJsqwqiSxnH9Vi58ODpxaB5cn014AwpaGO/6+JL9+2UtU237z8A8BGnEqiDuAGVzvTGqj88KErzzg0suKLXHPP8m6Yyh+Xa3/C0+HfKZ81/fGBK2zvtVg8OoedweMW0+iX8eLHFVVGYK5Qha4PYvWgvxUOzldFBPuuUuB+SjLC5wwkoahkHD8drtOF3aJg0UjHikoeNBLo2MuzcTX5SBkdhfTdoGthUjh4PnVia1Y5SB+IBrMXbwHkeDRUDLiXHkaF135a71QtyIcWfwemzKjJtl5HNHAJQng4TDXRMwC8FVKSUMQUcd73iJBOpErA9EZ6duSmt5YHzdJ+V6OmPK0fYBz/BqUvMyuLKtAF3w16ObceWXrzbx1i05q6cTa7Ow8Yv5h/cQwdAmC6rqMsZ0HS5RfPRlFtpNhRQTYMHrNw0Rbfk5g9TqmlxibfE07BpJWxgzBJGOkNUElyVNnvkUpq7yfGRNLc1FK6YGYbMiFhwOopjqLlapfr5AFTktF3ABuRvmN4iEKLEsOatOc6LfYPqxSNNby1ccJjBfY1TuV41MF1IqF7CiV0CBeTjn62gDdlQ+rcSPmYTDbaM8pojvNI2zzrL2TRonaIrXXAnVX9YMijN26Q6LOmI1zUJrRgAi+9ZuiAWVq7QLiTlMOQSt3rM2yv+AB70M9a7/EUQKOBAfpv9FcxIAgQu4SntFeAWSO4AXENCL2dz0gJib9TV8undZXK/FlddUZ5JqDNVUjZEYUdaR/o02XDbvG9nvk4ELCr7/ubtjrcszN3dP137ObW19zUgBvRbv8gKoUfaC0JFv9ZoIRrhLMRMCq4DgmUK1AUbxPaNs9B+09nx18Ycn7uoJrSuvnHRHf2BE1iFs3x3Be/8ZAPFqFA+NX/Ad2YaldY9NcpaOaClWizmq59xws52t7WSeDUjpgFqSo7fqltH/GSlxCTzGTO0AEjB/dWCiVvqPGk+Y4iWXKA1T8g+gXJftvQxgiggAAAKYReud4VRAWvIm3gWW2m+rZ3sO3Z+zAlXVrA1QCvW1+gV2PpkJQLrXaaP0wA+7KNMzHLHOGY/wAetKRo/I8BezGP2tbWe1n5mcvdg2Ck8z1PgO2hYsiqPMWRoIpBy+nLjonCqrpzfAeGOq3TPrMAB8TIcT5CMpohIgoksxEIi/AvCGEXi/6irI9bafQTt/hZsbfR0Cnkv/sD6q4Q7Fc/StwkhlwU9R0/on6XnF1qTvPpf03UN+mILYhZiYzlbnGiJ6S1m+8VYD79aowW3DL9y+Y6BY9I4UfTjLOoBFD5BzDu4vwQXb1J33VJUpM5PAd6VAiZ3zbZbkEeTYq68HbnlZWd7DVTawsI0gqtKNCPa6LYdy65f543Vb/0qXx+xD77PT0FDD0OlnQ96ARqBEHLi/ORIKdAyC1uyDGXd4sxo5FtTshvJ6Na3G5TILekAXIKGkfSHvpfwU7SQGrhglfheLemTmbP1vhRgMSOlgf52zwZpGU5rxP4acTOCdzWufpoKWKtzbN3AQuw1rpqd+w67Iljdft8m8FwvEqkSwVKCoxDgfnpSUynL34f/dCE8V1gSicYxEF4P8butzW2XKlP6XznJ6yYqUQemKTVIZCCya/aTtfQf7lQSIlX28jf+Eimq2BUek/jAzB9QuXKnVQ+3uRMkyOG/3+wsLb0PTMEqieoJmQThZmZlKFvl8t0Lo9O8rnvUti4rqSnbWvSkCcWCBm92mU/3/0KtqxJsjKMWekkqjnpu7a8M9XRyj8t2RQYLjBp34G5zGagieTl4Kgrq18P3y4MpMUCmjCKxU8FaGrJGYJagH45cgbLy12L4TT0S1Brh6faNgB9DXjkuU3Xeeoe13/4Rg7d3ypevsYWhm91fl4UbMkRe4vptnDAwdEf+Bk8PMsqKJMZAPEgC5c0HqYIrERed0ZxrT15hE3mEAyQ1/FQEKPueSg1QzvCm+FDFeyrCAf0qBoYVzOkLqP11Oor0+UGkbAeSpBiBO+N4afRhCDbA4+7aPM6WuULnovXl+GqDiO01NOOlv1BObOzobup/HC6+DlOllTzwzK2wOb7XIdWOs6a5HuEl17IVcu2iuzAlJ8eCWIP2r58Rr9mHmBUM5oPZluaSvlkEZ9TEtysje78RUeIXZrol+MK1FJF+V13G/aT7+XLzMxgAW/78/TMeLBI5x3aMwCuEdEazoJDKayBcLTI577h0n1hcuv9cuo15UEIx65YdNVlI/7viAraQaxSvdkZGJgBA6rpu/Wtu7P43bJvAprTpC9zOAiRNCJEtDDEeVfUGMpwPkimUT0snBATnjbR9Hcefz50wUYQtQXQrF1NfqMIC5nuinSBypWohUjTYwellJiFCmMpR6xan0YN3BTfRka11+l6KLqSjzW4penXqRWJAanmx9liz/vWHyKfw/PSUD5oXLqmMSYO9gexkSdyPHA2HGzBVNYV2cuOxMNZmwqKuMpC5kj/Nml34g58Dn4hssTO3a4sr729g22nYsNSQfUYPQpldcty74nvJjvmrdy53QZqpuH7KcYmCcq7hHo59rE+dl1Ex0MDTfiStTFwUSp5TdNYIan/Y3npYkg0NdVhldl+WhsOMyxvRp640CqhQ0TWuvWRG7DCD00N/gmTbdnOjHVtWJWVtxVgJSxofy5DoACzqlCGjlGk9zlv6i8i/eIHJ+AdDdO25vYyvdolShoG/kuT1YqFB534BluePOBXy/iaNMBeon6cPAESvZSZIErEBrLNYAsJKgVB7AATuJg1kGLPGJZXn7p4JjpugIgy1ZgdkDQ61mOAHAFmK8FmFv7UQopALBJ6fXutPlhFqhSsLhkKx8ug3a+tsiO8XuzFzEcXZz4MKB2lkFyI7wuxJr7vWA7TGV2gDAAiQjgtOMANcJC1OfZe3sMOrQo5cVNy2nz5IpfcjxDXlET395r0FoZIMSomxyJVtZrSDNfBJYDu/EiDnRi9Bx6+8jWq9Xbh21V4O6m0/Rz3MdR+xs5u3OkbEGLw3duQvgcHE7hzztGChTLt8Hc5xO+kd8Ba1JVWxbu7MgCRV20q9ER+9uX5NExNndYNIK0lnql5MQXDaon0aaeo0zqASeGCNrS8wAREn7jXglQ0X02pbNgq3hvJj618L7cM30sAfceHyPk/DSD2S2JUM8rG+ex0KrI1Om42NAPLMT428gYlz9HZJ+xBkJJnlaJv4RmG6t9oxnLocP532mmsueMVguTzqHrvVThBenLLRhOlj8/mAPJ/nPio3RsEDX0pBknVAAQYqXTqmd2u/6ZuVol3lsjwLnSmovM7X/By8DRJFEi4aE1tvSll/K5vnUkW5lKLP18SNdzXdq2lsO50WAah1KpDUNMwuJild1M7YKB2QBhc450oaQBrussZc9vJ/uanHbuA2SQk7eZ3mRBRC3PQ4helMLdYhrBm2DO7otvVzRC5LAHEL9dompYaca3CZeu0BjcynZy77cHB0MZGlcFs//7LMThJMoqeQr2ncbQ0mqGqS2u2UwxgPel6E/lsrx1sTyuj3mbfewiNKcIo9DETk8k+10A9Yn/sPJYSk5dC+OU7p9UFoR+97c49WOHw4umwY3J9kLB7UaPAsfWUo1LlqTSNYFGKOuqALNxcxvlvWES2EGr77x5CnUHh2e8i7sDRKNChjq1DPqCsi/FZIoPuPrtzMt/VNdCXXgir9CCxxWxa+ZNg6+kpXwgDzCnsjKbeCN3p3+7dmBrdtY47dgZWuurcqyvUcDv5folNTiNxMd3tfkqz3SGPsY5mfyDiBFTRvQlqp//hyk1AAfkHbXAAcPPBb/APfMyBK//zV5Vn2gfpPER28tEFi8IbdtIhILR1w45D5A+myIc1HOnK0V89W2XELhHvrGFJaG/3/SyWdn+fC6uktxRQAAKmQAAj9H26DzNRWFXjTZ7HXIPpMlkdf7PAx/dCgYwd/UFo1+qzxP4C9dSBU0e7VCpy/P9EWhRbh9nARWxa1kjpucQoQKIBVwaABXTSrqeXfDfrYhBOeDzzYJYI9bA8TKGAs9ZPzfFYCuOTPgKqUhH3SqBYSO3q6qR79NeaHy+snE21czjqptJUldxTfAX/hS7afD3uQzZf7GM2w2S1jbqHBVZ46mv/LtJhkuOSdVBoCgd69lN0Zpgw4GBnAoYdLvN5Ab3QSQgCiKNTMjOpDgzBcEx0/jxFXgvCCEnmRiHTsLjsrr1yoiWM224CztBxJfh3DiNc8v9tSKmMTVpvcTZxW3JUdWMaMkFlxLBcwozOCVI/wpAqfWREnPNGrM4GOKA4Fpj7aX9gEEAUUZjNZnp/ZNdBlxqTCXaydSnKmfCZ7B/L2rAnn/agU101PLT84VK2xgJ+FCWXDern/HICdHBCfu+6WpxWpbuC82FpCOB+JHAB8OVmSUOg6EWdf4KojL1PEPEoiEQ/sR2ET52GY0tUOpaKjY8qh4eum/9HWnw3RbbWMfwtuu1MIw7O0z+0HyVPV6fyJkk3zc6DsvRsUl6s3tfZzJnJ2tkp9NHGuCQFax4Plfs8jqG929y9vKVE7OvC5ATrgyswbtDnyuRpemzNNLPmd39B0lGXZ7UG9cC8WCkZ7sOtpSCV7Z19bKOspLLwMJ0gQkjuckB6WPdP8WeGwxjFgEUJjY9IaQRitTzr18722HvgF98ch9DuixjapfOvn/yLaD5O8GLH2y8ir6chdjoSAPN0TpaO6FAwkf4FCarnInhKoYc0LOvxpEk3ZPAs6eiEl+XQ0Wo0iImX+jmbXHKUXxXkOs0JDidtZFWzUWqMFQLxwL8nrYso+pkMwOSMCLxn34thenr7CBzCeyB93oWh6O+caNb7YjbYkI5SnkAMWgPtqZU2UlX0zUDjZwyReml0scORbELKNIRUBcgVz7qG38GyuqgaBwTIxdPiGWymfaVxLaf5W06/54S+YGGd7IAyD4POGRNy1fXXdLArqMWmL6Y2NTAegZ5RNbLG/yYI/edWwh3STUh9+SH1+U9Hrgh3MdNzJcHCBHbBgFB/CpSudf5kcgryrR+lvQS84WpEcgfB8gsokPtDzP/9ezjRaTJkyHP+ILnIuQd9itPCouVC0VL3BPwtRV63IQIqTShGLxIkbXQe67QX63NLiQ3uKHBYFdzqR6BNSEhuZ0sjzugYVzN8X8vglRS5fFD3LHn/g0FfJr5gFUA2FCipTWoYjtNUALTJ5hGStf/1ADAEL5VSkS3UnmOO9KaGUrvJ2r4tfyp4T0VJjHyuWDdb5SB516iAqSbYUU3qMp8Ghab9szbcw/9l/NcSUOJ2Iv87sUDE7wGF4I/iLjPTNrGPOKjFHWJ5QGCraSYMGFOyAk8ymlOIP+XQrihowNqVf2b5SNtmSzgrgoA/sdDxojwrxpcye/5E4MltNrYZ7rscUl9+Ha3T6bYZPxR/Um0dOncwnXHZsLQwlge75qOr/kpQrNSRoGy2CYdTaneHvi3zwDJbdq9uFev7TJjc6p+bMJ22TvuoKwJ+CeA05x8hD01RPmm2RxrQuwK2HLaHLna+lXDRdv/71It0QXD5EUEoC2WmF7MeZ2zVcma5KJ1UFgoE0nYRIiUPOsf5/qebgpTePAvudJBFEwAYDpYb8j4aKu3rEob6wCmv8wguvYsun6bbffVPxvZLTbChAahztCDBVzmDfYEuYIHrYEVUMHXYEJ48ZlFH8Pca5CQy+BcI2QiSDRD7JU4U4QskM/t9SB5kgB/lZUicBxQQ4I3LxzqJc0MYDm8gmEgM8TeKMBdTwBddg0ubjyUl/bwaP2+3dRC9zbjQMOyNOe2T7HvSmbXXEd1Uk1+Es5o0zabNhMr4YYCgaOQ2vDhuVHp9FI0WA1WVS/SM3nrtADYUeuwqnvQb5QlrglrLwDTZywC+cHugQuOH0QoCXn9bBkJz/eBATBYZU3UzJ4l5tnXw+SxhwZiIbw/A+TK4yn/H9XQzi4oAPYAiZ9EW/cxxnhRJ8nvAhQ1u3lrRPnYC/CQ9mu7eNqmSnLvVZXhsYcb4rmcuL0Ud1BjNtXV/4SKDW28J1VdrR95kwOFL3IiccMPu6NcyO8F+nXsF7SYzljgJ2xKXOZMiMqd+KGITtJcZ53XgGl0B3UvBc6tqmBD4Qwx/5kQ1b65wT8RkVyfrWGL4XQDlmamiMD2Mu3k6Y9lPFPwub1ran6G6OQnl3W1s6cwikkBP3lKUJzfmrk7oGpHHUPDp0C60hH0769FiKDbUDHCi2l61hq+E3HwxRhkAZ6uQh9yiLhOWfDAPmiTymVgRjS/80k9E5lTVylnibIPgOYmsqTE9Pg8ix56ZBRZfCvBH29vI40hjhSDdJERyh6N54ZZSrp/3DHJGA59vHIZKixgQSHDMPZIwFtHHN6tzV1zeZo/KgnunvrEmXJPy8dLSPOvk6Thj2yZ0pmLYUlZQlpTmAeHNbiWM2FDK+8stjFJz7i75Y8vZyOee8iYgbvOMoZjOnXD6miw6DwMJz10+Gr2C920qrFBAIccCrerJbBgA2+40IQXjQMLupZx8VY3/jLN/U3514YobA7NVjZEhOagSGd/blMVsAH9y0OwfFOD9sEmk0dC1GLuwmpcSRPsa2/rtJBBNiATAMdnqD7/icSM2UdISfDwqku8Pgurcm5lG91U3/GrzA0NGg0jHlXsYsfvPj9b+zv9nEd2ykKmE54DhLN9qKoaU+TVYttMUQi4pYS17kQQAst4J4Vlf/GQ2+bAhfXk6oH0E5/c/XL9EmxUrPSvX0wIC87xq7miBLs8lGeapDS1C0LQao9FmT/ApwUP04BLVKhDuofokB98x1OX5phF7UtlxnZWAXeq3eF5aSMiG9+LPcB3JQYigswVNxkHEH75c3MT2eeiaNeTCmiGb7B9ZKIs7TabgoXbM9yUfP3z0/fa0AuI0sbvfHY+oY7z+JfYcOIBwJAqlCJwyfnr8q7QEn69gPStgCsFeV/uI4L10cjgTgzHnNImVIByLn6MSmkNWrX3tW/ObQLhdldbrbUOzRhKQMOwftGzOQ9pKTiYA0YdoCa061lkLIcQPTFyBuKEUUyiWiISpQJoWAshuEDmXRzZcoz5NVeF6WJ7fs0nP4LwwK8lRABRqQRA3xxy8B3F0IufsAfUjnZH5oOCrgAa/ucE/4cABUj/xTxI+PLlGiGzkgGMf4Kfl+L9gnEl/6QllNZiTAAAAAupdmUklv4wU0DyhnNLHousYtsreoLrPUr7Eb+qCoPHotwmO+U5JQOleOTBhh9LG0ySw3O8Lazq+gB9lRNgEGDYQNZPSSKBXBLi5xcUbE58E63mrwA1hLWAFNC9+g9Qy2kilgyvep7FamvQMYOV5RTxmlOgxhkaLdq6hGrytGu2mECp6haJ56+jkJSEHMcl1jOpjk/hjxZU6c4MbEvZpO/GKiSSah8P/iH8siAhd20J2uPL+OqeWbTGe+G33RQbvNmNTpkzLuL7v4OaJqg0xAQyAAI0Gx999Vei7jrDor918ELPbFnpkSTgc70B5JlpMw2PcWV2Ct49p1RTZ7rGJl1WCSE+DI+Lw/pYPBTVfULEb+EH8cfhvn4CsX0+Cg2+gLUMrwuWZLdAMzEHlvk/e0pqvL8JDj+fng5vmPpGZ/PTBhNi2da/NgRUJ+OmNpuNTj6rgYZ2pV2tLqu2mKQsqgddZ/YnWdwHVhrRFH6dohJnXVJRGfp2aU1PihUDRRE/J9CkLK++iNSz7/Y5R2WPbfz8C0AzZRHb0ufqbszo4Nppfb//92xA+tBvyWF0Tsjmjmt8QZfFK3QDQh25CUyWwF6kXYDQ9DJtuW/Cn+Z/11mVH0sW+CPJxUy9ll+jjkA4kS3iMJ4mF9hyZoYQ6MOiqrY/HTFHRq/pHv6g8i8YRD4DH7LVl0QVyr6kKUO5S0OV7NsSoaBZWPziZua6UhtsTOT7YSES2Z6ot6LTSvo+uk9iv1Q3XIw0Q28vtfzN4vJEp5ZUbK9fYuIEM/hxgLC2TL8Bu35iVexssowpTo8VyhhmHuQ4Aslll9hPTo0Z6PmtloyU+DeKyH66D68Ui+eM8+y26INIMRaKdLf6wppYMlVmWVKU2gn1G7x1YNYFpZQdFhoF+653XS5AuM4D0gGZ+xeBvXXRKwZ3ablNUtrh3zCeUacf4v6AXMhmZ7Z3O5g/oUgIKExdFztFoYKMSI5jmQiDFLAWEYtkPBbIOr8UAnQZtTQVvLLpmuOV4Sw/+caziMIJHwGaSqteScMsbM419NBKko3qjGeyXsYClz2xltijF9zke+RZ6YUFER9UR0ZzVaVSmZqazIDUPNOqHudCv1j2yooZIMewKyRYlyIQnyIa24cY5X9BPTWsTYBhND9GLzG7nxTSxiXVYNDoE49e3JSnBSLN9KBvtoDKuZmO+lWX30UTRz7ZgumYjokuzvIlAvTZ8j3tbMnhXdWuKsKqUmM36tqc5Bw4kI3hUBcVRXs9Wg7oa6aS1Ophg+BF8NB2aMmfCxxJOpga2vxSR1qH7vbKX1eyoq/10tKqCDnyyccLck7p1DNs29MIK8x4Ce9WTSv7CGbPKHXvQlHd3Ics9IDoBG5jWdzzeZWCLQY8fctUOG0rT4MWCInp1a3nv114dV4kVu0rlv9nfgpZ6rjXreGdSUh0PsUqz1nBx7zVxXmsoWMQC5INtyNRqFPNOYUkyilxVpdzk0PKz6BDSnO7ZdQXjLohy8rR3uR8ixDZeDWplmVptL1J1UoY5aLxnvdzZcVcCJsCth/2GQ2h7ZXhR3w92SiCoE7W3hTNOSCkrBZ05btjd8Frk93+sODqyDHhsRTrQBNiYz92QJDFU4EjVOmyxDS/TmHVpfykm2ZC8pSGDECtHJnKGRVxe7zmszzo0SqqKD2aZ/QUHpvgH7baDzvufpoeiWhObiQbbatoXrdAb/T7vv1XqMr9lcN8vjXAR8bLMf3jZ8dquDZiinlGEOR4WdFULhMKw+3wlCZEQhkLQyOuGcUC0ihupI347yrgWsCS5XcmmJrpU+xcnOuuMNWx9ZERtngSVw+H7eMejoedoMC/jqIuSbzzDrHD3+5nt+CE+p6wGfPvYV85Uq+jAVU0CtfTY8DLw2sAZeMvyt7grV51PRYmjyJnyhQAtJe4dxAqrH3zUBWioXHzpdXNosS06wT+TKP3lPu5v0guCr4dyCRL3JcLgI6myjL3xa8F6QHLU0RjNBB0Tf3ysXUUs4b6wgnmmdlIsp9oYhpDI4LCj/pydSxTrXVSrn5UdQXDSJAT8n6FMbGHVuv6qGsgHJCaxrKsxVVkyv1YK6rBJIi4PBQOLY96FwQAkPKR4UfW2RPYzaWbrTO4RBbY+xTsVSBehn7JwKdr9mtT8f4zxCZV6qQtinOLc/yjpst/Mz16yXIe+AyQzvg+5DRQDgbuESyVC1M1Zh6YS6wuAyvL6ltLFfCTof644+vl6kIU2KCR42Ec6hWexRziOTRJdtSZbg5FJHn9KKMTDX5KcpnCB0Ohdm/FPWFfh/b0awz7EW9vD1vhwt7oXJy2OiOV1Rai3Yq7tc2Dd8NdFu4EPOJdpfQMfFXET15FlP4elwHOacEL49LTgAn2Y0Gbmc+eqOvGBaz6wXPm/zwf/p8Z0lJ+6J+ITur08VuGKaBVADufNE/xkoNV0bz+dtDNDmVypuinZ0zgQklhFzpXyHXzI/hqb5HuXoUeNzkaQGKA2YhKokr9I+9CMa3K/E0g/+SjX+zoeW+aIj9xx2ZCyXO1dnNu048jydbG/u5dVQRymBl/5pej1/sNMZo8VxsR6LK68LIx/A7SSILqy8YdPBCoGlDqn38TAyMFNLPMTjs+pNe7Vu7W71lBna06ABOmnBw2s6AJO47KhRbX+ePPuKhv+oI86vreYQ8es8TSTeQDJ0dXy8517TuxV+ji98POJILW5QXzAMttxmKeqFE080csvmtK5d+D7XoCrgjqQwmvO7k6dSnyL7g0n9kZWPEUTrLD0wHjj+j3HL3XQwSuCvV0TABmfabxoFmBvhuBDXaR3wKKDUXB00IakSEbAfGNEZv4+8twCwQFxspEBapfYP7Il+3avlgaseluFqr1eWFEXevM8phic2b5sLpWmrgddbSnr8LCPPGPiQ0Rp/rQkiGkm3rjkt9tjByh7EITgksf64t6T/G5hd0XssUfQ9Q7TBrpwrofmBD/CJwm+fBP8p+U6/HvK93GTxCc52gXDNZppIxGjphTzAZgodbkXHrQY5r1XnWGpE7Wsb7yHOj3+FiZiOoj6qXXlkysE8JzDqBys9KOJXSV6YKGV4F82Ve4NneajR78Ubr1VFIZbrJvLMk6XxjRTvWXSrZQLsZKzzDG8Gqo0MLSnOZX9tZ5wijM5rtgstHZtHLEy2/KGfK78w8n/ikhM331As7fRjKNvNgOt3v/C1aQoH5xTjL4K+FxEEftPCXzD9KhWMRkKJYqz1J10gK4h3VF/CZwdSvml1BuIbubuuyiYD8qDXyLykYRrNFQhm/CYY1/+38baFiRYfml8bpFkaGaBoMA1IPy2sD0mRH3bRfUm9Zy7X0GGXJOE19Gwg2Pd2eCDwTuJfMhUTo3+7Lgxw9O+y7GEC2Ro6ubdIavSsQrSFAVgfnYnbfthBMTzDVpfTvuJbUeCoTXszpn32DVRXY2JqoRnSQkpRAAFKIGJPz48DogSzBJURkua5netT6VLvB31l/5xl5PhxPrDKay3pAzaGl8Pm7ixceqpT+iEOqYQAAYJX/sCWNAD2qQLAUNclklgm+uzA8Q2zDLcWwgAAP41I6+2n+FCEgyrlhPMk7c4RcXYSdMvfZtv5p+rzLQZTcY3R10v8y4PRXfcJ6Zhgm19S3CAxACaX7BkAWr2CRe4ydzNSLUM5QoQK2VHn26MylkIOtTlNG3l03OA8c1tq03S8q41hVGhSC/vDCspaK/xxljlAYiPE7pqq07qT7+bk7Fpl+N2jTlFzeFvzBMH7HsT6myAu/L5NQQtXM3FTMjDsu7agllapj28elGX18tiHsCD4qwvNSBG8qqy3/CLcGDksHsAnXdnSuF/xQ4GVYNUw2KBOa8dm1M0jyvRw+O92MUWWNL6ZXbXULh4SAyjrpBw0F4RdP/AAqr5Ba8LBtAhxybm8XXlGxIYdb2Q2nkDQNBTWVEE4bTJVaJdy+xg0qU5jGdgUmSUmd/GJQWMg9Va13L5+pHesULkYf93pNGg8ikErazHth8wy5mUwPwdO062zNAyHsteWcT6ceRwjf3B+qUjE6iQ8AA/3yZm5Znkt2UueOs2S7WE/GotJheLTy1TiuBXGw3lqTDMO2m62EHnFtfbSkWswvR0Pi/Ajt3tYmxtvqxxzLbhMm/ehwKwdNfF/qUzdBHt9nFIXph76rCua+hakN/I3ig+PLkY3+UayCjXHZIVFrp8Tj2UBt+ULcIpe42eoz2ZU0nYFUDIA4zz0glJuzKIpUGIEAwRLoxfq6X7ZZtUR4aAJskA5G36j5JrafMcKjCtWwPstX5R6uk/8M7kGs0gfFS6mdTAfNVrFmZZ1HQTyPM1yIeTt3u8UuqlQWyzu7jmrWI+1HbMcMxMtX7MTWVSWNDrCmIP+AmgnHLsV0jtshgLWSUmb85Guq8UBdSHCEJ1mV23ceoYj+Bn/Vk2ZvPPlIT/mvUTtHqTrVDdDE2QHUYdNBRcf41nQdIDnXj4Mxw9+6oAFLITtlQgOA8CBzNzew49pXfACeMqGG6OmpvyYo2xmRV3nYV8X+Yl3akuSK+Mtby+zwhJxoozRyl8mrdzBlKoPeoT6OZabsEkEnNucGkXDwi3Se/tISv3NWPzJSKUHd4LCBfUWoLa7EhAyC3PZmKbJqm3Vu5omZSR+SVP/TExZ9q5whnQaOM7AE2wiUy3jaQ001PcTG6XaP/AU87YCPQOQWPu8lbEzx/W31pMnA9Jn6sxlM4MlSkOpmAh3Oyi7tPt8P+5kxCndW5pcSG9LbW4KScnza99nUlicBeW2apGscCyQeQb0FVLPl80u9MmDRtHZS6GlAd2STLVtYUd2ST2hH/RkB2DD9WbQmrBSj4Dix1R9Wnv1FysP1f33QIlUrIu7JemL72EAIGwqIwMV6TGDHhcesp3w7XfVfOSUIjarHXHHRVomBO8YtoZhzlyrM3sp3Hp5c7aObcRNsuWrTAwaeg4kj92LZ9rgP/TMNtxT+xmobqujzd3akBr5w+g4KTJVK2ydV/wlZTGa43qBSw+Yymphx46MkuksRwvhAWFM0Mi24XxaWTII/GXFqDCkkqZx88NsIYHVHD6OFh0c0u/nrqOdI7hPW5bE0egDQPXJQ/NGt7wKF9DZeev7HaFJ4Vbbt4nDh0SU+ZNSGyUZIBafiKmcnDqG5b8WDMlK6x502rf46msr7V7b2sGWjbMVvuNqnlmRPsJ7OB11+lHwOYT5HIUYsrS1wB4zKVTqIvXayW0UeTkG2kR3CXUYnToQOBu8Cn7PcG95lPNeVCx2K5PClkWGXSMnw1kPGzkSw+kZLhDva4KIFxuB974odboLdLR+5k2viyiY7MyvG+ViTws25riMiXLs/81If/Z/ztpZfcAjepx9oi9Lz8mOw7Q06Hh0o2v6mY/QWFcCQla1JeEAPhTibov5cUBGLyBAAZYMgpr/tgVvxmwjPv60QdSQjSC3oiNa7QPz62EsUQq3GhGXc7zHq5xggDt18x9/kqY+w5dZLu7JM3YPcqm7fgDb7q8eQ4831PJ1RllcD3UOR1CKHksHzz4RznjyOUe4qJt8Cm59kUlUBKFXIVHPFunm2ncjS6pAddA9OpvMtnl4OyjWm7kY3IgYUf+ywK0rm8H0SK5rBnJ9biejJZsHzwNe3+6s6lKhrJpzeznH+xACVLppMBcvf9n6SnaQZUkGCRJPAZCdiP2N07KVLLo9fLT8yEXmwgSn+ag7xlH9XGYK9Wp6YPVgvWQHai0EZLHUggm8YzpSBvu99y7vMEqqnntLnPs/DFurwlLVfqOBAYXl3T0R+MLX9uxCN1Ubz+6gvcOkgdGMj/mLWRCOFHSLJXale/CDSqFHdoPy2QcovUno7FJ4QXQepeZtb7FeQG20vlH5eR4AeiREahi87imQt6VzgJwYX0tFlg8QpC5e2mUUynkjcVo3goX8ReNHdGyP/YUXmit+xZzI+OAqmvdv8VW/BhWwEG7/ShnMjzesJ1WwMb62l1cVFD6yVa1bV0n5bDWox0DBHbpTp740+ebTMOMLE3RQ1cytW8pGcK24OA+rLMMHdKxCdRtdjxcbCcx+L7AwouVSoFPT8EsKfBuRX6SEL0gP0E72DzuJw1KMM9w5WAiD0E7SKT0dP12RCINhM8ISQJ3XYXuVm3Uf/W64NtY8oInJi5DKBM6JHwk0Xm06KYLehWsBV82wBgX8ENCcH2zoqd937lcZjLPAS4O/R7sKHjGcSz5EqzhAgkRIGr307pNn2t5t5ZVs2ZhAf16jkJ3vSWWReShMZvNtFJZLmQJx62uwJxZovf5GP4vWwjDNplSngvCRnOdacHEz0Pcv65yURe26rvn487s0MfaI21CqjMGNUyU8UNE5gyPOKVLdYgXSlxkz89SL4lNuJAsJoK+Oy/65GWNoO0EbRPyg6kPGEQ+GCrNsSvEP9ElaCc0rzc5xsFPPGOmjqzthhbccOrJnS7GgD1E8fd8oaH8wtPW6dUqtsFur1ymCOmEO30T2vmTd5kyTXQhOJYBzJRmt4U966puCsCPjsqbuBiJ8OB0O2LkOm8BbBCyBaT3aSW60NFODybgDsU7y5s40/BM034He2jJveJ5NiFV5bYr+chmr3v8zolftQqYT2xU8pBvQ6aTmuxp4FKWuVkooH1UyONRgG4Ezw8wY79aXNG9e73xOL7r0/pYGu8X44kfiiFfkM0XuHCDFub6xiRGNbut1Te9N+rt6aDk9VS2OaWaYFjbGWtSL58S1iU+83lDzlgMB7pJoluPGpj1UsgkDovhz9MoOb0Hl03Kt66OhMFK8MX3QChMex5L56cGJCAtwpioG9oqoKUOgSdCfFo/RZXgaDdKMRL0PIIX9pSJchMIzLdDzo66XJq3fzSs8GVTDEza7WvZy6xHHF810PL/8j6h3b7Y6zBM8+XjEEC/yz4VAwgTNGl2zX8CwG7AkaFXAMt+KvBiQZq7vDJXOJFqgQViOTsIwd3YGqc8Z2HhqXxyFzvVMDdenL+SH0qYxQv70r8Na5GEGYHHy23Nbd8E8N7zHWLghwKc8ptSlSbwJr930cyLzOhDtcVfnogpQUNWFYKgsjOpC/kn5RUAuno/EIfdaFqi68sFPCx7Uju4WDQPjCXuAxFwkuJnWC5oDqMtifbx/v6OAXtDkBgOlpCd6Eh/zlxqvfkfs3AASnNYY9Fd+UYtCl353scy2IStBjyyILY27/XDL6DEeonLFlz9GduLbAAAABWrL+rJpUz9tUmeBB8qZjTLPqrleHzYohwxp+AzzcJdMAj/9lYliG+Gt9f/cWWdkc96TiLCZqB47e6sJ6B0DLIHvgb7jvrfK05hAt43ylLtJF46/zegCotrhZd5Oj1raAmk88lQdFNebWWkrHbk4zaAh0bdXkVdO3C9wpRlHYb4xcvmZsGlBOkRXOS0KqCpgOJ8bzKOaDIPMFKcSrMT+uuhXj48/7ck7/mSbacljdihqpAKD5uWo5B+BqnfM17RVG/Gi129a3s9k8yUiOxSkOg4QDTyVcGdlxo5cmdik1UgRJplElofLsXpmZhLplP04UENCPS5Fy8Tx3CCo0Blmana1tf9gwpiq2kYJ/sGed04yAU9WTwYUW9irKttq5jEiVP97Y4cUrmJdAomwWCJbuL4xk3pGM0tlNYNAIHiF3vcCaPIL4GfmB7B291cD/JYK1vJYT6eOXoJH40H6+tWBRKJmrK7z7FmA/qjhsVSUbLQ5s8/d69bmKj1agFB/64YREo5sp2LKEHRHRGT8xjmJctXMFITNrLOisASVNTFy6wdwp7ivEq+sosApjzmm1TXIx+a0wvg69m0W69vtwifH3s2FRhCgYvCtzzlZyA3i8iBGL5glh8PbC8XVPE8ggJ3EzZ4HvjJRoZpY18FzsiQcrGEXEJD1U6pJvRH0bUuy1wh8f9lZbXmdouE1Uk9FCvDds372jR7uOdlgFKBsfAMWdbUhdheosPeK9NDo4LNtGwyma3lmxnKHN+2IUB1eVhrPv0kTj5443+Tn8gDdPahr/IaHBOJNRkP8zge6u7f3ZVY7diEg2CzVm7lLVWmsw1hv8ZNExrTLmYrvH8c6Si+BCyeXIdF6CJfjy6gBnKaCOK3ObWxfPI8ggYsebWlY9o3ieUkYCtt4A7LyuJ5G5xFaaqWtnfxAPcJzlIfznQCtE/G0ds2rsizloXzv2+SqZrMri+kSmpOMy4PLNrUBG3MTlvxYbfm2goDAXWDsxBiDAHTB5RLug+65Bvsjs0V5K3t70b7jkQFpEOWAFdEMOaC6g39g4SUoIVpYAZGuhTfmprdruzN59sI+QXKXBtpr4y48+Ur3TY46K8Lr1rhv7aJlJITharrVWAOmCZHFpcwX1RSIjoJZcuT4e19l0ierRcawcInN/2kjnmtomsPCz/7uSGBcG+P6aqm7i50I4I9yl1J1cUIdxNSeYJrNH45kaPmW8JGTgXfgpX5fYVtgo56qGoGG+omjhshX9Z2Xm2jgCZMZFtkg9vFf/W8mJMQUB+V1TbdtpnKq6i5HnGI40TwCxFK89uTY/jfUl4NxcGjZyOxG4izFUnHgmTAbvF0N20t9B00gzaHQivEY3ZNDchDTrvG9PkC+EWEUZqlEZqAEJ+wIOj8zorbfdJGz+aKZM0Y4QmPypwghavtbibUH0V6fL88AS3y1xuC7NyxUbIwzlm6wI2xuwPNi2RMP7AZ1jDuQeh7/7gueSRDyDXNwcqwvWRYPQh3l5dd5kbup9FCV8pLwe2I1saKX5eRkzjYED6iRjMgvTPShIFUONCrfOgD0IBOaiNToWyCEN6u+ZEwIwtgoKCm0+A6KRgApJ+sRrHhIiaYCCfoybrUwGHbX+rpis4uBTSg6f2Llx6aDMnyOQZV1KTI/EFHdo4bIBrN865JnERFKVPFdKvplVMJi3hp4E+04uJztu+GwRY3T5EMFGVGPGeCsiv56ADOG7hpOfyPHolElutFmBApe2yc0avrm5+9/ShNUnhHWJA2UqP2/O2JhoUyA2Sa+WdDPgzksoRkLCpZcLo9xJfAjwAubyWNdjjUngvMR+NktQU67PrJTRcTntsqqImcFG4HSkfz41h/iGBipEL2CC42o+p7IJYawRA2S+6AThIbBKm//eJrt//sUN4me8JM1XTmEz4G97DcNOE3+1o+ubR5K5PwbOOmQQy2oE0Zi9QFvtrNwfvENLJwFdbw9cucspUUrDyymlsNIZf2fTXN8PvKNFBs6DLGW5Kq3+MpmolTGDk3zSVgQ9e0Q79tp340u2Q/ayFw9qoZuNiSl6Fi0Fl5QqenyyL8j8//DiO0bqz5KBktzhgEmwNpINp7T3vkFTPvMlDU2JLMjWtwLUA2r/LC3ZrzVgP47WEfGrhrwzZ/e+qrpO1vkvDgVFlEykjZ8fZDI3sWC5leJuAh/5TruejMBaUqKDIbWDvK0pxtyH1e/fT/ms4oOR8BVm3zFtsFryewgWw3IoRr8LU+eqx8W1R7/bQe71RSQSVj93YE1ZxmI6vzGDcSEwLu5tQwSvbTZZraMZoQMaawy1ft1qIkETqdj9H6hM5cTVX781Gh2luWz/ldYuoCkmCBgx7zBSi7muhrC/dzLbF6JIbmNspJe4FuePO4jojL/F/W1BNqttE4iDc95t3paG+q3HmyXNDfIgw7II3DtcQOGerpBvpUFA6izAn1htViRZ+w5/G4q7kj6E0KW3ZGP584yA/r2MccEvl8Bm9tISo+VvdJW2eUPN9LP2YLc+VCOciwzR3czIaAbICM2hPFzCmXfkbWAHggXTFwmyoaZp1vFRco+2MQkthEbE1AoJ2TULkM9U/ghZOQRe5qyoc5sjWx9ihilY6NndgbvByYBTp77rm2AtZSLaavREX3cl5wF6a1JxA5uA2+HrW09pPkiObv2GW6+MhFGyUfqV/sDeKzJlDxQqJHWhYH1u+iTUgd9ftDu51W+i9QJbk4vGUGfi0GkdNDvq5XiZHFQhVSuHxWYrNeVVnBxrZOk1hvvQiv7H4y+E7tXksnLEyYrWMmq/CxuhaJzqLbxI6A5g0B8KLRiirFTDqxgbA0fbJHz10hX01r+y31/8e6olDd8pvb6Kb2XSmvR+5pxt08oqd+8zvkxi5ncqV2HB0OGLZHqh79bFPqRAqpiqDwJYdOxRimwaGwUVgJzDjAXbbvLCQ9dBJVmh5FwT94OmVUonaFVVOpJ4oSnBwCjrbWbeObk/o2empin0gY9nMFqWYRbaIisAtiVHBH1QIbRqK9WP160NKo9Dsvmn6c0+rNj82ja+2zN/JRm+Fe/0qQjzG/CcDtuia69FMq+DIZz0FkdXrkdf4M02uu0S5KKn+ZpCWFhULWtnH5sSXbRxanodnd4Ddf9Txu+lzSYM6Aa+OO7y/SbEhvq3yHc1dWuykOYkagkj2oM4JjYCIVU0m6Eq5HQegWgrU8E+z3Kqi0RRJOh+5rmL5DvIYjU4W/yFu/fWG8wOnRiKbgs44Dh9bBJtmBVSrBSpjTkTNiQY60zCgI/VHViQu85BdLrmLrClLUGqj1K9yEAMo96x+kL9KlPYRRzZluxn2mD33iIrO70oK0ahgb3ZTCWXuRdi55Xoy49WhGg5NdU2W5AcU9T+YKuTnVrLt+l/UVVwA9m+O6BBupvX8g9m2H/QEAVeM3W6Tjk0UYcQBa9wDYrdGFK53TfU698PujAdCcM18HkxMBVHADLu96rta/Lyfe3zeXKsyELSQIvrCHMB4vxnLdIkKn0Lm0jXa13CUUplhX6bpdi+BtHQzltSQGdQRwc1Vc9Z2aenELPmG0UV6O5XAxbEdfTcV5RKDZhLTxM5v79M7aZZXY5l0MRNRQybMLwAIJjbUrM2C27btxWC/5TSX3245sItBej4zXl9UKCqpl+3S0JMLPNOtNsFAGpHNkLu6MNWp58Ucov/Mh3JfozmqFw59/ifO/YMU7aYuCOB0DkGIHBe4iqSENMc+8h4KhFagGGBbIzfsvoNGhOfXVBddK+1FC6Tmb4rXtvGV1Wpa2szRma0VLtwz0YJuUA0Wz8KZzbP3nTOiooURKwpCtq6Ys5+IXz4ULjyCvT9jt4lrAEjjTdvE8/hISRnZXZC/Md+hy8DL+1vywoSScDsHR4IhVJcIp0pjf+OgElnxlT4fXsfuh2G8pN+zU1sFmrlGQsbFjoNmz17D8E0du0fk2D95IeCRE5CKRou1FgXWG/waqWBza70iVGARjUXH5kvyJDrNTSuzUqaYAAAADoT8BrkF71mTaUy/UV8eN1ZNGgh79MGNMb7ULarWwXQDwSCLiNi8094sNbbbNGJy2uLi0Iv96CsUMEt3w9Gm0YGEWrNGyrx2ulAChcQCuwR7T8xuPOoiGvZ8fw/r6SaUeh06N3f4pOhIowI7WYZRqezgqE8024qDTr8jJ+hxQbVBbkFQew8HER/hKLsnL8RV7eGH6nCMEVDQyY7eDb/3byinv2LvBY9Uvk3jwLXtorLcoN/Oyoj/qH8DCCAKPz8XlaiwewYFFjI0z9beV41HP3VDRbnkae73hNtdUXrlQMBXEIWTfZP/b9eQOz3+uSoqYyzQYBgPATMsup5Z0i1PbbtFZbCyagC6/U0EvAuym5nkX635PJWIpZKaRxFgv9n2H2Y3ZQOir9exrVyrvfrBEpf06rIxXDVpRvUAuQYzZAFY0+supxZpPKNvdKZqamG0xbSNKB3hhNl81dcyybLPUJy3w71uvqMIwNmF2plscdNH90AyslMsWs35E6vZuGKUxLy5t8giDHzWKRsmpk5ukoMEPAiAuWTpCheR3mHB+K11fWkp4CnKviU71iZ7K/f2B6XPf1t4MkfBr74834dDqv3Hb5KcvhH+jF09MK00Z02b0kxxJdapyxlnbKWfoGCPOCKlO6Vn1VzvQqEEKkbWSXcKJWpab8nNnuEvKMsq7Yi5fA7hR4isfjzAerp/9K4gN5+TWdH6WFU66tNFbpa0B8f5XO914dZDkRmIoV4Kd0RhRps888rj2dimNcrQGQt623UtXIOzir1M3NEemZQMzpiMMPKjmOE6sRHJ6MVoHeKrqTEuvPn5qkR46ATa/hTXgHOMYF60qbqEjf7hhS3u4VOnS3/m8mfkVlmcXhESrD0wIQRrC/qxRonO0+OBLUFiRyF/oMwqxscHJndyI2uoxIuwhEW5fIprI0kX/z5pUraboBTwT8O6i0TCOQldizeylZGQbyvjIFa1HINxvGIZntshz2F0mkzcW70lJoUb0y12wbwiDW2bA393yIY/Vw//A54Yd9QUFfq6//nuqCvjNdfjU/yQxtKnkMYca5uRsn/pxYqqbVH+puOXI83CXZff/Cv1jeElTVCMo4Qb14me0u54GIPQYYmtaZOsGKxFNeHYhg4+mpsS4AQngfN4pZufdyj4AIyGWICMCen1mqDFqLLyMIDq1xGigKCpuhNrX4ogMUJFgcY1trDwR36Dj8tPeEJ6QMjNr8F4Yx4OKSobvn2ebjso4Pk6ecFhvogIq+8srdadrzgSiLA23ja8s3sIwtF00ZMwc3WMN6NX6lkcmT+4tJmUi2P7ftP/tXRqUmAr0rMcJfnJsRIi/WdEwt3gcdewADHADQfUpy17s/VVtYwjTv2Mme7jwM7JFPcGblts3pWkw1XK0Ef26OkpSOBBhZbqTuEAOizeF699Fzo+KW6dhAt/cr4oPJdJuopo7TOxtMhoLrTg6cCibQGFLC+/TEErm6ntADstLFg+1O8mo1+Gzl7l8C9Fsk42Qyj51HBnMZta1x1XiSVL6ipyGFnNfAv7e3dj+JCqICoIpMJAt/bFAkG+s4gyGpx3XhU58gW5CnNg9Gohc42eL8l3QI0Fbd8GUNq9P/UjiOisFke0J0o9+uJheWy/shSbeNoYRgUe0u1WTDBQkpBJA1E0E23VW1//QEzeGxTs1PwBwcP1PGmOUsWn3AdR2g+DGpXeszIL5qpGgXH65/Io7Sz8Blmhh/Sy2Q9Qfmdqa1Z0hkwSqGRSMi/hrynn1MgsllUMpuL3yMJ8t9aIV0HjQduZ5dZ/hH6DpFJ0FFh9iJ14FWppQd7fx2HCApDpKikq/V7MZPBdlELHEo3RiRW2KSO4bcVBBZh+K44GDhjaEmppA6iWVUA81aEJgWZ0Hsr/xoU4GrT2Gd+eoXo8XO5dQy7NL+Dztqlbl+hr+ykaAkvkg1T8h/p6oq98XuM7WN1fXQD8Y1M9DEzhuWit+qFudUqocCvJyfmN1wYfOdMwDHbeCG+zv09Hay5kOH0XdPKP0DwLf7c/bk8M2YC2VWlu/r2FF+v2sTRpp9Mk7NGoMHVgsAjadfEnKai3+iO6KIm4LKuclmtRUaRgf5WOw10Q2L91LXz+4OxnngCnQKwGlnHs+AfdGWLFePOEiaELX6vWKLLNILtDyekuG4Fb4//FaeLFljhaPh9Pco/tXJIhEOKTqGmiXVV0nm9fsw9rBdLW9UqIXyDj9Lkhyxxt3abaMDNhPrMBuCKVmK5nKwcNFGvzZuodPoFQBF07sc4MqqE5A7ILJAyfwRD5HZhgsWsxIXsM1i/bg8msOloeF7XkLH0XhNYN6ruIYZ89RtmoIqQan5s6oJCX7S53uN5oNMmQ1ZhlRRCKto2VHeIcCOBz2I4TUyhR0SRDF//2GttLlA0+So2KX4Nqv2s/5mw2fJOrnrGrplvAC3+KQ5/ScJ9FQ6TsksS0rEtrizMHXghYgBLcj4W9LIMAV1foXZE4hYtM8A7rAEr08P7uK9PoZHopZXsxdzCHp06q+JApAhl1qn8D7i/KAqzI0z0YBGX0C/3UhTN09PvzM7XtLiQME9IWFIS9uugI3eD3Kim/PYPjcFbMuR53646F8SMWyGw6unHyYAwiFp98DpAYde6HNIckZxDedtXies35gUkXzko74/4eNBsYEIZSO7YU64MHcJRMVhw6d+1UtcwI2ZbSJpFYjQBPsskXdRAYZAxB8ocHSn/4uekASRdeuffDNX3eY3N4fJozQcl0w2kvu4SYy/Ms1qsDC0ImqBdPtV3SUQ3LSkvA8UE/F2qvw/3V21dmlzueg81LU19ECmwIselxgG1Je9RKysYlttCErt1QMH4teGYJMCC9ToYcmBcbF3m9/u24ELSgB8C7nZqhWoWKKpWE+w4yr7wdxGBPs9nJ41uZ+QAY4mUQXnlrA9IfuiM1olN9Tb9NfgtjGBrERMsJveywD6Pk0N9RugcidCuGEh+taTYotkf2meaVAPz1dk5OvfPc24TizNn0pqNMchYcnovmQ5VmJXcOlWXF/zQTsw2fgtcgbyHFYwr9SlUBcUhxHr1d7/PHC+6Wlxmqj7C4hujb2jR8bf2iafS8rmxaqbi6Y1hKvPV58M3uPMm7EhFMqOYCw732ay8/tthozFER+J1keG98k2Fb+lHLE62OO2rgEBLWtWhizpWy4Q7eNQP+djyIDmXnHsDOv9WoJCnryf4RB/D0eh3flKR6pgkAgU/4ExtQ3Af4dmUQwJXMAqZ0CGWEcV0YiMgWBjBNx+voNv6y0Qrc2AkPlJRjPjS40n1l8PO2C9lasrcyowg+HD8S1K9UPTjMENtG7+pez7PwQbvA+WHgiW+ZChu6d3PdiBWvQ1MfJoj1xFCfnxaLG4kJzdO3JDnuGRmE5nT/W8FZvL4jUPaIGRSGmUJZsYr4NOuAEsAxPOW73/ZgGepmEIunyfjnTAyZdK7+epVAFi9vOZD+APnLQj0qqj4ytFVtYfuRqQiSassfh/rDRGmjda5sNlKtS4NHcnQwNq05ViNwa4N3/M9Lk514EDAklLG8hyvRPnyl+Mt5dvDQL3AUhKqgdxNHbDYe5RcMeVSavxo1TvLNasu/dcW61YJGGfob+PxMHa2ZTOhVnyhzmXqRZIRZfLrB53YlE+Nm0j2+Nrug/h0vSjIivRnpXCEqNJfmxDbl0vlO4eONhd5FEn008tblu0CBbL/SMUsaa+h5D/DWiLm6NeGVa4smWwFIIMyMGcVOioCSNVWHctQnesMgrj+sIdgD7U6or2iW2EJprl/bC602vErR5lA0988rdv2mdR0T+qG3awVt9T5m/+mfo6xb1noSrJiinjmESAH4iNnlLNeutF6VcybbKC7pJiecSoEmTud3rtXamh0ta4ZRuJhvOBQwMWIeSmhaFp8nwhFzNXNy/mbIdrPRlhrEJ1rEcQBngrI7Q5lqnQFIIQ6lubQyMoAHUpUrp/HKoKYocKddXryRJabKI9aKZlFx1pdfTWNufmHIw4oUU1nBtknTw3ziljR04TODVrNox+MiKWx+Ky3R7rVVVT4ZDBamI5UGZ6BEiq50sKNFdRwCKY1HOHL7ecou/THhqiblntU38slsAxDFr4TolC2utaejg4uMz17jffkVJVM8VoS+fw33sSLk+Q/MUzbxd5O6iHP1bXbOlNpjR3lGgo6TY7+/xDjlfcQL1xrHpyhbWShqgip+VI8INCN84WUTmpFvXBux4tWrEJiPVzaPgVSE6fGmYNznKgUjLje9BeaNkAACfU9VK5O5iLpuxTTAz+Yzd1R2aM6CAEz72yFFHaPhTHmPrfEf1srQdgrhM3v6lgvGZeReiM8kHBYJAJqsiFFMIfD251diS5cBRlgHhdny4SbRobiDs1ubSharmnqMNVJCEMvdX0Sm2g8DkpYg07vAYVL+F+Foreem8+dO7xctqWahHvl2tUnMBb5/oL9ccw5SVYHRziUC65+JOL0x7GLEwYI/DgY7Wk1e7dPCY2d77ZVGnhjOY2paQyOqhVLok0xo6H3j//6EZispRmkr7pytJ0SPWxRyzYhb7YZpR3fwB7sAJSFNFqACM0yMBqPIJwsjYfLMgV6ik8Nr1YTdqqIviPbZctLG/mqjmXdHQReNMJ2LaPG7Sltr6Vx/MqBbRoF9DEghJYWA3DkJ/eQzcRTMnQGsVe4nbAtJd8qBwGFedpmwVlhs5iw6eqfU/dTrI8JWUu4vziTuUeCtomcAJeURoRwUIRa1J0fl6HbCC92bWKjkZ1nDNLxRj+/kdX86K7yFayjkHChYEm8gBa/c1c53GZ+hw1qQNDlu3p3K1nC0iQJ5Zday4oWEm5+MWWrIrzZqmMNvfhTj0vYT9w1A1hMV4OA0sesKT25Jkr5rcRfCfuNswjzu7xvubfLfVddxhlyRwdmRyXSDvTrIAuzto0fl0QwipOL3Gzp+5kSokd0sbmmYRdFqiM50Qztupl30iyOd+NH9F2Cv4OPzY8rw4pqAmNNlOnvDbxGtAGz9NZklPQsKTlN2XILaPhtKMZl4MtuWSjRssnXDcdsAAMDWoudhlMORCaX0qVzM4cULpJdzKieoHlGtPCGDpMiszNAWprGGp/bGYVDDeqBzLC9UqQcljHghOTcbsMbgSUPhlYvgWsQlPi9nISiOUX1eaNHJpUTV8gi3dD3cVqhVfe246pb+x4pKzVDSC76+h2esBUtTbOLT0ot91SRcStdm02LduudRH00RsQl14Bq3ERG/GCLcaV86RTiG31eulq9/XJGZrSMYetXgKBRw1FDpUV3nqHhC9S2pSZaRpbkFtMYBb0g3eeAKFC723YO61IVIp6IVKPlC4inPen/27X5UkXe5wZ6LcNKd5/TKqN0EU6jWtxOkt7A1mLpkkNQQla5A2NeFfPTLO4PqAsDAJxr8GA+lRN4+7DfPod2o3gYuvJDv422C79VJCQjeG8tpIwK+5ybhIs9Rlmm+Al5MSUP06vfA4tCrQBaTYLB9rVYin5zTmNdV5v4NGolLOhPEeMHmqVEyu+Ejvimk0e+GtK4JjhhbBUaukLW3dwCjcYJJD/QYHhnEDAmB0WHHyVv2XE4asxpU+kQIvyVY0Jebrbxa68InBSJXQ795DlFpUB39z2wd07BsK+saGX4ui6vSltO8KHYXyUtGe+on5VggB6Gn4Ss1SEEG4mHg0De+QZZ9YHXOXaKQga6ckteLF49mDZvLV2ve3myv7KYv6fhJBBAZX2Fd+/LSZHdFfg/fzwOg8AkT+pRoEuzQGgYq0NlO4IPY1yxIOtHzXVyXZOBItYeCWOYaeq6yvqBEjgEKbiYE5OoKrgseA93ke/XCx1hWCdWyp7c7XdyVFmeeKhIdko6anOQuMzWx4xOsAQwYfKTROaVisfGdytFlRSHr+uuBFZ4JO0JQl397eIT0FIY1dPt1UKdKMX9/uPaghUQPUt471zfRFoM8afOWnNtYVa5LDCu/ecyvM5x6TrWFfvh1cBRAECEyK5XndrdUmOyPuSKY5WxLB4zzRx218iixQs2Quef5fhiz+/giVLosACtATkPMa6JfRAm24DxbfUKJKVqCKYgsMFaiPKdWSny1hmBP5bSlk+gna61MaQ4CEjjyW9OGtvSHX4hx5zCd5j3cuWARvVwh/+Vab0T5+86IE0fX48Vpd+o9RxuAbIKPLsH/a0VlFwdCuMoDyytCTYDIwz0J+S75fIPrHdS/eQKyHwbiHauaU+cmTSpeb0VXaBAvLA+6/K84J9kT7nNlwalJEnIPm+nByG7t5kqkYwBdJcYSkR56NcrMFlM4hSb1gCGCjtUxwt4fkDIBSgjTAHBU5+DpnXNz6mjmqj8vsLyUhumUA5lgaHX5o6wFEtuYlcrdt4y6KjurjJauQq6SFHsqP0u0qu4OuoxnBgi+SuBh83EdpNs0oxbRR5ZS9s5mNZ4bkMDlg2Lvy61BvDOpW0GF15Rp7SclVhHrQWgKO/4D89GzB96kGSl3XqvS+sznh44xf+IQFJ4zp2nqLaFZuXVCqwl9aH6z07n8zVdQv75B9mcjrRUyyY82lhc1pqz9K1RqmMxHP9I+w80yhGsg4s66zCoOx1tZ98LGwfPsdYbRdqpJ1TxKaiqvFP7YQxGm+6qVx6XZuEOgF939b668re1bfuk+/l506OfWixEnI4X6JO6m4T0jDN8Inuvmy7kIOIjutbgm/dzppDN0xkdipZxGeiLC7zMSDGCWl2sVkIhqATpC317B1YZZ338/kKsoe5T8+ecZyT/GqfhXDlem7MxeAOxQC+7Fz/mo23fuCbjR69yVRvB7Vs9o0ffZACYN5yHo9kzNwDvgoRFupZ+bXTHrvLXoYIjAEd8LUHnr0s1n1Ploi3zX29mVQRcenD+WxZv2fEugVvdcui3a9cmmrB7rDVlMJVmpHpr8j2LE8pNfykcuGg7bsmozAmijot/60fA9oS6MGe9vUqDh8P+MFr/XOEuTQRtp+m81Yk1LRAZ1yIDQ7U0bUE8fugfs9wdUz3mb2x24uLewD7FtVoaVs8uwm40gODC1HhRJZBBkm0CD99MhIZkiILgP0gaykJOIA2+thBX9a49eaNGNdy+1lPOHIreH2S0LSl/1l0n5oL/342l9Kx6mLSI3opFbQt9Kj1dMYsTEGjM0YQI9TyX5KUCygG7NAumKULNJ7EZAGuZ8sWLtVDYEVm28QP0LR6cwa/LFecZT7xBtWypr0E0h6A6tggrxkrYl8q9OP2f9pN8Ui2WtLlFmsS5QzABbIAKFEYkLDvuI6SOYCN2yo4OcBqfy6jW2DfyIo+cOeVCcsAvU5N7zVnqQqiYvIJUxOup1rYUbZgEf9cj+oQ8N2v3Ny/y6MNC1RHOLULItD7g11hyD2ZALsJpjSYpHYqXVcav/KgS4hrPh2PQSbN4DmwBNM7tHfOt5GeRd+HWAAABBE+SD2Jx9ulW7zpKi+vVHbXfmbectlS6KIWxNhuuvhMY2lLjeI5SEMsud17pDJt4WY78zr6u4986chf1IJhgzpHed39UjEXjrpYu40pke5msfZUY+bztnKWpCB5YyLnRFwA8n2pZLwLC3+0jw/2PPMd1q+KhtAEuDK/YtnSwEVRe17/ob9e67T0ymSWZXgQZ3qq4bCdCnlBlcJUT7esP30+8acDvPaq1ovDno5+yS9TQdi/SZ61F0blaPl+JLoCmXHMj7KyWSPHZUvXzDJq9CzOU+5DSKi1UNqdP1j+R+bs7uEzNTBLghoI9CO/+L4nD0rc0vq33luo4fNTxdaQOmBFb9d8zfsjgWdTNJkr8E2OjgiI8dTA9wno3p6inK0c5dLhgRZDZBRz5RJD1+sESmt5hAljErk004TnZ/iiP2ouUlyJFL0tCYmklI4FbO64n29qRl4Kr3P2tK+75TJq3yoh25GRZ39ZiaMbWvg7MRpGx6M6NkDNVV82zoKvsYnmggR+gU2B2vUZ0X7xWSEcwGrQKayR6wne8uW8cDFtbleNdExrLWipjBlWxg7F296Af9YnASiwr54t1fZPb0LxxVthJEmtd5ZlwiXJREFIKMkEOaI9KLyZgtBtUb27gF1hQnxAx+cuEcvm2C/ZSVUT7kayNHnMM1VhVt/rQrejMDW0G0fVi01n8b2q5YkPTDQzeUOd+aXr69U7T1SVoW3RM82TW6NbUC2lB2I8qLcW1adVm/fvsB4LM+2S/O7sbdNDBWS478XTRtLYIDr1Un7IfkjDwPxjqaMwFKHrxHNulInC/DfFYsosgtYSIZtiF23XQXNQpOZQvIkikotCadwAAAA6FEPGcWK77XtspEoh1sr8CjvI1vCFPbv58WQ3uzKRVQ3pnNGPUGS5EWl4bHvMjbDZU9kIrXtIDdzn94DXDfx1dTOaKN8EPVn0RNgXYM7BsjplmWCn/ja672/m+MvTnUUoT+soOi8xS6l32yOVgg9pQTAYp9hJ7NQmLMliY/1k5a1ppv8QEOCXNxXq51/Ot0xImt8ncAmCLgKvvsYbeS5b/5e0PQpdwIu9zD6uSUWdym5qJ3VA4/prCBrKmMDsVJMVgwD9b8nPKloXczfIkKP/R4LXLCvFHxKFkvYvFown6gTgbAIQOcrsovyHXbKqjLduthz3+yXM0dsT+TACSB0IDiibyrTf+JhfMZ11pv1eO3uS4DSLedyXLbDfWflSqDmwAl342bNZRd6taZ7KiLz4Fck4imn1mBlFzHuB/0SPNclZjUxaOqtQOPS/G06KiDgNWmUC+6jgzrNZkEZJht2/XydOLpsbg+4q8QlIiyQiZAWUoZGdDKpviz6H9Ib+AwpXcb3qwmF57qbvWDdDTm6rFjOsKLu+twBrpLzf4ISv0Q4928lmXH9UEXTZcVxBI3ZH3svblkUrgyOaKOrvjlfyVnXTT6NRjVrUADsxSLNCVy3MAJq6DuVi/om/xc32ehpdC9KinnAUXSxYlR2UWExc6IvCcle3p56k23tdpzVtD8ViL7PybT7FQbkDtjv4cUdsSqrVAqUUi7Sm6uSm6vOhm4ZxWnmrsmjxRH6or/d5wQINJf8vs7fyTcrWZ/Mk3UTYNNY90xbojB/3fRarmEEOBP5+pEOkPFstkeET30bxewxnyvblkEfTj4zFm5m/hZ7WfPxzeA8n5SrBoKK4Eg8g3nQxfSzqcq5j3n5/Dht5YqcJsfNkN/2Bqhf/26MV+zK4kWTZ7GCfWaCosWI2ThqcYIPCvniGIwZcVKdgmUbaqMks3HhSXskzHWFSe0bkOYdIJJkR9vrec1xdcijSxpIM5QZeg5lqITf0CoMgaKY8pDVW0AVoVKC5BI00UMhiDGE2dLaSVadkw0gfvo16pImELFqlBsbIaPIRW8jLxphaluUdFvskJzdxJidiCPR2d4TH/CGxyB6ke6P3qiPUX3lzQl8e0CHGcWXGIDeVKk4bPEmLMtZzHWw6kB7se+culn1qjZ9ebJ/SGoSCp/40QFGaFg7OGuXq0SK1S2UP470JF0W9UgIWVowU90+TvWmwJ7ZS9N8FO2Pjt0P7WOtlmTNU0URbmv1st6UggqsBvbLPvAmzqIWSBe9pQ00rVymQQ3sizEBkeIAFgufbguXqFd37u8CckYCONLHhX4KC8hXtYbXXfXoqnylGRUmJ+5AACCNje5zcrdkzDe1ClD9XxkU82jtD5cfJ13TbBjJqb12mYoBaxyPadAiLUosNZs4eUJe7+AS4mAhU7dtCZEF3lOaIk6Rucs0NgKOgd6wBQY5cboLQbJZQFk50w5nae+RvNdlIBIHRpH3aIXHhk4kAEVqTRko/uPexo5PTrsEXGG5K9SA5/kWMeiyr/QdKi7FB5wrij1ggwYNsSbeGVI/ZouhEaNTbGYo9Bxdg9C3LHAfAlI+tydZVe9+KXCv40ERV/N9BjOnnbLoAMXKEMGplbPNe0gfOckYQrk1k+U7Fmt6ueY+cvqgxncWn53iEJtkPBMTWKAXq2sVEwlUGSJMVvMeR8YWGxolkf7vJCrRMUlG/Wmfekvq+l6EygKcDKUaJJFlT2VJH3WLdKnnC1aB9K95PF/jiFfLf7PxHQzpgr2Y/bZLKPzGCUemSWpuNAjmxdfjDOcptkh83vDetH6w89OxTJKQzT/GnPoUKgjKWZNoT6mX63+PUYt2+KpA2AlrfeF9M6vF+KTofCTZQQMlqmZsqRWQXsYu3hFu1q1HLHSjaIY1Eb3s8s6J749qzCrHVJ59M7oaxFEDraUNWsIryz3xfazzPK2JIWYTzN9JlBtIXFdNy5bmTFSjzYKglXReuG5ZMf/mGrSO5xXb6rX8v7Cl1sgu+YwOWC78nxv62ToqsajoksEGRqA/wScMUa/d2uGoCIg5UjBR6LQnOG9aBHCD+xIsBpu9ldfumJxbaVy6aPSAJyhV2dyAW3qoISfDMguUismmzvPC9B4cEfhcuLpvOJUmVypUo2C9vnAQ7w7lyOUpRXt4XOnYGBa0tZljsMS+DUnBm1mtovK+0zRWI+qTIVGCK6n9FglNj2y0UGI6pgnWL3gG1Sn/XCucny5XDziuaWM6n0o5w9NLIQpDfjiGdPyHVuB2fq7Tb5IBj0QcMbw7vYa4+1dbWxTGv58e0XRU7T+VCX//YkP+DIbRcz97NMu0F5yHstqFWwduRHjaASyaQIm8oFB/7vvrjAsO56CIYcwyvphHQJrCWcjGWwyNc2PFHpjrwXJwi7NGJJUFjAAAPnowRAVXUrcKPiOY03RDxCTlXCgyzoX6lreEIN1aLAoygQAa9fO32YJvuXE5+k/lllr+d1EXhYEnU6u0KPoMkoM4Pj45zEXxFWn3w8Zs7eO102IJmuW3d6FUt7Mc4T/Lj+SdrSA7et3Sw5E3lj5NlBr9HG6C4ND8llD7i1TY9cLQz67whkYD9B2qFzSTQKo7t19eU9i4Oaw3R634R+Z7fgSkls1NmdLhBCQ4VP5+6R4ShsszzAxvWSfiPbvLBu08yHryUx1ZuzTfqLdg0BGwsFR975vus142Ln9CN8QRIYZoWq89quLpxaVbpaf3YFYFb+wJAszF9jhXW5azHrS4cU+DW2/EJSPC2K/qs+BMYB5X9uv7zVhz3zQlAGQeBEf98Vi4yjFF1BKT3l/FiYGMDzIaM5UUGwjz8dar/pFWQro5UGyG8/xuhR0YvRSQCO5q27mIhXFIypxhh56mBi1dn0xEwM8w0B9bYn8X4uPtpxcBfOEDu9AanW3CmY6t+mFQkGE75Tfup2D/qKeD87WU7neJVXOhKp04i2xG79Xvx05FNnwtSrqpooR0GXOS+JcXAhIWF+4+lyzraIMa0F7jI1wBzvaAV9uI8P4Z3OoBcsU0iacV3SgrGz743alG/KuCU2HCttoJ+npbmqbjRoLVrXc7hRjm11qJPEalKmj/7Z76g3dr35+2KrKOtz2IRLqQV/TMy4bzXB14bEIi8g1umfdl8eNRJEBFsAvsz/6tFF/4xlypx3q7QAtlqrTX4ORvF83xw3US5JA9K8J1FouzMy0NnsATKEXq6fXUblnSxPZY//ynnefHMuyJcByU1jG4StMuQNv/EMRDaqAAAHcGYGso+kAfVwLubbd39tlft4mIHshgPDeL/OlEhbulyV1x2KXFUFlBqnRRN2nxiaQd0hJbu/tizJFsdDW0RVbngKkn0Cgmeaw5btBKA9fOe9Vbs5VKpZYr5ABaRL6yMdGiY+3Lmx4+MmjqkX/+47jJ/z+gdqgVNL0mZctBcoWhfflBQb1EIKg/HYxHk0BsOLti6m2jGjAX2JyLfE4X7iw92fMGRTqVW6GHHF/Tz4pwPsT12or1vo9V4PKWweDQ+VM8vpab+NXcWYBE3i/A7C+sOVarEZdJdFxu3uKu+PmQDCCyN62y7rJ0Yt0bihA2VEJLzo5c7ShWUuAmED9xU01+3BHLnorr3ulbC20m5m2/lknC+2bCSTushXUjo6TgnBqcXnjilWigL82+nN2p0eSOehOYm2CGM+lNCUfRHA1/0hBGEnexVvM/sC7e/Ua9pZg9vWoagCEUYvWJMpiLfeQmnjrZbQInhqn8A2HX+zj3dxjUvqEIJM9YY+L0wOIBif5t+U6TwEpwDXk53lb+nMObmfAt+OWIkISy1dy3JqmXKN+V3+p4cJk8bOsnr4xeFHOq7Q0xSBDEnc3HX6e6xtauqlSOqdxQ6fiFoNm4wsAIqoXV+l8HsN43YgpSI5GgFoRC0MYt5221zsbq/3ONWVUhTKYVJaSNGjDj3gGQfrSU2kJgkpKxJGqxgDgB2kSvieGY5TxDd4nFWZUcgSCVULIKwiHl4RAKa37eCsgrO86kmj1qiGAyN/XYdxUUnVz3caO3d9K8vIFdkldpziBswAfxngWAGSNcHb90fwH17F6R4Ywf42npgu5/Lwa/zK73A3atiSOJDNmgWj7z0pzW37wqjSr8PZ3lkIPLNRW4208lmRTpSfuhykjAI4Z/+Slk/fga7woq+birO44NJ+aU7WjOSiZGfsH4j4v95nufXvWwK7kVJtqHrHEYgGjK75EMcDyBORWeaX6P2h5Lq7TCG8cnJKOoQhdXjPkMdwOSwHbpEcF0vu8do0EiK4OABHgRo08e2+dGYDoqi8cW5269CC0c3ZN0rIPanAki78NOTdTkgrM2j3LximU4EmUxKEBP45b1PvRn3sZLpRvCEDF/9qWlZls8e5veUyrCqoO5PyjuWYY1YsG4vd5xDhtmt24oSz0QvDY36tyocEh5iY31ReA2ncwUc84io/Q1CJb7aD1pN1KM6PzFsigHMeCsi3XYhjqkcYSSxK2EscreI08wE2iBXTHqLNobOsrNFQhCec+pq7Y5VPbHa6K1I3G8DXa/m+2mGijtWRlCLxE07twSi8Ldpw0AHXXT3TExSYEFiLi6VVpR2gpLIw0xkI8cV/PybkJ4gwWhpq9yHBfAN6+NkOBIXPmoOzMXe+vXDXWqsLsHiOV9tEUqIPzwbppwGqJeD0Iz0TwOC5pch7WmhkFUn9w4y/p72lm+hAGXQw+g49oialqJRMm4a4qFBghOamSQImIQAhvzR0nEIpcpOaXFPcW/gICZm+Jy4+wtsinxcTohrExNmTbDqD0hD6tx06JSKbp7rvAcKc7H6Re3UsGyHHTVtTyIzd9zl25qrL2C1wZRW9+VtdPjKNQdY0ozSdWwVjcBb53PxE72GiZH0etTFeM6DZynG1HHcjQ0F3R0N775NxdFUe0GtoPC1TIfzQr4J3MLWaAYbMWtl2k2PznoYmhYtJw7XLFfrsfi29GZr8c4VeKma4dYGGMlcFlEKQr5h0Z63BdAWozKpTHv9fHCNN6NcXZ30Uhk38DxVuWStpXQ4hgkyh8AIIyM5/bJWtzgxTgJpm3Fxsk2YDlqJP//qSfGG9rsHMWOEte7Ux/ofd5NR2hvKB4j+gNZXmcEMFH0V1tnUfiMVgqo6pLoJegcPw1an9fNrn1J8yBqiCVBcyUkzEChrKKWFbPo3LF5rZjIKBwDL/nRHLc+FB/1DdH4er3Iy5dX5tZFbTq0ANUED2q6s2I6xACUAA+smuAn2CgBjm9Y12thPpECQKX47VylyzaIscFX2CMdiBv65hDjLhABCh0SUSd2ejL+WiCuS1z1136O4anvuKEyCNtufEQ7z11V4LvuuiwQqv+kGWTjrZ0K8r/BVgEjLio338H35yKG5CslnC7fkzMZA6RHvI3ubvK+4MK0wbmcZnCmjdd2N/MZTYBkVAIlPKwdARwx7x+wM1CmT4Cyk9d2QOZoTD7uUCLIS9e40raotOCvVgRYquV1jB0xDhEBS0BAme7mn7Im73jHvOZ8yU2m7nSo48PKyo+PJy02D+lfgbfRjxP241ohQlmL4p+/IUjP7ux274kCD6V0+H2mnHVCsFYdHm6C2fIy73qD4RAxqP88f12Ad2FkTK8ytyT1EYv/UpKLtpmRRVdKoSvVAu5usRBzVIxDv3CXhieLLkLNmYqcm/vvDTDC9dmi8MvYBF71UEKccXzUw4IXeQw6q4smmArpNoeKYDrD/1uDd3t0/vjD6wmIlvkQdrO2PLaVptiGq2d4EZbixvzEQmHEsR8Nkq7L0sAzhSBBXTEJ3WLYdhovp6mNuegb8nirv74zTIetdXNv6jDlzo20FtD1N/dz3AUhfv7ydcz0DQlZCth6H2/6mSHhc0//m4nKJQ1e6QZmL+pWNy3PnE5qUujYUkKf0XKTOLqdY/HlROG+4SO1OMjydUwAEK2IRu1Te/xdLPImUsSK+vU7JvZ9RT0DeIU8EkonjRQhlsN+G04cGuOrlmFNDk9prYZribLEMCQTUaXvS3JTBR37Ou0U8Cu7qDP2EeZ9bhEWCl3OoZ44J+bEEMy3xLqIfPHk4MyVtjumKDo0ucIdfPt9mYg18NQitUaMri+6VxwMI0+URZiGc8FwmPRu5EiXHsNqx8kAYAz8mraE5vN2QfyYR0ER2U49L9UzQAAIU97PKzAA/b1muC6GCrxvtJ8CItE+FKyBqwa3yRXb3GxPkr4FX7gVZeAyw2OnsU2P1Vc89fN6cWIvrszAPAmGN6zgdGZ+2/iZyuJ0C/3YA7Xt6NkBdEluubegVT8u6xeFfKLlMoQoOt1EgCQveknDbAPIxsCghA+VC7IipH7ntrbPilFa6Y5Y2CpgOCCPLO3MogRjGL8j1L8TJkeHJGzFZmCxhbZomBRG6cyDiIpqAGxXPnqRuMR8TS2SgJo7URrQYYUAb85mTVCz3K/qSYBZGpDNLc6BcKef0CHNU5oSsFfTDVqS3Or/3Q4c/qklziIih94cobEICv/MZbJi4hWiJ/VkWJSApEfl/7Ny56KPVLNivBZFvceQLSJQj3v0OO9LLRqZLTgF2Etuac723wNxlfLjEFuUdnMSHC5CqfM13YjXVxxU2T08aa7s/vJ3xvGuMKh2ZBli68b52ZrJd+3Vnvg9oNkghz2+SqZkxFzVOu38zO1OWeYuMz9NHwllcjcwlkAYXAd1aog+atH2WJsu5sAz/t++6z6xFRmKm7Cu3EtZpUJWhwfYnzmhEyHAQJAcPxJeug7+u+kBoRZy8GMbcM9u97KGMlhV5vN+A6q5HI6kVPs9rqHRLgx1vS8THpcWYwW46lukexB/267RRf2aJmC+YOqdtgwzvO/fkvH6CFA3aMkldy5ZCNsgk8nVkstfwISOCzFX7shdWgHlr4pId3ts9qIEI58XLoDHNbM9p4Ftaz0IH7sR7Shj2OEvEAm7DrwGHm1o10lBzYGCP8O7uMj2gw7PR5avKtrdfMr2jenJ9FOzs6ZwNucdsY6DjCSPhdKi24KwAxbGLEJ3UWwC6gpkP8AhY0a6qedYT9EewwOdQlFu4TYH1n+a512oHR8tWqfClMPsongW/oZa5NM0/CjEu8x+7sjMgxTYCTinoTDballL9RlFA/aF7MxYKl6OGqIchrh1J9thO2ooF7RjMfmVWb1Rka21mt9DJCZp44ZUkWWDCdBpUv6SWHFcp+YZWUbuXe+HU6zjYDwuL8nvtSrzEDZfeV7/io8+cxomo69W5ohinwZ21WXlyqq2ZFE4Mvx02QHvPabhezYVPAYfJQf7hGV/EKBZfdJa+lPYhjLtdwVAoUdqaLDJRwFJsHhazvElqKyhjqfYp/TqWpS7zzOapc/9iOxFtysNgKvt6YH6LAPtfX059olmeEdlZ5kVYJnMs33j1hX9MoV0g8VML472imTzvVBTcNvetfnq1AwJSGeYhX91dItm24l1sgOhBPiSNZ1J3dJkMcQKkoZQx8OJNXh6do0j3YBUuXblWN8jGswEzqN0VNzwHafca9ox8FaeEgxK315L8SzexWV9qTzLpb56likghn5OHXcl/Giy7FzulDJwWGHN1iIFJT8IYlk3vvBtMNn0id4I9EdSM0tu1NGWzdFdwNlAa3KCkHuEHzymIuWR7fmnJ/nw90X5xKWhEWBkRfgoVsWYCyiLX2vIljtOR+OEr9ow9lFSEyZvNbJyDJB2IbiqD+xaLWY7Gonl/af+/A/sK0YfjITAF77xOQeFj9APep0jZLqxZBP66qu07OM9KBFfGz75c+QuUj7ywnys8jiCjc0PR7WdqjEkhnm8y/H0tFlg7/ioeYVl74pmedJ3t00kXKfv7F5Yli7RCT1iCnsNuYbtUoubQ2d3OvauMhWjaZMgO2+9kiYm1WQ78KrHnglWUrElZfuV8BEuGRl88GhB56KHCvbGnFyWUe9VOM6IdWCo5znFCb6VTIxddHOdS4eUhXulBgOE6q1hooWQ9UvPEvrJOp4R8RsLNd0WYZUi5H7uSBm8kG9f2xQCQqAL0fxisjBAh8+CYUDDwBLCtDBTJed+p/1Zmy5LPbt3nvVGXtdcYv0RxbnDOw9ph69nHC3FOqTAqh3YV77MblavySy35MbpzlnuBZS2Bjc+GgWN9R0f7SXaLTp2NlTHJXe3WPcKYGEocLB9sA1rSBYLi3DgqWMJS5hvs2/8Br5wSRTE5KscWHrtpHQsddP9VkjuhR9cvyX8aQfd1bq5BL4zdAOVoB7wXODpNjVvyGEjKWXXrS/8vuZzSTmHndKsvN469F7lCC9oG0Aq9d1i1rWlajbF87RjgUjBlQ62bWXrIABi8WRGW4lLc5/dB7iZbyX49ibWL41fwZ3dXgg4gxXLeqWpto1p9Xnk77opcw/MFroBMQgSuLz4UN/Jkm91Sx1cUoH00P3+7tlHlE8XQpuhh/AQYBXcQ0YS2PU47Z07fhPxA3mdVA4V2wkfjheOA4xOrytCveb2fc88nGex0eV5wGHWM71M4MQmFEf1ElkV8X6lMdgFQ4a77FEiJfra79ebVGglF4/j3Q6U15btuDdc4OlktLeyken3enc0OBga2RLkbxfQFChL97X988hgpTbkOKFsr5qCn2pYib5NwhFwk6GXRoaBxe0BwIIuuAfJ0o7NMnvn+OBjoQ66e3yPqifNpgZZdhxczqIyrGH5QC3ZPjFUw8aWJZ/QPSu/62cXybpsreBIkgFiY3Xa4K7Avy/7mCgEUep2eLbXut1lM5qKFSX0LRZGbTa1cw/m3Q9ZXZez4xa7AWYRC0IKZ6oAgvx0ML4ObrOL3qRug+t/bW8py4IGbSByklg4v4RS5Pm2SMxChqtDWDeBAxZM7//OO6FdjvoFiKb+02RAZfLIUpHalieCzoYYYOX43g3h35Rmfhffjw9dMkhdIwZGao490J/mWU6iVGDQM7wE48Y5FHUMs2Xxt1XkuUyHhs3rsVBE9LKmWk3C/Euxvbv+hP55Cik5i7JsXJdUIU+/4MX7Ax2DCFhHa16/cf/wt0WfTzkytXI3McA4SKwxFHHFqMlwc7s4+DhJW7nxpC7k3mo+nWIHa3DpyUEiJUfF5oJ3kb9SaJnB96tBeBM02E95tmDRaTmvCE6UUDHoE0qgiq8oF/eSfAfP7Jwi2+VXXCyncgKloWR/LbWZsnF8txDkz2Tg+GM2vUAp1YEzdRUm+3qVDWEgCkbgVGe4JeXtVbVyxlu4ifGukKhDTxJFQljRBBJn6MnYtUtNjVYMQ4fqIBvlJuJdZTgS+rTyF6uidyklMdOqyoTeYae79e4alZ5E2eiQbwFCFbaa1aYmHXUIcZ8ruyLIekaV3+1iWkCnNTwfF8C0VbAQoiDB5zhQdwGb2qLA63pK4nxSJCBsqthNKCXX2IXfllDeSDBtztz0TtyNgyAdlkyygc/gPGkteu4Qjpj6yvsm0WfaClQHpuS9yrEGur5PO2A6LxqO515t774ZI22tEW5ngKsHdlPAiARoP6re2cAC3Ftbhw5l37xdImnoKoYh0qIaIOFpQCE5clv5oU7T4MJ4NSR31VM6u2zezBJRImtbljlVSv3T8/jEvYwPfLBwtEiVy+kLdEVYswIaaqePDdCiH8aQfv0U1Noce/8tqN9x+RTpIv/QCnohpRyop0yJAI5oum7WYS7vupHfY2Ox/Vd6FmRzbXVH7XQSHRrylexRGlAcP578tM5qqLIViS64QK+U2o3Tv0aqZdOV1Ji7261lMAWsOTSqXfnjjJ+H2qpZbR3x4rfueqJfG6Jb23F+4MAJMiyG7Po6FbU7efplypTgEhHpexNV7zA2E4L4o//gig1cCjFXUyxBru78nWTAhA66QoNQmza3ceZsrTr3VO7Z47wpSRQLJt3zV0XMZenTlk0jkKWfHtqzbWYexIt9e1fZROP15bV224VJ1iIHqGxahz1WFcuuJgW6uO9TGmBeN3LD5LVlwoiX9k3tWKyBkpKKmTslKjsVaZMXibVdsbVJRwZ4GScsbdEHBNmiiD2DT7c/ispYpzCw/79qIAGVs8Txtuqv/XMNAJyeIMDsmfZR33TxokU3CCBAai6rBwm/LCiFzoL9WwnZdKlxJU+Z36mZ+T7txkTaVGulNaSYnG/tu/M3WKPC9jDMeO4/q762sqjW4C7r4jg8Zg2jqgJOBFEg2mkI2shkLUE5s1FEzlIWqibnfJLAvnZl4D4D1S06tHHDNJRUJzYq9znTUPnv/0T669JHMtJbfuR1hvaLFaJKWMSkPDE7KAL+dq2BKuwGo9jZfJH88ziZnCMduPikiiFtikNbSz87Y3U6HzkAHHLZjDHdrMQA6/kpaPxPN0CrYOG0vqEJ+bC08L/CqedioaUcwacBATAIgeri6+lK9zRQ7pwX3EXstg3KXJ0cW4iM1fHtuLkgrNYoiBRbL14k7sOFaX74WzcoDR1TBoNS81MM6ihMq31Y4sOaeJGo8GStFASAN6n6veQnnr1kzcC+kxMXVpbA1vCr1DHyV6dXEtZlnq4Gxp9y726i8/Q29sz8to5ObmsOxJith+6UoLEy954Xmp1R09m+RnlUl4BTTaoUk6Ewi3bbCT+XpwC6g7qQihbRHqJF51+6M/owr4IedWcGU523q3p5APjXdUW8u0czZcSyKDVXGpgC1wF8FcP/WXVZpOQbZH8yTvnrk8Hov/7hxfj9Y5lb9EoI97d5ec3AleXCwfb9uy2aTcFECOVSNvhABnXGb2S691pfEAETuqp42RtZoATgDBLMQ9ZI/xdT9V+0qZfayAGZOXAhQoxMAmbr/piqOok345pz8QF6iUJxdnQkzyG70OZs630ix2KQ84mZNspBqB/SGqvCWs06G+Re9oJ7bUSBbNNHEANYFR6XKI9Mrak3KmLLYZV9H1CfjqlB4kN9mFKGNQkjmSUfc8thCNXEQ3xN0sGPTL2o126T9XeWohUwquXpTpPatUrccnwIzg9tzdw4VqvZi75QOIsXroK0QCC8low/Ec+ijvPUdR7SHwjvxD35YdElWF73hlXGLSiC+qM8gIZkhFXZ3O4WIqe5mVtutJAzNzq/8TEwDKXk+4aEw415myU2CyL+X3WNesf87twgiYX6KM5KWE5nSKaMwFw0hnaK1+muBTVt8CdRRA+t7ZS17dko/k0tKykKvT0COeiYUUDEoyi5/bChancgCA+RYmr6UVUxuA1atPZn+xSHGLL9u6jhPVIlQLKnMcAAP0VmhG0iuVn+FF6ygYrBJ7Mt6wApMIoBg6w0Uagb0CXHClPijxDyWAnSst6zS90mct1LAnuocORdjlxbdiG1ysb5GX6Z2ClX2Fc/FFJOkE7V6w1oQ8KoAO1alB7s3IB+QD2UGjmJjrgnGlqGhhxu71pa7b1ZIsgooz/zxIU8XrEqLMgWNd1hhxmzMkxYKhb4yt+agOOSIBkK49pa5v2vV3KFB0/3WC02gYu6hj13ueZuSqsChCw2zd3LJmavq/OMn4EUPsowEWWNONjXoiM/ovPaYirTWH2jxdd3n3AFV22spFqHqlZdutCPMnjT1wIZKa7qRHCpKYrLrMt6jftJhoxS35AJDxPoPO0qA+/VcnAvKbSHkngTybbW/4N+MzujJYepKStWEk8cUShFh3jUVqSQQe7JwHhN9ikbmXMj1W62PkUcHqLAfjtYtL6mJOSntBPyePe9wc8YUkbMbgNbf6ZKh17jDAcvGyuRjJ1HvClN//rYyc9a2a1QLqCmSP0omlia3da5Ul9MaX8PWEd63xHR9Q0nFNufN7dQooYd6Rerv/Rtmkt/ktAykOLSrsbbNKvwKvVS8O/WTHQCgQuPQwkkeOSSsrYDpjQLjKpVM+oo5m4tx9JWPZw6OlZDzB0LXWaAH5BgElEA4KVnAEXbKspvXzn8Xl4/UEVwIzwKzp4uHdVxLQ4ejz2ibP2Te1Qhjz4Y601VI9HeTC4h+42wehglmR9OiN5SehobFkh2DVFNMnOqRFdr5hGoT0JYLbcql1fgaQdKYq0h3p+2q0IB1pOlfAhT7SABUZ2rYzKjvDZ6AEPd5s+Hh4e/rNV2LVQTxtzpG6fBhu3jA/cPIdZ2s9/F+S/YYcUbveTrqm0aYK8HUs8vZKFl25hEFPbztROEwK4IL0y4hayb6XoflUgGBJiPQk5VGL4qn/I1Zw5hYGSsnRI5uf4Ac0ty/psuQHqGkSxisRirfLDKmTWDnYFouV/9clnzlawpUg0492v1iQ0C3ugxPcuysLLn75YGJGIG7p5vCWmgxFMT36tGzeO5e1QCZKUaQNigIgGSzB13NpWjr7Lydw9eF7V+vpxFSUr7/hbUp1vopaeImKohJTUC8dqKdoUyuMF1qAvP2Uf0LCM3svVAX1rPrz31M/2BUJhraNkgoTrilhqbsfjJNIRikj8W9sWjDhdMqxtOweBUk4e+85RQPLuLnj79M0kvZBuRSf3HuMr/UA2X5o7mgfjyjxoLydfhL9tSoiSNoR46+Qrs05THY1Wn8P40cQI/4PqvhClWrYrej63TjKugtaLg6TGjrR6X55rS52cxQNK99/SlDlwPl0zuS13bKR6xWGfCJP3aKky2HBMLMwyewCJMUXRShxnoh3DAf5sImiEMcLuedWTt6rPOYQOJcTkhzNFgoYmE9sX4YULUBA98vqITZRoXS1EV1diDvlyMIm9EQG5TsPo4asCm9tfdZTd2WkUJuaZUAFcfnnJuPSlyrl6zihXcTPLBM3MWpOvQaxdeSm9psXt6K0KIjadjtc/1J5bxXvK4hbkmJlBJAu/Z2GNgoTIrLw3cqWjNV/FCEhXmIJcpnUxx0e1xQ8pfrsN2/1t4fLLMwfi6f89mXKj0KjIXXopef/T6q6KBMbc3VLG5hyNGN9sImpEVcl3+lxOCcNYUQ2EOXUSro82J23aifIUNkDQ4Dxx30hHDt2NYzwCAjFTMOhxA3nHa24/BDscmV/wuXNGPG1/pPTR2wM79XlZ1wRnn7ZIf4WBU0qELmXKDsHZP4xuiXcBpYE6iffne1OnZ6Uw/rCsfJunmwoEkPqm6OpT64Yo4W78wPLoZmarR+BnDVjvgy3AeKaE2+BNvoshTpwMFFXu+tD7WjATxEryTYrAquyLojYKuN0z1zLp/cYXXNSLV8HVIi973xwKira23MaSeosSV9RWlq00TuJEvQOvU07muJ/v0lb6WPxuO6e7zwZOi8b1eXorMg0sazQtoS6vJI4Qp8bFnOKx/N1PGMrsVjX6jKJA3R9XR85Xui8iAJvgTRd9KEaUs4RfxqO0Z4+bemXwgG05yCxDcJIsm3iCVBcX4hr04x2WeSTYrLg+3VeIjWOiF0vTkrkzil4wlssnBK+RNpliVNE9rMmoKpcKDzzmQ4+aQq5XHeHF1by3pRmHEof5TaAnP+ZyiHDM9iyZhREFFw1wCAzQ6KKpbmXXWufJwMM27bi4elbPMbPBYacwgZ2pqrX9Fd2ycRlIazPkbyAD4x8kHCP1axbEfsfQPNVPCzQLXFrg+goTnZfaACxF0J4YrmnUpVPwHRknQLnOM5O6u635lX5biFicqWMEDcQ0NHRnO0REBe7hULzh234PwVPN5x2dCat+rjDdUb/ruZkVx0qwL/B+Vsh7OQhBLu642Qyz744Fx+tumK+je5FnnFwPnRS1zmo2gruCVi8RSts8lINekPVfNW833MtZVKUtYnBwhDu+/2mmtQHqYuIHezaELzo+uqtoqQ4X/j+eaL2m/VYW5j6sGMlIOHL9zYZBM+02mz7eVDY70eP7o0oOT/tCheqgAW3+mhqEmmvzjutoQCfbriydSwImg2VHfvlkHThZiRY+4KGaPww45mF59l6fx1TRHqlPmx3Y4LqsNk5vgaqX5X2FLctCMvruVDhZ+kGOdkrwMYsSm0qVJCRMVGnOAHhIHhLW5RiRJpdRb5fxZ4fk3mxEpZJcdScAz4rAG+MuqczxRAUNROrGFBQyLbcPzvKSbYp8M0c77uee8LvbQV8e7bU0azXlqBPDsPEGYLGGP/u7VEJmBpIXTemjHE0FuMWiaNRvFfopyfQSX3LjG8Jqf+7Lx078wuRo8oaxYmGXcTWcpcYhyxuKf/vKtl9sKpIm+qMPTnzDTBYkLgAai7k+DAT0l3E6OFFTPIe1FHnoB5HP3w6+PuargFs+od8bFk5GPuwdHaOv3uTZEf763kQSRhHfeMQpQ3YdoVCbY3YCCe+sGwoMamVEmh+VM6KlAZrd/PCmsnE/5BmPEyVE3KBWwglOwKErSlH9w1tezwubb4PzDMoR2vTdhX9R3/J8esak5Wf4yog6titkcRF0Z8hbF7s7qOhmmJzTcb9tkorVtIxqbgQUaBpe6+p26sYeUdBAXTFezYgopGPKsakQaAeveXI/MKsQAAAAARLm8+UwR8BvisQS7GdeunHgXLyVQIHFsoFj9ONp8DaXQD1IPkFDlNkAz60JuJb44gsE0E1n0JKSAVF8CL0GTCuOK+pbeX5bDez/od8Qia3InMgSCKnyIPJvG5hduVtQV/NxT7M9CYVbOknMRBurJAwqK+LbG5njhB0HqDfoWxxVjzh38isGcTZjS5oA5SXP1/4/Jy0FEdmzefj/zy24cx5Bs4HldrrvXDlU0+iVCrMn6arOncyc3Rmg2vBjwCWbF9BLv5t2bOnyJw6VB44kg7GAClgKITBWxxm69iElVGinUoKbhk7tUAsIBqpa5FObALlcwSobSKctYeIYPFiv0LuWGPcd36bZYtPcTHzCqL9UjajE/qtYKJhab/SDNU+R0GRVqXOe7JYBF3ju3KxNNY6cH47//VQtGlLV7eUsbOiHUMsWY7/tlz5Am6sWF7JxlwopNaLZMQAuRnNE0xtyaPxH5B0wbFUqkPkgG9EQ6JXEFkm56czE21qsKX0BokqInvumYTU4MxoVivf1GJoUpyeUKGXmJ0Ork23rOu2egG7RDcId8y0bHxJUrRfZQe22gE/EZUi8rfkdfxNlZafbB0h091ZpFFxId6vckSdPzCpu5v/CUafhG4295KI3v9qurErbwqYgHFEI4DtmAl09nWGNcjYtYCXOgQtCaTGucCHaydMQThWnZUlp5Vzm6YJszEQj6w9Su3/59lkZE+jwrZWhu928APZQwf82RbEP3KNHF+Px6JjJUfVACHGSSvgH44FsHSye+DbIAKeg0c7e3PXhxT9CFLKPEk+LVi6UK+qLYWCKzG24Tq+D09QRiBBFvwEpebIcpz+RfPM6qz5rOZJ2XEHyq+zTXHWOAWU/3UBy7khfeK0vPgRlgUwiJa1zys8+DIIqO/SbxK5c38lk1eFEWfCdJaoFP4AzrpVQ9AS3Ys/dqhYABsufGuonqlR1CvggnZAwJ4N4twa3lPslQsNT1ph6TtyFhtX3sWc1NK7hh3PhzWXlM1L6mfiF1KKM8waB/OxQ5uiUZwhkdFafBHYHtAgZ6nWq1eLkYgkk9zRBg67h9g5o64aaHX1DMRF1OkUKZCpEvN7784Ts4pB79guWebPi4Hv8nXmLVNn99KLOqbfpxisjIRuN2KGx6WQdjbKWCV8rgsej5RWDJyAT+BGpmgHN2zbPAkWmT5KusQbfPDAORhRxc0tMRzQhd8gFGdIwE1qeILeI7Hh2/rb6xDY+9BNHCU8+G9eiFVndlgDDP63iRbVWNVmcrDTg7vmQtz9AVz1koyIwIYW7F+JwfASE11+pjeN59HueCdZMfwNhM6o14FAwp6jYUSWJ4Kl8+rJUJcf9YrLWaS7KE5m0lZWsL/4A4OBEvnq+lgGjMfZwOnwcXSq/IcJXMa8K+ecqBlFPxxzjjiU79tl10OjbamYMPnPYhmehf2jk6OhZKKVXnvYiZEyoZYHby1UMNaUtv4aSgRrjZas95K5PKAGqylZlK5xp4p//LiAREUB63+Cv2WvMn8X1zL8PxT9M3kEZlakdW79zi3Fbi+0mQqbkZ8Tzf72HffRA+JaBNkIoBs6hg5BjDeQad1U/8SHSPunT9/nCz9ahE//2l8yRy4/3AKGrgZxX1JvX2uoQTL90fEtD2CMYRf/4XI/TlR+c3okvHXyEEFpPgcCtY3uYb7gu/XNgOSENtsrJS1Dsqn4ogTZKXc2uw4T2z07js9SkcZ57fs7Uh05lVp6Xv9A19Km0DnLKshZCYNZ9oKBEb/BwRsjepAgVcUmL9l3GWUzYr8TBAxv503UDYTuwXPObSkDqI+ZFQIEdkgdKXfPjk99iPKkW3jXkhQ60aawd40M1gwTRXGVPgx+0rRYZn5qb9GkBSkyVlsWlI8S8DtcHk1TD5cNi8Lc8K4rurzlg1oMxQAVAKuEdpT0Zg0MXuXFY58nz163bT7tc5k3U2hSv8GVEn8qPlFmLdk3cDVTwt1NP7Bqmxi2MnaYHaZz0WBreiMM00/3d8K7kXmEvGUuKGJ2PDnU8eez0IqDYqDtkI+lHAXrnPdUkSAz2kyLV3PS+mtbORrm4sQQdtr+axKFphjAwfCwcGuEN4Wxw6UPhPeI9TttBkw1Y9zca/1nzVyVlGeX0TL4CoHcs8iD2RJcm4SPCDnnb20cwUsqvcLZbyjcdsBGsjDv6KAj3LVdAlNw+WogvqzUsmULbbBxIuVwkaMEUHOU0mK3uJx8l0kzDKmNqwj3cESEyFJ7weeT338NrD4HtfJzfkU2YHkrT7ZBTqp3nrJ37rEPxlykdhRbp4WubrgJs/HlC/hYp5Bkk85w8bNknsNsCv8dqgP4CJI3fu0JfpAOxCAkOJ/XbWF0TNRUnfLwSVbuO0kScP3LHSnQB4UAZkOIjIeFSJSYrjpo01pf9t5IfBwjY8/d2+xg5w4BEL4RQPFfeC3vIcOS990V4QzUCyRJ0oRyWdzWgwum5Cec7jblbJUAOu+8xcaWqHWXbftRuuG5f941cWT3w6mBRzRq3c/ila0uOMloWJsGSZSBsp1bZfz0BSMrMgYEjM1/EYI2OjPm5C5DeZGml8HruZtv3JtBJNeSfuKql6z2tvDR/HGA991EglOqEECJ1OkXWFdW+6dwhXQ0SARyleMXPoMP/1xgeB0hiZ9K3nVNuBK470Xn1eTJ3b3VuF/ya89QUSZ3zcBNf6zel46XbaZvrlTSMD6VHo94wXq3kqaKvfk0CaKUHfUDI4c8nPguHSaBKCd+kt7xcjMGuuXVthXDJkPW15teFLC2S5bbnrux9LQXO/dYA6Hv/5Ulfu/mfi1GR5GVILKLs4cN4NF5DtBu8FMhhrdWR2nUhEajnA+ACBJDbB0+5N/06673rCcMHMxcrbERWSUupgq+RfAgW5XL5b8CEBQCpbF1N0DQTEX2sG27R+CNIloI47hqvHRaVPGoaaSvGcsVh5kKvM4gS2NAiSjR9qk9Pwu92N0+vT+dHxatt3VHgF2fXdQMc1YexWa0mhEJ66rYvXheF/Iocb+xHmeEDEWJ7MEowWRycWvQO9B3yAAAJCTA3MRsUHTXStwFMnU6G4RZxwgwQZxA/NDRqJcBF+EOlqNz2rWoINYUzTTxJdvFlJvlf2iRy43oURf9ii/jLiG8j+EJIb+8T+Q6S1Oa3dhQB2DEzI+y2lS+7Wi/yWczEM7Ui8CMwBqplH6px7BimfGytitdsyV9yawCSyGL1IJ3ldKmFx/fTnhKvVpfxaTCB1oZ/29xtRZX2/XNSc9QZoGUcNZH6dB7xeqxEN+FQq1bTwikScMATX4pSR4O6CxoamrdZgh8NCK3DbfG/fj7L/MkqvG1RrzBMbZdX28lF2Wg5jloQAypI1cPxCLRUPeD7WkucpTSRgqBSzO7tk1cCWBBNkw1Fxymjocv7XHWO66mSMRVnrPTxoMPZrNhKC2MO5nOCrgTt3NB9ZXwAA1DcYvyX1On3VVIYw4D0aUPh1ugfnxTM9yvYF2uiYsP5C2hUfztWZgtoq6RsyjrPedibk5MkRk98lHAfivbq1cwunalwLLP8ALq1ZyksZm9a+bA2yN/k8iYk9RuEhOSYSD7ug+6T6DqnKEiumlGvVuJB5C4bqxyaZt4QIDioUyohT6mcFvrJCcTWJxvCFWlouxdJzNC67TN8Bmk0OGFhYVQBZOh3DqHMmCGPY8twxpExUDXUk9nxpwm33n5K6QkpgAGXUVzLtEQScUqfR/xKQ0Jc7M+xdNuIyITVe5WjD8/Hw2b7dH2vTkXN0czNLn4mrDihbYKeLUC3qMpbxMy8aFuQIUksrNd9bsJpeELvqKpFvfkx5ogKDEZSLbPSARQKO7Kgr0n0O9t4X3qTx+xSYKy8vl2hTerZXZB1F1cEIRakaaKkD+obu+6iX/B/MCjBCEBw9TUWSDV22DA7kqWQLdCwipUrnaofy/5WaQ2zl9zFTQckRNJhVoFKx8lBBBg/Ova+ca5S0nthBWLdUn9tAc/tw/TAi3sqO2TzfS5z09vPFvM29GpS/u9+he8+Juu5EmWB4vNeVq4f+59bXYk8Qme5uKCMenDIRfUDiG3HlMfSk847NBT47uLjRTsPom+6gw367yAKzuNlLjnmvjtihAw6wDC8i//z5lp0x5KdorEUqkXafvIXLVSYRF0D+V7H+9GInwSKJ9UUl/XwSPnsTMhhzcQM8UcPra97i+SBZaNxdfVsdp+vMD7fAGMFfmTk85GYaEKD8NRtDWUK73lGyuojmWECNMnooNEwzcRcjpY2AmU9yMFjcZ1Oua4Z36IFbZP3Z89o+g0Qn1r+inbhxnGgZzxORaL/94ImaUkjcQuGnXdUqvR9E3xFl43bwX9rG+yUjkz0b0P+eU2xekedR6cJQSD4NSeC1AMfn+VPQZ5S7Y9FvkCFko9Lo6TolxgWw8bNkOiLaOalwqA6LPHykanK1gS4tOUicEp0Q0fxlDxrqLldnlNWQqFAk9jEj9Q8sT+XKjq808cFzj3sB/L6A9nYdsXEj0WAiNOTwXbg3nG01KWdeoChDsa3+ZO5zr6upVbg3GpHMYETmzzNi//tq3nK0IVd6xevnvAUuJuRtQ3heOSbOvTjRJJz9MvtzkFretynvoGD+0tZhQN6FWqLx5b2fYbQCnPCrrvCzZvXGKsC/Yc9YEaSC2fiLJ8TCEOtOi4ikDeQrCax5UDuc3FeZA/E/YZnXaYMO+O/+87QnXVv5TWVZ5Qg/r+Y4RO3UiuHVNw5yi1ww8dCZT2P+5YMaWy3yHoq3x4PxUUKtv6/KqgVVYEjESKY6N/EYV3BVdWx1chYG4XNVItrN2M+pAHolbgs+e3C4ibp6/fB5qRca4nyg4Lk2kT3OY0/La0dccQTaYgYY5E+QtXk+t5MLOSG5I3ukqYORt0BJ68UZysf5mgcH3qBUUAD7mOXYSm5dKpfhikO3dZyP54e6FIRLR+QWnmFpHVp/7zC4gHhxeGjhZs0WUtcIubgtIce4JA7Br42K/NIior9XwfJhGaaiC9guZgcC+M9JLSPMuSfC6aqrjAgoS0tOCuN7np3R3YuPr61DgKeK9GLuqsvV2vlda2CGjtQX2jVI632u5MPVl1e4gLoV9y97CL8MPi497THvT/fTyCeAo/CdBbrQyxTfILmPdjT/8I/vKz9ggg9rXeLDnYtAP1rCe+vU52zdLQ5YI0rx/N3EwQtbfvcoovScsQNX28lwqjOrC0vdD1EiR/3hUeMZKJABys4L/FHeaivNv/aDnckvfmZ4Mz7OXhndK+0MlHuO0IYWLcg5un1qyYplbFaN5w6Ip8r2rxhRYC4BI+3b6JWY7+CC9/AidCzdFES2iiL2/wzplbPcXN28IeGM7jbZ80M7sYxhgMZXygpMEig4210wY61VFypRUy3GDDZgbKh+EnyyelvcF2PurFomGLEM6RJgSLpgpD949WEL2Qp8AITksBjcLbCD+3VVlTGUlDTrs4mYc12Se6hYxklUWkfn8EDhvd9Sdn+IA4LJXYqF+2PvZvmFe2MbViThNz0wYpI7TADXxAfArFZTopiExrph2suYy79bdEtDNhmwFW88vdEUPDxc2Tr5lhRk4iQq3mJ3o6ivf7t6SVGkrL11npZmCTf12hYLo+nMf+WVqVZ6fPTIlqWSR9GWZGeUDvuTNHSktGKzEd7hDNadTRi7RrjyF5ZND1li5ab2pF2xL6WfTpf9CCg10kaQnb1OG57P04+j9cSGUKiuivEtPVjQFN6UYdnN/qyCxi5tPOJFHlZlZS/BltToO1kF/SkyLe+0/vddKSNwcDKd6nKpHfWslS1sjyVtxTuKbIVoXZRmjWyyRTAZnLiXtjmGSOoxxVp+VdtxIE0/qR68HwYVDd+HbM8Ldigy+2XtksH9vZURMKTCs12uMkFG9mtdVsIBn5+Wu6+JYMb9db+/YxuBxnGUTZAbQIDU3NLCtbTwNe5FHqcwSEYwoHmMA23q7jkvfpPcI+4DJRw9I9F0MwqVOv2RazCJKnH5VdSKZ36CgAAAVim0ERfHh1bf/NoOqpWgTDraypWJrLr0NAP8u2GGtJ3FsYwSaWjlLzKlxWWzkPRvpoGHHAthUUv8drhyBaOlC+/P70Y7quxESRL61lxcOd9AW2qw5uwIo0R7oro0Vfokhoqq9DBoWGf0uiJctpepAhGbF8p07DujYwymRPN3kH/7OV7ONJKGlmW9QYqumD0RtKq04APRznwGbzR+Q7t4ziYhkiRBXUcHzY6t9ztjxqBcPXvPHdVTbGjriAEKU0gWdi4TAPo7ZOTnKiq9AZ6biFhJzoVpkOEA0X04GbRvDIKWZ+y+yaqNgXphseuS7iSXbrSHyvxqzW8poJCm8ba/3uH8wrgp32KPjYVkOF7YCxU9z3rkqVbhz/XcNrwd+vx2CtAsDoV1CSox3Og+9TqY9AGuHeCs/GUXduHkr7Jwgc4i50lCxTDH3bw5dNGsC2qqy4jYvZqgGdF4YY3PsbjUyt7KW5P0WJmR8T5yhQNDH3cMdRR5y3VHrTu+qo56487gKkEwwibIdn9yh81eaRm/A3fCjEKoDiH3kpuStlZa+CbWAIunQ2BDuZltYmqxP02NrXDxcpxcULKRtwSF/u33eBZnlmW2JT8MWy1jFTSB2gxF829j6zdsTSv51TnLps+BrF/zMT+wgEqWKt9uBIApBy/OhwM9PEameLdXgkqwf9p8IBeCIwr/n9NL2/z4aSxr6XijOR10TZcxdaE0kbqKEN9a8IrdovpQnacSn5qw/qH2I0yAFnXXk92ySB8aMdFBNvCJgZa1B1O2IfxrF61ntoOcmxSzxRRHvwZEFqGBg32/XAAvI1xx/UZXL+hNopq6oJM4/C0WBhD7wH/Dmape1piESCuunDZuA+EitzK2lP0MI9fJfNleRcDfXtCJpGhHBZ/HkmtAfKWygeTIJtaWqGU9kAZq6ZPiKLgqv6zuOUoyYSskez70gZv/hsBS41uiLcq1jySXyou9fgTZPyq6UFP1RbYtoLnV42u1sjyy684WIoeWnkpeuBqjrOVtxtjRDcgDnNPqETzVe1h8RGI00D2EBXbtTRJrqEHp5beRefTdEJfoxD1/gExOYndPAaf/bi31O+8Me5Vpy03EcJUGXpnxH7VJGBI5sW+hH8x3dOCBP4LMEqEGYp4luJ/JeXyxLinsivvqj5jq830Yk1Fhp+O2TWDr4fnqpQIjMdW2VyttZgPkaBUuHokmkonjzdcmjRs4tiDlaGKJGobFdqdr4TRqUbCCuL3ecFXz0dS0Sd9ZYnZxXHFN87ivc2p/8ivkEuI9SmKiftiCovMyPCaiMJYBkiSaICBDT/U5fviMoErSNfQhtzVuY9yxgbAsjoZiCeyJy316XIKEK8pLBLUbeMCycR/yfCQMKFwrneD4mLpfkyrlXsocIaYQRed9YoagOCP54z44B+ZVSVyPUu30WmESmXvkv3CPdXWz80YnQlGt6/XYCZovqzGTSKTarvgRqwKIPaMPcBEGQtpbIbKlHcP0ng6mwG+ViSIyMektM5fgy5oMWBjbX7vIVXVj5E4EbxUyC12PxA1IgRTqbDQiUD7jvZ0Xf/UXJIpRV7Z2B5GEyN+0oF4Ptr8zJA9Fgg5M21tBbbzQuIPk/5O/LI+anhuRgyICWoF3pw7ds/ZAT8CN9qGi/PM4GmpIp2PRZeHYd9uzELRD+quH53dRVA/w0wrFIRl+qRsSdyP1Q3N7Ry3RNQV+VV+o8esKgk+zReUuncE7UtIvnLizb09T4YRs8L+TaPV79A+rEjDVDkoKVE7AB00qwsJpW/sh+7mfS6ZPC0GG6Gdtu6hFZrEMhlv3gTBkzcAo8sCRlaiA7PaAMfE9ne2HuNF8IZ8I42JYofnGltvwAUflYS5zeFXY/WK3wyPeXJpeIl31GuFu+dHegTGQ03etYuWoktXjtZhg+JI+YCadu8uTuadE6OxebGKC/K1nViZWqJmesy0xyYaF30NBmYuG+FrvRuAS0R/wQUBZxEKNa9ej6bLIOqnho9vYZqEBu72/oZaIHHWzgEYA8ijVcSwr25eDNZOYF7+HquT9m4ScLIExLE/jePimmPTtKosfV5mYAOkKmU/NUryYRflbYxtQjGHLgxdQ0JUPFFveXWyo6bDuFW0cvX+hpRwgE0EAz/17ki9DWqMxuX/92x8ytJWTy1WsAGQjDZZNABjuMLIGevCK9/jvBkDph0stBSp7eOXSaHb9SpY0Tr0vld1zuCtfshg3vvVEnvbuRlZWRun/qMQs3bE7MLj6+oZJFF60drFRSkTkUD0u7uENgSHnfIA7olM5guw2SpqULOwy7qqPjqNkfqS+dUTm06Hrg5g3Kjon9eWczA5OfshAjCCQABTNHkYV9urLptnk2FnjXOIpl13INGctcDLE8kZQRgL6wqBvewHUiZN9694ypqz5jErKedzbrNewN5X4su95Il4X2cO9H2C+kXWrYg5UmJu0bCsX/UHZl133YcfB/FdiwyQj6KT0DwcUr4+XagianUIG81GtX+lYb93rgN8BV2/rbuFLRoYXx+sIFKQWVA/a7tjSt6j1NCDMW8lJLcbJtDKjqUwUCQz2vq82EUlbFwBOV8fUVFjlRE6PtKdkxqo9vUP7/iGxsXAL87k8OuuAEBI03hqVR0Sk5Z6Ee7rKomAuA1/WeLLQjVidNDb8b8npo2nfJpx5FycbwRhwqL/PAlnFGjvpgRhQa/coYRF3Tt8amE+S+1/bY+H7UI3vBP2yZ53BMw8NZHFW1uNYTCVgivoYM9RUlCoRyvOaY5PCfbPfHw/yQ3tJjZidVe0SCRi2sutZKhgAAAAFRu7rWNYE5CMu0deLck3FUTBsUvLy3X8caKCmg2Kd12uvkjHbwoWZgxwF2qAMUN5DKqrLRGnw/cABBYzuKpFSOYsEn8Jw4kGk3pxCzyCZim2WKG88IAnHEwH0ig7Vr1EbgkdpsAZCcM9GSO2rpkSpBYr5Ej/sENe25OSYnEgt/Mj81b27Z2a0raa5+cc3INxUUG4FFqNjiFDWnxReZcS7Ua5QBEqbymf7Z0a8j9VCynSIik1BI8VWTaCRzalRJM8+TKoPAz5d6CWYlO75+joo4+XHrmSEur1NtwDJmhhHh8hdcGRsk6BxJGouE6q7rbcz/gHfHeZCgRXVY1vw2CYMVacK8CRGqCbraK88ki7pZ97+NY6/4tDBcgw/rvbf/mnbEWr5ZKT9ek8IXYOfkM3HEcLfOp8/QjVlXoeMudNCXtza+4q5koMnBeAxKYDX1eoHDQC21EIvuGyXcYEV3DDtXfuw9xyCoABD6lH2WJ5piZvkpop9xI0zlN1We7KCEogUYJ5n9TqAaRqXN1qcAcsT57FCaZ3BHKyzJO3cuYinSVq/FTOllKq91bNOUuiE4YOgkNravQHAiHsTHt3hZfDMBW1NRsWccbQeURxvRHb5mGVFcT7TAznGOq6AgKjs4Vo5tAwDiu24WUUNomgn8I17ea0bn3xmS/M2MzsJf0MHEeMikTy5os8NQoeTaL8jqFQ303Dohzmf/LftzKN7uN0Kud4M7fYFyIL+gFTfb65MdZqnabk1aPJWqpUg3C+jSGkPxfV9LIW3ZrzmTwR3JYIFb1yUxuNX16eXOH3BUdn64KtFu+eHWPLAWEHRemcQelXU01BIt4kUmQONawQEi9gAOhZcoj3eJnOx1diD+w9p4SumPePoHp6OxyfHpaJwGj2J9Jp4WxNOBauvkmNdLa2lI2LlWPRBeqWK87nEGb/sDu0CCUd/MKk1n5L0XAhpdgCHHL93iMJNyMdkKTkulPT4fBdgcOh1GqwrLAhVRvib+ZCNX3meIDqbWEhYtFw8S/bnmExWzjgpmpi40setUL2GQGLCKcNXvZDntrxoHAG1p4uNh/gKMdLxx0Z97HYlJC30dUbbk8Ok6ig9pu8pKfXFgxaSBzndeiiAz7+ZOdSDeSnUHKZ5zT3B5rj1yddfyuCrtesSnG1Hwird7iEz1Aw2gco29FbaiTR3q5VLOIcLife+16v5EcuH9nmzGXboW0VizFM9Sgjhxqlv0yoGJkI3ufXxPLdgQl8vBW8ITRmJzEL2wGFF4qQ7DE7Xd0EfbsvsQIvZghDCzPdoK7cLIln4strPWhI5EadhgvSbWU/L/4Y3tXY2YpRsFO3blVjyFyeC38ll43BCPSs5jcyXDiIowK9BN2/3Fazauv9uREW7Q0rS6xVfpXG8c7a/mmLap0McLHMuGNmVVmUTosTwRN505KQXSfgpTCeA4ARrGqHoZffbWrKiJBIi8AxCl6V3GFY6FlLZfnerrTmOlqTjxHti3TaQKrkrOMhf65g5COIi3n/Ban6zP/lohqYNv2AIkObSNNlaXvZ25DHYI+/NRIUP7yjDg63O2/bZ9xmBayjG3hezrY5vrgGEXBruzslidCVEi5jdvy928i1/l7HR9IKaVLjqt4vOtYYYxIJEszsE1gSIaNkGeb1VsAlZNmafp4iA70pLFMkGUgGcF6NT9GScXK5gNO0MquvbTzRbsiZsZ8SqT3UHy8ciDU2UrvxHqeX1tvXdIBPrysD1DY1GJTkBtarOiM1t++WWSqIUuB4ANaDp52hagzG3uOpC4QHIZUZs6/XfgqoA85CjoXLbZSPQLt67EiRyuwKsyALGUs8DY9ZkP242lOZt+NGMfV85Mro3h+f1KxYm8kMtCQ3CeSHNvipaXuzyNt2fsX2D7a5Sgd2azfNmvkd0KA81frqZ+6iyZjwohgHr2bK/AFD4r/bCiZUFAU8fJjDZV16zQhFJEyNrUp3m0XVLphgntGlBUJGHG4rjgMsT8E67saOKhehuKYD4CLpBFV/YnFhCuAVb0AGdf5Zu2D/lsNLcRXYlIKzlCBx6j/J1VtiK0dumfdUd3Swqop8cs6kuHuRi6hxAoKZ1k6XsujpWM/S//vBUp+F67BWmqchs/YPZjp9B/2hT4SnavcONXqPxtVCpp529oMpurvXpQ+155/0tS5ufmcS5aD2pg6Em6tvLBmTvDLw/hxgb2n85e9Z2Uj5O7j7qXqmGEXusUUXqCqUCnQo8VvY1orf9GsizKYQFsQQlPgfYDyyZh2rt8UlbvfBeaHx2XOav9ZZFnBXCQEkg2sJeMVdYEh+Icj0Ndf1ESw/bKlFfTnzp46fFwOq/u80pCTePsC5maxoWTWK0diGNyP96RuDws2+ow61LPaYMxP0ikZG5h4Ye7XI+35foOAYAe4rYxcTVabnwrVtM0JJiVxGFrpcWmiF+Ue/nVpmYpxd/fbfAZUgAA/EMC46SADEQBzAE299Csv/m2TNsjf8RTFlA4K88c48VlMPgtjaS4cSPyjW6voi6ncFlUvGyTO2ThoaAiZaEcom5af0BCvsZUScE7/HPjyY83dGmoYZ84IZdFcRJXkUUTr7H/LIMOid0KulAXOFcaOJmiJ+cMVaT5rAZ9/dPO3kmbB0mXgQI0e8g/MwHAtjNhUjbBzXJRkSBnqneyPZDEQQATNSK+2kT7dhBLxIQhn6yrwc9XOfJZT8IucpRf8d8yUm7vFabVldOxsjmVvlB+j3/X7oDOkGkP8Iufap46dsmn35Dh/dJm65ID5RbDD4XRSj+yW7iomqyVjTWsAABChyZU1nni7oCVhlewI+/3v2lB3XKEPMvrxWPr1tTm2kx+BXLFSnbv9sRkogMrtem+3OEZrSEArBl32kcvBmByZ28mHc4yB/0LoSSkXGebcxx8KtKH2X+PzhHtN5N5cIo9pPYRlF5+EtL7EOJIyr+sXxPYya3cFS5J9roTH4PdSqUjxe8yVzu6uBR5F+eJCxym6joW14Yc7JGkmVQ0fDA31T34D5soQMumSUgAOcimWTCBwz1W9c3JCWzJN4wpLsnAkMHV8DD2mSrM4Qm+CY1Y8fEJ0UjiffoNsoetAL1EIIoetq8FwmgxINm8/xnwkZGDe2SOlSEgg1cHPC5rh7XFGQWQvKTZkjnKmPQCHblqQ/eIkxope7JlwaxGqCJKvzXSszHZYNSk0/09H0G6WpNwTYAfkgLtKCI4ThNqvpCRNpqmbZ8Kzj8DnCHJU0G3YqavRsFNquhIxXKXoDkWbJaDLpAg6afeTXih9Pzity8sbwXGPZ3BcmaRP96+ow0OCMIaGGdCzgOBOZIhaWmNVyRJl/LmpALFakmwhRlZiFsiJqeGuFgA85kDzq3Ar5Eh0p4U10Rrje7ZWsbJVZBKryTvmvI+LgPxodXprQHNx5i6RRT7LvycvEK65z4gUW8sP2BoJeuJMctF9Vp4yxKfUKb/wqPLcV5UHExAgHn6Az1HoLsK9SsUGd3ofJ/a3hwgP0DJVXl7N77l78NzgMAR/CaSDPjHfTQqBCo1bQaLGI7jM4V1bEOwWGWU+Q4huY0mClnqKt7PAIpSELbiZ03WEqhGokvGxWoo50am328SHZ7F+7B0XSh/Leob8DoiFWc3ow8olqzEoa5TlcQzNSYwQRYHx0FBS6X99vr0u74hZ8Ru3Ix1N8DKdHASbdn/hSN5nlFOZcVn6A/fOcfeKnaDDUMaYDMKmpEqMpyEUecHflSO5kXelyuqKpJyVyS+XQU879F8aySy7pMw4e8oNFR+Z8zajeAOWT1uMk8PH0qbQfnxw7/T2m6C1hux7UJ6FoEPKGsWCLPxUOHqmnu+3kFNxVqwwTCZDQ2tkfdJK6QtR/ywdq1qr6BnJide147IznIwMVaJ3lqCbatvXJBGRp6KBvlk7Sz/JCF4qaNJB1zk7zfXLrli3HbNDwO5KMZQDzuVNy1g7mxu2Y0Z3hk7rVXLk4AhLKFbslZcymR6+xbil434ISFFOHuk/01CypNUN9VQe3N3Z+51ntZ192NL59zA4zI1ec1RrgacIdtPTJd6vpOi9ML2LSqYS6QZpSSprF8gHBGsVMQlGBGx2CBNdWE+uW9BY3NeEfDk0LEa1bDsO5q/Mah6qDb5XDHljAQb8R0xaVC5ZDahGi9DoA+aSfF/4gew1arVagC/Bfh0+JEyHNs7OHOgLTRpnaPr033BYRKTYVgVst9GlY6lSSkUBCuU1nYPEejp2qMtNWQRxG67VLPohWQvUc3yR9cuvzrBm9LbgkZzTFxqngsW3a/mx8CkzYttSZqn/NdSHlY4uBRd9E51aklSwuY7qMUFu4BC/ikwRXDEQyIW1LtZhyLN+VeZgMJx0tQYdAzIyP6m1v5FvAykHVdXFynQf+xB7MsuSr9Qs+aOfFP2nJHlWy42gWvineHzz0Sz4dIg4nwF/L+SGEP83Hm0HlsKaIbNrNit+u6xe3H8lCs2ven1qL6kKPnLrcF5PwFeb2kUp6i9Ym82KPOsRdbnhwUpvDTo7S70qhV44NbccdvXgpcP0T/l2a7mR6uMSz0bdz4X9uJ6Gv6kdlVrQSLvgZml0UJD28tYa8ayrXQz5y2AJnJjB39LE3jbsziwo1qJtPwfiYR5sHSaU53FLeKAqrfecYmPpHo6icV06U384aAea77Mmxpei0leR1/Bzb6srTcroO6iV2OTEdcih+vEHQpYJS7qkbWrrM7z5E9iQcV/cq2JTsgAfwK+G9iG8CyVEtvEltR7p7EHjF+pzHB8nEnBQlW6F1zSh55/Gn+SkXCj0aacyVAs4HNG3obKJ6X5ybs2cxRuK5KyqG8WjLAM2/qObYJh0rBfrAU9eF6bHW5Uy+ENj04udElGDhGZQUGyOoec2isYS6ex06jyemZ+ZUa0VH4b9ipj7gtM2GRjOfm6USsClbcv72BlMSd+hzaqfSkQ6bwK93Jm0qyN1GLWWqi+DtOJ8vmnFqLWPsGLrxHjrf3w/rBaOlE/qwbSsVFoe5Yvz2rzVa095e1LWfeR2hGoucD1dt2d9cwyPFLPKBEEoaZk/NT6Quf3OGb79jNLxZtvuyrItIFHg/AxCpTeEAKlYodcS4US5JmVFgO6FOtEV5c8OzuHQRYy2P6S7HGS2qR8ffWWV0d5FFZuThrptwbfDdt0sqIvEPZ6GY9BKcu0LBLueR69gUD4WCNrDKw5hpSwLFQUg5w8hBho79CpdUNsi3+2sEaCYWuB32t/px058VdvbOJgq28VWbnz51WAF0/lzYAAFAwI4hA+P92JanC+6l6SXk4AD7w1a+A5Y9yAeXKPR/Ej4OyGLi97KGWkysu9UsKISZBibdnKykri/emG1mmClKtiXLpaSd4WWwrd93PMNMTt0amjcujGJ535Wacoxk+yVrh91SDadYYmJwas+DcUa5fbMvIA2TsH1yF+7r9+SPqZMZOn0bFfAvfb887BmehFeULuDmN8F54LTZ6uzBUj5jHYCeZUfYTm2LjihYwAuEAJhQYI/z5beBZt3RpXsB3g6HcfBHzqYyGMkVrcuFBNH+MmAyDdKhgIvbF3pT0QCDe0BlpXwgmYBXL8iOwBdLrgqeUvy74q/hZWPqDau7LmpBQa7OoVGdS8mwtIH1AkkkrW8jD+WqtEeWbTL7jrplSU0jUz5Q0COUVMpN31fFcOblEmP9HGOrfI4OEQNITDVzV1TuI5T/u8l9Ifca/jA2jy72mZOi4on+OjrT49Sb6NFpLS+rsORrT7Lrp1VWRAFtKyRw55Zi38jbe+374gkPCpNgL71d35wBgiRF1Gp53Vie2ybpxVK4gForzBDCH+gFA5tUL1ixcQhcEdh7wfp3z/3AYYp7rNNXrwKXT1a7KisjsWWM3DA2JcJ0TzsgCvzKpHVgEEnJ0AGFQPewpicRdtxStEJsnphIiAICflI0BnDOdCGLtStgG3JkWwOcvV6f5VGvDqN+4T2qW3oTQB0inn7UZr0dOz5NQ8ZVRMT/kEfCDbygotSQkNWry2RkjXIZR7+ubkVyp8ssKgZq4VPxQuAmkghOzumxr5+4rzYeiUCF/Pz38fzqhFscle/5kNASNO9bpVhxrRU0zIIcT+9d49LK5W+1LzrlnydvT+jTmoKMEKbAqVXPob2UTJ5tuLB8zQ+meWUWurpTSHdABzBxojwOvAqzBDo/RDV6n90/sf6ZMDTsTkF214Q6PqULvGnvktjSXmHhD+tExpv1lI5eDo61DeamSx4l/Pi2jUiQneYYa/uD+uRW5P94JHBJmKs15Zda2LuQGbIWY4gCAh9w4YBcnsWmQhloO3o8wvXVRrS4hMVmQoqKAeXjEwtWXFnLVfXydS5jy1Q+SwThaDKcmh3dnNo6R4s65BvNJDuvTIXpg6n1oYZ4vEJ+GrX+iccnq5l4ep3RW+pSpwdXXbI/7nXs3Wo1pXpRngB01DYQH7ffXWL+QfvPdfJT700g8ed+1Ksf5wa/uRwukJuhTf8JcP9i/5R7Esw9Rx4QHkDvUdMM5DFf4AVSA3YMVGhGlkyFQgGpNM9imcRD9eCGhi26Ox5pvdnGp+jz1R3f+FKqSKBLaUPliiCekaC5PpTHJmaUeQBuxtIWKRWJLDmj3onho/hPxHZ8IDNjml5Pl1oPQ3SwTVQdmICMnkepncqjpcF8iPHuxGnKhyWczvs953WV0TOoqikOL3wrTLASHPEyxDDa18BRQI6sJCtOA2m8Z1ZMjNzHVlJ401Hj50OAIlxE7LdunZL5uRkObGPvddmgAxn1ayNqfHuCXx0RmeTSiC1Hflo8YXl+66Eb0ZhUkyq/L72C/bXF/cefaQTEYj3gQXdQHBm3AnIZrYavbk9fZSEG32q6yUZJ9gYPawV46QFX/2ypoodjSNuzcURlesNPhnKeewfFKJfocax1CsndEUtZxpjX9fynRVzT4TqsdUkX8xF7ycl8dc9wapKSEjJq7D/cv9Khu4gsHs69587cTyvt1suL8OhbVA1Gw6+l3g/Q98r2u3nJ/bXLAMurROs6ji4qbjQkeFEbDNsILfF02pkFnJtbyt6rnwN7M43irMC2+cbYFwCtOtZ3zHaAoRDHSrDTvtAJ02/biQ0EmPEoTVicH0WPBNrKvXmxceilfYcV93wmeYEZkBUEu3fvX/QiNpMWVK1ivI01zBI34ckjD4u4PK73zzr8L7BjJaqiejHgd+FhEXd1PBCHa+43Q2c10IL+5SnPdx125HkOSuQt/HeBD53J215D52XlFWNTgdyZFrzsxtjy7QBj8Ykt/2cAY8t8q/mAKR6XWmZevcB9+lhWgjbkR+O7VN1013BpNG4q8dgrfTHNbiiyvf4sfegPoVFoFpwN5HdTSF5hhUBHc7d5TkcZq64ZMbMV1p+PaVNKg9+fh3w0T834Zw3G1ojt+poVP4ENIloi0eOf2vkLyc1hy/uYuF54LmGJUQNJvfEygz9qZkMRuB3THSzLHNmmWUCEhRCfG0oQLNEvmsli3pHAXxwIPt6zMudTdvzfSXHL6diVBPO+kfHPjfU1+XD+u4UIXPFfberr3YG5gIJg00rcw1OL/k/XwPhdd36NyFNjahTnSCU1op/5XZ/ONfApceFlysAAndVmEBLs3Ecuh5OD+Ukg6e/G4j/Sk+NeOdffA+uUOXoJj6Yzw+joNo8jTJiO5k0hRQZa4KR/S+N7U6aejU7/g9CqrgkCjc+F0Q8b4r7sm00mrvoFUsJr24bli1y/dFDgZQAg0jGvxWXMXbF/U8tRWQY7MtBMKwmdNp6VLuY+mS8CMxssLN/ENv7PrjuaDHuteeo+lngfqPKkqM8GoL+8upRUTPytQuUmEe781+n0O6aSAO8hVbNWF0qls2YHZzENRbxvB+sBpKF+L7gpuZwAAXYg7BDwg32+wGmi6wStGS2YIDpXuU0ScNMehYD+PYyeQS5v4jKvD1fq3agZs8pLHwkXmcVp/g2fYetAMKVoW9rs4n6Fohvzk4bUPDOBO8Eq1yurt0mPU9k4sTDmDV7aXlY5tS9dyEUNDUwE0gSvLaED8FQqW/OEhbWpeHZHd1Qx+IUjhJEleANPiUsKlxe7kiT4Z2mroocWUAzKFk168ZKc/60okJCgm8X33bAxi9F+AQucgACvZSvyaehgvRTfYPjak2sBmv0YLK+1hCTzmuYo7klj9cwSHwgEfst2aGvM8DEkjRkkQUIcXrdtj78kDj1ljspikL2RrbBc/IVGJxJDv3qd6V1njozQOB1bWdFi3cSdfsvaviwXDtNMAUVDFZPBFyZjWZ0k6zWvgX88cniLAsPtrR75XD8vWcC3V697Ise+LKnOfqfyp/0RlRtoCbej896DhaTQpRPBaH+3UNQX8gH8+FChVPMUoj1FUlTnfNBZpnnUjsF39XG873L+R5+8JELoMiwkTSIz2XbB2Fx00Ze0XqNHubOOJo4kH235fqt98NS4ytkzvhlHTkFO1PYGyHV0DOzMkom/NAplkqDwAL88cfu0WWaEmwCxLF2ciy5ce8pEI+qM8cMhedbNOmy2NDlN1241Tosax760qq1BRgCQ3o1RvLQEQkRfC7qSqUrpyy6wzl8WQL+684rz2H7U7pfVeRVVrwDg0esesVGMGkSZ4M//gwlG6lEPbdQO33C1K054HLugmyVpr9NuZpDIpOhVuJaZDnYDU6CpcddFDvLJzNctaV635etz1TyfuUdzm6BN1T77DEk2UpQsh8cRjXqAcJvftLdCoh4WJhoNRvu7mvn5GVnJ85yzmqzeK1f4c9tWRkcwRKTitRc73Ny/3uoJ4KhRcMO4/9iA9NoGyKO4WEd2ozmV/++m1969IUJgHAogv1EaYy2KcxnkMwuf1f549/mxsw/9O8Vftw6E+GczI9tccARdpiznuIiVPtKpeC9HTb5GJcm+bpoU4WzblE8Nk1JL8z8st+OONt1gSTQPbnY6x/ghov1Ge0pqXISXsJbuxcXCSR5NmtnBOvdMxbSBfX3us6h7YZ1+r2W0RnwvZRzY9An5P3XsZ3bLnh8V0oLRHlMcAWHgIHZjLn9+NxR7PfXewLQr9pg32bqYsbsyFdu3IoxT1BCJxHL7WHVhZadlgI73Dlstb6bqeo0mmf2+NunDUuD51kyRNqv9wmYQgLOXH4At1lk6dVKmmLAdFjFU398eBN5HezRodIgLwYgLg51m92gsjGzg4XpMQTfBgZg/TqH8zhw2ml2omacEiCKN6RjFYVOv//6ro5XbdkhBbRV768qVgaVSC4y3ZrE/Kx4MtTb3gZcT7IeoiCh7n35Vqf1inh3NrymOjrnP5oChl7RXHKZhx/mwygx1MqjTpj6sD2umrV8iXQmHynFU2h0vdlvy9KBKLxLexPl0QhcSvJ6fm0QHIENm8uFrqpetCnHuDyuOl5Q9P6+RnIil1ld9+dCQ7ERJbQhcpfui+0ki0t4E+gxGEIg5r3l2/B8j9pw7hN753qLS+AFXWm07AZFVHsHHzJrr26HkgsgdkUXApsWzHYQbzORw8kn9ue46DyOpWM2Rjq00T5xEiQt5xG0pG0VMzZSMbeblCA1vx9H86+tq3vXLrt5rLVcbkvBdRvyYa1IdO49JvyaMFdTYlSBkNkNS/KAgkqaFKHKj77bBhyGvmVcB2/CT1klzcldpE4V/ZxjXpyEKkO3m59sEzlT0XWscVTHZ3WtTufpbQWw7KIB2tiEy0alZ3ojjYRrwc5xSAysxEtTh95kc6JHlqa5/86fouIkj9yuwjmVPKLNCZK8yjnbKHrrsr6s3wWR902G+brolbk1/auBHsg2nTt5DbA+7w3SRnlOeTkCvi+g51V+tzOx3iRvJbpu0c5yxJusaulmBo6kARnXsi7Lc/OieSmy0UDjNglFF5X2aXGi/uMYSDoIJvB5mwbrrSVxRuEG9GvyEUQZ21Yc040zb6ZZ8Ddu8YPpwgTiAR1/2CaOfVotj3jPlDuJqYOVNIvuD7zQNkohnQG4pC59Wn8fWQxWPoTeB2kpnJJQ9IJmrnACXxGm18oy/Fcd+fzxlrF75r9wb9u+g0pPvOdxiWbuE6L71CfFnV8iSjertolU1/+nmaAdtKkXnrrNf2XGyeU+7Q9zSZPnfBqT1lyB4d8XZcIb5JuTlpO+G/n7dtzkxAdUlP/1xDSLMIUQyH6YRWufanbX3CmsfUNkox6PHvUP6hA0CPcU8celHo8pKiruPVYdSr9bbvqtSkoJuNrh9GJN9WAo+cBrcLB8kNwU4X5jdVNFk6vNtvEOjA4zA4ei/eNVFjFhEUtfPq9NcXc2JW1JycahWN4HjHEqFRp7h3KzarJ67REQeao7uNSIAoU4VGS5+KiX5JBbSvZ16BNcOJEoxU/igQe6t/kuf/QuqeFUl7un4oks/S3jggxnzb/r467c3UZoix0eujerDC8sL60s15XWvQ0BMfQMA4XYqX7rkcQExO2+/nlscZerL9Ge7/klhvXH0HGg/1rETTvrKMePmw3/c/5EG6L2J8mpWkwcDI4jqqXQ0Xx4Qzc5KohcQ1a4F1RSbwdTWn6/xhOIwVoXSZc9QwDrzY/lMQTvDBTSULRoI1JDrYF6ztj3pW48H6fHLLQyL6XYYAqOXNQq5dTwknQE9D/oyFplBUITu+poZf9yQsu25931lburqLt4kgg8XL7CIk++jyaQ5AL7AABXFYCxpPVKsXudMk9GXSfYjSO/Z9xJFd7LimzBgr5nNfZ4B+cBwSqiwA5+eJuXeBAwAAHsfBO8p00xCa1BHQ40I2kttQ7vK09lEL2Lx8mG+IX2UbiE+bDe4GIvQr0/w4bvPazv0ypKamF8Mdmqpmho+IKEOme0GbjcpAE8Vud7ViebjFBAWJ428jAWIQt5Vy6D7nWlOZLCFldIozf1SL0yYUJYNwcmzczWV6VN0LMKz7qtiLdmShD7rv6EY+0Gidi4PE/CRweg2FrlsuzHD5KfI4di63Q7IqnR55xJN38lyUx3NtiYR8l3zXbRgX3uK1aegKXf5iuWds/a00t4oaQZBTtrcxQez7YYCAG2XwiJXBMF7g+7gIYWQ2Ds/0AC60ohWRY1CLLh7K9L3YUitJvJQ1FiypDTjs+BsDcsYFoc0XGVIGcNXl17hSIIHWLhRMAbl5x6DoNzlTW9k1EOnjlvr9OKuUOhLl+s36Lpm7hQjIhLBKfX+4PlF1+QM57VfiPZF3noJzdKWW6z5P9BUKFKJp8rjlVqvLsjcOYdTBfSNoffoer1EcasT68wuvSE4CO2s4X5CfkUktmCHUUjDhYJ4aGumLyCbvmJlyLN4GJ75+WCInYNDMiL5rwyDkeBT1BuyGud3ScRuaMwr6N0Hvj7ZdN1v54YaO+FlZG+4UGnWBgFe5eyDVptE/+rl5CZvGicG/+GH36W3ZA5AHs5tjPLSyNmK3Tlz7k0unlBPqztxhPA4Fko5/zL23NLcw+S1GHIBkSwEek/dfYxVznDytygi9TBgLwNaIjkjsY4S4E7Ug1rTLlijhrKDNjdyfJjsokeFO2QSH9LyeIwtDDaTBZDIjQ2De/5QCr96OfJ4vR48AjBi7FBBI8buHGW5SZp1y6vYjeflUelKfxavkrIhfu8B4SXzWPV2b424gGeCa/haA/7m1C7zgum9G+3UldFiz2q/PRU6OCONB7Fxr3xu8ODWZxG4YZtvO5snfhO5+nG7q0eY9I3mOLxeIrKLSF5amt2VXsc4izrbUop1ckdF4+/NOCbd7Y4DByYQn2THuxJdgv3UglBSczEwGeHnII6H+nMc1scyCCTsabyEMukXFqf9itG20d4OpBlA3AjGDFQ5eHcVlPy+ysVKtS25hHMsfz/pWPRZOHVFVeww0mPS7U/kZpHPozdtbVtAJ8M9H1LPVHyHcBQ1f0VPYzuN2YARODaWDuZ2eTSs9D9G+5to7oQnvdlbQS6/39X//CfyhZjYJYKqQ4myXhx2n2EQxlv7GJBQUoH4vDEnvs6w9xqiX9wVaem9RHtBSXCSpvn3/FmcdkKzWZm5rhX0IpfrPIMuokYFs06fpyswx9cmorZ+2upKzomlPXZiZxk1+q4eZvn3l4XHAzePGwFRIC+3pNyADhOyMH0HeczE9+RIoeWUaJh5CrTXad5BaFWNKOPr+XyplPA+VLLaDrlqcsLv8+uAo+qbSfRObdGpAFQWV6QOxZpHUoX3XXgIjzKvGCBCamBjZgXh0OqT49PXsUQF3FaL6sbp1qzjFVVQEMGEQBSh/QMF3/lgPne9lQijoeq2uGYXCcHGk1D5PpfaMFkVdAHD5+1av5KHMBJwNrdOBOQcTwNjA8rUZcTmFtcPsJH+cJ46t3mbMJfwTww4DgMdL25hrg6nBQhgtqkKFic20hb9SYES2aNz9qSJSsMix9+dcwtgBt4OePri3ZcrWdxVkmuVSgNUrUN7Cyo7oxUG9q0JKKeNSGtDawGcY3vcn68I9fE0470c2U3+JRZPffr7zxpWjZzhRlyC2nQgW3UEN3eFoL6Qk1HQYmyO4R+0f1FazD74R3wWIhaDr51FWSyHG7WG8c7wlnk4ny1+T7p07ZGQjA6TEdsUOQymRiXuTw4gIu6Y1bcbOvpBV+X8OmiZTr7R94hVShynaP4SWuNyvy4Qj+TFUjRm9RbtAZYm8OBNwxaL6c5Dq//khIuPyyc+6ggWLvE5gBNOuHGW2Sk7qt02kIU5W6iRUPf3PWsj8fW5FkV/+YmliSE/D+0bH12VC4NQbQJxuuv37QJZKeuygw+YfqKQAliqB3hTd+6/nJb2P+o0wjtXnEzlKAU8c88Df9NKbUVfcI5KRPWRK7iYCqtpsrlMpYaDtL5OGdnUKYeqKdVv01RqejxeoSszTuWAFXy8i4OYMcvK05xdpAaRGsRvnlDXDt1SbCBRvO/Kzqs66D0bwQv/AunLLUvaj6GOPOKqwbZJHUAqq1Hlo+TVnaBSF43KrKsxoj6Uk2y9DZEDXT+TowJTX1hNmgRDed83OelCOBNFUAsIhgLl8HLKXPqDCcuC4djUlOxLsumnZ5yrv520PS1m/zAZ63Lq2yC86Fjh06PyBS8s5dMoguzrZacLX1hn4Y9YoJDriaVxXJdjGQRHROEr3bYkHm43aE234K9ErjpcawpQqk48fGAP0XDjYgtghMW8OV5DyxybYl5Lh5QsMzoHgXydftdV1w1885Lhr5K2LwyALfuMp/TdPbo2dhh+2vqTeOo/eOttT2CebGCzRgy2X+q2jDXpHgbSuH9Mg0qXR902bqyu3cn/dGAwUMkd2gfv/fYgFWxnsyyTSZ7i/3t+ID1MxnRXvUHHWirTt7Nb8eIg53KQCdnf5sQXnYyZKz70FRrGPaSUTDehm/mYkphCeMiAN9HBbSwWbEKyq9ZEFL+IH+ZUww3bWDuIsl/ZzOZ173KtMYtAAcBwCem1IPAwSDGnpvIEc7LhSTNB/sEWQ2WQfy2YEXzhldsRiSAABCHsWTNYO3nHfk/CivVknxlqSMyBtXAx2mAdtzeUCBoEmiAytHnUUKcT0XysAtS2+nF8WC4dppgC3CUWIGhAEkpzqnE5I/mGte/JrJC2uWoBiOWUVs+dvxCnNDoBJUa9kG2F2EDhDZKQe6oZHsmWMWAbUuBT7ROs8axK948NnWsRrHCTZipD9+booOx7jicMAv4mJ8nEkEN98146Tf0qH2Qfkhss2YmG9JOY5/+cRBkajv4u1CaOwJMsDnCuFHjPqwM0VfgCTXBL41eAN9H/wXb6x63GAEiu8hjpmPXeB3QU9zQbTijk8P/pPVgrSyan2KkDJNQVUlKRL6Ri2TEemxhAbRQfMRSRegzy5Tg5XewkpSLBXNGq5whBx1TVypUx5WM3eA7gC0TBHRzCN238GpGA3FQH8/IHQ75nfeU+BgbFxSeYlEQtIJzgZY39Qm+s2WIHyjbR4dCMCi5OowP6PLmtPeQ539Wr3XkcaiZVSDvKFpQcNgK1IA3TfSDhfM39V8PIppAwLRgoeDVA6KebWfXvKvbNP2LjTFUk2yi6jTHVOeLjCZFRpnyYQtmYWDwGNI5Ll9m4LHdVWMXrnpombjOd5ZUJaoKsd43n3T5GXX5LBDA1ESxj/4FKg7Qt5dLYRvBQXR8En+Dee7rNONc2KOLM3/VnntrCqrlqkxeSTR4sz3v9eOuJCKucCjTScWdwMmPkVOzEic/7HHjmDY951/SNezUck7EnYh3PsXiQlvt/mIZNosWM7exYqslY29u9a1aKpOdCu/iQjfeRlUAXsQeefZETDdEg+BNPtWNj+QAGiV/+jjSfYDcqlYR1yJhl0cdyUTxVFPBCgV3XTPzgJcjXz+EwVN2gadB/B20TfHviC+zvtSpudzpJtc12ruWjaSn1Jw2i288eE3ous/Bm2YHVYbDldTSSUqTWACjp7xb8iFIxQS0Jr7xITVCxYSy2LsvHSpH/d4xfu7qiU0UECQCYev0P5hHt7OH3M6GZysprc66h+MQIKPLFJpireurleczA3N/Vk+QQxMP7I4iLagz9vvW7I6/3ck1tqtr6ehOnDT3kpcy02ARGOufgG2vY2e1zMLxM1ncAbSLT+8ztCQ5YynGk8aGn+0EXbLP6s3E0QQzJTbhj6JZwle5l7+W8hrOlgHtvk0JU7Fx1+DzYDR4jr8Op9SxbW2TuvjINd+1dFSVrIynDO8WKLlq4Eq24s/7XUF17u2njcsl25Wrev9UopUnS2uOc/zH0ZjuV6hFTFGEz/EpydxY8spCI2aGViBNwi7j6OtzX8EJbxbgJT2LEmn40AA0DPEyTjNTGMU3trf6WUdmBzlgb9ajjyLtjoDPlRRedGGMHV2Ve2VSachpduXcIAlidXpEGEXC0eKyGGoHuHDREYbttXdjFhuMSKsyCfPwdPnuJV8mFWZNYT3jqKwWpEE7VHdu2PSN+PQr91br++YJojOFXEyNlNDrlIY9lyoORuf36mVFzASFh5nwviaFlH1Apq4jaYtWr51Z/RfrAnjF/0DPDEcccEE6fnduQBv+dVZwdAEdrnbn48Q8RPZgpzpDysxc90xzgB8OU3ajkI5XFSc0yKJ3damQojZuxswOKR99Ct/fLGUFd+777ErNxSPbv/bf4R6+O+xv2vFRZZSgVBc7x4YEgMU8LzFtiIu5/bf8LF54BG67kM2oy9M2ZzFYPEcazwdanYelw7eYbB8C84ZvXTau/opqaKIephaYP1x9ZJz7wWJIxb/Sy9K8/FfslHxcsg5p19oSl/yc2xE+rc7grrmDtBi0BNeUpAdBwV9MX7Mau63xbZjk1cT60dy5tfOLr0EejyFfASymvMFsiOgBrCO8VgRVG7iv2QavfuukGEE2lWz88nsVPHBu0LGHDU07DojxwhdXvgkbkd2SJgbxcYQr0i9d2CQjG07VP5nMttNB4pyJ+HWWZIp6aMcohMQDKg4JbQRz2r6Kwwho+mE0MRKC0O3L9jVi1MCfr3wcV2XJl1jB2K01qZ9EuUQbV++8GjI/m5W18qpFV+3npnKPIHyvErQwfWU8PqwN6WFjsrJg22wJkKLHoWlD84H907SVW9s+m1A3uX0G7MtwB0uU/86CBVtoe78cxLla3o4Ry25xrWnBkNzkEMatv+dEsFBHL8qptvXz52m4JuxGfs+Yts4EvItzfhJxqpCll6zjYra6660rNFriPFdN9Nzkjgors3gMCCm9nDRP0zf9P3iDKCDFmRe1viVG3/YltQkLlBwXu+3Nt/wpx/xiviohs4jyT5bPk2/1i+5zRwmx1XZXJO1bZ+DPZP8mtgM8l/a6QDSH0Yosd8eEuWB8IaJgmRAfuymKCAoTl3F3wb6JpGY6vhqCDzVyE0/CO4TQ+PIm1YBTSwLxzU2VNKuRSboD+j8Dqg0aQz2khUldtGssTp6GZkZvyfcLwE6jB5SldEvq/KUXAeMhZ1Ko8MDqrfTn1BBbATyAJknwrYxd5CEGFpYg5j9T5izNZdp+74IznvgfQTl2qJ9+nkJlzSQLC7G5EqxXZOz3EdS+JNq4/buyf+trjKGIQAmiPI3cbfhIRnxK62V0bYlux3EJkW5rPqFv83tCab+vwzveuIv2D/ecEbfS2GIT4QEZfdk8oQt+incKaaEThz79Yp8JvmTAbC30fjWufTXnaFz1cy6bJzU4RUzRRB6Z64CturXE8YexjIDBjjL3/dkOtqqnvboD2HDj9nIgriBkMUUOotK1Q1Ryx6d3wa/L/z6irrh9BkAaEDN0VVWvq0mcjhlX3oks49BHABW0bDax982xExZhK8Fh1cGGt0lJyZY9IfNMG6vDr3JEKYA5BIAAAAOI3MNXGFATR1RGihfwjlGJVkmRMOTCqVk7Fxk2ws0BIlQAXhYmqp9XhDQxOGaPCrkPKRmDe+j4fMm4qxUqBPSwm4aIJrtp20LYOvm4U6sE/ebhcAiN58BaNv9bvLF9E4QDX7/UgiUG4JJ7oiKb5lEYcGdY3uhs+cbsTtFFeOmHWM3GgiI3pcs1mVF4p3R60w2iiGIkQEc/AVmYm5cbOkPbcdZsZdId1ouJSv089rmdrPe3DL2bQm/eDm+zlndbSqpB1IuZ4KmOvIG1vLrLc7aMjkwoOW9sChzIBbL30oyfblmnibrPf0zEF7hFL32h9eakNtdFHvbunevVxh0zE4dYfUvH19y4tJIAoBx9QpRnc4D4b9E67wNpE/jwfBllFdJnsr9ATIdlfc0lBTEvYCPjNeDE2ipBS7fD+USywJvMOUnzzWkN7MJpGEPnTYAR8jTAB4ih1SMVcpfYOnSqriyK4hqJgG3R8aSEEqsA+6XzE8+PhR6TfFIWpj4jH8vHB/YjmHJDva4Pz80oyhwBiBBPdT62rJ9HklyJ/rj9BNuv8M9LPdUrtaku3oYS+QLe/Xw6dEeQdMh+I2mo7vT/jHSKYIjlvoCCLEQQA/bPTUDqwCeWHbkACMVVdXB16hl6+0WoLypqzJ7gpPsf0woIZ27mjSu70ShCFVRmHuIq9ggP9s9bUCpEB6EIzYyAO2B8IsVHNksa4RuigJpwaq/wmbPf3P3ojhkPXteuX0FQ5S13wxe+fSdH3voCbAs3xYFL6pF4/WR6H20hkYhtgqtgMn7Vc9nzmZKEEU5Fm86ErJWxFG8pijFqdUmfneR6QqPZS7byuKjCQHQ7xAAKpZjXeMsLljyMk/jIgyVSOuLm0SgvanZNoYrcahzKg+Mx5PFjc2NaB599uWqdAK1ewLwlmyqcPFEdBXX3sD7xe40pM7CQnWLsTEXkaDEwqNeHC/lHEClRyoKIU6AkOJjV/4Q+pQUt4X8+HoaiiUVRwhASsdBRsgsy2dlwWbG3swynfTlMXC6keppXC8aZM9O7WsWxK6b3XJbvnea69XbkwARW1opMXHuT13dvbc6gt2i2OVPNLbXLrVhG9Z77FDzIXr9iXRNhTs7C7TTFhTAzj+2cxf5CIx1XmzbEiY6MdkT7DWhcf3uty76AHgQ+Q8TYStjegmYHA1bNvLZVCyCsVai2cVc4mhTBULo5K9PqjeHb9BsTOK04SeQROyt0Fuxva8tdDPn+byyhsikferTPCGzyUGqwGrkL3XGCGOdZtZwgr6fm7bUR/9ZlN+dHkaqY0ETFQVMMDBepUwdbnq2ZEhV+1FggNxE+5JZaUPlIpqKGE8OnRg43BUSL78YrEL/0zjg/2QMb1v2e6hnC1PPs6/9lAFiA5xTng1MH2qmxg+NyTOk8esscxqrHYxoSrI/GjLO6Uf/6WE+baRyhCtKaqxRy+PoNsH5b2y7fYJi/A0eG2RRzGe9UuchC2yI0R9pgOkLC9ollATS/bgr7E4NYMZS3gdA/5K+EJFAM5I0YzPwhGRoygFP94J0tz8bKp/dU7ig1b7444RpfKWjHJuVkRhQN+d4WRDC+xyyoEcf3vlXy4WFydWRDbX24e0omRhgZCqH2gmy7HGxGx0o5LQdOJ0S3GSktvuPgClAxitFjj51E6G5OKBXxCxP7wSr0DNZggEgf9+Da3LR8lxIbhlJXiHVC8kyd5fPO2X/VrGt+eeJH00I6GJ3XgtFyiFiKv8MsphgICeZUodgMETzaHm5vMd4iCX86G53EIgIKtzFzelxlpcvLoKwBwky4NwIWpW+6SVtRcKRf/pMXwbe0In74T2v7GEIqsIYUmkLhpKl4oDLvd9M1gnqW008vvHpnM0qETI3eteCtX1PlAJyAXubLl54PE3PT9YBmaiX3ru/K5JfEVA96RzOQdv+jXUG1hhXM+/1YWXlBm7d/eTQu8c8CzXNQrEC63OdptoySd3mJoExSY2ISrYAJq+0DjLngQygidppYm9GXhzP17jBwGRoMveLYFjRK3MxvVOXTvf8NkK0WdyL/cFuXCLhH8iV1pp9IKq4bTVDdLIM2HtYJ11091eN8uxa06YLq/NmSBeyccqBF3kv91eXjPh7mCmdPnjyOgk2TyrQIy6YHpO7DluVCK7iKVfqz7EL4P/w0pSMskYzUXpmVppPbNHvL41jUrUrl13nFNAnUuX5UbjBCX4GTYV5YWf2Evp5EgzRfF9aaCKGXvsBw+07o82odcCdRoXpd4SoMhn5edSUOPHkfATDWuG5CQ5a2m/zTSv79G9wi10PwpBauxGNgH/PsWYMlplGXjxZbMnli8L1BZ5lrn7kdL5xwrPl2SUATSeroQEWhrhfU7hbraqlsyDmMKCWpP0ND1M1tFvBqLGQuOhVTkztWpztPUpxFjvTm8cWsLCE+yKLSgAfqzxhp4qljRcjG3KtuBFa65YG58tRB4naXSfk5jskjsukSd8LvrboHNH+DRzggE8gCfjyQ+D1qAX1GNKmtqcT2YrPVytgwM3Fui7mWwyptzqGbFsGsE/zQvgIvJKQfPU4xlC1ojq529/1ROYNtxC6GuglCJD2zBgw5RC9dSChL+JSDLch7eb0caEO8kOmX0jx/z4yecnW6vOxD8fZA1KkndS/fT+CZSfuBeQ3H6q+QoyBsHGm48hU7F+7IAB46EVL8+r/f4ARohoMFJJ1hwasL67tb756niJZyWSbXHNrD0Rd/Ufpbwqb0qjYSv0gLh/533zfX/kia52lyXp7+xSD80BapTE7z5nTeIEf9mkYSphmZoVOz1pzKqwim4kO4/HMNxPhQ/58qp/SZBC8C3jQp6T3Om8MOVxZURwwAVMxR7/xwFR70MbueUOgH3gw9WxLHfRBm/DK2XKWeg4A/9ZZzpdbj2EC4CUKcSEQ1NR1lfdgRgM8gT+RdemA7AjTwwB2jlie4XNoshHOmAAAKfAiMvMxWtH2OCRNgrIfm6Sm7SqJ5ug3jvEhpYr/G7rAXCD47OseI9rT4ys8KJvit3y8Cxssw01MU2RNK5NvZeN2UH7JkHzNgCTBPwQdtqHF2Dxw2Qr1YOqV1ItzsOd2ZvXELgZXuZmvbJwlAppV/8qKuSgFjgYe9/Q23rippVxSEJquHz0jUbDwZktJ2SYWwmzoXJuNwePPEW9i2BQZT7U5aJuL/B0eLgYYTdJFcdAqBgcF6FtnnNrPU3pmIDS5E1sVWhb/LDttZdRb00gjED8F3nUADqu06M5s8KW23w/xWs5XgEfb92FXZTNT8ysziNMY2DuUhuEcH15uPVUxMI/f7L/JXYq4qyBdXRPRy+otL46ULSKUoo3Ifo0t+aCk6qvtaTC9lKqCRVx6jtoQWRjFjZjlrhFinG6sHYmJ6Is7pDPQqrF7gauysXh0eqN6CGHpgHNltiH6wy1JM7s4zqCI6fZxKU5/9bGCz8DjfRUfbTif3V5jWx5DGo1CmQ5Nd6LDobkzHXyQKaTb6TmoDrKnw136agFaQorblCAtahefCAG9pfGIh7aAObeitb0PRoP0qaUyJebol9HyOm7bI4HpHihmugKvzzbMI2GNLxlMeuDeYu6W2Sux9e9IG0OJkddx57++BvexfOuz9DNnVCLG9nZOnEWn3eigGVsy3zxa7l7FjD57wdn6v8RlJn9qH3lmOUtZbPvvU2cPcLv+DVVDpo6F5+ARxD6YJ812LxTJ4imZxMcQepTnzp/iiz1Q3c7YuIWfY+HvzJlCyems9DimtvwpclHkhCy0fHuKZ9iKAzMjiInXiG9PXL2aFZQs1JIOcG57WxwLJR6YHxuwqQNmL2jupYeE9xF9v2+ldQJ5xq9jCHtN6+ldUH53f7RKPZkCGZkkSCGjSvW6t9rpSCzrHVvb68IJrBgvdzpdGOQn+m2y4P3u+IhPTEzZImQroH7X9Yn/7msAwGTlGbQmgDLlWV6nAUVv3ZUfR9sWwl/bfTrlXMxfWRqVW0kNCNTFFe0X5sOA5ki4W9i9ipRwF7EktbHb1a1O9FXx83NAh+xVvoFV46iK7bQyzkubeXso075q5l01NtodDwnuIsv/Q3UIXRLH/VV2snyhs9wJfjFHjnWTbNXXor7DEDXFtivP8FpOFoO1yEnhN2/zNCYspjxVBYhBnugCFR6yGFw/gut8X2B6skRkk+SstfNsf/0ONS0w9odYWgmFKIL60DzE3JF2ScX6ez9jv9298gcZtWlLslrJ6ylBgyxdXEVNs9909t13iAwQ3dbi2kohpOVJXfH/eRoGW1TJpnlf4JdnVn6mzESavI0XkOkWi0PA6dLeC4FldyCxr6AfmPxQYgmo5R6A+Oh5HPjYpi8gnXQnX6HMqYTBkSXggDaQoECsyCxMSF3P9kOVlzfrogfpx0cqavrXnDMa6FIyo0+/DtPNFg6nN91v4eQPQSYsN+8EosdJTci5rFVFfFy7zpgrISBWz1cQcQqr97E5pa5dLCTdfh2HES+EsNJlsUbyWd2UpB8tjNBQ2Gc6Ng37J0lYNDic9Y+Xhr8+42bVeiWQjFGfO42LQIcfZH7YQgfN20KkPDyxhCYIkrXxcQmo64xZ6O4S5VVoBZkGPiYFYDMHlTXbhXtzrxEbMFKVZvYJxRX7JQmpJMkHVbcr7NFhB4Ix3rSiBkOawtsR6OX5EH7TktP/1RbdIG8cd7jB25WhMMsfbSk1MGK3+16jopQWuPl2Yau9d58//IVNPFeRkuLBh86nxwsjEX3JCDPRMonx4waH1WRf0ZDCxompCeQQBgGxE13KX+OXmNcfzgIwrldPpZREptdEEdt4+mVU3GP7qvQgDAExt4+28ybrn9UuPESSX+KOMRAr6y0NFHA0zwnKM3I2xBODWgLw2mx1EUsohuLkg1doO8rr0h3/yQf3l5lYII0mp+cVFU17zmTjkAzloJOIFxXVmhZhiAb0mI0dpgVq1pHs/iA4OCANXvlLcNm1jq5lzhdJvjVyXLwI9iefVhHSGVfXFsvH8buAUFRZcpWE+hNJeHdsXcNi2NGDzJGU9quKxYkRl5N7RqG9nGvWMH6/9WRsM93MLeTyxnYUNumJCrEqybGogSBEk/Uk2YWJqw1NSbgzaHC8v09F7NHVE98QN3wrVkShNZU9RI4s1m2U0e0M1tTIQSgJn8bgpovj/aM7Wb/D5JaHxrTWWRDcw5s+S4h7uXK2HOslHLSW2HpRtuZV3Ny5PYfSmC7mXtHb8gYwGEenbbmgBmxoDslDfvqHk3Z8uVqT0WMLei4ZKFdzJ3ARDzADTvMETfjWjxrnA29SvGTl6qDM3NWvX5+kWt/EVEozqToZGzl40WdMXSuvuP78SUNaeWUVATtv+zgUcGHEyFTg1Su7h7WOFL0YDvz0zTI17M6GFVpgdgVHIm55jPMTG/kPSbkUzKhob8csL+SXxT3Feff4Aglm1LZxekJy490S/FzROdGOk+Z6N48mrSu+qUm6hBmJq4Vg7ZTujEBqsBEwcA/q7KV7x2oNAQUDx2s1UHNXqdA2FR8of1vGiJppHmAbIRlso0odBoHC1Nm7JIQZQz/GglmbnWV7zv2qQ9X4cwkHS/KjYP7cCBdrk3yazO0YmPt++JB/is0iyX2TQ8k7yhy4woBI35oL59WhkxQRd8YZeGSwzudcQMx4BJdqhndU5cSpDxQjbmLEQw4rYfn5qBwacSiSUW+troPOS0tj+XRP2G5KNpFg18Jh10JGbSQiIPuSy0zeiQAAAABvryLzwAay3tHjXtaYdmk+JCCvmTx8m2aEY3LA5cTWgE3zj8DikXdomKVCVdd8A7vc39VxcvwuskBaNxjWChaOGMDWNhxjmN4Y1fF8Vme8qehOy2vZUeYRTVkyaoqVEg3mjyTFNRz4FDwL+58TVKN9cPqePV5ISsQ+1Ql95GIcY9x6knT5N1VZAcvNcZJ6SgzKmree8lxLonC9qsvrZ+yxH+S3z0ItN6AJw8lZfBpUvR54kNzyhiXK2fyCWx0kEyse3114b9O3Nuh/lRj6wpTwgn/uBgE9AhjpVA1KDL9dIE6OTD6KyAHeGdsvoHUCwFQAUdTjEqhK5cdkfMYumQMImP25cjjnSR94HWZp12CCequ+Gm4vPRjDGed4Nk/3T+YpcHo9I/My6PQMhRBMuWHSiFVlT514TUKcoW4gf8K0GSCnhh38Od7lDJ97/LlJoUIfNoUWmIRN8Yrr68l23xBVzaBOx6PpDimurIt9Pqp6VIEMWkC4+ACAP4r+wl2Zr/Xd/8SHvR3i7v0uzEGdSvijCYrXBwWSRcpVFP5/kToTtv4pUVkP6hdK00feMzhLaKZJwdcePoX5oKeWCsLH48NYF9UEz4ikyZaKkYZ6U8yV+6l940aOAHZMOsp2ohuF8LPGbyPGfUzmh7uOFymo2Yd0Ubl2quRwFfwRn9jRp5MvhOEzOKysOpPtNkA9rEaM07DpBKqCWP1lYelnUCFkg2sXezUjFJKHEomOABWvCyp20ZdlOn3Oo4EmWVO9vMWV3ybCWKcPZ8RkMr1wgIyx47bUJzGECekzVg/ganGzZQPgQZuCUIpkdSkraR3SF+UTdYBXAkZXNf5fxb1ojUUD9KBTduH2pDJPw+8B5SvXx5ijRMZQlM9GmSNYVOyvgscK9cdTIhzjtrJdA2SBL3o+gTzyxFIQxDQKMQW1825L3AudQLOx8IB64oRg7t2Ga3fP3mUq1BZhuq+DmARQYaJ7cWXvWm+7faFLcjf7KO/fWpVbWxgTWiJysGehPHHS0SIYKkah2mmu66U79Z6pcDl/iDeJ5M1oxx3QRtKhNp06sCmJT+kWmyQqyZAdt4bBStKF32Bx1Qldd1b2lvkr5GDdopN7+rSuQapQQjMTJGk0WjGXXzhP3nQ36XaN4HLYCzXUNKLqrZeBNMFOvgVST5mpQZkQ04QmgeXp6KxsCGmRCBquv2Ww9ubnMY8lXop4dvzwQNdTFdpQO5KOdKOlauzcbnDgug2QuEAQksrErnNKuNx0oEdBOibn02/z5ek9qQrvcOy4utdP52yGN38f6cqoMv67GbH56Hr5ZhsKIyzQjeNO6CECEOD46K1AqJbLoafrkC7DVw67tLoMU5yFET7/r8hnLC5LaaA0C5SSOHmC9BYU5q81Q/KO6laKUK1k0NwaWi6nnQ3/+HHfruwXWiD3p/JXKV3zDjPgJcK9ZNBy6PB7PBHbonDVGdHnuh+t/nXHK8kv69eSAI3WSMcNOtaWiT/r+C+Z7+YAEjmhxVMgWL1xiGj3hQRWZaGSgXM5tAHoJu9rVuoGvJWRX6mMWJXNt/jurL47nta5kojTt2Nn+egO69dO4+D8q6FbBY2VPcU60oUBm/fABd0PEcMY7mSscD47mOUC6m9boW73iPOxKvnThqWB14dYXAAee1Swij2y/OX7oLjQBjiOvPGjHzAftVTikUHeZH5jrp7hbUTCoYkfTY82bP9ESamR7514jsoebVw1xn09BF/I+GH6HXlVF6yI3KMsYZLZ+UjroJZuby+ANad8rZfmdEoFx1yId3D+c1PJUsn2ejRcVfB/coo+emjBlMiSyOUNqwc4Ng/pXQ6nBVk8wD02WiavrmzxFmv2AeetjciJXUHsqVKBbW7BZqBu1sRGHIOTbXZDsgmakV3pHFptI3Mz0uwIhnGu9OufXcZZvIbRxeA8ZZe+zNaA/CGw0oWEmNDy+d7oZgfJeOSjnAtRrADzTGz6VT8BNVyD3vr+04L2y0k+OiomdJjo7uP8oIjyqK8H7vcxQHmtDdlSRyqPH7ywcp/oqgE0ZmGXiLR5yzGyj7pzvKIzU89i0ayS+DXkOTgRAAwsjs0J+aWCCXQIYKQgevthAIFmMJ84TRTg/9X2Wmnt9YNsPYFfaR4Unsa+fcto+kU3qTkEsy4f/zHwIIcwpgVJ2iWdxoG1obhKXPNyDQNovPnFwPRvN2abLicsbMOdCx7zU+vH2BWrxfGO1tO6sdITUVBCzEswi+2ty8p4pe6SFT3S8nklCTXx4JkFyYtJU/DVr/0RaWQLYX/f2bVUzH81jCbfy5DwCvwLZ7ZYEChAugPlvnu1ka4mJVB0VKyYHxTGymBe03zq6Tk8zwxaN0Hahf9TkGxGNPNCzHaEiuM2PROofkBLxBoAcybS0lVsr+T/ubtAoqeOCt1QRRuH1C3Ot1mvIjZJ4+wBoQXdcObBc8IMfaDZC7No/agvtJ7FrS70J0LERGJ0E2EXktnuwGwY9gHQykJMPDUdDJlZP7on7TCbFa0YWHOSyfpFGxP5QS0o6vqo853aUi0xT9d8px4R9vHJVsoZFCVV3y+bhdKyddHAAGXANZInnu3h80flbctCyOXzk01qjHNImjIoI7DmnTjvTQ0lLDcPyttwoK8i6x1VLh7Ckapx47zTh0fooZlTqMuTKxX+Iq/JP6LfDgLcP8FmCACrRAIYIrWFWhql3H2lV7cRwcnW+qwDaN/4hMy1o1PM0Z3J6W6yd3MQI0kyiZAXp2MICXtFGhBIBKIbBIJ1KlOiOdiSJ7MhBj0XjXob4kc0H1ZFphV2859DOrJiKOff2eLE+Ko+5n4sQzYx+e6tDnGepVx/ENSpvPPhVlLVOoAh8hBqeRVqDPK9hA9ri5qqHOggKGdFFEh7vRHT0pE4qsEwOzQJxa5S68dw7e1e9G1TTImonG/79uoeDZEZ5n4WMrn9nJJ/+niTSB2QbX1Xj770Xsa1IZDu82+J3XTXetfQUj+4Y9MsgsOwphbDefuWX7ih488+rhLYecRLcUVXogUYNPcya+oQvImV61k+QKK/bS2GmeZULwUfBlC2xlftNX4zyEuJ951mouWFvA+dKDwATrD1xWDn49+KLF+JUaBlLyrxOu8OXtYr9syPMfgVYaCeXJBWNSbVv2cPCpXhgeZbkqABm+Jv2UxaDdnrPQghqyTY2J/GiqcxapgshhNLAsTaaWBoImrANaLOTCobdEa8FIE9DL/G4pIrinAOr2omH1UhxKxj8ya2zbotSgHQQQlRohhqawU5vz8dDgYEjBWkXz5265Dei1gZEmzc6wvr2yVvagJUnBC89DF0lNAHu/a7AewAf/Q7/5hmPMb88nL4XCQtGnZfsGXPw/LE/GRBkqav93Z/AmPy+nh7CFydHPnccx8O/mUSOKHL2HSxqaRSHas0AmpBIRFhqZBaSorwpZjX2+40omIw4x71amhmt1Wk5byZM9byyuL7z1DrESmv8YG2KUJsxha1tH526n0dqyV+pkkoTi3XjJ9ssOkgFnMUhyOXm1o1ABJ7RVn66TsMZ2ZG1FuIOxhRxsqgPFG9nlIFfA+RtaeD/rUthuwdiD7PdQtrAWdSsJvowjy3CR8S0INhanHS1TCaaFP3f7vxE6fr8/kpDHwteSom97eoc31GdP/iUzFdJy/FKhGUcdHAzntvpbCsZePNdmh7pWAauGWKQYmK2XZhyonA9usfW8e5NafI2peZvEl5IMuRsXvja/27Lo+SP11ALykouyy4W+K1pbBrFUMwawYLzcRV/3Lj/qtHc25/je2V7r1yE3aG9LhmGjliSb0ga2kMozeIFFVwG4/fKpE4AGSVAwd3FVBwK6a7bIGPazCb2ZA0A5cY8wRnB5DWKMMMayfV7Cp9YfFlZ9wobHCLHdySPH3AnuruexO04CFIdTDAvdvBls0f4pdtGJ/vpon8V25h3JjlGbuTnHtsi64PF3+Pkl+ufXLIaV6G5fvGIEhDlzQzEh7cvBqRzPjfTgACu/5FBcgN4c/mU7AzepGG1YssuBb0NvN5dKdVGW1KV/s0tj+SrEBs71GtIpD4Gg4j9quggRps3czEQciVMHRZcyNVX6mSzmXpirzeOfl0MiXYWkuAwBSdwlwSvvoq7raScsiSrfSLGWUWfYixUdDalls220bSlAxLengPs0eMi0tJ8rOoK+/wGro4+7Di5X16BI7CeD9EvCP77yp3QRtp7BtwgpAlrgrZ0cvkT1kxh72WbeNRc8BpXP/WMtvpl+EVkvX57hIt1bRu3eN/XBrPRsS4HXS1VOAj1L/ahXljBDcEwlWxQ1PKqOtFCE2Z7Yal4WxmzrzTO2RseJWTCBKqxezjte9yvYPGY5Na80f0T07WzcnKMe/nz7kwMyMzHw88GQjQbje3/OaEDzuK30MaM7HXOmEEgyWiTGa4xTXtj1mtWv2fMssD2Gv45MC+HBkeScTPgAs779tfi/vbVM6w/pIekWZx2bVPMEnmeu6ZO4km0OrYQRQ1Gog6KCUGIPHxPI+PIrVixTwzWXARTUW3hR3o31pHqOH4AwJHl5NXS2HWXWzV13VuxKii1WJWQTTcp14DS/WBSvmEa1TgrmLR9R2hWdINRDPvo6TBr/h9QBzv1bC54hM18Xj2Zswf1MSyXYOoDEN3LQsehbgtBS3QyO8cRvKYw1wzP8o2z6GRdUJNhTR2wFpPf57VMqYLCzDcVIFwL5X5CbCoSXEGAL7MXqfA0hVgdMTcSjYo8Q6Y96U5H6rEXJBAbZFVbEeBjwSHekwuum1xRV1zPgIY0njX+zOB47lMIjKuHUwefudDG6FuQdJTe/cNJXY/mMBc/dOUsL+sGvM81/DD4iBfj1G76D9ymOnBGX2FEami4PoJHsS5SLRqXcVhUiXakuN5Nn5wn1etqZNM38cxjNCs02dq8wr5kyFFpZD8FcBuLF9+DMLqSYggWW8lm9wUCdSFX0FBJByAXWkp27e71rhkF0ZrnlX226p9quPwgpfk8PyKIbSevM/vxczgQVCWKtVR+uOF/d615NumxzAxU1nJg2ron02JQD7cMaf1lIqcT9EVjzaEqDVY6JoZLdikMOHHELrr9fJ0Nvaw4u/D0j9V8fBqYILYeeRpvs3+pspgTDPzfqtHCJQPVMX+eVwoxYZLGNuucMieA/WuuP+zIrOuvvr7ERicMm8q4V7DHnOKJi5KuBCpW6uQkV5NkV6tIsYDJMDq0VFF8GlAVan9yMXYeicNCPoawj36lclMRH1x8IF8ECyfB4o1iQwNwXPHUwnuGjKQ+lH2yHB5wdwKfNy7FcOibsCgf2MilYoca3ZoZkTq0rZlBzBXmxBFyhSS7kQ2AOCSiK0+oPUjJg7Frt9jDP9/xw8zQOyDlGyCGhAlqjB6rxEJRmlNkt/LgSwRynQgK3Gsh16S76Ej4o/GTTlRO12vJXOh/f2+4ljFCMe5ukC4ai9CuLtuM8Ba2m7VCHopj2uUV+2h1m/hATB+PJ04LAQluzsU3TOFDlUjmqTJIDT0jzFXS+DTR2C7bEtGVUsEegAAAAmix83buwHwxotjFDKC7Fa717dMCXvTl+WU2FvyiEDdxEpuZACIwzs4cy589AQkmslplvG+FUuRi3tCox4Ky7+a6e5AaFp5l9K6wptb/DMpZTo86mDLmOyRxwPA+nmTBBhaHS0vSyP/JuvMoyuHJphkJrwObBG6gSIaMBVCJ1ee+zFpisNXgYqRsAFxwdCtavtEWC08I5gffPdN7g7fJx2BMwdb47kwZ9nYCCH+d0y9UbxesEXFHrKFN61e+hE4Qo8yvPNTswV4R9t2PaT4tarJSe98YBFWYV3d42xhTuCRTeldvaVF1IFOHZwyIgvT6nRWnH1Z/7ChCY9+5MqftPLiBHv9je8tdPbug7M3CZkQtPXeDR+sS8972yKJvjJcJdwujzClgKOIiDYbZSHoAM/pFa31zsKdRpZ7RtfeRjgAsYaYK3M/q6hVRnI0bayAycjWecaEqDzdvFBcUBp3s3MngeOo7iDetThu21cEIQS4TZvzRRALtCWZ1nYjx1AZYEGQ4VUc3FWdk9/3uvmOXugEIDaSgNwCCrYBu7PfippOQCIgVb1A4nhrFD/nODQJG/aLnSgzLgEYX1fiPEypa53dWJTraWxt/NPaPxf/qOccT1QPz+CfXRwLv9vG3FcZI1UQk9Iz6jY2vhSvfjHzD0p9HawAabs1HU45VHxFV8YmDvjSfXNIZwu7PEvqTo9UslxUcYOyHk9ibO63I3tEu+39XulYMEp346C9esj7qpH1oOKH3+WIIM1gnqEsvQi6xB4hSZBzUVybQewCM9R+4lG40ar8WO1DNuPv0x2d948lijx06AUbnRMc6T3Q/pzHzFZts2dUTDdbhYZTkYEZCgBaSx7UuHzVho9M4mIbeTkFzr8BDa9P9ti20WbE1K0srHEu7C2cICvHBT+85RXzM3qVT64J675LHAHbzKqeym85SWhPlRR9n8FcFUQAhTJm2TfgaLsooaAAqX/10hquiTv4BzBKr3V1z46MtOo6gnx95nrLfJk2QNoKlCDogoBBhW0VDSg4FCfev7gT4n0d5MXHlcoEVjfrVDneyW3Vkj2AXxoI1dvzuXnbQ8ooxSgmOgGoP8e8Qc/fKTpL4Wwwwcjh3zYBBKUqbNpjb0DsjgMZc3x52OSGKjovh0ibVB+CW8OG31AkzumW5rbpQWeIDjEx7Jau1+KnRA8nkL0biwfHAYADwqViLvw3fWMtmGzN1gUwbDv54jQOS6+OV+rZgIcrBP0czUhZdGBauqf2HGlrLPDWtyWLOrtmULzjfM9Fi+g9K9jNj8zXjLcNx9Jtt5npolI8+25M/j2tVVDpCa6jNQ/yq6Vuyjp0dGZWJvfWhs9H2jcEfyYZ0txg4Ft4pMwkny2wIABPmw5tn4laCSlKXedQ+XkIT8UAkfK2+WFwqJtCMIBgU6as1cWhcVFjGKmEIM3m8DVe7e1m/M06cbdWzNhyuHTXUx7JPVKfoXVur4MGPKfjS9Fg2f3yHlzULmLLT2vBVTfJjSFVT+jWySUDHS4NgdrB7LzW373/bLo0XIarNK2aKv7nbJFXeLgnskV3yC4MYPf2LhXF64LPZZJlhXvJNYecTrRjjmHsm6GqVtVgJMbW3l4bKjEEnD6TK4WM9dWN2ovKIHaCEEv/9kZZnJ6CMFc6FBFo1Z4Nx4zTpJ2tSQ4qdAUY9VAvPCsow6KCPTE3sNkFKZbaFhQfimTzHvYtuGWAwpAV2j99TgtrpnhrV8eHRSv960DR93M9ve4C5hQ8tlppeDtuUBFaXDA6rYHZJ4ZTwIErYrgzYF6/4fti9yKuzS7Tdm0TsLxCssLfJRkugLubYLdGDXeFCSt9kfb/UU5+k+WHxZrfIEgJz0ZU/6m2NRL+IaLwOwzmCM3ZF+5dcqZMnyuy0PoFDhGxki77azJL3kCkZzXwQ2HbDEZSBtR9X5K0/ikNW95jLM+HpuZcN+kK316W3AwgkI3F2tc5tBalfmmWbJ1GRqhpnAZ1bM1ReyxISVHRaAcT0N+JX4pDwBQw9Nn9gPmnZUTUCiOVHGAJfdyB4a5rystleCQuM9azSySlAlR3djlTxoW8GSk65n4kOaMG8OxAAZVsw0d0FsCR1zqZs/raMb3YSNwiinP66Or0qtIV71ErOWF6PgjGHc6BDYmfgNnOEyCfFWSPMsA0NBpAXGw12FOBZJGuAOvlNgWSxVUhsDp9tHs0fouDgRtXaw5hcIX2AUodIlaedVbf99LxZEGtbdvrWqJKwoElAxIc8TqTY61vvKgloqKCmmfDyayL2dK2CL1p21BQeO9ky0w1G6RokV7EVCzjQE9P/cQ7iREpEgdyDjAZi3OSnbiE4PzFCrC3AQM9u8fk+2dXh9xuZRrO8blOK0pW5DaXvz7IkvfwOlX3Djm5kRxAuGIWRhSHOsyKsh4XopQfbRJOkcay5LJPr8un39agiQX56FD8HDPxqIu7kEVSpHIWAyOrNnZbOnMbqjBoYkpzLi5+I4qFwqABHIFvXCmdw87aAzBrbZ2X5DQRSSGy7ymB2G+T9VlCF1CNQ8+VX3I23fPIBxSBhZSRsy3T2SMy3la/KiVCaNTPi+h/oYzpoR9xC4n/jqeTSIFmuSzHWCQ3RFY2TJH+HDWPR3sBAPu3tnml8rgPQk7E/1pc4e9UQ3hjm00iIa4p+J4yo6SgecPZP74t8ffPEp64wW7PGPQcAubILbJzENmPOIGIJveMo2kIhQ3x1HiyvA32uTxD9NXUDnPd4pwkXUnOPGC/b2IHLXO4n7kgPz7HS407HYKlXtZd4pL1mmsDoy6nPg3yBkhpM8yaUD6Jrs4V28LFV0wtWtMvA5BXXtfhbOWHtg6qEEESZAZVcn4FgIU1Bks/QnnEm9dsNq4mLHwznF2iPK6WzZOtlNb38MnJxqLw9CpMNYCdv8myzS2zxR1fwZ64fvUCUju97ZQmqv4EvpMJ6qEzsKRKgP/1hLiON6n1fIe0YYq1iNEMorn+uwWNRZrzvsAWT+XjOSHeRxMwVzEiHS0JXUgxVsa7xp4DhEE/lZcmK5NDjcgDNfaxwJ6779O+bQQ+22g2buQStLm/LBlav4RAjhV73jiNIk+qN9UThc+d1MPPzOnttUJRh1yhLofYkFKxPAAAAFKafdPd+6kErwViEVnnVKn46ScoQnoVa7MwYHKb4QlmHuF2G7JyX9zWoMWX5z4yKitXn+cF/VqIoo9iYMkYBtIi4Im/CDLNmqjglemeFNGj81EH8xYcbWYNem4VvSOyYex6+l4BpBx/VH4IfqwXqVKPwsEAIOyIAZzT5v9u+1FEdiTGK5KT2SdqeClPjgA8um+kd3yyr35YgSgAdMAZj8mEpzTIBF/WBhNZPwkMmvc+kIoDcq4AFvAv9JS/Aw0vBpPZmqeMtrYwWd5DWIf96rYJdjpblm/5LyGhbITy/Jt6D6v0gPljJlFS44X8cJnwL748s0xA8hXPXtrPemt8amnzXD0Gryzb2guPpEKqhde4CTomjWZCkXt5ddM6PbwinpSO4m/TVCKnLfyP11YIv1WsK6oV/8ZhOol7WKa0GbYPUuLG4usTFGckutEfCiiEfp0iPbcfFjILINYvG48ECU4iNSSO55ht4qj3hXM8NESptAqCnUSkSem6pHmK/H7/rAt10Ea9T0lDLR19m2g3BhQj2/oyTBeWgc8E1nAvHjjqS49MmZ64zVlLI91TKQZhQeFHgm74qrUpqowDZNdM+cCSmZUP55bUr6Lwy+k4OQvNhois+1bgu9Jas3yP+ci1hfFcUHkgcQ5fTLX+K7l0bIAgRTfkhZ+lmyd8m6mfCC1D42/S8a4mUY4s4xx+rjdlEEgxJJXpYCmVKxwzbmj0lP+xVf8Wd0q07L3K4hvsuUQDsF3UtPemm7khxYs7DMzjW0JtjQaME8ywFpGJABhIFl+H09ZjgSh9AeN7mZjDDPtk5PplHc5NUL7PwSyuLLZly89JWrqRsCFko6eUpPdgFeSwQ05kERir6dCfNkBapO4w8tJy/PuKb7cWKGuCaRTwnjV9bsMZm1b2mdj0Nagv6giEjxggaAtED+h3aNxT8D7KfNz04vDoGbHix0/GeGFjWGv4+jwkmmZG7/URH0GwyGxAQD6bwImSUkNPbAROFctPQ9VuEIELHh1yzQFtv91ekmxIN2BGwTyaOSEFavQF35PH8HCb2UCnY9yjrK3+ES/Gx+Umq7BkgePfbZyhrY5gzPTIkuV7qVgfF/8XbNX1waMbREufWti06OZgfbrrkAFxz7cKntlMKWUsXIeXy5R0ZaH7FlWf/Yf+F4MXE8wHrGv5fMdNZAzfHCWHf/UuJsPp5MRS/xj2Ofaaj1t3aPlO8FTzur6sGpVTFuSwA0gZgFdgue4KPKO+TgZ3Di4xMKjX8dHvxZ7UuTIoSv0nVpcdfb9wWPYI+VWidHbGErGPNlS48NBV4LM+sq4B/Be78/PBNfI6zv7RPWJys2vVnRSJVtXV2jh2ggbClw08kiqUIxY7YscDbdqrgKrCWjlEEXm8FeWgXXVlp1doxxSG8pDK1OTQQpI3QclVi26vHvSf65w4RHUicZa3upJG28GeDYxpgiH5kgNiTYrceTOgRcGoC/Gn91lDsM3FUXL9m0+q9TwKFjQGuwD37D2j/PldDTAu2q34bYDoZroC7lgENmrjFyGkvUvxakesheLB+pJ1w8zAnyqn+AvQ4HChhUtv6sbGwfXRXRw+HVQo17QT45en1IS1fS4UcNxrW/WBAIFxTWsVvcBdp6Y2cY1h8opnnwpZ+2WgARx8j6JMcqAabQcn+z78iuzRDMqYpieR1XVKzlWtnOAVPOwqqLeEvT0ZVaT6mXoAZW043YxFyHwOqUjqu6uj8u+Yje4vYtv8rGgUE97TFL68dWlgF13rFcXzDnQ7C8GJRlWHj5nHtGEA/5xPubXyROFbfRgJgf0IF3U0Blg2Jx6LZCD5h/xFzkONkIu5uIR6VKjK2DPEJTb81JnPre5eCbu3VjKTXsZtqbR4M3MOlADgohY8gzPXeGuTb8pDXMy52u4vOQCNxr+1d0+vWSptYLGzN9Hgl9zXPgNiA+wQsmLakqeMD7PVRPws1w4bO7CDRY/m0bfe0Tam3X0irpoBP/bPqWDVumTgYrEuUZuxiclwWUS4jHyY5bvQqO7tLkcjjzHNiFy1XidYqXbCFWHFQdDdFNEGJeAVNXqAEq9i81MLOLuw43LNdz+N2cSNkfrp1DxXQlgEUCkBs1YNcXqfkVeo99blwbZoqlTuVF8AxlNRJJZ61uDUa8bjmCbWdbpodyo7t5fGCFZLk7RKZFwBS4x/UKFAkrGyjZgLWeutKnDJeNw2BDNu7nAdPN74Mz73Hecxz9R5SEyQuFJ0NAYWh+Ri2+qGDLOdGV2YcYXVWHaGDgeUCOGr9tvP25sNw1tfKKWchmE9sXuYRYBTOmCw/mhigMKMcyiFGI8Nw+GkCUjCLw91ERMIMr+weif6TpWaXtcpQYqm1Ln/0pK2Q1lfa8wsbPHlm84xB5h284NWE5CQxAnuHd4KqagIABKbpA2Cj782B2fYVDS4mgfDmaYSv1Sq5QPnwYyN3AcFvwpZq+XZk/nPhD3eYxy8n5k0mgTBMkYfbDPvIITOblBXA2/ZjSQ+2YLWTcFecVDTH9qm6SmsgqgD64LHFhStO7cFL3O/g9y9AwgwekB1FGqhfAlhe0oSWE8shrhLEG9I3/ZA+ZPMHQHu028O2FigvM9IPPfUh8Mf+sbKLF0wVYhL/SY8XO0FPME1Xpu+uwltWW3NZXCXaqGakwyVuwKy6JyIjj5I6tXGPB7wkEBtHRZBg6Fv7V2dk1qTQBX4R9Dlex315YC1ERqqCdmXcooteeSS4R6f21187FLO2E6FyvuXZAl5wIruDQqLGzkwesOt4yanUg4AAAFyNtmeDecH7+Yaaxax8ivnrZaONoBLFivevYjMPQBmuQOSPVomLT6x9Y64o3MSQ5bDnA2xmetUw+w3KiebPIOgZVWRglH75IW5ae6G3A4lMD4G8EQ4TIBNUxAEOOf2ILRE/aXwM3uPF178M+CsaJcMWeelT9PA4j8QdEKGA0uf/qMAxlqjX38CL65UlYAEM/SdW4RRZUIq9ZAkxVQLwgq9/AhCKYZXS2bB3bPwOe0BzVIDtN8u5jFHipI5+pCZSO5rRvOQMWE4lm0ctmlMj3RJpRRRdAouTh144Up0RiufRvkYM4m2FD6S47xfYUBp4TTXakFO3R4MinLS0s+foleQgj6BQvKLeyN6+n4F7Xt3aCjJoCFnBqB1eHeep/yaYzrUYDejY6XAZ3/7LOiEEKGutj0WQhLE4uXz0k8BVYTrw0X/luH650HaqwSlVC/QefpRfz9WW50JgF9v7HTYhsxNorHfosLYVu1ISeehJfn3Iet/S0+A/My1Mu9bSpAPAok0b5jk7wdX3YAybdEesgHwHHXb2pbiIaQmna5DFq9JCGNaM73SFUj/Wzg0XsdTl3cGJomin91/Y8C5ZQj9+WEiqCWvMVM/LznbOEDkVFQUEh9Da57nPbwewYhrpNYgng7v1PxLB/oZwyVrLJWok9feEKRNOHUcbELs62SYD8Xf1bzPsYWyZel9/wne8Uj0f4C+BTj2vL6ddK5YPiMXzxb+IUyCdKSSScU465flQOXv1Fn4OtY/Ao3lZfKQWT7uBFJC2b6V8Ej4CKSGjiT0FfKgM1AVsRqBij2+sskAj0i4Zmx9jwu4/O23pjlw1icCIm71w1DKEpI4FO2ppdDY8aKZLk3YcSAlN20vy0wzbFeLWH5Ngw3yElFXc9YgAe1nbHgv2qfZyaddkD39QUw5dWcSiw1NQREe8ST6yUumeUugnDtZL/ob0pnxx4emQK77uEsK88CEw1E6PG06yeyfnRGZdStq1a9boTfTyGQlejXwHS54n92Ztqe6qkvwlzmSuAMnLgl2W5EthNZaXINdbspP9PnMWivL/hkBPNyYo3OpMc9OcK90wlQAUb9m7kQcS5NKlJ30BjPhGappJmABDPkPY3YxLxPlssEL1evT8KQr1e/xXdihPdwBV3bb3AF1DRbbPWcgJzZsAkyATopLzq/EygqSaacYZ0WHGXIfzI8hZky0cdxQfcpxA8kNn0f6e3GyDEpAkJaKDJVef+0TAJATCzuxJaV5cfjnXSJTUkXmDODR+mgdTfWi/s6BrjN5Mye1IUT7dqvV7PR0M62jVTUTOUgn8axaIuf9B7X17rTPld7F5KFitvyXdXraJ4PkqQOu+TDZY4pYeTV8FDifFXAuyaM4EC1/Gq//OqotuD6rXPmJVGrRuO7DFnF+ROHtBhz0TByuzNiFhvbVH5ejb0BRUQdEvfFHPVygDcO09swds0szdeB0eMZERFBCRg12aJ5s8X6Eqkc6Vsz9osYozV0OXyiVrxoYLH6wDwPxW9wH7HvRodGdaMVr9qxYaYvP4NOYl4YdzjSCz6zGMJ94+eHXJTGSo4rwN5zo4TuoQ7+C1cXzNQPuVN0uvpjOfDEyc3Z7NrSUsEYjCKADCIUTsrq5kJHXnGgV/EFYVmrNZJnLsFQs2SLMY5zxzGtUoawkgnj0HxICQ4FX/ytKlojXYUhASVUEunDyVMZlsWUNWrCcJHAx2g+C42fscY7ZJGaRX7+SocIp4eTIiwofZkDp92imVWIEhlgQ8BEtJjeaE46s97oKwn1SKypPhygoVK2JMcJM46D+jxGrPLcmSzpE+WxIqk4ebvNot9T2q5ovaI+SeskMdN0sl5fmWKJGliiagXfL3Si3Y08Qxq0WcYea4JHEIM4FYflvxyd2PXbUk4o7T0gfWsOR1JfTBJa0Oj/ekGT//Xvsaf5kVJPuxQTSOXsLGANMpEHR4C14ypODcz4RFKwjSPXTaFRZl/cEvA+u8JRhqmEXoeAL7KLmd56KETHB7zxV9Bm0/7qg8bjJZcTq1K3bttDpevk3S0EkQ1n9jm0P/qsZdYmuIoZzW22MCqbNE+P03i7xCA5BxUgITf6U8yb4xv8f8H75PRh/i+15H50U2KenIev8zF+IchSDRZZarqbIfiM8M5E1Yjy7x58Hc14spcRgN4UbggzhIjxoZRc0PCvipHVJwgC3Qy8c/xoJaLaeQUpAV0X4n3oQWXMDwRWPU+HIe168SoXCVUrG4vFg3sLyru9Ymq/gZSx8CK240l00jTw6D3hGR1lgPU16i/uv2Ut631EG8OUXRgJTjLnvl5UXg4uDPey6UyMRC1eGQm3/a+XqUgvkBT1Sytx5d0qN6A/NWsoB6GsZzH0i0442txbkxXq7bY1tAhpVq5wYruojOKzTT2C/hEsABWCXTlDLhDnwUM0a2eQew9xSeyhhyJA9EAc+KQwxMJKvQKQzIyNsPTXx1BUSu0VeT7s/STIWDI+Vqj/c7ZQGzu7q3/eSVfzJpyuSJOdDEbQjh774ONc1ixC+mwk8SrZKgdXrXtcOTNLpIludFRkZ6qq8/PB0aLv2xSf5yavsE/Uigx98chEMhglBgjZjPuoj1AuOZDJl2hB4Q0nYj77e8EjruNSepqyZa9to4tk6uu0g297gsgnCXpqFl6Cb5gEz510wt9St2JDMoJmOPXalPzY1KWrxSs7mBrfP2f/28gduui6wB9+B2/xRMzc+a/m0FZbhPAYLESQLX8aY+K3/xg/wcSrjMdXB+1nrZjatsFbxx5VZTktdRWtYWp1b4jM6t1tXVNd4/6IYHKurDsNA9SVUg+3bwwodOxTB6BJH+2N80xmfAKPaUIajfe1vLqL9fRrcQiHeh0NQqdd/vEBXPbvGVLwsDzEu4Oz1AWnUAB9vgh2X/colKq7vYHFRZpXK8tCnmwdY+q9yyFGfmnjWoDHiFIECLebMslbZnwdfErwalyk8nSGz9wg30wS8BUCkYSkKTjuMtXc6Zohq2nnkDL0Qoxyr9VXjvLNvs6xVQ/1KCcuxT4Ft6IHYOqNYAFndehgNrx4rifekrb18d+S47UIHei0fDKw5Brewb3NILTUdXz1OQiUuEDicw+7ON7Ga2u/OcxG1lSFPqlK2FTtvEqZl27Te0TpF/4zhSjDevQjT4ZlHp0zCd4hoVfEOSqkQx4g/cJKL4oRiGqLEwhN/hU0lt32c7sbRtcfbokipJQSsittzmDKhKKxF9ASbLl0gze//8B3kYYUi/6qraxRxAzu/FjfB8OPRpt4RKDS5tgZX6Z1R7XyR6ZdREl4C5Q2ietPfFXrVX2A3alIxfjc+4MXaw8dYOhFArkJEgnhtTdyffcnqgSgjH+9UwkfqYSxMgAwYxoCCEkLXBsVb15N6moqsS0ye1NENyg4UMO9IB9/S9W6s+QJNOGf3rpQbexXmwYgbsz0HbE+2N3Z8c4qyXAJsyEDgy5jo9hzaAGO4eSkurKY6fq7TcNn7+a2sW0p1liE6FAF6QKcq7a4Au4Ri7ZUqEX//wzT6UcLiD7UF8ThA/Fb84vlnV+Fa6om0WH1or/iemq6b/uXqyMG7sy5Pb/vw2kSXWWRNrKG37M6TtTq9hyo7x1DXx8eTYuSjCiM1AB5mkfca1yzHEeL7E+pPhtNfYBQ17tRJfzK87DSRmA6LRCepxjcBELzYnaJ0+CJjbrJGgu6CATsxYoX/ihYgsuMUIxhdsvXYRFGpi2Bh2Q2CPjCLJSxENmLloEWZx/XgTlgeGtoQdn+2IPeJy//oAEqSAo2wFrF/ZcJcI+/6RczpApYTAK5BKmGSCeuUnQgN6a7tSTTItq/sCahRIr8aLzTCxg/laJevcy6BEp1/FuyNLPPNYWaO6nRZyBxV9c9yvajg3Rk7EK3UkiuGG89YzktDxkJ2YYyulHnbb5CDm1Ftp3KEpAx20SXhESH68gFdICF/Ryrxg8SQWthi6lq0ftDVTE4bL3ltzx1sHHw0HuK7O130arWnTfP1pAeFzq+QS+Hn0yoiuCUkK+3Gw2FGAFS1E2R5l2uRr0jD2i89Ovl+ohQOfyzNXzO5Zi/y40bPqqqvNwoJnCp6aZQDwfsHLuju4NZQQF/f7v0wXXSBfL+5VO0xenkXvOI2gGNs6FlvNPzKwXKn/wFPiqQOvJ8wJrc/VsZDTuIkwrzzeNruyxOA3CLxy1pWV7QJm7aFzstpy03g+/KWveV3IpCwio2fluX2aPWO624rf+d5iLiWiH3Nzoy4D0LYuBdNZxKxXmeW6Rgv5a9yk170+MGMeN3ax1mQONZf3P2Qj4cnPtjDKlUHih9LMSr+rVl6OhHM0JdVhKteVwAw3/2neu//7mt+QGcs63GsxAAHRU6myxXQT7zz6zZCknVZvmJXTYNRMSq3PouZIMmsFameo0OfZfGFmijKjQ8gULSTq17wFrdV+lwhyOClFG6ndQDcONBgmFOSd56GUyXEp3QfvX97rTkZFr26V/bz5YOmnYfwp2n4d2zrYfMgg3LEOL2alF/3osAs2UpmVwAC0c/iA14gKy1adEYSuE54jQRztOSVyhzJVsqji9gI6DfNI8U+HIonnPBXrOJErw2G/Cjg49BEegMKBuKmfRWXqIpp0GgAAOmiaYnYBV+0z+DBomCx12ANcGhR/PS8/5kahvlP7ex8BNznK2Ok4R78HLkRo175U+hfYWrHDlSODuZyGs8vaNEq20UbCjOJaTTpiuCYFJePHpQzzoQa3FujNr1/9YeZq3KYe4CJL2eIIecEkOJE3Lg8OVvXTO/q8nqhHluOzATgsOiMP/SQTJ17NborqTblYlhFw4vvynbm7LGUPMnyEx//U2w1QlqpJs2PG4aIR9gmOWpVToyslv7JfI8ob3WiPrvPSRqM+vEf7icmqNxeyX9v1N9DfkEcfdXcjwLjOOGZkzApaGt8R0xIZL9hMfXHDEInY8jx2OJrnbM08f6iXmAeDd9qcOjd/wld8NlieRO6o9qjg/tRjV3qoyBgFpgeBRUXnjnFROxytOxE2Bb8sOqhjGIrq03J1UyksClFKBPuWHfLYZEXr7/sud0IWdzCvujqCwFTSnXN4UYK+yGSEap8/Vm8Y9zp3VO1id7zunetGT4pfGEwYpt16bztvD8qVhlIlkt1t2mzaCl7QJWiozsj2gq0Om7iJOjSHdpAWnhcPdTbAiL2SvbbSheDkURs84XO1O63N2Ib3kGvq7Kc7Y0W4LiIphk36kHHDrcg2m5dv66A5ic1lPwtDKpxZtiy6zKkqwe7aWKhFnBI/PEdxo+Lk9vp69bhRi5IR28N8ZPonKCsDXHEjnxF1gJdglvRdm27TmxVAhxNWaKAhYUJryg3Qy8RWj6m7ai6zqryxTtjJuwXqc/hoKvKTL0ngGtxbaLNiH5M5ZNImcE8VMIjy3xO9D0lvj1GT+5rY7Xd0E3oPNw2AQgdV3/CfZkx/2meNYO0xlt2DW0OPp+L1MgmyXq0T0BKnAL8SEhJ03iXGwmnCFPIBGyph60xj060FVxUBbK0UKv8wqMQZ8fyz8ljA7fFM+Mz655GDSyJcJERGE+UxIB0oc7Lul1GZitwY1RJfUP43OFozBM0CmP1fcGH5PQwMLE/+j72LebWUO0hHYyFUB5Nyz3fW1SC61PRohnuxRy2o7RBNEHeQomQsQpyHUKyVp6cl1H4Raz5yEgIiBy5ItEGGYIqRENKMLpCumHGjX9u2DNpC3QUoGDWEvt2Psm7fw+oQ5xtNTQfrXsMwPpjzUbzo4HFe2eVySWlT9iO5Ms1DC5aoPUEMOEbQtXJlilPCW7rr/9EPGK4WFvJi1zob9T+F003DabPjHYolFTvh3hXfy+mc5+YlEYUWWVTtbxttisQx8NFN9o6U4TulN4wQJivfFVC3cpFxPfflAdZzl2nq2qn4D0EVZuyP8MvjYWc798iqs2ky0KjbEXNmW0G0uJ1h4AgE8XokprSOpimyfeNuaCrRUxP3j/p0IiO/LFOh168MsuLhfO9bFAM8Z5tHb1y0GUWFlScQJMJ2n5qa8ivQg8H/ImkBhXmnQlMpazm4VfGAN/7x0ou5cNtuZGARVyu8ZgK0sZhF6n1ixChkJONhRZ6XdSTzWS/BeqlyoaeG3lG0+2SgndnT4jwABqqPhX2oYwIvdY4Attbvy4DmfnBDJcAodhPq1nGhWn+uedxm+4/CrvZGNJaurHOSbsXRrUFcqo7iEwozsONF0+B59pzNmuMdINiU9CTmHZmIGy3ePTtpeqhoIc+6aauDIbW0zyGki8AB72/YufSyhgLq11rjA61uTRi+wwX57RgQqW9+XGGBO0B8g2/588/Oalv6BySjU2GjqRMrAiHn8GhTsY1fL1wBSTJIwSusg74OMVaXjHdUku/nOtwSTm2TCm/ZlKN8nPiFbRXnOltCL9YXT6x0uOpvKdvp/zci5XjAzRbtpCaA/apkhQxPLQaDcFt67vvK1MS4Ab9Lsx2x5VmN9ujLrNZe8QHeggvWJOvuhZfvUlSUy/exUwpkNAOx3v+CTWzlFZO9vpJ8/6ozAr0Hw2UZAPazhWuvMsg5UqksZEpHvIxZSKw24X2bLsWlFW5LrQlc/tcUaf5aeYtKk0oo+Xn5/zwlNJKUrZGTtmqzMyrowBKGsE8+FysaYdv9wqRWRyn4hCoICg+fYQEki9kAHLgSMa3oojHSsUxaxc/0QkHv+LObxDKzfSIYtdmTSy01SP2e9/br+7QtCOmGcSDeJD0hO2QDsADSKDp7KDT1FipRCWfY9kj8Roy9oLHQLP0z59xdR/OLx2F+EoSqI0TXh94nDeswGcYrruBwINCE+5pvmJ91I5VC8MtF7l/4+WOZcciECoD2gWMM/DlDQU+qUwnGrwciGKl2rXg3MPxjdbSFP0StPUs0RdHTFofluqWrsrPWim7oHs86zrEgtRuuCm89Va8mpej8zW8u/JLMIjef0vQU2Ki2lCG0egd4HxQKWkZSh6C5/clKJ9+w9DTbGYPimES7D8q//so50UNjgUM5jO3+o67NRQBcHSoO8y2wv3UjOIXgKd5NdVt4Fyfe7VZ40c+IsYICP68L4QzGQKNzLeLPgqqLuyfgwHCRZBikvePr5Csfy2peCrhz4wyNSt9DDKiFAQXuLBGLSulBjpqPj4UBOEZHfufRDTM/sSiGvVj2hFU6tktk35DJnlvpT9fm/f1W+R68qc3sOcb9NkQTEAWBJn7CvSOg5XyX77Fvl9uJqIsz3ShP+riO5KcCGzTzRVycu2Z/A+Y4YgmBXChJTKnL+DAQDhDgIQ3fBWm0UUw79Tao3AKbEpzNzYBdTDHLzxPHTbbH0JVy5AjEElw+Aes7haU/0HuXv2UvuIXDw873CnHmBx+Ga4H3EP6gGFcaj3hdWWrV9Za3PykEUNMMpdWTdJuZCtO7gIcJ9+YcuO8Ytqdvpu6MC3dv/ijUp0byRt8i+CjAGS7c5CYJplTw9WwmkPE/cYBMfYpz+Xg3V//W3mtTKsOh8aX8ty8xcuhlNn7FalFTLHJ5o6fYsJTaRQHBXdBoNEfiYKHbief82l8LaxJY3CVoI/Zr/LTQEDASl+1nk7rWcbhml/jI3mxZBFo/BU7z9I4bg2dlLWRK+dvjXUj0pWftaDtHiL1YC+JlX8Bu4O+4AdopVtItFxCKTphwykLYufZiyLIPOURxAUoN98SdqbpV9ywP4/iVs0r5X6wcYZ/TS7ukZIHWD4x+EACJ1Ih1ANf896YDzMbmfsXdGy0UZYy+XTOdqvw7SaJeSbW1/7+H6w6LvaKXa+Sl3i5u9343mGIQ9YAQZghOjv35tMGNaNfVsYQOVFY9L3Yj6q03KhDRbRuZRNeN/YjUHr6fODgog+ih1Wzyib+ea1uXUsS491rlPABRjmNTRkskANlu936Q747j7tkOcAgl30T3sTk1Woyq1q9NdL5cJ3JuacgVX4Ytk5QVT3SAK/cvnWKqU2Is2IsCuz1Eq2US0RUZ1RT6G7adiYUXDmxZQhuMJI0Bgvp3ZCNPova/SIm5u+Rc2aCvu2UaSdhfuKV0U29AcYT/OuCRIMiuNkwUSNmeqscZXFgUFL/V23SbnBAoTa9sf0BtYs7i1PgIbjbteYFDkatwzVSe2PtQmZhFHGTG50RkWEdzoc3L5cubuXNHbzbsuI+bmXSh1ML0e34skZitQcRV+7Q4ZtYciBh4R3Awu3BjP/6N7ZPfEqb8VlYj5NosIx+LX9mduH04M3shQYMn25f3RYXlWuNOIQKqjWO5qhs6eRJKF/hFJikdTUuOFewXprYv9viQiJFofMNEGg6fm/U7BAhi7Wp2HnmDg8J261EFS/vawys9arS5yp5nFQvUXBnwoqqAwX3WUjHZN7V4MZ3r9NaJCai0cPVkkQIb+sV14QuOOpzpazq2JcvuxZdmTJzRf3kCgV82f+lsEmm7pMBHDfeJY4OPnAnbwZukH23FAVtDFGJBs0c0MioORBZ0tn+a6/zqJP/cgR8vtiRpXW6UTFkuZm/ORkFCq7P9tU1nGKj9YZ4CadME/wUEjgebLPAXZKhzke22bGg+0rkId8TmtTN5J+7Fs5jG05In7WYwsOLx0WXxsVLsWAIavB97cn2/jjZAcfevWD/RHnKyA9zSKvxbdSNiaBhhbcJQOoV7kE3gbC68uAIJCJkoGkAAw8CAQ0cuIfT9movwxdkDr85WKDCRfSByWveCm5/3J71iHVaDR6zjWE8Puuo8JB4/3PRqkdIzK932UwnW902i0qpgjOEbAVFi2wKDHz85Br11WDF3rvLswKnzgnCc38uA8dqxdt7cR9F6kKBOqa2d/fWuoQR8qMAfrtitmpd5LQRjECpwa1Rl0VXwPyYDXqI/kgazPpcoHEtmVTBapWaKKu6Mgtsb1mFlgisyAuOc0VKaTo6VsTAdBuQX4YNWhBI/uOAt5kZxK4RQzVSucdmjLYaUAt0/1sbLIwpgsz7045qvaRl1S4dB7tHBBQNIuUR6YNoLi6+pkMSMx0BlAsyrYlduC9+1nPC3p68q7M4Ycd+WOPEiGVOfb2cLDF93BVDCy+MbMRZckBuiZH2k9weSEZuqZSZRlodfSo7Vq9e2Wu1SfU0c0ZMS5/Np80HUNLwtTlC4uOCFfsQpfA9NZ9zLiu59lqEXuVsCu9AdXWX9u+jqrlKoXQ3e5pdMxPhGOPLJt8vsOQ2euNJTNUSaa1xsE0W83O/sFj4zNLzRpE8NgHOALeAF3wktSo/YESy+u8PWsCMhZA1eCV5xJnpODn1fCYw9PS8Ym1dNJdPwZ4Kg8vb59nWK0xzXrtp5og3TRaPVAebmcDYpvG5xjW/MxD3WIbeTc1VCrF4LLFjzXVmtd3SHhmDpouANc8IGQoK3WKXLDoGt3BGBFMIbZsw5dYK5+ZSAloogYvSSkiXADGqqDTHEJ4l8sM666lterXsmWAtiWmrG8RA5YcFj7ZO5AWEcrjUhK6jSL4HMmM4TCuhM9bzV2pETooieRcrm2AVNUtX+M/6vWYyZ7Z12FgCYSSP8wtm327rdFcGKNSvmuHhhHzE8p2p5PQV6PJvybndTOGw6U+1GaIHNkbXypIT/SpqnPLrr+wUKKux9rSckjfaRxlYoT316/nA7KJtbRamyP9VVGwiaEY3X4oETWWcbokbCCkY18Dl+mU4ESwc/VU/yqGJxRbJgHK3bffVEKQ7IkASDZcuz5cVYXJEHdPEka6wI450+t8oi6hUfgaNNyJ+4+H3181DsGf0bb9lTrQymvOwuMcXjKENhXOQdLyxKDsNXRC7wktw/nRkIm2/H1IdEapwNws2fN0k69arXoAQLbkpwZAkG+XOmJL9BHtAqfndvuoydsJ5p1+MgPcr3osRWgKiWzKTiEmyDsdFuGns+99hvKQMTLAhmEkizJwuThEjjqof3ya2vZhjmiyZ4+vN/vXuQ2K6HKwbRGHL1bXP6XujDpIXp8B3DCSmjAltT1WXuiHIvZHqsrB/qbZ0UXhzG4hTpfzeNH/0J2xwmJYUKRWFbL04r2dpwFMAEEnlJGVIIjYyXTqa2Q4nNaLRwfdogDMixKXVhagM05mY4K3Pmvv1Z6uY8684JaHcTQGK6Wbgnqsv9KcAXLVRSwU0kVPzkvcsujWMSoayLOjIpIP415FPGQdMOZ3yKcL9ylhVyqmEHFjo3HQm9YFjzTpbGwZxpBHA/sfBxKns5E2P67RJM27osM32DbPzYCFdBsNTtET7pJQX4cx0XnqGcGy2vm6idD8G7bSVOzO/b0Zn7EuqiEUEtL79HPG7Sgl30bP7Riq41temuKmt5nXV9wRWNwgKQn9hFJLGIXQYvg4pfUhbmxUS5EkZQ4xUouLapsuqueAeaT8zdMqYFg/CY+UqBYLZxsERHZwr4vi1pYo0nm5zKcb7pu3Bo5RmhivFocIDsLidM/4t0Nc5IBBrEezevoq0IDFoa6nmaSbvN6cXnLX7ZI0LyEvST2T90xov/ePEme+d6NgWX8q+Ei8gfnqye5OO6SCgFZazu9iaxUiQAZJI5kcgXl0xHkAXDhV+ypco55ztWvE/TyZ6v60ienUvhNu0XkzAjSd2h8m3dOq1lCzZnsucK/+/grzBLA81qQivkjnBQ2JttSh+SNjcfAxAY3TCReHgU32fNzz2rLJdtl0IcmA8SxZgN6fKewzg/zrzkctzdSZePf3KJ2PQ3q4rtzbDRNAkVIV6UAdGICY30l5Sc44sSF2TkWgC5jlpndc3XoyLCwRtq0/jSXw2+I+7fv0BtgJtefqJw4BVph5OTb8Knqpwjg35ypS3ewLxfjHByk4s7BbPo3ze8Eh3WedWa37330E86vuOm/YiS3Ku5JfFWHSu5KwtDytTe1i3u4H4dp2pQHBaBWB30RvZAqvy+q9VnmxYYfIYILsDjjymtB6akhDwLC5QDiBS95SWrXXHOl2ko0iUX/xH7shjdRMWJylpsgevxtXUx5CrJrTMQZ9Z9xpO8xheg6QkDrcquKUSYspdLwHpmGfm3ukbvdEW3uEjx0ckYAWo9qMy0/ougBQ19lEgYGm+Ogj+wZGyDsYR/5rx+hvPY1Ux9TFMYF6sMhlz5it5OVxM+xqnNpNfjahuDYIzHPSyEZ//BT070hEQKB75mIR7G5964tEZWXr2VxVqULi+5gDw9vbSyMdJMcNKGABA2YNCpWUfLmwYlNIKIhHnCCoQOngcFoG7qOWwJQ5Y/cahYotWPZM2uSm38UhfT8Tuj6ZCBF9gP/AibwI/tO/j0t1F49J4S3I7YWDNX1lVnsqbD4Ff03WDsJM/Ab9PAneQN7V3stKObWgKDc7SIuOkf7IId/Q9zl4P+0XStBCFyj9Z4k5vEqF3hw8HfKBf+RciX+s2+rY/278+Ib9+chtUjoOxT1iScqACFoTLmlfWS9jMrx9GhQaC9pmTMH89xf63aofYOH3vvlFTAX/olE9jcEe7wBbyUTVJtJx9XOdu99kecQeNWGQbaVEW2oope/1wsb3JcenRfFpti3ritmGdKgNq4jWiZ7VEqWnNLgKWcmhllW9RAzN6/XTk+s/1f78RrAoVXW/hX11VJ94dniqtt1gvq8/bCDuALvkb0xsCM2s7jzTuXiMuFjKLAKppXbnsALdmhM1EtebCojSP3NgM/yloz8UrtASvm31maX5kenYRJoLdRCHsa7lmai6Ih28R/4KyseF9vODsZHGL0/p8tqLio0YSg7VvRLpmIeg/imzWsqW3aCPMn0lzgi/IqlG2dxSqvq1dwTgBd52ajiDxOU0voG8u+g2tsJYVCGKRQF/F4N8VRyfJmZh2LYN6qwGhQfLXP9Q1ZAMy0JvTX/dHwddnOnyRBndtKR86MZxgVJNCG1Mp+19ZUMYtf53Qh37nj4RNicisYngXDd/XKUJKps5cihZj+PtjdyPrDwFhRSYYjzskimFWl1E4Vcc0x1YVauyf7dNCejDHk3RzBlWVpugQ9glc2zMOjz5qg3y15aU4E31bK5doYHv9pFvRaXt0Ai4DLl6IEWmp4GaG9xy7wLmx/ODFEXcyj/FsEk5VxnSunt81mGyGfSmLXmcD3WAAAtU4NTyGHsc6pdIcjOmnzJ6N65K4SRHSsfd9QnIxEftarSHtl0a1lyxx20ymRXhrcnhWzcf1TNfCZqtOn8FntEQkL0hfUVYZ2jigECkWykjbC/ec0YxsR3l2Popsrxqk6y+QRPiMuV09YVU4VS8Q62hXRHOjjLcf6PyxhffjtKYf972oI7hqAM0suTQJislUSBU7+26k3OFn0WYgrIBQYbJbx2Bckpbok1jLq7dEcRJ/wBWx3o8ZKGWP4IQ/8l+Kt8BJirzbkOV6ZEUrFPZKlnVLPZhcaE6XPuCR2IcSrSSO2YQeiJPAcFeB5QxyR9PBZ972G+sjMcHEqG7Iyf8zMY+WQj2IB7xuI7J7o5rj6q0g6EJc51s0nYd6PVnSXvJ9Lf/4aEPJkTRHlXrJSWisxLFc4ubQo1L/iz64KhuNXE8hXmKcIAgM6aRnprf+Iv+eTwQp81JEZyGTI07I/5JbGURdz1odMki6nrGoiXJyJG6dxWkseL+NWWogO7kXTCKdJ2EWZL9zRDaqQ5udCUOog5xTs3lgzK6GIsHJW2jzQxy2hTQN0ELD+BDfVNp46MfWFpQubk7Gh9jJl2PYQPohouqLneMjEXQnl8UoSJpEPdl0MNhhjeqjG+3fEfxXqUGb10HmMqqr/G+PDKBE80AGtZRjyddf4GgyeSMak2ZjeQFLdMCBdIJU6SVvKEswpIeYvJMAyE61miTuclEpUGU07+cYAAgLnXS1wY/rt9dugXgIFFo2KJsp0Vt/DbZho58urrFl0EXxWM7kH4L/7VnoUiwWhRsvuBLECYWHwctekrCMuDQudlHe62KADuMFQ+ZwYta6uuYT65t5Ew4ydTZ5leqI51MzStlANQ6KBJ5bTos0PZ3jvbhYpM/uiMJKYKLoIzlkrHtd7zc0E6wTD3b5IB99WmlW6uCX+qzRvt4+dM2TSPOJ+PN2PtoDO/cV9gNTqxn2bxLTXankhbyQMjnn0YAoA7WXcqdreWldjRtjPYtyGxSRD4cfjzEVVs7hWNubQ+SOWMjQSLhDiToX0NSVWV47VrQsC+HUuEiZA+0z/Ihs3mmdF9LssJW15MgMQuKN7aUU9uG40SzF4vq4fIJv0K+QUPz20CKDZnhZxxHnFWrCCZlCk1TsitNVw81DRSxewCTYcmJVDW3AsLIcsZwX40Wd7epphhubrucWiCMMy9sPc/NLxJlP1B7akNp0AVOe3GTZ6GNxJFLQZ9ATqhA/Qd/65JeSJKmeZsPk/eOoaQ3B5nIDa7vpVzHi+BPWlaeaaESgM8oGlx4uKHZxaQ2iKAMhv+6xtXVGHTP7JvP0QqQL+OOBXimcQeq4Rzw0GiwULGkUqHzBku77ese6htBx+jjU8mTgr550RIru5HIf7OHxGs/wjcJwwvN4gyHA4eKkU2V7iqPrUvyZcgrTXhG4rME2xj10cEOjsIsvH+idq7jNAk46gZ2udGiX5LwYnXc7i7CCSobqAyc4ppc+p6k2LhNtD8PdOgDMzkPF4BQMFa+Xyo6Wfn3OLX96ga+EirozXNDuSpnVB+OBaUujpFLdtrRZhYfRCWiCMzMIdNGpYgwE+/hc7ta1Lfw2ixv4VSxICtBEvGKYML9uDHzDKWtUDLmk571u4IvtZzpQDf5TwwZxigm1CSPW83zZBqQ/aXsYoY3N5CQrq5Go3N5wmavCmKqK+mk6v/CUM0sh/5ZjH4XJ93xeov4bqMNXteKcZiITd57AWLz4CV++iYzSCrvaC29mTYmZ3UzQR5/1HuvCe5DTYPD9F7A2MOnsD2U1vAZz3n1fTbZyoxDvp7khtkVLSofmDizbqvJ6HWgcCwNltwyWzJOY+zJp1++vNSo+KYS0yKyVyLqGPWKqE30A9XPWPJsdG8+c/m8KAEHagps7WKM1MIFqvJSYUoUKCPRdzsta19BQQ5rbjDpTruiT7tl36L2U1JHKTAtZ2Zzw6y4fQGNegPMdOQXfnB8Gs+9fA/dU9qEfcg6HyuMofb3f+uR3kccRH7rrnSSqK0g9hGCkgXNG+mJjJXJfdvEDiQPWXIlLoeRsOycJR1qu7MEd51COizZPJK6UA+hT4FZZ9N1B0qEGZdXJOGaWeTgUmw40cVtAp2kQCWBfB+oixYa0+vIiQbvJUaDPaWePOh+huAMILhuSURwqmzhzSGegZnZtNz059E99F+rxJOHYpzw0CyRqy+C0MRwwHnoFferJImaLGBcnF9lUyesGrDrdqJ8ExSJLR9kh2WRxWsIMWoZhRyf2q5T2WPYNHB9M9Kljw07reaatg7ZE3PuBbIf1Rn0LTyr+gK2hA61aB5wbS3UllhW3lexd34qz6Idax+Eqfmh4OQjmeflZ0OobmpvVeHAU8JUyeDtu3K5HVxrAQZzzKjhq15+v30y1L/6y/48l4dtneA3ZKsJ0i95+Fbt+24AB1lodHHBwOllBBuNSsuc7MA/+As/Z0RBzxFE/mD3WSxzkh/hUlqFiEV0EHnQz7zQx9uTN1Ry2I+1doctZ2zCs5K5Qv+7KPtAnGiZ5JSqV9Gp/eUWW/8zZdsJOB4LWXvWzUfR6YCyQVLXQRn9BxyFaZI3u9hjZiVdf3wi134AlMTiOAkTluuleDqa3feEDQdf4WAEcoM8oMA0CZqTsT8CdAAIfHigIAJ3NMpLzjMPUfdcm5bnBJCaqhzH6mSc56l/A1fValigC3FY6NqXKl8Usuwuz/gSb7WqC2Z11x5SU0qIxM4OFZm9e4RQxauC+camfz6KnKF4XcU5AUgfkTH8DB+pvifzpggEVjQWAZQydVtn5w0HVTeOk/HwstWvToleTRPndW4bdo0reXSaAeXoUsLcHBlbHMaMJZmU9jOSUEcNOHK9u+K/fLKS91RUii77ZSX84C8ojZJcBI1inXN3eaJhtLdUzQGyroSOTxNsXFLeukbYF9xMsrGL+oROZgTSCarLiV0iHLEOzT1We0VeNsE3SGh7cpRkhIm77Sb/JBWrsAqAsm2MTREPbQWV75iN8D3aa5d36AAWWrnya2p195aNpkFxHv7eQOYqaC50c0wHOPtbJd/Ql0kE5sWQV7hvkop3rK+3RQWhDC4+UkStIviFXxARRpNdEz07PQLvON3cnYDuR2588aU/DtYX4hn5WP5tdgK8PpXio+EHWLJoKpsfURfIA9HVqVZjtiqh92EET2YVkhbGBaFdPeICuKYqJN8O5lOLYF5413wHvC7dwl0SOLvXCL+wJyA0gbJp56PxCwWLANDvdduELtR++k0MA5hmvNJcO3c+kq4aUzbxG7t5Mf8d2VTH4qFJWAujJKy1UDifQDqI+fs2gDEPXvpQfGc1QuMpg0DFcYbGUjzfmjx2sQqGOmWre+ya2RU0V4gMDgjdnJKojGjQWt7IjNzRb2T4HboReBuqHhfJgFG+w4ANqMgwK32VgnJIj/1rl55qZgJv9oYuDrbCr3SSJyjdVzD9ueRPgycu/hE66RJET3Z1UEgv9cPunOscs18ofDkqZNN9DL7ZfgJ6R/7m2kDbEaEZjtm+3Yk1HGMGoGMY+WRg9XpXycfn9Q7k0P8pC2ne2QPmHxM9JzRrmC3+QswKrwNbgZl6jMRPjNX3rkiNTAtPUloucIlS4SxWF/t8/6DxeF/yGBvXVHAjYvAontUh2a58c4+MUu7f4f1LShLxyfT+lsHJZMUtpMXwhKBzEGUNSViXpVzCJpE0AgAAAaewg9BtkwjX4TzW+E7YvYB24i44LVGCUZviCPCrnnVaMd8IEACcZAxWlFvqk2S+tZA6JnOY+t1W0DbYQSjH46DVt+WZtz6BJN3neaaRPYeYIblvygd3TCu9n9grfUVi5IbF8JFuDH9CFJOAFNgHpx7Fm9EXAV9Za/NKuglgJip8lpPVW9zOAyDVfUZb5JMmRE/x3a5pyLZKZxNsdRsxoXoAO0x7wdr/MR6pSd/lTtAwG2tlpjJqP+a2rLujD3C9ATy1SUu1b9a7LMJ/tYD1NMp0rr0Qw+M2DX2unxUYcZndEnkIq+F5HmYgNHWa9mS0WGPWR+Z5oZc3mh76OLyhSjcM1OK/yLo+kxj8Vx2vrx0d2o8Q8f2bmMwxY3ia+jZthenhUwtsc4fIKzskORn/9VKq9rHZNoq/Cw2n0xzvcR8z2yg60DPoDcbJRWH5XTepXOASxB0Xb3ogQv+fOP+2yZMKx/3mrtQn3mf/CMj5rgc7N/B7J3W9weGuIlTAXwj4iWQsJzcFag/55uoAKxXxUfdw/2NEHbQyte6nQhHOWroPUX6AJsyX1pwg0R3IWMbHXZw96FD0eZorQRrV1xH9a8sXEqyLOjOH5EY1lb53x8kWBt3p4tH3s05WXFNfz1sPhyUmAuddvBAwFmTO4xS8XQxq7mqkb+8/pb/icsbnjSub9yjcvwrDAlPDQ5WlvUb/uWj4LGfmIB2j/4f6kpDWEHvhrnU81ONUW33OIDUlGZE1UBHepv65JKaGJuGQ9Zd9ffD89rXMFrX5dkrlqz1XYOxcSSao17wq4r1+Zwb/ngqyVEi7odG9vk/YefOOC/kuev72VIZZa0TRxYGzpf1HK/UatgpTcnU969nUKcqFiEJLPl43ppOH0qXn+F2wntEltywQCwJrfPSrx56XlnkqnFN2cn/yCGQ6XdRN3QWKAmM/UvrfZQ+qSGvwPDZDQsQi/yq9qf9X1OauuyjVcfxNQvzlhzl4Bgv6OITBemVCqAV10rYSlVbR7MCu0e43yi7Bmqh1cr12ax4ffPAb0mKZEsxiDvM4I6v0EoljQHzuVeKfIEqjC5vvoMdwhWXZziXamS5E3IocBgFaLNQmTfN7yK/20f4/pMYfTGXkAAA133VoT19ZZyXjahWHb64TTTYATvdi3fXVCJxxc9LSev8dSFPRn3BkACjQJh6b3dDP6hUeMRDnfkfxYNGZtOShRNim50Ij9gs/4quH/0kkIru4T7y8AgGuXxqXWFP9bQT85DSexNEu8poOYeLgrq7mmUg00jLYSXxqZ9ZjRvicbsfpEVj2/FBEqNTyJA1Gqr+aj4jBTRCyo1bQke3oTmifgMgpv+fr+3CT4XtY0gHdY9mHK4j1M4fSRfLTIgHwFd/rH0LVNX/aHVuhU6i/GdEBkf1uVr1LNZkD8qKKDkRTKk8SGhdUsEkBWD6VTRWdg4fdphMguBrTgwJRYQirV/H45/NiNUwMMKXZaZ6Yupkk6jsvr6HrsgNtpJP8Aqr7TxKdF/Hh8W8JuY7yvbvLyK5J4jzLj5NxICEz+hHQEvM7BaBkG6CIkzkfixTtYwxBplYOL4E6YTu1vgM5fAJLLAAVujpVNCcuqVz31bdxv+HoP41SGcvz+vjWPLjfYsjKoSs6/8siRiFS6BxSoQhnGxg2LesYe+Cb2fX5TXaYCf2DKmf7079duhmhpY02GuBCkRKk8SX8XaBW/shsM2zASav2Iltr7syObSligynP6aTDjt7+pEYJlk7kOQR/LZeIJLvVRJA2YBqWvIPpX3SMr1BMO7XBZWU0y4qlSuAgnbcv+sLgZmL/MCDrJ+6lXqZR0upP7tG8Kcnflxvrqa2i3RrwDir3jIhHuUBlvJbhWyH/LgNHXW6mrGqC/i9ZyOv07km4+WDyvXxvUVSXhp3HCdMTwRZgYqn06s5wq5rTqj4BHA/u6JwdJAJp2z/4oEkURZO0rkhEKc8rqFaWuPCev1K3Lq8cybgzYHy15S4qxB/kLkfrwLsqYEXAQ0ann+E8fJrk/VqTze98lLK3X15+Ri71eytjZBgcaFALQTmRt815iBzgcsGNWFrC9PD4aDqZ9nXsTqrUyn503+VvmGSQxBLmmabz9YDU6PtyoOvlA+wzOojhPbazEX+oXcGYTxRCWd7Wq5Ta3fLazHq2uiEiMlTN4zx3ANEGBLyXModX4Su1Tt+eMLkaMpuNTI5jmElggK/aGHczB0pzaff3zvojUpz7PdpN4JC1J5Rqwjl1z0aVxz/ZO8PiriyDDDRxr/UAufitMAdSQePMGM4AAu1eIxlyKXaDwfSGkvO5gCQQxTmcwOnmXXDqUw6xNzSZ22w8WgwkWtduYr7Fn/R1wT3ANUoKswSE7eql5VFG+QuhSucVmumQ+4nks8+/G2tY6089ujKUP+6icOgZpDZC3GEzp8QXka1XEX0N3JyIbm67svRJXB/y45cF01Lzo9C5JjzHNh14o++Eb0h6MXo/IAIxbTjXvPGetHJL0RfUNJcXoqTY7CmwVFCPgvgx/QgZtHe/0zhrhL6wE3KUY+Z1xL1DqgPJk86ejBlBQosBNQMqbCLYoJ15y5H6WHXVlbk5Ac73BTvooLaSQX7/Aqg+s52FI6AM1OhA4T0xSAPMWM24ACOOuk/Qa1Zp5ms58U/dN+6QD+Gt5NPDDEXtbWUaUS6L+lULVyJCpnNagj+Q7kHYWavvQvlC0PqGdK1WC+ht5+YVo8mGyDVysGNMWjkd1Ec4OkHLlXqlJlIafKzVqzzPCw3Jcx6KSgHwm2ObhKn4+s0ElhZpCCp3svR2qfVCtxij9/e/pZuJtwL5JrVjqLFnm+Cjwx/PCnsKpUWXbntHlcIZtKfGKEM0IJePNqemKaq+GnKtWrTbHbLKKc/hG0xWuZQueu36OqXaUvw1ExiJDkTR/449+DywPWP2WAvqpLa/k06Au5Czq3rgQRQgv9x99SNgJXfIabXCrKOX+IT48+wNON5MSDn1DnP4VIGf6ZhCJAXfKfd0lhaMJ7TEMV5TEK8GwuRpET4FtDZ0HPGUWDDZ1eOWkVNPm0CXDJt6h/2YeTD8nNhZo5GLIpplRcjCHnbr8gqn1jNDk5+SbAmc9SKiwI+5cCJf1kcl0M/B9NmIQ2Xkq7USw7oNqtsjYthNYDnYJ1JYisKynQumT+cFyObCXDlIxClILfRv6k6aHa3Slibd1sylfxQ1XNJAnbM34N7LKi4XorhjGZnYznEtRSI+9YML9f1NZErF1nFa8Nrk7lx9eXncTtKQqUPkWrj/HwxQEf0Lb2/88751G8Cn4BZqKKT4nHf6mUd4OO6gRi4oKjrqUFX4XPiIJ4E0rSs/l4g9kAAU88mBKX6btpUe0aZQ+YK3pXyEQ3X5eeLxzZaJo5iDmxtlIdiYBhfphDpIs8ZFWOa56wMRdubFe7UVgN/lVhdArD10jOnarJKgx79aACBOQtAoh7Om0eItJU40SjaIjvwh/hXpltH7mlMKZBvodMWJFYL5VPApQiNfr+zkjNVwUVxT11WHcl36ldsdl1WNm2BHGPSyqecOZm9CQ+tUocDpiGFlQoFo+kMDpZHAvqgjxyab9xDDLUsVD1c4EXFD1NlyK1tlUU2pBTpYcVXqEUEWKkC0N5eWDj8TPh9yW5I1SjAPZATQ3xwzC6o3m5T7BLJxFVM1uLrgDhesRDHllzAv8BD/3Mc5cjFPUsUEDrpWtSYy5rlVsHTJlqv0C+C8M4t7ap5/4HttG+e9SHcSDi2eX3cAJ315drtLCJU1cspGD/SNVHF4I8PFMFpjzb3SKInDRwExaCMFf2kd2vZ7q2Iv2M1wSNj8Ep73/O7+6nEImlLrGZ7iGaqixdMS40v9zqs2NcOVGAARW6pr2BUwpuZp41fLzlLH2E8QQHOH6O/9RUZ0rrSGhTJMWa0I9kSzSjKwUl9R2fXCCX6VhKKLTekO44Duzl0e2hP86fZMvW3UpmpdOUYR6lk7Gv6LMwg7Vm6oVlRYob7RXWgw6y0wHfyEMg9+ZfsJSBS2qHZ2VD7laFQTmTfmsX2+x34cnZ5IXUp/t1zJVwlWnaUTaL4adjG/2UszxxqWkapv+nQAoDV1xbdr6gWaDcQ3k50mqKqH9Oy5/6tNYLPgneLeoiXErHL7g0IgmsdhGjz819q6M2rFjqEfwKuPlXJPjSvSzJngyz3Ew0u7G972ZWTOlOpz6dUP8NFb134pJgChnGyH/tfu5Q1aSyUzY8OWbKdgAEUZx0xKtiasOq608A3caIrNr7lAu+W/iWym4Ma7LU0ASjr1+Ac/40vcumb1Z5hDG1ujvBSqlKy01XVAGe4sXvqEVMGtN7OTXM8MVVQpoDNp2Va/UFtN/dx9n/NF0lq3/9/JAYAZunEUFPzz63KgTAbk9W35r3wLpQOjr+xtCLAADHPyclKWli3AaHRWOD6wvMjJUOD/qVmsWqrGiq1MKXLDyS4NlZGdZIAEwwAHLqq1rERzH7NLR5A+0q597kNk0oDUYoysvhVIOm0ePjy0LhHQ/k5uAxI/z2VALtBIABCiye2U6E9SHpznOAdP1VrOojTp0PRUBHKO5XWQLLGElT+pyaT5H1JPBRt0ciYwruJN9+iP28SHwxe/SDOf3mOODVaWw7wO7n+utxa4OUzOXUVptY8EUgP1Yqs6G9g+0Yg1fPcMXIzWt+eAyNW0g6ExGFaPFz0zUkThFMVpdUSd7hzZjs0tSzaZTSWLTdl3OHSc0mDtAEVshnPqmg73baGsD8J41kV5bPzOdJ0sD8b3CWDYdP39mB+VEXY6KAbrnhZCZxS0P8PVn7YXR8Rj6SIrHCtkxAVcZwNdIV3XYR6RwSCgadvT9Lage9LBlNjX6IoJDOA+larOdU1iCQ43YjyIvFKmxEg+1RHPV1+HUKkwj62Vuo7N1Xohe5g7S+grYl45kZIHqbecb4V0rhtoxJ61JL9iVSPL4gfHkVuFFz7hb6AzA998bdY1EYOio4mkQEd+6UoihH0K8bH/fNTpfyqfafPHgd6uMPaHnqt9cxtWepbAWLb9zbpZjvZX73UD9CIPHnddaIJMN1+uuvBhuVaB1aGPCbPVwKwbdzJ9EY1gy2RsYkXG8+/zcxQEICJR7+vK39fKfmYfw6JBbn5khT1npRPtaEA4EfgbzZsCBxvGhXYOFiSS81gNi2M8BQrLmq96j3jWuXCdHnFLRG3MQt0r9chczWEV9izCcXSBJeDwWmNgF/liYA8fecrlCmZ+HBnO4L0CvBsxzjSXIjrwtlfoAk/EQNYDiVchIZPQJIwQ1gbe6e4cQRwvT94PeghhK3adhM3rdmGP5XRlm4En2v3RvVO/nu377trIH/7DUCoaJlyQjGVt83PX5pY+9WShOWeYjz1Z5x/8o0oFMjgaj9dPfwnD1FOKvdQ+c39kMo0KpvF4IF7SuObA602Y8INXQWsfSdBL9GDDlBCGR8G5BROYYtsQYMvEbBhiIhdDUdw6rghz4dLM4jXRGnnmHhafofOT9ZQGhS0BKrcdz76tgks4CW1gUCPL4Trvum1J0/SZhrfYP1jxjRBuPvSiMLMAZpkerx8CvMsovAFr4rX3RmzkQHIiFhmALoRJ729BLiREQJP54cDLugo/K0e94ePNCcx6MaMme08jWILtbAvgDXDhxuDe/yWZ8JYPxms7SihSX7Uqs50Sd2ijH59gC+O08r+cmk4aDjOCeBd0k0WuOFaEp04eq9SWTP+ugwdBQTL/sPmQlHCzZJvriuPiYxh+SkP1nYI9E0RWOPlwpwxEs5eIY0BUNHYADsBYleEdQPhgOFd7nNFgUiy9gTkfPy3hVc6J/Fd2oaw+PM4rcR37NcGY8Gs9t7i0nl59LAnjTH+djn95kbnubbwnEeu1G6HLzLnIUsq1LzN83+nmM3R+8vKc/brOJOdLKFXKVMg/CAARtKP8dNxHFW9UPf+HyA3yg8RvBqjKgWlDpnd0EHwKS3Cyt+syidVvw4USIHLodxUHDdXD0+WW5IujfMGlX2jwp809XDBvJmrlOt/0CvxpQCjcOPfh7fN5BxMMw8AwffAt3CAkXrcFiqYf6K2Dbnp7y9xLd+yb6RI1d4amRVekhaKXWXQR/NN1/I8inJYu7ma9CV4tnepCTdKWIPNwOtpsisSMIJVV1veSqL9Le+AmuaUHWj78TBBoyjSJQW+ehFBMlATxqK5y2aZr+u4fmlorgjlz9Yifpa5cdXelR+1gZLG5yqDYDals6PargL4RW8yj1YAC/tRUZQfA9IYmCiHK8x6DK0t3GcOOeZYBwZITDuWos7I1KzBEz0anNz6asDTqpOq2qF/WYfR4NzuFwrSKCIRCCznISMqFEF1AZtHIzU1ol23u8z2hZtIHP8Ww82UY115IQjx02gw/UcXh811HP3eKPe9IJg3v48HhYGnamgoGzKnMIKKzKWkRQssZvTMwBCRRZV1/kLRR1vn+TcLIlvGLErhW8tNi8QTC8oN+/0aXJ36Tg7XR72Vmp9rpbM8lq1t/BUt1aUU9muvpG1LeLHgvoM4zexCJrcKKIYoru08oZCWhLMSCvUY2W7aPwqYiQqLO3xZ7eLQrc7/ZX9WZLWG+BzSlnlw5W4HRkRmnh7LibTdSBpOPTKIAGDnF8kwhOE/htI6Afvj3cQJPSuXj0a1C8NZvTk9Fox2ooesZbH8NHO3P3VA/SEEHbSrM9KIexmaFL9ztOnR62dVvhzljmQanuU5bCJI9dUy4i3m2LLeNe/VOUSt+wVC+q/hwTYaGa0LeuEqwTJhEaB65ftbS37PFDfjrzMN4LA9DQHwOkrqLEJhEPRMGNyuAwiSQvhiT4SX/1GXAE1UJGlcJV/0Ls66YU7YWxd3PeHHOkcsSvT9jBqMEaTqBsk20/rPlxrDGtW2dQlmiz7GnfkoQWdpnS8VGAQIGAwgroe6vN0iepi9bTIIPnl08lR45IytjdqRypXNDsyQrgAT2VeIudE3hYiAIVXRsoAEa6FU9uCBiaxzzSmp0W76ikbFxlPiGwj3QiYaBBxuLlOQZYOGjvpKqKPolxizgwxhQK/6XMrxTOQXNkFNnd8EEk8KvDoc46QWe/B7lYn0wGnlR3M5/lZ6qNRLvSnBs2ZOC4FoDmuQ9lzd/VJRVRMwWNqy3MJgyLKmiLVmReewCmjTaktIe6QemtIKDL+NKyGqUNALxxjcX1ZEjououkpJm8wAaYzE7lWIMeupDdhvGn+VIrrh0uJC5A96SoSemDWlLTbDaWFeLhX9hIOD+vsUUrnFsKWRBvjcRpL0TArfSmYhPaPM2t5WMP52lNQXeUbBOLQ7FOw42fJcAA4QfCb0w4hPDxa6LtQ495JRT+D6Cc3w5uQnWavxxJH7BJn/j8QBL6uP60BQMNwNKXIsqwzHJ+SGtqGSPmOOv37RFib1nJMYAgm3+yRjKG2XdQpCMy/FA7DZzIhJhRKFChB4owOCnNJ3nP2n2HsqJDi7N5+pWhL8w751CHBhMrBJf5bIMN7iSV7gp+n4QSAjT0OGqM7LytGZf6uBBX8WxCBxJuvdhrB7cNbzN5bhspZuiwswf5rN86LdFBV4r2vxlbYGWETTEr2U8gaePq9Jz+nu6ToJC/G33Y/ZAJdF0CP2ssOwX4e38XaCwBtpxXCACH23Bwumwv3p2AD/vjoLAeThMWyYgf2lIviB1RR0LYo9OmKPERrKn+AZ9coEPkfPeq+53f6/qcvW2Iq9+C/cCIAdaN9mbC7a5CllBoZMg7ZScd1HILPnRWVnQY7sHfNHRsaA42nU90yhJtD74C668i74yVDLRGfTm41o6U2MTKaHSNrQRrILXN9hFNovsj08i4AGoTboDnkIU/uQH4CCIPJhoM9hrpyt94BcSGp8q3ociasPn5xOR6I84Wui+mQsE7NAhTnI183Dku1T386LilZChqVWd6aQz3/fK/kltNURYTA80w0LkYxQNaD5uHq78Dinfi9lP0WOKh6l5AN1xbaSBgu4kwi2hTYTfHfs6/GCs2uZCQII4MoZ/ht9C/c7TUd+tKfBWfsuZKtGR5k51Nn8+d8zHN/1NNzukPIy0LjPfD7qQ3WSrnqZeZ9R9kmQtXCVPSRw5tQCAoaGZcqQFKUzxsDCz/kulcJ2nrzlgcPgTU6dXtKQxAT0c1lS7KmTvyk/ZkyWmzngJo/s2oevUQ+Xvsy5Trp+dQqB755ybB2f4ZfhZ0XPXEXS4MqbJKBmBerCTJ4tWiWUY1B8i84BzQUf15qPr4X5JTcO9g2if3mGsjSP0FHraUJyq63Tnc+HQrlyVp/tLGi6sC0FznJ28ku70D4QFFQHR22cYAdfDZyQEsR/kAWl4GYi5RoJP894rXmWzdaRbYk5zz4dzz56EQpR0efWAXCPpXXRY8BgmxRSQRh+niLrZFiVrMAEUBrxfMiwdJEygZVaPqgKA2Yawy3KdqqoQ8T3WVLhG7ZQs9oe8Gp7+am+ZAddJVMj/LOyUdivIcVCKFg/+zN6Dg5cplP29i2YOWrq3TCO0PefYMjeDm/W90b+09yraJDBBhaVXkkzJZa4A0aUcnvEXaHT0Xg0AHYzHm7TsXGwd5U2pPGDuKtkK0V3tCA1xAf0AEAgChFMXYm4yanbm3k4oq7+dXPeLPG1TQL0u1TTFZaNIcKe8xP2Yc3hWTrRbueaobfM8ovEtItVkP8Xgxh889YylzZlfYDl9oEwX93wibGS54LkXQGu1p5YQTxGBgCVuZC+RbaksMj6m1hec4y4nybuOoRxhCoe1E3yn9ekdWc1OVqC/4zyVpEhNCmgGbk50lllh3BUyrG0MiNmxrCxG3QEBeiggV4TFasB4PGpWyce3y/Z6cWxd5Uo0s4Yw3ORhuCj+PFF8L2e711vHew31DnxqMG7YKyKfq0HJDfOBpAUM9VNR96ZYUAFw8o5sDob9cqy9usGLyXrWZFoMF/c/dyl0x1Yqr365xiYDFdBQMbcO2WLtbttHPxlttz1Tq5ZsO6WQCudIDfypqeiRC/npnHb3dGd2PeBOEzfK3JiKYL2YAQHba9nu/mX7K0PLL8N0be4wavh3Dff6mbzoE/79ArISAEvayojq2+kq3fAAAGvd3H15LKx9IhPpYHp5HS4n/qxJbSf7hsoVN4WuxQrZEKAAAEXjqQsPtDUk2eqbhRwpkCaDaITALS1+EtEn1v9OsTgQil4StTiHFA4TmZXaOJ5WLpYOh/15mg/EFz3naZsClYy9AUocHNn296/AW30iMmQvPwcAAABQ8QQYjjsy4Y3pB15rPF8Q8MfPAiWGk/NE8eJl3vUyP9f+QEGhb3t97YjbGjkS7fc+hTTP43qZAWF6cBs1fVV2vhlUYqxBfJc5C6BeiCZYeshU2Ytqk8NhoS/ejn9ycf51ln/5UTnjl1E7Mv/Y7UK3oitZhPgZ9aZ6L2Wyh1uN9RKxDOO1nO3ZuTRQrLZGWfHbNrR1VI79HTK8Ar7L/CojXG4u3Ny+hifqd/MZNmQrP9PCeD1P4uVW3vE7hxqCOoUZz1T09g2DaADkBqwKP26GzlqyBKCr+3WXdNbWMz+uT75zdUdNbQhid7ZUxzqyiwBXXr5Yi+AkJ3yT9pjDfq5aAZFCyB/3SnKzhcsYveOmHIvcafN7WqTPQiAAPIBsijGAU/7P6oMoYSfrOK6U+MNSi12eGlPRGrZwek+yTH5JL8pOlCZ2xdoXamOw2E4NB0Gx+u0WN+CQhH1JvGRGoRCs4ndM6UV9O7rYw/fhYTAlKJfP/4Fu1O4RSaMH95fACd5l3GnyLFNxFW1JwcAABCgisxTCXfSziLcmwSsk7wQ40UNf8aBYSiKoQe8SM3M8nrcbX0ro+WnwF1hWTccYEL5jxQUObE1AaEvL5Jw03NsMU9MzNB8J9sqcxaAaBwMq+3loULunOctKUJ2o92UU06/4CYzizGW2Phcz434YDS5DpP5F3z5gfTidxjXDXrxlUzVuopfeN4jmxSR+Z+hWowIMiXsn5+RgColrSLqybP3b0EV3oLFxQah0O4o/gP5i3YdvWm3b7SwX9ayKi7NlqHhSxla8PTKVJHOKLliWifVvOpdyYwAA4kSNtV7evcz4v8PjlHhD1l2tdjsAxuHyg88kGTwWM5Hx7O6C38Ni/ESD0cgYL1GLYuw3yeTCsSqPvfrlkIEO/UU9svvAFO/9yoMEACrBuqBXyxg6ktYZGAgpES+9w4K2e4wgA++VklMIRo1GZkuE78SqjaM+X9nVqusRMUiZ+1bdo2cWogLtaOv3Ej/wC8WTUKOCLJSXDFw1AMogwKFPH3Ow4LyUBy0HXiBj2RXeFK8RiZNGTmZXKsedPZm+bniXH/ZHJSX0i9X3i1B2Cw0ucjAuqZHMI25mgX4ZCi2u+JUIigm4SqnGnmtO8a0mEJH7SNfym3PpF/xWBcAvhyD+fcHsFZ/SZig0aTSQCmYcUiV7o05KUcwGdJfGv3r9JIBrvZFHhWy1B9V/kBtxsdzhYqvaqgA2T6yNFrc6Ae6T2Bj4XMSywWaVN2u26FmP3GTApdROpSxK6m6dJ+DIjEHLoAKVErcwgR7iGxSFxlkwh/y1FW4zqdWCPQ1iDed3HIAV9U1qWhLLaVGI9rFiKJCggUI9x9/dIquPVnx+L9ZlA1Hges2S1cm6HS6c+qAAAEKAlaRUmqjDW/JosselZgpqkbGP4DXjCFQ2vg3HqQvO/dTGtvvXNNRjWoWdvJqKrbV3WsB05+udz007aOb/8NgujY+Tr8FPIfTQwt640MhFdrSEVYLsLenl246UCRNU4y5/SMHklXqXA9BAgIn5hACG6R0DCM+EK6sIQZ9rpFEgmzQH0AyS3RGFtxH1ZWnpgWoVBG1aVeC7SnxYFdnmiPevYmyBBXJzx7yiFgx47B7uR/agKGAWN0rSQOXtkxhTxmBAWLULuwKfAJGwGCBXPYOnIWd/8V7ZtispuJhbfeNIsJI1uYlyp0YoVwFxdcfhOf9LHq5z6a8HAAGY+KXnWn1ExB94sQDAnKgsmGGRiI+wh7zZ9wudcL2pTPQnSnntL67PB1OQxsi3zQe0qoxAN5ob7MOe+xinkrnLxd3a1tbyY1fjjipNUgP+UGNcBsUp2NFxweFF7QY3qbyrp7LH9KqTW6xTGNydsUcGao8PYDBfXOJ8Av8A+zfBKOf+PiEqo52dkuh4MwBS3fNIREQIcl83vZpMQkMUARkAN2CNslKagqSxYVDYNFSdsFMVxZduz21eOIoDjERNyu1v1b6D6hLG7ZuEscH8V8gKCHjSfTDIEFgFZxBFDmgK7hInL1HlJnrlmie2ACNdnaCcYwyKEfK4DTx46uUk0oknRHDYEcztpWNEPLQ+f7IDPntcbakwe79qGIHvjsmd6xQjP1x/H+n+Fw70W9i/WrKaTRNQpKWQzjPhHGg6+utJNk9ALEf175ElNyV4m2mCl+9z4id8nQVMIHIQ0HkmgVDBlUQmaUVHUD5cInhh0OEy+cgwCfNtO3dAIaB4bL0AiQmK1OWIRY76TQZSodKuDURUXBosaIIXFe11csaerv9e6bRbcUn8Aht8+9rR5VgjxhizyH5+ia4ToE4dkJd8HTB2FPGmueCezJEO6zl+Q0q6cS3xgZTbWRL0wHrcU0r++KweNGMAbTlCB13hEtHxT5h4JmFLY9xGhXxUylhDt6UXxoBk+m8GuVB8u2NvA3AGh6FbKgf20axHN5ELrhAnaXFfNTThu40786CjnxBzYELvMdxdks7nPHF0eVnJ8CKODJ52w//TQBdcEAs79QH8LQY++aWdbIn808oj3MepSH1Rny547xbId45qwRUw5OSfWYhPcovlOOuQLRrUGhnb+r8MUHefV7zHXjgLke05JM6EvHrb5gzjtgKD3PXNTDKm2E+JwBlLSEqWdiBlGSumBN/AEfdHOJUSgAajZiq1VsSgkinkhD7YALWzyIsVXFechwrDm6WstwF8bpJ1cv9CWGdQNvLSVrGAKhlPB8fAB3yZeM7wg+1LbztTbzlhd4th3Ed+q8K0eIKFYE/n2n9ZcfR/wj+gsRq0eVvOYYvZ8NzwzVHz+gShxapTmULrBTyAQmSkz9pBdJLhK/9VIscb1uMBfA0krB9aYl485bX28yRe3fnSD0Bfpm+OQOyS7nQwB1TA7eTchOfz0RVmGicSwyyp92jdcAvEzMiw3N8gfC93wswPRagGTktUADmJJAe8gdCMWsoZnDBA/YgEaDrljqrIUsgAWAT/tPYQFsgJfV6Pez0d4+wGKCcctqyxmNpM54qfD0GU1Hzhxr7TpvHDYgr1EZ1MdNFTOBVqOS6oJt+rFFj0kOpMJO7oEP3WDnwu0ZzYxU/J4GCgx5ATKErwy1DyasFZkxQyGJF81GQPhfhKEFeCPQEEd4TRvqd2UiObqI30HkRloNEYB2YrCgP7w2t9SSWMFbSZrM0Y5s3HCmimSUOuUwb8EUSQEXC7t4UZQFYWoKJgF2jc3hMCLjlWNvBQQCFx1RrHoDAbUX2gALadeQLmDzP5key8jDUvz2SJwaC4YQC8XMttRP64J5HewEhfGNUl/shzVZXpi34KI0yLZ5QFAlEGyRigAHajXh/CF63P2c7kA1wN2zMskGO3vwo6AJMTEzU7zaYNab3s7FK/roAAJoZTgL6Iqb9IPFDXxJKk31LAyysAuBNFM9kmNQpwIHDEf+imXvY4r8gB3f9dNQt+HGnXO6RkFdgVNjAl85NDhqCfPmKKznF142Ns2nAIEM4EJUhqM0KTJI1GiWtOqcqPHlwD1CiAVz60AImEUvE3lypQEEAAAAMTsKUxlhowmlBcZGrQqRtnE6z2eWENZC6EHXFXTtQVK7O1f2Rn83DNwFWEJ8BLtSy0FybdsezkVMv20C2RHdjh+c99tWjKuUsdtHPZ9oM2FCke9zW7RKt3D6GMT7yg16LwUP+lrh8utcf8KqW6/RHeE0c3XQh+DpJMW3yVOSzX0OvYhCC71qgPr9TbsgsRk9KLtfuLa7ZNLqIKHrRhMD9lHi4jGdeAReSJDkvcGVGgrtEqALhEBe5kwB+oKDPJN+PpqP+1KaIAAAAArI2usBDdrG0nLYtKYrfdwwnyQ9pZuMJzc83GsAqXwJEDNtizI/21bkntLOVZTWW7IcCF3QoHYsTTMV01M9A9iqc0vZt/lG7+7eopSLYQ6iK+AyU9DKxr6JTWyCzICk5/rnvFRANiCLdVU+vUo3LINS7IglWJcTi4vQ0j6r5L/xQi1zt3aVuY3WTPYlVLm2TLqdC2WzQ5N6dU5xU3hdAe//4gAkigWXBwmAAAAAsryB7KNWf4+dcAAAAAAOXZrTRTFAZYY+4+UqYgcF3YEljatZ3QmmyTYcRbJjQFCxInbgyqps8IWByI4p50n+YkHIrp8bLwsxkc7Xnl2WsUoSLcnrVxF6isnApPcQWfd/bedIePKcXRvcGVUBACvA9Qb2kejcSIXhWo2zWeJUP8Sh2luEPqcmNibXKOcfpk7IsYu7e8CQy8ebbvdZ2/auo3k1GPTpmKcIjlyspT9Hhab00di3BxV6AQB1WQANRpcl6qHJT9bNdQ6pQYFZGGXSnlrB72mai2Zjge7sJxVGkzEea/UU6c58AbapZoXlJlblVPx0nkfrX6yuklAC/dEs3kq3YPHCUt2d3OzuPA3atfJkl+nX8tJDMiSkhVnYcbiR8vDHfKOQzAZSiDeDnYMNscSgQ9uTA70UZ9jIZg8T24pJjJBO0i1p8KAKN8LV5Wzu7BkhY9RAcnLDuSg5tRWPFm9rjeT4MBOFNfdVvCNGMjCfRv4rfTTRD1kViDnwAArEQokjxBc+E24AG0A6K0hVQAABCvV9hAjQTNckCNX07I3Mm0pMJIdQDUAh+r1V7MyDt+FXoAwn8aBrAnFTAhLkykogI7MOcH0kdtEbpP/XT946FwVKuhYeUeugaOPceG3+YLgvTOkO4BITh8wL6Gxlb8K8ZH9ahQZDbHaMWBJfpDwJXhXRB6yw1HUSSjZencq6lXhfUoUG6dDKqNX6Xtk5q45Eb7GSe/VYuYQIZWGSWUYPrJv2uGL41WubmrEWYRJY8Wk74ALMRMsNZiVYMnskeOACYCDs6dEgAACVAAAAgvv6q3hBzYBH8kXPcDmr5reXD8Ipkt6xgUwmKKDuBnC3eBGKARBZCWxT0fd0MCfdr7xpvUBSPBAfpKUDETBQmiG9+2sX2/WNqGuD5JIFY5r+TzbCgk+sheor6H5wPTQymxbJRdZ74FN5wXZlZFNl45T5mI1G+AFFs2au/wpMyJt/AVoCAdaWnKcqiuz4QGbst7A1Sd1QABXlgX4nGqzEkr0WXmtl3Ki54MRrdTscLnatMscA0ndbjPgYglu/zr90FHReTEHe4/n+uxHr8lADkigYRw4FZCAoUBWnXZKNF+Za6amqMho5cABHDzEAC4Qod538qHsALbCsRuAvYTLEA2fgi6IGQLAWYZFZ6kzLNyosjjjaiM55KTrohp6EBU+Z0HfILNpWtOk2GG+sVy3Picnye1uj160zjWK2ddKJrfbo4H/3PRt21UI7ZoIFDctunGunN/i2kauWc+W+tMzw+J0jFPMzMJiIAGwflYSMK+Uh/xTsZQ2BpFCWXFS2xrPKerI0jFnq5oOIwc01emqnQj/MZYKVx1m54NEBO/t0tUsHheRNKJG91TK3atTxLKhDespmNZc4tKizunLdFDxq99V+Vm3uSS5UMQSob+0AYoDfAcuAHrIpsXIHERaxbUywQEYn+X2AAXCAD56Ii3HkKbmmftb6523vAVQWw6ClHDWJKM2CKVHtpf6nitrcyQnlfqnH6IXoYC8QYLSoWAT6L/0udYWwci/8ub9rdMgS81DwIdHUx7YcxfV4+lX81yiZHbprcE277mXH9/Q9gFciIrTU6otae1H55A/pAFHaF45QIOjS7YNS4u4GmVv/N7J3Qii5Tjg+TPUjI67A+bLZPJKOvNVYaOtvMdWNzTa0LJ4eL5j9yy7OHGLGGXQ/YdzKe6sPs2bhg7x3445RQaBY+92aTPQ2ikyPjU/Gq84M4OkUgNEcgCGiADrQaFxoWb96P0UzwiursiMFVcAAAAAMF+wVp2xHTTpp/dkWUCQ4IcPj3XbUx4Tn4ftIwMX40CH7l2R/0mfCfjcynfT8yE0isHrlnKtAx4l6hn0CU0c9lmd4dIJXcpziJgrK+4PEdlJN9y5tk9vAZ66JJZgEGcIONAJ7f8uodzSxYk0nIe1io3sAGBUE8dFIgn6NNcVwFxfGK4SjNNM9XdTKG2/BcAN2UI+EdF9WLl7LTDZKFZhEsoERk560kcWDEoweIYgApHpYktxI7j7EM+Uhread6xFT0Kice0OxJZF3Wen45WfuvsOu2pKmzYVL5wr9NgupuY4ABrKyAJV60QaHAAIIM2DhQjqrRSIXgKABtOLE6EAoGAhJhTR5KPKXF0qlmtuSSx/AMDbQBU0wA/0G1lrmhFqwXfh/v9QLaw8Dyc/M2XOjUoGB5YEUOfhKFnh1kab0nRwV5cMkUYdROq+62NulqZemeO3aa8bAqAsbXT3SY7XKdY8PM92FdJurry9HfuvENQw4/roqSaVTvi9Yvi0G/AJjtChRcmLPF0Ei4chQkul3FeGZJe5t+LuhLmxFTGuazbT9AOomjo30G5d0n3z2BAd5902yMsWeJqR++MuFsSIsWqbwOzeREHLwivABoTIAFJIAASJyTIgADomifTJAAAACFSBxjpbuUrCO0PmvjQ8oTkLfNYSubEqu6h/Kzsbo4WDfQZpecBLI09AHbtvP4HKx68ly26fkkaqxuruOnXs0dY0sPsBH9BhIQipYKlb4xmwV/DSXOS27JbmlkmwVMm6RAKyOT9/vxTMCFokWWGxuZ1FzfgzWhajHSkkKqSKTvpS6BotxhRIJlVdJB34NFGb+exxZLv8MBMOXjl+T/TebfEBYQYGKJcVeOg9AYS8Qt8eK/SeXBAgkzZAC6KngOL5Lk36q/uLPgG0qmsjXEMrsRo8ytWDwgAAAAAe+njL9okqaSZVEJP4ydt93e9zURSa4hYa1j6+mn8v/SjEjFvtDyh7rFzi5rGRrnzG1H5+qHQI/DQMWt4p3EJzD4u/Jp66NnnXGtK/lLnbIMM1aEdP8DXoH1BY+rG0wJqRlUcZFEYjMe7a+VQEvqz/BUaJsczc54RF9zO6WwU141rkbOTUOTJn9MVS8xgrz4Gk7uXPUrLWxhsoU/HckN1tBK4gMYiInLSr8XgGQUWj+7OQA\"","import DEFAULT_BACKGROUND_IMAGE from '../../assets/sw_background.webp';\n\nconst DEFAULT_BACKGROUND_THUMBNAIL =\n  'data:image/webp;base64,UklGRv4BAABXRUJQVlA4IPIBAAAQDgCdASpkADgAPm0wlEgkIqIlpvVbQLANiWUIcAF/N0SNSoFwLlO5RP2YPzaIbnj2FRb+bYMVMO2hQaOhoOYVcYas+y/tUm1/zmSSq5AUjQJ+cqL2Z4Z7qXLgXDAOWYT82r5bm+2mFDM38Q0ruBiEoVE+LSAJdoHQAP7gQtoYHET/VcymFbJngGPQnLANH4pBKeNTCNh83JD/q72P9SVEf91Mx4GHZGI07V8EIhDuJRWajJcwkrY9epV7HluQk5qhMElwzHER6a3Zc/OaBy35/gKiNW/4Wd0oEovwE2r9jyX1HImaWtlcTNyPPjyqvi7m5rKNN82p/S01kcM9spuizE4Pba01gNXE5vPW68xKBA/5rLkd/4UosKilKe9PXgPgEgNiTV8tlHZ33yDJQSojodoGsBvOsVgYm06hOx2FqbPFSVY/2mjEsBcCuGQAy1+sBIt2FygUENMwQ4jSOFHEQZ7C9Sc/t1gIlR2bZtNtp1BWIQW/Iu6DDMwjSSTX4qjCwnN6/sqzlv0ZFBAKVIX4uy9DbwSWFKGKqDlsrbAmVFaioKHX3IX/Xm49jyIK7/0PIre8rpPO7DBAX5JbGQCYg8mbG2uf5xTT1gAWy0N4hyjd8bt6FFnL6eUOrt6Hjzy5gP+/8lb0glwD14Mjd9AAAAA=';\n\nexport { DEFAULT_BACKGROUND_IMAGE, DEFAULT_BACKGROUND_THUMBNAIL };\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport {\n  DEFAULT_BACKGROUND_IMAGE,\n  DEFAULT_BACKGROUND_THUMBNAIL,\n} from '../DEFAULT_BACKGROUND';\n\n/**\n * Video background with a blurred thumbnail placeholder that crossfades into\n * the full-resolution image once it has finished loading.\n *\n * Slot this into `sw-ui-call-layout`'s `background` slot.\n *\n * @prop {boolean} [default]    - Use the built-in SignalWire background image\n * @prop {string}  thumbnail    - Data URL shown immediately as a blurred preview\n * @prop {string}  src          - URL of the full-resolution background image\n * @prop {string}  [blurAmount] - CSS blur amount applied to the thumbnail (default: 20px)\n *\n * @csspart thumb - Blurred low-res thumbnail layer.\n * @csspart image - Full-resolution image layer (fades in once loaded).\n */\n@customElement('sw-ui-background')\nexport class SwUiBackground extends LitElement {\n  static styles = css`\n    :host {\n      display: block;\n      position: relative; /* containing block for .thumb and img */\n      overflow: hidden;\n    }\n\n    .thumb {\n      position: absolute;\n      inset: 0;\n      background-size: cover;\n      background-position: center;\n      transform: scale(1.1); /* prevents blur edge fringing */\n      opacity: 1;\n      transition: opacity 600ms cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    .thumb.hidden {\n      opacity: 0;\n    }\n\n    img {\n      position: absolute;\n      inset: 0;\n      width: 100%;\n      height: 100%;\n      object-fit: cover;\n      opacity: 0;\n      transform: scale(1.03);\n      transition:\n        opacity 600ms cubic-bezier(0.4, 0, 0.2, 1),\n        transform 700ms cubic-bezier(0.4, 0, 0.2, 1);\n    }\n\n    img.loaded {\n      opacity: 1;\n      transform: scale(1);\n    }\n  `;\n\n  @property({ type: Boolean, reflect: true }) default = false;\n  @property({ type: String }) thumbnail?: string;\n  @property({ type: String }) src?: string;\n  @property({ type: String, attribute: 'blur-amount' }) blurAmount = '20px';\n\n  @state() private _loaded = false;\n\n  private get _src() {\n    return this.default ? DEFAULT_BACKGROUND_IMAGE : this.src;\n  }\n\n  private get _thumbnail() {\n    return this.default ? DEFAULT_BACKGROUND_THUMBNAIL : this.thumbnail;\n  }\n\n  willUpdate(changed: Map<string, unknown>) {\n    if (changed.has('src') || changed.has('default')) {\n      this._loaded = false;\n    }\n  }\n\n  render() {\n    return html`\n      ${this._thumbnail\n        ? html`<div\n            part=\"thumb\"\n            class=${`thumb${this._loaded ? ' hidden' : ''}`}\n            style=${styleMap({\n              'background-image': `url('${this._thumbnail}')`,\n              filter: `blur(${this.blurAmount})`,\n            })}\n          ></div>`\n        : nothing}\n      ${this._src\n        ? html`<img\n            part=\"image\"\n            class=${this._loaded ? 'loaded' : ''}\n            src=${this._src}\n            alt=\"\"\n            @load=${() => {\n              this._loaded = true;\n            }}\n          />`\n        : nothing}\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-background': SwUiBackground;\n  }\n}\n","// Lazy-loaded Prism. The core and every language pack are loaded via\n// dynamic `import(...)`, so consumers that never call `highlight()` (and\n// downstream bundlers consuming the package barrel) don't pay for Prism.\n\ntype PrismNS = typeof import('prismjs');\n\nlet _prism: Promise<PrismNS> | null = null;\nconst getPrism = (): Promise<PrismNS> => (_prism ??= import('prismjs'));\n\nconst PRISM_LANGS: Record<string, () => Promise<unknown>> = {\n  javascript: () => import('prismjs/components/prism-javascript'),\n  typescript: () => import('prismjs/components/prism-typescript'),\n  python:     () => import('prismjs/components/prism-python'),\n  bash:       () => import('prismjs/components/prism-bash'),\n  shell:      () => import('prismjs/components/prism-bash'),\n  json:       () => import('prismjs/components/prism-json'),\n  css:        () => import('prismjs/components/prism-css'),\n  yaml:       () => import('prismjs/components/prism-yaml'),\n  sql:        () => import('prismjs/components/prism-sql'),\n  markdown:   () => import('prismjs/components/prism-markdown'),\n};\n\nconst PRISM_DEPS: Partial<Record<string, string[]>> = {\n  typescript: ['javascript'],\n};\n\nconst _loaded = new Set<string>();\n\nexport async function ensurePrismLang(lang: string): Promise<void> {\n  if (_loaded.has(lang)) return;\n  // Core must be resolved before any language pack registers on it.\n  await getPrism();\n  for (const dep of PRISM_DEPS[lang] ?? []) {\n    await ensurePrismLang(dep);\n  }\n  const loader = PRISM_LANGS[lang];\n  if (loader) {\n    await loader();\n    _loaded.add(lang);\n  }\n}\n\n/** Highlight `code` with Prism. Returns highlighted HTML, or the raw text if the grammar is unknown. */\nexport async function highlight(code: string, language: string): Promise<string> {\n  const lang = (language || 'plaintext').toLowerCase();\n  await ensurePrismLang(lang);\n  const Prism = await getPrism();\n  const grammar = Prism.languages[lang];\n  return grammar ? Prism.highlight(code, grammar, lang) : code;\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport '../icons/sw-ui-icon.js';\nimport { getLogger } from '@signalwire/js';\nimport { highlight } from '../../../utils/prism.js';\n\nconst logger = getLogger();\n\n/** Formats supported by the content drawer. */\nexport type ContentFormat = 'text' | 'markdown' | 'code' | 'html';\n\n/** Payload that drives the content drawer. */\nexport interface DisplayContentPayload {\n  title?: string;\n  content: string;\n  format: ContentFormat;\n  /** Prism language name (required when format === 'code'). */\n  language?: string;\n}\n\n// ── DOMPurify allowlist ──────────────────────────────────────────────────────\n\n// DOMPurify already blocks all `on*` event handlers by default — we only need\n// to extend the defaults for things it would otherwise allow (inline `style`).\nconst PURIFY_CONFIG = {\n  ALLOWED_TAGS: [\n    'p', 'br', 'b', 'i', 'em', 'strong', 'a', 'ul', 'ol', 'li',\n    'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n    'pre', 'code', 'blockquote', 'hr', 'table', 'thead', 'tbody',\n    'tr', 'th', 'td', 'img', 'span', 'div',\n  ],\n  ALLOWED_ATTR: ['href', 'target', 'rel', 'src', 'alt', 'class', 'title'],\n  ALLOW_DATA_ATTR: false,\n  FORBID_TAGS: ['script', 'iframe', 'object', 'embed', 'form', 'input'],\n  FORBID_ATTR: ['style'],\n};\n\n// Force `rel=\"noopener noreferrer\"` on any anchor that opens in a new context.\n// Without this, sanitized markdown/html with `<a target=\"_blank\">` could let\n// the opened page reach back into ours via `window.opener`.\ntype DOMPurifyNS = typeof import('dompurify')['default'];\nlet purifyHookInstalled = false;\nfunction ensurePurifyHook(DOMPurify: DOMPurifyNS): DOMPurifyNS {\n  if (purifyHookInstalled) return DOMPurify;\n  DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n    if (node.tagName === 'A' && node.hasAttribute('target')) {\n      node.setAttribute('rel', 'noopener noreferrer');\n    }\n  });\n  purifyHookInstalled = true;\n  return DOMPurify;\n}\n\n// ── Component ────────────────────────────────────────────────────────────────\n\n/**\n * Content drawer overlay for the call widget.\n *\n * Slides in from the right on wide containers; on narrow containers (parent\n * width ≤ 480 px) it slides up from the bottom instead.\n *\n * Formats: `text` · `markdown` (marked + DOMPurify) · `code` (Prism) · `html` (DOMPurify)\n *\n * @fires sw-content-drawer-close - User clicked the close button. No detail.\n */\n@customElement('sw-ui-content-drawer')\nexport class SwUiContentDrawer extends LitElement {\n  static styles = css`\n    /* ── Host — default: slide in from the right ── */\n    :host {\n      display: block;\n      position: absolute;\n      top: 0;\n      right: 0;\n      width: min(360px, 100%);\n      height: 100%;\n      z-index: 20;\n      transform: translateX(100%);\n      transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n      pointer-events: none;\n    }\n\n    :host([open]) {\n      transform: translateX(0);\n      pointer-events: auto;\n    }\n\n    /* ── Narrow mode: slide up from the bottom ── */\n    :host([narrow]) {\n      width: 100%;\n      height: auto;\n      max-height: 65%;\n      top: auto;\n      bottom: 0;\n      transform: translateY(100%);\n    }\n\n    :host([narrow][open]) {\n      transform: translateY(0);\n    }\n\n    /* ── Panel ── */\n    .panel {\n      display: flex;\n      flex-direction: column;\n      height: 100%;\n      background: var(--bg-page);\n      border-left: 1px solid var(--border-default);\n      overflow: hidden;\n    }\n\n    :host([narrow]) .panel {\n      border-left: none;\n      border-top: 1px solid var(--border-default);\n      border-radius: var(--sw-call-layout-radius, 0) var(--sw-call-layout-radius, 0) 0 0;\n    }\n\n    /* ── Header ── */\n    .header {\n      flex: 0 0 auto;\n      display: flex;\n      align-items: center;\n      gap: 8px;\n      padding: 10px 12px;\n      border-bottom: 1px solid var(--border-default);\n      min-height: 42px;\n    }\n\n    .title {\n      flex: 1;\n      font-size: 11px;\n      font-weight: 600;\n      letter-spacing: 0.08em;\n      text-transform: uppercase;\n      color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n      overflow: hidden;\n      text-overflow: ellipsis;\n      white-space: nowrap;\n    }\n\n    .lang-badge {\n      font-size: 10px;\n      font-weight: 500;\n      color: var(--fg-muted);\n      background: var(--bg-surface);\n      padding: 1px 6px;\n      border-radius: 4px;\n      border: 1px solid var(--border-default);\n      flex-shrink: 0;\n    }\n\n    .action-btn {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      width: 28px;\n      height: 28px;\n      border: none;\n      border-radius: 6px;\n      background: transparent;\n      color: color-mix(in srgb, var(--fg-default) 55%, transparent);\n      cursor: pointer;\n      transition: background var(--transition-fast), color var(--transition-fast);\n      flex-shrink: 0;\n    }\n\n    .action-btn:hover {\n      background: var(--bg-surface-raised);\n      color: var(--fg-default);\n    }\n\n    .copy-done {\n      color: var(--interactive-status-success) !important;\n    }\n\n    /* ── Body ── */\n    .body {\n      flex: 1;\n      overflow-y: auto;\n      overflow-x: hidden;\n      padding: 14px 14px 20px;\n      font-size: 13px;\n      line-height: 1.6;\n      color: var(--fg-default);\n    }\n\n    .body::-webkit-scrollbar { width: 4px; }\n    .body::-webkit-scrollbar-track { background: transparent; }\n    .body::-webkit-scrollbar-thumb {\n      background: var(--bg-surface-raised);\n      border-radius: 2px;\n    }\n\n    /* ── text format ── */\n    .content-text {\n      white-space: pre-wrap;\n      font-family: ui-monospace, monospace;\n      font-size: 12px;\n      line-height: 1.6;\n    }\n\n    /* ── code format ── */\n    .content-code pre {\n      margin: 0;\n      padding: 14px 16px;\n      background: #1a1b26;\n      border-radius: 6px;\n      overflow-x: auto;\n      font-size: 12.5px;\n      line-height: 1.6;\n    }\n\n    .content-code code {\n      font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n      color: #f8f8f2;\n    }\n\n    /* ── markdown / html format ── */\n    .content-rich { overflow-wrap: break-word; }\n\n    .content-rich h1, .content-rich h2, .content-rich h3 {\n      margin: 0 0 8px; font-weight: 600; color: var(--fg-default);\n    }\n    .content-rich h1 { font-size: 1.2em; }\n    .content-rich h2 { font-size: 1.1em; }\n    .content-rich h3 { font-size: 1em; }\n\n    .content-rich p { margin: 0 0 10px; }\n    .content-rich p:last-child { margin-bottom: 0; }\n\n    .content-rich ul, .content-rich ol { margin: 0 0 10px; padding-left: 18px; }\n    .content-rich li { margin-bottom: 4px; }\n\n    .content-rich code {\n      font-family: ui-monospace, monospace;\n      font-size: 0.85em;\n      background: rgba(255,255,255,0.1);\n      padding: 1px 5px;\n      border-radius: 3px;\n    }\n\n    .content-rich pre {\n      background: #1a1b26;\n      border-radius: 6px;\n      padding: 10px 12px;\n      overflow-x: auto;\n      margin: 0 0 10px;\n    }\n\n    .content-rich pre code { background: transparent; padding: 0; color: #f8f8f2; }\n\n    .content-rich a { color: var(--interactive-button-primary-bg); text-decoration: underline; }\n    .content-rich a:hover { opacity: 0.85; }\n\n    .content-rich blockquote {\n      border-left: 3px solid var(--border-default);\n      margin: 0 0 10px;\n      padding-left: 10px;\n      color: var(--fg-muted);\n    }\n\n    .content-rich table {\n      border-collapse: collapse; width: 100%; margin: 0 0 10px; font-size: 0.85em;\n    }\n    .content-rich th, .content-rich td {\n      border: 1px solid var(--border-default); padding: 4px 8px; text-align: left;\n    }\n    .content-rich th { background: var(--bg-surface); font-weight: 600; }\n\n    /* ── Prism Okaidia theme (must live in shadow DOM) ── */\n    .token.comment,\n    .token.prolog,\n    .token.doctype,\n    .token.cdata                { color: #8292a2; }\n    .token.punctuation          { color: #f8f8f2; }\n    .token.namespace            { opacity: 0.7; }\n    .token.property,\n    .token.tag,\n    .token.constant,\n    .token.symbol,\n    .token.deleted              { color: #f92672; }\n    .token.boolean,\n    .token.number               { color: #ae81ff; }\n    .token.selector,\n    .token.attr-name,\n    .token.string,\n    .token.char,\n    .token.builtin,\n    .token.inserted             { color: #a6e22e; }\n    .token.operator,\n    .token.entity,\n    .token.url,\n    .token.variable             { color: #f8f8f2; }\n    .token.atrule,\n    .token.attr-value,\n    .token.function,\n    .token.class-name           { color: #e6db74; }\n    .token.keyword              { color: #66d9ef; }\n    .token.regex,\n    .token.important            { color: #fd971f; }\n    .token.important,\n    .token.bold                 { font-weight: bold; }\n    .token.italic               { font-style: italic; }\n  `;\n\n  @property({ type: Boolean, reflect: true }) open = false;\n  @property({ type: Boolean, reflect: true }) narrow = false;\n  @property({ type: String }) title = '';\n  @property({ type: String }) content = '';\n  @property({ type: String }) format: ContentFormat = 'text';\n  @property({ type: String }) language = '';\n\n  @state() private _renderedHtml = '';\n  @state() private _renderFormat: ContentFormat = 'text';\n  @state() private _copied = false;\n\n  // Incremented each time a new render is requested; stale renders check this.\n  private _renderId = 0;\n\n  private _ro?: ResizeObserver;\n\n  connectedCallback(): void {\n    super.connectedCallback();\n    this._ro = new ResizeObserver((entries) => {\n      const entry = entries[0];\n      if (entry) this.narrow = entry.contentRect.width <= 480;\n    });\n    // Observe the parent element (the positioning container) so narrow mode\n    // triggers on the container's width, not the drawer's own width.\n    const parent = this.parentElement;\n    if (parent) this._ro.observe(parent);\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    this._ro?.disconnect();\n    this._ro = undefined;\n  }\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('content') || changed.has('format') || changed.has('language')) {\n      void this._renderContent();\n    }\n  }\n\n  private async _renderContent(): Promise<void> {\n    const id = ++this._renderId;\n    const { content, format, language } = this;\n\n    if (format === 'text') {\n      if (id !== this._renderId) return;\n      this._renderedHtml = '';\n      this._renderFormat = 'text';\n      return;\n    }\n\n    try {\n      let html = '';\n\n      if (format === 'markdown') {\n        const [{ marked }, { default: DOMPurify }] = await Promise.all([\n          import('marked'),\n          import('dompurify'),\n        ]);\n        const raw = await marked.parse(content, { async: true });\n        html = ensurePurifyHook(DOMPurify).sanitize(raw, PURIFY_CONFIG);\n      } else if (format === 'html') {\n        const { default: DOMPurify } = await import('dompurify');\n        html = ensurePurifyHook(DOMPurify).sanitize(content, PURIFY_CONFIG);\n      } else if (format === 'code') {\n        html = await highlight(content, language || 'plaintext');\n      }\n\n      if (id !== this._renderId) return;\n      this._renderedHtml = html;\n      this._renderFormat = format;\n    } catch (err) {\n      logger.error('[ContentDrawer] Failed to render content:', err);\n      if (id !== this._renderId) return;\n      this._renderedHtml = '';\n      this._renderFormat = 'text';\n    }\n  }\n\n  private _close(): void {\n    this.dispatchEvent(new CustomEvent('sw-content-drawer-close', { bubbles: true, composed: true }));\n  }\n\n  private async _copy(): Promise<void> {\n    try {\n      await navigator.clipboard.writeText(this.content);\n      this._copied = true;\n      setTimeout(() => { this._copied = false; }, 2000);\n    } catch {\n      logger.error('[ContentDrawer] Clipboard write failed');\n    }\n  }\n\n  private _renderBody() {\n    if (this.format === 'text' || (this._renderFormat !== this.format)) {\n      // Show plain text immediately; highlighted version replaces it once ready.\n      return html`<div class=\"content-text\">${this.content}</div>`;\n    }\n    if (this._renderFormat === 'code') {\n      return html`\n        <div class=\"content-code\">\n          <pre><code>${unsafeHTML(this._renderedHtml)}</code></pre>\n        </div>\n      `;\n    }\n    return html`<div class=\"content-rich\">${unsafeHTML(this._renderedHtml)}</div>`;\n  }\n\n  render() {\n    const showLangBadge = this.format === 'code' && this.language;\n\n    return html`\n      <div class=\"panel\" part=\"panel\">\n        <div class=\"header\" part=\"header\">\n          ${this.title\n            ? html`<span class=\"title\" part=\"title\">${this.title}</span>`\n            : nothing}\n          ${showLangBadge\n            ? html`<span class=\"lang-badge\">${this.language}</span>`\n            : nothing}\n          <button\n            class=\"action-btn ${this._copied ? 'copy-done' : ''}\"\n            title=\"Copy to clipboard\"\n            @click=${this._copy}\n          >\n            <sw-ui-icon name=${this._copied ? 'check-circle' : 'copy'} size=\"16\"></sw-ui-icon>\n          </button>\n          <button class=\"action-btn\" title=\"Close\" @click=${this._close}>\n            <sw-ui-icon name=\"close\" size=\"16\"></sw-ui-icon>\n          </button>\n        </div>\n        <div class=\"body\" part=\"body\">\n          ${this._renderBody()}\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-content-drawer': SwUiContentDrawer;\n  }\n}\n","import type { TranscriptEntry, TranscriptEntryMeta } from '../components/UI/sw-ui-transcript-view.js';\n\n/**\n * Serializes a transcript entry list to a Markdown string.\n *\n * Format per entry type:\n *   user   → **You:** text\n *   agent  → **Agent:** text\n *   system → *text*\n *\n * meta.code  → fenced code block (with language tag when present)\n * meta.links → markdown link list appended after the message text\n */\nexport function transcriptToMarkdown(entries: TranscriptEntry[]): string {\n  const timestamp = new Date().toLocaleString(undefined, {\n    year: 'numeric',\n    month: 'long',\n    day: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit',\n  });\n\n  const lines: string[] = [`# Transcript`, ``, `*Generated: ${timestamp}*`, ``];\n\n  const completed = entries.filter((e) => e.state === 'complete');\n\n  for (const entry of completed) {\n    lines.push('---', '');\n    lines.push(...serializeEntry(entry), '');\n  }\n\n  if (completed.length > 0) {\n    lines.push('---', '');\n  }\n\n  return lines.join('\\n');\n}\n\nfunction serializeEntry(entry: TranscriptEntry): string[] {\n  const lines: string[] = [];\n\n  switch (entry.type) {\n    case 'user':\n      lines.push(`**You:** ${entry.text}`);\n      break;\n    case 'agent':\n      lines.push(`**Agent:** ${entry.text}`);\n      break;\n    case 'system':\n      lines.push(`*${entry.text}*`);\n      break;\n  }\n\n  if (entry.meta?.code) {\n    const { language = '', content } = entry.meta.code;\n    lines.push('', `\\`\\`\\`${language}`, content, '```');\n  }\n\n  if (entry.meta?.links?.length) {\n    lines.push('');\n    for (const link of entry.meta.links) {\n      lines.push(`- [${link.label}](${link.url})`);\n    }\n  }\n\n  if (entry.meta?.displayContent) {\n    lines.push(...serializeDisplayContent(entry.meta.displayContent));\n  }\n\n  return lines;\n}\n\nfunction serializeDisplayContent(\n  dc: NonNullable<TranscriptEntryMeta['displayContent']>\n): string[] {\n  const lines: string[] = [''];\n\n  switch (dc.format) {\n    case 'code':\n      lines.push(`\\`\\`\\`${dc.language ?? ''}`, dc.content, '```');\n      break;\n    case 'markdown':\n      lines.push(dc.content);\n      break;\n    case 'html':\n      // Wrap in an HTML comment so the file stays valid markdown while\n      // preserving the raw payload for anyone who needs it.\n      lines.push('<!-- html content -->', dc.content, '<!-- /html content -->');\n      break;\n    default:\n      lines.push(dc.content);\n  }\n\n  return lines;\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { highlight } from '../../utils/prism.js';\nimport { transcriptToMarkdown } from '../../utils/transcriptToMarkdown.js';\nimport { hostReset } from './host-reset.js';\n\n/**\n * A single transcript entry rendered as a chat bubble.\n *\n * The optional `meta` field carries rich content from the AI.\n */\nexport interface TranscriptEntry {\n  id: string;\n  type: 'user' | 'agent' | 'system';\n  state: 'partial' | 'complete';\n  text: string;\n  meta?: TranscriptEntryMeta;\n}\n\n/** Rich content attached to a transcript entry. */\nexport interface TranscriptEntryMeta {\n  /** Clickable links. */\n  links?: { label: string; url: string }[];\n  /** Code snippet. */\n  code?: { language?: string; content: string };\n  /**\n   * Content that the agent pushed via a `display_content` user_event.\n   * Stored here so the download serializer can include the full payload.\n   */\n  displayContent?: {\n    title?: string;\n    content: string;\n    format: 'text' | 'markdown' | 'code' | 'html';\n    language?: string;\n  };\n}\n\n@customElement('sw-ui-transcript-view')\nexport class SwUiTranscriptView extends LitElement {\n  static styles = [hostReset, css`\n      :host {\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        background: var(--bg-page);\n        color: var(--fg-default);\n        font-family: var(--type-family-body);\n        font-size: var(--type-size-small);\n        overflow: hidden;\n      }\n\n      .header {\n        flex: 0 0 auto;\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        padding: 8px 10px 8px 14px;\n        font-size: 11px;\n        font-weight: 600;\n        letter-spacing: 0.08em;\n        text-transform: uppercase;\n        color: color-mix(in srgb, var(--fg-default) 40%, transparent);\n        border-bottom: 1px solid var(--border-default);\n        user-select: none;\n      }\n\n      .download-btn {\n        all: unset;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 26px;\n        height: 26px;\n        border-radius: 5px;\n        cursor: pointer;\n        color: color-mix(in srgb, var(--fg-default) 50%, transparent);\n        transition:\n          background var(--transition-fast),\n          color var(--transition-fast);\n      }\n\n      .download-btn:hover {\n        background: var(--bg-surface-raised);\n        color: var(--fg-default);\n      }\n\n\n      .messages {\n        flex: 1;\n        overflow-y: auto;\n        overflow-x: hidden;\n        padding: 10px 12px 14px;\n        display: flex;\n        flex-direction: column;\n        gap: 8px;\n        scroll-behavior: smooth;\n      }\n\n      .messages::-webkit-scrollbar {\n        width: 4px;\n      }\n      .messages::-webkit-scrollbar-track {\n        background: transparent;\n      }\n      .messages::-webkit-scrollbar-thumb {\n        background: var(--bg-surface-raised);\n        border-radius: 2px;\n      }\n\n      .empty {\n        flex: 1;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-size: 13px;\n        color: rgba(255, 255, 255, 0.25);\n        padding: 20px;\n        text-align: center;\n      }\n\n      .bubble {\n        max-width: 85%;\n        padding: 8px 12px;\n        border-radius: 14px;\n        font-size: 0.8125rem;\n        line-height: 1.45;\n        word-break: break-word;\n        animation: pop-in 0.15s ease-out;\n      }\n\n      @keyframes pop-in {\n        from {\n          opacity: 0;\n          transform: scale(0.94) translateY(4px);\n        }\n        to {\n          opacity: 1;\n          transform: scale(1) translateY(0);\n        }\n      }\n\n      .user {\n        align-self: flex-end;\n        background: var(--interactive-button-primary-bg);\n        color: #fff;\n        border-bottom-right-radius: 4px;\n      }\n      .agent {\n        align-self: flex-start;\n        background: var(--bg-surface);\n        color: var(--fg-default);\n        border-bottom-left-radius: 4px;\n      }\n      .system {\n        align-self: center;\n        background: transparent;\n        border: 1px solid var(--border-default);\n        color: var(--fg-default);\n        font-size: 0.75rem;\n        max-width: 95%;\n      }\n\n      .partial {\n        opacity: 0.55;\n      }\n\n      /* ── Links ── */\n      .meta-links {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 6px;\n        margin-top: 6px;\n      }\n\n      .meta-links a {\n        color: var(--interactive-button-primary-bg);\n        text-decoration: none;\n        font-size: 0.75rem;\n        padding: 2px 8px;\n        border: 1px solid var(--interactive-button-primary-bg);\n        border-radius: 4px;\n        transition: background var(--transition-fast);\n      }\n\n      .meta-links a:hover {\n        background: var(--interactive-button-primary-bg);\n        color: #fff;\n      }\n\n      /* ── Code block ── */\n      .meta-code {\n        margin-top: 8px;\n        border-radius: 6px;\n        overflow: hidden;\n      }\n\n      .meta-code pre {\n        margin: 0;\n        padding: 10px 12px;\n        background: #1a1b26;\n        overflow-x: auto;\n        font-size: 0.72rem;\n        line-height: 1.5;\n      }\n\n      .meta-code code {\n        font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, Consolas, monospace;\n        color: #f8f8f2;\n      }\n\n      /* ── Prism Okaidia theme ── */\n      .token.comment,\n      .token.prolog,\n      .token.doctype,\n      .token.cdata {\n        color: #8292a2;\n      }\n      .token.punctuation {\n        color: #f8f8f2;\n      }\n      .token.namespace {\n        opacity: 0.7;\n      }\n      .token.property,\n      .token.tag,\n      .token.constant,\n      .token.symbol,\n      .token.deleted {\n        color: #f92672;\n      }\n      .token.boolean,\n      .token.number {\n        color: #ae81ff;\n      }\n      .token.selector,\n      .token.attr-name,\n      .token.string,\n      .token.char,\n      .token.builtin,\n      .token.inserted {\n        color: #a6e22e;\n      }\n      .token.operator,\n      .token.entity,\n      .token.url,\n      .token.variable {\n        color: #f8f8f2;\n      }\n      .token.atrule,\n      .token.attr-value,\n      .token.function,\n      .token.class-name {\n        color: #e6db74;\n      }\n      .token.keyword {\n        color: #66d9ef;\n      }\n      .token.regex,\n      .token.important {\n        color: #fd971f;\n      }\n      .token.important,\n      .token.bold {\n        font-weight: bold;\n      }\n      .token.italic {\n        font-style: italic;\n      }\n    `];\n\n  @property({ attribute: false }) entries: TranscriptEntry[] = [];\n  @property({ type: String }) header = 'Transcript';\n  @property({ type: String, attribute: 'empty-text' }) emptyText = '';\n\n  // entry.id → highlighted HTML (populated asynchronously)\n  @state() private _codeCache = new Map<string, string>();\n\n  private _lastEntryCount = 0;\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (this.entries.length !== this._lastEntryCount) {\n      this._lastEntryCount = this.entries.length;\n      this._autoScroll();\n    }\n    if (changed.has('entries')) {\n      void this._highlightNewEntries();\n    }\n  }\n\n  private async _highlightNewEntries(): Promise<void> {\n    const toHighlight = this.entries.filter((e) => e.meta?.code && !this._codeCache.has(e.id));\n    if (toHighlight.length === 0) return;\n\n    await Promise.all(\n      toHighlight.map(async (e) => {\n        const { content, language = '' } = e.meta!.code!;\n        const html = await highlight(content, language);\n        this._codeCache = new Map(this._codeCache).set(e.id, html);\n      })\n    );\n\n    // The highlighted re-render extends the scroll height — scroll again\n    // now that the final DOM height is known.\n    await this.updateComplete;\n    this._autoScroll();\n  }\n\n  private _downloadTranscript(): void {\n    const md = transcriptToMarkdown(this.entries);\n    const blob = new Blob([md], { type: 'text/markdown;charset=utf-8' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = `transcript-${new Date().toISOString().slice(0, 10)}.md`;\n    a.click();\n    URL.revokeObjectURL(url);\n  }\n\n  private _autoScroll(): void {\n    const el = this.shadowRoot?.querySelector('.messages');\n    if (!el) return;\n    const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 120;\n    if (nearBottom) el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });\n  }\n\n  private _renderCode(entry: TranscriptEntry) {\n    const code = entry.meta?.code;\n    if (!code) return nothing;\n    const cached = this._codeCache.get(entry.id);\n    return html`\n      <div class=\"meta-code\" part=\"code\">\n        <pre><code>${cached ? unsafeHTML(cached) : code.content}</code></pre>\n      </div>\n    `;\n  }\n\n  render() {\n    const hasEntries = this.entries.some((e) => e.state === 'complete');\n\n    return html`\n      <div class=\"header\" part=\"header\">\n        <span>${this.header}</span>\n        <button\n          class=\"download-btn\"\n          part=\"download-btn\"\n          title=\"Download transcript as Markdown\"\n          ?disabled=${!hasEntries}\n          @click=${this._downloadTranscript}\n        >\n          <sw-ui-icon name=\"download\" size=\"15\"></sw-ui-icon>\n        </button>\n      </div>\n\n      ${this.entries.length === 0\n        ? html`<div class=\"empty\" part=\"empty\">${this.emptyText}</div>`\n        : html`\n            <div class=\"messages\" part=\"messages\">\n              ${this.entries.map(\n                (e) => html`\n                  <div\n                    class=\"bubble ${e.type} ${e.state === 'partial' ? 'partial' : ''}\"\n                    part=\"bubble bubble-${e.type}\"\n                  >\n                    ${e.text}\n                    ${e.meta?.links?.length\n                      ? html`<div class=\"meta-links\">\n                          ${e.meta.links.map(\n                            (l) =>\n                              html`<a href=${l.url} target=\"_blank\" rel=\"noopener\">${l.label}</a>`\n                          )}\n                        </div>`\n                      : nothing}\n                    ${this._renderCode(e)}\n                  </div>\n                `\n              )}\n            </div>\n          `}\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-transcript-view': SwUiTranscriptView;\n  }\n}\n","import { LitElement, css, html } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { hostReset } from './host-reset.js';\n\nexport type PromptType = 'confirm' | 'alert';\n\n/**\n * Confirmation/alert prompt dialog\n *\n * @slot description content (falls back to the `description` property)\n */\n@customElement('sw-ui-alert')\nexport class SwUiAlert extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      font-family: var(--type-family-body);\n    }\n\n    dialog {\n      border: none;\n      border-radius: var(--radius-md);\n      padding: 24px;\n      min-width: 280px;\n      max-width: 400px;\n      box-shadow: var(--shadow-md);\n    }\n\n    dialog::backdrop {\n      background: rgba(0, 0, 0, 0.4);\n    }\n\n    .title {\n      margin: 0 0 12px;\n      font-size: 1.125rem;\n      font-weight: 600;\n    }\n\n    .body {\n      margin: 0 0 20px;\n      line-height: 1.5;\n    }\n\n    .actions {\n      display: flex;\n      gap: 8px;\n      justify-content: flex-end;\n    }\n\n    button {\n      padding: 8px 16px;\n      border: none;\n      border-radius: 4px;\n      cursor: pointer;\n      font-size: 0.875rem;\n      font-family: inherit;\n    }\n\n    .accept {\n      background: var(--interactive-button-primary-bg);\n      color: white;\n    }\n\n    .accept:hover {\n      background: var(--interactive-button-primary-hover);\n    }\n\n    .reject {\n      background: #f3f4f6;\n      color: #374151;\n    }\n\n    .reject:hover {\n      background: #e5e7eb;\n    }\n  `];\n\n  @property() declare title: string;\n  @property() description = '';\n  @property({ reflect: true }) type: PromptType = 'confirm';\n\n  @query('dialog') private _dialog!: HTMLDialogElement;\n\n  private _resolve: ((value: boolean) => void) | null = null;\n\n  /** Opens the prompt and returns a promise that resolves with the user's choice. */\n  show(): Promise<boolean> {\n    this._dialog.showModal();\n    return new Promise((resolve) => {\n      this._resolve = resolve;\n    });\n  }\n\n  private _close(value: boolean) {\n    this._resolve?.(value);\n    this._resolve = null;\n    this._dialog.close();\n  }\n\n  render() {\n    return html`\n      <dialog>\n        <h2 class=\"title\">${this.title}</h2>\n        <div class=\"body\">\n          <slot>${this.description}</slot>\n        </div>\n        <div class=\"actions\">\n          ${this.type === 'confirm'\n            ? html`\n                <button class=\"reject\" @click=${() => this._close(false)}>Reject</button>\n                <button class=\"accept\" @click=${() => this._close(true)}>Accept</button>\n              `\n            : html` <button class=\"accept\" @click=${() => this._close(true)}>OK</button> `}\n        </div>\n      </dialog>\n    `;\n  }\n}\n\n/**\n * Programmatically show a prompt and await the user's response.\n *\n * @example\n * const confirmed = await showPrompt({ title: \"Delete item?\", type: \"confirm\" });\n * const ack = await showPrompt({ title: \"Done!\", type: \"alert\" });\n */\nexport async function showPrompt(options: {\n  title: string;\n  description?: string;\n  type?: PromptType;\n}): Promise<boolean> {\n  const el = document.createElement('sw-ui-alert') as SwUiAlert;\n  el.title = options.title;\n  if (options.description !== undefined) el.description = options.description;\n  if (options.type !== undefined) el.type = options.type;\n  document.body.appendChild(el);\n  await el.updateComplete;\n  const result = await el.show();\n  el.remove();\n  return result;\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-alert': SwUiAlert;\n  }\n}\n","/**\n * Load a Google Font into the document. Idempotent — calling twice with the\n * same arguments injects only one `<link>`.\n *\n * @example\n * useGoogleFont('Lexend', { weights: [400, 500, 700] });\n * useGoogleFont('JetBrains Mono');\n */\nexport interface UseGoogleFontOptions {\n  /** Font weights to load. Defaults to `[400]`. */\n  weights?: number[];\n  /** `font-display` strategy. Defaults to `'swap'`. */\n  display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n  /** Whether to load italic variants alongside the upright weights. */\n  italic?: boolean;\n}\n\nconst GOOGLE_FONTS_BASE = 'https://fonts.googleapis.com/css2';\n\nexport function useGoogleFont(name: string, options: UseGoogleFontOptions = {}): void {\n  if (typeof document === 'undefined') return;\n\n  const weights = options.weights ?? [400];\n  const display = options.display ?? 'swap';\n  const family = name.replace(/\\s+/g, '+');\n\n  const axis = options.italic\n    ? `ital,wght@${weights.flatMap((w) => [`0,${w}`, `1,${w}`]).join(';')}`\n    : `wght@${weights.join(';')}`;\n\n  const href = `${GOOGLE_FONTS_BASE}?family=${family}:${axis}&display=${display}`;\n\n  if (document.querySelector(`link[href=\"${href}\"]`)) return;\n\n  const link = document.createElement('link');\n  link.rel = 'stylesheet';\n  link.href = href;\n  document.head.appendChild(link);\n}\n","import themeCss from '../theme.css?inline';\nimport { useGoogleFont } from './use-google-font.js';\n\nlet themeAdopted = false;\n\n/**\n * Inject the SignalWire design-token stylesheet into the document so all\n * components — including those in shadow roots — can resolve `--bg-page`,\n * `--fg-default`, `--interactive-button-primary-bg`, etc.\n *\n * Idempotent. Calling twice is a no-op.\n */\nexport function ensureSignalWireTheme(): void {\n  if (typeof document === 'undefined' || themeAdopted) return;\n  themeAdopted = true;\n\n  const sheet = new CSSStyleSheet();\n  sheet.replaceSync(themeCss);\n  document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n}\n\n/** Load the three SignalWire brand font families via Google Fonts. */\nexport function ensureSignalWireFonts(): void {\n  useGoogleFont('Lexend', { weights: [300, 400, 500, 600, 700] });\n  useGoogleFont('Instrument Sans', { weights: [400, 500, 600, 700] });\n  useGoogleFont('JetBrains Mono', { weights: [400, 500] });\n}\n","import { getLogger } from '@signalwire/js';\n\nconst logger = getLogger();\n\n/** Formats the widget's content drawer can render. */\nexport const WIDGET_DISPLAY_FORMATS = ['text', 'markdown', 'code', 'html'] as const;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n  return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Parse a user-supplied JSON string into a userVariables object. Returns an\n * empty object on null/undefined/empty input, and on parse failure logs a\n * warning and returns an empty object — never throws.\n */\nexport function parseUserVariablesAttribute(\n  raw: string | null | undefined\n): Record<string, unknown> {\n  if (!raw) return {};\n  try {\n    const parsed = JSON.parse(raw);\n    if (!isPlainObject(parsed)) {\n      logger.warn('[CallWidget] user-variables must be a JSON object; ignoring');\n      return {};\n    }\n    return parsed;\n  } catch (err) {\n    logger.warn('[CallWidget] Failed to parse user-variables JSON; ignoring', err);\n    return {};\n  }\n}\n\n/**\n * Merge widget self-advertisement (display_content capability + opened_at\n * timestamp) into a userVariables object. User-supplied keys win on shallow\n * conflict; capability and metadata sub-objects are deep-merged one level so\n * callers can add their own keys without losing the widget's signal.\n *\n * The shape matches what `Sigmond2Agent._caller_has_display` looks for:\n *   - `capabilities.display_content` (signal #1)\n *   - `metadata.widget.opened_at`    (signal #2)\n */\nexport function withWidgetCapabilities(\n  base: Record<string, unknown>,\n  now: () => string = () => new Date().toISOString()\n): Record<string, unknown> {\n  const baseCaps = isPlainObject(base['capabilities']) ? base['capabilities'] : {};\n  const baseMeta = isPlainObject(base['metadata']) ? base['metadata'] : {};\n  const baseWidget = isPlainObject(baseMeta['widget']) ? baseMeta['widget'] : {};\n\n  return {\n    ...base,\n    capabilities: {\n      display_content: { formats: [...WIDGET_DISPLAY_FORMATS] },\n      ...baseCaps,\n    },\n    metadata: {\n      ...baseMeta,\n      widget: {\n        opened_at: now(),\n        ...baseWidget,\n      },\n    },\n  };\n}\n","import {\n  StaticCredentialProvider,\n  EmbedTokenCredentialProvider,\n} from '@signalwire/js';\n\nconst EMBED_TOKEN_PREFIXES = ['c2c_', 'c2t_'] as const;\nexport const DEFAULT_EMBED_HOST = 'embeds.signalwire.com';\n\nexport function normalizeHost(h: string): string {\n  try {\n    const url = new URL(h.includes('://') ? h : `https://${h}`);\n    return url.hostname;\n  } catch {\n    return h;\n  }\n}\n\nexport function isEmbedToken(t: string): boolean {\n  return EMBED_TOKEN_PREFIXES.some((p) => t.startsWith(p));\n}\n\nexport function buildCredentialProvider(token: string, host: string) {\n  if (isEmbedToken(token)) {\n    return new EmbedTokenCredentialProvider(\n      normalizeHost(host || DEFAULT_EMBED_HOST),\n      token,\n    );\n  }\n  return new StaticCredentialProvider({ token });\n}\n","import { css, html, nothing, type TemplateResult } from 'lit';\nimport type { DisplayContentPayload } from '../UI/layout/sw-ui-content-drawer.js';\nimport type { TranscriptEntry } from '../../context/transcript-context.js';\n\nexport const widgetStyles = css`\n  :host {\n    display: block;\n    height: 100%;\n    font-family: var(--type-family-body);\n\n    --sw-control-bar-bg: #000;\n    --sw-control-bar-padding: 6px 12px;\n    --sw-control-bar-gap: 6px;\n    --sw-control-bar-radius: 0;\n    --sw-split-button-width: 56px;\n    --sw-split-button-height: 36px;\n  }\n\n  .call-view-wrapper {\n    position: relative;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n  }\n`;\n\nexport interface CallViewOpts {\n  transcription: boolean;\n  hasLayoutLayers: boolean;\n  drawer: DisplayContentPayload | null;\n  transcriptEntries: TranscriptEntry[];\n  onHangUp: () => void;\n  onFullscreenToggle: () => void;\n  onTranscriptToggle: () => void;\n  onDrawerClose: () => void;\n}\n\nexport function renderCallView(opts: CallViewOpts): TemplateResult {\n  return html`\n    <div class=\"call-view-wrapper\">\n      <sw-ui-call-layout\n        ?transcript=${opts.transcription}\n        shadow\n        style=\"--sw-call-layout-radius: 10px;\"\n      >\n        <slot name=\"background\" slot=\"background\"></slot>\n\n        <sw-call-media slot=\"video\"></sw-call-media>\n\n        ${!opts.hasLayoutLayers\n          ? html`<sw-local-camera slot=\"floating-video\" mirror></sw-local-camera>`\n          : nothing}\n\n        <sw-call-controls\n          slot=\"controls\"\n          show-screen-share\n          show-hand-raise\n          show-transcript\n          .transcriptActive=${opts.transcription}\n          @sw-call-hangup=${opts.onHangUp}\n          @sw-fullscreen-toggle=${opts.onFullscreenToggle}\n          @sw-transcript-toggle=${opts.onTranscriptToggle}\n        ></sw-call-controls>\n\n        <sw-ui-transcript-view\n          slot=\"transcript\"\n          .entries=${opts.transcriptEntries}\n        ></sw-ui-transcript-view>\n      </sw-ui-call-layout>\n\n      <sw-ui-content-drawer\n        ?open=${opts.drawer !== null}\n        .title=${opts.drawer?.title ?? ''}\n        .content=${opts.drawer?.content ?? ''}\n        .format=${opts.drawer?.format ?? 'text'}\n        .language=${opts.drawer?.language ?? ''}\n        @sw-content-drawer-close=${opts.onDrawerClose}\n      ></sw-ui-content-drawer>\n    </div>\n  `;\n}\n\nexport function renderConnecting(): TemplateResult {\n  return html`\n    <div class=\"call-view-wrapper\">\n      <sw-ui-call-layout loading shadow style=\"--sw-call-layout-radius: 10px;\">\n        <slot name=\"background\" slot=\"background\"></slot>\n      </sw-ui-call-layout>\n    </div>\n  `;\n}\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { SignalWire, getLogger } from '@signalwire/js';\nimport type { Call } from '../../types/index.js';\nimport { Subscription } from 'rxjs';\nimport { first, filter } from 'rxjs/operators';\n\nimport { CallStateContextController } from '../../context/CallStateContextController.js';\nimport { IncomingCallController } from '../../context/call-state-context.js';\nimport type { IncomingCallInfo } from '../../context/call-state-context.js';\nimport { DevicesContextController } from '../../context/DevicesContextController.js';\nimport { TranscriptController } from '../../context/TranscriptController.js';\nimport { UserEventController } from '../../context/UserEventController.js';\n\nimport '../sw-call-media.js';\nimport '../sw-local-camera.js';\nimport '../sw-call-controls.js';\nimport '../UI/layout/sw-ui-call-layout.js';\nimport '../UI/layout/sw-ui-responsive-container.js';\nimport '../UI/layout/sw-ui-modal.js';\nimport '../UI/layout/sw-ui-background.js';\nimport '../UI/layout/sw-ui-content-drawer.js';\nimport '../UI/sw-ui-transcript-view.js';\nimport { showPrompt } from '../UI/sw-ui-alert.js';\nimport type { DisplayContentPayload } from '../UI/layout/sw-ui-content-drawer.js';\nimport { ensureSignalWireTheme, ensureSignalWireFonts } from '../../utils/theme-loader.js';\nimport {\n  parseUserVariablesAttribute,\n  withWidgetCapabilities,\n} from '../../utils/user-variables.js';\nimport { hostReset } from '../UI/host-reset.js';\nimport { buildCredentialProvider } from './client-factory.js';\nimport {\n  widgetStyles,\n  renderCallView,\n  renderConnecting,\n} from './sw-call-widget.templates.js';\n\nconst logger = getLogger();\n\n/**\n * All-in-one call widget. Handles client initialisation, dialling, media,\n * controls and optional AI transcript — in either inline or modal modes.\n *\n * Composes `sw-ui-call-layout`, `sw-call-media`, `sw-local-camera`,\n * `sw-call-controls`, and `sw-ui-transcript-view` under the hood.\n * All child components are wired via Lit context — no manual plumbing needed.\n *\n * @prop {string}  token         - SignalWire SAT or embed token\n * @prop {string}  host          - Optional server host\n * @prop {string}  destination   - Call destination (address or resource)\n * @prop {boolean} modal         - Render in a `<sw-ui-modal>` overlay\n * @prop {boolean} transcription - Show AI transcript panel\n *\n * @slot background - Background element (e.g. `<sw-ui-background default>`)\n * @slot (default)  - Trigger element (click to dial, shown when idle)\n *\n * @fires sw-dial                  - When `dial()` is invoked. Detail: `{ destination }`.\n * @fires sw-call-ended            - When the call reaches a terminal state (user hangup, remote disconnect, or failure). Detail: `{ status }`.\n * @fires sw-display-content       - From `display_content` user event. Detail: `DisplayContentPayload`.\n * @fires signalwire-address:event - Forwarded SignalWire custom user events.\n *\n * All inner events bubble.\n *\n * @method dial()   - Initiate call\n * @method hangup() - End active call\n */\n@customElement('sw-call-widget')\nexport class SwCallWidget extends LitElement {\n  static styles = [hostReset, widgetStyles];\n\n  // ── Public properties ──────────────────────────────────────────────\n\n  @property({ type: String }) token = '';\n  @property({ type: String }) host = '';\n  @property({ type: String }) destination = '';\n  @property({ type: Boolean, reflect: true }) modal = false;\n  @property({ type: Boolean, reflect: true }) transcription = false;\n  @property({ type: Boolean, reflect: true, attribute: 'allow-incoming-calls' }) allowIncomingCalls = false;\n  @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n  /**\n   * Custom variables sent with the Verto invite as a JSON object.\n   *\n   * The widget always advertises `capabilities.display_content` and\n   * `metadata.widget.opened_at` so the agent can detect that the caller\n   * supports the content drawer; user-supplied keys are merged in and win\n   * on shallow conflict.\n   *\n   * Invalid JSON is logged and ignored — the call still dials.\n   *\n   * @example\n   *   <sw-call-widget user-variables='{\"customer_id\": \"abc-123\"}'></sw-call-widget>\n   */\n  @property({ type: String, attribute: 'user-variables' }) userVariables = '';\n\n  /**\n   * Skip auto-injecting the SignalWire `theme.css` design-token stylesheet.\n   * Set this when the host page already loads `@signalwire/web-components/theme.css`\n   * or a custom theme written against the same DTCG token names.\n   */\n  @property({ type: Boolean, reflect: true, attribute: 'disable-auto-theme' }) disableAutoTheme = false;\n\n  /**\n   * Skip auto-loading the SignalWire brand fonts (Lexend, Instrument Sans,\n   * JetBrains Mono) from Google Fonts. Set this when fonts are self-hosted\n   * or loaded elsewhere.\n   */\n  @property({ type: Boolean, reflect: true, attribute: 'disable-auto-fonts' }) disableAutoFonts = false;\n\n  // ── Internal state ─────────────────────────────────────────────────\n\n  @state() private _call: Call | null = null;\n  @state() private _connecting = false;\n  @state() private _hasLayoutLayers = false;\n  @state() private _drawer: DisplayContentPayload | null = null;\n\n  // ── Context providers ──────────────────────────────────────────────\n\n  private _callState = new CallStateContextController(this);\n  private _devices = new DevicesContextController(this);\n  private _transcript: TranscriptController = new TranscriptController(this);\n  private _userEventCtrl = new UserEventController(this);\n  private _incomingCalls = new IncomingCallController(this);\n\n  // ── Internals ──────────────────────────────────────────────────────\n\n  private _client: SignalWire | null = null;\n  private _subs: Subscription[] = [];\n  private _pendingIncoming = false;\n\n  // ── Lifecycle ──────────────────────────────────────────────────────\n\n  connectedCallback(): void {\n    super.connectedCallback();\n    if (!this.disableAutoTheme) ensureSignalWireTheme();\n    if (!this.disableAutoFonts) ensureSignalWireFonts();\n  }\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('token') || changed.has('host')) {\n      if (this.token) {\n        this._refreshClient();\n      } else if (changed.has('host')) {\n        // Host changed but no token configured yet — defer client init until\n        // the consumer sets `.token`. Surface this so misconfigurations\n        // (e.g. forgetting to bind token) don't fail silently.\n        logger.debug(\n          '[SwCallWidget] host changed but token is empty; skipping client refresh until token is set',\n        );\n      }\n    } else if (changed.has('allowIncomingCalls') && this._client) {\n      if (this.allowIncomingCalls) {\n        this._connectIncomingCalls();\n      } else {\n        this._incomingCalls.disconnect();\n      }\n    }\n  }\n\n  disconnectedCallback(): void {\n    super.disconnectedCallback();\n    this._destroyClient();\n  }\n\n  // ── Client lifecycle ───────────────────────────────────────────────\n\n  private _destroyClient(): void {\n    this._subs.forEach((s) => s.unsubscribe());\n    this._subs = [];\n\n    this._incomingCalls.disconnect();\n    this._devices.disconnectCall();\n    this._devices.disconnect();\n    this._callState.disconnect();\n    this._transcript.setCall(undefined);\n\n\n    if (this._client) {\n      try {\n        this._client.destroy();\n      } catch (e) {\n        logger.error('[SwCallWidget] Error destroying client:', e);\n      }\n      this._client = null;\n    }\n\n    this._call = null;\n    this._connecting = false;\n  }\n\n  private _refreshClient(): void {\n    this._destroyClient();\n    try {\n      this._client = new SignalWire(\n        buildCredentialProvider(this.token, this.host),\n      );\n      this._devices.connectDevices(this._client as unknown as import('../../types/index.js').DeviceController);\n\n      if (this.allowIncomingCalls) {\n        this._connectIncomingCalls();\n      }\n    } catch (e) {\n      const message = e instanceof Error ? e.message : 'Failed to initialise client';\n      logger.error('[SwCallWidget] Failed to initialise client:', e);\n      void showPrompt({ title: 'Client Error', description: message, type: 'alert' });\n    }\n  }\n\n  // ── Public methods ─────────────────────────────────────────────────\n\n  async dial(): Promise<void> {\n    if (!this._client || this._connecting || this._call) return;\n    if (!this.destination) {\n      void showPrompt({ title: 'Call Error', description: 'No destination configured.', type: 'alert' });\n      return;\n    }\n\n    this._connecting = true;\n\n    this.dispatchEvent(new CustomEvent('sw-dial', {\n      detail: { destination: this.destination },\n      bubbles: true,\n      composed: true,\n    }));\n\n    const wantsVideo = !this.audioOnly;\n\n    try {\n      const call = await new Promise<Call>((resolve, reject) => {\n        const sub = this._client!.isConnected$\n          .pipe(filter((c) => c), first())\n          .subscribe({\n            next: () => {\n              const userVariables = withWidgetCapabilities(\n                parseUserVariablesAttribute(this.userVariables)\n              );\n              this._client!\n                .dial(this.destination, {\n                  audio: true,\n                  video: wantsVideo,\n                  receiveAudio: true,\n                  receiveVideo: wantsVideo,\n                  userVariables,\n                })\n                .then(resolve)\n                .catch(reject);\n            },\n            error: reject,\n          });\n        this._subs.push(sub);\n      });\n\n      this._wireCall(call);\n    } catch (e) {\n      const message = e instanceof Error ? e.message : 'Failed to connect call';\n      logger.error('[SwCallWidget] Dial failed:', e);\n      void showPrompt({ title: 'Call Failed', description: message, type: 'alert' });\n    } finally {\n      this._connecting = false;\n    }\n  }\n\n  async hangup(): Promise<void> {\n    if (this._call) {\n      await this._call.hangup();\n    }\n  }\n\n  // ── Incoming calls ──────────────────────────────────────────────────\n\n  private _connectIncomingCalls(): void {\n    if (!this._client) return;\n    this._incomingCalls.onIncomingCall = this._handleIncomingCall;\n    this._subs.push(\n      this._client.isConnected$\n        .pipe(filter(Boolean), first())\n        .subscribe(() => {\n          if (this._client) {\n            this._incomingCalls.connect(this._client.session.incomingCalls$);\n          }\n        })\n    );\n  }\n\n  private _handleIncomingCall = async (info: IncomingCallInfo): Promise<void> => {\n    if (this._call || this._connecting || this._pendingIncoming) return;\n    this._pendingIncoming = true;\n\n    try {\n      const callerDisplay = info.callerName || info.callerNumber || 'Unknown Caller';\n      // TODO(ringing-ux): the confirm dialog is a placeholder, not a real\n      // ringing UI. Missing: caller avatar, audible ringtone, distinction\n      // between \"ignore\" (let it keep ringing) and \"reject\" (decline now),\n      // and a timeout. Replace with a dedicated `<sw-ui-incoming-call>`.\n      const accepted = await showPrompt({\n        title: 'Incoming Call',\n        description: `${callerDisplay} is calling`,\n        type: 'confirm',\n      });\n\n      if (accepted) {\n        this._wireCall(info.call);\n        info.call.answer();\n      } else {\n        info.call.reject();\n      }\n    } finally {\n      this._pendingIncoming = false;\n    }\n  };\n\n  // ── Call wiring ────────────────────────────────────────────────────\n\n  private _wireCall(call: Call): void {\n    this._call = call;\n\n    // Wire contexts\n    this._callState.connect(call);\n    this._devices.connectCall(call);\n    this._transcript.setCall(call);\n\n    // Always subscribe to user_event for display_content and pass-through\n    this._userEventCtrl.setCall(call);\n    this.addEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n    // Re-enumerate devices now that getUserMedia has granted permission\n    this._devices.refreshDevices();\n\n    // Track layout layers to know when MCU composites local camera\n    this._subs.push(\n      call.layoutLayers$.subscribe((layers) => {\n        this._hasLayoutLayers = layers.length > 0;\n      })\n    );\n\n    // Watch for call end\n    this._subs.push(\n      call.status$.subscribe((status) => {\n        if (\n          status === 'disconnected' ||\n          status === 'destroyed' ||\n          status === 'failed'\n        ) {\n          this._unwireCall();\n        }\n      })\n    );\n  }\n\n  private _onDisplayContent = (e: CustomEvent<DisplayContentPayload>): void => {\n    this._drawer = e.detail;\n    this._transcript.injectEntry({\n      id: crypto.randomUUID(),\n      type: 'system',\n      state: 'complete',\n      text: e.detail.title ?? 'Agent shared content',\n      meta: { displayContent: e.detail },\n    });\n  };\n\n  private _onDrawerClose = (): void => {\n    this._drawer = null;\n  };\n\n  private _unwireCall(): void {\n    const endedCall = this._call;\n    const endedStatus = endedCall?.status;\n\n    this._callState.disconnect();\n    this._devices.disconnectCall();\n    this._transcript.setCall(undefined);\n    this._userEventCtrl.setCall(undefined);\n    this.removeEventListener('sw-display-content', this._onDisplayContent as EventListener);\n\n    this._call = null;\n    this._connecting = false;\n    this._hasLayoutLayers = false;\n    this._drawer = null;\n\n    if (endedCall) {\n      // Fires for any terminal transition — user hangup, remote disconnect,\n      // or failure. Distinct from `sw-call-hangup` which only fires when the\n      // user clicks the hangup button.\n      this.dispatchEvent(new CustomEvent('sw-call-ended', {\n        detail: { status: endedStatus },\n        bubbles: true,\n        composed: true,\n      }));\n    }\n  }\n\n  // ── Slot trigger ───────────────────────────────────────────────────\n\n  private _onSlotChange(e: Event): void {\n    const slot = e.target as HTMLSlotElement;\n    slot.assignedElements({ flatten: true }).forEach((el) => {\n      if (el instanceof HTMLElement) {\n        el.addEventListener('click', () => this.dial());\n      }\n    });\n  }\n\n  // ── Event handlers ─────────────────────────────────────────────────\n\n  private _onHangUp(): void {\n    this.hangup();\n  }\n\n  private _onModalClose = (e: Event): void => {\n    if (this._call || this._connecting) {\n      // Active call → hang up. Modal will close automatically once the\n      // call reaches a terminal state and `_unwireCall` clears `_call`.\n      this.hangup();\n      return;\n    }\n    if (!this.destination) {\n      // Pre-call dialpad state — no destination entered yet. Keep the\n      // modal open so the user doesn't lose their in-progress dialing.\n      e.preventDefault();\n    }\n  };\n\n  private _onFullscreenToggle(): void {\n    const layout = this.shadowRoot?.querySelector('sw-ui-call-layout');\n    if (layout) {\n      (layout as import('../UI/layout/sw-ui-call-layout.js').SwUiCallLayout).toggleFullscreen();\n    }\n  }\n\n  private _onTranscriptToggle(): void {\n    this.transcription = !this.transcription;\n  }\n\n  // ── Render ─────────────────────────────────────────────────────────\n\n  render() {\n    const isActive = !!(this._call || this._connecting);\n    const body = this._call\n      ? renderCallView({\n          transcription: this.transcription,\n          hasLayoutLayers: this._hasLayoutLayers,\n          drawer: this._drawer,\n          transcriptEntries: this._transcript.state.entries,\n          onHangUp: this._onHangUp,\n          onFullscreenToggle: this._onFullscreenToggle,\n          onTranscriptToggle: this._onTranscriptToggle,\n          onDrawerClose: this._onDrawerClose,\n        })\n      : this._connecting\n        ? renderConnecting()\n        : nothing;\n\n    if (this.modal) {\n      return html`\n        <slot @slotchange=${this._onSlotChange}></slot>\n        <sw-ui-modal ?open=${isActive} @sw-modal-close=${this._onModalClose}>\n          <sw-ui-responsive-container>\n            ${body !== nothing ? body : nothing}\n          </sw-ui-responsive-container>\n        </sw-ui-modal>\n      `;\n    }\n\n    if (body !== nothing) return body;\n\n    return html`<slot @slotchange=${this._onSlotChange}></slot>`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-call-widget': SwCallWidget;\n  }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport './sw-call-widget/sw-call-widget.js';\nimport './UI/layout/sw-ui-background.js';\nimport './UI/icons/sw-ui-icon.js';\nimport { hostReset } from './UI/host-reset.js';\n\n/**\n * Click-to-call button that opens a full call widget.\n *\n * Thin wrapper around `sw-call-widget` in modal mode. Renders a styled\n * call button; clicking it dials the preconfigured destination and opens\n * the call UI in a modal overlay.\n *\n * @prop {string} token       - SignalWire SAT or embed token\n * @prop {string} host        - Optional server host\n * @prop {string} destination - Call destination (address or resource)\n * @prop {string} label       - Button text (default \"Call\")\n * @prop {boolean} audioOnly  - Audio-only mode (no video send/receive)\n *\n * @fires sw-dial        - Fired when the call is initiated. Detail: `{ destination }`.\n * @fires sw-call-ended  - Fired when the call reaches a terminal state (any reason). Detail: `{ status }`.\n * @fires sw-call-hangup - Fired when the user clicks the hangup button (does not fire on remote disconnect).\n *\n * Themed via the SignalWire DTCG tokens (`--interactive-status-success`,\n * `--type-family-body`, `--type-size-body`, `--radius-md`, `--transition-fast`).\n */\n@customElement('sw-click-to-call')\nexport class SwClickToCall extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: inline-block;\n      font-family: var(--type-family-body);\n    }\n\n    .call-button {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      gap: 8px;\n      padding: 12px 20px;\n      background: var(--interactive-status-success);\n      color: #fff;\n      border: none;\n      border-radius: var(--radius-md);\n      font-family: inherit;\n      font-size: var(--type-size-body);\n      font-weight: 600;\n      cursor: pointer;\n      transition: filter var(--transition-fast), transform 0.1s ease;\n    }\n\n    .call-button:hover {\n      filter: brightness(0.9);\n    }\n\n    .call-button:active {\n      transform: scale(0.98);\n    }\n\n    .call-button sw-ui-icon {\n      pointer-events: none;\n    }\n  `];\n\n  @property({ type: String }) token = '';\n  @property({ type: String }) host = '';\n  @property({ type: String }) destination = '';\n  @property({ type: String }) label = 'Call';\n  @property({ type: Boolean, reflect: true, attribute: 'audio-only' }) audioOnly = false;\n\n  render() {\n    return html`\n      <sw-call-widget\n        modal\n        transcription\n        ?audio-only=${this.audioOnly}\n        .token=${this.token}\n        .host=${this.host}\n        .destination=${this.destination}\n      >\n        <sw-ui-background slot=\"background\" default></sw-ui-background>\n        <button class=\"call-button\" part=\"button\">\n          <sw-ui-icon name=\"phone-call\" size=\"20\"></sw-ui-icon>\n          ${this.label}\n        </button>\n      </sw-call-widget>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-click-to-call': SwClickToCall;\n  }\n}\n","/**\n * Directory Component\n *\n * A searchable list of addresses from the directory service.\n * Supports filtering, selection, and pagination.\n *\n * @example\n * ```html\n * <sw-directory .directory=${directory}></sw-directory>\n * ```\n *\n * @fires sw-address-select - Fired when an address is selected. Detail: `{ address: Address }`\n * @fires sw-dial - Fired when the call button on an address is clicked. Detail: `{ address: Address, channel: string }`\n *\n * @cssprop [--interactive-button-primary-bg=#044ef4] - Primary brand color\n * @cssprop [--interactive-button-primary-hover=#0342cf] - Primary color on hover\n * @cssprop [--interactive-status-success=#22c55e] - Success/positive color\n * @cssprop [--fg-default=#f0f0f4] - Primary text color\n * @cssprop [--fg-muted=#a0a0aa] - Secondary/muted text color\n * @cssprop [--bg-surface=#181a28] - Component background color\n * @cssprop [--bg-surface-raised=#222436] - Background color on hover\n * @cssprop [--interactive-dropdown-hover=#333338] - Background color on active/press\n * @cssprop [--border-default=rgba(255,255,255,0.12)] - Border color\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { Subscription } from 'rxjs';\nimport type { Observable } from 'rxjs';\nimport './UI/icons/sw-ui-icon.js';\nimport { hostReset } from './UI/host-reset.js';\n\n/**\n * Address type from SDK\n */\nexport interface Address {\n  id: string;\n  name: string;\n  displayName?: string;\n  type?: 'room' | 'person';\n  channels?: {\n    audio?: boolean;\n    video?: boolean;\n    messaging?: boolean;\n  };\n}\n\n/**\n * Directory interface for component\n */\nexport interface DirectoryService {\n  addresses$: Observable<Address[]>;\n  loading$?: Observable<boolean>;\n  hasMore$?: Observable<boolean>;\n  loadMore?(): Promise<void>;\n}\n\n@customElement('sw-directory')\nexport class SwDirectory extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: block;\n      font-family: var(--type-family-body);\n      color: var(--fg-default);\n    }\n\n    .container {\n      display: flex;\n      flex-direction: column;\n      background: var(--bg-surface);\n      border: 1px solid var(--border-default);\n      border-radius: var(--radius-md);\n      overflow: hidden;\n    }\n\n    .search {\n      display: flex;\n      align-items: center;\n      gap: var(--sp-2);\n      padding: var(--sp-3);\n      border-bottom: 1px solid var(--border-default);\n    }\n\n    .search-input {\n      flex: 1;\n      padding: var(--sp-2) var(--sp-3);\n      border: 1px solid var(--border-default);\n      border-radius: var(--radius-md);\n      background: var(--bg-surface);\n      color: var(--fg-default);\n      font-family: var(--type-family-body);\n      font-size: var(--type-size-small);\n      outline: none;\n      transition: border-color 0.15s ease;\n    }\n\n    .search-input:focus {\n      border-color: var(--interactive-button-primary-bg);\n    }\n\n    .search-input::placeholder {\n      color: var(--fg-muted);\n    }\n\n    .list {\n      display: flex;\n      flex-direction: column;\n      max-height: 400px;\n      overflow-y: auto;\n    }\n\n    .item {\n      display: flex;\n      align-items: center;\n      gap: var(--sp-3);\n      padding: var(--sp-3) var(--sp-4);\n      border-bottom: 1px solid var(--border-default);\n      cursor: pointer;\n      transition: background-color 0.15s ease;\n    }\n\n    .item:last-child {\n      border-bottom: none;\n    }\n\n    .item:hover {\n      background: var(--bg-surface-raised);\n    }\n\n    .item:active {\n      background: var(--interactive-dropdown-hover);\n    }\n\n    .item.selected {\n      background: var(--interactive-button-primary-bg);\n      color: white;\n    }\n\n    .item.selected .item-type,\n    .item.selected .item-channels {\n      color: rgba(255, 255, 255, 0.8);\n    }\n\n    .item-icon {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 40px;\n      height: 40px;\n      border-radius: 50%;\n      background: var(--bg-surface-raised);\n      color: var(--fg-muted);\n      flex-shrink: 0;\n    }\n\n    .item.selected .item-icon {\n      background: rgba(255, 255, 255, 0.2);\n      color: white;\n    }\n\n    .item-icon svg,\n    .item-icon sw-ui-icon {\n      width: 20px;\n      height: 20px;\n    }\n\n    .item-content {\n      flex: 1;\n      min-width: 0;\n    }\n\n    .item-name {\n      font-size: var(--type-size-small);\n      font-weight: 500;\n      color: inherit;\n      white-space: nowrap;\n      overflow: hidden;\n      text-overflow: ellipsis;\n    }\n\n    .item-type {\n      font-size: var(--type-size-caption);\n      color: var(--fg-muted);\n      text-transform: capitalize;\n    }\n\n    .item-channels {\n      display: flex;\n      gap: var(--sp-1);\n      color: var(--fg-muted);\n    }\n\n    .item-channels sw-ui-icon {\n      width: 16px;\n      height: 16px;\n    }\n\n    .item-channels sw-ui-icon.active {\n      color: var(--interactive-status-success);\n    }\n\n    .loading,\n    .empty {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: var(--sp-4);\n      color: var(--fg-muted);\n      font-size: var(--type-size-small);\n    }\n\n    .scroll-sentinel {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      padding: var(--sp-3);\n      min-height: 1px;\n    }\n\n    .scroll-loading {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: var(--sp-2);\n      padding: var(--sp-3);\n      color: var(--fg-muted);\n      font-size: var(--type-size-caption);\n    }\n\n    .spinner {\n      width: 16px;\n      height: 16px;\n      border: 2px solid var(--border-default);\n      border-top-color: var(--interactive-button-primary-bg);\n      border-radius: 50%;\n      animation: spin 0.8s linear infinite;\n    }\n\n    @keyframes spin {\n      to {\n        transform: rotate(360deg);\n      }\n    }\n\n    .dial-button {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      width: 36px;\n      height: 36px;\n      background: var(--interactive-status-success);\n      border: none;\n      border-radius: 50%;\n      color: white;\n      cursor: pointer;\n      flex-shrink: 0;\n      transition: background-color 0.15s ease;\n    }\n\n    .dial-button:hover {\n      background: #0ea472;\n    }\n\n    .dial-button sw-ui-icon {\n      pointer-events: none;\n    }\n  `];\n\n  /**\n   * Directory service with addresses$ observable\n   */\n  @property({ type: Object })\n  directory: DirectoryService | null = null;\n\n  /**\n   * Currently selected address\n   */\n  @state()\n  private selectedAddress: Address | null = null;\n\n  /**\n   * Search filter query\n   */\n  @state()\n  private searchQuery: string = '';\n\n  /**\n   * List of addresses from directory\n   */\n  @state()\n  private addresses: Address[] = [];\n\n  /**\n   * Loading state\n   */\n  @state()\n  private loading: boolean = false;\n\n  /**\n   * Has more addresses to load\n   */\n  @state()\n  private hasMore: boolean = false;\n\n  /**\n   * RxJS subscriptions for cleanup\n   */\n  private subscriptions: Subscription[] = [];\n\n  /**\n   * Debounce timer for search\n   */\n  private searchDebounceTimer: number | null = null;\n\n  /**\n   * IntersectionObserver for infinite scroll\n   */\n  private intersectionObserver: IntersectionObserver | null = null;\n\n  /**\n   * Flag to track if we're auto-loading for search\n   */\n  @state()\n  private isAutoLoadingForSearch: boolean = false;\n\n  connectedCallback() {\n    super.connectedCallback();\n    this.subscribeToDirectory();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.cleanup();\n  }\n\n  private subscribeToDirectory() {\n    if (!this.directory) return;\n\n    // Subscribe to addresses\n    if (this.directory.addresses$) {\n      const addressesSub = this.directory.addresses$.subscribe((addresses) => {\n        this.addresses = addresses;\n      });\n      this.subscriptions.push(addressesSub);\n    }\n\n    // Subscribe to loading state\n    if (this.directory.loading$) {\n      const loadingSub = this.directory.loading$.subscribe((loading) => {\n        this.loading = loading;\n      });\n      this.subscriptions.push(loadingSub);\n    }\n\n    // Subscribe to hasMore\n    if (this.directory.hasMore$) {\n      const hasMoreSub = this.directory.hasMore$.subscribe((hasMore) => {\n        this.hasMore = hasMore;\n      });\n      this.subscriptions.push(hasMoreSub);\n    }\n\n    // Load initial data\n    if (this.directory.loadMore) {\n      this.directory.loadMore();\n    }\n  }\n\n  private cleanup() {\n    this.subscriptions.forEach((sub) => sub.unsubscribe());\n    this.subscriptions = [];\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n    if (this.intersectionObserver) {\n      this.intersectionObserver.disconnect();\n      this.intersectionObserver = null;\n    }\n  }\n\n  protected firstUpdated() {\n    this.setupInfiniteScroll();\n  }\n\n  private setupInfiniteScroll() {\n    const sentinel = this.shadowRoot?.querySelector('.scroll-sentinel');\n    if (!sentinel) return;\n\n    this.intersectionObserver = new IntersectionObserver(\n      (entries) => {\n        const entry = entries[0];\n        if (entry?.isIntersecting && this.hasMore && !this.loading) {\n          this.handleLoadMore();\n        }\n      },\n      {\n        root: this.shadowRoot?.querySelector('.list'),\n        rootMargin: '100px',\n        threshold: 0\n      }\n    );\n\n    this.intersectionObserver.observe(sentinel);\n  }\n\n  protected updated(changedProperties: Map<string, unknown>) {\n    super.updated(changedProperties);\n\n    // Handle directory property changes\n    if (changedProperties.has('directory')) {\n      this.cleanup();\n      this.subscribeToDirectory();\n    }\n\n    // Re-setup infinite scroll if needed\n    if (!this.intersectionObserver) {\n      this.setupInfiniteScroll();\n    }\n\n    // Auto-load more when searching and no results found but more available\n    // Also check when loading state changes so we can trigger subsequent loads\n    if (\n      changedProperties.has('addresses') ||\n      changedProperties.has('searchQuery') ||\n      changedProperties.has('loading')\n    ) {\n      this.checkAutoLoadForSearch();\n    }\n  }\n\n  private async checkAutoLoadForSearch() {\n    // If we have a search query, no filtered results, but more to load, keep loading\n    // Note: !this.loading prevents concurrent loads, isAutoLoadingForSearch is for UI state only\n    if (\n      this.searchQuery.trim() &&\n      this.filteredAddresses.length === 0 &&\n      this.hasMore &&\n      !this.loading\n    ) {\n      this.isAutoLoadingForSearch = true;\n      await this.handleLoadMore();\n      // The updated() will be called again when addresses/loading change, continuing the loop\n    } else if (this.filteredAddresses.length > 0 || !this.hasMore) {\n      this.isAutoLoadingForSearch = false;\n    }\n  }\n\n  private get filteredAddresses(): Address[] {\n    if (!this.searchQuery.trim()) {\n      return this.addresses;\n    }\n    const query = this.searchQuery.toLowerCase();\n    return this.addresses.filter(\n      (addr) =>\n        addr.name.toLowerCase().includes(query) ||\n        (addr.displayName && addr.displayName.toLowerCase().includes(query))\n    );\n  }\n\n  private handleSearchInput(e: Event) {\n    const input = e.target as HTMLInputElement;\n\n    // Debounce search\n    if (this.searchDebounceTimer) {\n      clearTimeout(this.searchDebounceTimer);\n    }\n\n    this.searchDebounceTimer = window.setTimeout(() => {\n      this.searchQuery = input.value;\n    }, 200);\n  }\n\n  private handleItemClick(address: Address) {\n    this.selectedAddress = address;\n\n    this.dispatchEvent(\n      new CustomEvent('sw-address-select', {\n        detail: { address },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  private handleItemDoubleClick(address: Address) {\n    this.handleDial(address);\n  }\n\n  private handleDial(address: Address) {\n    this.dispatchEvent(\n      new CustomEvent('sw-dial', {\n        detail: { address },\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  private async handleLoadMore() {\n    if (this.directory?.loadMore) {\n      await this.directory.loadMore();\n    }\n  }\n\n  private renderAddressIcon(address: Address) {\n    const name = address.type === 'room' ? 'room' : 'person';\n    return html`<sw-ui-icon name=${name} size=\"20\"></sw-ui-icon>`;\n  }\n\n  private renderChannelIcons(address: Address) {\n    const channels = address.channels || {};\n    return html`\n      <div class=\"item-channels\">\n        <sw-ui-icon\n          name=\"mic-on\"\n          size=\"16\"\n          class=\"${channels.audio ? 'active' : ''}\"\n          title=\"Audio\"\n        ></sw-ui-icon>\n        <sw-ui-icon\n          name=\"camera-on\"\n          size=\"16\"\n          class=\"${channels.video ? 'active' : ''}\"\n          title=\"Video\"\n        ></sw-ui-icon>\n      </div>\n    `;\n  }\n\n  private renderLoadingIndicator() {\n    return html`\n      <div class=\"scroll-loading\">\n        <div class=\"spinner\"></div>\n        <span>${this.isAutoLoadingForSearch ? 'Searching...' : 'Loading more...'}</span>\n      </div>\n    `;\n  }\n\n  render() {\n    const showInitialLoading = this.loading && this.addresses.length === 0;\n    const showEmptyState = !this.loading && this.filteredAddresses.length === 0 && !this.hasMore;\n    const showSearchingState = this.isAutoLoadingForSearch && this.filteredAddresses.length === 0;\n\n    return html`\n      <div class=\"container\" part=\"container\">\n        <div class=\"search\" part=\"search\">\n          <input\n            type=\"text\"\n            class=\"search-input\"\n            placeholder=\"Search addresses...\"\n            @input=${this.handleSearchInput}\n            aria-label=\"Search addresses\"\n          />\n        </div>\n\n        <div class=\"list\" part=\"list\" role=\"listbox\">\n          ${showInitialLoading\n            ? html`<div class=\"loading\">Loading...</div>`\n            : showSearchingState\n              ? this.renderLoadingIndicator()\n              : showEmptyState\n                ? html`<div class=\"empty\">No addresses found</div>`\n                : html`\n                    ${this.filteredAddresses.map(\n                      (address) => html`\n                        <div\n                          class=\"item ${this.selectedAddress?.id === address.id ? 'selected' : ''}\"\n                          part=\"item ${this.selectedAddress?.id === address.id\n                            ? 'item-selected'\n                            : ''}\"\n                          role=\"option\"\n                          aria-selected=\"${this.selectedAddress?.id === address.id}\"\n                          @click=${() => this.handleItemClick(address)}\n                          @dblclick=${() => this.handleItemDoubleClick(address)}\n                        >\n                          <div class=\"item-icon\">${this.renderAddressIcon(address)}</div>\n                          <div class=\"item-content\">\n                            <div class=\"item-name\" part=\"item-name\">\n                              ${address.displayName || address.name}\n                            </div>\n                            <div class=\"item-type\" part=\"item-type\">\n                              ${address.type || 'address'}\n                            </div>\n                          </div>\n                          ${this.renderChannelIcons(address)}\n                          <button\n                            class=\"dial-button\"\n                            @click=${(e: Event) => {\n                              e.stopPropagation();\n                              this.handleDial(address);\n                            }}\n                            aria-label=\"Call ${address.displayName || address.name}\"\n                          >\n                            <sw-ui-icon name=\"phone-call\" size=\"18\"></sw-ui-icon>\n                          </button>\n                        </div>\n                      `\n                    )}\n                    <!-- Scroll sentinel for infinite scroll -->\n                    <div class=\"scroll-sentinel\">\n                      ${this.loading && !this.isAutoLoadingForSearch\n                        ? this.renderLoadingIndicator()\n                        : null}\n                    </div>\n                  `}\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-directory': SwDirectory;\n  }\n}\n","import { css } from 'lit';\n\nexport const deviceSelectorStyles = css`\n  :host {\n    display: inline-flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 4px;\n    position: relative;\n\n    /* ctrl primitive defaults (overridden by parent theme) */\n    --sw-device-selector-size: 44px;\n    --sw-device-selector-radius: 50%;\n    --sw-device-selector-bg: rgba(255, 255, 255, 0.12);\n    --sw-device-selector-bg-hover: rgba(255, 255, 255, 0.22);\n    --sw-device-selector-fg: #ffffff;\n    --sw-device-selector-focus-ring: #044cf6;\n    --sw-device-selector-label-color: rgba(255, 255, 255, 0.55);\n    --sw-device-selector-label-size: 10px;\n    --sw-device-selector-menu-bg: #1e1e2e;\n    --sw-device-selector-menu-border: rgba(255, 255, 255, 0.14);\n    --sw-device-selector-menu-item-hover: rgba(255, 255, 255, 0.1);\n    --sw-device-selector-menu-item-active: rgba(4, 76, 246, 0.35);\n    --sw-device-selector-menu-radius: 10px;\n    --sw-device-selector-menu-shadow: 0 8px 24px rgba(0, 0, 0, 0.5);\n  }\n\n  /* ── trigger button ─────────────────────────────────────────────── */\n\n  .trigger {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: var(--sw-device-selector-size);\n    height: var(--sw-device-selector-size);\n    min-width: 36px;\n    min-height: 36px;\n    padding: 0;\n    background: var(--sw-device-selector-bg);\n    color: var(--sw-device-selector-fg);\n    border: none;\n    border-radius: var(--sw-device-selector-radius);\n    cursor: pointer;\n    transition: background 0.15s ease, transform 0.1s ease;\n  }\n\n  .trigger:hover:not(:disabled) {\n    background: var(--sw-device-selector-bg-hover);\n  }\n\n  .trigger[aria-expanded='true'] {\n    background: var(--sw-device-selector-bg-hover);\n  }\n\n  .trigger:active:not(:disabled) {\n    transform: scale(0.93);\n  }\n\n  .trigger:focus-visible {\n    outline: 2px solid var(--sw-device-selector-focus-ring);\n    outline-offset: 2px;\n  }\n\n  .trigger:disabled {\n    opacity: 0.38;\n    cursor: not-allowed;\n  }\n\n  .trigger sw-ui-icon {\n    flex-shrink: 0;\n    pointer-events: none;\n  }\n\n  .label {\n    font-size: var(--sw-device-selector-label-size);\n    color: var(--sw-device-selector-label-color);\n    white-space: nowrap;\n    user-select: none;\n    line-height: 1.2;\n  }\n\n  /* ── popover panel ──────────────────────────────────────────────── */\n\n  .panel {\n    position: absolute;\n    bottom: calc(100% + 8px);\n    left: 50%;\n    transform: translateX(-50%);\n    min-width: 240px;\n    max-width: 320px;\n    background: var(--sw-device-selector-menu-bg);\n    border: 1px solid var(--sw-device-selector-menu-border);\n    border-radius: var(--sw-device-selector-menu-radius);\n    box-shadow: var(--sw-device-selector-menu-shadow);\n    padding: 6px;\n    z-index: 9999;\n    animation: panel-in 0.1s ease-out;\n  }\n\n  @keyframes panel-in {\n    from { opacity: 0; transform: translateX(-50%) translateY(4px); }\n    to   { opacity: 1; transform: translateX(-50%) translateY(0); }\n  }\n\n  /* ── sections ───────────────────────────────────────────────────── */\n\n  .section {\n    padding: 4px 0;\n  }\n\n  .section + .section {\n    border-top: 1px solid var(--sw-device-selector-menu-border);\n    margin-top: 4px;\n    padding-top: 8px;\n  }\n\n  .section-header {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    padding: 2px 8px 5px;\n    font-size: 11px;\n    font-weight: 600;\n    color: var(--sw-device-selector-label-color);\n    text-transform: uppercase;\n    letter-spacing: 0.05em;\n    user-select: none;\n  }\n\n  .section-header sw-ui-icon {\n    flex-shrink: 0;\n  }\n\n  /* ── device items ───────────────────────────────────────────────── */\n\n  .device-item {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    padding: 8px 10px;\n    border-radius: calc(var(--sw-device-selector-menu-radius) - 2px);\n    cursor: pointer;\n    font-size: 13px;\n    color: var(--sw-device-selector-fg);\n    transition: background 0.1s ease;\n  }\n\n  .device-item:hover {\n    background: var(--sw-device-selector-menu-item-hover);\n  }\n\n  .device-item.selected {\n    background: var(--sw-device-selector-menu-item-active);\n  }\n\n  .check {\n    width: 14px;\n    height: 14px;\n    flex-shrink: 0;\n    opacity: 0;\n  }\n\n  .device-item.selected .check {\n    opacity: 1;\n  }\n\n  .device-label {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n\n  .no-devices {\n    padding: 6px 10px;\n    font-size: 12px;\n    color: var(--sw-device-selector-label-color);\n  }\n\n  /* ── previews (show-preview mode) ───────────────────────────────── */\n\n  :host([show-preview]) .panel {\n    min-width: 280px;\n  }\n\n  .preview {\n    margin: 8px 4px 2px;\n  }\n\n  .preview-camera sw-local-camera {\n    display: block;\n    width: 100%;\n    border-radius: 6px;\n    overflow: hidden;\n  }\n\n  .preview-mic {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    padding: 6px 8px;\n    background: rgba(255, 255, 255, 0.04);\n    border-radius: 6px;\n    min-height: 28px;\n  }\n\n  .preview-empty {\n    padding: 8px 4px;\n    font-size: 12px;\n    color: var(--sw-device-selector-label-color);\n    text-align: center;\n  }\n\n  .test-speaker {\n    display: inline-flex;\n    align-items: center;\n    gap: 6px;\n    padding: 6px 10px;\n    background: var(--sw-device-selector-menu-item-hover);\n    color: var(--sw-device-selector-fg);\n    border: 1px solid var(--sw-device-selector-menu-border);\n    border-radius: 6px;\n    font-size: 12px;\n    cursor: pointer;\n    transition: background 0.1s ease;\n  }\n\n  .test-speaker:hover:not(:disabled) {\n    background: var(--sw-device-selector-menu-item-active);\n  }\n\n  .test-speaker:disabled {\n    opacity: 0.4;\n    cursor: not-allowed;\n  }\n`;\n","import { LitElement, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { Subscription } from 'rxjs';\nimport type { DeviceController } from '@signalwire/js';\nimport { getLogger } from '@signalwire/js';\nimport type { IconName } from '../UI/icons/icons.js';\nimport { deviceSelectorStyles } from './sw-device-selector.styles.js';\nimport { hostReset } from '../UI/host-reset.js';\nimport '../UI/icons/sw-ui-icon.js';\nimport '../sw-local-camera.js';\nimport '../sw-audio-level.js';\n\nconst logger = getLogger();\n\ntype AudioElementWithSinkId = HTMLAudioElement & {\n  setSinkId?: (sinkId: string) => Promise<void>;\n};\n\n/**\n * Single-button device settings popover. Opens a panel above the button\n * with sections for Microphone, Camera, and Speaker selection.\n *\n * When `show-preview` is enabled, the open panel also renders a live\n * camera preview, a microphone level meter for the currently selected\n * input devices, and a \"Test speaker\" button that plays a short tone\n * through the selected output.\n *\n * @fires sw-device-change - User picked a device. Detail: `{ type: 'microphone'|'camera'|'speaker', device: MediaDeviceInfo }`.\n * @cssprop --ctrl-*  - all primitive ctrl tokens\n */\n@customElement('sw-device-selector')\nexport class SwDeviceSelector extends LitElement {\n  static styles = [hostReset, deviceSelectorStyles];\n\n  @property({ type: Object }) deviceController?: DeviceController;\n\n  /**\n   * Render inline previews (camera video, mic level, speaker test) inside\n   * each section while the panel is open. Streams are acquired only while\n   * the panel is open and stopped when it closes.\n   */\n  @property({ type: Boolean, reflect: true, attribute: 'show-preview' })\n  showPreview = false;\n\n  @state() private _videoStream: MediaStream | null = null;\n  @state() private _audioStream: MediaStream | null = null;\n  @state() private _testingSpeaker = false;\n\n  @state() private _audioIn: MediaDeviceInfo[] = [];\n  @state() private _videoIn: MediaDeviceInfo[] = [];\n  @state() private _audioOut: MediaDeviceInfo[] = [];\n  @state() private _selAudioIn: MediaDeviceInfo | null = null;\n  @state() private _selVideoIn: MediaDeviceInfo | null = null;\n  @state() private _selAudioOut: MediaDeviceInfo | null = null;\n  @state() private _open = false;\n\n  private _subs: Subscription[] = [];\n\n  private _onDocumentClick = (e: MouseEvent) => {\n    if (!e.composedPath().includes(this)) this._open = false;\n  };\n\n  connectedCallback() {\n    super.connectedCallback();\n    document.addEventListener('click', this._onDocumentClick);\n    this._subscribe();\n  }\n\n  protected updated(changed: Map<string, unknown>): void {\n    super.updated(changed);\n    if (changed.has('deviceController')) {\n      this._unsubscribe();\n      this._subscribe();\n    }\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    document.removeEventListener('click', this._onDocumentClick);\n    this._unsubscribe();\n    this._stopVideoPreview();\n    this._stopAudioPreview();\n    this._stopTestTone();\n  }\n\n  protected willUpdate(changed: Map<string, unknown>): void {\n    if (!this.showPreview) {\n      if (changed.has('showPreview') || changed.has('_open')) {\n        this._stopVideoPreview();\n        this._stopAudioPreview();\n      }\n      return;\n    }\n\n    const opened = changed.has('_open') && this._open;\n    const closed = changed.has('_open') && !this._open;\n    const cameraChanged = changed.has('_selVideoIn');\n    const micChanged = changed.has('_selAudioIn');\n\n    if (closed) {\n      this._stopVideoPreview();\n      this._stopAudioPreview();\n      this._stopTestTone();\n      return;\n    }\n\n    if (this._open && (opened || cameraChanged) && this._selVideoIn) {\n      this._startVideoPreview(this._selVideoIn.deviceId);\n    }\n    if (this._open && (opened || micChanged) && this._selAudioIn) {\n      this._startAudioPreview(this._selAudioIn.deviceId);\n    }\n  }\n\n  // ── subscriptions ──────────────────────────────────────────────────\n\n  private _subscribe(): void {\n    const dc = this.deviceController;\n    if (!dc) return;\n\n    this._subs.push(dc.audioInputDevices$.subscribe((d) => { this._audioIn = d; }));\n    this._subs.push(dc.videoInputDevices$.subscribe((d) => { this._videoIn = d; }));\n    this._subs.push(dc.audioOutputDevices$.subscribe((d) => { this._audioOut = d; }));\n\n    if (dc.selectedAudioInputDevice$)\n      this._subs.push(dc.selectedAudioInputDevice$.subscribe((d) => { this._selAudioIn = d; }));\n    if (dc.selectedVideoInputDevice$)\n      this._subs.push(dc.selectedVideoInputDevice$.subscribe((d) => { this._selVideoIn = d; }));\n    if (dc.selectedAudioOutputDevice$)\n      this._subs.push(dc.selectedAudioOutputDevice$.subscribe((d) => { this._selAudioOut = d; }));\n  }\n\n  private _unsubscribe(): void {\n    this._subs.forEach((s) => s.unsubscribe());\n    this._subs = [];\n  }\n\n  // ── handlers ──────────────────────────────────────────────────────\n\n  private _toggle(e: Event) {\n    e.stopPropagation();\n    this._open = !this._open;\n  }\n\n  private _selectMic(deviceId: string) {\n    const device = this._audioIn.find((d) => d.deviceId === deviceId) ?? null;\n    this._selAudioIn = device;\n    this.deviceController?.selectAudioInputDevice?.(device);\n    if (device) this._emitChange('microphone', device);\n  }\n\n  private _selectCamera(deviceId: string) {\n    const device = this._videoIn.find((d) => d.deviceId === deviceId) ?? null;\n    this._selVideoIn = device;\n    this.deviceController?.selectVideoInputDevice?.(device);\n    if (device) this._emitChange('camera', device);\n  }\n\n  private _selectSpeaker(deviceId: string) {\n    const device = this._audioOut.find((d) => d.deviceId === deviceId) ?? null;\n    this._selAudioOut = device;\n    this.deviceController?.selectAudioOutputDevice?.(device);\n    if (device) this._emitChange('speaker', device);\n  }\n\n  // ── preview streams ───────────────────────────────────────────────\n\n  private async _startVideoPreview(deviceId: string): Promise<void> {\n    this._stopVideoPreview();\n    try {\n      this._videoStream = await navigator.mediaDevices.getUserMedia({\n        video: { deviceId: { exact: deviceId } }\n      });\n    } catch (error) {\n      logger.error('sw-device-selector: failed to start camera preview', error);\n      this._videoStream = null;\n    }\n  }\n\n  private _stopVideoPreview(): void {\n    this._videoStream?.getTracks().forEach((t) => t.stop());\n    this._videoStream = null;\n  }\n\n  private async _startAudioPreview(deviceId: string): Promise<void> {\n    this._stopAudioPreview();\n    try {\n      this._audioStream = await navigator.mediaDevices.getUserMedia({\n        audio: { deviceId: { exact: deviceId } }\n      });\n    } catch (error) {\n      logger.error('sw-device-selector: failed to start microphone preview', error);\n      this._audioStream = null;\n    }\n  }\n\n  private _stopAudioPreview(): void {\n    this._audioStream?.getTracks().forEach((t) => t.stop());\n    this._audioStream = null;\n  }\n\n  // ── speaker test ──────────────────────────────────────────────────\n\n  private static readonly _TEST_TONE_DATA_URI =\n    'data:audio/wav;base64,UklGRrQEAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YZAEAACAh46Sl5qcm5mWko2HgXp1cGxqaWlsb3R5gIaNk5icnp2bl5OOiIJ8dnFtamhoam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamloam1xdnyChI+VmZ2enZqXkoyGgHt1cG1qaGhrbnJ4foSLkZianp6cmZWQioR+eHJuamlo';\n\n  private _testAudio?: AudioElementWithSinkId;\n\n  private async _testSpeaker(): Promise<void> {\n    if (this._testingSpeaker) {\n      this._stopTestTone();\n      return;\n    }\n    const audio = new Audio(SwDeviceSelector._TEST_TONE_DATA_URI) as AudioElementWithSinkId;\n    audio.loop = true;\n    this._testAudio = audio;\n\n    const sinkId = this._selAudioOut?.deviceId;\n    if (sinkId && typeof audio.setSinkId === 'function') {\n      try {\n        await audio.setSinkId(sinkId);\n      } catch (error) {\n        logger.error('sw-device-selector: setSinkId failed', error);\n      }\n    }\n    audio.addEventListener('ended', () => this._stopTestTone());\n    try {\n      await audio.play();\n      this._testingSpeaker = true;\n    } catch (error) {\n      logger.error('sw-device-selector: failed to play test tone', error);\n      this._stopTestTone();\n    }\n  }\n\n  private _stopTestTone(): void {\n    if (this._testAudio) {\n      this._testAudio.pause();\n      this._testAudio.src = '';\n      this._testAudio = undefined;\n    }\n    this._testingSpeaker = false;\n  }\n\n  private _emitChange(type: 'microphone' | 'camera' | 'speaker', device: MediaDeviceInfo) {\n    this.dispatchEvent(new CustomEvent('sw-device-change', {\n      detail: { type, device },\n      bubbles: true,\n      composed: true\n    }));\n  }\n\n  // ── render helpers ────────────────────────────────────────────────\n\n  private _renderSection(\n    iconName: IconName,\n    title: string,\n    devices: MediaDeviceInfo[],\n    selectedId: string | undefined,\n    onSelect: (id: string) => void,\n    preview?: unknown\n  ) {\n    return html`\n      <div class=\"section\">\n        <div class=\"section-header\">\n          <sw-ui-icon name=${iconName} size=\"13\"></sw-ui-icon>\n          <span>${title}</span>\n        </div>\n        ${devices.length === 0\n          ? html`<div class=\"no-devices\">No devices found</div>`\n          : devices.map((d, i) => html`\n              <div\n                class=\"device-item ${d.deviceId === selectedId ? 'selected' : ''}\"\n                role=\"option\"\n                aria-selected=${d.deviceId === selectedId}\n                @click=${() => onSelect(d.deviceId)}\n              >\n                <svg class=\"check\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n                  <path d=\"M6.5 12L2 7.5l1.4-1.4 3.1 3.1 5.6-5.6 1.4 1.4z\" />\n                </svg>\n                <span class=\"device-label\">${d.label || `Device ${i + 1}`}</span>\n              </div>\n            `)\n        }\n        ${preview ?? nothing}\n      </div>\n    `;\n  }\n\n  private _renderCameraPreview() {\n    if (!this.showPreview) return null;\n    return html`\n      <div class=\"preview preview-camera\" part=\"preview-camera\">\n        ${this._videoStream\n          ? html`<sw-local-camera .stream=${this._videoStream} mirror></sw-local-camera>`\n          : html`<div class=\"preview-empty\">Starting camera…</div>`}\n      </div>\n    `;\n  }\n\n  private _renderMicPreview() {\n    if (!this.showPreview) return null;\n    return html`\n      <div class=\"preview preview-mic\" part=\"preview-mic\">\n        ${this._audioStream\n          ? html`<sw-audio-level\n              .stream=${this._audioStream}\n              bars=\"9\"\n              orientation=\"horizontal\"\n              maxSize=\"22\"\n            ></sw-audio-level>`\n          : html`<div class=\"preview-empty\">Starting microphone…</div>`}\n      </div>\n    `;\n  }\n\n  private _renderSpeakerPreview() {\n    if (!this.showPreview) return null;\n    return html`\n      <div class=\"preview preview-speaker\" part=\"preview-speaker\">\n        <button\n          class=\"test-speaker\"\n          part=\"test-speaker-button\"\n          ?disabled=${!this._selAudioOut}\n          @click=${(e: Event) => { e.stopPropagation(); this._testSpeaker(); }}\n        >\n          <sw-ui-icon name=${this._testingSpeaker ? 'speaker-off' : 'speaker-on'} size=\"14\"></sw-ui-icon>\n          <span>${this._testingSpeaker ? 'Stop test' : 'Test speaker'}</span>\n        </button>\n      </div>\n    `;\n  }\n\n  // ── render ─────────────────────────────────────────────────────────\n\n  render() {\n    const hasDevices = this._audioIn.length > 0 || this._videoIn.length > 0 || this._audioOut.length > 0;\n\n    return html`\n      ${this._open ? html`\n        <div\n          class=\"panel\"\n          role=\"listbox\"\n          @keydown=${(e: KeyboardEvent) => { if (e.key === 'Escape') this._open = false; }}\n        >\n          ${this._renderSection('mic-on', 'Microphone', this._audioIn, this._selAudioIn?.deviceId, (id) => this._selectMic(id), this._renderMicPreview())}\n          ${this._renderSection('camera-on', 'Camera', this._videoIn, this._selVideoIn?.deviceId, (id) => this._selectCamera(id), this._renderCameraPreview())}\n          ${this._renderSection('speaker-on', 'Speaker', this._audioOut, this._selAudioOut?.deviceId, (id) => this._selectSpeaker(id), this._renderSpeakerPreview())}\n        </div>\n      ` : nothing}\n\n      <button\n        class=\"trigger\"\n        aria-label=\"Device settings\"\n        aria-expanded=${this._open}\n        aria-haspopup=\"listbox\"\n        ?disabled=${!hasDevices}\n        @click=${this._toggle}\n        part=\"button\"\n      >\n        <sw-ui-icon name=\"settings\" size=\"22\"></sw-ui-icon>\n      </button>\n      <span class=\"label\">Devices</span>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-device-selector': SwDeviceSelector;\n  }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { hostReset } from '../host-reset.js';\n\nexport type DropUpItem = { label: string; id: string; selected?: boolean };\n\n/**\n * Dropdown (opens upward) menu anchored to a trigger element.\n *\n * @fires sw-dropup-select - User picked an item. `detail` is the selected `DropUpItem`.\n * @fires sw-dropup-close  - Outside click closed the menu.\n *\n * @cssprop --sw-dropup-offset    [4px]                    - gap between anchor and menu\n * @cssprop --sw-dropup-max-width [200px]                  - maximum menu width\n * @cssprop --sw-dropup-bg        [#1f2937]                - menu background\n * @cssprop --sw-dropup-border    [1px solid rgba(255,255,255,0.1)] - menu border\n * @cssprop --sw-dropup-radius    [8px]                    - menu border-radius\n * @cssprop --sw-dropup-shadow    [0 4px 12px rgba(0,0,0,0.4)]     - menu box-shadow\n * @cssprop --sw-dropup-color     [#e5e7eb]                - item text colour\n * @cssprop --sw-dropup-item-hover  [rgba(255,255,255,0.08)] - item hover background\n * @cssprop --sw-dropup-item-active [rgba(255,255,255,0.15)] - selected item background\n */\n@customElement('sw-ui-dropup')\nexport class SwUiDropup extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: inline-block;\n      position: relative;\n    }\n\n    .menu {\n      position: absolute;\n      bottom: calc(100% + var(--sw-dropup-offset, 4px));\n      left: 0;\n      display: none;\n      flex-direction: column;\n      border: 1px solid var(--border-default);\n      background: var(--bg-page);\n      color: var(--fg-default);\n      font-family: var(--type-family-body);\n      font-size: var(--type-size-small);\n      min-width: 120px;\n      max-width: var(--sw-dropup-max-width, 200px);\n      border-radius: var(--radius-md);\n      box-shadow: var(--shadow-md);\n      overflow: hidden;\n    }\n\n    .menu.open {\n      display: flex;\n    }\n\n    button {\n      all: unset;\n      padding: 8px 12px;\n      cursor: pointer;\n      font-size: 0.8125rem;\n      transition: background var(--transition-fast);\n    }\n\n    button.selected {\n      background: var(--bg-surface-raised);\n    }\n\n    button:hover {\n      background: var(--bg-surface);\n    }\n  `];\n\n  @property({\n    reflect: true,\n    converter: {\n      fromAttribute(value: string | null): Array<DropUpItem | string> {\n        if (!value) return [];\n        try {\n          const parsed: unknown = JSON.parse(value);\n          return Array.isArray(parsed) ? (parsed as Array<DropUpItem | string>) : [];\n        } catch {\n          return [];\n        }\n      },\n      toAttribute(value: Array<DropUpItem | string>): string {\n        return JSON.stringify(value);\n      }\n    }\n  })\n  items: Array<DropUpItem | string> = [];\n\n  @property({ type: Boolean, reflect: true })\n  open = false;\n\n  // Optional element treated as \"inside\" for outside-click AND used as the position anchor\n  @property({ attribute: false })\n  anchor?: Element;\n\n  @query('.menu')\n  private _menu!: HTMLElement;\n\n  private _outsideClickHandler = (e: MouseEvent) => {\n    const path = e.composedPath();\n    if (!path.includes(this) && (!this.anchor || !path.includes(this.anchor))) {\n      this.dispatchEvent(new CustomEvent('sw-dropup-close', { bubbles: true, composed: true }));\n    }\n  };\n\n  updated(changed: Map<string, unknown>) {\n    if (!changed.has('open')) return;\n\n    if (this.open) {\n      document.addEventListener('mousedown', this._outsideClickHandler);\n      if (this.anchor) {\n        this._positionToAnchor();\n      }\n    } else {\n      document.removeEventListener('mousedown', this._outsideClickHandler);\n    }\n  }\n\n  private _positionToAnchor() {\n    const rect = this.anchor!.getBoundingClientRect();\n    const offset = 4;\n    this._menu.style.position = 'fixed';\n    this._menu.style.top = `${rect.top - offset}px`;\n    this._menu.style.bottom = 'auto';\n    this._menu.style.left = `${rect.left + rect.width / 2}px`;\n    this._menu.style.right = 'auto';\n    this._menu.style.transform = 'translateX(-50%) translateY(-100%)';\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    document.removeEventListener('mousedown', this._outsideClickHandler);\n  }\n\n  private normalizeItem(item: DropUpItem | string): DropUpItem {\n    if (typeof item === 'string') {\n      return { label: item, id: item, selected: false };\n    }\n    return item;\n  }\n\n  private onSelect(item: DropUpItem) {\n    const selectedItem = { ...item, selected: true };\n    this.items = (this.items ?? []).map((i) => {\n      const normalized = this.normalizeItem(i);\n      return { ...normalized, selected: normalized.id === item.id };\n    });\n    this.dispatchEvent(\n      new CustomEvent('sw-dropup-select', {\n        detail: selectedItem,\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  render() {\n    const list = (this.items ?? []).map((i) => {\n      const item = this.normalizeItem(i);\n      return html`\n        <button\n          part=\"item\"\n          @click=${() => this.onSelect(item)}\n          class=${item.selected === true ? 'selected' : ''}\n        >\n          ${item.label}\n        </button>\n      `;\n    });\n\n    return html`\n      <div part=\"menu\" class=\"menu ${this.open ? 'open' : ''}\">${list.length ? list : nothing}</div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-dropup': SwUiDropup;\n  }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport type { DropUpItem } from './sw-ui-dropup';\nimport { hostReset } from '../host-reset.js';\n\n/**\n * Pill-shaped split button: main action + optional chevron dropdown.\n *\n * When `items` is non-empty, renders as a unified pill with a subtle\n * divider between the icon area and the chevron: `[ 🎤 | ▲ ]`\n *\n * When `items` is empty, renders as a single pill button.\n *\n * - **active/inactive** slots → toggle button, dispatches `sw-split-button-toggle`\n * - **default** slot only → push button, dispatches `sw-split-button-click`\n *\n * @slot active   - icon shown when active\n * @slot inactive - icon shown when inactive\n * @slot (default)- icon for a non-toggle button\n *\n * @fires sw-split-button-toggle - Fired on toggle-mode click. `detail` is the new active state (boolean).\n * @fires sw-split-button-click  - Fired on push-mode click. No detail.\n *\n * @cssprop --sw-split-button-size     [44px]  - height (width auto-fits content)\n * @cssprop --sw-split-button-bg       - button background (falls back to --bg-surface)\n * @cssprop --sw-split-button-bg-hover - hover background (falls back to --bg-surface-raised)\n * @cssprop --sw-split-button-color    - icon colour (falls back to --fg-default)\n * @cssprop --sw-split-button-radius   - border-radius (falls back to --radius-full)\n */\n@customElement('sw-ui-split-button')\nexport class SwUiSplitButton extends LitElement {\n  static styles = [hostReset, css`\n    :host {\n      display: inline-flex;\n      align-items: center;\n    }\n\n    /* Hide named slots by default; shown based on active state */\n    slot[name='active'] { display: none; }\n    :host([active='true']) slot[name='active'] { display: contents; }\n    :host([active='true']) slot[name='inactive'] { display: none; }\n\n    /* ── Unified pill container ─────────────────────────────────── */\n    .pill {\n      display: inline-flex;\n      align-items: center;\n      border-radius: var(--sw-split-button-radius, var(--radius-full));\n      background: var(--sw-split-button-bg, var(--bg-surface));\n      overflow: hidden;\n      transition: background var(--transition-fast);\n    }\n\n    .pill:hover {\n      background: var(--sw-split-button-bg-hover, var(--bg-surface-raised));\n    }\n\n    /* ── Click zones inside the pill ────────────────────────────── */\n    .main, .chevron {\n      all: unset;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      color: var(--sw-split-button-color, var(--fg-default));\n      height: var(--sw-split-button-height, var(--sw-split-button-size, 40px));\n    }\n\n    .main {\n      padding: 0 12px;\n    }\n\n    .chevron {\n      padding: 0 6px;\n      border-left: 1px solid var(--border-default);\n    }\n\n    .chevron sw-ui-icon {\n      opacity: 0.7;\n    }\n\n    /* Hover highlights individual zones within the pill */\n    .main:hover, .chevron:hover {\n      background: rgba(255, 255, 255, 0.08);\n    }\n\n    /* ── Solo button (no items → no chevron) ────────────────────── */\n    .solo {\n      all: unset;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      cursor: pointer;\n      height: var(--sw-split-button-height, var(--sw-split-button-size, 40px));\n      padding: 0 14px;\n      border-radius: var(--sw-split-button-radius, var(--radius-full));\n      background: var(--sw-split-button-bg, var(--bg-surface));\n      color: var(--sw-split-button-color, var(--fg-default));\n      transition: background var(--transition-fast);\n    }\n\n    .solo:hover {\n      background: var(--sw-split-button-bg-hover, var(--bg-surface-raised));\n    }\n  `];\n\n  @property({\n    converter: {\n      fromAttribute(value: string | null): Array<DropUpItem | string> {\n        if (!value) return [];\n        try {\n          const parsed: unknown = JSON.parse(value);\n          return Array.isArray(parsed) ? (parsed as Array<DropUpItem | string>) : [];\n        } catch {\n          return [];\n        }\n      },\n      toAttribute(value: Array<DropUpItem | string>): string {\n        return JSON.stringify(value);\n      }\n    }\n  })\n  items: Array<DropUpItem | string> = [];\n\n  @property({ reflect: true })\n  active: boolean = false;\n\n  @state()\n  private _dropupOpen: boolean = false;\n\n  @state()\n  private _hasNamedSlots = false;\n\n  @query('#chevron-zone')\n  private _chevronBtn!: HTMLButtonElement;\n\n  private _onDropupSelect(e: CustomEvent<DropUpItem>) {\n    this.items = this.items.map((i) => {\n      const id = typeof i === 'string' ? i : i.id;\n      return typeof i === 'string'\n        ? { label: i, id: i, selected: i === e.detail.id }\n        : { ...i, selected: id === e.detail.id };\n    });\n  }\n\n  private _updateNamedSlots() {\n    const active = this.shadowRoot?.querySelector('slot[name=\"active\"]') as HTMLSlotElement | null;\n    const inactive = this.shadowRoot?.querySelector(\n      'slot[name=\"inactive\"]'\n    ) as HTMLSlotElement | null;\n    this._hasNamedSlots =\n      (active?.assignedElements().length ?? 0) > 0 ||\n      (inactive?.assignedElements().length ?? 0) > 0;\n  }\n\n  private _onMainClick() {\n    if (!this._hasNamedSlots) {\n      this.dispatchEvent(new CustomEvent('sw-split-button-click', { bubbles: true, composed: true }));\n      return;\n    }\n    this.active = !this.active;\n    this.dispatchEvent(\n      new CustomEvent('sw-split-button-toggle', {\n        detail: this.active,\n        bubbles: true,\n        composed: true\n      })\n    );\n  }\n\n  render() {\n    const hasItems = this.items.length > 0;\n\n    const iconSlots = html`\n      <slot name=\"active\" @slotchange=${this._updateNamedSlots}></slot>\n      <slot name=\"inactive\" @slotchange=${this._updateNamedSlots}></slot>\n      ${!this._hasNamedSlots ? html`<slot></slot>` : nothing}\n    `;\n\n    if (!hasItems) {\n      // Solo pill — no chevron\n      return html`\n        <button class=\"solo\" part=\"button\" @click=${this._onMainClick}>\n          ${iconSlots}\n        </button>\n      `;\n    }\n\n    // Split pill — icon zone | divider | chevron zone\n    return html`\n      <div class=\"pill\" part=\"button\">\n        <button class=\"main\" @click=${this._onMainClick}>\n          ${iconSlots}\n        </button>\n        <button class=\"chevron\" part=\"chevron\" id=\"chevron-zone\"\n          @click=${() => (this._dropupOpen = !this._dropupOpen)}>\n          <sw-ui-icon name=\"chevron-up\" size=\"14\"></sw-ui-icon>\n        </button>\n      </div>\n      <sw-ui-dropup\n        .items=${this.items}\n        .open=${this._dropupOpen}\n        .anchor=${this._chevronBtn}\n        @sw-dropup-close=${() => (this._dropupOpen = false)}\n        @sw-dropup-select=${this._onDropupSelect}\n      />\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-split-button': SwUiSplitButton;\n  }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DropUpItem } from './sw-ui-dropup';\n\n// ── Event detail types ────────────────────────────────────────────────────────\n\nexport interface MicToggleDetail { muted: boolean }\nexport interface CameraToggleDetail { muted: boolean }\nexport interface SpeakerToggleDetail { muted: boolean }\nexport interface DeviceChangeDetail {\n  kind: 'mic' | 'camera' | 'speaker';\n  deviceId: string;\n  label: string;\n}\nexport interface FullscreenToggleDetail { fullscreen: boolean }\nexport interface ScreenShareToggleDetail { active: boolean }\nexport interface HandRaiseToggleDetail { raised: boolean }\nexport interface SettingsChangeDetail { settingId: string }\n\n// ── Event map ─────────────────────────────────────────────────────────────────\n\nexport interface SwUiControlBarEventMap {\n  'sw-mic-toggle': CustomEvent<MicToggleDetail>;\n  'sw-camera-toggle': CustomEvent<CameraToggleDetail>;\n  'sw-speaker-toggle': CustomEvent<SpeakerToggleDetail>;\n  'sw-device-change': CustomEvent<DeviceChangeDetail>;\n  'sw-fullscreen-toggle': CustomEvent<FullscreenToggleDetail>;\n  'sw-screen-share-toggle': CustomEvent<ScreenShareToggleDetail>;\n  'sw-hand-raise-toggle': CustomEvent<HandRaiseToggleDetail>;\n  'sw-transcript-toggle': CustomEvent<void>;\n  'sw-settings-change': CustomEvent<SettingsChangeDetail>;\n  'sw-call-hangup': CustomEvent<void>;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * Call controls bar.\n *\n * Buttons rendered (left to right): mic, camera, speaker, screen share,\n * hand raise, transcript, fullscreen, hang-up. Optional buttons are hidden\n * when their `show*` property is false.\n *\n * @fires sw-mic-toggle          - Mic toggled. Detail: `{ muted: boolean }`.\n * @fires sw-camera-toggle       - Camera toggled. Detail: `{ muted: boolean }`.\n * @fires sw-speaker-toggle      - Speaker toggled. Detail: `{ muted: boolean }`.\n * @fires sw-device-change       - Device picked from a chevron menu. Detail: `{ kind, deviceId, label }`.\n * @fires sw-fullscreen-toggle   - Fullscreen toggled. Detail: `{ fullscreen: boolean }`.\n * @fires sw-screen-share-toggle - Screen share toggled. Detail: `{ active: boolean }`.\n * @fires sw-hand-raise-toggle   - Hand raise toggled. Detail: `{ raised: boolean }`.\n * @fires sw-transcript-toggle   - Transcript button clicked. No detail.\n * @fires sw-settings-change     - Settings menu item picked. Detail: `{ settingId: string }`.\n * @fires sw-call-hangup         - Hang-up button clicked. No detail.\n *\n * @cssprop --sw-control-bar-bg       [transparent]             - bar background\n * @cssprop --sw-control-bar-padding  [8px 16px]                - bar padding\n * @cssprop --sw-control-bar-gap      [8px]                     - gap between buttons\n * @cssprop --sw-control-bar-radius   [0]                       - bar border-radius\n *\n * @cssprop --sw-split-button-size     [44px]                    - button width & height\n * @cssprop --sw-split-button-bg       [rgba(255,255,255,0.12)]  - button background\n * @cssprop --sw-split-button-bg-hover [rgba(255,255,255,0.22)]  - button hover bg\n * @cssprop --sw-split-button-color    [#fff]                    - icon colour\n * @cssprop --sw-split-button-radius   [9999px]                  - button border-radius\n *\n * @cssprop --sw-control-bar-hangup-bg       - hang-up background       (falls back to --interactive-button-destructive-bg)\n * @cssprop --sw-control-bar-hangup-bg-hover - hang-up hover bg          (falls back to --interactive-button-destructive-hover)\n * @cssprop --sw-control-bar-hangup-color    - hang-up icon colour       (defaults to #fff)\n *\n * The active-toggle variant uses --interactive-button-primary-{bg,hover,text} from the design tokens.\n */\n@customElement('sw-ui-control-bar')\nexport class SwUiControlBar extends LitElement {\n  static styles = css`\n    :host {\n      display: block;\n      background: var(--sw-control-bar-bg, transparent);\n      border-radius: var(--sw-control-bar-radius, 0);\n      container-type: inline-size;\n    }\n\n    .bar {\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      gap: var(--sw-control-bar-gap, 8px);\n      padding: var(--sw-control-bar-padding, 8px 16px);\n    }\n\n    .sw-logo {\n      display: inline-flex;\n      align-items: center;\n      color: var(--fg-default);\n      opacity: 0.5;\n      flex-shrink: 0;\n      pointer-events: none;\n      margin-right: auto;\n    }\n\n    .bar-spacer {\n      margin-left: auto;\n      width: 20px;\n      flex-shrink: 0;\n    }\n\n    .hangup {\n      --sw-split-button-bg: var(--sw-control-bar-hangup-bg, var(--interactive-button-destructive-bg));\n      --sw-split-button-bg-hover: var(--sw-control-bar-hangup-bg-hover, var(--interactive-button-destructive-hover));\n      --sw-split-button-color: var(--sw-control-bar-hangup-color, #fff);\n    }\n\n    .active-toggle {\n      --sw-split-button-bg: var(--interactive-button-primary-bg);\n      --sw-split-button-bg-hover: var(--interactive-button-primary-hover);\n      --sw-split-button-color: var(--interactive-button-primary-text);\n    }\n\n    /* Overflow menu hidden by default (wide containers) */\n    sw-ui-split-button.overflow { display: none; }\n\n    /* Collapse optional/secondary buttons into an overflow menu on narrow containers */\n    @container (max-width: 720px) {\n      sw-ui-split-button.optional { display: none !important; }\n      sw-ui-split-button.overflow { display: inline-flex; }\n    }\n\n    /* Shrink buttons on very narrow containers */\n    @container (max-width: 540px) {\n      .bar {\n        --sw-split-button-size: 34px;\n        --sw-split-button-width: 42px;\n        --sw-split-button-height: 28px;\n        gap: 4px;\n        padding: 4px 8px;\n      }\n      .sw-logo, .bar-spacer { display: none; }\n    }\n\n    /* Further shrink for very small phones to prevent clipping */\n    @container (max-width: 360px) {\n      .bar {\n        --sw-split-button-size: 28px;\n        --sw-split-button-width: 34px;\n        --sw-split-button-height: 24px;\n        gap: 2px;\n        padding: 2px 4px;\n      }\n    }\n  `;\n\n  // ── Media toggle state ─────────────────────────────────────────────\n\n  @property({ type: Boolean, reflect: true, attribute: 'mic-muted' })\n  micMuted = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'camera-muted' })\n  cameraMuted = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'speaker-muted' })\n  speakerMuted = false;\n\n  @property({ type: Boolean, reflect: true })\n  fullscreen = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'screen-sharing' })\n  screenSharing = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'hand-raised' })\n  handRaised = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'transcript-active' })\n  transcriptActive = false;\n\n  // ── Visibility flags ───────────────────────────────────────────────\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-screen-share' })\n  showScreenShare = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-hand-raise' })\n  showHandRaise = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-transcript' })\n  showTranscript = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-settings' })\n  showSettings = false;\n\n  @property({ type: Boolean, reflect: true, attribute: 'show-fullscreen' })\n  showFullscreen = true;\n\n  // ── Device lists ───────────────────────────────────────────────────\n\n  @property({ attribute: false })\n  micDevices: DropUpItem[] = [];\n\n  @property({ attribute: false })\n  cameraDevices: DropUpItem[] = [];\n\n  @property({ attribute: false })\n  speakerDevices: DropUpItem[] = [];\n\n  @property({ attribute: false })\n  settingsItems: DropUpItem[] = [];\n\n  // ── Dispatchers ───────────────────────────────────────────────────────────\n\n  private _dispatch<K extends keyof SwUiControlBarEventMap>(\n    type: K,\n    detail: SwUiControlBarEventMap[K] extends CustomEvent<infer D> ? D : never\n  ) {\n    this.dispatchEvent(new CustomEvent(type, { detail, bubbles: true, composed: true }));\n  }\n\n  private _onMicToggle() {\n    this.micMuted = !this.micMuted;\n    this._dispatch('sw-mic-toggle', { muted: this.micMuted });\n  }\n\n  private _onCameraToggle() {\n    this.cameraMuted = !this.cameraMuted;\n    this._dispatch('sw-camera-toggle', { muted: this.cameraMuted });\n  }\n\n  private _onSpeakerToggle() {\n    this.speakerMuted = !this.speakerMuted;\n    this._dispatch('sw-speaker-toggle', { muted: this.speakerMuted });\n  }\n\n  private _onDeviceSelect(kind: 'mic' | 'camera' | 'speaker', item: DropUpItem) {\n    this._dispatch('sw-device-change', { kind, deviceId: item.id, label: item.label });\n  }\n\n  private _onFullscreenToggle() {\n    this.fullscreen = !this.fullscreen;\n    this._dispatch('sw-fullscreen-toggle', { fullscreen: this.fullscreen });\n  }\n\n  private _onScreenShareToggle() {\n    this.screenSharing = !this.screenSharing;\n    this._dispatch('sw-screen-share-toggle', { active: this.screenSharing });\n  }\n\n  private _onHandRaiseToggle() {\n    this.handRaised = !this.handRaised;\n    this._dispatch('sw-hand-raise-toggle', { raised: this.handRaised });\n  }\n\n  private _onTranscriptToggle() {\n    this.transcriptActive = !this.transcriptActive;\n    this._dispatch('sw-transcript-toggle', undefined as never);\n  }\n\n  private _onSettingsSelect(e: CustomEvent<DropUpItem>) {\n    this._dispatch('sw-settings-change', { settingId: e.detail.id });\n  }\n\n  private _onHangUp() {\n    this._dispatch('sw-call-hangup', undefined as never);\n  }\n\n  private _overflowItems(): DropUpItem[] {\n    const items: DropUpItem[] = [];\n    if (this.showScreenShare) {\n      items.push({\n        id: '__overflow:screen-share',\n        label: this.screenSharing ? 'Stop sharing' : 'Share screen',\n        selected: this.screenSharing,\n      });\n    }\n    if (this.showHandRaise) {\n      items.push({\n        id: '__overflow:hand-raise',\n        label: this.handRaised ? 'Lower hand' : 'Raise hand',\n        selected: this.handRaised,\n      });\n    }\n    if (this.showTranscript) {\n      items.push({\n        id: '__overflow:transcript',\n        label: 'Transcript',\n        selected: this.transcriptActive,\n      });\n    }\n    if (this.showSettings) {\n      items.push(...this.settingsItems);\n    }\n    if (this.showFullscreen) {\n      items.push({\n        id: '__overflow:fullscreen',\n        label: this.fullscreen ? 'Exit fullscreen' : 'Fullscreen',\n        selected: this.fullscreen,\n      });\n    }\n    return items;\n  }\n\n  private _onOverflowSelect(e: CustomEvent<DropUpItem>) {\n    switch (e.detail.id) {\n      case '__overflow:screen-share':\n        this._onScreenShareToggle();\n        return;\n      case '__overflow:hand-raise':\n        this._onHandRaiseToggle();\n        return;\n      case '__overflow:transcript':\n        this._onTranscriptToggle();\n        return;\n      case '__overflow:fullscreen':\n        this._onFullscreenToggle();\n        return;\n      default:\n        this._dispatch('sw-settings-change', { settingId: e.detail.id });\n    }\n  }\n\n  // ── Render ────────────────────────────────────────────────────────────────\n\n  render() {\n    return html`\n      <div class=\"bar\" part=\"bar\">\n        <!-- SignalWire logo -->\n        <span class=\"sw-logo\" part=\"logo\" aria-hidden=\"true\">\n          <sw-ui-icon name=\"sw-logo\" size=\"20\"></sw-ui-icon>\n        </span>\n\n        <!-- Mic -->\n        <sw-ui-split-button\n          .active=${!this.micMuted}\n          .items=${this.micDevices}\n          @sw-split-button-toggle=${this._onMicToggle}\n          @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('mic', e.detail)}\n        >\n          <sw-ui-icon slot=\"active\" name=\"mic-on\"></sw-ui-icon>\n          <sw-ui-icon slot=\"inactive\" name=\"mic-off\"></sw-ui-icon>\n        </sw-ui-split-button>\n\n        <!-- Camera -->\n        <sw-ui-split-button\n          .active=${!this.cameraMuted}\n          .items=${this.cameraDevices}\n          @sw-split-button-toggle=${this._onCameraToggle}\n          @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('camera', e.detail)}\n        >\n          <sw-ui-icon slot=\"active\" name=\"camera-on\"></sw-ui-icon>\n          <sw-ui-icon slot=\"inactive\" name=\"camera-off\"></sw-ui-icon>\n        </sw-ui-split-button>\n\n        <!-- Speaker -->\n        <sw-ui-split-button\n          .active=${!this.speakerMuted}\n          .items=${this.speakerDevices}\n          @sw-split-button-toggle=${this._onSpeakerToggle}\n          @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('speaker', e.detail)}\n        >\n          <sw-ui-icon slot=\"active\" name=\"speaker-on\"></sw-ui-icon>\n          <sw-ui-icon slot=\"inactive\" name=\"speaker-off\"></sw-ui-icon>\n        </sw-ui-split-button>\n\n        <!-- Screen share (optional) -->\n        ${this.showScreenShare\n          ? html`\n              <sw-ui-split-button\n                class=\"optional ${this.screenSharing ? 'active-toggle' : ''}\"\n                @sw-split-button-click=${this._onScreenShareToggle}\n              >\n                <sw-ui-icon name=${this.screenSharing ? 'screen-share-off' : 'screen-share'}></sw-ui-icon>\n              </sw-ui-split-button>\n            `\n          : nothing}\n\n        <!-- Hand raise (optional) -->\n        ${this.showHandRaise\n          ? html`\n              <sw-ui-split-button\n                class=\"optional ${this.handRaised ? 'active-toggle' : ''}\"\n                @sw-split-button-click=${this._onHandRaiseToggle}\n              >\n                <sw-ui-icon name=\"hand-raise\"></sw-ui-icon>\n              </sw-ui-split-button>\n            `\n          : nothing}\n\n        <!-- Transcript (optional) -->\n        ${this.showTranscript\n          ? html`\n              <sw-ui-split-button\n                class=\"optional ${this.transcriptActive ? 'active-toggle' : ''}\"\n                @sw-split-button-click=${this._onTranscriptToggle}\n              >\n                <sw-ui-icon name=\"transcript\"></sw-ui-icon>\n              </sw-ui-split-button>\n            `\n          : nothing}\n\n        <!-- Settings (optional) -->\n        ${this.showSettings\n          ? html`\n              <sw-ui-split-button\n                class=\"optional\"\n                .items=${this.settingsItems}\n                @sw-dropup-select=${this._onSettingsSelect}\n              >\n                <sw-ui-icon name=\"settings\"></sw-ui-icon>\n              </sw-ui-split-button>\n            `\n          : nothing}\n\n        <!-- Fullscreen (optional) -->\n        ${this.showFullscreen\n          ? html`\n              <sw-ui-split-button class=\"optional\" @sw-split-button-click=${this._onFullscreenToggle}>\n                <sw-ui-icon name=${this.fullscreen ? 'fullscreen-exit' : 'fullscreen'}></sw-ui-icon>\n              </sw-ui-split-button>\n            `\n          : nothing}\n\n        <!-- Overflow menu (shown on narrow containers) -->\n        <sw-ui-split-button\n          class=\"overflow\"\n          .items=${this._overflowItems()}\n          @sw-dropup-select=${this._onOverflowSelect}\n        >\n          <sw-ui-icon name=\"settings\"></sw-ui-icon>\n        </sw-ui-split-button>\n\n        <!-- Hang up -->\n        <sw-ui-split-button class=\"hangup\" @sw-split-button-click=${this._onHangUp}>\n          <sw-ui-icon name=\"phone-end\"></sw-ui-icon>\n        </sw-ui-split-button>\n\n        <!-- Spacer to balance the logo and keep buttons centered -->\n        <span class=\"bar-spacer\" aria-hidden=\"true\"></span>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'sw-ui-control-bar': SwUiControlBar;\n  }\n}\n","/**\n * @signalwire/web-components\n * UI Components Library built with Lit\n */\n\n// SDK-aware components (sw-* family)\nexport { SwCallMedia } from './components/sw-call-media.js';\nexport { SwSelfMedia } from './components/sw-self-media.js';\nexport { SwLocalCamera } from './components/sw-local-camera.js';\nexport { SwParticipants } from './components/sw-participants.js';\nexport { SwParticipantControls } from './components/sw-participant-controls.js';\nexport { SwAudioLevel } from './components/sw-audio-level.js';\nexport { SwCallControls } from './components/sw-call-controls.js';\nexport { SwCallStatus } from './components/sw-call-status.js';\nexport { SwCallProvider } from './components/sw-call-provider.js';\nexport { SwCallDialpad } from './components/sw-call-dialpad.js';\nexport { SwClickToCall } from './components/sw-click-to-call.js';\nexport { SwDirectory } from './components/sw-directory.js';\nexport { SwDeviceSelector } from './components/sw-device-selector/index.js';\nexport { SwCallWidget } from './components/sw-call-widget/sw-call-widget.js';\n\n// UI primitives (sw-ui-* family)\nexport * from './components/UI/index.js';\n\n// Export types (re-exported from core)\nexport type { Call, CallParticipant, CallSelfParticipant, DeviceController, LayoutLayer, Participant } from './types/index.js';\n\n// Export context\nexport * from './context/index.js';\n\n// Theming utilities\nexport { useGoogleFont } from './utils/use-google-font.js';\nexport type { UseGoogleFontOptions } from './utils/use-google-font.js';\nexport { ensureSignalWireTheme, ensureSignalWireFonts } from './utils/theme-loader.js';\n\n// Re-export Lit utilities for convenience\nexport { html, css, LitElement } from 'lit';\nexport type { TemplateResult, CSSResult } from 'lit';\n\n// ============================================================================\n// Library Ready Event (for async/dynamic script loading)\n// ============================================================================\n\ndeclare const __VERSION__: string;\n\n/**\n * Library version from package.json, injected at build time.\n */\nexport const version: string = __VERSION__;\n\n/**\n * Flag indicating the library has been loaded and is ready to use.\n */\nexport const ready: boolean = true;\n\n/**\n * Emits 'signalwire:web-components:ready' event when the library is loaded.\n *\n * Scripts that might load BEFORE the library (check flag first):\n *    ```js\n *    if (window.SignalWireUI?.ready) {\n *      // Library already loaded, use it directly\n *      initApp();\n *    } else {\n *      window.addEventListener('signalwire:web-components:ready', () => initApp());\n *    }\n *    ```\n */\nconst emitReadyEvent = (): void => {\n  if (typeof window !== 'undefined') {\n    const event = new CustomEvent('signalwire:web-components:ready', {\n      detail: { version: __VERSION__ }\n    });\n    window.dispatchEvent(event);\n  }\n};\n\nemitReadyEvent();\n","\n/* **********************************************\n     Begin prism-core.js\n********************************************** */\n\n/// <reference lib=\"WebWorker\"/>\n\nvar _self = (typeof window !== 'undefined')\n\t? window   // if in browser\n\t: (\n\t\t(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)\n\t\t\t? self // if in worker\n\t\t\t: {}   // if in node js\n\t);\n\n/**\n * Prism: Lightweight, robust, elegant syntax highlighting\n *\n * @license MIT <https://opensource.org/licenses/MIT>\n * @author Lea Verou <https://lea.verou.me>\n * @namespace\n * @public\n */\nvar Prism = (function (_self) {\n\n\t// Private helper vars\n\tvar lang = /(?:^|\\s)lang(?:uage)?-([\\w-]+)(?=\\s|$)/i;\n\tvar uniqueId = 0;\n\n\t// The grammar object for plaintext\n\tvar plainTextGrammar = {};\n\n\n\tvar _ = {\n\t\t/**\n\t\t * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the\n\t\t * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load\n\t\t * additional languages or plugins yourself.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not automatically highlight all code elements on the page.\n\t\t *\n\t\t * You obviously have to change this value before the automatic highlighting started. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.manual = true;\n\t\t * // add a new <script> to load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tmanual: _self.Prism && _self.Prism.manual,\n\t\t/**\n\t\t * By default, if Prism is in a web worker, it assumes that it is in a worker it created itself, so it uses\n\t\t * `addEventListener` to communicate with its parent instance. However, if you're using Prism manually in your\n\t\t * own worker, you don't want it to do this.\n\t\t *\n\t\t * By setting this value to `true`, Prism will not add its own listeners to the worker.\n\t\t *\n\t\t * You obviously have to change this value before Prism executes. To do this, you can add an\n\t\t * empty Prism object into the global scope before loading the Prism script like this:\n\t\t *\n\t\t * ```js\n\t\t * window.Prism = window.Prism || {};\n\t\t * Prism.disableWorkerMessageHandler = true;\n\t\t * // Load Prism's script\n\t\t * ```\n\t\t *\n\t\t * @default false\n\t\t * @type {boolean}\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tdisableWorkerMessageHandler: _self.Prism && _self.Prism.disableWorkerMessageHandler,\n\n\t\t/**\n\t\t * A namespace for utility methods.\n\t\t *\n\t\t * All function in this namespace that are not explicitly marked as _public_ are for __internal use only__ and may\n\t\t * change or disappear at any time.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t */\n\t\tutil: {\n\t\t\tencode: function encode(tokens) {\n\t\t\t\tif (tokens instanceof Token) {\n\t\t\t\t\treturn new Token(tokens.type, encode(tokens.content), tokens.alias);\n\t\t\t\t} else if (Array.isArray(tokens)) {\n\t\t\t\t\treturn tokens.map(encode);\n\t\t\t\t} else {\n\t\t\t\t\treturn tokens.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\\u00a0/g, ' ');\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the name of the type of the given value.\n\t\t\t *\n\t\t\t * @param {any} o\n\t\t\t * @returns {string}\n\t\t\t * @example\n\t\t\t * type(null)      === 'Null'\n\t\t\t * type(undefined) === 'Undefined'\n\t\t\t * type(123)       === 'Number'\n\t\t\t * type('foo')     === 'String'\n\t\t\t * type(true)      === 'Boolean'\n\t\t\t * type([1, 2])    === 'Array'\n\t\t\t * type({})        === 'Object'\n\t\t\t * type(String)    === 'Function'\n\t\t\t * type(/abc+/)    === 'RegExp'\n\t\t\t */\n\t\t\ttype: function (o) {\n\t\t\t\treturn Object.prototype.toString.call(o).slice(8, -1);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns a unique number for the given object. Later calls will still return the same number.\n\t\t\t *\n\t\t\t * @param {Object} obj\n\t\t\t * @returns {number}\n\t\t\t */\n\t\t\tobjId: function (obj) {\n\t\t\t\tif (!obj['__id']) {\n\t\t\t\t\tObject.defineProperty(obj, '__id', { value: ++uniqueId });\n\t\t\t\t}\n\t\t\t\treturn obj['__id'];\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Creates a deep clone of the given object.\n\t\t\t *\n\t\t\t * The main intended use of this function is to clone language definitions.\n\t\t\t *\n\t\t\t * @param {T} o\n\t\t\t * @param {Record<number, any>} [visited]\n\t\t\t * @returns {T}\n\t\t\t * @template T\n\t\t\t */\n\t\t\tclone: function deepClone(o, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar clone; var id;\n\t\t\t\tswitch (_.util.type(o)) {\n\t\t\t\t\tcase 'Object':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = /** @type {Record<string, any>} */ ({});\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\tfor (var key in o) {\n\t\t\t\t\t\t\tif (o.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\tclone[key] = deepClone(o[key], visited);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tcase 'Array':\n\t\t\t\t\t\tid = _.util.objId(o);\n\t\t\t\t\t\tif (visited[id]) {\n\t\t\t\t\t\t\treturn visited[id];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclone = [];\n\t\t\t\t\t\tvisited[id] = clone;\n\n\t\t\t\t\t\t(/** @type {Array} */(/** @type {any} */(o))).forEach(function (v, i) {\n\t\t\t\t\t\t\tclone[i] = deepClone(v, visited);\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\treturn /** @type {any} */ (clone);\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn o;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the Prism language of the given element set by a `language-xxxx` or `lang-xxxx` class.\n\t\t\t *\n\t\t\t * If no language is set for the element or the element is `null` or `undefined`, `none` will be returned.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @returns {string}\n\t\t\t */\n\t\t\tgetLanguage: function (element) {\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar m = lang.exec(element.className);\n\t\t\t\t\tif (m) {\n\t\t\t\t\t\treturn m[1].toLowerCase();\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn 'none';\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Sets the Prism `language-xxxx` class of the given element.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} language\n\t\t\t * @returns {void}\n\t\t\t */\n\t\t\tsetLanguage: function (element, language) {\n\t\t\t\t// remove all `language-xxxx` classes\n\t\t\t\t// (this might leave behind a leading space)\n\t\t\t\telement.className = element.className.replace(RegExp(lang, 'gi'), '');\n\n\t\t\t\t// add the new `language-xxxx` class\n\t\t\t\t// (using `classList` will automatically clean up spaces for us)\n\t\t\t\telement.classList.add('language-' + language);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns the script element that is currently executing.\n\t\t\t *\n\t\t\t * This does __not__ work for line script element.\n\t\t\t *\n\t\t\t * @returns {HTMLScriptElement | null}\n\t\t\t */\n\t\t\tcurrentScript: function () {\n\t\t\t\tif (typeof document === 'undefined') {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t\tif (document.currentScript && document.currentScript.tagName === 'SCRIPT' && 1 < 2 /* hack to trip TS' flow analysis */) {\n\t\t\t\t\treturn /** @type {any} */ (document.currentScript);\n\t\t\t\t}\n\n\t\t\t\t// IE11 workaround\n\t\t\t\t// we'll get the src of the current script by parsing IE11's error stack trace\n\t\t\t\t// this will not work for inline scripts\n\n\t\t\t\ttry {\n\t\t\t\t\tthrow new Error();\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// Get file src url from stack. Specifically works with the format of stack traces in IE.\n\t\t\t\t\t// A stack will look like this:\n\t\t\t\t\t//\n\t\t\t\t\t// Error\n\t\t\t\t\t//    at _.util.currentScript (http://localhost/components/prism-core.js:119:5)\n\t\t\t\t\t//    at Global code (http://localhost/components/prism-core.js:606:1)\n\n\t\t\t\t\tvar src = (/at [^(\\r\\n]*\\((.*):[^:]+:[^:]+\\)$/i.exec(err.stack) || [])[1];\n\t\t\t\t\tif (src) {\n\t\t\t\t\t\tvar scripts = document.getElementsByTagName('script');\n\t\t\t\t\t\tfor (var i in scripts) {\n\t\t\t\t\t\t\tif (scripts[i].src == src) {\n\t\t\t\t\t\t\t\treturn scripts[i];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Returns whether a given class is active for `element`.\n\t\t\t *\n\t\t\t * The class can be activated if `element` or one of its ancestors has the given class and it can be deactivated\n\t\t\t * if `element` or one of its ancestors has the negated version of the given class. The _negated version_ of the\n\t\t\t * given class is just the given class with a `no-` prefix.\n\t\t\t *\n\t\t\t * Whether the class is active is determined by the closest ancestor of `element` (where `element` itself is\n\t\t\t * closest ancestor) that has the given class or the negated version of it. If neither `element` nor any of its\n\t\t\t * ancestors have the given class or the negated version of it, then the default activation will be returned.\n\t\t\t *\n\t\t\t * In the paradoxical situation where the closest ancestor contains __both__ the given class and the negated\n\t\t\t * version of it, the class is considered active.\n\t\t\t *\n\t\t\t * @param {Element} element\n\t\t\t * @param {string} className\n\t\t\t * @param {boolean} [defaultActivation=false]\n\t\t\t * @returns {boolean}\n\t\t\t */\n\t\t\tisActive: function (element, className, defaultActivation) {\n\t\t\t\tvar no = 'no-' + className;\n\n\t\t\t\twhile (element) {\n\t\t\t\t\tvar classList = element.classList;\n\t\t\t\t\tif (classList.contains(className)) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\tif (classList.contains(no)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\telement = element.parentElement;\n\t\t\t\t}\n\t\t\t\treturn !!defaultActivation;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * This namespace contains all currently loaded languages and the some helper functions to create and modify languages.\n\t\t *\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\tlanguages: {\n\t\t\t/**\n\t\t\t * The grammar for plain, unformatted text.\n\t\t\t */\n\t\t\tplain: plainTextGrammar,\n\t\t\tplaintext: plainTextGrammar,\n\t\t\ttext: plainTextGrammar,\n\t\t\ttxt: plainTextGrammar,\n\n\t\t\t/**\n\t\t\t * Creates a deep copy of the language with the given id and appends the given tokens.\n\t\t\t *\n\t\t\t * If a token in `redef` also appears in the copied language, then the existing token in the copied language\n\t\t\t * will be overwritten at its original position.\n\t\t\t *\n\t\t\t * ## Best practices\n\t\t\t *\n\t\t\t * Since the position of overwriting tokens (token in `redef` that overwrite tokens in the copied language)\n\t\t\t * doesn't matter, they can technically be in any order. However, this can be confusing to others that trying to\n\t\t\t * understand the language definition because, normally, the order of tokens matters in Prism grammars.\n\t\t\t *\n\t\t\t * Therefore, it is encouraged to order overwriting tokens according to the positions of the overwritten tokens.\n\t\t\t * Furthermore, all non-overwriting tokens should be placed after the overwriting ones.\n\t\t\t *\n\t\t\t * @param {string} id The id of the language to extend. This has to be a key in `Prism.languages`.\n\t\t\t * @param {Grammar} redef The new tokens to append.\n\t\t\t * @returns {Grammar} The new language created.\n\t\t\t * @public\n\t\t\t * @example\n\t\t\t * Prism.languages['css-with-colors'] = Prism.languages.extend('css', {\n\t\t\t *     // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token\n\t\t\t *     // at its original position\n\t\t\t *     'comment': { ... },\n\t\t\t *     // CSS doesn't have a 'color' token, so this token will be appended\n\t\t\t *     'color': /\\b(?:red|green|blue)\\b/\n\t\t\t * });\n\t\t\t */\n\t\t\textend: function (id, redef) {\n\t\t\t\tvar lang = _.util.clone(_.languages[id]);\n\n\t\t\t\tfor (var key in redef) {\n\t\t\t\t\tlang[key] = redef[key];\n\t\t\t\t}\n\n\t\t\t\treturn lang;\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Inserts tokens _before_ another token in a language definition or any other grammar.\n\t\t\t *\n\t\t\t * ## Usage\n\t\t\t *\n\t\t\t * This helper method makes it easy to modify existing languages. For example, the CSS language definition\n\t\t\t * not only defines CSS highlighting for CSS documents, but also needs to define highlighting for CSS embedded\n\t\t\t * in HTML through `<style>` elements. To do this, it needs to modify `Prism.languages.markup` and add the\n\t\t\t * appropriate tokens. However, `Prism.languages.markup` is a regular JavaScript object literal, so if you do\n\t\t\t * this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.markup.style = {\n\t\t\t *     // token\n\t\t\t * };\n\t\t\t * ```\n\t\t\t *\n\t\t\t * then the `style` token will be added (and processed) at the end. `insertBefore` allows you to insert tokens\n\t\t\t * before existing tokens. For the CSS example above, you would use it like this:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'cdata', {\n\t\t\t *     'style': {\n\t\t\t *         // token\n\t\t\t *     }\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Special cases\n\t\t\t *\n\t\t\t * If the grammars of `inside` and `insert` have tokens with the same name, the tokens in `inside`'s grammar\n\t\t\t * will be ignored.\n\t\t\t *\n\t\t\t * This behavior can be used to insert tokens after `before`:\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * Prism.languages.insertBefore('markup', 'comment', {\n\t\t\t *     'comment': Prism.languages.markup.comment,\n\t\t\t *     // tokens after 'comment'\n\t\t\t * });\n\t\t\t * ```\n\t\t\t *\n\t\t\t * ## Limitations\n\t\t\t *\n\t\t\t * The main problem `insertBefore` has to solve is iteration order. Since ES2015, the iteration order for object\n\t\t\t * properties is guaranteed to be the insertion order (except for integer keys) but some browsers behave\n\t\t\t * differently when keys are deleted and re-inserted. So `insertBefore` can't be implemented by temporarily\n\t\t\t * deleting properties which is necessary to insert at arbitrary positions.\n\t\t\t *\n\t\t\t * To solve this problem, `insertBefore` doesn't actually insert the given tokens into the target object.\n\t\t\t * Instead, it will create a new object and replace all references to the target object with the new one. This\n\t\t\t * can be done without temporarily deleting properties, so the iteration order is well-defined.\n\t\t\t *\n\t\t\t * However, only references that can be reached from `Prism.languages` or `insert` will be replaced. I.e. if\n\t\t\t * you hold the target object in a variable, then the value of the variable will not change.\n\t\t\t *\n\t\t\t * ```js\n\t\t\t * var oldMarkup = Prism.languages.markup;\n\t\t\t * var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });\n\t\t\t *\n\t\t\t * assert(oldMarkup !== Prism.languages.markup);\n\t\t\t * assert(newMarkup === Prism.languages.markup);\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @param {string} inside The property of `root` (e.g. a language id in `Prism.languages`) that contains the\n\t\t\t * object to be modified.\n\t\t\t * @param {string} before The key to insert before.\n\t\t\t * @param {Grammar} insert An object containing the key-value pairs to be inserted.\n\t\t\t * @param {Object<string, any>} [root] The object containing `inside`, i.e. the object that contains the\n\t\t\t * object to be modified.\n\t\t\t *\n\t\t\t * Defaults to `Prism.languages`.\n\t\t\t * @returns {Grammar} The new grammar object.\n\t\t\t * @public\n\t\t\t */\n\t\t\tinsertBefore: function (inside, before, insert, root) {\n\t\t\t\troot = root || /** @type {any} */ (_.languages);\n\t\t\t\tvar grammar = root[inside];\n\t\t\t\t/** @type {Grammar} */\n\t\t\t\tvar ret = {};\n\n\t\t\t\tfor (var token in grammar) {\n\t\t\t\t\tif (grammar.hasOwnProperty(token)) {\n\n\t\t\t\t\t\tif (token == before) {\n\t\t\t\t\t\t\tfor (var newToken in insert) {\n\t\t\t\t\t\t\t\tif (insert.hasOwnProperty(newToken)) {\n\t\t\t\t\t\t\t\t\tret[newToken] = insert[newToken];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Do not insert token which also occur in insert. See #1525\n\t\t\t\t\t\tif (!insert.hasOwnProperty(token)) {\n\t\t\t\t\t\t\tret[token] = grammar[token];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar old = root[inside];\n\t\t\t\troot[inside] = ret;\n\n\t\t\t\t// Update references in other language definitions\n\t\t\t\t_.languages.DFS(_.languages, function (key, value) {\n\t\t\t\t\tif (value === old && key != inside) {\n\t\t\t\t\t\tthis[key] = ret;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn ret;\n\t\t\t},\n\n\t\t\t// Traverse a language definition with Depth First Search\n\t\t\tDFS: function DFS(o, callback, type, visited) {\n\t\t\t\tvisited = visited || {};\n\n\t\t\t\tvar objId = _.util.objId;\n\n\t\t\t\tfor (var i in o) {\n\t\t\t\t\tif (o.hasOwnProperty(i)) {\n\t\t\t\t\t\tcallback.call(o, i, o[i], type || i);\n\n\t\t\t\t\t\tvar property = o[i];\n\t\t\t\t\t\tvar propertyType = _.util.type(property);\n\n\t\t\t\t\t\tif (propertyType === 'Object' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, null, visited);\n\t\t\t\t\t\t} else if (propertyType === 'Array' && !visited[objId(property)]) {\n\t\t\t\t\t\t\tvisited[objId(property)] = true;\n\t\t\t\t\t\t\tDFS(property, callback, i, visited);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tplugins: {},\n\n\t\t/**\n\t\t * This is the most high-level function in Prism’s API.\n\t\t * It fetches all the elements that have a `.language-xxxx` class and then calls {@link Prism.highlightElement} on\n\t\t * each one of them.\n\t\t *\n\t\t * This is equivalent to `Prism.highlightAllUnder(document, async, callback)`.\n\t\t *\n\t\t * @param {boolean} [async=false] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @param {HighlightCallback} [callback] Same as in {@link Prism.highlightAllUnder}.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAll: function (async, callback) {\n\t\t\t_.highlightAllUnder(document, async, callback);\n\t\t},\n\n\t\t/**\n\t\t * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls\n\t\t * {@link Prism.highlightElement} on each one of them.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-highlightall`\n\t\t * 2. `before-all-elements-highlight`\n\t\t * 3. All hooks of {@link Prism.highlightElement} for each element.\n\t\t *\n\t\t * @param {ParentNode} container The root element, whose descendants that have a `.language-xxxx` class will be highlighted.\n\t\t * @param {boolean} [async=false] Whether each element is to be highlighted asynchronously using Web Workers.\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked on each element after its highlighting is done.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightAllUnder: function (container, async, callback) {\n\t\t\tvar env = {\n\t\t\t\tcallback: callback,\n\t\t\t\tcontainer: container,\n\t\t\t\tselector: 'code[class*=\"language-\"], [class*=\"language-\"] code, code[class*=\"lang-\"], [class*=\"lang-\"] code'\n\t\t\t};\n\n\t\t\t_.hooks.run('before-highlightall', env);\n\n\t\t\tenv.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));\n\n\t\t\t_.hooks.run('before-all-elements-highlight', env);\n\n\t\t\tfor (var i = 0, element; (element = env.elements[i++]);) {\n\t\t\t\t_.highlightElement(element, async === true, env.callback);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Highlights the code inside a single element.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-sanity-check`\n\t\t * 2. `before-highlight`\n\t\t * 3. All hooks of {@link Prism.highlight}. These hooks will be run by an asynchronous worker if `async` is `true`.\n\t\t * 4. `before-insert`\n\t\t * 5. `after-highlight`\n\t\t * 6. `complete`\n\t\t *\n\t\t * Some the above hooks will be skipped if the element doesn't contain any text or there is no grammar loaded for\n\t\t * the element's language.\n\t\t *\n\t\t * @param {Element} element The element containing the code.\n\t\t * It must have a class of `language-xxxx` to be processed, where `xxxx` is a valid language identifier.\n\t\t * @param {boolean} [async=false] Whether the element is to be highlighted asynchronously using Web Workers\n\t\t * to improve performance and avoid blocking the UI when highlighting very large chunks of code. This option is\n\t\t * [disabled by default](https://prismjs.com/faq.html#why-is-asynchronous-highlighting-disabled-by-default).\n\t\t *\n\t\t * Note: All language definitions required to highlight the code must be included in the main `prism.js` file for\n\t\t * asynchronous highlighting to work. You can build your own bundle on the\n\t\t * [Download page](https://prismjs.com/download.html).\n\t\t * @param {HighlightCallback} [callback] An optional callback to be invoked after the highlighting is done.\n\t\t * Mostly useful when `async` is `true`, since in that case, the highlighting is done asynchronously.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thighlightElement: function (element, async, callback) {\n\t\t\t// Find language\n\t\t\tvar language = _.util.getLanguage(element);\n\t\t\tvar grammar = _.languages[language];\n\n\t\t\t// Set language on the element, if not present\n\t\t\t_.util.setLanguage(element, language);\n\n\t\t\t// Set language on the parent, for styling\n\t\t\tvar parent = element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre') {\n\t\t\t\t_.util.setLanguage(parent, language);\n\t\t\t}\n\n\t\t\tvar code = element.textContent;\n\n\t\t\tvar env = {\n\t\t\t\telement: element,\n\t\t\t\tlanguage: language,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tcode: code\n\t\t\t};\n\n\t\t\tfunction insertHighlightedCode(highlightedCode) {\n\t\t\t\tenv.highlightedCode = highlightedCode;\n\n\t\t\t\t_.hooks.run('before-insert', env);\n\n\t\t\t\tenv.element.innerHTML = env.highlightedCode;\n\n\t\t\t\t_.hooks.run('after-highlight', env);\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t}\n\n\t\t\t_.hooks.run('before-sanity-check', env);\n\n\t\t\t// plugins may change/add the parent/element\n\t\t\tparent = env.element.parentElement;\n\t\t\tif (parent && parent.nodeName.toLowerCase() === 'pre' && !parent.hasAttribute('tabindex')) {\n\t\t\t\tparent.setAttribute('tabindex', '0');\n\t\t\t}\n\n\t\t\tif (!env.code) {\n\t\t\t\t_.hooks.run('complete', env);\n\t\t\t\tcallback && callback.call(env.element);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t_.hooks.run('before-highlight', env);\n\n\t\t\tif (!env.grammar) {\n\t\t\t\tinsertHighlightedCode(_.util.encode(env.code));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (async && _self.Worker) {\n\t\t\t\tvar worker = new Worker(_.filename);\n\n\t\t\t\tworker.onmessage = function (evt) {\n\t\t\t\t\tinsertHighlightedCode(evt.data);\n\t\t\t\t};\n\n\t\t\t\tworker.postMessage(JSON.stringify({\n\t\t\t\t\tlanguage: env.language,\n\t\t\t\t\tcode: env.code,\n\t\t\t\t\timmediateClose: true\n\t\t\t\t}));\n\t\t\t} else {\n\t\t\t\tinsertHighlightedCode(_.highlight(env.code, env.grammar, env.language));\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Low-level function, only use if you know what you’re doing. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns a string with the HTML produced.\n\t\t *\n\t\t * The following hooks will be run:\n\t\t * 1. `before-tokenize`\n\t\t * 2. `after-tokenize`\n\t\t * 3. `wrap`: On each {@link Token}.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @param {string} language The name of the language definition passed to `grammar`.\n\t\t * @returns {string} The highlighted HTML.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * Prism.highlight('var foo = true;', Prism.languages.javascript, 'javascript');\n\t\t */\n\t\thighlight: function (text, grammar, language) {\n\t\t\tvar env = {\n\t\t\t\tcode: text,\n\t\t\t\tgrammar: grammar,\n\t\t\t\tlanguage: language\n\t\t\t};\n\t\t\t_.hooks.run('before-tokenize', env);\n\t\t\tif (!env.grammar) {\n\t\t\t\tthrow new Error('The language \"' + env.language + '\" has no grammar.');\n\t\t\t}\n\t\t\tenv.tokens = _.tokenize(env.code, env.grammar);\n\t\t\t_.hooks.run('after-tokenize', env);\n\t\t\treturn Token.stringify(_.util.encode(env.tokens), env.language);\n\t\t},\n\n\t\t/**\n\t\t * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input\n\t\t * and the language definitions to use, and returns an array with the tokenized code.\n\t\t *\n\t\t * When the language definition includes nested tokens, the function is called recursively on each of these tokens.\n\t\t *\n\t\t * This method could be useful in other contexts as well, as a very crude parser.\n\t\t *\n\t\t * @param {string} text A string with the code to be highlighted.\n\t\t * @param {Grammar} grammar An object containing the tokens to use.\n\t\t *\n\t\t * Usually a language definition like `Prism.languages.markup`.\n\t\t * @returns {TokenStream} An array of strings and tokens, a token stream.\n\t\t * @memberof Prism\n\t\t * @public\n\t\t * @example\n\t\t * let code = `var foo = 0;`;\n\t\t * let tokens = Prism.tokenize(code, Prism.languages.javascript);\n\t\t * tokens.forEach(token => {\n\t\t *     if (token instanceof Prism.Token && token.type === 'number') {\n\t\t *         console.log(`Found numeric literal: ${token.content}`);\n\t\t *     }\n\t\t * });\n\t\t */\n\t\ttokenize: function (text, grammar) {\n\t\t\tvar rest = grammar.rest;\n\t\t\tif (rest) {\n\t\t\t\tfor (var token in rest) {\n\t\t\t\t\tgrammar[token] = rest[token];\n\t\t\t\t}\n\n\t\t\t\tdelete grammar.rest;\n\t\t\t}\n\n\t\t\tvar tokenList = new LinkedList();\n\t\t\taddAfter(tokenList, tokenList.head, text);\n\n\t\t\tmatchGrammar(text, tokenList, grammar, tokenList.head, 0);\n\n\t\t\treturn toArray(tokenList);\n\t\t},\n\n\t\t/**\n\t\t * @namespace\n\t\t * @memberof Prism\n\t\t * @public\n\t\t */\n\t\thooks: {\n\t\t\tall: {},\n\n\t\t\t/**\n\t\t\t * Adds the given callback to the list of callbacks for the given hook.\n\t\t\t *\n\t\t\t * The callback will be invoked when the hook it is registered for is run.\n\t\t\t * Hooks are usually directly run by a highlight function but you can also run hooks yourself.\n\t\t\t *\n\t\t\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {HookCallback} callback The callback function which is given environment variables.\n\t\t\t * @public\n\t\t\t */\n\t\t\tadd: function (name, callback) {\n\t\t\t\tvar hooks = _.hooks.all;\n\n\t\t\t\thooks[name] = hooks[name] || [];\n\n\t\t\t\thooks[name].push(callback);\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t\t\t *\n\t\t\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t\t\t *\n\t\t\t * @param {string} name The name of the hook.\n\t\t\t * @param {Object<string, any>} env The environment variables of the hook passed to all callbacks registered.\n\t\t\t * @public\n\t\t\t */\n\t\t\trun: function (name, env) {\n\t\t\t\tvar callbacks = _.hooks.all[name];\n\n\t\t\t\tif (!callbacks || !callbacks.length) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0, callback; (callback = callbacks[i++]);) {\n\t\t\t\t\tcallback(env);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tToken: Token\n\t};\n\t_self.Prism = _;\n\n\n\t// Typescript note:\n\t// The following can be used to import the Token type in JSDoc:\n\t//\n\t//   @typedef {InstanceType<import(\"./prism-core\")[\"Token\"]>} Token\n\n\t/**\n\t * Creates a new token.\n\t *\n\t * @param {string} type See {@link Token#type type}\n\t * @param {string | TokenStream} content See {@link Token#content content}\n\t * @param {string|string[]} [alias] The alias(es) of the token.\n\t * @param {string} [matchedStr=\"\"] A copy of the full string this token was created from.\n\t * @class\n\t * @global\n\t * @public\n\t */\n\tfunction Token(type, content, alias, matchedStr) {\n\t\t/**\n\t\t * The type of the token.\n\t\t *\n\t\t * This is usually the key of a pattern in a {@link Grammar}.\n\t\t *\n\t\t * @type {string}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.type = type;\n\t\t/**\n\t\t * The strings or tokens contained by this token.\n\t\t *\n\t\t * This will be a token stream if the pattern matched also defined an `inside` grammar.\n\t\t *\n\t\t * @type {string | TokenStream}\n\t\t * @public\n\t\t */\n\t\tthis.content = content;\n\t\t/**\n\t\t * The alias(es) of the token.\n\t\t *\n\t\t * @type {string|string[]}\n\t\t * @see GrammarToken\n\t\t * @public\n\t\t */\n\t\tthis.alias = alias;\n\t\t// Copy of the full string this token was created from\n\t\tthis.length = (matchedStr || '').length | 0;\n\t}\n\n\t/**\n\t * A token stream is an array of strings and {@link Token Token} objects.\n\t *\n\t * Token streams have to fulfill a few properties that are assumed by most functions (mostly internal ones) that process\n\t * them.\n\t *\n\t * 1. No adjacent strings.\n\t * 2. No empty strings.\n\t *\n\t *    The only exception here is the token stream that only contains the empty string and nothing else.\n\t *\n\t * @typedef {Array<string | Token>} TokenStream\n\t * @global\n\t * @public\n\t */\n\n\t/**\n\t * Converts the given token or token stream to an HTML representation.\n\t *\n\t * The following hooks will be run:\n\t * 1. `wrap`: On each {@link Token}.\n\t *\n\t * @param {string | Token | TokenStream} o The token or token stream to be converted.\n\t * @param {string} language The name of current language.\n\t * @returns {string} The HTML representation of the token or token stream.\n\t * @memberof Token\n\t * @static\n\t */\n\tToken.stringify = function stringify(o, language) {\n\t\tif (typeof o == 'string') {\n\t\t\treturn o;\n\t\t}\n\t\tif (Array.isArray(o)) {\n\t\t\tvar s = '';\n\t\t\to.forEach(function (e) {\n\t\t\t\ts += stringify(e, language);\n\t\t\t});\n\t\t\treturn s;\n\t\t}\n\n\t\tvar env = {\n\t\t\ttype: o.type,\n\t\t\tcontent: stringify(o.content, language),\n\t\t\ttag: 'span',\n\t\t\tclasses: ['token', o.type],\n\t\t\tattributes: {},\n\t\t\tlanguage: language\n\t\t};\n\n\t\tvar aliases = o.alias;\n\t\tif (aliases) {\n\t\t\tif (Array.isArray(aliases)) {\n\t\t\t\tArray.prototype.push.apply(env.classes, aliases);\n\t\t\t} else {\n\t\t\t\tenv.classes.push(aliases);\n\t\t\t}\n\t\t}\n\n\t\t_.hooks.run('wrap', env);\n\n\t\tvar attributes = '';\n\t\tfor (var name in env.attributes) {\n\t\t\tattributes += ' ' + name + '=\"' + (env.attributes[name] || '').replace(/\"/g, '&quot;') + '\"';\n\t\t}\n\n\t\treturn '<' + env.tag + ' class=\"' + env.classes.join(' ') + '\"' + attributes + '>' + env.content + '</' + env.tag + '>';\n\t};\n\n\t/**\n\t * @param {RegExp} pattern\n\t * @param {number} pos\n\t * @param {string} text\n\t * @param {boolean} lookbehind\n\t * @returns {RegExpExecArray | null}\n\t */\n\tfunction matchPattern(pattern, pos, text, lookbehind) {\n\t\tpattern.lastIndex = pos;\n\t\tvar match = pattern.exec(text);\n\t\tif (match && lookbehind && match[1]) {\n\t\t\t// change the match to remove the text matched by the Prism lookbehind group\n\t\t\tvar lookbehindLength = match[1].length;\n\t\t\tmatch.index += lookbehindLength;\n\t\t\tmatch[0] = match[0].slice(lookbehindLength);\n\t\t}\n\t\treturn match;\n\t}\n\n\t/**\n\t * @param {string} text\n\t * @param {LinkedList<string | Token>} tokenList\n\t * @param {any} grammar\n\t * @param {LinkedListNode<string | Token>} startNode\n\t * @param {number} startPos\n\t * @param {RematchOptions} [rematch]\n\t * @returns {void}\n\t * @private\n\t *\n\t * @typedef RematchOptions\n\t * @property {string} cause\n\t * @property {number} reach\n\t */\n\tfunction matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {\n\t\tfor (var token in grammar) {\n\t\t\tif (!grammar.hasOwnProperty(token) || !grammar[token]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar patterns = grammar[token];\n\t\t\tpatterns = Array.isArray(patterns) ? patterns : [patterns];\n\n\t\t\tfor (var j = 0; j < patterns.length; ++j) {\n\t\t\t\tif (rematch && rematch.cause == token + ',' + j) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar patternObj = patterns[j];\n\t\t\t\tvar inside = patternObj.inside;\n\t\t\t\tvar lookbehind = !!patternObj.lookbehind;\n\t\t\t\tvar greedy = !!patternObj.greedy;\n\t\t\t\tvar alias = patternObj.alias;\n\n\t\t\t\tif (greedy && !patternObj.pattern.global) {\n\t\t\t\t\t// Without the global flag, lastIndex won't work\n\t\t\t\t\tvar flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];\n\t\t\t\t\tpatternObj.pattern = RegExp(patternObj.pattern.source, flags + 'g');\n\t\t\t\t}\n\n\t\t\t\t/** @type {RegExp} */\n\t\t\t\tvar pattern = patternObj.pattern || patternObj;\n\n\t\t\t\tfor ( // iterate the token list and keep track of the current token/string position\n\t\t\t\t\tvar currentNode = startNode.next, pos = startPos;\n\t\t\t\t\tcurrentNode !== tokenList.tail;\n\t\t\t\t\tpos += currentNode.value.length, currentNode = currentNode.next\n\t\t\t\t) {\n\n\t\t\t\t\tif (rematch && pos >= rematch.reach) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar str = currentNode.value;\n\n\t\t\t\t\tif (tokenList.length > text.length) {\n\t\t\t\t\t\t// Something went terribly wrong, ABORT, ABORT!\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (str instanceof Token) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeCount = 1; // this is the to parameter of removeBetween\n\t\t\t\t\tvar match;\n\n\t\t\t\t\tif (greedy) {\n\t\t\t\t\t\tmatch = matchPattern(pattern, pos, text, lookbehind);\n\t\t\t\t\t\tif (!match || match.index >= text.length) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar from = match.index;\n\t\t\t\t\t\tvar to = match.index + match[0].length;\n\t\t\t\t\t\tvar p = pos;\n\n\t\t\t\t\t\t// find the node that contains the match\n\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\twhile (from >= p) {\n\t\t\t\t\t\t\tcurrentNode = currentNode.next;\n\t\t\t\t\t\t\tp += currentNode.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// adjust pos (and p)\n\t\t\t\t\t\tp -= currentNode.value.length;\n\t\t\t\t\t\tpos = p;\n\n\t\t\t\t\t\t// the current node is a Token, then the match starts inside another Token, which is invalid\n\t\t\t\t\t\tif (currentNode.value instanceof Token) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find the last node which is affected by this match\n\t\t\t\t\t\tfor (\n\t\t\t\t\t\t\tvar k = currentNode;\n\t\t\t\t\t\t\tk !== tokenList.tail && (p < to || typeof k.value === 'string');\n\t\t\t\t\t\t\tk = k.next\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tremoveCount++;\n\t\t\t\t\t\t\tp += k.value.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tremoveCount--;\n\n\t\t\t\t\t\t// replace with the new match\n\t\t\t\t\t\tstr = text.slice(pos, p);\n\t\t\t\t\t\tmatch.index -= pos;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmatch = matchPattern(pattern, 0, str, lookbehind);\n\t\t\t\t\t\tif (!match) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-redeclare\n\t\t\t\t\tvar from = match.index;\n\t\t\t\t\tvar matchStr = match[0];\n\t\t\t\t\tvar before = str.slice(0, from);\n\t\t\t\t\tvar after = str.slice(from + matchStr.length);\n\n\t\t\t\t\tvar reach = pos + str.length;\n\t\t\t\t\tif (rematch && reach > rematch.reach) {\n\t\t\t\t\t\trematch.reach = reach;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar removeFrom = currentNode.prev;\n\n\t\t\t\t\tif (before) {\n\t\t\t\t\t\tremoveFrom = addAfter(tokenList, removeFrom, before);\n\t\t\t\t\t\tpos += before.length;\n\t\t\t\t\t}\n\n\t\t\t\t\tremoveRange(tokenList, removeFrom, removeCount);\n\n\t\t\t\t\tvar wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);\n\t\t\t\t\tcurrentNode = addAfter(tokenList, removeFrom, wrapped);\n\n\t\t\t\t\tif (after) {\n\t\t\t\t\t\taddAfter(tokenList, currentNode, after);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (removeCount > 1) {\n\t\t\t\t\t\t// at least one Token object was removed, so we have to do some rematching\n\t\t\t\t\t\t// this can only happen if the current pattern is greedy\n\n\t\t\t\t\t\t/** @type {RematchOptions} */\n\t\t\t\t\t\tvar nestedRematch = {\n\t\t\t\t\t\t\tcause: token + ',' + j,\n\t\t\t\t\t\t\treach: reach\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmatchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);\n\n\t\t\t\t\t\t// the reach might have been extended because of the rematching\n\t\t\t\t\t\tif (rematch && nestedRematch.reach > rematch.reach) {\n\t\t\t\t\t\t\trematch.reach = nestedRematch.reach;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @typedef LinkedListNode\n\t * @property {T} value\n\t * @property {LinkedListNode<T> | null} prev The previous node.\n\t * @property {LinkedListNode<T> | null} next The next node.\n\t * @template T\n\t * @private\n\t */\n\n\t/**\n\t * @template T\n\t * @private\n\t */\n\tfunction LinkedList() {\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar head = { value: null, prev: null, next: null };\n\t\t/** @type {LinkedListNode<T>} */\n\t\tvar tail = { value: null, prev: head, next: null };\n\t\thead.next = tail;\n\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.head = head;\n\t\t/** @type {LinkedListNode<T>} */\n\t\tthis.tail = tail;\n\t\tthis.length = 0;\n\t}\n\n\t/**\n\t * Adds a new node with the given value to the list.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {T} value\n\t * @returns {LinkedListNode<T>} The added node.\n\t * @template T\n\t */\n\tfunction addAfter(list, node, value) {\n\t\t// assumes that node != list.tail && values.length >= 0\n\t\tvar next = node.next;\n\n\t\tvar newNode = { value: value, prev: node, next: next };\n\t\tnode.next = newNode;\n\t\tnext.prev = newNode;\n\t\tlist.length++;\n\n\t\treturn newNode;\n\t}\n\t/**\n\t * Removes `count` nodes after the given node. The given node will not be removed.\n\t *\n\t * @param {LinkedList<T>} list\n\t * @param {LinkedListNode<T>} node\n\t * @param {number} count\n\t * @template T\n\t */\n\tfunction removeRange(list, node, count) {\n\t\tvar next = node.next;\n\t\tfor (var i = 0; i < count && next !== list.tail; i++) {\n\t\t\tnext = next.next;\n\t\t}\n\t\tnode.next = next;\n\t\tnext.prev = node;\n\t\tlist.length -= i;\n\t}\n\t/**\n\t * @param {LinkedList<T>} list\n\t * @returns {T[]}\n\t * @template T\n\t */\n\tfunction toArray(list) {\n\t\tvar array = [];\n\t\tvar node = list.head.next;\n\t\twhile (node !== list.tail) {\n\t\t\tarray.push(node.value);\n\t\t\tnode = node.next;\n\t\t}\n\t\treturn array;\n\t}\n\n\n\tif (!_self.document) {\n\t\tif (!_self.addEventListener) {\n\t\t\t// in Node.js\n\t\t\treturn _;\n\t\t}\n\n\t\tif (!_.disableWorkerMessageHandler) {\n\t\t\t// In worker\n\t\t\t_self.addEventListener('message', function (evt) {\n\t\t\t\tvar message = JSON.parse(evt.data);\n\t\t\t\tvar lang = message.language;\n\t\t\t\tvar code = message.code;\n\t\t\t\tvar immediateClose = message.immediateClose;\n\n\t\t\t\t_self.postMessage(_.highlight(code, _.languages[lang], lang));\n\t\t\t\tif (immediateClose) {\n\t\t\t\t\t_self.close();\n\t\t\t\t}\n\t\t\t}, false);\n\t\t}\n\n\t\treturn _;\n\t}\n\n\t// Get current script and highlight\n\tvar script = _.util.currentScript();\n\n\tif (script) {\n\t\t_.filename = script.src;\n\n\t\tif (script.hasAttribute('data-manual')) {\n\t\t\t_.manual = true;\n\t\t}\n\t}\n\n\tfunction highlightAutomaticallyCallback() {\n\t\tif (!_.manual) {\n\t\t\t_.highlightAll();\n\t\t}\n\t}\n\n\tif (!_.manual) {\n\t\t// If the document state is \"loading\", then we'll use DOMContentLoaded.\n\t\t// If the document state is \"interactive\" and the prism.js script is deferred, then we'll also use the\n\t\t// DOMContentLoaded event because there might be some plugins or languages which have also been deferred and they\n\t\t// might take longer one animation frame to execute which can create a race condition where only some plugins have\n\t\t// been loaded when Prism.highlightAll() is executed, depending on how fast resources are loaded.\n\t\t// See https://github.com/PrismJS/prism/issues/2102\n\t\tvar readyState = document.readyState;\n\t\tif (readyState === 'loading' || readyState === 'interactive' && script && script.defer) {\n\t\t\tdocument.addEventListener('DOMContentLoaded', highlightAutomaticallyCallback);\n\t\t} else {\n\t\t\tif (window.requestAnimationFrame) {\n\t\t\t\twindow.requestAnimationFrame(highlightAutomaticallyCallback);\n\t\t\t} else {\n\t\t\t\twindow.setTimeout(highlightAutomaticallyCallback, 16);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn _;\n\n}(_self));\n\nif (typeof module !== 'undefined' && module.exports) {\n\tmodule.exports = Prism;\n}\n\n// hack for components to work correctly in node.js\nif (typeof global !== 'undefined') {\n\tglobal.Prism = Prism;\n}\n\n// some additional documentation/types\n\n/**\n * The expansion of a simple `RegExp` literal to support additional properties.\n *\n * @typedef GrammarToken\n * @property {RegExp} pattern The regular expression of the token.\n * @property {boolean} [lookbehind=false] If `true`, then the first capturing group of `pattern` will (effectively)\n * behave as a lookbehind group meaning that the captured text will not be part of the matched text of the new token.\n * @property {boolean} [greedy=false] Whether the token is greedy.\n * @property {string|string[]} [alias] An optional alias or list of aliases.\n * @property {Grammar} [inside] The nested grammar of this token.\n *\n * The `inside` grammar will be used to tokenize the text value of each token of this kind.\n *\n * This can be used to make nested and even recursive language definitions.\n *\n * Note: This can cause infinite recursion. Be careful when you embed different languages or even the same language into\n * each another.\n * @global\n * @public\n */\n\n/**\n * @typedef Grammar\n * @type {Object<string, RegExp | GrammarToken | Array<RegExp | GrammarToken>>}\n * @property {Grammar} [rest] An optional grammar object that will be appended to this grammar.\n * @global\n * @public\n */\n\n/**\n * A function which will invoked after an element was successfully highlighted.\n *\n * @callback HighlightCallback\n * @param {Element} element The element successfully highlighted.\n * @returns {void}\n * @global\n * @public\n */\n\n/**\n * @callback HookCallback\n * @param {Object<string, any>} env The environment variables of the hook.\n * @returns {void}\n * @global\n * @public\n */\n\n\n/* **********************************************\n     Begin prism-markup.js\n********************************************** */\n\nPrism.languages.markup = {\n\t'comment': {\n\t\tpattern: /<!--(?:(?!<!--)[\\s\\S])*?-->/,\n\t\tgreedy: true\n\t},\n\t'prolog': {\n\t\tpattern: /<\\?[\\s\\S]+?\\?>/,\n\t\tgreedy: true\n\t},\n\t'doctype': {\n\t\t// https://www.w3.org/TR/xml/#NT-doctypedecl\n\t\tpattern: /<!DOCTYPE(?:[^>\"'[\\]]|\"[^\"]*\"|'[^']*')+(?:\\[(?:[^<\"'\\]]|\"[^\"]*\"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\\]\\s*)?>/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'internal-subset': {\n\t\t\t\tpattern: /(^[^\\[]*\\[)[\\s\\S]+(?=\\]>$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: null // see below\n\t\t\t},\n\t\t\t'string': {\n\t\t\t\tpattern: /\"[^\"]*\"|'[^']*'/,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t'punctuation': /^<!|>$|[[\\]]/,\n\t\t\t'doctype-tag': /^DOCTYPE/i,\n\t\t\t'name': /[^\\s<>'\"]+/\n\t\t}\n\t},\n\t'cdata': {\n\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\tgreedy: true\n\t},\n\t'tag': {\n\t\tpattern: /<\\/?(?!\\d)[^\\s>\\/=$<%]+(?:\\s(?:\\s*[^\\s>\\/=]+(?:\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))|(?=[\\s/>])))+)?\\s*\\/?>/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'tag': {\n\t\t\t\tpattern: /^<\\/?[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': /^<\\/?/,\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t},\n\t\t\t'special-attr': [],\n\t\t\t'attr-value': {\n\t\t\t\tpattern: /=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+)/,\n\t\t\t\tinside: {\n\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /^(\\s*)[\"']|[\"']$/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t}\n\t\t\t},\n\t\t\t'punctuation': /\\/?>/,\n\t\t\t'attr-name': {\n\t\t\t\tpattern: /[^\\s>\\/]+/,\n\t\t\t\tinside: {\n\t\t\t\t\t'namespace': /^[^\\s>\\/:]+:/\n\t\t\t\t}\n\t\t\t}\n\n\t\t}\n\t},\n\t'entity': [\n\t\t{\n\t\t\tpattern: /&[\\da-z]{1,8};/i,\n\t\t\talias: 'named-entity'\n\t\t},\n\t\t/&#x?[\\da-f]{1,8};/i\n\t]\n};\n\nPrism.languages.markup['tag'].inside['attr-value'].inside['entity'] =\n\tPrism.languages.markup['entity'];\nPrism.languages.markup['doctype'].inside['internal-subset'].inside = Prism.languages.markup;\n\n// Plugin to make entity title show the real entity, idea by Roman Komarov\nPrism.hooks.add('wrap', function (env) {\n\n\tif (env.type === 'entity') {\n\t\tenv.attributes['title'] = env.content.replace(/&amp;/, '&');\n\t}\n});\n\nObject.defineProperty(Prism.languages.markup.tag, 'addInlined', {\n\t/**\n\t * Adds an inlined language to markup.\n\t *\n\t * An example of an inlined language is CSS with `<style>` tags.\n\t *\n\t * @param {string} tagName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addInlined('style', 'css');\n\t */\n\tvalue: function addInlined(tagName, lang) {\n\t\tvar includedCdataInside = {};\n\t\tincludedCdataInside['language-' + lang] = {\n\t\t\tpattern: /(^<!\\[CDATA\\[)[\\s\\S]+?(?=\\]\\]>$)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\t\tincludedCdataInside['cdata'] = /^<!\\[CDATA\\[|\\]\\]>$/i;\n\n\t\tvar inside = {\n\t\t\t'included-cdata': {\n\t\t\t\tpattern: /<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/i,\n\t\t\t\tinside: includedCdataInside\n\t\t\t}\n\t\t};\n\t\tinside['language-' + lang] = {\n\t\t\tpattern: /[\\s\\S]+/,\n\t\t\tinside: Prism.languages[lang]\n\t\t};\n\n\t\tvar def = {};\n\t\tdef[tagName] = {\n\t\t\tpattern: RegExp(/(<__[^>]*>)(?:<!\\[CDATA\\[(?:[^\\]]|\\](?!\\]>))*\\]\\]>|(?!<!\\[CDATA\\[)[\\s\\S])*?(?=<\\/__>)/.source.replace(/__/g, function () { return tagName; }), 'i'),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: inside\n\t\t};\n\n\t\tPrism.languages.insertBefore('markup', 'cdata', def);\n\t}\n});\nObject.defineProperty(Prism.languages.markup.tag, 'addAttribute', {\n\t/**\n\t * Adds an pattern to highlight languages embedded in HTML attributes.\n\t *\n\t * An example of an inlined language is CSS with `style` attributes.\n\t *\n\t * @param {string} attrName The name of the tag that contains the inlined language. This name will be treated as\n\t * case insensitive.\n\t * @param {string} lang The language key.\n\t * @example\n\t * addAttribute('style', 'css');\n\t */\n\tvalue: function (attrName, lang) {\n\t\tPrism.languages.markup.tag.inside['special-attr'].push({\n\t\t\tpattern: RegExp(\n\t\t\t\t/(^|[\"'\\s])/.source + '(?:' + attrName + ')' + /\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s'\">=]+(?=[\\s>]))/.source,\n\t\t\t\t'i'\n\t\t\t),\n\t\t\tlookbehind: true,\n\t\t\tinside: {\n\t\t\t\t'attr-name': /^[^\\s=]+/,\n\t\t\t\t'attr-value': {\n\t\t\t\t\tpattern: /=[\\s\\S]+/,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'value': {\n\t\t\t\t\t\t\tpattern: /(^=\\s*([\"']|(?![\"'])))\\S[\\s\\S]*(?=\\2$)/,\n\t\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\t\talias: [lang, 'language-' + lang],\n\t\t\t\t\t\t\tinside: Prism.languages[lang]\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpattern: /^=/,\n\t\t\t\t\t\t\t\talias: 'attr-equals'\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t/\"|'/\n\t\t\t\t\t\t]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nPrism.languages.html = Prism.languages.markup;\nPrism.languages.mathml = Prism.languages.markup;\nPrism.languages.svg = Prism.languages.markup;\n\nPrism.languages.xml = Prism.languages.extend('markup', {});\nPrism.languages.ssml = Prism.languages.xml;\nPrism.languages.atom = Prism.languages.xml;\nPrism.languages.rss = Prism.languages.xml;\n\n\n/* **********************************************\n     Begin prism-css.js\n********************************************** */\n\n(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n\n\n/* **********************************************\n     Begin prism-clike.js\n********************************************** */\n\nPrism.languages.clike = {\n\t'comment': [\n\t\t{\n\t\t\tpattern: /(^|[^\\\\])\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^\\\\:])\\/\\/.*/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t}\n\t],\n\t'string': {\n\t\tpattern: /([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\1)[^\\\\\\r\\n])*\\1/,\n\t\tgreedy: true\n\t},\n\t'class-name': {\n\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new|trait)\\s+|\\bcatch\\s+\\()[\\w.\\\\]+/i,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'punctuation': /[.\\\\]/\n\t\t}\n\t},\n\t'keyword': /\\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\\b/,\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'function': /\\b\\w+(?=\\()/,\n\t'number': /\\b0x[\\da-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:e[+-]?\\d+)?/i,\n\t'operator': /[<>]=?|[!=]=?=?|--?|\\+\\+?|&&?|\\|\\|?|[?*/~^%]/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\n\n/* **********************************************\n     Begin prism-javascript.js\n********************************************** */\n\nPrism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n\n\n/* **********************************************\n     Begin prism-file-highlight.js\n********************************************** */\n\n(function () {\n\n\tif (typeof Prism === 'undefined' || typeof document === 'undefined') {\n\t\treturn;\n\t}\n\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Element/matches#Polyfill\n\tif (!Element.prototype.matches) {\n\t\tElement.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\n\t}\n\n\tvar LOADING_MESSAGE = 'Loading…';\n\tvar FAILURE_MESSAGE = function (status, message) {\n\t\treturn '✖ Error ' + status + ' while fetching file: ' + message;\n\t};\n\tvar FAILURE_EMPTY_MESSAGE = '✖ Error: File does not exist or is empty';\n\n\tvar EXTENSIONS = {\n\t\t'js': 'javascript',\n\t\t'py': 'python',\n\t\t'rb': 'ruby',\n\t\t'ps1': 'powershell',\n\t\t'psm1': 'powershell',\n\t\t'sh': 'bash',\n\t\t'bat': 'batch',\n\t\t'h': 'c',\n\t\t'tex': 'latex'\n\t};\n\n\tvar STATUS_ATTR = 'data-src-status';\n\tvar STATUS_LOADING = 'loading';\n\tvar STATUS_LOADED = 'loaded';\n\tvar STATUS_FAILED = 'failed';\n\n\tvar SELECTOR = 'pre[data-src]:not([' + STATUS_ATTR + '=\"' + STATUS_LOADED + '\"])'\n\t\t+ ':not([' + STATUS_ATTR + '=\"' + STATUS_LOADING + '\"])';\n\n\t/**\n\t * Loads the given file.\n\t *\n\t * @param {string} src The URL or path of the source file to load.\n\t * @param {(result: string) => void} success\n\t * @param {(reason: string) => void} error\n\t */\n\tfunction loadFile(src, success, error) {\n\t\tvar xhr = new XMLHttpRequest();\n\t\txhr.open('GET', src, true);\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tif (xhr.status < 400 && xhr.responseText) {\n\t\t\t\t\tsuccess(xhr.responseText);\n\t\t\t\t} else {\n\t\t\t\t\tif (xhr.status >= 400) {\n\t\t\t\t\t\terror(FAILURE_MESSAGE(xhr.status, xhr.statusText));\n\t\t\t\t\t} else {\n\t\t\t\t\t\terror(FAILURE_EMPTY_MESSAGE);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t}\n\n\t/**\n\t * Parses the given range.\n\t *\n\t * This returns a range with inclusive ends.\n\t *\n\t * @param {string | null | undefined} range\n\t * @returns {[number, number | undefined] | undefined}\n\t */\n\tfunction parseRange(range) {\n\t\tvar m = /^\\s*(\\d+)\\s*(?:(,)\\s*(?:(\\d+)\\s*)?)?$/.exec(range || '');\n\t\tif (m) {\n\t\t\tvar start = Number(m[1]);\n\t\t\tvar comma = m[2];\n\t\t\tvar end = m[3];\n\n\t\t\tif (!comma) {\n\t\t\t\treturn [start, start];\n\t\t\t}\n\t\t\tif (!end) {\n\t\t\t\treturn [start, undefined];\n\t\t\t}\n\t\t\treturn [start, Number(end)];\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tPrism.hooks.add('before-highlightall', function (env) {\n\t\tenv.selector += ', ' + SELECTOR;\n\t});\n\n\tPrism.hooks.add('before-sanity-check', function (env) {\n\t\tvar pre = /** @type {HTMLPreElement} */ (env.element);\n\t\tif (pre.matches(SELECTOR)) {\n\t\t\tenv.code = ''; // fast-path the whole thing and go to complete\n\n\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADING); // mark as loading\n\n\t\t\t// add code element with loading message\n\t\t\tvar code = pre.appendChild(document.createElement('CODE'));\n\t\t\tcode.textContent = LOADING_MESSAGE;\n\n\t\t\tvar src = pre.getAttribute('data-src');\n\n\t\t\tvar language = env.language;\n\t\t\tif (language === 'none') {\n\t\t\t\t// the language might be 'none' because there is no language set;\n\t\t\t\t// in this case, we want to use the extension as the language\n\t\t\t\tvar extension = (/\\.(\\w+)$/.exec(src) || [, 'none'])[1];\n\t\t\t\tlanguage = EXTENSIONS[extension] || extension;\n\t\t\t}\n\n\t\t\t// set language classes\n\t\t\tPrism.util.setLanguage(code, language);\n\t\t\tPrism.util.setLanguage(pre, language);\n\n\t\t\t// preload the language\n\t\t\tvar autoloader = Prism.plugins.autoloader;\n\t\t\tif (autoloader) {\n\t\t\t\tautoloader.loadLanguages(language);\n\t\t\t}\n\n\t\t\t// load file\n\t\t\tloadFile(\n\t\t\t\tsrc,\n\t\t\t\tfunction (text) {\n\t\t\t\t\t// mark as loaded\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_LOADED);\n\n\t\t\t\t\t// handle data-range\n\t\t\t\t\tvar range = parseRange(pre.getAttribute('data-range'));\n\t\t\t\t\tif (range) {\n\t\t\t\t\t\tvar lines = text.split(/\\r\\n?|\\n/g);\n\n\t\t\t\t\t\t// the range is one-based and inclusive on both ends\n\t\t\t\t\t\tvar start = range[0];\n\t\t\t\t\t\tvar end = range[1] == null ? lines.length : range[1];\n\n\t\t\t\t\t\tif (start < 0) { start += lines.length; }\n\t\t\t\t\t\tstart = Math.max(0, Math.min(start - 1, lines.length));\n\t\t\t\t\t\tif (end < 0) { end += lines.length; }\n\t\t\t\t\t\tend = Math.max(0, Math.min(end, lines.length));\n\n\t\t\t\t\t\ttext = lines.slice(start, end).join('\\n');\n\n\t\t\t\t\t\t// add data-start for line numbers\n\t\t\t\t\t\tif (!pre.hasAttribute('data-start')) {\n\t\t\t\t\t\t\tpre.setAttribute('data-start', String(start + 1));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// highlight code\n\t\t\t\t\tcode.textContent = text;\n\t\t\t\t\tPrism.highlightElement(code);\n\t\t\t\t},\n\t\t\t\tfunction (error) {\n\t\t\t\t\t// mark as failed\n\t\t\t\t\tpre.setAttribute(STATUS_ATTR, STATUS_FAILED);\n\n\t\t\t\t\tcode.textContent = error;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\n\tPrism.plugins.fileHighlight = {\n\t\t/**\n\t\t * Executes the File Highlight plugin for all matching `pre` elements under the given container.\n\t\t *\n\t\t * Note: Elements which are already loaded or currently loading will not be touched by this method.\n\t\t *\n\t\t * @param {ParentNode} [container=document]\n\t\t */\n\t\thighlight: function highlight(container) {\n\t\t\tvar elements = (container || document).querySelectorAll(SELECTOR);\n\n\t\t\tfor (var i = 0, element; (element = elements[i++]);) {\n\t\t\t\tPrism.highlightElement(element);\n\t\t\t}\n\t\t}\n\t};\n\n\tvar logged = false;\n\t/** @deprecated Use `Prism.plugins.fileHighlight.highlight` instead. */\n\tPrism.fileHighlight = function () {\n\t\tif (!logged) {\n\t\t\tconsole.warn('Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.');\n\t\t\tlogged = true;\n\t\t}\n\t\tPrism.plugins.fileHighlight.highlight.apply(this, arguments);\n\t};\n\n}());\n","Prism.languages.javascript = Prism.languages.extend('clike', {\n\t'class-name': [\n\t\tPrism.languages.clike['class-name'],\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$A-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\.(?:constructor|prototype))/,\n\t\t\tlookbehind: true\n\t\t}\n\t],\n\t'keyword': [\n\t\t{\n\t\t\tpattern: /((?:^|\\})\\s*)catch\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^.]|\\.\\.\\.\\s*)\\b(?:as|assert(?=\\s*\\{)|async(?=\\s*(?:function\\b|\\(|[$\\w\\xA0-\\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\\s*(?:\\{|$))|for|from(?=\\s*(?:['\"]|$))|function|(?:get|set)(?=\\s*(?:[#\\[$\\w\\xA0-\\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\\b/,\n\t\t\tlookbehind: true\n\t\t},\n\t],\n\t// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)\n\t'function': /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*(?:\\.\\s*(?:apply|bind|call)\\s*)?\\()/,\n\t'number': {\n\t\tpattern: RegExp(\n\t\t\t/(^|[^\\w$])/.source +\n\t\t\t'(?:' +\n\t\t\t(\n\t\t\t\t// constant\n\t\t\t\t/NaN|Infinity/.source +\n\t\t\t\t'|' +\n\t\t\t\t// binary integer\n\t\t\t\t/0[bB][01]+(?:_[01]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// octal integer\n\t\t\t\t/0[oO][0-7]+(?:_[0-7]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// hexadecimal integer\n\t\t\t\t/0[xX][\\dA-Fa-f]+(?:_[\\dA-Fa-f]+)*n?/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal bigint\n\t\t\t\t/\\d+(?:_\\d+)*n/.source +\n\t\t\t\t'|' +\n\t\t\t\t// decimal number (integer or float) but no bigint\n\t\t\t\t/(?:\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\.\\d+(?:_\\d+)*)(?:[Ee][+-]?\\d+(?:_\\d+)*)?/.source\n\t\t\t) +\n\t\t\t')' +\n\t\t\t/(?![\\w$])/.source\n\t\t),\n\t\tlookbehind: true\n\t},\n\t'operator': /--|\\+\\+|\\*\\*=?|=>|&&=?|\\|\\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\\.{3}|\\?\\?=?|\\?\\.?|[~:]/\n});\n\nPrism.languages.javascript['class-name'][0].pattern = /(\\b(?:class|extends|implements|instanceof|interface|new)\\s+)[\\w.\\\\]+/;\n\nPrism.languages.insertBefore('javascript', 'keyword', {\n\t'regex': {\n\t\tpattern: RegExp(\n\t\t\t// lookbehind\n\t\t\t// eslint-disable-next-line regexp/no-dupe-characters-character-class\n\t\t\t/((?:^|[^$\\w\\xA0-\\uFFFF.\"'\\])\\s]|\\b(?:return|yield))\\s*)/.source +\n\t\t\t// Regex pattern:\n\t\t\t// There are 2 regex patterns here. The RegExp set notation proposal added support for nested character\n\t\t\t// classes if the `v` flag is present. Unfortunately, nested CCs are both context-free and incompatible\n\t\t\t// with the only syntax, so we have to define 2 different regex patterns.\n\t\t\t/\\//.source +\n\t\t\t'(?:' +\n\t\t\t/(?:\\[(?:[^\\]\\\\\\r\\n]|\\\\.)*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}/.source +\n\t\t\t'|' +\n\t\t\t// `v` flag syntax. This supports 3 levels of nested character classes.\n\t\t\t/(?:\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.|\\[(?:[^[\\]\\\\\\r\\n]|\\\\.)*\\])*\\])*\\]|\\\\.|[^/\\\\\\[\\r\\n])+\\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source +\n\t\t\t')' +\n\t\t\t// lookahead\n\t\t\t/(?=(?:\\s|\\/\\*(?:[^*]|\\*(?!\\/))*\\*\\/)*(?:$|[\\r\\n,.;:})\\]]|\\/\\/))/.source\n\t\t),\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'regex-source': {\n\t\t\t\tpattern: /^(\\/)[\\s\\S]+(?=\\/[a-z]*$)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'language-regex',\n\t\t\t\tinside: Prism.languages.regex\n\t\t\t},\n\t\t\t'regex-delimiter': /^\\/|\\/$/,\n\t\t\t'regex-flags': /^[a-z]+$/,\n\t\t}\n\t},\n\t// This must be declared before keyword because we use \"function\" inside the look-forward\n\t'function-variable': {\n\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*[=:]\\s*(?:async\\s*)?(?:\\bfunction\\b|(?:\\((?:[^()]|\\([^()]*\\))*\\)|(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)\\s*=>))/,\n\t\talias: 'function'\n\t},\n\t'parameter': [\n\t\t{\n\t\t\tpattern: /(function(?:\\s+(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*)?\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\))/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(^|[^$\\w\\xA0-\\uFFFF])(?!\\s)[_$a-z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*=>)/i,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /(\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*=>)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t},\n\t\t{\n\t\t\tpattern: /((?:\\b|\\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\\w\\xA0-\\uFFFF]))(?:(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*)\\(\\s*|\\]\\s*\\(\\s*)(?!\\s)(?:[^()\\s]|\\s+(?![\\s)])|\\([^()]*\\))+(?=\\s*\\)\\s*\\{)/,\n\t\t\tlookbehind: true,\n\t\t\tinside: Prism.languages.javascript\n\t\t}\n\t],\n\t'constant': /\\b[A-Z](?:[A-Z_]|\\dx?)*\\b/\n});\n\nPrism.languages.insertBefore('javascript', 'string', {\n\t'hashbang': {\n\t\tpattern: /^#!.*/,\n\t\tgreedy: true,\n\t\talias: 'comment'\n\t},\n\t'template-string': {\n\t\tpattern: /`(?:\\\\[\\s\\S]|\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}|(?!\\$\\{)[^\\\\`])*`/,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'template-punctuation': {\n\t\t\t\tpattern: /^`|`$/,\n\t\t\t\talias: 'string'\n\t\t\t},\n\t\t\t'interpolation': {\n\t\t\t\tpattern: /((?:^|[^\\\\])(?:\\\\{2})*)\\$\\{(?:[^{}]|\\{(?:[^{}]|\\{[^}]*\\})*\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'interpolation-punctuation': {\n\t\t\t\t\t\tpattern: /^\\$\\{|\\}$/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: Prism.languages.javascript\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'string-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)([\"'])(?:\\\\(?:\\r\\n|[\\s\\S])|(?!\\2)[^\\\\\\r\\n])*\\2(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\tgreedy: true,\n\t\talias: 'property'\n\t}\n});\n\nPrism.languages.insertBefore('javascript', 'operator', {\n\t'literal-property': {\n\t\tpattern: /((?:^|[,{])[ \\t]*)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?=\\s*:)/m,\n\t\tlookbehind: true,\n\t\talias: 'property'\n\t},\n});\n\nif (Prism.languages.markup) {\n\tPrism.languages.markup.tag.addInlined('script', 'javascript');\n\n\t// add attribute support for all DOM events.\n\t// https://developer.mozilla.org/en-US/docs/Web/Events#Standard_events\n\tPrism.languages.markup.tag.addAttribute(\n\t\t/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,\n\t\t'javascript'\n\t);\n}\n\nPrism.languages.js = Prism.languages.javascript;\n","(function (Prism) {\n\n\tPrism.languages.typescript = Prism.languages.extend('javascript', {\n\t\t'class-name': {\n\t\t\tpattern: /(\\b(?:class|extends|implements|instanceof|interface|new|type)\\s+)(?!keyof\\b)(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*(?:\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: null // see below\n\t\t},\n\t\t'builtin': /\\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\\b/,\n\t});\n\n\t// The keywords TypeScript adds to JavaScript\n\tPrism.languages.typescript.keyword.push(\n\t\t/\\b(?:abstract|declare|is|keyof|readonly|require)\\b/,\n\t\t// keywords that have to be followed by an identifier\n\t\t/\\b(?:asserts|infer|interface|module|namespace|type)\\b(?=\\s*(?:[{_$a-zA-Z\\xA0-\\uFFFF]|$))/,\n\t\t// This is for `import type *, {}`\n\t\t/\\btype\\b(?=\\s*(?:[\\{*]|$))/\n\t);\n\n\t// doesn't work with TS because TS is too complex\n\tdelete Prism.languages.typescript['parameter'];\n\tdelete Prism.languages.typescript['literal-property'];\n\n\t// a version of typescript specifically for highlighting types\n\tvar typeInside = Prism.languages.extend('typescript', {});\n\tdelete typeInside['class-name'];\n\n\tPrism.languages.typescript['class-name'].inside = typeInside;\n\n\tPrism.languages.insertBefore('typescript', 'function', {\n\t\t'decorator': {\n\t\t\tpattern: /@[$\\w\\xA0-\\uFFFF]+/,\n\t\t\tinside: {\n\t\t\t\t'at': {\n\t\t\t\t\tpattern: /^@/,\n\t\t\t\t\talias: 'operator'\n\t\t\t\t},\n\t\t\t\t'function': /^[\\s\\S]+/\n\t\t\t}\n\t\t},\n\t\t'generic-function': {\n\t\t\t// e.g. foo<T extends \"bar\" | \"baz\">( ...\n\t\t\tpattern: /#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*\\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\\s*\\()/,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^#?(?!\\s)[_$a-zA-Z\\xA0-\\uFFFF](?:(?!\\s)[$\\w\\xA0-\\uFFFF])*/,\n\t\t\t\t'generic': {\n\t\t\t\t\tpattern: /<[\\s\\S]+/, // everything after the first <\n\t\t\t\t\talias: 'class-name',\n\t\t\t\t\tinside: typeInside\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tPrism.languages.ts = Prism.languages.typescript;\n\n}(Prism));\n","Prism.languages.python = {\n\t'comment': {\n\t\tpattern: /(^|[^\\\\])#.*/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t},\n\t'string-interpolation': {\n\t\tpattern: /(?:f|fr|rf)(?:(\"\"\"|''')[\\s\\S]*?\\1|(\"|')(?:\\\\.|(?!\\2)[^\\\\\\r\\n])*\\2)/i,\n\t\tgreedy: true,\n\t\tinside: {\n\t\t\t'interpolation': {\n\t\t\t\t// \"{\" <expression> <optional \"!s\", \"!r\", or \"!a\"> <optional \":\" format specifier> \"}\"\n\t\t\t\tpattern: /((?:^|[^{])(?:\\{\\{)*)\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}]|\\{(?!\\{)(?:[^{}])+\\})+\\})+\\}/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'format-spec': {\n\t\t\t\t\t\tpattern: /(:)[^:(){}]+(?=\\}$)/,\n\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t},\n\t\t\t\t\t'conversion-option': {\n\t\t\t\t\t\tpattern: /![sra](?=[:}]$)/,\n\t\t\t\t\t\talias: 'punctuation'\n\t\t\t\t\t},\n\t\t\t\t\trest: null\n\t\t\t\t}\n\t\t\t},\n\t\t\t'string': /[\\s\\S]+/\n\t\t}\n\t},\n\t'triple-quoted-string': {\n\t\tpattern: /(?:[rub]|br|rb)?(\"\"\"|''')[\\s\\S]*?\\1/i,\n\t\tgreedy: true,\n\t\talias: 'string'\n\t},\n\t'string': {\n\t\tpattern: /(?:[rub]|br|rb)?(\"|')(?:\\\\.|(?!\\1)[^\\\\\\r\\n])*\\1/i,\n\t\tgreedy: true\n\t},\n\t'function': {\n\t\tpattern: /((?:^|\\s)def[ \\t]+)[a-zA-Z_]\\w*(?=\\s*\\()/g,\n\t\tlookbehind: true\n\t},\n\t'class-name': {\n\t\tpattern: /(\\bclass\\s+)\\w+/i,\n\t\tlookbehind: true\n\t},\n\t'decorator': {\n\t\tpattern: /(^[\\t ]*)@\\w+(?:\\.\\w+)*/m,\n\t\tlookbehind: true,\n\t\talias: ['annotation', 'punctuation'],\n\t\tinside: {\n\t\t\t'punctuation': /\\./\n\t\t}\n\t},\n\t'keyword': /\\b(?:_(?=\\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\\b/,\n\t'builtin': /\\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\\b/,\n\t'boolean': /\\b(?:False|None|True)\\b/,\n\t'number': /\\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\\b|(?:\\b\\d+(?:_\\d+)*(?:\\.(?:\\d+(?:_\\d+)*)?)?|\\B\\.\\d+(?:_\\d+)*)(?:e[+-]?\\d+(?:_\\d+)*)?j?(?!\\w)/i,\n\t'operator': /[-+%=]=?|!=|:=|\\*\\*?=?|\\/\\/?=?|<[<=>]?|>[=>]?|[&|^~]/,\n\t'punctuation': /[{}[\\];(),.:]/\n};\n\nPrism.languages.python['string-interpolation'].inside['interpolation'].inside.rest = Prism.languages.python;\n\nPrism.languages.py = Prism.languages.python;\n","(function (Prism) {\n\t// $ set | grep '^[A-Z][^[:space:]]*=' | cut -d= -f1 | tr '\\n' '|'\n\t// + LC_ALL, RANDOM, REPLY, SECONDS.\n\t// + make sure PS1..4 are here as they are not always set,\n\t// - some useless things.\n\tvar envVars = '\\\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\\\b';\n\n\tvar commandAfterHeredoc = {\n\t\tpattern: /(^([\"']?)\\w+\\2)[ \\t]+\\S.*/,\n\t\tlookbehind: true,\n\t\talias: 'punctuation', // this looks reasonably well in all themes\n\t\tinside: null // see below\n\t};\n\n\tvar insideString = {\n\t\t'bash': commandAfterHeredoc,\n\t\t'environment': {\n\t\t\tpattern: RegExp('\\\\$' + envVars),\n\t\t\talias: 'constant'\n\t\t},\n\t\t'variable': [\n\t\t\t// [0]: Arithmetic Environment\n\t\t\t{\n\t\t\t\tpattern: /\\$?\\(\\([\\s\\S]+?\\)\\)/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t// If there is a $ sign at the beginning highlight $(( and )) as variable\n\t\t\t\t\t'variable': [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpattern: /(^\\$\\(\\([\\s\\S]+)\\)\\)/,\n\t\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t\t},\n\t\t\t\t\t\t/^\\$\\(\\(/\n\t\t\t\t\t],\n\t\t\t\t\t'number': /\\b0x[\\dA-Fa-f]+\\b|(?:\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+)(?:[Ee]-?\\d+)?/,\n\t\t\t\t\t// Operators according to https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic\n\t\t\t\t\t'operator': /--|\\+\\+|\\*\\*=?|<<=?|>>=?|&&|\\|\\||[=!+\\-*/%<>^&|]=?|[?~:]/,\n\t\t\t\t\t// If there is no $ sign at the beginning highlight (( and )) as punctuation\n\t\t\t\t\t'punctuation': /\\(\\(?|\\)\\)?|,|;/\n\t\t\t\t}\n\t\t\t},\n\t\t\t// [1]: Command Substitution\n\t\t\t{\n\t\t\t\tpattern: /\\$\\((?:\\([^)]+\\)|[^()])+\\)|`[^`]+`/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'variable': /^\\$\\(|^`|\\)$|`$/\n\t\t\t\t}\n\t\t\t},\n\t\t\t// [2]: Brace expansion\n\t\t\t{\n\t\t\t\tpattern: /\\$\\{[^}]+\\}/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'operator': /:[-=?+]?|[!\\/]|##?|%%?|\\^\\^?|,,?/,\n\t\t\t\t\t'punctuation': /[\\[\\]]/,\n\t\t\t\t\t'environment': {\n\t\t\t\t\t\tpattern: RegExp('(\\\\{)' + envVars),\n\t\t\t\t\t\tlookbehind: true,\n\t\t\t\t\t\talias: 'constant'\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t/\\$(?:\\w+|[#?*!@$])/\n\t\t],\n\t\t// Escape sequences from echo and printf's manuals, and escaped quotes.\n\t\t'entity': /\\\\(?:[abceEfnrtv\\\\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/\n\t};\n\n\tPrism.languages.bash = {\n\t\t'shebang': {\n\t\t\tpattern: /^#!\\s*\\/.*/,\n\t\t\talias: 'important'\n\t\t},\n\t\t'comment': {\n\t\t\tpattern: /(^|[^\"{\\\\$])#.*/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'function-name': [\n\t\t\t// a) function foo {\n\t\t\t// b) foo() {\n\t\t\t// c) function foo() {\n\t\t\t// but not “foo {”\n\t\t\t{\n\t\t\t\t// a) and c)\n\t\t\t\tpattern: /(\\bfunction\\s+)[\\w-]+(?=(?:\\s*\\(?:\\s*\\))?\\s*\\{)/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'function'\n\t\t\t},\n\t\t\t{\n\t\t\t\t// b)\n\t\t\t\tpattern: /\\b[\\w-]+(?=\\s*\\(\\s*\\)\\s*\\{)/,\n\t\t\t\talias: 'function'\n\t\t\t}\n\t\t],\n\t\t// Highlight variable names as variables in for and select beginnings.\n\t\t'for-or-select': {\n\t\t\tpattern: /(\\b(?:for|select)\\s+)\\w+(?=\\s+in\\s)/,\n\t\t\talias: 'variable',\n\t\t\tlookbehind: true\n\t\t},\n\t\t// Highlight variable names as variables in the left-hand part\n\t\t// of assignments (“=” and “+=”).\n\t\t'assign-left': {\n\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()\\w+(?:\\.\\w+)*(?=\\+?=)/,\n\t\t\tinside: {\n\t\t\t\t'environment': {\n\t\t\t\t\tpattern: RegExp('(^|[\\\\s;|&]|[<>]\\\\()' + envVars),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'constant'\n\t\t\t\t}\n\t\t\t},\n\t\t\talias: 'variable',\n\t\t\tlookbehind: true\n\t\t},\n\t\t// Highlight parameter names as variables\n\t\t'parameter': {\n\t\t\tpattern: /(^|\\s)-{1,2}(?:\\w+:[+-]?)?\\w+(?:\\.\\w+)*(?=[=\\s]|$)/,\n\t\t\talias: 'variable',\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': [\n\t\t\t// Support for Here-documents https://en.wikipedia.org/wiki/Here_document\n\t\t\t{\n\t\t\t\tpattern: /((?:^|[^<])<<-?\\s*)(\\w+)\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\2/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: insideString\n\t\t\t},\n\t\t\t// Here-document with quotes around the tag\n\t\t\t// → No expansion (so no “inside”).\n\t\t\t{\n\t\t\t\tpattern: /((?:^|[^<])<<-?\\s*)([\"'])(\\w+)\\2\\s[\\s\\S]*?(?:\\r?\\n|\\r)\\3/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'bash': commandAfterHeredoc\n\t\t\t\t}\n\t\t\t},\n\t\t\t// “Normal” string\n\t\t\t{\n\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html\n\t\t\t\tpattern: /(^|[^\\\\](?:\\\\\\\\)*)\"(?:\\\\[\\s\\S]|\\$\\([^)]+\\)|\\$(?!\\()|`[^`]+`|[^\"\\\\`$])*\"/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: insideString\n\t\t\t},\n\t\t\t{\n\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/Single-Quotes.html\n\t\t\t\tpattern: /(^|[^$\\\\])'[^']*'/,\n\t\t\t\tlookbehind: true,\n\t\t\t\tgreedy: true\n\t\t\t},\n\t\t\t{\n\t\t\t\t// https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html\n\t\t\t\tpattern: /\\$'(?:[^'\\\\]|\\\\[\\s\\S])*'/,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'entity': insideString.entity\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t'environment': {\n\t\t\tpattern: RegExp('\\\\$?' + envVars),\n\t\t\talias: 'constant'\n\t\t},\n\t\t'variable': insideString.variable,\n\t\t'function': {\n\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\\s;|&])/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'keyword': {\n\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\\s;|&])/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t// https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html\n\t\t'builtin': {\n\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()(?:\\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\\s;|&])/,\n\t\t\tlookbehind: true,\n\t\t\t// Alias added to make those easier to distinguish from strings.\n\t\t\talias: 'class-name'\n\t\t},\n\t\t'boolean': {\n\t\t\tpattern: /(^|[\\s;|&]|[<>]\\()(?:false|true)(?=$|[)\\s;|&])/,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'file-descriptor': {\n\t\t\tpattern: /\\B&\\d\\b/,\n\t\t\talias: 'important'\n\t\t},\n\t\t'operator': {\n\t\t\t// Lots of redirections here, but not just that.\n\t\t\tpattern: /\\d?<>|>\\||\\+=|=[=~]?|!=?|<<[<-]?|[&\\d]?>>|\\d[<>]&?|[<>][&=]?|&[>&]?|\\|[&|]?/,\n\t\t\tinside: {\n\t\t\t\t'file-descriptor': {\n\t\t\t\t\tpattern: /^\\d/,\n\t\t\t\t\talias: 'important'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'punctuation': /\\$?\\(\\(?|\\)\\)?|\\.\\.|[{}[\\];\\\\]/,\n\t\t'number': {\n\t\t\tpattern: /(^|\\s)(?:[1-9]\\d*|0)(?:[.,]\\d+)?\\b/,\n\t\t\tlookbehind: true\n\t\t}\n\t};\n\n\tcommandAfterHeredoc.inside = Prism.languages.bash;\n\n\t/* Patterns in command substitution. */\n\tvar toBeCopied = [\n\t\t'comment',\n\t\t'function-name',\n\t\t'for-or-select',\n\t\t'assign-left',\n\t\t'parameter',\n\t\t'string',\n\t\t'environment',\n\t\t'function',\n\t\t'keyword',\n\t\t'builtin',\n\t\t'boolean',\n\t\t'file-descriptor',\n\t\t'operator',\n\t\t'punctuation',\n\t\t'number'\n\t];\n\tvar inside = insideString.variable[1].inside;\n\tfor (var i = 0; i < toBeCopied.length; i++) {\n\t\tinside[toBeCopied[i]] = Prism.languages.bash[toBeCopied[i]];\n\t}\n\n\tPrism.languages.sh = Prism.languages.bash;\n\tPrism.languages.shell = Prism.languages.bash;\n}(Prism));\n","// https://www.json.org/json-en.html\nPrism.languages.json = {\n\t'property': {\n\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t},\n\t'string': {\n\t\tpattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?!\\s*:)/,\n\t\tlookbehind: true,\n\t\tgreedy: true\n\t},\n\t'comment': {\n\t\tpattern: /\\/\\/.*|\\/\\*[\\s\\S]*?(?:\\*\\/|$)/,\n\t\tgreedy: true\n\t},\n\t'number': /-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n\t'punctuation': /[{}[\\],]/,\n\t'operator': /:/,\n\t'boolean': /\\b(?:false|true)\\b/,\n\t'null': {\n\t\tpattern: /\\bnull\\b/,\n\t\talias: 'keyword'\n\t}\n};\n\nPrism.languages.webmanifest = Prism.languages.json;\n","(function (Prism) {\n\n\tvar string = /(?:\"(?:\\\\(?:\\r\\n|[\\s\\S])|[^\"\\\\\\r\\n])*\"|'(?:\\\\(?:\\r\\n|[\\s\\S])|[^'\\\\\\r\\n])*')/;\n\n\tPrism.languages.css = {\n\t\t'comment': /\\/\\*[\\s\\S]*?\\*\\//,\n\t\t'atrule': {\n\t\t\tpattern: RegExp('@[\\\\w-](?:' + /[^;{\\s\"']|\\s+(?!\\s)/.source + '|' + string.source + ')*?' + /(?:;|(?=\\s*\\{))/.source),\n\t\t\tinside: {\n\t\t\t\t'rule': /^@[\\w-]+/,\n\t\t\t\t'selector-function-argument': {\n\t\t\t\t\tpattern: /(\\bselector\\s*\\(\\s*(?![\\s)]))(?:[^()\\s]|\\s+(?![\\s)])|\\((?:[^()]|\\([^()]*\\))*\\))+(?=\\s*\\))/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\talias: 'selector'\n\t\t\t\t},\n\t\t\t\t'keyword': {\n\t\t\t\t\tpattern: /(^|[^\\w-])(?:and|not|only|or)(?![\\w-])/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t\t// See rest below\n\t\t\t}\n\t\t},\n\t\t'url': {\n\t\t\t// https://drafts.csswg.org/css-values-3/#urls\n\t\t\tpattern: RegExp('\\\\burl\\\\((?:' + string.source + '|' + /(?:[^\\\\\\r\\n()\"']|\\\\[\\s\\S])*/.source + ')\\\\)', 'i'),\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'function': /^url/i,\n\t\t\t\t'punctuation': /^\\(|\\)$/,\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: RegExp('^' + string.source + '$'),\n\t\t\t\t\talias: 'url'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'selector': {\n\t\t\tpattern: RegExp('(^|[{}\\\\s])[^{}\\\\s](?:[^{};\"\\'\\\\s]|\\\\s+(?![\\\\s{])|' + string.source + ')*(?=\\\\s*\\\\{)'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'string': {\n\t\t\tpattern: string,\n\t\t\tgreedy: true\n\t\t},\n\t\t'property': {\n\t\t\tpattern: /(^|[^-\\w\\xA0-\\uFFFF])(?!\\s)[-_a-z\\xA0-\\uFFFF](?:(?!\\s)[-\\w\\xA0-\\uFFFF])*(?=\\s*:)/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'important': /!important\\b/i,\n\t\t'function': {\n\t\t\tpattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\\()/i,\n\t\t\tlookbehind: true\n\t\t},\n\t\t'punctuation': /[(){};:,]/\n\t};\n\n\tPrism.languages.css['atrule'].inside.rest = Prism.languages.css;\n\n\tvar markup = Prism.languages.markup;\n\tif (markup) {\n\t\tmarkup.tag.addInlined('style', 'css');\n\t\tmarkup.tag.addAttribute('style', 'css');\n\t}\n\n}(Prism));\n","(function (Prism) {\n\n\t// https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property\n\t// https://yaml.org/spec/1.2/spec.html#c-ns-alias-node\n\tvar anchorOrAlias = /[*&][^\\s[\\]{},]+/;\n\t// https://yaml.org/spec/1.2/spec.html#c-ns-tag-property\n\tvar tag = /!(?:<[\\w\\-%#;/?:@&=+$,.!~*'()[\\]]+>|(?:[a-zA-Z\\d-]*!)?[\\w\\-%#;/?:@&=+$.~*'()]+)?/;\n\t// https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c)\n\tvar properties = '(?:' + tag.source + '(?:[ \\t]+' + anchorOrAlias.source + ')?|'\n\t\t+ anchorOrAlias.source + '(?:[ \\t]+' + tag.source + ')?)';\n\t// https://yaml.org/spec/1.2/spec.html#ns-plain(n,c)\n\t// This is a simplified version that doesn't support \"#\" and multiline keys\n\t// All these long scarry character classes are simplified versions of YAML's characters\n\tvar plainKey = /(?:[^\\s\\x00-\\x08\\x0e-\\x1f!\"#%&'*,\\-:>?@[\\]`{|}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]|[?:-]<PLAIN>)(?:[ \\t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source\n\t\t.replace(/<PLAIN>/g, function () { return /[^\\s\\x00-\\x08\\x0e-\\x1f,[\\]{}\\x7f-\\x84\\x86-\\x9f\\ud800-\\udfff\\ufffe\\uffff]/.source; });\n\tvar string = /\"(?:[^\"\\\\\\r\\n]|\\\\.)*\"|'(?:[^'\\\\\\r\\n]|\\\\.)*'/.source;\n\n\t/**\n\t *\n\t * @param {string} value\n\t * @param {string} [flags]\n\t * @returns {RegExp}\n\t */\n\tfunction createValuePattern(value, flags) {\n\t\tflags = (flags || '').replace(/m/g, '') + 'm'; // add m flag\n\t\tvar pattern = /([:\\-,[{]\\s*(?:\\s<<prop>>[ \\t]+)?)(?:<<value>>)(?=[ \\t]*(?:$|,|\\]|\\}|(?:[\\r\\n]\\s*)?#))/.source\n\t\t\t.replace(/<<prop>>/g, function () { return properties; }).replace(/<<value>>/g, function () { return value; });\n\t\treturn RegExp(pattern, flags);\n\t}\n\n\tPrism.languages.yaml = {\n\t\t'scalar': {\n\t\t\tpattern: RegExp(/([\\-:]\\s*(?:\\s<<prop>>[ \\t]+)?[|>])[ \\t]*(?:((?:\\r?\\n|\\r)[ \\t]+)\\S[^\\r\\n]*(?:\\2[^\\r\\n]+)*)/.source\n\t\t\t\t.replace(/<<prop>>/g, function () { return properties; })),\n\t\t\tlookbehind: true,\n\t\t\talias: 'string'\n\t\t},\n\t\t'comment': /#.*/,\n\t\t'key': {\n\t\t\tpattern: RegExp(/((?:^|[:\\-,[{\\r\\n?])[ \\t]*(?:<<prop>>[ \\t]+)?)<<key>>(?=\\s*:\\s)/.source\n\t\t\t\t.replace(/<<prop>>/g, function () { return properties; })\n\t\t\t\t.replace(/<<key>>/g, function () { return '(?:' + plainKey + '|' + string + ')'; })),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: 'atrule'\n\t\t},\n\t\t'directive': {\n\t\t\tpattern: /(^[ \\t]*)%.+/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'important'\n\t\t},\n\t\t'datetime': {\n\t\t\tpattern: createValuePattern(/\\d{4}-\\d\\d?-\\d\\d?(?:[tT]|[ \\t]+)\\d\\d?:\\d{2}:\\d{2}(?:\\.\\d*)?(?:[ \\t]*(?:Z|[-+]\\d\\d?(?::\\d{2})?))?|\\d{4}-\\d{2}-\\d{2}|\\d\\d?:\\d{2}(?::\\d{2}(?:\\.\\d*)?)?/.source),\n\t\t\tlookbehind: true,\n\t\t\talias: 'number'\n\t\t},\n\t\t'boolean': {\n\t\t\tpattern: createValuePattern(/false|true/.source, 'i'),\n\t\t\tlookbehind: true,\n\t\t\talias: 'important'\n\t\t},\n\t\t'null': {\n\t\t\tpattern: createValuePattern(/null|~/.source, 'i'),\n\t\t\tlookbehind: true,\n\t\t\talias: 'important'\n\t\t},\n\t\t'string': {\n\t\t\tpattern: createValuePattern(string),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true\n\t\t},\n\t\t'number': {\n\t\t\tpattern: createValuePattern(/[+-]?(?:0x[\\da-f]+|0o[0-7]+|(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?|\\.inf|\\.nan)/.source, 'i'),\n\t\t\tlookbehind: true\n\t\t},\n\t\t'tag': tag,\n\t\t'important': anchorOrAlias,\n\t\t'punctuation': /---|[:[\\]{}\\-,|>?]|\\.\\.\\./\n\t};\n\n\tPrism.languages.yml = Prism.languages.yaml;\n\n}(Prism));\n","Prism.languages.sql = {\n\t'comment': {\n\t\tpattern: /(^|[^\\\\])(?:\\/\\*[\\s\\S]*?\\*\\/|(?:--|\\/\\/|#).*)/,\n\t\tlookbehind: true\n\t},\n\t'variable': [\n\t\t{\n\t\t\tpattern: /@([\"'`])(?:\\\\[\\s\\S]|(?!\\1)[^\\\\])+\\1/,\n\t\t\tgreedy: true\n\t\t},\n\t\t/@[\\w.$]+/\n\t],\n\t'string': {\n\t\tpattern: /(^|[^@\\\\])(\"|')(?:\\\\[\\s\\S]|(?!\\2)[^\\\\]|\\2\\2)*\\2/,\n\t\tgreedy: true,\n\t\tlookbehind: true\n\t},\n\t'identifier': {\n\t\tpattern: /(^|[^@\\\\])`(?:\\\\[\\s\\S]|[^`\\\\]|``)*`/,\n\t\tgreedy: true,\n\t\tlookbehind: true,\n\t\tinside: {\n\t\t\t'punctuation': /^`|`$/\n\t\t}\n\t},\n\t'function': /\\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\\s*\\()/i, // Should we highlight user defined functions too?\n\t'keyword': /\\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\\b/i,\n\t'boolean': /\\b(?:FALSE|NULL|TRUE)\\b/i,\n\t'number': /\\b0x[\\da-f]+\\b|\\b\\d+(?:\\.\\d*)?|\\B\\.\\d+\\b/i,\n\t'operator': /[-+*\\/=%^~]|&&?|\\|\\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\\b/i,\n\t'punctuation': /[;[\\]()`,.]/\n};\n","(function (Prism) {\n\n\t// Allow only one line break\n\tvar inner = /(?:\\\\.|[^\\\\\\n\\r]|(?:\\n|\\r\\n?)(?![\\r\\n]))/.source;\n\n\t/**\n\t * This function is intended for the creation of the bold or italic pattern.\n\t *\n\t * This also adds a lookbehind group to the given pattern to ensure that the pattern is not backslash-escaped.\n\t *\n\t * _Note:_ Keep in mind that this adds a capturing group.\n\t *\n\t * @param {string} pattern\n\t * @returns {RegExp}\n\t */\n\tfunction createInline(pattern) {\n\t\tpattern = pattern.replace(/<inner>/g, function () { return inner; });\n\t\treturn RegExp(/((?:^|[^\\\\])(?:\\\\{2})*)/.source + '(?:' + pattern + ')');\n\t}\n\n\n\tvar tableCell = /(?:\\\\.|``(?:[^`\\r\\n]|`(?!`))+``|`[^`\\r\\n]+`|[^\\\\|\\r\\n`])+/.source;\n\tvar tableRow = /\\|?__(?:\\|__)+\\|?(?:(?:\\n|\\r\\n?)|(?![\\s\\S]))/.source.replace(/__/g, function () { return tableCell; });\n\tvar tableLine = /\\|?[ \\t]*:?-{3,}:?[ \\t]*(?:\\|[ \\t]*:?-{3,}:?[ \\t]*)+\\|?(?:\\n|\\r\\n?)/.source;\n\n\n\tPrism.languages.markdown = Prism.languages.extend('markup', {});\n\tPrism.languages.insertBefore('markdown', 'prolog', {\n\t\t'front-matter-block': {\n\t\t\tpattern: /(^(?:\\s*[\\r\\n])?)---(?!.)[\\s\\S]*?[\\r\\n]---(?!.)/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'punctuation': /^---|---$/,\n\t\t\t\t'front-matter': {\n\t\t\t\t\tpattern: /\\S+(?:\\s+\\S+)*/,\n\t\t\t\t\talias: ['yaml', 'language-yaml'],\n\t\t\t\t\tinside: Prism.languages.yaml\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'blockquote': {\n\t\t\t// > ...\n\t\t\tpattern: /^>(?:[\\t ]*>)*/m,\n\t\t\talias: 'punctuation'\n\t\t},\n\t\t'table': {\n\t\t\tpattern: RegExp('^' + tableRow + tableLine + '(?:' + tableRow + ')*', 'm'),\n\t\t\tinside: {\n\t\t\t\t'table-data-rows': {\n\t\t\t\t\tpattern: RegExp('^(' + tableRow + tableLine + ')(?:' + tableRow + ')*$'),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'table-data': {\n\t\t\t\t\t\t\tpattern: RegExp(tableCell),\n\t\t\t\t\t\t\tinside: Prism.languages.markdown\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /\\|/\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'table-line': {\n\t\t\t\t\tpattern: RegExp('^(' + tableRow + ')' + tableLine + '$'),\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'punctuation': /\\||:?-{3,}:?/\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'table-header-row': {\n\t\t\t\t\tpattern: RegExp('^' + tableRow + '$'),\n\t\t\t\t\tinside: {\n\t\t\t\t\t\t'table-header': {\n\t\t\t\t\t\t\tpattern: RegExp(tableCell),\n\t\t\t\t\t\t\talias: 'important',\n\t\t\t\t\t\t\tinside: Prism.languages.markdown\n\t\t\t\t\t\t},\n\t\t\t\t\t\t'punctuation': /\\|/\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t'code': [\n\t\t\t{\n\t\t\t\t// Prefixed by 4 spaces or 1 tab and preceded by an empty line\n\t\t\t\tpattern: /((?:^|\\n)[ \\t]*\\n|(?:^|\\r\\n?)[ \\t]*\\r\\n?)(?: {4}|\\t).+(?:(?:\\n|\\r\\n?)(?: {4}|\\t).+)*/,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'keyword'\n\t\t\t},\n\t\t\t{\n\t\t\t\t// ```optional language\n\t\t\t\t// code block\n\t\t\t\t// ```\n\t\t\t\tpattern: /^```[\\s\\S]*?^```$/m,\n\t\t\t\tgreedy: true,\n\t\t\t\tinside: {\n\t\t\t\t\t'code-block': {\n\t\t\t\t\t\tpattern: /^(```.*(?:\\n|\\r\\n?))[\\s\\S]+?(?=(?:\\n|\\r\\n?)^```$)/m,\n\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t},\n\t\t\t\t\t'code-language': {\n\t\t\t\t\t\tpattern: /^(```).+/,\n\t\t\t\t\t\tlookbehind: true\n\t\t\t\t\t},\n\t\t\t\t\t'punctuation': /```/\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t'title': [\n\t\t\t{\n\t\t\t\t// title 1\n\t\t\t\t// =======\n\n\t\t\t\t// title 2\n\t\t\t\t// -------\n\t\t\t\tpattern: /\\S.*(?:\\n|\\r\\n?)(?:==+|--+)(?=[ \\t]*$)/m,\n\t\t\t\talias: 'important',\n\t\t\t\tinside: {\n\t\t\t\t\tpunctuation: /==+$|--+$/\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t// # title 1\n\t\t\t\t// ###### title 6\n\t\t\t\tpattern: /(^\\s*)#.+/m,\n\t\t\t\tlookbehind: true,\n\t\t\t\talias: 'important',\n\t\t\t\tinside: {\n\t\t\t\t\tpunctuation: /^#+|#+$/\n\t\t\t\t}\n\t\t\t}\n\t\t],\n\t\t'hr': {\n\t\t\t// ***\n\t\t\t// ---\n\t\t\t// * * *\n\t\t\t// -----------\n\t\t\tpattern: /(^\\s*)([*-])(?:[\\t ]*\\2){2,}(?=\\s*$)/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'punctuation'\n\t\t},\n\t\t'list': {\n\t\t\t// * item\n\t\t\t// + item\n\t\t\t// - item\n\t\t\t// 1. item\n\t\t\tpattern: /(^\\s*)(?:[*+-]|\\d+\\.)(?=[\\t ].)/m,\n\t\t\tlookbehind: true,\n\t\t\talias: 'punctuation'\n\t\t},\n\t\t'url-reference': {\n\t\t\t// [id]: http://example.com \"Optional title\"\n\t\t\t// [id]: http://example.com 'Optional title'\n\t\t\t// [id]: http://example.com (Optional title)\n\t\t\t// [id]: <http://example.com> \"Optional title\"\n\t\t\tpattern: /!?\\[[^\\]]+\\]:[\\t ]+(?:\\S+|<(?:\\\\.|[^>\\\\])+>)(?:[\\t ]+(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\)))?/,\n\t\t\tinside: {\n\t\t\t\t'variable': {\n\t\t\t\t\tpattern: /^(!?\\[)[^\\]]+/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t},\n\t\t\t\t'string': /(?:\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*'|\\((?:\\\\.|[^)\\\\])*\\))$/,\n\t\t\t\t'punctuation': /^[\\[\\]!:]|[<>]/\n\t\t\t},\n\t\t\talias: 'url'\n\t\t},\n\t\t'bold': {\n\t\t\t// **strong**\n\t\t\t// __strong__\n\n\t\t\t// allow one nested instance of italic text using the same delimiter\n\t\t\tpattern: createInline(/\\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\\b|\\*\\*(?:(?!\\*)<inner>|\\*(?:(?!\\*)<inner>)+\\*)+\\*\\*/.source),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'content': {\n\t\t\t\t\tpattern: /(^..)[\\s\\S]+(?=..$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {} // see below\n\t\t\t\t},\n\t\t\t\t'punctuation': /\\*\\*|__/\n\t\t\t}\n\t\t},\n\t\t'italic': {\n\t\t\t// *em*\n\t\t\t// _em_\n\n\t\t\t// allow one nested instance of bold text using the same delimiter\n\t\t\tpattern: createInline(/\\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\\b|\\*(?:(?!\\*)<inner>|\\*\\*(?:(?!\\*)<inner>)+\\*\\*)+\\*/.source),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'content': {\n\t\t\t\t\tpattern: /(^.)[\\s\\S]+(?=.$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {} // see below\n\t\t\t\t},\n\t\t\t\t'punctuation': /[*_]/\n\t\t\t}\n\t\t},\n\t\t'strike': {\n\t\t\t// ~~strike through~~\n\t\t\t// ~strike~\n\t\t\t// eslint-disable-next-line regexp/strict\n\t\t\tpattern: createInline(/(~~?)(?:(?!~)<inner>)+\\2/.source),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'content': {\n\t\t\t\t\tpattern: /(^~~?)[\\s\\S]+(?=\\1$)/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {} // see below\n\t\t\t\t},\n\t\t\t\t'punctuation': /~~?/\n\t\t\t}\n\t\t},\n\t\t'code-snippet': {\n\t\t\t// `code`\n\t\t\t// ``code``\n\t\t\tpattern: /(^|[^\\\\`])(?:``[^`\\r\\n]+(?:`[^`\\r\\n]+)*``(?!`)|`[^`\\r\\n]+`(?!`))/,\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\talias: ['code', 'keyword']\n\t\t},\n\t\t'url': {\n\t\t\t// [example](http://example.com \"Optional title\")\n\t\t\t// [example][id]\n\t\t\t// [example] [id]\n\t\t\tpattern: createInline(/!?\\[(?:(?!\\])<inner>)+\\](?:\\([^\\s)]+(?:[\\t ]+\"(?:\\\\.|[^\"\\\\])*\")?\\)|[ \\t]?\\[(?:(?!\\])<inner>)+\\])/.source),\n\t\t\tlookbehind: true,\n\t\t\tgreedy: true,\n\t\t\tinside: {\n\t\t\t\t'operator': /^!/,\n\t\t\t\t'content': {\n\t\t\t\t\tpattern: /(^\\[)[^\\]]+(?=\\])/,\n\t\t\t\t\tlookbehind: true,\n\t\t\t\t\tinside: {} // see below\n\t\t\t\t},\n\t\t\t\t'variable': {\n\t\t\t\t\tpattern: /(^\\][ \\t]?\\[)[^\\]]+(?=\\]$)/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t},\n\t\t\t\t'url': {\n\t\t\t\t\tpattern: /(^\\]\\()[^\\s)]+/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t},\n\t\t\t\t'string': {\n\t\t\t\t\tpattern: /(^[ \\t]+)\"(?:\\\\.|[^\"\\\\])*\"(?=\\)$)/,\n\t\t\t\t\tlookbehind: true\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\t['url', 'bold', 'italic', 'strike'].forEach(function (token) {\n\t\t['url', 'bold', 'italic', 'strike', 'code-snippet'].forEach(function (inside) {\n\t\t\tif (token !== inside) {\n\t\t\t\tPrism.languages.markdown[token].inside.content.inside[inside] = Prism.languages.markdown[inside];\n\t\t\t}\n\t\t});\n\t});\n\n\tPrism.hooks.add('after-tokenize', function (env) {\n\t\tif (env.language !== 'markdown' && env.language !== 'md') {\n\t\t\treturn;\n\t\t}\n\n\t\tfunction walkTokens(tokens) {\n\t\t\tif (!tokens || typeof tokens === 'string') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (var i = 0, l = tokens.length; i < l; i++) {\n\t\t\t\tvar token = tokens[i];\n\n\t\t\t\tif (token.type !== 'code') {\n\t\t\t\t\twalkTokens(token.content);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t/*\n\t\t\t\t * Add the correct `language-xxxx` class to this code block. Keep in mind that the `code-language` token\n\t\t\t\t * is optional. But the grammar is defined so that there is only one case we have to handle:\n\t\t\t\t *\n\t\t\t\t * token.content = [\n\t\t\t\t *     <span class=\"punctuation\">```</span>,\n\t\t\t\t *     <span class=\"code-language\">xxxx</span>,\n\t\t\t\t *     '\\n', // exactly one new lines (\\r or \\n or \\r\\n)\n\t\t\t\t *     <span class=\"code-block\">...</span>,\n\t\t\t\t *     '\\n', // exactly one new lines again\n\t\t\t\t *     <span class=\"punctuation\">```</span>\n\t\t\t\t * ];\n\t\t\t\t */\n\n\t\t\t\tvar codeLang = token.content[1];\n\t\t\t\tvar codeBlock = token.content[3];\n\n\t\t\t\tif (codeLang && codeBlock &&\n\t\t\t\t\tcodeLang.type === 'code-language' && codeBlock.type === 'code-block' &&\n\t\t\t\t\ttypeof codeLang.content === 'string') {\n\n\t\t\t\t\t// this might be a language that Prism does not support\n\n\t\t\t\t\t// do some replacements to support C++, C#, and F#\n\t\t\t\t\tvar lang = codeLang.content.replace(/\\b#/g, 'sharp').replace(/\\b\\+\\+/g, 'pp');\n\t\t\t\t\t// only use the first word\n\t\t\t\t\tlang = (/[a-z][\\w-]*/i.exec(lang) || [''])[0].toLowerCase();\n\t\t\t\t\tvar alias = 'language-' + lang;\n\n\t\t\t\t\t// add alias\n\t\t\t\t\tif (!codeBlock.alias) {\n\t\t\t\t\t\tcodeBlock.alias = [alias];\n\t\t\t\t\t} else if (typeof codeBlock.alias === 'string') {\n\t\t\t\t\t\tcodeBlock.alias = [codeBlock.alias, alias];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcodeBlock.alias.push(alias);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twalkTokens(env.tokens);\n\t});\n\n\tPrism.hooks.add('wrap', function (env) {\n\t\tif (env.type !== 'code-block') {\n\t\t\treturn;\n\t\t}\n\n\t\tvar codeLang = '';\n\t\tfor (var i = 0, l = env.classes.length; i < l; i++) {\n\t\t\tvar cls = env.classes[i];\n\t\t\tvar match = /language-(.+)/.exec(cls);\n\t\t\tif (match) {\n\t\t\t\tcodeLang = match[1];\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tvar grammar = Prism.languages[codeLang];\n\n\t\tif (!grammar) {\n\t\t\tif (codeLang && codeLang !== 'none' && Prism.plugins.autoloader) {\n\t\t\t\tvar id = 'md-' + new Date().valueOf() + '-' + Math.floor(Math.random() * 1e16);\n\t\t\t\tenv.attributes['id'] = id;\n\n\t\t\t\tPrism.plugins.autoloader.loadLanguages(codeLang, function () {\n\t\t\t\t\tvar ele = document.getElementById(id);\n\t\t\t\t\tif (ele) {\n\t\t\t\t\t\tele.innerHTML = Prism.highlight(ele.textContent, Prism.languages[codeLang], codeLang);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tenv.content = Prism.highlight(textContent(env.content), grammar, codeLang);\n\t\t}\n\t});\n\n\tvar tagPattern = RegExp(Prism.languages.markup.tag.pattern.source, 'gi');\n\n\t/**\n\t * A list of known entity names.\n\t *\n\t * This will always be incomplete to save space. The current list is the one used by lowdash's unescape function.\n\t *\n\t * @see {@link https://github.com/lodash/lodash/blob/2da024c3b4f9947a48517639de7560457cd4ec6c/unescape.js#L2}\n\t */\n\tvar KNOWN_ENTITY_NAMES = {\n\t\t'amp': '&',\n\t\t'lt': '<',\n\t\t'gt': '>',\n\t\t'quot': '\"',\n\t};\n\n\t// IE 11 doesn't support `String.fromCodePoint`\n\tvar fromCodePoint = String.fromCodePoint || String.fromCharCode;\n\n\t/**\n\t * Returns the text content of a given HTML source code string.\n\t *\n\t * @param {string} html\n\t * @returns {string}\n\t */\n\tfunction textContent(html) {\n\t\t// remove all tags\n\t\tvar text = html.replace(tagPattern, '');\n\n\t\t// decode known entities\n\t\ttext = text.replace(/&(\\w{1,8}|#x?[\\da-f]{1,8});/gi, function (m, code) {\n\t\t\tcode = code.toLowerCase();\n\n\t\t\tif (code[0] === '#') {\n\t\t\t\tvar value;\n\t\t\t\tif (code[1] === 'x') {\n\t\t\t\t\tvalue = parseInt(code.slice(2), 16);\n\t\t\t\t} else {\n\t\t\t\t\tvalue = Number(code.slice(1));\n\t\t\t\t}\n\n\t\t\t\treturn fromCodePoint(value);\n\t\t\t} else {\n\t\t\t\tvar known = KNOWN_ENTITY_NAMES[code];\n\t\t\t\tif (known) {\n\t\t\t\t\treturn known;\n\t\t\t\t}\n\n\t\t\t\t// unable to decode\n\t\t\t\treturn m;\n\t\t\t}\n\t\t});\n\n\t\treturn text;\n\t}\n\n\tPrism.languages.md = Prism.languages.markdown;\n\n}(Prism));\n","/**\n * marked v9.1.6 - a markdown parser\n * Copyright (c) 2011-2023, Christopher Jeffrey. (MIT Licensed)\n * https://github.com/markedjs/marked\n */\n\n/**\n * DO NOT EDIT THIS FILE\n * The code in this file is generated from files in ./src/\n */\n\n/**\n * Gets the original marked default options.\n */\nfunction _getDefaults() {\n    return {\n        async: false,\n        breaks: false,\n        extensions: null,\n        gfm: true,\n        hooks: null,\n        pedantic: false,\n        renderer: null,\n        silent: false,\n        tokenizer: null,\n        walkTokens: null\n    };\n}\nlet _defaults = _getDefaults();\nfunction changeDefaults(newDefaults) {\n    _defaults = newDefaults;\n}\n\n/**\n * Helpers\n */\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\nconst escapeReplacements = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n};\nconst getEscapeReplacement = (ch) => escapeReplacements[ch];\nfunction escape(html, encode) {\n    if (encode) {\n        if (escapeTest.test(html)) {\n            return html.replace(escapeReplace, getEscapeReplacement);\n        }\n    }\n    else {\n        if (escapeTestNoEncode.test(html)) {\n            return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n        }\n    }\n    return html;\n}\nconst unescapeTest = /&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;\nfunction unescape(html) {\n    // explicitly match decimal, hex, and named HTML entities\n    return html.replace(unescapeTest, (_, n) => {\n        n = n.toLowerCase();\n        if (n === 'colon')\n            return ':';\n        if (n.charAt(0) === '#') {\n            return n.charAt(1) === 'x'\n                ? String.fromCharCode(parseInt(n.substring(2), 16))\n                : String.fromCharCode(+n.substring(1));\n        }\n        return '';\n    });\n}\nconst caret = /(^|[^\\[])\\^/g;\nfunction edit(regex, opt) {\n    regex = typeof regex === 'string' ? regex : regex.source;\n    opt = opt || '';\n    const obj = {\n        replace: (name, val) => {\n            val = typeof val === 'object' && 'source' in val ? val.source : val;\n            val = val.replace(caret, '$1');\n            regex = regex.replace(name, val);\n            return obj;\n        },\n        getRegex: () => {\n            return new RegExp(regex, opt);\n        }\n    };\n    return obj;\n}\nfunction cleanUrl(href) {\n    try {\n        href = encodeURI(href).replace(/%25/g, '%');\n    }\n    catch (e) {\n        return null;\n    }\n    return href;\n}\nconst noopTest = { exec: () => null };\nfunction splitCells(tableRow, count) {\n    // ensure that every cell-delimiting pipe has a space\n    // before it to distinguish it from an escaped pipe\n    const row = tableRow.replace(/\\|/g, (match, offset, str) => {\n        let escaped = false;\n        let curr = offset;\n        while (--curr >= 0 && str[curr] === '\\\\')\n            escaped = !escaped;\n        if (escaped) {\n            // odd number of slashes means | is escaped\n            // so we leave it alone\n            return '|';\n        }\n        else {\n            // add space before unescaped |\n            return ' |';\n        }\n    }), cells = row.split(/ \\|/);\n    let i = 0;\n    // First/last cell in a row cannot be empty if it has no leading/trailing pipe\n    if (!cells[0].trim()) {\n        cells.shift();\n    }\n    if (cells.length > 0 && !cells[cells.length - 1].trim()) {\n        cells.pop();\n    }\n    if (count) {\n        if (cells.length > count) {\n            cells.splice(count);\n        }\n        else {\n            while (cells.length < count)\n                cells.push('');\n        }\n    }\n    for (; i < cells.length; i++) {\n        // leading or trailing whitespace is ignored per the gfm spec\n        cells[i] = cells[i].trim().replace(/\\\\\\|/g, '|');\n    }\n    return cells;\n}\n/**\n * Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').\n * /c*$/ is vulnerable to REDOS.\n *\n * @param str\n * @param c\n * @param invert Remove suffix of non-c chars instead. Default falsey.\n */\nfunction rtrim(str, c, invert) {\n    const l = str.length;\n    if (l === 0) {\n        return '';\n    }\n    // Length of suffix matching the invert condition.\n    let suffLen = 0;\n    // Step left until we fail to match the invert condition.\n    while (suffLen < l) {\n        const currChar = str.charAt(l - suffLen - 1);\n        if (currChar === c && !invert) {\n            suffLen++;\n        }\n        else if (currChar !== c && invert) {\n            suffLen++;\n        }\n        else {\n            break;\n        }\n    }\n    return str.slice(0, l - suffLen);\n}\nfunction findClosingBracket(str, b) {\n    if (str.indexOf(b[1]) === -1) {\n        return -1;\n    }\n    let level = 0;\n    for (let i = 0; i < str.length; i++) {\n        if (str[i] === '\\\\') {\n            i++;\n        }\n        else if (str[i] === b[0]) {\n            level++;\n        }\n        else if (str[i] === b[1]) {\n            level--;\n            if (level < 0) {\n                return i;\n            }\n        }\n    }\n    return -1;\n}\n\nfunction outputLink(cap, link, raw, lexer) {\n    const href = link.href;\n    const title = link.title ? escape(link.title) : null;\n    const text = cap[1].replace(/\\\\([\\[\\]])/g, '$1');\n    if (cap[0].charAt(0) !== '!') {\n        lexer.state.inLink = true;\n        const token = {\n            type: 'link',\n            raw,\n            href,\n            title,\n            text,\n            tokens: lexer.inlineTokens(text)\n        };\n        lexer.state.inLink = false;\n        return token;\n    }\n    return {\n        type: 'image',\n        raw,\n        href,\n        title,\n        text: escape(text)\n    };\n}\nfunction indentCodeCompensation(raw, text) {\n    const matchIndentToCode = raw.match(/^(\\s+)(?:```)/);\n    if (matchIndentToCode === null) {\n        return text;\n    }\n    const indentToCode = matchIndentToCode[1];\n    return text\n        .split('\\n')\n        .map(node => {\n        const matchIndentInNode = node.match(/^\\s+/);\n        if (matchIndentInNode === null) {\n            return node;\n        }\n        const [indentInNode] = matchIndentInNode;\n        if (indentInNode.length >= indentToCode.length) {\n            return node.slice(indentToCode.length);\n        }\n        return node;\n    })\n        .join('\\n');\n}\n/**\n * Tokenizer\n */\nclass _Tokenizer {\n    options;\n    // TODO: Fix this rules type\n    rules;\n    lexer;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    space(src) {\n        const cap = this.rules.block.newline.exec(src);\n        if (cap && cap[0].length > 0) {\n            return {\n                type: 'space',\n                raw: cap[0]\n            };\n        }\n    }\n    code(src) {\n        const cap = this.rules.block.code.exec(src);\n        if (cap) {\n            const text = cap[0].replace(/^ {1,4}/gm, '');\n            return {\n                type: 'code',\n                raw: cap[0],\n                codeBlockStyle: 'indented',\n                text: !this.options.pedantic\n                    ? rtrim(text, '\\n')\n                    : text\n            };\n        }\n    }\n    fences(src) {\n        const cap = this.rules.block.fences.exec(src);\n        if (cap) {\n            const raw = cap[0];\n            const text = indentCodeCompensation(raw, cap[3] || '');\n            return {\n                type: 'code',\n                raw,\n                lang: cap[2] ? cap[2].trim().replace(this.rules.inline._escapes, '$1') : cap[2],\n                text\n            };\n        }\n    }\n    heading(src) {\n        const cap = this.rules.block.heading.exec(src);\n        if (cap) {\n            let text = cap[2].trim();\n            // remove trailing #s\n            if (/#$/.test(text)) {\n                const trimmed = rtrim(text, '#');\n                if (this.options.pedantic) {\n                    text = trimmed.trim();\n                }\n                else if (!trimmed || / $/.test(trimmed)) {\n                    // CommonMark requires space before trailing #s\n                    text = trimmed.trim();\n                }\n            }\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[1].length,\n                text,\n                tokens: this.lexer.inline(text)\n            };\n        }\n    }\n    hr(src) {\n        const cap = this.rules.block.hr.exec(src);\n        if (cap) {\n            return {\n                type: 'hr',\n                raw: cap[0]\n            };\n        }\n    }\n    blockquote(src) {\n        const cap = this.rules.block.blockquote.exec(src);\n        if (cap) {\n            const text = rtrim(cap[0].replace(/^ *>[ \\t]?/gm, ''), '\\n');\n            const top = this.lexer.state.top;\n            this.lexer.state.top = true;\n            const tokens = this.lexer.blockTokens(text);\n            this.lexer.state.top = top;\n            return {\n                type: 'blockquote',\n                raw: cap[0],\n                tokens,\n                text\n            };\n        }\n    }\n    list(src) {\n        let cap = this.rules.block.list.exec(src);\n        if (cap) {\n            let bull = cap[1].trim();\n            const isordered = bull.length > 1;\n            const list = {\n                type: 'list',\n                raw: '',\n                ordered: isordered,\n                start: isordered ? +bull.slice(0, -1) : '',\n                loose: false,\n                items: []\n            };\n            bull = isordered ? `\\\\d{1,9}\\\\${bull.slice(-1)}` : `\\\\${bull}`;\n            if (this.options.pedantic) {\n                bull = isordered ? bull : '[*+-]';\n            }\n            // Get next list item\n            const itemRegex = new RegExp(`^( {0,3}${bull})((?:[\\t ][^\\\\n]*)?(?:\\\\n|$))`);\n            let raw = '';\n            let itemContents = '';\n            let endsWithBlankLine = false;\n            // Check if current bullet point can start a new List Item\n            while (src) {\n                let endEarly = false;\n                if (!(cap = itemRegex.exec(src))) {\n                    break;\n                }\n                if (this.rules.block.hr.test(src)) { // End list if bullet was actually HR (possibly move into itemRegex?)\n                    break;\n                }\n                raw = cap[0];\n                src = src.substring(raw.length);\n                let line = cap[2].split('\\n', 1)[0].replace(/^\\t+/, (t) => ' '.repeat(3 * t.length));\n                let nextLine = src.split('\\n', 1)[0];\n                let indent = 0;\n                if (this.options.pedantic) {\n                    indent = 2;\n                    itemContents = line.trimStart();\n                }\n                else {\n                    indent = cap[2].search(/[^ ]/); // Find first non-space char\n                    indent = indent > 4 ? 1 : indent; // Treat indented code blocks (> 4 spaces) as having only 1 indent\n                    itemContents = line.slice(indent);\n                    indent += cap[1].length;\n                }\n                let blankLine = false;\n                if (!line && /^ *$/.test(nextLine)) { // Items begin with at most one blank line\n                    raw += nextLine + '\\n';\n                    src = src.substring(nextLine.length + 1);\n                    endEarly = true;\n                }\n                if (!endEarly) {\n                    const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ \\t][^\\\\n]*)?(?:\\\\n|$))`);\n                    const hrRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)`);\n                    const fencesBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:\\`\\`\\`|~~~)`);\n                    const headingBeginRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}#`);\n                    // Check if following lines should be included in List Item\n                    while (src) {\n                        const rawLine = src.split('\\n', 1)[0];\n                        nextLine = rawLine;\n                        // Re-align to follow commonmark nesting rules\n                        if (this.options.pedantic) {\n                            nextLine = nextLine.replace(/^ {1,4}(?=( {4})*[^ ])/g, '  ');\n                        }\n                        // End list item if found code fences\n                        if (fencesBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new heading\n                        if (headingBeginRegex.test(nextLine)) {\n                            break;\n                        }\n                        // End list item if found start of new bullet\n                        if (nextBulletRegex.test(nextLine)) {\n                            break;\n                        }\n                        // Horizontal rule found\n                        if (hrRegex.test(src)) {\n                            break;\n                        }\n                        if (nextLine.search(/[^ ]/) >= indent || !nextLine.trim()) { // Dedent if possible\n                            itemContents += '\\n' + nextLine.slice(indent);\n                        }\n                        else {\n                            // not enough indentation\n                            if (blankLine) {\n                                break;\n                            }\n                            // paragraph continuation unless last line was a different block level element\n                            if (line.search(/[^ ]/) >= 4) { // indented code block\n                                break;\n                            }\n                            if (fencesBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (headingBeginRegex.test(line)) {\n                                break;\n                            }\n                            if (hrRegex.test(line)) {\n                                break;\n                            }\n                            itemContents += '\\n' + nextLine;\n                        }\n                        if (!blankLine && !nextLine.trim()) { // Check if current line is blank\n                            blankLine = true;\n                        }\n                        raw += rawLine + '\\n';\n                        src = src.substring(rawLine.length + 1);\n                        line = nextLine.slice(indent);\n                    }\n                }\n                if (!list.loose) {\n                    // If the previous item ended with a blank line, the list is loose\n                    if (endsWithBlankLine) {\n                        list.loose = true;\n                    }\n                    else if (/\\n *\\n *$/.test(raw)) {\n                        endsWithBlankLine = true;\n                    }\n                }\n                let istask = null;\n                let ischecked;\n                // Check for task list items\n                if (this.options.gfm) {\n                    istask = /^\\[[ xX]\\] /.exec(itemContents);\n                    if (istask) {\n                        ischecked = istask[0] !== '[ ] ';\n                        itemContents = itemContents.replace(/^\\[[ xX]\\] +/, '');\n                    }\n                }\n                list.items.push({\n                    type: 'list_item',\n                    raw,\n                    task: !!istask,\n                    checked: ischecked,\n                    loose: false,\n                    text: itemContents,\n                    tokens: []\n                });\n                list.raw += raw;\n            }\n            // Do not consume newlines at end of final item. Alternatively, make itemRegex *start* with any newlines to simplify/speed up endsWithBlankLine logic\n            list.items[list.items.length - 1].raw = raw.trimEnd();\n            list.items[list.items.length - 1].text = itemContents.trimEnd();\n            list.raw = list.raw.trimEnd();\n            // Item child tokens handled here at end because we needed to have the final item to trim it first\n            for (let i = 0; i < list.items.length; i++) {\n                this.lexer.state.top = false;\n                list.items[i].tokens = this.lexer.blockTokens(list.items[i].text, []);\n                if (!list.loose) {\n                    // Check if list should be loose\n                    const spacers = list.items[i].tokens.filter(t => t.type === 'space');\n                    const hasMultipleLineBreaks = spacers.length > 0 && spacers.some(t => /\\n.*\\n/.test(t.raw));\n                    list.loose = hasMultipleLineBreaks;\n                }\n            }\n            // Set all items to loose if list is loose\n            if (list.loose) {\n                for (let i = 0; i < list.items.length; i++) {\n                    list.items[i].loose = true;\n                }\n            }\n            return list;\n        }\n    }\n    html(src) {\n        const cap = this.rules.block.html.exec(src);\n        if (cap) {\n            const token = {\n                type: 'html',\n                block: true,\n                raw: cap[0],\n                pre: cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style',\n                text: cap[0]\n            };\n            return token;\n        }\n    }\n    def(src) {\n        const cap = this.rules.block.def.exec(src);\n        if (cap) {\n            const tag = cap[1].toLowerCase().replace(/\\s+/g, ' ');\n            const href = cap[2] ? cap[2].replace(/^<(.*)>$/, '$1').replace(this.rules.inline._escapes, '$1') : '';\n            const title = cap[3] ? cap[3].substring(1, cap[3].length - 1).replace(this.rules.inline._escapes, '$1') : cap[3];\n            return {\n                type: 'def',\n                tag,\n                raw: cap[0],\n                href,\n                title\n            };\n        }\n    }\n    table(src) {\n        const cap = this.rules.block.table.exec(src);\n        if (cap) {\n            if (!/[:|]/.test(cap[2])) {\n                // delimiter row must have a pipe (|) or colon (:) otherwise it is a setext heading\n                return;\n            }\n            const item = {\n                type: 'table',\n                raw: cap[0],\n                header: splitCells(cap[1]).map(c => {\n                    return { text: c, tokens: [] };\n                }),\n                align: cap[2].replace(/^\\||\\| *$/g, '').split('|'),\n                rows: cap[3] && cap[3].trim() ? cap[3].replace(/\\n[ \\t]*$/, '').split('\\n') : []\n            };\n            if (item.header.length === item.align.length) {\n                let l = item.align.length;\n                let i, j, k, row;\n                for (i = 0; i < l; i++) {\n                    const align = item.align[i];\n                    if (align) {\n                        if (/^ *-+: *$/.test(align)) {\n                            item.align[i] = 'right';\n                        }\n                        else if (/^ *:-+: *$/.test(align)) {\n                            item.align[i] = 'center';\n                        }\n                        else if (/^ *:-+ *$/.test(align)) {\n                            item.align[i] = 'left';\n                        }\n                        else {\n                            item.align[i] = null;\n                        }\n                    }\n                }\n                l = item.rows.length;\n                for (i = 0; i < l; i++) {\n                    item.rows[i] = splitCells(item.rows[i], item.header.length).map(c => {\n                        return { text: c, tokens: [] };\n                    });\n                }\n                // parse child tokens inside headers and cells\n                // header child tokens\n                l = item.header.length;\n                for (j = 0; j < l; j++) {\n                    item.header[j].tokens = this.lexer.inline(item.header[j].text);\n                }\n                // cell child tokens\n                l = item.rows.length;\n                for (j = 0; j < l; j++) {\n                    row = item.rows[j];\n                    for (k = 0; k < row.length; k++) {\n                        row[k].tokens = this.lexer.inline(row[k].text);\n                    }\n                }\n                return item;\n            }\n        }\n    }\n    lheading(src) {\n        const cap = this.rules.block.lheading.exec(src);\n        if (cap) {\n            return {\n                type: 'heading',\n                raw: cap[0],\n                depth: cap[2].charAt(0) === '=' ? 1 : 2,\n                text: cap[1],\n                tokens: this.lexer.inline(cap[1])\n            };\n        }\n    }\n    paragraph(src) {\n        const cap = this.rules.block.paragraph.exec(src);\n        if (cap) {\n            const text = cap[1].charAt(cap[1].length - 1) === '\\n'\n                ? cap[1].slice(0, -1)\n                : cap[1];\n            return {\n                type: 'paragraph',\n                raw: cap[0],\n                text,\n                tokens: this.lexer.inline(text)\n            };\n        }\n    }\n    text(src) {\n        const cap = this.rules.block.text.exec(src);\n        if (cap) {\n            return {\n                type: 'text',\n                raw: cap[0],\n                text: cap[0],\n                tokens: this.lexer.inline(cap[0])\n            };\n        }\n    }\n    escape(src) {\n        const cap = this.rules.inline.escape.exec(src);\n        if (cap) {\n            return {\n                type: 'escape',\n                raw: cap[0],\n                text: escape(cap[1])\n            };\n        }\n    }\n    tag(src) {\n        const cap = this.rules.inline.tag.exec(src);\n        if (cap) {\n            if (!this.lexer.state.inLink && /^<a /i.test(cap[0])) {\n                this.lexer.state.inLink = true;\n            }\n            else if (this.lexer.state.inLink && /^<\\/a>/i.test(cap[0])) {\n                this.lexer.state.inLink = false;\n            }\n            if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = true;\n            }\n            else if (this.lexer.state.inRawBlock && /^<\\/(pre|code|kbd|script)(\\s|>)/i.test(cap[0])) {\n                this.lexer.state.inRawBlock = false;\n            }\n            return {\n                type: 'html',\n                raw: cap[0],\n                inLink: this.lexer.state.inLink,\n                inRawBlock: this.lexer.state.inRawBlock,\n                block: false,\n                text: cap[0]\n            };\n        }\n    }\n    link(src) {\n        const cap = this.rules.inline.link.exec(src);\n        if (cap) {\n            const trimmedUrl = cap[2].trim();\n            if (!this.options.pedantic && /^</.test(trimmedUrl)) {\n                // commonmark requires matching angle brackets\n                if (!(/>$/.test(trimmedUrl))) {\n                    return;\n                }\n                // ending angle bracket cannot be escaped\n                const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), '\\\\');\n                if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) {\n                    return;\n                }\n            }\n            else {\n                // find closing parenthesis\n                const lastParenIndex = findClosingBracket(cap[2], '()');\n                if (lastParenIndex > -1) {\n                    const start = cap[0].indexOf('!') === 0 ? 5 : 4;\n                    const linkLen = start + cap[1].length + lastParenIndex;\n                    cap[2] = cap[2].substring(0, lastParenIndex);\n                    cap[0] = cap[0].substring(0, linkLen).trim();\n                    cap[3] = '';\n                }\n            }\n            let href = cap[2];\n            let title = '';\n            if (this.options.pedantic) {\n                // split pedantic href and title\n                const link = /^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(href);\n                if (link) {\n                    href = link[1];\n                    title = link[3];\n                }\n            }\n            else {\n                title = cap[3] ? cap[3].slice(1, -1) : '';\n            }\n            href = href.trim();\n            if (/^</.test(href)) {\n                if (this.options.pedantic && !(/>$/.test(trimmedUrl))) {\n                    // pedantic allows starting angle bracket without ending angle bracket\n                    href = href.slice(1);\n                }\n                else {\n                    href = href.slice(1, -1);\n                }\n            }\n            return outputLink(cap, {\n                href: href ? href.replace(this.rules.inline._escapes, '$1') : href,\n                title: title ? title.replace(this.rules.inline._escapes, '$1') : title\n            }, cap[0], this.lexer);\n        }\n    }\n    reflink(src, links) {\n        let cap;\n        if ((cap = this.rules.inline.reflink.exec(src))\n            || (cap = this.rules.inline.nolink.exec(src))) {\n            let link = (cap[2] || cap[1]).replace(/\\s+/g, ' ');\n            link = links[link.toLowerCase()];\n            if (!link) {\n                const text = cap[0].charAt(0);\n                return {\n                    type: 'text',\n                    raw: text,\n                    text\n                };\n            }\n            return outputLink(cap, link, cap[0], this.lexer);\n        }\n    }\n    emStrong(src, maskedSrc, prevChar = '') {\n        let match = this.rules.inline.emStrong.lDelim.exec(src);\n        if (!match)\n            return;\n        // _ can't be between two alphanumerics. \\p{L}\\p{N} includes non-english alphabet/numbers as well\n        if (match[3] && prevChar.match(/[\\p{L}\\p{N}]/u))\n            return;\n        const nextChar = match[1] || match[2] || '';\n        if (!nextChar || !prevChar || this.rules.inline.punctuation.exec(prevChar)) {\n            // unicode Regex counts emoji as 1 char; spread into array for proper count (used multiple times below)\n            const lLength = [...match[0]].length - 1;\n            let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0;\n            const endReg = match[0][0] === '*' ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd;\n            endReg.lastIndex = 0;\n            // Clip maskedSrc to same section of string as src (move to lexer?)\n            maskedSrc = maskedSrc.slice(-1 * src.length + lLength);\n            while ((match = endReg.exec(maskedSrc)) != null) {\n                rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6];\n                if (!rDelim)\n                    continue; // skip single * in __abc*abc__\n                rLength = [...rDelim].length;\n                if (match[3] || match[4]) { // found another Left Delim\n                    delimTotal += rLength;\n                    continue;\n                }\n                else if (match[5] || match[6]) { // either Left or Right Delim\n                    if (lLength % 3 && !((lLength + rLength) % 3)) {\n                        midDelimTotal += rLength;\n                        continue; // CommonMark Emphasis Rules 9-10\n                    }\n                }\n                delimTotal -= rLength;\n                if (delimTotal > 0)\n                    continue; // Haven't found enough closing delimiters\n                // Remove extra characters. *a*** -> *a*\n                rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal);\n                // char length can be >1 for unicode characters;\n                const lastCharLength = [...match[0]][0].length;\n                const raw = src.slice(0, lLength + match.index + lastCharLength + rLength);\n                // Create `em` if smallest delimiter has odd char count. *a***\n                if (Math.min(lLength, rLength) % 2) {\n                    const text = raw.slice(1, -1);\n                    return {\n                        type: 'em',\n                        raw,\n                        text,\n                        tokens: this.lexer.inlineTokens(text)\n                    };\n                }\n                // Create 'strong' if smallest delimiter has even char count. **a***\n                const text = raw.slice(2, -2);\n                return {\n                    type: 'strong',\n                    raw,\n                    text,\n                    tokens: this.lexer.inlineTokens(text)\n                };\n            }\n        }\n    }\n    codespan(src) {\n        const cap = this.rules.inline.code.exec(src);\n        if (cap) {\n            let text = cap[2].replace(/\\n/g, ' ');\n            const hasNonSpaceChars = /[^ ]/.test(text);\n            const hasSpaceCharsOnBothEnds = /^ /.test(text) && / $/.test(text);\n            if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) {\n                text = text.substring(1, text.length - 1);\n            }\n            text = escape(text, true);\n            return {\n                type: 'codespan',\n                raw: cap[0],\n                text\n            };\n        }\n    }\n    br(src) {\n        const cap = this.rules.inline.br.exec(src);\n        if (cap) {\n            return {\n                type: 'br',\n                raw: cap[0]\n            };\n        }\n    }\n    del(src) {\n        const cap = this.rules.inline.del.exec(src);\n        if (cap) {\n            return {\n                type: 'del',\n                raw: cap[0],\n                text: cap[2],\n                tokens: this.lexer.inlineTokens(cap[2])\n            };\n        }\n    }\n    autolink(src) {\n        const cap = this.rules.inline.autolink.exec(src);\n        if (cap) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape(cap[1]);\n                href = 'mailto:' + text;\n            }\n            else {\n                text = escape(cap[1]);\n                href = text;\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text\n                    }\n                ]\n            };\n        }\n    }\n    url(src) {\n        let cap;\n        if (cap = this.rules.inline.url.exec(src)) {\n            let text, href;\n            if (cap[2] === '@') {\n                text = escape(cap[0]);\n                href = 'mailto:' + text;\n            }\n            else {\n                // do extended autolink path validation\n                let prevCapZero;\n                do {\n                    prevCapZero = cap[0];\n                    cap[0] = this.rules.inline._backpedal.exec(cap[0])[0];\n                } while (prevCapZero !== cap[0]);\n                text = escape(cap[0]);\n                if (cap[1] === 'www.') {\n                    href = 'http://' + cap[0];\n                }\n                else {\n                    href = cap[0];\n                }\n            }\n            return {\n                type: 'link',\n                raw: cap[0],\n                text,\n                href,\n                tokens: [\n                    {\n                        type: 'text',\n                        raw: text,\n                        text\n                    }\n                ]\n            };\n        }\n    }\n    inlineText(src) {\n        const cap = this.rules.inline.text.exec(src);\n        if (cap) {\n            let text;\n            if (this.lexer.state.inRawBlock) {\n                text = cap[0];\n            }\n            else {\n                text = escape(cap[0]);\n            }\n            return {\n                type: 'text',\n                raw: cap[0],\n                text\n            };\n        }\n    }\n}\n\n/**\n * Block-Level Grammar\n */\n// Not all rules are defined in the object literal\n// @ts-expect-error\nconst block = {\n    newline: /^(?: *(?:\\n|$))+/,\n    code: /^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,\n    fences: /^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,\n    hr: /^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,\n    heading: /^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,\n    blockquote: /^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,\n    list: /^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,\n    html: '^ {0,3}(?:' // optional indentation\n        + '<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)' // (1)\n        + '|comment[^\\\\n]*(\\\\n+|$)' // (2)\n        + '|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)' // (3)\n        + '|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)' // (4)\n        + '|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)' // (5)\n        + '|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (6)\n        + '|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) open tag\n        + '|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)' // (7) closing tag\n        + ')',\n    def: /^ {0,3}\\[(label)\\]: *(?:\\n *)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,\n    table: noopTest,\n    lheading: /^(?!bull )((?:.|\\n(?!\\s*?\\n|bull ))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n    // regex template, placeholders will be replaced according to different paragraph\n    // interruption rules of commonmark and the original markdown spec:\n    _paragraph: /^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,\n    text: /^[^\\n]+/\n};\nblock._label = /(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/;\nblock._title = /(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/;\nblock.def = edit(block.def)\n    .replace('label', block._label)\n    .replace('title', block._title)\n    .getRegex();\nblock.bullet = /(?:[*+-]|\\d{1,9}[.)])/;\nblock.listItemStart = edit(/^( *)(bull) */)\n    .replace('bull', block.bullet)\n    .getRegex();\nblock.list = edit(block.list)\n    .replace(/bull/g, block.bullet)\n    .replace('hr', '\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))')\n    .replace('def', '\\\\n+(?=' + block.def.source + ')')\n    .getRegex();\nblock._tag = 'address|article|aside|base|basefont|blockquote|body|caption'\n    + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'\n    + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'\n    + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'\n    + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'\n    + '|track|ul';\nblock._comment = /<!--(?!-?>)[\\s\\S]*?(?:-->|$)/;\nblock.html = edit(block.html, 'i')\n    .replace('comment', block._comment)\n    .replace('tag', block._tag)\n    .replace('attribute', / +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/)\n    .getRegex();\nblock.lheading = edit(block.lheading)\n    .replace(/bull/g, block.bullet) // lists can interrupt\n    .getRegex();\nblock.paragraph = edit(block._paragraph)\n    .replace('hr', block.hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n    .replace('|table', '')\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n    .getRegex();\nblock.blockquote = edit(block.blockquote)\n    .replace('paragraph', block.paragraph)\n    .getRegex();\n/**\n * Normal Block Grammar\n */\nblock.normal = { ...block };\n/**\n * GFM Block Grammar\n */\nblock.gfm = {\n    ...block.normal,\n    table: '^ *([^\\\\n ].*)\\\\n' // Header\n        + ' {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)' // Align\n        + '(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)' // Cells\n};\nblock.gfm.table = edit(block.gfm.table)\n    .replace('hr', block.hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('blockquote', ' {0,3}>')\n    .replace('code', ' {4}[^\\\\n]')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', block._tag) // tables can be interrupted by type (6) html blocks\n    .getRegex();\nblock.gfm.paragraph = edit(block._paragraph)\n    .replace('hr', block.hr)\n    .replace('heading', ' {0,3}#{1,6}(?:\\\\s|$)')\n    .replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs\n    .replace('table', block.gfm.table) // interrupt paragraphs with table\n    .replace('blockquote', ' {0,3}>')\n    .replace('fences', ' {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n')\n    .replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt\n    .replace('html', '</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)')\n    .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks\n    .getRegex();\n/**\n * Pedantic grammar (original John Gruber's loose markdown specification)\n */\nblock.pedantic = {\n    ...block.normal,\n    html: edit('^ *(?:comment *(?:\\\\n|\\\\s*$)'\n        + '|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)' // closed tag\n        + '|<tag(?:\"[^\"]*\"|\\'[^\\']*\\'|\\\\s[^\\'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))')\n        .replace('comment', block._comment)\n        .replace(/tag/g, '(?!(?:'\n        + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'\n        + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'\n        + '\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b')\n        .getRegex(),\n    def: /^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,\n    heading: /^(#{1,6})(.*)(?:\\n+|$)/,\n    fences: noopTest,\n    lheading: /^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,\n    paragraph: edit(block.normal._paragraph)\n        .replace('hr', block.hr)\n        .replace('heading', ' *#{1,6} *[^\\n]')\n        .replace('lheading', block.lheading)\n        .replace('blockquote', ' {0,3}>')\n        .replace('|fences', '')\n        .replace('|list', '')\n        .replace('|html', '')\n        .getRegex()\n};\n/**\n * Inline-Level Grammar\n */\n// Not all rules are defined in the object literal\n// @ts-expect-error\nconst inline = {\n    escape: /^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,\n    autolink: /^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,\n    url: noopTest,\n    tag: '^comment'\n        + '|^</[a-zA-Z][\\\\w:-]*\\\\s*>' // self-closing tag\n        + '|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>' // open tag\n        + '|^<\\\\?[\\\\s\\\\S]*?\\\\?>' // processing instruction, e.g. <?php ?>\n        + '|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>' // declaration, e.g. <!DOCTYPE html>\n        + '|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>',\n    link: /^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,\n    reflink: /^!?\\[(label)\\]\\[(ref)\\]/,\n    nolink: /^!?\\[(ref)\\](?:\\[\\])?/,\n    reflinkSearch: 'reflink|nolink(?!\\\\()',\n    emStrong: {\n        lDelim: /^(?:\\*+(?:((?!\\*)[punct])|[^\\s*]))|^_+(?:((?!_)[punct])|([^\\s_]))/,\n        //         (1) and (2) can only be a Right Delimiter. (3) and (4) can only be Left.  (5) and (6) can be either Left or Right.\n        //         | Skip orphan inside strong      | Consume to delim | (1) #***              | (2) a***#, a***                    | (3) #***a, ***a                  | (4) ***#                 | (5) #***#                         | (6) a***a\n        rDelimAst: /^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])/,\n        rDelimUnd: /^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])/ // ^- Not allowed for _\n    },\n    code: /^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,\n    br: /^( {2,}|\\\\)\\n(?!\\s*$)/,\n    del: noopTest,\n    text: /^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,\n    punctuation: /^((?![*_])[\\spunctuation])/\n};\n// list of unicode punctuation marks, plus any missing characters from CommonMark spec\ninline._punctuation = '\\\\p{P}$+<=>`^|~';\ninline.punctuation = edit(inline.punctuation, 'u').replace(/punctuation/g, inline._punctuation).getRegex();\n// sequences em should skip over [title](link), `code`, <html>\ninline.blockSkip = /\\[[^[\\]]*?\\]\\([^\\(\\)]*?\\)|`[^`]*?`|<[^<>]*?>/g;\ninline.anyPunctuation = /\\\\[punct]/g;\ninline._escapes = /\\\\([punct])/g;\ninline._comment = edit(block._comment).replace('(?:-->|$)', '-->').getRegex();\ninline.emStrong.lDelim = edit(inline.emStrong.lDelim, 'u')\n    .replace(/punct/g, inline._punctuation)\n    .getRegex();\ninline.emStrong.rDelimAst = edit(inline.emStrong.rDelimAst, 'gu')\n    .replace(/punct/g, inline._punctuation)\n    .getRegex();\ninline.emStrong.rDelimUnd = edit(inline.emStrong.rDelimUnd, 'gu')\n    .replace(/punct/g, inline._punctuation)\n    .getRegex();\ninline.anyPunctuation = edit(inline.anyPunctuation, 'gu')\n    .replace(/punct/g, inline._punctuation)\n    .getRegex();\ninline._escapes = edit(inline._escapes, 'gu')\n    .replace(/punct/g, inline._punctuation)\n    .getRegex();\ninline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;\ninline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;\ninline.autolink = edit(inline.autolink)\n    .replace('scheme', inline._scheme)\n    .replace('email', inline._email)\n    .getRegex();\ninline._attribute = /\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/;\ninline.tag = edit(inline.tag)\n    .replace('comment', inline._comment)\n    .replace('attribute', inline._attribute)\n    .getRegex();\ninline._label = /(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/;\ninline._href = /<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/;\ninline._title = /\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/;\ninline.link = edit(inline.link)\n    .replace('label', inline._label)\n    .replace('href', inline._href)\n    .replace('title', inline._title)\n    .getRegex();\ninline.reflink = edit(inline.reflink)\n    .replace('label', inline._label)\n    .replace('ref', block._label)\n    .getRegex();\ninline.nolink = edit(inline.nolink)\n    .replace('ref', block._label)\n    .getRegex();\ninline.reflinkSearch = edit(inline.reflinkSearch, 'g')\n    .replace('reflink', inline.reflink)\n    .replace('nolink', inline.nolink)\n    .getRegex();\n/**\n * Normal Inline Grammar\n */\ninline.normal = { ...inline };\n/**\n * Pedantic Inline Grammar\n */\ninline.pedantic = {\n    ...inline.normal,\n    strong: {\n        start: /^__|\\*\\*/,\n        middle: /^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,\n        endAst: /\\*\\*(?!\\*)/g,\n        endUnd: /__(?!_)/g\n    },\n    em: {\n        start: /^_|\\*/,\n        middle: /^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,\n        endAst: /\\*(?!\\*)/g,\n        endUnd: /_(?!_)/g\n    },\n    link: edit(/^!?\\[(label)\\]\\((.*?)\\)/)\n        .replace('label', inline._label)\n        .getRegex(),\n    reflink: edit(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/)\n        .replace('label', inline._label)\n        .getRegex()\n};\n/**\n * GFM Inline Grammar\n */\ninline.gfm = {\n    ...inline.normal,\n    escape: edit(inline.escape).replace('])', '~|])').getRegex(),\n    _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,\n    url: /^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,\n    _backpedal: /(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,\n    del: /^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,\n    text: /^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/\n};\ninline.gfm.url = edit(inline.gfm.url, 'i')\n    .replace('email', inline.gfm._extended_email)\n    .getRegex();\n/**\n * GFM + Line Breaks Inline Grammar\n */\ninline.breaks = {\n    ...inline.gfm,\n    br: edit(inline.br).replace('{2,}', '*').getRegex(),\n    text: edit(inline.gfm.text)\n        .replace('\\\\b_', '\\\\b_| {2,}\\\\n')\n        .replace(/\\{2,\\}/g, '*')\n        .getRegex()\n};\n\n/**\n * Block Lexer\n */\nclass _Lexer {\n    tokens;\n    options;\n    state;\n    tokenizer;\n    inlineQueue;\n    constructor(options) {\n        // TokenList cannot be created in one go\n        // @ts-expect-error\n        this.tokens = [];\n        this.tokens.links = Object.create(null);\n        this.options = options || _defaults;\n        this.options.tokenizer = this.options.tokenizer || new _Tokenizer();\n        this.tokenizer = this.options.tokenizer;\n        this.tokenizer.options = this.options;\n        this.tokenizer.lexer = this;\n        this.inlineQueue = [];\n        this.state = {\n            inLink: false,\n            inRawBlock: false,\n            top: true\n        };\n        const rules = {\n            block: block.normal,\n            inline: inline.normal\n        };\n        if (this.options.pedantic) {\n            rules.block = block.pedantic;\n            rules.inline = inline.pedantic;\n        }\n        else if (this.options.gfm) {\n            rules.block = block.gfm;\n            if (this.options.breaks) {\n                rules.inline = inline.breaks;\n            }\n            else {\n                rules.inline = inline.gfm;\n            }\n        }\n        this.tokenizer.rules = rules;\n    }\n    /**\n     * Expose Rules\n     */\n    static get rules() {\n        return {\n            block,\n            inline\n        };\n    }\n    /**\n     * Static Lex Method\n     */\n    static lex(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.lex(src);\n    }\n    /**\n     * Static Lex Inline Method\n     */\n    static lexInline(src, options) {\n        const lexer = new _Lexer(options);\n        return lexer.inlineTokens(src);\n    }\n    /**\n     * Preprocessing\n     */\n    lex(src) {\n        src = src\n            .replace(/\\r\\n|\\r/g, '\\n');\n        this.blockTokens(src, this.tokens);\n        let next;\n        while (next = this.inlineQueue.shift()) {\n            this.inlineTokens(next.src, next.tokens);\n        }\n        return this.tokens;\n    }\n    blockTokens(src, tokens = []) {\n        if (this.options.pedantic) {\n            src = src.replace(/\\t/g, '    ').replace(/^ +$/gm, '');\n        }\n        else {\n            src = src.replace(/^( *)(\\t+)/gm, (_, leading, tabs) => {\n                return leading + '    '.repeat(tabs.length);\n            });\n        }\n        let token;\n        let lastToken;\n        let cutSrc;\n        let lastParagraphClipped;\n        while (src) {\n            if (this.options.extensions\n                && this.options.extensions.block\n                && this.options.extensions.block.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // newline\n            if (token = this.tokenizer.space(src)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.length === 1 && tokens.length > 0) {\n                    // if there's a single \\n as a spacer, it's terminating the last line,\n                    // so move it there so that we don't get unnecessary paragraph tags\n                    tokens[tokens.length - 1].raw += '\\n';\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.code(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                // An indented code block cannot interrupt a paragraph.\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // fences\n            if (token = this.tokenizer.fences(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // heading\n            if (token = this.tokenizer.heading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // hr\n            if (token = this.tokenizer.hr(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // blockquote\n            if (token = this.tokenizer.blockquote(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // list\n            if (token = this.tokenizer.list(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // html\n            if (token = this.tokenizer.html(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // def\n            if (token = this.tokenizer.def(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && (lastToken.type === 'paragraph' || lastToken.type === 'text')) {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.raw;\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else if (!this.tokens.links[token.tag]) {\n                    this.tokens.links[token.tag] = {\n                        href: token.href,\n                        title: token.title\n                    };\n                }\n                continue;\n            }\n            // table (gfm)\n            if (token = this.tokenizer.table(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // lheading\n            if (token = this.tokenizer.lheading(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // top-level paragraph\n            // prevent paragraph consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startBlock) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startBlock.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) {\n                lastToken = tokens[tokens.length - 1];\n                if (lastParagraphClipped && lastToken.type === 'paragraph') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                lastParagraphClipped = (cutSrc.length !== src.length);\n                src = src.substring(token.raw.length);\n                continue;\n            }\n            // text\n            if (token = this.tokenizer.text(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += '\\n' + token.raw;\n                    lastToken.text += '\\n' + token.text;\n                    this.inlineQueue.pop();\n                    this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        this.state.top = true;\n        return tokens;\n    }\n    inline(src, tokens = []) {\n        this.inlineQueue.push({ src, tokens });\n        return tokens;\n    }\n    /**\n     * Lexing/Compiling\n     */\n    inlineTokens(src, tokens = []) {\n        let token, lastToken, cutSrc;\n        // String with links masked to avoid interference with em and strong\n        let maskedSrc = src;\n        let match;\n        let keepPrevChar, prevChar;\n        // Mask out reflinks\n        if (this.tokens.links) {\n            const links = Object.keys(this.tokens.links);\n            if (links.length > 0) {\n                while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) {\n                    if (links.includes(match[0].slice(match[0].lastIndexOf('[') + 1, -1))) {\n                        maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex);\n                    }\n                }\n            }\n        }\n        // Mask out other blocks\n        while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '[' + 'a'.repeat(match[0].length - 2) + ']' + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);\n        }\n        // Mask out escaped characters\n        while ((match = this.tokenizer.rules.inline.anyPunctuation.exec(maskedSrc)) != null) {\n            maskedSrc = maskedSrc.slice(0, match.index) + '++' + maskedSrc.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);\n        }\n        while (src) {\n            if (!keepPrevChar) {\n                prevChar = '';\n            }\n            keepPrevChar = false;\n            // extensions\n            if (this.options.extensions\n                && this.options.extensions.inline\n                && this.options.extensions.inline.some((extTokenizer) => {\n                    if (token = extTokenizer.call({ lexer: this }, src, tokens)) {\n                        src = src.substring(token.raw.length);\n                        tokens.push(token);\n                        return true;\n                    }\n                    return false;\n                })) {\n                continue;\n            }\n            // escape\n            if (token = this.tokenizer.escape(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // tag\n            if (token = this.tokenizer.tag(src)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // link\n            if (token = this.tokenizer.link(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // reflink, nolink\n            if (token = this.tokenizer.reflink(src, this.tokens.links)) {\n                src = src.substring(token.raw.length);\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && token.type === 'text' && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            // em & strong\n            if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // code\n            if (token = this.tokenizer.codespan(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // br\n            if (token = this.tokenizer.br(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // del (gfm)\n            if (token = this.tokenizer.del(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // autolink\n            if (token = this.tokenizer.autolink(src)) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // url (gfm)\n            if (!this.state.inLink && (token = this.tokenizer.url(src))) {\n                src = src.substring(token.raw.length);\n                tokens.push(token);\n                continue;\n            }\n            // text\n            // prevent inlineText consuming extensions by clipping 'src' to extension start\n            cutSrc = src;\n            if (this.options.extensions && this.options.extensions.startInline) {\n                let startIndex = Infinity;\n                const tempSrc = src.slice(1);\n                let tempStart;\n                this.options.extensions.startInline.forEach((getStartIndex) => {\n                    tempStart = getStartIndex.call({ lexer: this }, tempSrc);\n                    if (typeof tempStart === 'number' && tempStart >= 0) {\n                        startIndex = Math.min(startIndex, tempStart);\n                    }\n                });\n                if (startIndex < Infinity && startIndex >= 0) {\n                    cutSrc = src.substring(0, startIndex + 1);\n                }\n            }\n            if (token = this.tokenizer.inlineText(cutSrc)) {\n                src = src.substring(token.raw.length);\n                if (token.raw.slice(-1) !== '_') { // Track prevChar before string of ____ started\n                    prevChar = token.raw.slice(-1);\n                }\n                keepPrevChar = true;\n                lastToken = tokens[tokens.length - 1];\n                if (lastToken && lastToken.type === 'text') {\n                    lastToken.raw += token.raw;\n                    lastToken.text += token.text;\n                }\n                else {\n                    tokens.push(token);\n                }\n                continue;\n            }\n            if (src) {\n                const errMsg = 'Infinite loop on byte: ' + src.charCodeAt(0);\n                if (this.options.silent) {\n                    console.error(errMsg);\n                    break;\n                }\n                else {\n                    throw new Error(errMsg);\n                }\n            }\n        }\n        return tokens;\n    }\n}\n\n/**\n * Renderer\n */\nclass _Renderer {\n    options;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    code(code, infostring, escaped) {\n        const lang = (infostring || '').match(/^\\S*/)?.[0];\n        code = code.replace(/\\n$/, '') + '\\n';\n        if (!lang) {\n            return '<pre><code>'\n                + (escaped ? code : escape(code, true))\n                + '</code></pre>\\n';\n        }\n        return '<pre><code class=\"language-'\n            + escape(lang)\n            + '\">'\n            + (escaped ? code : escape(code, true))\n            + '</code></pre>\\n';\n    }\n    blockquote(quote) {\n        return `<blockquote>\\n${quote}</blockquote>\\n`;\n    }\n    html(html, block) {\n        return html;\n    }\n    heading(text, level, raw) {\n        // ignore IDs\n        return `<h${level}>${text}</h${level}>\\n`;\n    }\n    hr() {\n        return '<hr>\\n';\n    }\n    list(body, ordered, start) {\n        const type = ordered ? 'ol' : 'ul';\n        const startatt = (ordered && start !== 1) ? (' start=\"' + start + '\"') : '';\n        return '<' + type + startatt + '>\\n' + body + '</' + type + '>\\n';\n    }\n    listitem(text, task, checked) {\n        return `<li>${text}</li>\\n`;\n    }\n    checkbox(checked) {\n        return '<input '\n            + (checked ? 'checked=\"\" ' : '')\n            + 'disabled=\"\" type=\"checkbox\">';\n    }\n    paragraph(text) {\n        return `<p>${text}</p>\\n`;\n    }\n    table(header, body) {\n        if (body)\n            body = `<tbody>${body}</tbody>`;\n        return '<table>\\n'\n            + '<thead>\\n'\n            + header\n            + '</thead>\\n'\n            + body\n            + '</table>\\n';\n    }\n    tablerow(content) {\n        return `<tr>\\n${content}</tr>\\n`;\n    }\n    tablecell(content, flags) {\n        const type = flags.header ? 'th' : 'td';\n        const tag = flags.align\n            ? `<${type} align=\"${flags.align}\">`\n            : `<${type}>`;\n        return tag + content + `</${type}>\\n`;\n    }\n    /**\n     * span level renderer\n     */\n    strong(text) {\n        return `<strong>${text}</strong>`;\n    }\n    em(text) {\n        return `<em>${text}</em>`;\n    }\n    codespan(text) {\n        return `<code>${text}</code>`;\n    }\n    br() {\n        return '<br>';\n    }\n    del(text) {\n        return `<del>${text}</del>`;\n    }\n    link(href, title, text) {\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = '<a href=\"' + href + '\"';\n        if (title) {\n            out += ' title=\"' + title + '\"';\n        }\n        out += '>' + text + '</a>';\n        return out;\n    }\n    image(href, title, text) {\n        const cleanHref = cleanUrl(href);\n        if (cleanHref === null) {\n            return text;\n        }\n        href = cleanHref;\n        let out = `<img src=\"${href}\" alt=\"${text}\"`;\n        if (title) {\n            out += ` title=\"${title}\"`;\n        }\n        out += '>';\n        return out;\n    }\n    text(text) {\n        return text;\n    }\n}\n\n/**\n * TextRenderer\n * returns only the textual part of the token\n */\nclass _TextRenderer {\n    // no need for block level renderers\n    strong(text) {\n        return text;\n    }\n    em(text) {\n        return text;\n    }\n    codespan(text) {\n        return text;\n    }\n    del(text) {\n        return text;\n    }\n    html(text) {\n        return text;\n    }\n    text(text) {\n        return text;\n    }\n    link(href, title, text) {\n        return '' + text;\n    }\n    image(href, title, text) {\n        return '' + text;\n    }\n    br() {\n        return '';\n    }\n}\n\n/**\n * Parsing & Compiling\n */\nclass _Parser {\n    options;\n    renderer;\n    textRenderer;\n    constructor(options) {\n        this.options = options || _defaults;\n        this.options.renderer = this.options.renderer || new _Renderer();\n        this.renderer = this.options.renderer;\n        this.renderer.options = this.options;\n        this.textRenderer = new _TextRenderer();\n    }\n    /**\n     * Static Parse Method\n     */\n    static parse(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parse(tokens);\n    }\n    /**\n     * Static Parse Inline Method\n     */\n    static parseInline(tokens, options) {\n        const parser = new _Parser(options);\n        return parser.parseInline(tokens);\n    }\n    /**\n     * Parse Loop\n     */\n    parse(tokens, top = true) {\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const token = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n                const genericToken = token;\n                const ret = this.options.extensions.renderers[genericToken.type].call({ parser: this }, genericToken);\n                if (ret !== false || !['space', 'hr', 'heading', 'code', 'table', 'blockquote', 'list', 'html', 'paragraph', 'text'].includes(genericToken.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            switch (token.type) {\n                case 'space': {\n                    continue;\n                }\n                case 'hr': {\n                    out += this.renderer.hr();\n                    continue;\n                }\n                case 'heading': {\n                    const headingToken = token;\n                    out += this.renderer.heading(this.parseInline(headingToken.tokens), headingToken.depth, unescape(this.parseInline(headingToken.tokens, this.textRenderer)));\n                    continue;\n                }\n                case 'code': {\n                    const codeToken = token;\n                    out += this.renderer.code(codeToken.text, codeToken.lang, !!codeToken.escaped);\n                    continue;\n                }\n                case 'table': {\n                    const tableToken = token;\n                    let header = '';\n                    // header\n                    let cell = '';\n                    for (let j = 0; j < tableToken.header.length; j++) {\n                        cell += this.renderer.tablecell(this.parseInline(tableToken.header[j].tokens), { header: true, align: tableToken.align[j] });\n                    }\n                    header += this.renderer.tablerow(cell);\n                    let body = '';\n                    for (let j = 0; j < tableToken.rows.length; j++) {\n                        const row = tableToken.rows[j];\n                        cell = '';\n                        for (let k = 0; k < row.length; k++) {\n                            cell += this.renderer.tablecell(this.parseInline(row[k].tokens), { header: false, align: tableToken.align[k] });\n                        }\n                        body += this.renderer.tablerow(cell);\n                    }\n                    out += this.renderer.table(header, body);\n                    continue;\n                }\n                case 'blockquote': {\n                    const blockquoteToken = token;\n                    const body = this.parse(blockquoteToken.tokens);\n                    out += this.renderer.blockquote(body);\n                    continue;\n                }\n                case 'list': {\n                    const listToken = token;\n                    const ordered = listToken.ordered;\n                    const start = listToken.start;\n                    const loose = listToken.loose;\n                    let body = '';\n                    for (let j = 0; j < listToken.items.length; j++) {\n                        const item = listToken.items[j];\n                        const checked = item.checked;\n                        const task = item.task;\n                        let itemBody = '';\n                        if (item.task) {\n                            const checkbox = this.renderer.checkbox(!!checked);\n                            if (loose) {\n                                if (item.tokens.length > 0 && item.tokens[0].type === 'paragraph') {\n                                    item.tokens[0].text = checkbox + ' ' + item.tokens[0].text;\n                                    if (item.tokens[0].tokens && item.tokens[0].tokens.length > 0 && item.tokens[0].tokens[0].type === 'text') {\n                                        item.tokens[0].tokens[0].text = checkbox + ' ' + item.tokens[0].tokens[0].text;\n                                    }\n                                }\n                                else {\n                                    item.tokens.unshift({\n                                        type: 'text',\n                                        text: checkbox + ' '\n                                    });\n                                }\n                            }\n                            else {\n                                itemBody += checkbox + ' ';\n                            }\n                        }\n                        itemBody += this.parse(item.tokens, loose);\n                        body += this.renderer.listitem(itemBody, task, !!checked);\n                    }\n                    out += this.renderer.list(body, ordered, start);\n                    continue;\n                }\n                case 'html': {\n                    const htmlToken = token;\n                    out += this.renderer.html(htmlToken.text, htmlToken.block);\n                    continue;\n                }\n                case 'paragraph': {\n                    const paragraphToken = token;\n                    out += this.renderer.paragraph(this.parseInline(paragraphToken.tokens));\n                    continue;\n                }\n                case 'text': {\n                    let textToken = token;\n                    let body = textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text;\n                    while (i + 1 < tokens.length && tokens[i + 1].type === 'text') {\n                        textToken = tokens[++i];\n                        body += '\\n' + (textToken.tokens ? this.parseInline(textToken.tokens) : textToken.text);\n                    }\n                    out += top ? this.renderer.paragraph(body) : body;\n                    continue;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n    /**\n     * Parse Inline Tokens\n     */\n    parseInline(tokens, renderer) {\n        renderer = renderer || this.renderer;\n        let out = '';\n        for (let i = 0; i < tokens.length; i++) {\n            const token = tokens[i];\n            // Run any renderer extensions\n            if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) {\n                const ret = this.options.extensions.renderers[token.type].call({ parser: this }, token);\n                if (ret !== false || !['escape', 'html', 'link', 'image', 'strong', 'em', 'codespan', 'br', 'del', 'text'].includes(token.type)) {\n                    out += ret || '';\n                    continue;\n                }\n            }\n            switch (token.type) {\n                case 'escape': {\n                    const escapeToken = token;\n                    out += renderer.text(escapeToken.text);\n                    break;\n                }\n                case 'html': {\n                    const tagToken = token;\n                    out += renderer.html(tagToken.text);\n                    break;\n                }\n                case 'link': {\n                    const linkToken = token;\n                    out += renderer.link(linkToken.href, linkToken.title, this.parseInline(linkToken.tokens, renderer));\n                    break;\n                }\n                case 'image': {\n                    const imageToken = token;\n                    out += renderer.image(imageToken.href, imageToken.title, imageToken.text);\n                    break;\n                }\n                case 'strong': {\n                    const strongToken = token;\n                    out += renderer.strong(this.parseInline(strongToken.tokens, renderer));\n                    break;\n                }\n                case 'em': {\n                    const emToken = token;\n                    out += renderer.em(this.parseInline(emToken.tokens, renderer));\n                    break;\n                }\n                case 'codespan': {\n                    const codespanToken = token;\n                    out += renderer.codespan(codespanToken.text);\n                    break;\n                }\n                case 'br': {\n                    out += renderer.br();\n                    break;\n                }\n                case 'del': {\n                    const delToken = token;\n                    out += renderer.del(this.parseInline(delToken.tokens, renderer));\n                    break;\n                }\n                case 'text': {\n                    const textToken = token;\n                    out += renderer.text(textToken.text);\n                    break;\n                }\n                default: {\n                    const errMsg = 'Token with \"' + token.type + '\" type was not found.';\n                    if (this.options.silent) {\n                        console.error(errMsg);\n                        return '';\n                    }\n                    else {\n                        throw new Error(errMsg);\n                    }\n                }\n            }\n        }\n        return out;\n    }\n}\n\nclass _Hooks {\n    options;\n    constructor(options) {\n        this.options = options || _defaults;\n    }\n    static passThroughHooks = new Set([\n        'preprocess',\n        'postprocess'\n    ]);\n    /**\n     * Process markdown before marked\n     */\n    preprocess(markdown) {\n        return markdown;\n    }\n    /**\n     * Process HTML after marked is finished\n     */\n    postprocess(html) {\n        return html;\n    }\n}\n\nclass Marked {\n    defaults = _getDefaults();\n    options = this.setOptions;\n    parse = this.#parseMarkdown(_Lexer.lex, _Parser.parse);\n    parseInline = this.#parseMarkdown(_Lexer.lexInline, _Parser.parseInline);\n    Parser = _Parser;\n    Renderer = _Renderer;\n    TextRenderer = _TextRenderer;\n    Lexer = _Lexer;\n    Tokenizer = _Tokenizer;\n    Hooks = _Hooks;\n    constructor(...args) {\n        this.use(...args);\n    }\n    /**\n     * Run callback for every token\n     */\n    walkTokens(tokens, callback) {\n        let values = [];\n        for (const token of tokens) {\n            values = values.concat(callback.call(this, token));\n            switch (token.type) {\n                case 'table': {\n                    const tableToken = token;\n                    for (const cell of tableToken.header) {\n                        values = values.concat(this.walkTokens(cell.tokens, callback));\n                    }\n                    for (const row of tableToken.rows) {\n                        for (const cell of row) {\n                            values = values.concat(this.walkTokens(cell.tokens, callback));\n                        }\n                    }\n                    break;\n                }\n                case 'list': {\n                    const listToken = token;\n                    values = values.concat(this.walkTokens(listToken.items, callback));\n                    break;\n                }\n                default: {\n                    const genericToken = token;\n                    if (this.defaults.extensions?.childTokens?.[genericToken.type]) {\n                        this.defaults.extensions.childTokens[genericToken.type].forEach((childTokens) => {\n                            values = values.concat(this.walkTokens(genericToken[childTokens], callback));\n                        });\n                    }\n                    else if (genericToken.tokens) {\n                        values = values.concat(this.walkTokens(genericToken.tokens, callback));\n                    }\n                }\n            }\n        }\n        return values;\n    }\n    use(...args) {\n        const extensions = this.defaults.extensions || { renderers: {}, childTokens: {} };\n        args.forEach((pack) => {\n            // copy options to new object\n            const opts = { ...pack };\n            // set async to true if it was set to true before\n            opts.async = this.defaults.async || opts.async || false;\n            // ==-- Parse \"addon\" extensions --== //\n            if (pack.extensions) {\n                pack.extensions.forEach((ext) => {\n                    if (!ext.name) {\n                        throw new Error('extension name required');\n                    }\n                    if ('renderer' in ext) { // Renderer extensions\n                        const prevRenderer = extensions.renderers[ext.name];\n                        if (prevRenderer) {\n                            // Replace extension with func to run new extension but fall back if false\n                            extensions.renderers[ext.name] = function (...args) {\n                                let ret = ext.renderer.apply(this, args);\n                                if (ret === false) {\n                                    ret = prevRenderer.apply(this, args);\n                                }\n                                return ret;\n                            };\n                        }\n                        else {\n                            extensions.renderers[ext.name] = ext.renderer;\n                        }\n                    }\n                    if ('tokenizer' in ext) { // Tokenizer Extensions\n                        if (!ext.level || (ext.level !== 'block' && ext.level !== 'inline')) {\n                            throw new Error(\"extension level must be 'block' or 'inline'\");\n                        }\n                        const extLevel = extensions[ext.level];\n                        if (extLevel) {\n                            extLevel.unshift(ext.tokenizer);\n                        }\n                        else {\n                            extensions[ext.level] = [ext.tokenizer];\n                        }\n                        if (ext.start) { // Function to check for start of token\n                            if (ext.level === 'block') {\n                                if (extensions.startBlock) {\n                                    extensions.startBlock.push(ext.start);\n                                }\n                                else {\n                                    extensions.startBlock = [ext.start];\n                                }\n                            }\n                            else if (ext.level === 'inline') {\n                                if (extensions.startInline) {\n                                    extensions.startInline.push(ext.start);\n                                }\n                                else {\n                                    extensions.startInline = [ext.start];\n                                }\n                            }\n                        }\n                    }\n                    if ('childTokens' in ext && ext.childTokens) { // Child tokens to be visited by walkTokens\n                        extensions.childTokens[ext.name] = ext.childTokens;\n                    }\n                });\n                opts.extensions = extensions;\n            }\n            // ==-- Parse \"overwrite\" extensions --== //\n            if (pack.renderer) {\n                const renderer = this.defaults.renderer || new _Renderer(this.defaults);\n                for (const prop in pack.renderer) {\n                    const rendererFunc = pack.renderer[prop];\n                    const rendererKey = prop;\n                    const prevRenderer = renderer[rendererKey];\n                    // Replace renderer with func to run extension, but fall back if false\n                    renderer[rendererKey] = (...args) => {\n                        let ret = rendererFunc.apply(renderer, args);\n                        if (ret === false) {\n                            ret = prevRenderer.apply(renderer, args);\n                        }\n                        return ret || '';\n                    };\n                }\n                opts.renderer = renderer;\n            }\n            if (pack.tokenizer) {\n                const tokenizer = this.defaults.tokenizer || new _Tokenizer(this.defaults);\n                for (const prop in pack.tokenizer) {\n                    const tokenizerFunc = pack.tokenizer[prop];\n                    const tokenizerKey = prop;\n                    const prevTokenizer = tokenizer[tokenizerKey];\n                    // Replace tokenizer with func to run extension, but fall back if false\n                    tokenizer[tokenizerKey] = (...args) => {\n                        let ret = tokenizerFunc.apply(tokenizer, args);\n                        if (ret === false) {\n                            ret = prevTokenizer.apply(tokenizer, args);\n                        }\n                        return ret;\n                    };\n                }\n                opts.tokenizer = tokenizer;\n            }\n            // ==-- Parse Hooks extensions --== //\n            if (pack.hooks) {\n                const hooks = this.defaults.hooks || new _Hooks();\n                for (const prop in pack.hooks) {\n                    const hooksFunc = pack.hooks[prop];\n                    const hooksKey = prop;\n                    const prevHook = hooks[hooksKey];\n                    if (_Hooks.passThroughHooks.has(prop)) {\n                        hooks[hooksKey] = (arg) => {\n                            if (this.defaults.async) {\n                                return Promise.resolve(hooksFunc.call(hooks, arg)).then(ret => {\n                                    return prevHook.call(hooks, ret);\n                                });\n                            }\n                            const ret = hooksFunc.call(hooks, arg);\n                            return prevHook.call(hooks, ret);\n                        };\n                    }\n                    else {\n                        hooks[hooksKey] = (...args) => {\n                            let ret = hooksFunc.apply(hooks, args);\n                            if (ret === false) {\n                                ret = prevHook.apply(hooks, args);\n                            }\n                            return ret;\n                        };\n                    }\n                }\n                opts.hooks = hooks;\n            }\n            // ==-- Parse WalkTokens extensions --== //\n            if (pack.walkTokens) {\n                const walkTokens = this.defaults.walkTokens;\n                const packWalktokens = pack.walkTokens;\n                opts.walkTokens = function (token) {\n                    let values = [];\n                    values.push(packWalktokens.call(this, token));\n                    if (walkTokens) {\n                        values = values.concat(walkTokens.call(this, token));\n                    }\n                    return values;\n                };\n            }\n            this.defaults = { ...this.defaults, ...opts };\n        });\n        return this;\n    }\n    setOptions(opt) {\n        this.defaults = { ...this.defaults, ...opt };\n        return this;\n    }\n    lexer(src, options) {\n        return _Lexer.lex(src, options ?? this.defaults);\n    }\n    parser(tokens, options) {\n        return _Parser.parse(tokens, options ?? this.defaults);\n    }\n    #parseMarkdown(lexer, parser) {\n        return (src, options) => {\n            const origOpt = { ...options };\n            const opt = { ...this.defaults, ...origOpt };\n            // Show warning if an extension set async to true but the parse was called with async: false\n            if (this.defaults.async === true && origOpt.async === false) {\n                if (!opt.silent) {\n                    console.warn('marked(): The async option was set to true by an extension. The async: false option sent to parse will be ignored.');\n                }\n                opt.async = true;\n            }\n            const throwError = this.#onError(!!opt.silent, !!opt.async);\n            // throw error in case of non string input\n            if (typeof src === 'undefined' || src === null) {\n                return throwError(new Error('marked(): input parameter is undefined or null'));\n            }\n            if (typeof src !== 'string') {\n                return throwError(new Error('marked(): input parameter is of type '\n                    + Object.prototype.toString.call(src) + ', string expected'));\n            }\n            if (opt.hooks) {\n                opt.hooks.options = opt;\n            }\n            if (opt.async) {\n                return Promise.resolve(opt.hooks ? opt.hooks.preprocess(src) : src)\n                    .then(src => lexer(src, opt))\n                    .then(tokens => opt.walkTokens ? Promise.all(this.walkTokens(tokens, opt.walkTokens)).then(() => tokens) : tokens)\n                    .then(tokens => parser(tokens, opt))\n                    .then(html => opt.hooks ? opt.hooks.postprocess(html) : html)\n                    .catch(throwError);\n            }\n            try {\n                if (opt.hooks) {\n                    src = opt.hooks.preprocess(src);\n                }\n                const tokens = lexer(src, opt);\n                if (opt.walkTokens) {\n                    this.walkTokens(tokens, opt.walkTokens);\n                }\n                let html = parser(tokens, opt);\n                if (opt.hooks) {\n                    html = opt.hooks.postprocess(html);\n                }\n                return html;\n            }\n            catch (e) {\n                return throwError(e);\n            }\n        };\n    }\n    #onError(silent, async) {\n        return (e) => {\n            e.message += '\\nPlease report this to https://github.com/markedjs/marked.';\n            if (silent) {\n                const msg = '<p>An error occurred:</p><pre>'\n                    + escape(e.message + '', true)\n                    + '</pre>';\n                if (async) {\n                    return Promise.resolve(msg);\n                }\n                return msg;\n            }\n            if (async) {\n                return Promise.reject(e);\n            }\n            throw e;\n        };\n    }\n}\n\nconst markedInstance = new Marked();\nfunction marked(src, opt) {\n    return markedInstance.parse(src, opt);\n}\n/**\n * Sets the default options.\n *\n * @param options Hash of options\n */\nmarked.options =\n    marked.setOptions = function (options) {\n        markedInstance.setOptions(options);\n        marked.defaults = markedInstance.defaults;\n        changeDefaults(marked.defaults);\n        return marked;\n    };\n/**\n * Gets the original marked default options.\n */\nmarked.getDefaults = _getDefaults;\nmarked.defaults = _defaults;\n/**\n * Use Extension\n */\nmarked.use = function (...args) {\n    markedInstance.use(...args);\n    marked.defaults = markedInstance.defaults;\n    changeDefaults(marked.defaults);\n    return marked;\n};\n/**\n * Run callback for every token\n */\nmarked.walkTokens = function (tokens, callback) {\n    return markedInstance.walkTokens(tokens, callback);\n};\n/**\n * Compiles markdown to HTML without enclosing `p` tag.\n *\n * @param src String of markdown source to be compiled\n * @param options Hash of options\n * @return String of compiled HTML\n */\nmarked.parseInline = markedInstance.parseInline;\n/**\n * Expose\n */\nmarked.Parser = _Parser;\nmarked.parser = _Parser.parse;\nmarked.Renderer = _Renderer;\nmarked.TextRenderer = _TextRenderer;\nmarked.Lexer = _Lexer;\nmarked.lexer = _Lexer.lex;\nmarked.Tokenizer = _Tokenizer;\nmarked.Hooks = _Hooks;\nmarked.parse = marked;\nconst options = marked.options;\nconst setOptions = marked.setOptions;\nconst use = marked.use;\nconst walkTokens = marked.walkTokens;\nconst parseInline = marked.parseInline;\nconst parse = marked;\nconst parser = _Parser.parse;\nconst lexer = _Lexer.lex;\n\nexport { _Hooks as Hooks, _Lexer as Lexer, Marked, _Parser as Parser, _Renderer as Renderer, _TextRenderer as TextRenderer, _Tokenizer as Tokenizer, _defaults as defaults, _getDefaults as getDefaults, lexer, marked, options, parse, parseInline, parser, setOptions, use, walkTokens };\n//# sourceMappingURL=marked.esm.js.map\n","/*! @license DOMPurify 3.4.12 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.12/LICENSE */\n\nfunction _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nfunction _arrayWithHoles(r) {\n  if (Array.isArray(r)) return r;\n}\nfunction _iterableToArrayLimit(r, l) {\n  var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (null != t) {\n    var e,\n      n,\n      i,\n      u,\n      a = [],\n      f = true,\n      o = false;\n    try {\n      if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n    } catch (r) {\n      o = true, n = r;\n    } finally {\n      try {\n        if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n      } finally {\n        if (o) throw n;\n      }\n    }\n    return a;\n  }\n}\nfunction _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction _slicedToArray(r, e) {\n  return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n  }\n}\n\nconst entries = Object.entries,\n  setPrototypeOf = Object.setPrototypeOf,\n  isFrozen = Object.isFrozen,\n  getPrototypeOf = Object.getPrototypeOf,\n  getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n  seal = Object.seal,\n  create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n  apply = _ref.apply,\n  construct = _ref.construct;\nif (!freeze) {\n  freeze = function freeze(x) {\n    return x;\n  };\n}\nif (!seal) {\n  seal = function seal(x) {\n    return x;\n  };\n}\nif (!apply) {\n  apply = function apply(func, thisArg) {\n    for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n      args[_key - 2] = arguments[_key];\n    }\n    return func.apply(thisArg, args);\n  };\n}\nif (!construct) {\n  construct = function construct(Func) {\n    for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n      args[_key2 - 1] = arguments[_key2];\n    }\n    return new Func(...args);\n  };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n  return function (thisArg) {\n    if (thisArg instanceof RegExp) {\n      thisArg.lastIndex = 0;\n    }\n    for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n      args[_key3 - 1] = arguments[_key3];\n    }\n    return apply(func, thisArg, args);\n  };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n  return function () {\n    for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n      args[_key4] = arguments[_key4];\n    }\n    return construct(Func, args);\n  };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n  let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n  if (setPrototypeOf) {\n    // Make 'in' and truthy checks like Boolean(set.constructor)\n    // independent of any properties defined on Object.prototype.\n    // Prevent prototype setters from intercepting set as a this value.\n    setPrototypeOf(set, null);\n  }\n  if (!arrayIsArray(array)) {\n    return set;\n  }\n  let l = array.length;\n  while (l--) {\n    let element = array[l];\n    if (typeof element === 'string') {\n      const lcElement = transformCaseFunc(element);\n      if (lcElement !== element) {\n        // Config presets (e.g. tags.js, attrs.js) are immutable.\n        if (!isFrozen(array)) {\n          array[l] = lcElement;\n        }\n        element = lcElement;\n      }\n    }\n    set[element] = true;\n  }\n  return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n  for (let index = 0; index < array.length; index++) {\n    const isPropertyExist = objectHasOwnProperty(array, index);\n    if (!isPropertyExist) {\n      array[index] = null;\n    }\n  }\n  return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n  const newObject = create(null);\n  for (const _ref2 of entries(object)) {\n    var _ref3 = _slicedToArray(_ref2, 2);\n    const property = _ref3[0];\n    const value = _ref3[1];\n    const isPropertyExist = objectHasOwnProperty(object, property);\n    if (isPropertyExist) {\n      if (arrayIsArray(value)) {\n        newObject[property] = cleanArray(value);\n      } else if (value && typeof value === 'object' && value.constructor === Object) {\n        newObject[property] = clone(value);\n      } else {\n        newObject[property] = value;\n      }\n    }\n  }\n  return newObject;\n}\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n  switch (typeof value) {\n    case 'string':\n      {\n        return value;\n      }\n    case 'number':\n      {\n        return numberToString(value);\n      }\n    case 'boolean':\n      {\n        return booleanToString(value);\n      }\n    case 'bigint':\n      {\n        return bigintToString ? bigintToString(value) : '0';\n      }\n    case 'symbol':\n      {\n        return symbolToString ? symbolToString(value) : 'Symbol()';\n      }\n    case 'undefined':\n      {\n        return objectToString(value);\n      }\n    case 'function':\n    case 'object':\n      {\n        if (value === null) {\n          return objectToString(value);\n        }\n        const valueAsRecord = value;\n        const valueToString = lookupGetter(valueAsRecord, 'toString');\n        if (typeof valueToString === 'function') {\n          const stringified = valueToString(valueAsRecord);\n          return typeof stringified === 'string' ? stringified : objectToString(stringified);\n        }\n        return objectToString(value);\n      }\n    default:\n      {\n        return objectToString(value);\n      }\n  }\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n  while (object !== null) {\n    const desc = getOwnPropertyDescriptor(object, prop);\n    if (desc) {\n      if (desc.get) {\n        return unapply(desc.get);\n      }\n      if (typeof desc.value === 'function') {\n        return unapply(desc.value);\n      }\n    }\n    object = getPrototypeOf(object);\n  }\n  function fallbackValue() {\n    return null;\n  }\n  return fallbackValue;\n}\nfunction isRegex(value) {\n  try {\n    regExpTest(value, '');\n    return true;\n  } catch (_unused) {\n    return false;\n  }\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'command', 'commandfor', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dominant-baseline', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-orientation', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nconst ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nconst COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nconst FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nconst SELF_CLOSING_TAG = seal(/\\/>/i);\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n  element: 1,\n  attribute: 2,\n  text: 3,\n  cdataSection: 4,\n  entityReference: 5,\n  // Deprecated\n  entityNode: 6,\n  // Deprecated\n  processingInstruction: 7,\n  comment: 8,\n  document: 9,\n  documentType: 10,\n  documentFragment: 11,\n  notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n  return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n  if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n    return null;\n  }\n  // Allow the callers to control the unique policy name\n  // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n  // Policy creation with duplicate names throws in Trusted Types.\n  let suffix = null;\n  const ATTR_NAME = 'data-tt-policy-suffix';\n  if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n    suffix = purifyHostElement.getAttribute(ATTR_NAME);\n  }\n  const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n  try {\n    return trustedTypes.createPolicy(policyName, {\n      createHTML(html) {\n        return html;\n      },\n      createScriptURL(scriptUrl) {\n        return scriptUrl;\n      }\n    });\n  } catch (_) {\n    // Policy creation failed (most likely another DOMPurify script has\n    // already run). Skip creating the policy, as this will only cause errors\n    // if TT are enforced.\n    console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n    return null;\n  }\n};\nconst _createHooksMap = function _createHooksMap() {\n  return {\n    afterSanitizeAttributes: [],\n    afterSanitizeElements: [],\n    afterSanitizeShadowDOM: [],\n    beforeSanitizeAttributes: [],\n    beforeSanitizeElements: [],\n    beforeSanitizeShadowDOM: [],\n    uponSanitizeAttribute: [],\n    uponSanitizeElement: [],\n    uponSanitizeShadowNode: []\n  };\n};\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function _resolveSetOption(cfg, key, fallback, options) {\n  return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key]) ? addToSet(options.base ? clone(options.base) : {}, cfg[key], options.transform) : fallback;\n};\nfunction createDOMPurify() {\n  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n  const DOMPurify = root => createDOMPurify(root);\n  DOMPurify.version = '3.4.12';\n  DOMPurify.removed = [];\n  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n    // Not running in a browser, provide a factory function\n    // so that you can pass your own Window\n    DOMPurify.isSupported = false;\n    return DOMPurify;\n  }\n  let document = window.document;\n  const originalDocument = document;\n  const currentScript = originalDocument.currentScript;\n  window.DocumentFragment;\n    const HTMLTemplateElement = window.HTMLTemplateElement,\n    Node = window.Node,\n    Element = window.Element,\n    NodeFilter = window.NodeFilter,\n    _window$NamedNodeMap = window.NamedNodeMap;\n    _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap;\n    window.HTMLFormElement;\n    const DOMParser = window.DOMParser,\n    trustedTypes = window.trustedTypes;\n  const ElementPrototype = Element.prototype;\n  const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n  const remove = lookupGetter(ElementPrototype, 'remove');\n  const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n  const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n  const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n  const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n  const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n  const getNodeType = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n  const getNodeName = Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n  // As per issue #47, the web-components registry is inherited by a\n  // new document created via createHTMLDocument. As per the spec\n  // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n  // a new empty registry is used when creating a template contents owner\n  // document, so we use that as our parent document to ensure nothing\n  // is inherited.\n  if (typeof HTMLTemplateElement === 'function') {\n    const template = document.createElement('template');\n    if (template.content && template.content.ownerDocument) {\n      document = template.content.ownerDocument;\n    }\n  }\n  let trustedTypesPolicy;\n  let emptyHTML = '';\n  // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n  // `TRUSTED_TYPES_POLICY`, this is created at most once — Trusted Types throws\n  // on duplicate policy names — and is the only policy allowed to persist\n  // across configurations and survive `clearConfig()`.\n  let defaultTrustedTypesPolicy;\n  let defaultTrustedTypesPolicyResolved = false;\n  // Tracks whether we are already inside a call to the configured Trusted Types\n  // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n  // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n  // re-enter the policy and recurse until the stack overflows. We detect that\n  // re-entry and throw a clear, actionable error instead. The guard is shared\n  // across both callbacks, because either one re-entering `sanitize` triggers\n  // the same unbounded recursion.\n  let IN_TRUSTED_TYPES_POLICY = 0;\n  const _assertNotInTrustedTypesPolicy = function _assertNotInTrustedTypesPolicy() {\n    if (IN_TRUSTED_TYPES_POLICY > 0) {\n      throw typeErrorCreate('A configured TRUSTED_TYPES_POLICY callback (createHTML or ' + 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' + 'infinite recursion. Do not pass a policy whose callbacks wrap ' + 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' + 'Types\" section of the README.');\n    }\n  };\n  const _createTrustedHTML = function _createTrustedHTML(html) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createHTML(html);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  const _createTrustedScriptURL = function _createTrustedScriptURL(scriptUrl) {\n    _assertNotInTrustedTypesPolicy();\n    IN_TRUSTED_TYPES_POLICY++;\n    try {\n      return trustedTypesPolicy.createScriptURL(scriptUrl);\n    } finally {\n      IN_TRUSTED_TYPES_POLICY--;\n    }\n  };\n  // Lazily resolve (and cache) the instance's internal default policy.\n  // Resolution is attempted at most once: a successful `createPolicy` cannot be\n  // repeated (Trusted Types throws on duplicate names), and a failed or\n  // unsupported attempt must not be retried on every parse.\n  const _getDefaultTrustedTypesPolicy = function _getDefaultTrustedTypesPolicy() {\n    if (!defaultTrustedTypesPolicyResolved) {\n      defaultTrustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n      defaultTrustedTypesPolicyResolved = true;\n    }\n    return defaultTrustedTypesPolicy;\n  };\n  const _document = document,\n    implementation = _document.implementation,\n    createNodeIterator = _document.createNodeIterator,\n    createDocumentFragment = _document.createDocumentFragment,\n    getElementsByTagName = _document.getElementsByTagName;\n  const importNode = originalDocument.importNode;\n  let hooks = _createHooksMap();\n  /**\n   * Expose whether this browser supports running the full DOMPurify.\n   */\n  DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n  const MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n    ERB_EXPR$1 = ERB_EXPR,\n    TMPLIT_EXPR$1 = TMPLIT_EXPR,\n    DATA_ATTR$1 = DATA_ATTR,\n    ARIA_ATTR$1 = ARIA_ATTR,\n    IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n    ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n    CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n  let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\n  /**\n   * We consider the elements and attributes below to be safe. Ideally\n   * don't add any new ones but feel free to remove unwanted ones.\n   */\n  /* allowed element names */\n  let ALLOWED_TAGS = null;\n  const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n  /* Allowed attribute names */\n  let ALLOWED_ATTR = null;\n  const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n  /*\n   * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n   * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n   * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n   * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n   */\n  let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeNameCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    allowCustomizedBuiltInElements: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: false\n    }\n  }));\n  /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n  let FORBID_TAGS = null;\n  /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n  let FORBID_ATTR = null;\n  /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n  const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n    tagCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    },\n    attributeCheck: {\n      writable: true,\n      configurable: false,\n      enumerable: true,\n      value: null\n    }\n  }));\n  /* Decide if ARIA attributes are okay */\n  let ALLOW_ARIA_ATTR = true;\n  /* Decide if custom data attributes are okay */\n  let ALLOW_DATA_ATTR = true;\n  /* Decide if unknown protocols are okay */\n  let ALLOW_UNKNOWN_PROTOCOLS = false;\n  /* Decide if self-closing tags in attributes are allowed.\n   * Usually removed due to a mXSS issue in jQuery 3.0 */\n  let ALLOW_SELF_CLOSE_IN_ATTR = true;\n  /* Output should be safe for common template engines.\n   * This means, DOMPurify removes data attributes, mustaches and ERB\n   */\n  let SAFE_FOR_TEMPLATES = false;\n  /* Output should be safe even for XML used within HTML and alike.\n   * This means, DOMPurify removes comments when containing risky content.\n   */\n  let SAFE_FOR_XML = true;\n  /* Decide if document with <html>... should be returned */\n  let WHOLE_DOCUMENT = false;\n  /* Track whether config is already set on this instance of DOMPurify. */\n  let SET_CONFIG = false;\n  /* Pristine allowlist bindings captured at setConfig() time. On the\n   * persistent-config path sanitize() restores the sets from these before\n   * the per-walk hook clone-guard, so a hook's in-call widening cannot\n   * carry across calls. Null until setConfig() is called; reset by\n   * clearConfig(). */\n  let SET_CONFIG_ALLOWED_TAGS = null;\n  let SET_CONFIG_ALLOWED_ATTR = null;\n  /* Decide if all elements (e.g. style, script) must be children of\n   * document.body. By default, browsers might move them to document.head */\n  let FORCE_BODY = false;\n  /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n   * string (or a TrustedHTML object if Trusted Types are supported).\n   * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n   */\n  let RETURN_DOM = false;\n  /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n   * string  (or a TrustedHTML object if Trusted Types are supported) */\n  let RETURN_DOM_FRAGMENT = false;\n  /* Try to return a Trusted Type object instead of a string, return a string in\n   * case Trusted Types are not supported  */\n  let RETURN_TRUSTED_TYPE = false;\n  /* Output should be free from DOM clobbering attacks?\n   * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n   */\n  let SANITIZE_DOM = true;\n  /* Achieve full DOM Clobbering protection by isolating the namespace of named\n   * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n   *\n   * HTML/DOM spec rules that enable DOM Clobbering:\n   *   - Named Access on Window (§7.3.3)\n   *   - DOM Tree Accessors (§3.1.5)\n   *   - Form Element Parent-Child Relations (§4.10.3)\n   *   - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n   *   - HTMLCollection (§4.2.10.2)\n   *\n   * Namespace isolation is implemented by prefixing `id` and `name` attributes\n   * with a constant string, i.e., `user-content-`\n   */\n  let SANITIZE_NAMED_PROPS = false;\n  const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n  /* Keep element content when removing element? */\n  let KEEP_CONTENT = true;\n  /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n   * of importing it into a new Document and returning a sanitized copy */\n  let IN_PLACE = false;\n  /* Allow usage of profiles like html, svg and mathMl */\n  let USE_PROFILES = {};\n  /* Tags to ignore content of when KEEP_CONTENT is true */\n  let FORBID_CONTENTS = null;\n  const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script',\n  // <selectedcontent> mirrors the selected <option>'s subtree, cloned by\n  // the UA (customizable <select>) — including any on* handlers — and the\n  // engine re-mirrors synchronously whenever a removal changes which\n  // option/selectedcontent is current, even inside DOMPurify's inert\n  // DOMParser document. Hoisting its children on removal re-inserts a fresh\n  // mirror target ahead of the walk, which the engine refills, looping\n  // forever (DoS) and amplifying output. Dropping its content on removal\n  // (rather than hoisting) breaks that cascade; the content is a duplicate\n  // of the option, which is sanitized on its own. See campaign-3 F1/F6.\n  'selectedcontent', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n  /* Tags that are safe for data: URIs */\n  let DATA_URI_TAGS = null;\n  const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n  /* Attributes safe for values like \"javascript:\" */\n  let URI_SAFE_ATTRIBUTES = null;\n  const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n  const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n  const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n  const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n  /* Document namespace */\n  let NAMESPACE = HTML_NAMESPACE;\n  let IS_EMPTY_INPUT = false;\n  /* Allowed XHTML+XML namespaces */\n  let ALLOWED_NAMESPACES = null;\n  const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n  const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS = freeze(['mi', 'mo', 'mn', 'ms', 'mtext']);\n  let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);\n  const DEFAULT_HTML_INTEGRATION_POINTS = freeze(['annotation-xml']);\n  let HTML_INTEGRATION_POINTS = addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS);\n  // Certain elements are allowed in both SVG and HTML\n  // namespace. We need to specify them explicitly\n  // so that they don't get erroneously deleted from\n  // HTML namespace.\n  const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n  /* Parsing of strict XHTML documents */\n  let PARSER_MEDIA_TYPE = null;\n  const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n  const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n  let transformCaseFunc = null;\n  /* Keep a reference to config to pass to hooks */\n  let CONFIG = null;\n  /* Ideally, do not touch anything below this line */\n  /* ______________________________________________ */\n  const formElement = document.createElement('form');\n  const isRegexOrFunction = function isRegexOrFunction(testValue) {\n    return testValue instanceof RegExp || testValue instanceof Function;\n  };\n  /**\n   * _parseConfig\n   *\n   * @param cfg optional config literal\n   */\n  // eslint-disable-next-line complexity\n  const _parseConfig = function _parseConfig() {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (CONFIG && CONFIG === cfg) {\n      return;\n    }\n    /* Shield configuration object from tampering */\n    if (!cfg || typeof cfg !== 'object') {\n      cfg = {};\n    }\n    /* Shield configuration object from prototype pollution */\n    cfg = clone(cfg);\n    PARSER_MEDIA_TYPE =\n    // eslint-disable-next-line unicorn/prefer-includes\n    SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n    // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n    transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n    /* Set configuration parameters */\n    ALLOWED_TAGS = _resolveSetOption(cfg, 'ALLOWED_TAGS', DEFAULT_ALLOWED_TAGS, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_ATTR = _resolveSetOption(cfg, 'ALLOWED_ATTR', DEFAULT_ALLOWED_ATTR, {\n      transform: transformCaseFunc\n    });\n    ALLOWED_NAMESPACES = _resolveSetOption(cfg, 'ALLOWED_NAMESPACES', DEFAULT_ALLOWED_NAMESPACES, {\n      transform: stringToString\n    });\n    URI_SAFE_ATTRIBUTES = _resolveSetOption(cfg, 'ADD_URI_SAFE_ATTR', DEFAULT_URI_SAFE_ATTRIBUTES, {\n      transform: transformCaseFunc,\n      base: DEFAULT_URI_SAFE_ATTRIBUTES\n    });\n    DATA_URI_TAGS = _resolveSetOption(cfg, 'ADD_DATA_URI_TAGS', DEFAULT_DATA_URI_TAGS, {\n      transform: transformCaseFunc,\n      base: DEFAULT_DATA_URI_TAGS\n    });\n    FORBID_CONTENTS = _resolveSetOption(cfg, 'FORBID_CONTENTS', DEFAULT_FORBID_CONTENTS, {\n      transform: transformCaseFunc\n    });\n    FORBID_TAGS = _resolveSetOption(cfg, 'FORBID_TAGS', clone({}), {\n      transform: transformCaseFunc\n    });\n    FORBID_ATTR = _resolveSetOption(cfg, 'FORBID_ATTR', clone({}), {\n      transform: transformCaseFunc\n    });\n    USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;\n    ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n    ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n    ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n    ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n    SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n    SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n    WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n    RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n    RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n    RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n    FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n    SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n    SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n    KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n    IN_PLACE = cfg.IN_PLACE || false; // Default false\n    IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n    NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n    MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, DEFAULT_MATHML_TEXT_INTEGRATION_POINTS); // Default built-in map\n    HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, DEFAULT_HTML_INTEGRATION_POINTS); // Default built-in map\n    const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n    CUSTOM_ELEMENT_HANDLING = create(null);\n    if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n      CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n    }\n    if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n      CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\n    }\n    seal(CUSTOM_ELEMENT_HANDLING);\n    if (SAFE_FOR_TEMPLATES) {\n      ALLOW_DATA_ATTR = false;\n    }\n    if (RETURN_DOM_FRAGMENT) {\n      RETURN_DOM = true;\n    }\n    /* Parse profile info */\n    if (USE_PROFILES) {\n      ALLOWED_TAGS = addToSet({}, text);\n      ALLOWED_ATTR = create(null);\n      if (USE_PROFILES.html === true) {\n        addToSet(ALLOWED_TAGS, html$1);\n        addToSet(ALLOWED_ATTR, html);\n      }\n      if (USE_PROFILES.svg === true) {\n        addToSet(ALLOWED_TAGS, svg$1);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.svgFilters === true) {\n        addToSet(ALLOWED_TAGS, svgFilters);\n        addToSet(ALLOWED_ATTR, svg);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n      if (USE_PROFILES.mathMl === true) {\n        addToSet(ALLOWED_TAGS, mathMl$1);\n        addToSet(ALLOWED_ATTR, mathMl);\n        addToSet(ALLOWED_ATTR, xml);\n      }\n    }\n    /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n     * leaking across calls when switching from function to array config */\n    EXTRA_ELEMENT_HANDLING.tagCheck = null;\n    EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n    /* Merge configuration parameters */\n    if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n      if (typeof cfg.ADD_TAGS === 'function') {\n        EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n      } else if (arrayIsArray(cfg.ADD_TAGS)) {\n        if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n          ALLOWED_TAGS = clone(ALLOWED_TAGS);\n        }\n        addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n      if (typeof cfg.ADD_ATTR === 'function') {\n        EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n      } else if (arrayIsArray(cfg.ADD_ATTR)) {\n        if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n          ALLOWED_ATTR = clone(ALLOWED_ATTR);\n        }\n        addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n      }\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n      addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n    }\n    if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {\n      if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n        FORBID_CONTENTS = clone(FORBID_CONTENTS);\n      }\n      addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n    }\n    /* Add #text in case KEEP_CONTENT is set to true */\n    if (KEEP_CONTENT) {\n      ALLOWED_TAGS['#text'] = true;\n    }\n    /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n    if (WHOLE_DOCUMENT) {\n      addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n    }\n    /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n    if (ALLOWED_TAGS.table) {\n      addToSet(ALLOWED_TAGS, ['tbody']);\n      delete FORBID_TAGS.tbody;\n    }\n    // Re-derive the active Trusted Types policy from this configuration on\n    // every parse. The active policy must never be sticky closure state that\n    // outlives the config that set it: a caller-supplied policy left in place\n    // after `clearConfig()` — or after a later call that supplied none, or\n    // `TRUSTED_TYPES_POLICY: null` — could sign a subsequent \"default\"\n    // `RETURN_TRUSTED_TYPE` result with a foreign, possibly unsafe policy.\n    // See GHSA-vxr8-fq34-vvx9.\n    if (cfg.TRUSTED_TYPES_POLICY) {\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n      }\n      if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n        throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n      }\n      // A caller-supplied policy applies to this configuration only.\n      const previousTrustedTypesPolicy = trustedTypesPolicy;\n      trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n      // Sign local variables required by `sanitize`. If the supplied policy's\n      // `createHTML` is circular (i.e. it calls `DOMPurify.sanitize`), this\n      // throws via the re-entrancy guard. Restore the previous policy first so\n      // the instance is not left in a poisoned state. See #1422.\n      try {\n        emptyHTML = _createTrustedHTML('');\n      } catch (error) {\n        trustedTypesPolicy = previousTrustedTypesPolicy;\n        throw error;\n      }\n    } else if (cfg.TRUSTED_TYPES_POLICY === null) {\n      // Explicit opt-out for this call: perform no Trusted Types signing and\n      // create nothing (so a strict `trusted-types` CSP that disallows a\n      // `dompurify` policy can still call `sanitize` from inside its own\n      // policy — see #1422). Resetting to `undefined` rather than a sticky\n      // `null` also drops any previously retained caller policy, so it cannot\n      // resurface on a later call, while still allowing the next config-less\n      // call to restore the internal default policy. See GHSA-vxr8-fq34-vvx9.\n      trustedTypesPolicy = undefined;\n      emptyHTML = '';\n    } else {\n      // No policy supplied: keep the currently active policy if one is set — a\n      // previously supplied policy is intentionally sticky across config-less\n      // calls — otherwise fall back to the instance's own internal policy,\n      // created at most once. (A policy supplied for a *single* call still\n      // lingers by design; what must not linger is a policy whose configuration\n      // has been torn down via `clearConfig()`, which restores the default.)\n      if (trustedTypesPolicy === undefined) {\n        trustedTypesPolicy = _getDefaultTrustedTypesPolicy();\n      }\n      // Sign internal variables only when a policy is active. A falsy policy\n      // (Trusted Types unsupported, creation failed, or an explicit opt-out)\n      // leaves `emptyHTML` as a plain string, so we never call `.createHTML` on\n      // a non-policy and throw. See #1422.\n      if (trustedTypesPolicy && typeof emptyHTML === 'string') {\n        emptyHTML = _createTrustedHTML('');\n      }\n    }\n    // Prevent further manipulation of configuration.\n    // Not available in IE8, Safari 5, etc.\n    if (freeze) {\n      freeze(cfg);\n    }\n    CONFIG = cfg;\n  };\n  /* Keep track of all possible SVG and MathML tags\n   * so that we can perform the namespace checks\n   * correctly. */\n  const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n  const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n  /**\n   * Namespace rules for an element in the SVG namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkSvgNamespace = function _checkSvgNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to SVG\n    // is via <svg>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'svg';\n    }\n    // The only way to switch from MathML to SVG is via <svg>\n    // if the parent is either <annotation-xml> or a MathML\n    // text integration point.\n    if (parent.namespaceURI === MATHML_NAMESPACE) {\n      return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n    }\n    // We only allow elements that are defined in SVG\n    // spec. All others are disallowed in SVG namespace.\n    return Boolean(ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the MathML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkMathMlNamespace = function _checkMathMlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from HTML namespace to MathML\n    // is via <math>. If it happens via any other tag, then\n    // it should be killed.\n    if (parent.namespaceURI === HTML_NAMESPACE) {\n      return tagName === 'math';\n    }\n    // The only way to switch from SVG to MathML is via\n    // <math> and HTML integration points\n    if (parent.namespaceURI === SVG_NAMESPACE) {\n      return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n    }\n    // We only allow elements that are defined in MathML\n    // spec. All others are disallowed in MathML namespace.\n    return Boolean(ALL_MATHML_TAGS[tagName]);\n  };\n  /**\n   * Namespace rules for an element in the HTML namespace.\n   *\n   * @param tagName the element's lowercase tag name\n   * @param parent the (possibly simulated) parent node\n   * @param parentTagName the parent's lowercase tag name\n   * @returns true if a spec-compliant parser could produce this element\n   */\n  const _checkHtmlNamespace = function _checkHtmlNamespace(tagName, parent, parentTagName) {\n    // The only way to switch from SVG to HTML is via\n    // HTML integration points, and from MathML to HTML\n    // is via MathML text integration points\n    if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n      return false;\n    }\n    // We disallow tags that are specific for MathML\n    // or SVG and should never appear in HTML namespace\n    return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n  };\n  /**\n   * @param element a DOM element whose namespace is being checked\n   * @returns Return false if the element has a\n   *  namespace that a spec-compliant parser would never\n   *  return. Return true otherwise.\n   */\n  const _checkValidNamespace = function _checkValidNamespace(element) {\n    let parent = getParentNode(element);\n    // In JSDOM, if we're inside shadow DOM, then parentNode\n    // can be null. We just simulate parent in this case.\n    if (!parent || !parent.tagName) {\n      parent = {\n        namespaceURI: NAMESPACE,\n        tagName: 'template'\n      };\n    }\n    const tagName = stringToLowerCase(element.tagName);\n    const parentTagName = stringToLowerCase(parent.tagName);\n    if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return false;\n    }\n    if (element.namespaceURI === SVG_NAMESPACE) {\n      return _checkSvgNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === MATHML_NAMESPACE) {\n      return _checkMathMlNamespace(tagName, parent, parentTagName);\n    }\n    if (element.namespaceURI === HTML_NAMESPACE) {\n      return _checkHtmlNamespace(tagName, parent, parentTagName);\n    }\n    // For XHTML and XML documents that support custom namespaces\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n      return true;\n    }\n    // The code should never reach this place (this means\n    // that the element somehow got namespace that is not\n    // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n    // Return false just in case.\n    return false;\n  };\n  /**\n   * _forceRemove\n   *\n   * @param node a DOM node\n   */\n  const _forceRemove = function _forceRemove(node) {\n    arrayPush(DOMPurify.removed, {\n      element: node\n    });\n    try {\n      // eslint-disable-next-line unicorn/prefer-dom-node-remove\n      getParentNode(node).removeChild(node);\n    } catch (_) {\n      /* The normal detach failed — this is reached for a parentless node\n         (getParentNode() is null, so .removeChild throws). Element.prototype\n         .remove() is itself a spec no-op on a parentless node, so a recorded\n         \"removal\" would otherwise hand the caller back an intact,\n         payload-bearing node (e.g. a detached IN_PLACE root the mXSS canary or\n         the style-with-element-child rule decided to kill). Fail closed by\n         throwing — exactly as a clobbered root does at the IN_PLACE entry —\n         rather than trying to \"neutralize\" the node via its own methods.\n         Neutralizing would mean calling getAttributeNames()/removeAttribute()\n         on the node, both of which a <form> root can clobber via a named child\n         (and _isClobbered does not even probe getAttributeNames), so the\n         neutralize step could itself be silently defeated, leaving the payload\n         intact. A throw touches only the cached, clobber-safe remove() and\n         getParentNode(). Generalizes GHSA-r47g-fvhr-h676 (clobbered-form root)\n         to every root-kill reason. REPORT-3.\n                This lives inside the catch, so it never fires for a normally-removed\n         in-tree node: those have a parent, removeChild() succeeds, and the\n         catch is not entered. Only a kept (parentless) root reaches here. */\n      remove(node);\n      if (!getParentNode(node)) {\n        throw typeErrorCreate('a node selected for removal could not be detached from its tree ' + 'and cannot be safely returned; refusing to sanitize in place');\n      }\n    }\n  };\n  /**\n   * _neutralizeRoot\n   *\n   * Fail-closed teardown of an in-place root after the sanitize walk aborts\n   * (campaign-3 F2). An internal throw mid-walk — e.g. a page-registered\n   * custom element's reaction detaches a node so `_forceRemove`'s deliberate\n   * parentless guard throws, or any other re-entrant engine mutation — would\n   * otherwise leave the caller's *live* tree half-sanitized, with everything\n   * after the abort point still carrying its handlers. There is no safe way\n   * to resume the walk (the tree mutated under us), so we strip the root bare:\n   * remove every child and every attribute, then let the caller's catch see\n   * the original error. Clobber-safe (cached `remove`/`childNodes`/`attributes`\n   * getters; the root was already clobber-pre-flighted at the IN_PLACE entry).\n   *\n   * @param root the in-place root to empty\n   */\n  const _neutralizeRoot = function _neutralizeRoot(root) {\n    /* Strip every disallowed attribute (on* handlers included) off the whole\n       subtree BEFORE detaching anything. Detaching first would hand back\n       handler-bearing originals (e.g. an already-loading `<img onerror>`)\n       whose queued resource event still fires in page scope after we throw.\n       Clobber-safe reads; a doomed clobbered node's own attributes are\n       irrelevant while its non-clobbered descendants are reached and scrubbed. */\n    _neutralizeSubtree(root);\n    const childNodes = getChildNodes(root);\n    if (childNodes) {\n      const snapshot = [];\n      arrayForEach(childNodes, child => {\n        arrayPush(snapshot, child);\n      });\n      arrayForEach(snapshot, child => {\n        try {\n          remove(child);\n        } catch (_) {\n          /* Best-effort teardown; a still-attached child is handled below */\n        }\n      });\n    }\n    const attributes = getAttributes(root);\n    if (attributes) {\n      for (let i = attributes.length - 1; i >= 0; --i) {\n        const attribute = attributes[i];\n        const name = attribute && attribute.name;\n        if (typeof name === 'string') {\n          try {\n            root.removeAttribute(name);\n          } catch (_) {\n            /* Clobbered removeAttribute — ignore (fail-closed best effort) */\n          }\n        }\n      }\n    }\n  };\n  /**\n   * _removeAttribute\n   *\n   * @param name an Attribute name\n   * @param element a DOM node\n   */\n  const _removeAttribute = function _removeAttribute(name, element) {\n    try {\n      arrayPush(DOMPurify.removed, {\n        attribute: element.getAttributeNode(name),\n        from: element\n      });\n    } catch (_) {\n      arrayPush(DOMPurify.removed, {\n        attribute: null,\n        from: element\n      });\n    }\n    element.removeAttribute(name);\n    // We void attribute values for unremovable \"is\" attributes\n    if (name === 'is') {\n      if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n        try {\n          _forceRemove(element);\n        } catch (_) {}\n      } else {\n        try {\n          element.setAttribute(name, '');\n        } catch (_) {}\n      }\n    }\n  };\n  /**\n   * _stripDisallowedAttributes\n   *\n   * Removes every attribute the active configuration does not allow from a\n   * single element, using the same allowlist as the main attribute pass (so\n   * `on*` handlers go, but no `/^on/` blocklist is introduced). Used only to\n   * neutralise nodes that are being discarded from an in-place tree.\n   *\n   * @param element the element to strip\n   */\n  const _stripDisallowedAttributes = function _stripDisallowedAttributes(element) {\n    const attributes = getAttributes(element);\n    if (!attributes) {\n      return;\n    }\n    for (let i = attributes.length - 1; i >= 0; --i) {\n      const attribute = attributes[i];\n      const name = attribute && attribute.name;\n      if (typeof name !== 'string' || ALLOWED_ATTR[transformCaseFunc(name)]) {\n        continue;\n      }\n      try {\n        element.removeAttribute(name);\n      } catch (_) {\n        /* Clobbered removeAttribute on a doomed node — ignore */\n      }\n    }\n  };\n  /**\n   * _neutralizeSubtree\n   *\n   * Completes the audit-5 F1 fix across every removal path. The KEEP_CONTENT\n   * move-hoist neutralises only disallowed-tag removals; clobber, mXSS-canary,\n   * namespace, comment, processing-instruction and KEEP_CONTENT:false removals\n   * all drop their subtree wholesale via `_forceRemove`. On the IN_PLACE path\n   * those dropped nodes are detached from the caller's LIVE tree but a\n   * handler-bearing original among them (an `<img onerror>`/`<video>` that was\n   * loading) keeps its queued resource event, which fires in page scope after\n   * sanitize returns. This walks a removed subtree and strips every attribute\n   * the active configuration does not allow — so `on*` handlers are cancelled\n   * through the SAME allowlist that governs kept nodes, not a separate `/^on/`\n   * blocklist. Run synchronously before sanitize returns, i.e. before any\n   * queued event can fire. Hook-free by design: these nodes leave the output,\n   * so firing attribute hooks for them would be surprising. Clobber-safe reads;\n   * a doomed clobbered node may shadow `removeAttribute` (its own attributes are\n   * irrelevant — it is discarded — while its non-clobbered descendants, e.g.\n   * the `<img>`, are reached and scrubbed).\n   *\n   * @param root the root of a removed subtree to neutralise\n   */\n  const _neutralizeSubtree = function _neutralizeSubtree(root) {\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      if (nodeType === NODE_TYPE.element) {\n        _stripDisallowedAttributes(node);\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _neutralizePatchLinkage\n   *\n   * IN_PLACE entry pre-pass (declarative-partial-updates / streaming\n   * hardening, https://github.com/WICG/declarative-partial-updates).\n   *\n   * The main walk strips patch linkage (`for`/`patchsrc`) and removes range\n   * markers (PIs / markup comments) node-by-node, in document order, AS it\n   * reaches each node. On a live in-place root that leaves a window: from the\n   * moment the root is connected until the walk arrives at a given node, that\n   * node's linkage is live. A patch applied on connection/stream can fire as\n   * a microtask during the walk and inject or teleport an unsanitized DOM\n   * range into a region the iterator has already passed and will not revisit,\n   * so the post-return \"tree is sanitized\" contract is violated. Sweep the\n   * whole tree once up front and sever every linkage before the walk begins,\n   * closing that window.\n   *\n   * This CANNOT undo a patch that already fired before sanitize ran — that is\n   * the irreducible \"do not IN_PLACE a live-connected attacker tree\" caveat —\n   * but it closes everything from sanitize-start onward. Gated on SAFE_FOR_XML\n   * to group with the rest of the declarative-partial-updates handling and\n   * stay overridable, consistent with the codebase.\n   *\n   * Clobber-safe traversal (cached childNodes getter); per-node try/catch so a\n   * clobbered root cannot defeat the sweep of its non-clobbered descendants.\n   *\n   * NOTE (pending real-Chrome confirmation, see test/declarative-patch-probe\n   * .html Q1): this mirrors the existing policy of keeping `for` on\n   * <label>/<output>. If the shipping feature can drive a patch through a\n   * surviving `for`-on-label/output + `id` pair, this pre-pass and the\n   * attribute check at _isBasicCustomElement's caller must additionally drop\n   * that pair on the IN_PLACE path. Left as-is until the taxonomy is verified.\n   *\n   * @param root the in-place root to sweep\n   */\n  const _neutralizePatchLinkage = function _neutralizePatchLinkage(root) {\n    if (!SAFE_FOR_XML) {\n      return;\n    }\n    const stack = [root];\n    while (stack.length > 0) {\n      const node = stack.pop();\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      /* Remove range markers (the target side of a patch linkage): every\n         processing instruction, and any markup-bearing comment. */\n      if (nodeType === NODE_TYPE.processingInstruction || nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, node.data)) {\n        try {\n          remove(node);\n        } catch (_) {\n          /* Best-effort */\n        }\n        continue;\n      }\n      /* Strip patch-source attributes (the source side) off elements. */\n      if (nodeType === NODE_TYPE.element) {\n        const element = node;\n        const lcTag = transformCaseFunc(getNodeName ? getNodeName(node) : node.nodeName);\n        try {\n          if (element.hasAttribute && element.hasAttribute('patchsrc')) {\n            element.removeAttribute('patchsrc');\n          }\n          if (element.hasAttribute && element.hasAttribute('for') && lcTag !== 'label' && lcTag !== 'output') {\n            element.removeAttribute('for');\n          }\n        } catch (_) {\n          /* Clobbered removeAttribute/hasAttribute on a doomed node — ignore */\n        }\n      }\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push(childNodes[i]);\n        }\n      }\n    }\n  };\n  /**\n   * _initDocument\n   *\n   * @param dirty - a string of dirty markup\n   * @return a DOM, filled with the dirty markup\n   */\n  const _initDocument = function _initDocument(dirty) {\n    /* Create a HTML document */\n    let doc = null;\n    let leadingWhitespace = null;\n    if (FORCE_BODY) {\n      dirty = '<remove></remove>' + dirty;\n    } else {\n      /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n      const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n      leadingWhitespace = matches && matches[0];\n    }\n    if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n      // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n      dirty = '<html xmlns=\"http://www.w3.org/1999/xhtml\"><head></head><body>' + dirty + '</body></html>';\n    }\n    const dirtyPayload = trustedTypesPolicy ? _createTrustedHTML(dirty) : dirty;\n    /*\n     * Use the DOMParser API by default, fallback later if needs be\n     * DOMParser not work for svg when has multiple root element.\n     */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      try {\n        doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n      } catch (_) {}\n    }\n    /* Use createHTMLDocument in case DOMParser is not available */\n    if (!doc || !doc.documentElement) {\n      doc = implementation.createDocument(NAMESPACE, 'template', null);\n      try {\n        doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n      } catch (_) {\n        // Syntax error if dirtyPayload is invalid xml\n      }\n    }\n    const body = doc.body || doc.documentElement;\n    if (dirty && leadingWhitespace) {\n      body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n    }\n    /* Work on whole document or just its body */\n    if (NAMESPACE === HTML_NAMESPACE) {\n      return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n    }\n    return WHOLE_DOCUMENT ? doc.documentElement : body;\n  };\n  /**\n   * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n   *\n   * @param root The root element or node to start traversing on.\n   * @return The created NodeIterator\n   */\n  const _createNodeIterator = function _createNodeIterator(root) {\n    return createNodeIterator.call(root.ownerDocument || root, root,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n  };\n  /**\n   * Replace template expression syntax (mustache, ERB, template\n   * literal) with a space; shared by all SAFE_FOR_TEMPLATES scrub\n   * sites. Order matters: mustache, then ERB, then template literal.\n   *\n   * @param value the string to scrub\n   * @returns the scrubbed string\n   */\n  const _stripTemplateExpressions = function _stripTemplateExpressions(value) {\n    value = stringReplace(value, MUSTACHE_EXPR$1, ' ');\n    value = stringReplace(value, ERB_EXPR$1, ' ');\n    value = stringReplace(value, TMPLIT_EXPR$1, ' ');\n    return value;\n  };\n  /**\n   * Strip template-engine expressions ({{...}}, ${...}, <%...%>) from the\n   * character data of an element subtree. Used as the final safety net for\n   * SAFE_FOR_TEMPLATES on every DOM-returning code path so that expressions\n   * which only form after text-node normalization (e.g. fragments split across\n   * stripped elements) cannot survive into a template-evaluating framework.\n   *\n   * Walks text/comment/CDATA/processing-instruction nodes and mutates `.data`\n   * in place rather than round-tripping through innerHTML. This preserves\n   * descendant node references (important for IN_PLACE callers), avoids a\n   * serialize/reparse cycle, and reads literal character data — which means\n   * `<%...%>` in text content matches the ERB regex against its real bytes\n   * instead of the HTML-entity-escaped form innerHTML would produce.\n   *\n   * Attribute values are not visited here; SAFE_FOR_TEMPLATES handling for\n   * attributes is performed during the per-node `_sanitizeAttributes` pass.\n   *\n   * @param node The root element whose character data should be scrubbed.\n   */\n  const _scrubTemplateExpressions2 = function _scrubTemplateExpressions(node) {\n    var _node$querySelectorAl;\n    node.normalize();\n    const walker = createNodeIterator.call(node.ownerDocument || node, node,\n    // eslint-disable-next-line no-bitwise\n    NodeFilter.SHOW_TEXT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_CDATA_SECTION | NodeFilter.SHOW_PROCESSING_INSTRUCTION, null);\n    let currentNode = walker.nextNode();\n    while (currentNode) {\n      currentNode.data = _stripTemplateExpressions(currentNode.data);\n      currentNode = walker.nextNode();\n    }\n    // NodeIterator does not descend into <template>.content per the DOM spec,\n    // so we must explicitly recurse into each template's content fragment,\n    // mirroring the approach used by _sanitizeShadowDOM.\n    const templates = (_node$querySelectorAl = node.querySelectorAll) === null || _node$querySelectorAl === void 0 ? void 0 : _node$querySelectorAl.call(node, 'template');\n    if (templates) {\n      arrayForEach(templates, tmpl => {\n        if (_isDocumentFragment(tmpl.content)) {\n          _scrubTemplateExpressions2(tmpl.content);\n        }\n      });\n    }\n  };\n  /**\n   * _isClobbered\n   *\n   * Detect DOM-clobbering on HTMLFormElement nodes. Form is the only HTML\n   * interface with [LegacyOverrideBuiltIns]; a descendant element with a\n   * `name` attribute matching a prototype property shadows that property\n   * on direct reads. We use this check at the IN_PLACE entry-point and\n   * during attribute sanitization to refuse clobbered forms.\n   *\n   * @param element element to check for clobbering attacks\n   * @return true if clobbered, false if safe\n   */\n  const _isClobbered = function _isClobbered(element) {\n    // Realm-independent tag-name probe. If we can't determine the tag\n    // name at all, we can't reason about clobbering — return false\n    // (the caller's other defences still apply).\n    const realTagName = getNodeName ? getNodeName(element) : null;\n    if (typeof realTagName !== 'string') {\n      return false;\n    }\n    if (transformCaseFunc(realTagName) !== 'form') {\n      return false;\n    }\n    return typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' ||\n    // Realm-safe NamedNodeMap detection: equality against the cached\n    // prototype getter. Clobbered .attributes (e.g. <input name=\"attributes\">)\n    // makes the direct read diverge from the cached read; a clean form\n    // (same-realm OR foreign-realm) has both reads pointing at the same\n    // canonical NamedNodeMap.\n    element.attributes !== getAttributes(element) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function' ||\n    // NodeType clobbering probe. Cached Node.prototype.nodeType getter\n    // returns the integer 1 for any Element regardless of realm; direct\n    // read on a clobbered form (e.g. <input name=\"nodeType\">) returns\n    // the named child element. Cheap addition — nodeType is read from\n    // an internal slot, no serialization cost — and removes a residual\n    // clobbering surface used by several mXSS / PI / comment branches\n    // in _sanitizeElements that compare currentNode.nodeType directly.\n    element.nodeType !== getNodeType(element) ||\n    // HTMLFormElement has [LegacyOverrideBuiltIns]: a descendant named\n    // \"childNodes\" shadows the prototype getter. Direct reads of\n    // form.childNodes from a clobbered form return the named child\n    // instead of the real NodeList, so any walk that reads it directly\n    // skips the form's real children. Compare the direct read to the\n    // cached Node.prototype getter — when the form's named-property\n    // getter intercepts the read, the two values differ and we flag\n    // the form. This catches every clobbering child type (input,\n    // select, etc.) regardless of whether the named child happens to\n    // carry a numeric .length, which a typeof-based probe would miss\n    // (e.g. HTMLSelectElement.length is a defined unsigned-long).\n    element.childNodes !== getChildNodes(element);\n  };\n  /**\n   * Checks whether the given value is a DocumentFragment from any realm.\n   *\n   * The realm-independent replacement reads `nodeType` through the cached\n   * Node.prototype getter and compares to the DOCUMENT_FRAGMENT_NODE\n   * constant (11). nodeType is a numeric value resolved from the node's\n   * internal slot, identical across realms for the same kind of node.\n   *\n   * @param value object to check\n   * @return true if value is a DocumentFragment-shaped node from any realm\n   */\n  const _isDocumentFragment = function _isDocumentFragment(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return getNodeType(value) === NODE_TYPE.documentFragment;\n    } catch (_) {\n      return false;\n    }\n  };\n  /**\n   * Checks whether the given object is a DOM node, including nodes that\n   * originate from a different window/realm (e.g. an iframe's\n   * contentDocument). The previous `value instanceof Node` check was\n   * realm-bound: nodes from a different window failed it, causing\n   * sanitize() to silently stringify them and reset IN_PLACE to false,\n   * returning the original node unsanitized. See GHSA-4w3q-35jp-p934.\n   *\n   * @param value object to check whether it's a DOM node\n   * @return true if value is a DOM node from any realm\n   */\n  const _isNode = function _isNode(value) {\n    if (!getNodeType || typeof value !== 'object' || value === null) {\n      return false;\n    }\n    try {\n      return typeof getNodeType(value) === 'number';\n    } catch (_) {\n      return false;\n    }\n  };\n  function _executeHooks(hooks, currentNode, data) {\n    if (hooks.length === 0) {\n      return;\n    }\n    arrayForEach(hooks, hook => {\n      hook.call(DOMPurify, currentNode, data, CONFIG);\n    });\n  }\n  /**\n   * Structural-threat checks that condemn a node regardless of the\n   * allowlists: mXSS via namespace confusion, risky CSS construction,\n   * processing instructions, markup-bearing comments. Pure predicate;\n   * the caller removes. Check order is load-bearing.\n   *\n   * @param currentNode the node to inspect\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node must be removed\n   */\n  const _isUnsafeNode = function _isUnsafeNode(currentNode, tagName) {\n    /* Detect mXSS attempts abusing namespace confusion */\n    if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.textContent) && regExpTest(ELEMENT_MARKUP_PROBE, currentNode.innerHTML)) {\n      return true;\n    }\n    /* Remove risky CSS construction leading to mXSS */\n    if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\n      return true;\n    }\n    /* Remove any occurrence of processing instructions */\n    if (currentNode.nodeType === NODE_TYPE.processingInstruction) {\n      return true;\n    }\n    /* Remove any kind of possibly harmful comments */\n    if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(COMMENT_MARKUP_PROBE, currentNode.data)) {\n      return true;\n    }\n    return false;\n  };\n  /**\n   * Handle a node whose tag is forbidden or not allowlisted: keep\n   * allowed custom elements (false return exits _sanitizeElements\n   * early - the namespace and fallback-tag removal checks are\n   * intentionally skipped for kept custom elements), else hoist\n   * content per KEEP_CONTENT and remove.\n   *\n   * A kept custom element is the ONLY case in which this function\n   * returns false, so the caller uses that return value to run the\n   * afterSanitizeElements hook on the kept element and keep the\n   * element-hook lifecycle consistent with normal allowlisted\n   * elements (GHSA-c2j3-45gr-mqc4).\n   *\n   * @param currentNode the disallowed node\n   * @param tagName the node's transformCaseFunc'd tag name\n   * @return true if the node was removed, false if kept\n   */\n  const _sanitizeDisallowedNode = function _sanitizeDisallowedNode(currentNode, tagName) {\n    /* Check if we have a custom element to handle */\n    if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n        return false;\n      }\n      if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n        return false;\n      }\n    }\n    /* Keep content except for bad-listed elements.\n         Use the cached prototype getters exclusively — the previous code\n         had `|| currentNode.parentNode` / `|| currentNode.childNodes`\n         fallbacks, but the cached getters always return the canonical\n         value (or null for a real parent-less node), so the fallback\n         path was dead in safe cases and a clobbering surface in unsafe\n         ones. Falsy cached results stay falsy; the `if (childNodes &&\n         parentNode)` check already gates correctly. */\n    if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n      const parentNode = getParentNode(currentNode);\n      const childNodes = getChildNodes(currentNode);\n      if (childNodes && parentNode) {\n        const childCount = childNodes.length;\n        /* In-place: hoist the *original* children so the iterator visits\n             and sanitises them through the same allowlist pass as every other\n             node. The caller built the tree in the live document, so the\n             originals carry already-queued resource events (`<img onerror>`,\n             `<video>`/`<audio>` error, lazy/`onload`, …); cloning would leave\n             those originals detached but still armed, firing in page scope\n             while the returned tree looked clean. Moving is safe in-place: the\n             root is pre-validated as an allowed tag and so is never the node\n             being removed, which keeps `parentNode` inside the iterator root\n             and the relocated child inside the serialised tree.\n                      Otherwise (string / DOM-copy paths): clone. The iterator is rooted\n             at — and the result serialised from — `body`, so a restrictive\n             ALLOWED_TAGS that removes `body` itself must leave its content in\n             place, which only cloning does; and those paths parse into an\n             inert document, so their discarded originals never had a queued\n             event to neutralise.\n                      `childNodes` is live; a tail-to-head walk keeps `childNodes[i]`\n             valid whether we move (drops the trailing entry) or clone (leaves\n             the list intact). */\n        for (let i = childCount - 1; i >= 0; --i) {\n          const hoisted = IN_PLACE ? childNodes[i] : cloneNode(childNodes[i], true);\n          parentNode.insertBefore(hoisted, getNextSibling(currentNode));\n        }\n      }\n    }\n    _forceRemove(currentNode);\n    return true;\n  };\n  /**\n   * _sanitizeElements\n   *\n   * @protect nodeName\n   * @protect textContent\n   * @protect removeChild\n   * @param currentNode to check for permission to exist\n   * @return true if node was killed, false if left alive\n   */\n  // eslint-disable-next-line complexity\n  const _sanitizeElements = function _sanitizeElements(currentNode, root) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n    /* A hook may have detached the node — treat it as removed (see the\n       detached-node comment after the uponSanitizeElement hook below). */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      return true;\n    }\n    /* Check if element is clobbered or can clobber */\n    if (_isClobbered(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Now let's check the element's type and name */\n    const tagName = transformCaseFunc(getNodeName ? getNodeName(currentNode) : currentNode.nodeName);\n    /* Execute a hook if present */\n    _executeHooks(hooks.uponSanitizeElement, currentNode, {\n      tagName,\n      allowedTags: ALLOWED_TAGS\n    });\n    /* A hook may have detached the node from the tree — a long-standing\n       user pattern (issue #469; draw.io-style foreignObject filtering).\n       Per the cached, unclobberable parentNode getter the node is\n       genuinely out of the tree, so it can reach neither the serialized\n       output nor an IN_PLACE live tree; treat it as removed and stop\n       processing it. Without this guard, the unsafe-node / namespace\n       checks below would call _forceRemove on a parentless node and hit\n       the REPORT-3 fail-closed throw — which exists for nodes DOMPurify\n       wants gone but *cannot* detach (clobbered / parentless roots), the\n       opposite of a node that is already safely gone. The walk root is\n       exempt: a detached IN_PLACE root is legitimate input and must still\n       be fully sanitized, and a kill-decision on it must keep hitting the\n       REPORT-3 throw. Nodes detached by hooks are the hook's\n       responsibility: they are not recorded in DOMPurify.removed and are\n       not neutralized by the post-walk IN_PLACE pass. */\n    if (currentNode !== root && getParentNode(currentNode) === null) {\n      return true;\n    }\n    /* Remove mXSS vectors, processing instructions and risky comments */\n    if (_isUnsafeNode(currentNode, tagName)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Remove element if anything forbids its presence */\n    if (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_TAGS[tagName]) {\n      const removed = _sanitizeDisallowedNode(currentNode, tagName);\n      /* A false return means the node is a custom element kept via\n         CUSTOM_ELEMENT_HANDLING - the only keep path through\n         _sanitizeDisallowedNode. Run afterSanitizeElements on it so the\n         element-hook lifecycle matches normal allowlisted elements: a\n         security policy applied in this hook (e.g. stripping an attribute\n         from every surviving element) must not silently skip kept custom\n         elements (GHSA-c2j3-45gr-mqc4). This mirrors the normal-element\n         tail below - the hook runs, then the walker's subsequent\n         _sanitizeAttributes pass sanitizes the element's attributes. The\n         deliberately skipped namespace and fallback-tag removal checks stay\n         skipped; they are removal decisions, not the hook contract. */\n      if (removed === false) {\n        _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n      }\n      return removed;\n    }\n    /* Check whether element has a valid namespace.\n       Realm-safe check (GHSA-hpcv-96wg-7vj8): use the cached Node.prototype\n       nodeType getter rather than `instanceof Element`, which is realm-\n       bound and short-circuits to false for any node minted in a different\n       realm — letting a foreign-realm element with a forbidden namespace\n       slip past the namespace check entirely. */\n    const nt = getNodeType ? getNodeType(currentNode) : currentNode.nodeType;\n    if (nt === NODE_TYPE.element && !_checkValidNamespace(currentNode)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Make sure that older browsers don't get fallback-tag mXSS */\n    if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(FALLBACK_TAG_CLOSE, currentNode.innerHTML)) {\n      _forceRemove(currentNode);\n      return true;\n    }\n    /* Sanitize element content to be template-safe */\n    if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n      /* Get the element's text content */\n      const content = _stripTemplateExpressions(currentNode.textContent);\n      if (currentNode.textContent !== content) {\n        arrayPush(DOMPurify.removed, {\n          element: currentNode.cloneNode()\n        });\n        currentNode.textContent = content;\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n    return false;\n  };\n  /**\n   * _isValidAttribute\n   *\n   * @param lcTag Lowercase tag name of containing element.\n   * @param lcName Lowercase attribute name.\n   * @param value Attribute value.\n   * @return Returns true if `value` is valid, otherwise false.\n   */\n  // eslint-disable-next-line complexity\n  const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n    /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n    if (FORBID_ATTR[lcName]) {\n      return false;\n    }\n    /* Reject declarative-partial-updates patch-linkage attributes\n       (https://github.com/WICG/declarative-partial-updates).\n            Empirical note (Chrome 150, verified — see\n       test/declarative-patch-probe-v3.html): expansion is NOT applied after\n       sanitization. For the string path it fires during sanitize()'s own\n       parse, so the walk sees and sanitizes the fully materialized expanded\n       tree — teleports into MathML/SVG integration points included; a\n       weaponized `<template for>`->`<img onerror>` comes back with the handler\n       stripped. For the IN_PLACE path it fires on connection, before the walk.\n       Either way DOMPurify is NOT blind to the patch.\n            This removal is therefore defense-in-depth rather than the sole barrier:\n       it prevents live linkage from surviving into the OUTPUT and re-expanding\n       in the caller's context, and keeps behaviour deterministic if a future\n       engine defers expansion. `for` is legitimate only on <label>/<output>;\n       anywhere else (notably <template for>) it links the element to a patch\n       target and teleports or removes an arbitrary DOM range by id/marker name.\n       `patchsrc` fetches remote markup and is treated as a script-loading\n       mechanism (CSP). Gated on SAFE_FOR_XML so the removal groups with the\n       other structural-threat checks and stays overridable, consistent with\n       the rest of the codebase. PI range markers are already removed by\n       _isUnsafeNode. */\n    if (SAFE_FOR_XML && lcName === 'patchsrc') {\n      return false;\n    }\n    if (SAFE_FOR_XML && lcName === 'for' && lcTag !== 'label' && lcTag !== 'output') {\n      return false;\n    }\n    /* Make sure attribute cannot clobber */\n    if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n      return false;\n    }\n    const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\n    /* Allow valid data-* attributes: At least one character after \"-\"\n        (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n        XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n        We don't need to check the value; it's always URI safe. */\n    if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!nameIsPermitted) {\n      if (\n      // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n      // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n      _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n      // Alternative, second condition checks if it's an `is`-attribute, AND\n      // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n      lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n        return false;\n      }\n      /* Check value is safe. First, is attr inert? If so, is safe */\n    } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (value) {\n      return false;\n    } else ;\n    return true;\n  };\n  /* Names the HTML spec reserves from valid-custom-element-name; these must\n   * never be treated as basic custom elements even when a permissive\n   * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n  const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\n  /**\n   * _isBasicCustomElement\n   * checks if at least one dash is included in tagName, and it's not the first char\n   * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n   *\n   * @param tagName name of the tag of the node to sanitize\n   * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n   */\n  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n    return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\n  };\n  /**\n   * Wrap an attribute value in the matching Trusted Types object when\n   * the active policy requires it. Namespaced attributes pass through\n   * unchanged (no TT support yet, see\n   * https://bugs.chromium.org/p/chromium/issues/detail?id=1305293).\n   *\n   * @param lcTag lowercase tag name of the containing element\n   * @param lcName lowercase attribute name\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the attribute value to wrap\n   * @return the value, wrapped when Trusted Types demand it\n   */\n  const _applyTrustedTypesToAttribute = function _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value) {\n    if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function' && !namespaceURI) {\n      switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n        case 'TrustedHTML':\n          {\n            return _createTrustedHTML(value);\n          }\n        case 'TrustedScriptURL':\n          {\n            return _createTrustedScriptURL(value);\n          }\n      }\n    }\n    return value;\n  };\n  /**\n   * Write a modified attribute value back onto the element. On\n   * success, re-probe for clobbering introduced by the new value and\n   * remove the element when found; otherwise pop the removal entry\n   * recorded by the earlier _removeAttribute (long-standing pairing\n   * with the SANITIZE_NAMED_PROPS path - do not \"fix\" casually). On\n   * failure, remove the attribute instead.\n   *\n   * @param currentNode the element carrying the attribute\n   * @param name the attribute name as present on the element\n   * @param namespaceURI the attribute's namespace, if any\n   * @param value the new attribute value\n   */\n  const _setAttributeValue = function _setAttributeValue(currentNode, name, namespaceURI, value) {\n    try {\n      if (namespaceURI) {\n        currentNode.setAttributeNS(namespaceURI, name, value);\n      } else {\n        /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n        currentNode.setAttribute(name, value);\n      }\n      if (_isClobbered(currentNode)) {\n        _forceRemove(currentNode);\n      } else {\n        arrayPop(DOMPurify.removed);\n      }\n    } catch (_) {\n      _removeAttribute(name, currentNode);\n    }\n  };\n  /**\n   * _sanitizeAttributes\n   *\n   * @protect attributes\n   * @protect nodeName\n   * @protect removeAttribute\n   * @protect setAttribute\n   *\n   * @param currentNode to sanitize\n   */\n  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n    const attributes = currentNode.attributes;\n    /* Check if we have attributes; if not we might have a text node */\n    if (!attributes || _isClobbered(currentNode)) {\n      return;\n    }\n    const hookEvent = {\n      attrName: '',\n      attrValue: '',\n      keepAttr: true,\n      allowedAttributes: ALLOWED_ATTR,\n      forceKeepAttr: undefined\n    };\n    let l = attributes.length;\n    const lcTag = transformCaseFunc(currentNode.nodeName);\n    /* Go backwards over all attributes; safely remove bad ones */\n    while (l--) {\n      const attr = attributes[l];\n      const name = attr.name,\n        namespaceURI = attr.namespaceURI,\n        attrValue = attr.value;\n      const lcName = transformCaseFunc(name);\n      const initValue = attrValue;\n      let value = name === 'value' ? initValue : stringTrim(initValue);\n      /* Execute a hook if present */\n      hookEvent.attrName = lcName;\n      hookEvent.attrValue = value;\n      hookEvent.keepAttr = true;\n      hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n      _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n      value = hookEvent.attrValue;\n      /* Full DOM Clobbering protection via namespace isolation,\n       * Prefix id and name attributes with `user-content-`\n       */\n      if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\n        // Remove the attribute with this value\n        _removeAttribute(name, currentNode);\n        // Prefix the value and later re-create the attribute with the sanitized value\n        value = SANITIZE_NAMED_PROPS_PREFIX + value;\n      }\n      // Else: already prefixed, leave the attribute alone — the prefix is\n      // itself the clobbering protection, and re-applying it is incorrect.\n      /* Work around a security issue with comments inside attributes */\n      if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n      if (lcName === 'attributename' && stringMatch(value, 'href')) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Did the hooks force-keep the attribute? */\n      if (hookEvent.forceKeepAttr) {\n        continue;\n      }\n      /* Did the hooks approve of the attribute? */\n      if (!hookEvent.keepAttr) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Work around a security issue in jQuery 3.0 */\n      if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(SELF_CLOSING_TAG, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Sanitize attribute content to be template-safe */\n      if (SAFE_FOR_TEMPLATES) {\n        value = _stripTemplateExpressions(value);\n      }\n      /* Is `value` valid for this attribute? */\n      if (!_isValidAttribute(lcTag, lcName, value)) {\n        _removeAttribute(name, currentNode);\n        continue;\n      }\n      /* Handle attributes that require Trusted Types */\n      value = _applyTrustedTypesToAttribute(lcTag, lcName, namespaceURI, value);\n      /* Handle invalid data-* attribute set by try-catching it */\n      if (value !== initValue) {\n        _setAttributeValue(currentNode, name, namespaceURI, value);\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n  };\n  /**\n   * _sanitizeShadowDOM\n   *\n   * @param fragment to iterate over recursively\n   */\n  const _sanitizeShadowDOM2 = function _sanitizeShadowDOM(fragment) {\n    let shadowNode = null;\n    const shadowIterator = _createNodeIterator(fragment);\n    /* Execute a hook if present */\n    _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n    while (shadowNode = shadowIterator.nextNode()) {\n      /* Execute a hook if present */\n      _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n      /* Sanitize tags and elements */\n      _sanitizeElements(shadowNode, fragment);\n      /* Check attributes next */\n      _sanitizeAttributes(shadowNode);\n      /* Deep shadow DOM detected.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): use nodeType against the\n         DOCUMENT_FRAGMENT_NODE constant rather than instanceof, so we\n         recurse into <template>.content from foreign realms too. */\n      if (_isDocumentFragment(shadowNode.content)) {\n        _sanitizeShadowDOM2(shadowNode.content);\n      }\n      /* An element iterated here may itself host an attached\n         shadow root. The default NodeIterator does not enter shadow\n         trees, so a shadow root nested inside template.content was\n         previously reached by no walk at all (the pre-pass at\n         _sanitizeAttachedShadowRoots descends via childNodes, which\n         doesn't enter template.content; the template-content recursion\n         above iterates the content but never inspected shadowRoot).\n         Walk it explicitly. The nodeType guard avoids reading\n         shadowRoot off text / comment / CDATA / PI nodes that the\n         iterator also surfaces. */\n      const shadowNodeType = getNodeType ? getNodeType(shadowNode) : shadowNode.nodeType;\n      if (shadowNodeType === NODE_TYPE.element) {\n        const innerSr = getShadowRoot(shadowNode);\n        if (_isDocumentFragment(innerSr)) {\n          _sanitizeAttachedShadowRoots(innerSr);\n          _sanitizeShadowDOM2(innerSr);\n        }\n      }\n    }\n    /* Execute a hook if present */\n    _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n  };\n  /**\n   * _sanitizeAttachedShadowRoots\n   *\n   * Walks `root` and feeds every attached shadow root we encounter into\n   * the existing _sanitizeShadowDOM pipeline. The default node iterator\n   * does not descend into shadow trees, so nodes inside an attached\n   * shadow root would otherwise be skipped entirely.\n   *\n   * Two real input paths put attached shadow roots in front of us:\n   *   1. IN_PLACE on a DOM node that already has shadow roots attached.\n   *   2. DOM-node input where importNode(dirty, true) deep-clones the\n   *      shadow root because it was created with `clonable: true`.\n   *\n   * This pass runs once, up front, so the main iteration loop (and the\n   * existing _sanitizeShadowDOM template-content recursion) stay\n   * untouched — string-input paths are not affected.\n   *\n   * @param root the subtree root to walk for attached shadow roots\n   */\n  const _sanitizeAttachedShadowRoots = function _sanitizeAttachedShadowRoots(root) {\n    /* Iterative (explicit stack) rather than per-child recursion. DOM APIs\n       impose no depth cap, so an attacker-shaped tree (JSON/CRDT/editor data\n       built straight into the DOM — the IN_PLACE surface) deeper than the JS\n       call-stack budget would otherwise overflow native recursion here and\n       throw at the IN_PLACE entry pre-pass, before a single node is\n       sanitized, leaving the caller's live tree untouched (fail-open). See\n       campaign-3 F4. A heap stack keeps depth off the call stack.\n            Each work item is either a node to descend into, or a deferred\n       `_sanitizeShadowDOM` for an already-walked shadow root. The deferred\n       form preserves the original post-order discipline: a shadow root's\n       nested shadow roots are discovered before the outer shadow is\n       sanitized (which may remove hosts). Pushes are in reverse of the\n       desired processing order (LIFO): template content, then children, then\n       the shadow-sanitize, then the shadow walk — so the order matches the\n       previous recursion exactly. */\n    const stack = [{\n      node: root,\n      shadow: null\n    }];\n    while (stack.length > 0) {\n      const item = stack.pop();\n      /* Deferred shadow-DOM sanitisation: runs after its subtree was walked. */\n      if (item.shadow) {\n        _sanitizeShadowDOM2(item.shadow);\n        continue;\n      }\n      const node = item.node;\n      const nodeType = getNodeType ? getNodeType(node) : node.nodeType;\n      const isElement = nodeType === NODE_TYPE.element;\n      /* (pushed last → processed first) Children, snapshotted in reverse so\n         the first child is processed first. Snapshotting matters because a\n         hook may detach siblings mid-walk. */\n      const childNodes = getChildNodes(node);\n      if (childNodes) {\n        for (let i = childNodes.length - 1; i >= 0; --i) {\n          stack.push({\n            node: childNodes[i],\n            shadow: null\n          });\n        }\n      }\n      /* (pushed before children → processed after them, matching the old\n         \"template content last\" order) When the node is a <template>,\n         descend into its content. */\n      if (isElement) {\n        const rootName = getNodeName ? getNodeName(node) : null;\n        if (typeof rootName === 'string' && transformCaseFunc(rootName) === 'template') {\n          const content = node.content;\n          if (_isDocumentFragment(content)) {\n            stack.push({\n              node: content,\n              shadow: null\n            });\n          }\n        }\n      }\n      /* Shadow root (processed first): walk its subtree, then sanitise it.\n         Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n         rather than `instanceof DocumentFragment`, which is realm-bound and\n         silently skipped foreign-realm shadow roots (e.g.\n         iframe.contentDocument attachShadow). */\n      if (isElement) {\n        const sr = getShadowRoot(node);\n        if (_isDocumentFragment(sr)) {\n          /* Push the deferred sanitise first so it pops after the shadow\n             walk we push next, i.e. nested shadow roots are discovered\n             before this one is sanitised. */\n          stack.push({\n            node: null,\n            shadow: sr\n          }, {\n            node: sr,\n            shadow: null\n          });\n        }\n      }\n    }\n  };\n  // eslint-disable-next-line complexity\n  DOMPurify.sanitize = function (dirty) {\n    let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    let body = null;\n    let importedNode = null;\n    let currentNode = null;\n    let returnNode = null;\n    /* Make sure we have a string to sanitize.\n      DO NOT return early, as this will return the wrong type if\n      the user has requested a DOM object rather than a string */\n    IS_EMPTY_INPUT = !dirty;\n    if (IS_EMPTY_INPUT) {\n      dirty = '<!-->';\n    }\n    /* Stringify, in case dirty is an object */\n    if (typeof dirty !== 'string' && !_isNode(dirty)) {\n      dirty = stringifyValue(dirty);\n      if (typeof dirty !== 'string') {\n        throw typeErrorCreate('dirty is not a string, aborting');\n      }\n    }\n    /* Return dirty HTML if DOMPurify cannot run */\n    if (!DOMPurify.isSupported) {\n      return dirty;\n    }\n    /* Assign config vars */\n    if (SET_CONFIG) {\n      /* Persistent setConfig() path: _parseConfig is skipped, so the sets are\n       * not re-derived per call. Restore them from the pristine bindings\n       * captured at setConfig() time so a previous call's hook clone (mutated\n       * below) does not carry over. */\n      ALLOWED_TAGS = SET_CONFIG_ALLOWED_TAGS;\n      ALLOWED_ATTR = SET_CONFIG_ALLOWED_ATTR;\n    } else {\n      _parseConfig(cfg);\n    }\n    /* Clone the hook-mutable allowlists before the walk whenever an\n     * uponSanitize* hook is registered. The hook event exposes ALLOWED_TAGS\n     * and ALLOWED_ATTR by reference (as allowedTags / allowedAttributes), so\n     * a hook that widens them would otherwise mutate the shared set\n     * permanently: across later calls and across every element. Cloning per\n     * walk keeps documented in-call widening working while scoping it to the\n     * call. A single guard for both config paths - the per-call path rebinds\n     * the sets in _parseConfig each call, the persistent path restores them\n     * from the captured bindings just above - so the two cannot diverge. */\n    if (hooks.uponSanitizeElement.length > 0 || hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_TAGS = clone(ALLOWED_TAGS);\n    }\n    if (hooks.uponSanitizeAttribute.length > 0) {\n      ALLOWED_ATTR = clone(ALLOWED_ATTR);\n    }\n    /* Clean up removed elements */\n    DOMPurify.removed = [];\n    /* Resolve IN_PLACE for this call without mutating persistent config.\n       Writing the IN_PLACE closure variable here leaks under setConfig(),\n       where _parseConfig is skipped on later calls: a single string call would\n       disable in-place mode for every subsequent node call, returning a\n       sanitized copy while leaving the caller's node — which in-place callers\n       keep using and whose return value they ignore — unsanitized. REPORT-2. */\n    const inPlace = IN_PLACE && typeof dirty !== 'string' && _isNode(dirty);\n    if (inPlace) {\n      /* Declarative-partial-updates / streaming pre-pass: sever every patch\n         linkage across the live tree BEFORE the walk, so no patch can fire\n         mid-walk and inject into an already-processed region. Runs first, so\n         it also covers the forbidden/clobbered roots that throw below. */\n      _neutralizePatchLinkage(dirty);\n      /* Do some early pre-sanitization to avoid unsafe root nodes.\n         Read nodeName through the cached prototype getter — a clobbering\n         child named \"nodeName\" on the form root would otherwise shadow\n         the property and let this check skip the root-allowlist\n         validation entirely. */\n      const nn = getNodeName ? getNodeName(dirty) : dirty.nodeName;\n      if (typeof nn === 'string') {\n        const tagName = transformCaseFunc(nn);\n        if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n          /* Fail closed on a live root: neutralize handlers/children before\n             throwing, exactly as the mid-walk abort path does. */\n          _neutralizeRoot(dirty);\n          throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n        }\n      }\n      /* Pre-flight the root through _isClobbered. The iterator-driven\n         removal path can not detach a parent-less root: _forceRemove\n         falls through to Element.prototype.remove(), which per spec\n         is a no-op on a node with no parent. A clobbered root would\n         then survive the main loop with its attributes uninspected,\n         because _sanitizeAttributes early-returns on _isClobbered. The\n         result would be an attacker-controlled form, complete with any\n         event-handler attributes the caller passed in, handed back to\n         the application unsanitized. Refuse to sanitize such a root\n         the same way we refuse a forbidden tag. GHSA-r47g-fvhr-h676. */\n      if (_isClobbered(dirty)) {\n        /* Fail closed on a live clobbered root before throwing.\n           _neutralizeRoot's reads are clobber-safe (cached getters); the\n           form's non-clobbered descendants, e.g. an armed <img>, are scrubbed. */\n        _neutralizeRoot(dirty);\n        throw typeErrorCreate('root node is clobbered and cannot be sanitized in-place');\n      }\n      /* Sanitize attached shadow roots before the main iterator runs.\n         The iterator does not descend into shadow trees. Same fail-closed\n         barrier as the main walk (campaign-3 F2): a custom-element reaction\n         inside a shadow root could abort this pre-pass before the walk runs,\n         which would otherwise leave the entire live tree unsanitized. */\n      try {\n        _sanitizeAttachedShadowRoots(dirty);\n      } catch (error) {\n        _neutralizeRoot(dirty);\n        throw error;\n      }\n    } else if (_isNode(dirty)) {\n      /* If dirty is a DOM element, append to an empty document to avoid\n         elements being stripped by the parser */\n      body = _initDocument('<!---->');\n      importedNode = body.ownerDocument.importNode(dirty, true);\n      if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n        /* Node is already a body, use as is */\n        body = importedNode;\n      } else if (importedNode.nodeName === 'HTML') {\n        body = importedNode;\n      } else {\n        // eslint-disable-next-line unicorn/prefer-dom-node-append\n        body.appendChild(importedNode);\n      }\n      /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n         them before the main iterator runs, since the iterator does not\n         descend into shadow trees. The walk routes every read through a\n         cached prototype getter so clobbering descendants on a form root\n         cannot hide a shadow host from this pass. */\n      _sanitizeAttachedShadowRoots(importedNode);\n    } else {\n      /* Exit directly if we have nothing to do */\n      if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n      // eslint-disable-next-line unicorn/prefer-includes\n      dirty.indexOf('<') === -1) {\n        return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(dirty) : dirty;\n      }\n      /* Initialize the document to work on */\n      body = _initDocument(dirty);\n      /* Check we have a DOM node from the data */\n      if (!body) {\n        return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n      }\n    }\n    /* Remove first element node (ours) if FORCE_BODY is set */\n    if (body && FORCE_BODY) {\n      _forceRemove(body.firstChild);\n    }\n    /* Get node iterator */\n    const walkRoot = inPlace ? dirty : body;\n    const nodeIterator = _createNodeIterator(walkRoot);\n    /* Now start iterating over the created document.\n       The walk runs inside an exception barrier (campaign-3 F2): a re-entrant\n       engine/custom-element mutation can detach a node mid-walk so\n       `_forceRemove`'s parentless guard throws, aborting the loop. Without the\n       barrier the caller's in-place tree would be left half-sanitized with the\n       unvisited tail still armed. On any throw we fail closed — strip the\n       in-place root bare — then rethrow so the existing throw contract is\n       preserved. (String/DOM-copy paths never return the partial body, so the\n       propagating throw is already fail-closed there.) */\n    try {\n      while (currentNode = nodeIterator.nextNode()) {\n        /* Sanitize tags and elements */\n        _sanitizeElements(currentNode, walkRoot);\n        /* Check attributes next */\n        _sanitizeAttributes(currentNode);\n        /* Shadow DOM detected, sanitize it.\n           Realm-safe check (GHSA-hpcv-96wg-7vj8): nodeType-based detection\n           instead of instanceof, so foreign-realm <template>.content is\n           walked correctly. */\n        if (_isDocumentFragment(currentNode.content)) {\n          _sanitizeShadowDOM2(currentNode.content);\n        }\n      }\n    } catch (error) {\n      if (inPlace) {\n        _neutralizeRoot(dirty);\n        /* Nodes _forceRemove'd earlier in the aborted walk are already\n           detached from the root, so _neutralizeRoot's subtree pass does not\n           reach them. Defuse them too, mirroring the success-path loop below. */\n        arrayForEach(DOMPurify.removed, entry => {\n          if (entry.element) {\n            _neutralizeSubtree(entry.element);\n          }\n        });\n      }\n      throw error;\n    }\n    /* If we sanitized `dirty` in-place, return it. */\n    if (inPlace) {\n      /* Fail-closed completion of the audit-5 F1 fix: every node removed from\n         the caller's live tree is detached but may still hold a queued\n         resource-event handler that fires in page scope after we return. The\n         move-hoist covers only disallowed-tag KEEP_CONTENT removals; strip the\n         non-allow-listed attributes off every other removed subtree (clobber,\n         mXSS, namespace, comments, KEEP_CONTENT:false, …) so those handlers are\n         cancelled before any event can fire. Runs synchronously, pre-return. */\n      arrayForEach(DOMPurify.removed, entry => {\n        if (entry.element) {\n          _neutralizeSubtree(entry.element);\n        }\n      });\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(dirty);\n      }\n      return dirty;\n    }\n    /* Return sanitized string or DOM */\n    if (RETURN_DOM) {\n      if (SAFE_FOR_TEMPLATES) {\n        _scrubTemplateExpressions2(body);\n      }\n      if (RETURN_DOM_FRAGMENT) {\n        returnNode = createDocumentFragment.call(body.ownerDocument);\n        while (body.firstChild) {\n          // eslint-disable-next-line unicorn/prefer-dom-node-append\n          returnNode.appendChild(body.firstChild);\n        }\n      } else {\n        returnNode = body;\n      }\n      if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n        /*\n          AdoptNode() is not used because internal state is not reset\n          (e.g. the past names map of a HTMLFormElement), this is safe\n          in theory but we would rather not risk another attack vector.\n          The state that is cloned by importNode() is explicitly defined\n          by the specs.\n        */\n        returnNode = importNode.call(originalDocument, returnNode, true);\n      }\n      return returnNode;\n    }\n    let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n    /* Serialize doctype if allowed */\n    if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n      serializedHTML = '<!DOCTYPE ' + body.ownerDocument.doctype.name + '>\\n' + serializedHTML;\n    }\n    /* Sanitize final string template-safe */\n    if (SAFE_FOR_TEMPLATES) {\n      serializedHTML = _stripTemplateExpressions(serializedHTML);\n    }\n    return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? _createTrustedHTML(serializedHTML) : serializedHTML;\n  };\n  DOMPurify.setConfig = function () {\n    let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    _parseConfig(cfg);\n    SET_CONFIG = true;\n    SET_CONFIG_ALLOWED_TAGS = ALLOWED_TAGS;\n    SET_CONFIG_ALLOWED_ATTR = ALLOWED_ATTR;\n  };\n  DOMPurify.clearConfig = function () {\n    CONFIG = null;\n    SET_CONFIG = false;\n    SET_CONFIG_ALLOWED_TAGS = null;\n    SET_CONFIG_ALLOWED_ATTR = null;\n    // Drop any caller-supplied Trusted Types policy so it cannot poison later\n    // `RETURN_TRUSTED_TYPE` output. The internal default policy (cached, and\n    // never recreated — Trusted Types throws on duplicate names) is restored by\n    // the next `_parseConfig`. See GHSA-vxr8-fq34-vvx9.\n    trustedTypesPolicy = defaultTrustedTypesPolicy;\n    emptyHTML = '';\n  };\n  DOMPurify.isValidAttribute = function (tag, attr, value) {\n    /* Initialize shared config vars if necessary. */\n    if (!CONFIG) {\n      _parseConfig({});\n    }\n    const lcTag = transformCaseFunc(tag);\n    const lcName = transformCaseFunc(attr);\n    return _isValidAttribute(lcTag, lcName, value);\n  };\n  DOMPurify.addHook = function (entryPoint, hookFunction) {\n    if (typeof hookFunction !== 'function') {\n      return;\n    }\n    /* Reject unknown entry points. Without this, a non-hook key (e.g.\n     * '__proto__') indexes off the prototype chain rather than a real\n     * hook array, and arrayPush then writes to Object.prototype. Guard\n     * with an own-property check against the known hook names. */\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    arrayPush(hooks[entryPoint], hookFunction);\n  };\n  DOMPurify.removeHook = function (entryPoint, hookFunction) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return undefined;\n    }\n    if (hookFunction !== undefined) {\n      const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n      return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n    }\n    return arrayPop(hooks[entryPoint]);\n  };\n  DOMPurify.removeHooks = function (entryPoint) {\n    if (!objectHasOwnProperty(hooks, entryPoint)) {\n      return;\n    }\n    hooks[entryPoint] = [];\n  };\n  DOMPurify.removeAllHooks = function () {\n    hooks = _createHooksMap();\n  };\n  return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n"],"names":["t","e","s","o","n$5","r","n","i","S","c","h","a","l","p","d","u","f","b","_a","_b","y","v","_","m","g","$","x","T","E","A","C","P","V","N","H","I","L","k","M","R","z","j","B","s$1","e$2","i$2","callStateContext","IncomingCallController","host","cb","incomingCalls$","calls","call","devicesContext","attachMediaStream","element","stream","detachMediaStream","extendStatics","__extends","__","__awaiter","thisArg","_arguments","generator","adopt","value","resolve","reject","fulfilled","step","rejected","result","__generator","body","verb","op","__values","__read","ar","error","__spreadArray","to","from","pack","__await","__asyncGenerator","q","awaitReturn","resume","settle","fulfill","__asyncValues","isFunction","createErrorClass","createImpl","_super","instance","ctorFunc","UnsubscriptionError","errors","err","arrRemove","arr","item","index","Subscription","initialTeardown","e_1","e_2","_parentage","_parentage_1","_parentage_1_1","parent_1","e_1_1","initialFinalizer","_finalizers","_finalizers_1","_finalizers_1_1","finalizer","execFinalizer","e_2_1","teardown","parent","empty","EMPTY_SUBSCRIPTION","isSubscription","config","timeoutProvider","handler","timeout","args","_i","handle","reportUnhandledError","noop","errorContext","Subscriber","destination","_this","EMPTY_OBSERVER","next","complete","SafeSubscriber","ConsumerObserver","partialObserver","handleUnhandledError","observerOrNext","defaultErrorHandler","observable","identity","pipe","fns","pipeFromArray","input","prev","fn","Observable","subscribe","operator","subscriber","isSubscriber","source","sink","promiseCtor","getPromiseCtor","Symbol_observable","operations","isObserver","hasLift","operate","init","liftedSource","createOperatorSubscriber","onNext","onComplete","onError","onFinalize","OperatorSubscriber","shouldUnsubscribe","closed_1","animationFrameProvider","callback","request","cancel","timestamp","ObjectUnsubscribedError","Subject","subject","AnonymousSubject","_c","observer","observers","hasError","isStopped","thrownError","BehaviorSubject","_value","subscription","dateTimestampProvider","ReplaySubject","_bufferSize","_windowTime","_timestampProvider","_buffer","_infiniteTimeWindow","copy","adjustedBufferSize","now","last","Action","scheduler","work","state","delay","intervalProvider","AsyncAction","id","_id","_scheduler","_delay","errored","errorValue","actions","nextHandle","resolved","activeHandles","findAndClearHandle","Immediate","setImmediate","clearImmediate","immediateProvider","AsapAction","Scheduler","schedulerActionCtor","AsyncScheduler","SchedulerAction","action","AsapScheduler","flushId","asapScheduler","asyncScheduler","async","AnimationFrameAction","AnimationFrameScheduler","animationFrameScheduler","EMPTY","isScheduler","popResultSelector","popScheduler","popNumber","defaultValue","isArrayLike","isPromise","isInteropObservable","isAsyncIterable","obj","createInvalidObservableTypeError","getSymbolIterator","iterator","isIterable","Symbol_iterator","readableStreamLikeToAsyncGenerator","readableStream","reader","done","isReadableStreamLike","innerFrom","fromInteropObservable","fromArrayLike","fromPromise","fromAsyncIterable","fromIterable","fromReadableStreamLike","obs","array","promise","iterable","iterable_1","iterable_1_1","asyncIterable","process","asyncIterable_1","asyncIterable_1_1","executeSchedule","parentSubscription","repeat","scheduleSubscription","observeOn","subscribeOn","scheduleObservable","schedulePromise","scheduleArray","scheduleIterable","scheduleAsyncIterable","scheduleReadableStreamLike","scheduled","of","throwError","errorOrErrorFactory","errorFactory","EmptyError","lastValueFrom","_hasValue","firstValueFrom","isValidDate","TimeoutError","info","schedulerArg","first","each","_with","timeoutErrorFactory","_d","meta","originalSourceSubscription","timerSubscription","lastValue","seen","startTimer","map","project","isArray","callOrApply","mapOneOrManyArgs","getPrototypeOf","objectProto","getKeys","argsArgArrayOrObject","first_1","isPOJO","keys","key","createObject","values","combineLatest","resultSelector","observables","combineLatestInit","valueTransform","maybeSchedule","length","active","remainingFirstValues","_loop_1","hasFirstValue","execute","mergeInternals","concurrent","onBeforeNext","expand","innerSubScheduler","additionalFinalizer","buffer","isComplete","checkComplete","outerNext","doInnerSub","innerComplete","innerValue","bufferedValue","mergeMap","ii","mergeAll","concatAll","concat","defer","observableFactory","timer","dueTime","intervalOrScheduler","intervalDuration","due","interval","period","merge","sources","NEVER","argsOrArgArray","filter","predicate","race","raceInit","subscriptions","audit","durationSelector","hasValue","durationSubscriber","endDuration","cleanupDuration","auditTime","duration","catchError","selector","innerSub","syncUnsub","handledResult","scanInternals","accumulator","seed","hasSeed","emitOnNext","emitBeforeComplete","hasState","reduce","arrReducer","toArray","debounceTime","activeTask","lastTime","emit","emitWhenIdle","targetTime","defaultIfEmpty","take","count","distinctUntilChanged","comparator","keySelector","defaultCompare","previousKey","currentKey","throwIfEmpty","defaultErrorFactory","exhaustMap","outerValue","hasDefaultValue","scan","share","options","connector","resetOnError","resetOnComplete","resetOnRefCountZero","wrapperSource","connection","resetConnection","refCount","hasCompleted","hasErrored","cancelReset","reset","resetAndUnsubscribe","conn","dest","handleReset","on","onSubscriber","shareReplay","configOrBufferSize","windowTime","bufferSize","skip","skipWhile","taking","startWith","switchMap","innerSubscriber","innerIndex","outerIndex","takeUntil","notifier","tap","tapObserver","isUnsub","withLatestFrom","inputs","len","otherValues","ready","root","definition","module","this","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","name","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","cookieName","location","clearPersistedLevel","normalizeLevel","persist","childName","initialLevel","logger","_log","INVITE_VERSION","DEFAULT_ICE_CANDIDATE_TIMEOUT_MS","DEFAULT_ICE_GATHERING_TIMEOUT_MS","DEFAULT_RECONNECT_CALLS_TIMEOUT_MS","DEFAULT_CONNECTION_TIMEOUT_MS","DEFAULT_RECONNECT_DELAY_MIN_MS","DEFAULT_RECONNECT_DELAY_MAX_MS","DEFAULT_DEVICE_DEBOUNCE_TIME_MS","DEFAULT_DEVICE_POLLING_INTERVAL_MS","PREFERENCES_STORAGE_KEY","SAT_REFRESH_SCOPE","DEVICE_TOKEN_ENDPOINT","DEVICE_REFRESH_ENDPOINT","DEVICE_TOKEN_DEFAULT_EXPIRE_IN","DEVICE_TOKEN_REFRESH_BUFFER_MS","DEVICE_TOKEN_REFRESH_MAX_RETRIES","DEVICE_TOKEN_REFRESH_RETRY_BASE_MS","CREDENTIAL_REFRESH_MAX_RETRIES","CREDENTIAL_REFRESH_RETRY_BASE_MS","CREDENTIAL_REFRESH_MAX_DELAY_MS","CREDENTIAL_REFRESH_BUFFER_MS","CREDENTIAL_ACTIVATE_TIMEOUT_MS","RPC_ERROR_REQUESTER_VALIDATION_FAILED","RPC_ERROR_INVALID_PARAMS","RPC_ERROR_AUTHENTICATION_FAILED","MEDIA_ACCESS_DENIAL_NAMES","DEFAULT_STATS_POLLING_INTERVAL_MS","DEFAULT_STATS_BASELINE_SAMPLES","DEFAULT_STATS_NO_PACKET_THRESHOLD_MS","DEFAULT_STATS_RTT_SPIKE_MULTIPLIER","DEFAULT_STATS_PACKET_LOSS_THRESHOLD","DEFAULT_STATS_JITTER_SPIKE_MULTIPLIER","DEFAULT_STATS_HISTORY_SIZE","DEFAULT_KEYFRAME_MAX_BURST","DEFAULT_KEYFRAME_BURST_WINDOW_MS","DEFAULT_KEYFRAME_COOLDOWN_MS","DEFAULT_REINVITE_DEBOUNCE_TIME_MS","DEFAULT_REINVITE_MAX_ATTEMPTS","DEFAULT_REINVITE_TIMEOUT_MS","DEFAULT_RECOVERY_DEBOUNCE_TIME_MS","DEFAULT_RECOVERY_COOLDOWN_MS","DEFAULT_ICE_DISCONNECTED_GRACE_PERIOD_MS","DEFAULT_ICE_RESTART_TIMEOUT_MS","DEFAULT_MAX_RECOVERY_ATTEMPTS","ICE_GATHERING_COMPLETE_TIMEOUT_MS","PEER_CONNECTION_RECOVERY_WAIT_MS","PEER_CONNECTION_RECOVERY_POLL_MS","AUDIO_LEVEL_POLL_INTERVAL_MS","VAD_THRESHOLD","VAD_HOLD_MS","DEFAULT_PERSIST_DEVICE_SELECTION","DEFAULT_SYNC_DEVICES_TO_ACTIVE_CALLS","DEVICE_STORAGE_KEY_AUDIO_INPUT","DEVICE_STORAGE_KEY_AUDIO_OUTPUT","DEVICE_STORAGE_KEY_VIDEO_INPUT","DEFAULT_AUTO_MUTE_VIDEO_ON_HIDDEN","DEFAULT_REFRESH_DEVICES_ON_VISIBLE","DEFAULT_CHECK_CONNECTION_ON_VISIBLE","DEFAULT_ENABLE_AUTO_DEGRADATION","DEFAULT_DEGRADATION_BITRATE_THRESHOLD_KBPS","DEFAULT_DEGRADATION_RECOVERY_THRESHOLD_KBPS","DEFAULT_ENABLE_RELAY_FALLBACK","DEFAULT_ENABLE_NETWORK_CHANGE_DETECTION","DEFAULT_ENABLE_SERVER_HANGUP_INTERCEPTION","DEFAULT_STEREO_AUDIO","DEFAULT_STEREO_MAX_AVERAGE_BITRATE","UnexpectedError","at","UnimplementedError","reason","InvalidCredentialsError","WebSocketConnectionError","message","TransportConnectionError","WebSocketTimeoutError","RequestTimeoutError","RequestError","RPCTimeoutError","requestId","timeoutMs","AuthStateHandlerError","StorageNotAvailableError","storageType","SerializationError","originalError","DeserializationError","StorageWriteError","StorageReadError","DependencyError","description","CallCreateError","direction","JSONRPCError","code","data","InvalidParams","ConversationError","VertoInviteHandlerError","VertoAttachHandlerError","ValidationError","VertoPongError","MessageParseError","CollectionFetchError","operation","MediaTrackError","kind","isMediaAccessDenial","MediaAccessError","media","fatal","DPoPInitError","PreflightError","phase","DeviceTokenError","TokenRefreshError","datetime","log","originalFactory","logLevel","loggerName","rawMethod","prefixed","defaultLoggerLevel","userLogger","setLogger","logger$1","debugOptions","setDebugOptions","setLogLevel","getLoggerInstance","shouldStringify","payload","wsTraffic","logWsTraffic","loggerInstance","msg","getLogger","_target","prop","_receiver","filterNull","getValueFrom","path","ifIsMap","mapFn","filter$1","map$1","filterAs","resultPath","event","throwOnRPCError","response","InvalidTokenError","b64DecodeUnicode","str","base64UrlDecode","output","jwtDecode","token","pos","part","decoded","byteToHex","unsafeStringify","offset","rnds8","rng","v4","buf","_v4","rnds","Destroyable","sub","cached","publicKey","initialValue","DEFAULT_MAX_RETRIES","DEFAULT_INITIAL_DELAY","DEFAULT_DELAY_VARIATION","increasingDelay","upperDelayLimit","initialDelay","variation","currentDelay","asyncRetry","asyncCallable","retries","delayFn","validator","expectedErrorHandler","remainingAttempts","wait","promiseAttempt","logger$31","GET_PARAMS","POST_PARAMS","HTTPRequestController","baseURL","getCredential","url","headers","timeout$1","acc","controller","timeoutId","httpResponse","urlString","requestHeaders","credential","sanitized","bodyText","MAX_HISTORY_SIZE","toHistoryEntry","device","DeviceHistoryManager","entry","current","filtered","top","rest","availableDevices","history","exactMatch","groupMatch","fromSecToMs","seconds","fromMsToSec","milliseconds","logger$30","PreferencesContainer","DEFAULT_KEYFRAME_MAX_BURST$1","DEFAULT_KEYFRAME_BURST_WINDOW_MS$1","DEFAULT_KEYFRAME_COOLDOWN_MS$1","DEFAULT_ICE_RESTART_TIMEOUT_MS$1","STORED_NUMBER_KEYS","STORED_BOOLEAN_KEYS","collectStoredPreferences","container","applyStoredPreferences","stored","ClientPreferences","storage","toError","logger$29","DEVICE_STORAGE_KEYS","initialDevicesState","initialSelectedDevicesState","NavigatorDeviceController","webRTCApiProvider","storageManager","deviceInfo","devices","device$1","restored","previous","devicesState","currentSelected","newAudioInput","newAudioOutput","newVideoInput","shouldSync","selected","preferred","labelMatches","fromHistory","newDevice","persisted","fromPersisted","preferredDevice","_kind","groupLabelMatch","previousDevice","devicesByKind","constraints","capabilities","DefaultLocalStorage","testKey","scope","store","keysToRemove","StorageManager","storageImpl","serialized","DependencyContainer","user","conversationManager","WebSocketConstructor","ch","firstDot","logger$28","DPOP_DB_NAME","DPOP_DB_VERSION","DPOP_STORE_NAME","DPOP_KEY_ID","base64url","bytes","binary","byte","base64urlEncode","computeJwkThumbprint","jwk","canonical","openDpopDB","db","loadKeyPairFromDB","tx","req","saveKeyPairToDB","keyPair","deleteKeyPairFromDB","CryptoController","testData","params","header","signingInput","logger$27","hasBrowserNetworkEvents","getNetworkType","getNetworkConnection","NetworkMonitor","networkType","detectCodecs","codecs","codec","extractCodecName","mimeType","slashIndex","detectInsertableStreams","detectAudioOutputSelection","detectSimulcast","detectPlatformCapabilities","provider","mediaDevices","getNavigatorMediaDevices","hasGetUserMedia","hasGetDisplayMedia","detectScreenShareAudio","logger$26","DEFAULT_MEDIA_TEST_DURATION_S","ICE_GATHERING_TIMEOUT_MS","SIGNALING_RTT_TIMEOUT_MS","DEVICE_TEST_TIMEOUT_MS","PreflightRunner","deviceController","iceServers","isConnected","transportRttMs","dialFn","warnings","signaling","connectivity","bandwidth","audioDevice","videoDevice","audioOutputDevice","audioWorking","videoWorking","audioStream","track","pc","peerConnection","candidateTypes","startTime","gatheringComplete","timer$1","candidateStr","offer","rttMs","stunReachable","turnReachable","hasHost","type","durationMs","metrics","uploadKbps","downloadKbps","latest","totalPackets","logger$25","isVisibilityApiAvailable","getCurrentVisibility","VisibilityController","newState","previousState","changeEvent","Fetchable","fromPath","http","User","buildRPCRequest","makeRPCResponse","DEFAULT_CONNECT_VERSION","RPCConnect","RPCReauthenticate","dpop_token","authFields","RPCPingResponse","RPCExecute","SDK_TO_VERTO_FIELD_MAP","EXCLUDED_DIALOG_PARAMS","filterVertoParams","sourceDialogParams","filteredDialogParams","mappedKey","buildVertoRPCMessage","WebrtcVerto","VertoInvite","VertoBye","VertoModify","VertoInfo","VertoAnswer","VertoSubscribe","VertoPong","VertoByeCauseCodes","RPCEventAckResponse","logger$24","AttachManager","reconnectCallsTimeout","attachKey","attached","session","mutator","updated","attachment","remaining","callId","succeeded","attempt","audioDirection","videoDirection","audioInputDevice","videoInputDevice","nodeId","receiveAudio","receiveVideo","sendAudio","sendVideo","changed","DEFAULT_ON_OFF","DEFAULT_MEMBER_CAPABILITIES","DEFAULT_CALL_CAPABILITIES","computeOnOffCapability","filteredFlags","flag","filterMemberOnOffFlags","flags","memberType","capability","hasBooleanCapability","computeMemberCapabilities","computeCapabilities","cap","SelfCapabilities","_args","toggleDeafMethod","is","toggleHandraiseMethod","logger$23","initialState","Participant","executeMethod","distinctUntilChanged$1","target","_meta","SelfParticipant","vertoManager","audio","video","isSelfParticipant","participant","isObject","hasProperty","isJSONRPCRequest","isJSONRPCResponse","isJSONRPCErrorResponse","createEventMetadataGuard","eventType","isSignalwireMetadata","isSignalwireRequest","isSignalwireCallMetadata","isCallJoinedMetadata","isCallLeftMetadata","isCallUpdatedMetadata","isCallStateMetadata","isCallPlayMetadata","isCallConnectMetadata","isRoomUpdatedMetadata","isMemberUpdatedMetadata","isMemberJoinedMetadata","isMemberLeftMetadata","isMemberTalkingMetadata","isLayoutChangedMetadata","isWebrtcMessageMetadata","isConversationMessageMetadata","isConversationMessageUpdatedMetadata","isSignalwireAuthorizationStateMetadata","isCallJoinedPayload","isLayoutChangedPayload","logger$22","initialSessionState","CallEventsManager","webRtcCallSession","participantsRecord","roomSessionId","callJoinedEvent","sessionState","member","memberLeftEvent","participants","callUpdatedEvent","roomSession","layoutChangedEvent","layer","members","newParticipant","oldValue","SDP_DIRECTIONS","extractMediaDirectionsFromSDP","sdp","lines","currentMediaKind","currentDirection","line","attr","isValidLocalDescription","mediaSectionsValidCandidates","currentSection","typeMatch","reorderCodecs","preferredVideo","preferredAudio","sections","splitIntoMediaSections","section","mLine","reorderSectionCodecs","enableStereoOpus","maxBitrate","opusPayloadType","findOpusPayloadType","updatedLines","fmtpPrefix","foundFmtp","appendStereoParams","rtpmapLine","withFmtp","setCodecPreferences","audioCodecs","videoCodecs","preferredNames","mLineParts","payloadTypes","ptToCodec","match","preferredNamesUpper","pt","codecName","nameA","nameB","reorderedPTs","fmtpLine","logger$21","ICEGatheringController","peerConnectionControllerNegotiating$","iceGatheringState","isNegotiating","validSDP","logger$20","LocalAudioPipeline","initial","clamped","sum","sample","normalized","logger$19","LocalStreamController","tracks","localStream","trackId","logger$18","getDirection","send","recv","TransceiverController","hasAudioTrack","wantsToSendAudio","wantsToReceiveAudio","hasVideoTrack","wantsToSendVideo","wantsToReceiveVideo","rid","transceiver","isAudio","transceiverParams","transceivers","trackKind","newTracks","newTrack","transceiverOfKind","msStreamsNumber","senders","sender","constraintsToApply","fallbackError","oldTrack","mergedConstraints","deviceId","constraintsWithDevice","logger$17","RTCPeerConnectionController","remoteSessionDescription","iceCandidateState","desc","iceConnectionState","connectionState","track$1","streamTrack","offerDefaults","options$1","localDescription","signalingState","memberId","audioCovered","rawTracks","initialized","tcpTransportParam","server","urls","_iceServers","restOptions","deviceConstraints","offerOptions","status","readyToConnect","mediaOverrides","fallbackToReceiveOnly","answerOptions","finalLocal","preferredAudioCodecs","preferredVideoCodecs","stereo","answer","relayOnly","policyChanged","_e","_f","_g","hasInputStreams","wantsAudio","wantsVideo","canReceive","existingTracks","newStream","raw","sender$1","existingTrack","finalRemote","isVertoMethodMessage","isVertoInviteMessage","isVertoByeInboundMessage","isVertoAttachMessage","isVertoAnswerInnerParams","isVertoMediaInnerParams","isVertoMediaParamsInnerParams","isVertoPingInnerParams","isVertoByeInboundParamsGuard","logger$16","resolveInviteNodeId","VertoManager","callSession","WebRTCVertoManager","attachManager","vertoModifyMessage","rtcPeerConnection","memberNodeId","callID","mediaParams","rtcPeerConnController","vertoPing","selfId","vertoPongMessage","idOverride","videoReceiver","entries","optionals","webrtcVertoMessage","innerResult","vertoMethod","optionalsParams","modifyError","signalingError","inviteError","vertoByeOrAccepted","vertoAttach","dialogParams","vertoMessageRequest","vertoMessage","rtcPeerConnectionController","attach","deviceKind","mediaDirections","propose","isScreenShare","firstPeerConnectionError","removeTrack","cause","causeParams","dtmf","vertoInfoMessage","logger$15","RemoteAudioMeter","logger$14","DEFAULT_POLLING_INTERVAL_MS","DEFAULT_BASELINE_SAMPLES","DEFAULT_NO_AUDIO_PACKET_THRESHOLD_MS","DEFAULT_NO_VIDEO_PACKET_THRESHOLD_MS","DEFAULT_RTT_SPIKE_WARNING_MULTIPLIER","DEFAULT_RTT_SPIKE_CRITICAL_MULTIPLIER","DEFAULT_PACKET_LOSS_WARNING_PERCENT","DEFAULT_PACKET_LOSS_CRITICAL_PERCENT","DEFAULT_JITTER_SPIKE_MULTIPLIER","DEFAULT_HISTORY_WINDOW_SECONDS","computePacketLossPercent","lost","received","total","isInboundRtpStat","stat","isCandidatePairStat","RTCStatsMonitor","issues","report","samples","baseline","pair","now$1","cutoff","audioPacketsReceived","audioPacketsLost","audioJitter","videoPacketsReceived","videoPacketsLost","roundTripTime","availableOutgoingBitrate","prevSample","audioSilenceMs","videoSilenceMs","rtt","baselineRtt","rttRatio","jitter","baselineJitter","deltaAudioReceived","deltaAudioLost","deltaVideoReceived","deltaVideoLost","totalDeltaReceived","lossPercent","logger$13","DEFAULT_DEBOUNCE_TIME_MS","DEFAULT_COOLDOWN_MS","DEFAULT_ICE_GRACE_PERIOD_MS","DEFAULT_MAX_ATTEMPTS","DEFAULT_DEGRADATION_BITRATE_THRESHOLD","DEFAULT_DEGRADATION_RECOVERY_THRESHOLD","DEFAULT_PACKET_LOSS_RECOVERY_DELAY_SEC","DEGRADATION_ONLY_ISSUES","CallRecoveryManager","callbacks","trigger","bitrateKbps","wasConstrained","hasPacketLoss","pcState","signalingReady","delayMs","constrained","tier","ParticipantFactory","E_MODEL_BASE_R","E_MODEL_DELAY_WEIGHT","E_MODEL_LOSS_WEIGHT","R_FACTOR_MIN","R_FACTOR_MAX","MOS_MIN","MOS_MAX","MOS_EXCELLENT_THRESHOLD","MOS_GOOD_THRESHOLD","MOS_FAIR_THRESHOLD","MOS_POOR_THRESHOLD","computeMOS","packetLoss","rawR","mos","mosToQualityLevel","logger$12","POSITION_SET_METHOD","RTT_CRITICAL_TO_WARNING_RATIO","fromDestinationParams","WebRTCCall","clientSession","initialization","address","userVars","managers","networkChange$","callError","variables","prefs","healthy","totalRecv","totalLost","lossPct","issue","deadline","filtered$","layout","positions","positionEntries","position","pipeline","percent","multiplier","enabled","meter","inferCallErrorKind","RECOVERABLE_RPC_CODES","isFatalError","CallFactory","sessionManager","callInstance","logger$11","Fetcher","endpoint","_item","EntityCollection","fetchController","update$","existing","allKeys","existingVal","newVal","loading","EntityCollectionTransformed","originalCollection","filter$2","mapper","original$","Address","addressId","addressProvider","update","text","logger$10","isRPCConnectResult","PendingRPC","responses$","signal","isSettled","abortHandler","rpcError","onfulfilled","onrejected","onfinally","logger$9","shouldAbortDial","getAddressSearchURI","from$1","ClientSessionManager","transport","authorizationStateKey","dpopManager","directory","authStateEvent","invite","storedState","authorizationState","isRecoverableAuthError","hasStoredState","cleanupError","authorization_state","dpopToken","resolvedDpopToken","persistedParams","hasReconnectState","storedToken","isReconnect","rpcConnectRequest","res","storedOptions","destinationURI","addressURI","remainingCalls","ClientSessionWrapper","clientSessionManager","isString","logger$8","ConversationMessagesFetcher","groupId","ConversationMessageCollection","ConversationsManager","getUserAddressId","userFromAddressId","destinationAddressId","logger$7","resolveExpiresAt","resolveExpireIn","DeviceTokenManager","errorHandler","tokenData","expiresAt","refreshIn","updateCredential","satClaims","rpcProof$1","rpcProof","dpopProof","currentToken","newTokenData","lastError","logger$6","defaultDeviceTokenManagerFactory","CredentialRefreshCoordinator","deps","refreshInterval","newCredentials","nextAttempt","generation","cred","inner","logger$5","DEFAULT_MAX_EVENTS","getUserAgent","DiagnosticsCollector","category","details","summary","isEmptyArray","warmup","logger$4","AddressFetcher","AddressStateCollection","DirectoryManager","newStates","addr","found$","logger$3","WebSocketController","outgoingMessages$","currentStatus","oldSocket","socket","_event","jitteredDelay","isSignalwirePingRequest","logger$2","TransportManager","protocolKey","webSocketConstructor","relayHost","eventChannel","currentProtocol","protocol","connectionSub","storedProtocol","buildOptionsFromDestination","queryStartIndex","queryString","channel","SignalWire","credentialProvider","fingerprint","warning","partial","credentials","_fingerprint","_credentials","decodeHeader","connected","base","ready$1","reauthError","registerError","computed_options","opts","withSink","audioGranted","videoGranted","selectedAudioDevice","selectedVideoDevice","settings","audioDeviceId","videoDeviceId","EmbedTokenCredentialProvider","embedToken","StaticCredentialProvider","SwCallMedia","LitElement","changedProperties","signature","html","css","__decorateClass","property","consume","customElement","SwSelfMedia","style","videoStyle","i$1","ICONS","DEFAULT_SIZE","SwUiIcon","sized","unsafeHTML","SwLocalCamera","effectiveStream","streamRefChanged","w","hostReset","SwParticipants","isOpen","isSelf","classes","layers","overlays","SwParticipantControls","hasActions","nothing","SwAudioLevel","eff","mediaStream","bufferLength","updateLevels","analyser","dataArray","levels","binCount","binsPerBar","startBin","endBin","average","peak","ariaValue","isActive","levelClass","size","SwCallControls","hangup","find","list","settingId","toggle","isScreenSharing","isHandRaised","SwCallStatus","elapsed","hours","minutes","secs","statusText","noopVoid","EMPTY_CALL_STATE","CallStateContextController","ContextProvider","digits","recording","streaming","locked","raiseHandPriority","remoteStream","layouts","layoutLayers","EMPTY_STATE","DevicesContextController","dc","selfSub","audioMutedSub","muted","videoMutedSub","speakerMutedSub","deaf","echoCancellationSub","autoGainSub","noiseSuppressionSub","SwCallProvider","DTMF_PATTERN","LONG_PRESS_MS","KEYS","SwUiDialpad","digit","SwCallDialpad","transcriptContext","ChatState","out","merged","barged","finalText","AI_EVENT_TYPES","stripConfidence","asString","TranscriptController","before","after","USER_EVENT_TYPE","ALLOWED_FORMATS","asFormat","UserEventController","SwUiCallLayout","isFs","SwUiResponsiveContainer","SwUiModal","onClose","ev","query","DEFAULT_BACKGROUND_IMAGE","DEFAULT_BACKGROUND_THUMBNAIL","SwUiBackground","styleMap","_prism","getPrism","prism$1","PRISM_LANGS","prismJavascript","prismTypescript$1","prismPython$1","prismBash","prismJson","prismCss","prismYaml","prismSql","prismMarkdown","PRISM_DEPS","_loaded","ensurePrismLang","lang","dep","loader","highlight","language","Prism","grammar","PURIFY_CONFIG","purifyHookInstalled","ensurePurifyHook","DOMPurify","node","SwUiContentDrawer","content","format","marked","marked_esm","purify_es","showLangBadge","transcriptToMarkdown","completed","serializeEntry","link","serializeDisplayContent","SwUiTranscriptView","toHighlight","md","blob","el","hasEntries","SwUiAlert","showPrompt","GOOGLE_FONTS_BASE","useGoogleFont","weights","display","family","axis","href","themeAdopted","ensureSignalWireTheme","sheet","themeCss","ensureSignalWireFonts","WIDGET_DISPLAY_FORMATS","isPlainObject","parseUserVariablesAttribute","parsed","withWidgetCapabilities","baseCaps","baseMeta","baseWidget","EMBED_TOKEN_PREFIXES","DEFAULT_EMBED_HOST","normalizeHost","isEmbedToken","buildCredentialProvider","widgetStyles","renderCallView","renderConnecting","SwCallWidget","callerDisplay","userVariables","endedCall","endedStatus","SwClickToCall","SwDirectory","addressesSub","addresses","loadingSub","hasMoreSub","hasMore","sentinel","channels","showInitialLoading","showEmptyState","showSearchingState","deviceSelectorStyles","SwDeviceSelector","opened","closed","cameraChanged","micChanged","sinkId","iconName","title","selectedId","onSelect","preview","hasDevices","SwUiDropup","rect","selectedItem","SwUiSplitButton","inactive","hasItems","iconSlots","SwUiControlBar","detail","items","version","_self","uniqueId","plainTextGrammar","encode","tokens","Token","deepClone","visited","clone","src","scripts","className","defaultActivation","no","classList","redef","inside","insert","ret","newToken","old","DFS","objId","propertyType","env","insertHighlightedCode","highlightedCode","worker","evt","tokenList","LinkedList","addAfter","matchGrammar","hooks","alias","matchedStr","stringify","aliases","attributes","matchPattern","pattern","lookbehind","lookbehindLength","startNode","startPos","rematch","patterns","patternObj","greedy","currentNode","removeCount","matchStr","reach","removeFrom","removeRange","wrapped","nestedRematch","head","tail","newNode","immediateClose","script","highlightAutomaticallyCallback","readyState","global","tagName","includedCdataInside","def","attrName","string","markup","LOADING_MESSAGE","FAILURE_MESSAGE","FAILURE_EMPTY_MESSAGE","EXTENSIONS","STATUS_ATTR","STATUS_LOADING","STATUS_LOADED","STATUS_FAILED","SELECTOR","loadFile","success","xhr","parseRange","range","start","comma","end","pre","extension","autoloader","elements","logged","typeInside","envVars","commandAfterHeredoc","insideString","toBeCopied","anchorOrAlias","tag","properties","plainKey","createValuePattern","createInline","tableCell","tableRow","tableLine","walkTokens","codeLang","codeBlock","cls","textContent","ele","tagPattern","KNOWN_ENTITY_NAMES","fromCodePoint","known","_getDefaults","_defaults","changeDefaults","newDefaults","escapeTest","escapeReplace","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","escape","unescapeTest","unescape","caret","edit","regex","opt","val","cleanUrl","noopTest","splitCells","row","escaped","curr","cells","rtrim","invert","suffLen","findClosingBracket","outputLink","lexer","indentCodeCompensation","matchIndentToCode","indentToCode","matchIndentInNode","indentInNode","_Tokenizer","__publicField","trimmed","bull","isordered","itemRegex","itemContents","endsWithBlankLine","endEarly","nextLine","indent","blankLine","nextBulletRegex","hrRegex","fencesBeginRegex","headingBeginRegex","rawLine","istask","ischecked","spacers","hasMultipleLineBreaks","align","trimmedUrl","rtrimSlash","lastParenIndex","linkLen","links","maskedSrc","prevChar","lLength","rDelim","rLength","delimTotal","midDelimTotal","endReg","lastCharLength","hasNonSpaceChars","hasSpaceCharsOnBothEnds","prevCapZero","block","inline","_Lexer","rules","leading","tabs","lastToken","cutSrc","lastParagraphClipped","extTokenizer","startIndex","tempSrc","tempStart","getStartIndex","errMsg","keepPrevChar","_Renderer","infostring","quote","ordered","startatt","task","checked","cleanHref","_TextRenderer","_Parser","genericToken","headingToken","codeToken","tableToken","cell","blockquoteToken","listToken","loose","itemBody","checkbox","htmlToken","paragraphToken","textToken","renderer","escapeToken","tagToken","linkToken","imageToken","strongToken","emToken","codespanToken","delToken","_Hooks","markdown","Marked","__privateAdd","_Marked_instances","__privateMethod","parseMarkdown_fn","childTokens","extensions","ext","prevRenderer","extLevel","rendererFunc","rendererKey","tokenizer","tokenizerFunc","tokenizerKey","prevTokenizer","hooksFunc","hooksKey","prevHook","arg","packWalktokens","parser","origOpt","onError_fn","silent","markedInstance","setOptions","use","parseInline","parse","_arrayLikeToArray","_arrayWithHoles","_iterableToArrayLimit","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","setPrototypeOf","isFrozen","getOwnPropertyDescriptor","freeze","seal","create","_ref","apply","construct","func","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","bigintToString","symbolToString","objectHasOwnProperty","objectToString","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","transformCaseFunc","lcElement","cleanArray","object","newObject","_ref2","_ref3","stringifyValue","valueAsRecord","valueToString","lookupGetter","stringified","fallbackValue","isRegex","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","ELEMENT_MARKUP_PROBE","COMMENT_MARKUP_PROBE","FALLBACK_TAG_CLOSE","SELF_CLOSING_TAG","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","_resolveSetOption","cfg","fallback","createDOMPurify","window","document","originalDocument","currentScript","HTMLTemplateElement","Node","Element","NodeFilter","_window$NamedNodeMap","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","getShadowRoot","getAttributes","getNodeType","getNodeName","template","trustedTypesPolicy","emptyHTML","defaultTrustedTypesPolicy","defaultTrustedTypesPolicyResolved","IN_TRUSTED_TYPES_POLICY","_assertNotInTrustedTypesPolicy","_createTrustedHTML","_createTrustedScriptURL","_getDefaultTrustedTypesPolicy","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","MUSTACHE_EXPR$1","ERB_EXPR$1","TMPLIT_EXPR$1","DATA_ATTR$1","ARIA_ATTR$1","IS_SCRIPT_OR_DATA$1","ATTR_WHITESPACE$1","CUSTOM_ELEMENT$1","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","SET_CONFIG_ALLOWED_TAGS","SET_CONFIG_ALLOWED_ATTR","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","DEFAULT_MATHML_TEXT_INTEGRATION_POINTS","MATHML_TEXT_INTEGRATION_POINTS","DEFAULT_HTML_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","customElementHandling","previousTrustedTypesPolicy","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkSvgNamespace","parentTagName","_checkMathMlNamespace","_checkHtmlNamespace","_checkValidNamespace","_forceRemove","_neutralizeRoot","_neutralizeSubtree","childNodes","snapshot","child","attribute","_removeAttribute","_stripDisallowedAttributes","stack","_neutralizePatchLinkage","nodeType","lcTag","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","_createNodeIterator","_stripTemplateExpressions","_scrubTemplateExpressions2","_node$querySelectorAl","walker","templates","tmpl","_isDocumentFragment","_isClobbered","realTagName","_isNode","_executeHooks","hook","_isUnsafeNode","_sanitizeDisallowedNode","_isBasicCustomElement","parentNode","childCount","hoisted","_sanitizeElements","removed","_isValidAttribute","lcName","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_applyTrustedTypesToAttribute","namespaceURI","_setAttributeValue","_sanitizeAttributes","hookEvent","attrValue","initValue","_sanitizeShadowDOM2","fragment","shadowNode","shadowIterator","innerSr","_sanitizeAttachedShadowRoots","isElement","rootName","sr","importedNode","returnNode","inPlace","nn","walkRoot","nodeIterator","serializedHTML","entryPoint","hookFunction","purify"],"mappings":"ihCAAA;AAAA;AAAA;AAAA;AAAA,GAKA,MAAMA,GAAE,WAAWC,GAAED,GAAE,aAAsBA,GAAE,WAAX,QAAqBA,GAAE,SAAS,eAAe,uBAAuB,SAAS,WAAW,YAAY,cAAc,UAAUE,GAAE,OAAM,EAAGC,GAAE,IAAI,QAAO,IAAAC,GAAC,KAAO,CAAC,YAAYJ,EAAEC,EAAEE,EAAE,CAAC,GAAG,KAAK,aAAa,GAAGA,IAAID,GAAE,MAAM,MAAM,mEAAmE,EAAE,KAAK,QAAQF,EAAE,KAAK,EAAEC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAID,EAAE,KAAK,EAAE,MAAME,EAAE,KAAK,EAAE,GAAGD,IAAYD,IAAT,OAAW,CAAC,MAAMC,EAAWC,IAAT,QAAgBA,EAAE,SAAN,EAAaD,IAAID,EAAEG,GAAE,IAAID,CAAC,GAAYF,IAAT,UAAc,KAAK,EAAEA,EAAE,IAAI,eAAe,YAAY,KAAK,OAAO,EAAEC,GAAGE,GAAE,IAAID,EAAEF,CAAC,EAAE,CAAC,OAAOA,CAAC,CAAC,UAAU,CAAC,OAAO,KAAK,OAAO,CAAC,EAAM,MAACK,GAAE,GAAG,IAAIC,GAAY,OAAO,GAAjB,SAAmB,EAAE,EAAE,GAAG,OAAOJ,EAAC,EAAEK,GAAE,CAAC,KAAK,IAAI,CAAC,MAAMJ,EAAM,EAAE,SAAN,EAAa,EAAE,CAAC,EAAE,EAAE,QAAQ,CAACF,EAAEC,EAAEC,IAAIF,GAAGD,GAAG,CAAC,GAAQA,EAAE,eAAP,GAAoB,OAAOA,EAAE,QAAQ,GAAa,OAAOA,GAAjB,SAAmB,OAAOA,EAAE,MAAM,MAAM,mEAAmEA,EAAE,sFAAsF,CAAC,GAAGE,CAAC,EAAE,EAAEC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,IAAIG,GAAEH,EAAE,EAAED,EAAC,CAAC,EAAEM,GAAE,CAACN,EAAEC,IAAI,CAAC,GAAGF,GAAEC,EAAE,mBAAmBC,EAAE,KAAKH,GAAGA,aAAa,cAAcA,EAAEA,EAAE,WAAU,MAAQ,WAAUC,KAAKE,EAAE,CAAC,MAAMA,EAAE,SAAS,cAAc,OAAO,EAAE,EAAEH,GAAE,SAAkB,IAAT,QAAYG,EAAE,aAAa,QAAQ,CAAC,EAAEA,EAAE,YAAYF,EAAE,QAAQC,EAAE,YAAYC,CAAC,CAAC,CAAC,EAAEM,GAAER,GAAE,GAAG,EAAE,GAAG,aAAa,eAAeD,GAAG,CAAC,IAAIC,EAAE,GAAG,UAAUC,KAAKF,EAAE,SAASC,GAAGC,EAAE,QAAQ,OAAOG,GAAEJ,CAAC,CAAC,GAAG,CAAC,EAAE,ECJ3zC;AAAA;AAAA;AAAA;AAAA,GAIG,KAAK,CAAC,GAAGM,GAAE,eAAeN,GAAE,yBAAyBS,GAAE,oBAAoBL,GAAE,sBAAsBF,GAAE,eAAeG,EAAC,EAAE,OAAOK,GAAE,WAAWF,GAAEE,GAAE,aAAaC,GAAEH,GAAEA,GAAE,YAAY,GAAGI,GAAEF,GAAE,+BAA+BG,GAAE,CAAC,EAAEZ,IAAI,EAAEa,GAAE,CAAC,YAAY,EAAEb,EAAE,CAAC,OAAOA,EAAC,CAAE,KAAK,QAAQ,EAAE,EAAEU,GAAE,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,EAAQ,GAAN,KAAQ,EAAE,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,cAAc,EAAEV,EAAE,CAAC,IAAI,EAAE,EAAE,OAAOA,GAAG,KAAK,QAAQ,EAAS,IAAP,KAAS,MAAM,KAAK,OAAO,EAAS,IAAP,KAAS,KAAK,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,MAAS,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAEc,GAAE,CAAC,EAAEd,IAAI,CAACK,GAAE,EAAEL,CAAC,EAAEe,GAAE,CAAC,UAAU,GAAG,KAAK,OAAO,UAAUF,GAAE,QAAQ,GAAG,WAAW,GAAG,WAAWC,EAAC,EAAE,OAAO,WAAP,OAAO,SAAW,OAAO,UAAU,GAAEL,GAAE,sBAAFA,GAAE,oBAAsB,IAAI,gBAAQ,cAAgB,WAAW,CAAC,OAAO,eAAeX,EAAE,CAAC,KAAK,KAAI,GAAI,KAAK,IAAL,KAAK,EAAI,CAAA,IAAI,KAAKA,CAAC,CAAC,CAAC,WAAW,oBAAoB,CAAC,OAAO,KAAK,SAAQ,EAAG,KAAK,MAAM,CAAC,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,OAAO,eAAeA,EAAEE,EAAEe,GAAE,CAAC,GAAGf,EAAE,QAAQA,EAAE,UAAU,IAAI,KAAK,KAAI,EAAG,KAAK,UAAU,eAAeF,CAAC,KAAKE,EAAE,OAAO,OAAOA,CAAC,GAAG,QAAQ,IAAI,KAAK,kBAAkB,IAAIF,EAAEE,CAAC,EAAE,CAACA,EAAE,WAAW,CAAC,MAAMK,EAAE,OAAM,EAAGG,EAAE,KAAK,sBAAsBV,EAAEO,EAAEL,CAAC,EAAWQ,IAAT,QAAYT,GAAE,KAAK,UAAUD,EAAEU,CAAC,CAAC,CAAC,CAAC,OAAO,sBAAsBV,EAAEE,EAAEK,EAAE,CAAC,KAAK,CAAC,IAAIN,EAAE,IAAII,CAAC,EAAEK,GAAE,KAAK,UAAUV,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,KAAKE,CAAC,CAAC,EAAE,IAAIF,EAAE,CAAC,KAAKE,CAAC,EAAEF,CAAC,CAAC,EAAE,MAAM,CAAC,IAAIC,EAAE,IAAIC,EAAE,CAAC,MAAMQ,EAAET,GAAA,YAAAA,EAAG,KAAK,MAAMI,GAAA,MAAAA,EAAG,KAAK,KAAKH,GAAG,KAAK,cAAcF,EAAEU,EAAEH,CAAC,CAAC,EAAE,aAAa,GAAG,WAAW,EAAE,CAAC,CAAC,OAAO,mBAAmBP,EAAE,CAAC,OAAO,KAAK,kBAAkB,IAAIA,CAAC,GAAGiB,EAAC,CAAC,OAAO,MAAM,CAAC,GAAG,KAAK,eAAeH,GAAE,mBAAmB,CAAC,EAAE,OAAO,MAAMd,EAAEM,GAAE,IAAI,EAAEN,EAAE,SAAQ,EAAYA,EAAE,IAAX,SAAe,KAAK,EAAE,CAAC,GAAGA,EAAE,CAAC,GAAG,KAAK,kBAAkB,IAAI,IAAIA,EAAE,iBAAiB,CAAC,CAAC,OAAO,UAAU,CAAC,GAAG,KAAK,eAAec,GAAE,WAAW,CAAC,EAAE,OAAO,GAAG,KAAK,UAAU,GAAG,KAAK,KAAI,EAAG,KAAK,eAAeA,GAAE,YAAY,CAAC,EAAE,CAAC,MAAMd,EAAE,KAAK,WAAWE,EAAE,CAAC,GAAGG,GAAEL,CAAC,EAAE,GAAGG,GAAEH,CAAC,CAAC,EAAE,UAAUO,KAAKL,EAAE,KAAK,eAAeK,EAAEP,EAAEO,CAAC,CAAC,CAAC,CAAC,MAAMP,EAAE,KAAK,OAAO,QAAQ,EAAE,GAAUA,IAAP,KAAS,CAAC,MAAME,EAAE,oBAAoB,IAAIF,CAAC,EAAE,GAAYE,IAAT,OAAW,SAAS,CAACF,EAAEO,CAAC,IAAIL,EAAE,KAAK,kBAAkB,IAAIF,EAAEO,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,SAAS,CAACP,EAAEE,CAAC,IAAI,KAAK,kBAAkB,CAAC,MAAMK,EAAE,KAAK,KAAKP,EAAEE,CAAC,EAAWK,IAAT,QAAY,KAAK,KAAK,IAAIA,EAAEP,CAAC,CAAC,CAAC,KAAK,cAAc,KAAK,eAAe,KAAK,MAAM,CAAC,CAAC,OAAO,eAAeE,EAAE,CAAC,MAAM,EAAE,CAAA,EAAG,GAAG,MAAM,QAAQA,CAAC,EAAE,CAAC,MAAMD,EAAE,IAAI,IAAIC,EAAE,KAAK,GAAG,EAAE,QAAO,CAAE,EAAE,UAAUA,KAAKD,EAAE,EAAE,QAAQD,GAAEE,CAAC,CAAC,CAAC,MAAeA,IAAT,QAAY,EAAE,KAAKF,GAAEE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,KAAKF,EAAEE,EAAE,CAAC,MAAMK,EAAEL,EAAE,UAAU,OAAWK,IAAL,GAAO,OAAiB,OAAOA,GAAjB,SAAmBA,EAAY,OAAOP,GAAjB,SAAmBA,EAAE,YAAW,EAAG,MAAM,CAAC,aAAa,CAAC,MAAK,EAAG,KAAK,KAAK,OAAO,KAAK,gBAAgB,GAAG,KAAK,WAAW,GAAG,KAAK,KAAK,KAAK,KAAK,KAAI,CAAE,CAAC,MAAM,OAAC,KAAK,KAAK,IAAI,SAASA,GAAG,KAAK,eAAeA,EAAC,EAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAI,EAAG,KAAK,cAAa,GAAGkB,EAAA,KAAK,YAAY,IAAjB,MAAAA,EAAoB,SAASlB,GAAGA,EAAE,IAAI,GAAG,CAAC,cAAcA,EAAE,QAAE,KAAK,OAAL,KAAK,KAAO,IAAI,MAAK,IAAIA,CAAC,EAAW,KAAK,aAAd,QAA0B,KAAK,eAAakB,EAAAlB,EAAE,gBAAF,MAAAkB,EAAA,KAAAlB,GAAmB,CAAC,iBAAiBA,EAAE,QAACkB,EAAA,KAAK,OAAL,MAAAA,EAAW,OAAOlB,EAAE,CAAC,MAAM,CAAC,MAAMA,EAAE,IAAI,IAAIE,EAAE,KAAK,YAAY,kBAAkB,UAAUK,KAAKL,EAAE,KAAI,EAAG,KAAK,eAAeK,CAAC,IAAIP,EAAE,IAAIO,EAAE,KAAKA,CAAC,CAAC,EAAE,OAAO,KAAKA,CAAC,GAAGP,EAAE,KAAK,IAAI,KAAK,KAAKA,EAAE,CAAC,kBAAkB,CAAC,MAAMA,EAAE,KAAK,YAAY,KAAK,aAAa,KAAK,YAAY,iBAAiB,EAAE,OAAOE,GAAEF,EAAE,KAAK,YAAY,aAAa,EAAEA,CAAC,CAAC,mBAAmB,OAAC,KAAK,aAAL,KAAK,WAAa,KAAK,iBAAgB,GAAG,KAAK,eAAe,EAAE,GAAEkB,EAAA,KAAK,OAAL,MAAAA,EAAW,SAASlB,GAAC,OAAE,OAAAkB,EAAAlB,EAAE,gBAAF,YAAAkB,EAAA,KAAAlB,KAAqB,CAAC,eAAeA,EAAE,CAAC,CAAC,sBAAsB,QAACkB,EAAA,KAAK,OAAL,MAAAA,EAAW,SAASlB,GAAC,OAAE,OAAAkB,EAAAlB,EAAE,mBAAF,YAAAkB,EAAA,KAAAlB,KAAwB,CAAC,yBAAyBA,EAAEE,EAAEK,EAAE,CAAC,KAAK,KAAKP,EAAEO,CAAC,CAAC,CAAC,KAAKP,EAAEE,EAAE,OAAC,MAAMK,EAAE,KAAK,YAAY,kBAAkB,IAAIP,CAAC,EAAEC,EAAE,KAAK,YAAY,KAAKD,EAAEO,CAAC,EAAE,GAAYN,IAAT,QAAiBM,EAAE,UAAP,GAAe,CAAC,MAAMG,KAAYQ,EAAAX,EAAE,YAAF,YAAAW,EAAa,eAAtB,OAAkCX,EAAE,UAAUQ,IAAG,YAAYb,EAAEK,EAAE,IAAI,EAAE,KAAK,KAAKP,EAAQU,GAAN,KAAQ,KAAK,gBAAgBT,CAAC,EAAE,KAAK,aAAaA,EAAES,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,KAAKV,EAAEE,EAAE,SAAC,MAAMK,EAAE,KAAK,YAAYN,EAAEM,EAAE,KAAK,IAAIP,CAAC,EAAE,GAAYC,IAAT,QAAY,KAAK,OAAOA,EAAE,CAAC,MAAMD,EAAEO,EAAE,mBAAmBN,CAAC,EAAES,EAAc,OAAOV,EAAE,WAArB,WAA+B,CAAC,cAAcA,EAAE,SAAS,IAAWkB,EAAAlB,EAAE,YAAF,YAAAkB,EAAa,iBAAtB,OAAoClB,EAAE,UAAUe,GAAE,KAAK,KAAKd,EAAE,MAAMI,EAAEK,EAAE,cAAcR,EAAEF,EAAE,IAAI,EAAE,KAAKC,CAAC,EAAEI,KAAGc,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAIlB,KAAII,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,cAAcL,EAAEE,EAAEK,EAAE,OAAC,GAAYP,IAAT,OAAW,CAAC,MAAMC,EAAE,KAAK,YAAYS,EAAE,KAAKV,CAAC,EAAE,GAAGO,MAAIN,EAAE,mBAAmBD,CAAC,GAAE,GAAGO,EAAE,YAAYS,IAAGN,EAAER,CAAC,GAAGK,EAAE,YAAYA,EAAE,SAASG,MAAIQ,EAAA,KAAK,OAAL,YAAAA,EAAW,IAAIlB,KAAI,CAAC,KAAK,aAAaC,EAAE,KAAKD,EAAEO,CAAC,CAAC,GAAG,OAAO,KAAK,EAAEP,EAAEE,EAAEK,CAAC,CAAC,CAAM,KAAK,kBAAV,KAA4B,KAAK,KAAK,KAAK,KAAI,EAAG,CAAC,EAAEP,EAAEE,EAAE,CAAC,WAAWK,EAAE,QAAQN,EAAE,QAAQS,CAAC,EAAEL,EAAE,CAACE,GAAG,EAAE,KAAK,OAAL,KAAK,KAAO,IAAI,MAAK,IAAIP,CAAC,IAAI,KAAK,KAAK,IAAIA,EAAEK,GAAGH,GAAG,KAAKF,CAAC,CAAC,EAAOU,IAAL,IAAiBL,IAAT,UAAc,KAAK,KAAK,IAAIL,CAAC,IAAI,KAAK,YAAYO,IAAIL,EAAE,QAAQ,KAAK,KAAK,IAAIF,EAAEE,CAAC,GAAQD,IAAL,IAAQ,KAAK,OAAOD,IAAI,KAAK,OAAL,KAAK,KAAO,IAAI,MAAK,IAAIA,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,KAAK,gBAAgB,GAAG,GAAG,CAAC,MAAM,KAAK,IAAI,OAAOA,EAAE,CAAC,QAAQ,OAAOA,CAAC,CAAC,CAAC,MAAMA,EAAE,KAAK,eAAc,EAAG,OAAaA,GAAN,MAAS,MAAMA,EAAE,CAAC,KAAK,eAAe,CAAC,gBAAgB,CAAC,OAAO,KAAK,cAAa,CAAE,CAAC,eAAe,OAAC,GAAG,CAAC,KAAK,gBAAgB,OAAO,GAAG,CAAC,KAAK,WAAW,CAAC,GAAG,KAAK,aAAL,KAAK,WAAa,KAAK,iBAAgB,GAAG,KAAK,KAAK,CAAC,SAAS,CAACA,EAAEE,CAAC,IAAI,KAAK,KAAK,KAAKF,CAAC,EAAEE,EAAE,KAAK,KAAK,MAAM,CAAC,MAAMF,EAAE,KAAK,YAAY,kBAAkB,GAAGA,EAAE,KAAK,EAAE,SAAS,CAAC,EAAEO,CAAC,IAAIP,EAAE,CAAC,KAAK,CAAC,QAAQA,CAAC,EAAEO,EAAEN,EAAE,KAAK,CAAC,EAAOD,IAAL,IAAQ,KAAK,KAAK,IAAI,CAAC,GAAYC,IAAT,QAAY,KAAK,EAAE,EAAE,OAAOM,EAAEN,CAAC,CAAC,CAAC,CAAC,IAAID,EAAE,GAAG,MAAME,EAAE,KAAK,KAAK,GAAG,CAACF,EAAE,KAAK,aAAaE,CAAC,EAAEF,GAAG,KAAK,WAAWE,CAAC,GAAEgB,EAAA,KAAK,OAAL,MAAAA,EAAW,SAASlB,GAAC,OAAE,OAAAkB,EAAAlB,EAAE,aAAF,YAAAkB,EAAA,KAAAlB,MAAmB,KAAK,OAAOE,CAAC,GAAG,KAAK,KAAI,CAAE,OAAOA,EAAE,CAAC,MAAMF,EAAE,GAAG,KAAK,KAAI,EAAGE,CAAC,CAACF,GAAG,KAAK,KAAKE,CAAC,CAAC,CAAC,WAAWF,EAAE,CAAC,CAAC,KAAKA,EAAE,QAACkB,EAAA,KAAK,OAAL,MAAAA,EAAW,SAASlB,GAAC,OAAE,OAAAkB,EAAAlB,EAAE,cAAF,YAAAkB,EAAA,KAAAlB,MAAoB,KAAK,aAAa,KAAK,WAAW,GAAG,KAAK,aAAaA,CAAC,GAAG,KAAK,QAAQA,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC,IAAI,gBAAgB,CAAC,OAAO,KAAK,kBAAiB,CAAE,CAAC,mBAAmB,CAAC,OAAO,KAAK,IAAI,CAAC,aAAaA,EAAE,CAAC,MAAM,EAAE,CAAC,OAAOA,EAAE,CAAC,KAAK,OAAL,KAAK,KAAO,KAAK,KAAK,SAASA,GAAG,KAAK,KAAKA,EAAE,KAAKA,CAAC,CAAC,EAAC,GAAG,KAAK,KAAI,CAAE,CAAC,QAAQA,EAAE,CAAC,CAAC,aAAaA,EAAE,CAAC,CAAC,EAACoB,GAAE,cAAc,CAAA,EAAGA,GAAE,kBAAkB,CAAC,KAAK,MAAM,EAAEA,GAAEN,GAAE,mBAAmB,CAAC,EAAE,IAAI,IAAIM,GAAEN,GAAE,WAAW,CAAC,EAAE,IAAI,IAAID,IAAAA,MAAAA,GAAI,CAAC,gBAAgBO,EAAC,IAAIT,GAAE,0BAAFA,GAAE,wBAA0B,CAAA,IAAI,KAAK,OAAO,ECL7xL;AAAA;AAAA;AAAA;AAAA,GAKK,MAACX,GAAE,WAAWO,GAAEP,GAAE,aAAaE,GAAEK,GAAEA,GAAE,aAAa,WAAW,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,OAAON,GAAE,QAAQS,GAAE,OAAO,KAAK,OAAM,EAAG,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,IAAIP,GAAE,IAAIO,GAAEJ,GAAE,IAAIH,EAAC,IAAIE,GAAE,SAASO,GAAE,IAAIP,GAAE,cAAc,EAAE,EAAEI,GAAE,GAAU,IAAP,MAAoB,OAAO,GAAjB,UAAgC,OAAO,GAAnB,WAAqBE,GAAE,MAAM,QAAQI,GAAE,GAAGJ,GAAE,CAAC,GAAe,OAAO,iBAAI,OAAO,YAA9B,WAAwCG,GAAE;AAAA,OAAcE,GAAE,sDAAsDK,GAAE,OAAOC,GAAE,KAAKC,GAAE,OAAO,KAAKT,EAAC,qBAAqBA,EAAC,KAAKA,EAAC;AAAA,0BAAsC,GAAG,EAAED,GAAE,KAAKW,GAAE,KAAKC,GAAE,qCAAqCL,GAAE,GAAG,CAACb,KAAKL,KAAK,CAAC,WAAW,EAAE,QAAQK,EAAE,OAAOL,CAAC,GAAGwB,EAAEN,GAAE,CAAC,EAAgBO,GAAE,OAAO,IAAI,cAAc,EAAEC,EAAE,OAAO,IAAI,aAAa,EAAEC,GAAE,IAAI,QAAQC,GAAEzB,GAAE,iBAAiBA,GAAE,GAAG,EAAE,SAAS0B,GAAE,EAAExB,EAAE,CAAC,GAAG,CAACI,GAAE,CAAC,GAAG,CAAC,EAAE,eAAe,KAAK,EAAE,MAAM,MAAM,gCAAgC,EAAE,OAAgBT,KAAT,OAAWA,GAAE,WAAWK,CAAC,EAAEA,CAAC,CAAC,MAAMyB,GAAE,CAAC,EAAEzB,IAAI,CAAC,MAAML,EAAE,EAAE,OAAO,EAAEC,EAAE,GAAG,IAAIE,EAAEO,EAAML,IAAJ,EAAM,QAAYA,IAAJ,EAAM,SAAS,GAAGE,EAAEO,GAAE,QAAQT,EAAE,EAAEA,EAAEL,EAAEK,IAAI,CAAC,MAAML,EAAE,EAAEK,CAAC,EAAE,IAAII,EAAEI,EAAED,EAAE,GAAGM,EAAE,EAAE,KAAKA,EAAElB,EAAE,SAASO,EAAE,UAAUW,EAAEL,EAAEN,EAAE,KAAKP,CAAC,EAASa,IAAP,OAAWK,EAAEX,EAAE,UAAUA,IAAIO,GAAUD,EAAE,CAAC,IAAX,MAAaN,EAAEY,GAAWN,EAAE,CAAC,IAAZ,OAAcN,EAAEa,GAAWP,EAAE,CAAC,IAAZ,QAAeU,GAAE,KAAKV,EAAE,CAAC,CAAC,IAAIV,EAAE,OAAO,KAAKU,EAAE,CAAC,EAAE,GAAG,GAAGN,EAAEc,IAAYR,EAAE,CAAC,IAAZ,SAAgBN,EAAEc,IAAGd,IAAIc,GAAQR,EAAE,CAAC,IAAT,KAAYN,EAAEJ,GAAGW,GAAEF,EAAE,IAAaC,EAAE,CAAC,IAAZ,OAAcD,EAAE,IAAIA,EAAEL,EAAE,UAAUM,EAAE,CAAC,EAAE,OAAOJ,EAAEI,EAAE,CAAC,EAAEN,EAAWM,EAAE,CAAC,IAAZ,OAAcQ,GAAQR,EAAE,CAAC,IAAT,IAAWS,GAAEX,IAAGJ,IAAIe,IAAGf,IAAII,GAAEJ,EAAEc,GAAEd,IAAIY,IAAGZ,IAAIa,GAAEb,EAAEO,IAAGP,EAAEc,GAAElB,EAAE,QAAQ,MAAMqB,EAAEjB,IAAIc,IAAG,EAAEhB,EAAE,CAAC,EAAE,WAAW,IAAI,EAAE,IAAI,GAAGK,GAAGH,IAAIO,GAAEd,EAAEI,GAAEQ,GAAG,GAAGX,EAAE,KAAKQ,CAAC,EAAET,EAAE,MAAM,EAAEY,CAAC,EAAEb,GAAEC,EAAE,MAAMY,CAAC,EAAEJ,GAAEgB,GAAGxB,EAAEQ,IAAQI,IAAL,GAAOP,EAAEmB,EAAE,CAAC,MAAM,CAACK,GAAE,EAAEnB,GAAG,EAAEV,CAAC,GAAG,QAAYK,IAAJ,EAAM,SAAaA,IAAJ,EAAM,UAAU,GAAG,EAAEJ,CAAC,CAAC,EAAE,MAAM8B,EAAC,CAAC,YAAY,CAAC,QAAQjC,EAAE,WAAWE,CAAC,EAAEI,EAAE,CAAC,IAAID,EAAE,KAAK,MAAM,CAAA,EAAG,IAAII,EAAE,EAAE,EAAE,EAAE,MAAMM,EAAEf,EAAE,OAAO,EAAEc,EAAE,KAAK,MAAM,CAACE,EAAEK,CAAC,EAAEW,GAAEhC,EAAEE,CAAC,EAAE,GAAG,KAAK,GAAG+B,GAAE,cAAcjB,EAAEV,CAAC,EAAEwB,GAAE,YAAY,KAAK,GAAG,QAAY5B,IAAJ,GAAWA,IAAJ,EAAM,CAAC,MAAMF,EAAE,KAAK,GAAG,QAAQ,WAAWA,EAAE,YAAY,GAAGA,EAAE,UAAU,CAAC,CAAC,MAAaK,EAAEyB,GAAE,cAAZ,MAAyBhB,EAAE,OAAOC,GAAG,CAAC,GAAOV,EAAE,WAAN,EAAe,CAAC,GAAGA,EAAE,gBAAgB,UAAUL,KAAKK,EAAE,kBAAiB,EAAG,GAAGL,EAAE,SAASC,EAAC,EAAE,CAAC,MAAMM,EAAEc,EAAE,GAAG,EAAEnB,EAAEG,EAAE,aAAaL,CAAC,EAAE,MAAMU,EAAC,EAAET,EAAE,eAAe,KAAKM,CAAC,EAAEO,EAAE,KAAK,CAAC,KAAK,EAAE,MAAML,EAAE,KAAKR,EAAE,CAAC,EAAE,QAAQC,EAAE,KAAWD,EAAE,CAAC,IAAT,IAAWiC,GAAQjC,EAAE,CAAC,IAAT,IAAWkC,GAAQlC,EAAE,CAAC,IAAT,IAAWmC,GAAEC,EAAC,CAAC,EAAEhC,EAAE,gBAAgBL,CAAC,CAAC,MAAMA,EAAE,WAAWU,EAAC,IAAII,EAAE,KAAK,CAAC,KAAK,EAAE,MAAML,CAAC,CAAC,EAAEJ,EAAE,gBAAgBL,CAAC,GAAG,GAAGyB,GAAE,KAAKpB,EAAE,OAAO,EAAE,CAAC,MAAML,EAAEK,EAAE,YAAY,MAAMK,EAAC,EAAER,EAAEF,EAAE,OAAO,EAAE,GAAGE,EAAE,EAAE,CAACG,EAAE,YAAYE,GAAEA,GAAE,YAAY,GAAG,QAAQA,EAAE,EAAEA,EAAEL,EAAEK,IAAIF,EAAE,OAAOL,EAAEO,CAAC,EAAEK,GAAC,CAAE,EAAEkB,GAAE,SAAQ,EAAGhB,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAEL,CAAC,CAAC,EAAEJ,EAAE,OAAOL,EAAEE,CAAC,EAAEU,IAAG,CAAC,CAAC,CAAC,SAAaP,EAAE,WAAN,EAAe,GAAGA,EAAE,OAAOF,GAAEW,EAAE,KAAK,CAAC,KAAK,EAAE,MAAML,CAAC,CAAC,MAAM,CAAC,IAAIT,EAAE,GAAG,MAAWA,EAAEK,EAAE,KAAK,QAAQK,GAAEV,EAAE,CAAC,KAA5B,IAAgCc,EAAE,KAAK,CAAC,KAAK,EAAE,MAAML,CAAC,CAAC,EAAET,GAAGU,GAAE,OAAO,CAAC,CAACD,GAAG,CAAC,CAAC,OAAO,cAAcT,EAAE,EAAE,CAAC,MAAME,EAAEG,GAAE,cAAc,UAAU,EAAE,OAAOH,EAAE,UAAUF,EAAEE,CAAC,CAAC,CAAC,SAASM,GAAE,EAAED,EAAEL,EAAE,EAAED,EAAE,SAAC,GAAGM,IAAIoB,GAAE,OAAOpB,EAAE,IAAIG,EAAWT,IAAT,QAAWiB,EAAAhB,EAAE,OAAF,YAAAgB,EAASjB,GAAGC,EAAE,KAAK,MAAMC,EAAEM,GAAEF,CAAC,EAAE,OAAOA,EAAE,gBAAgB,OAAOG,GAAA,YAAAA,EAAG,eAAcP,KAAIgB,EAAAT,GAAA,YAAAA,EAAG,OAAH,MAAAS,EAAA,KAAAT,EAAU,IAAaP,IAAT,OAAWO,EAAE,QAAQA,EAAE,IAAIP,EAAE,CAAC,EAAEO,EAAE,KAAK,EAAER,EAAED,CAAC,GAAYA,IAAT,QAAYC,EAAE,OAAFA,EAAE,KAAO,CAAA,IAAID,CAAC,EAAES,EAAER,EAAE,KAAKQ,GAAYA,IAAT,SAAaH,EAAEC,GAAE,EAAEE,EAAE,KAAK,EAAEH,EAAE,MAAM,EAAEG,EAAET,CAAC,GAAGM,CAAC,CAAC,MAAM+B,EAAC,CAAC,YAAYtC,EAAE,EAAE,CAAC,KAAK,KAAK,GAAG,KAAK,KAAK,OAAO,KAAK,KAAKA,EAAE,KAAK,KAAK,CAAC,CAAC,IAAI,YAAY,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,EAAEA,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,MAAME,CAAC,EAAE,KAAK,KAAKD,IAAGD,GAAA,YAAAA,EAAG,gBAAeK,IAAG,WAAW,EAAE,EAAE,EAAEyB,GAAE,YAAY7B,EAAE,IAAIS,EAAEoB,GAAE,SAAQ,EAAG3B,EAAE,EAAEG,EAAE,EAAEM,EAAEV,EAAE,CAAC,EAAE,KAAcU,IAAT,QAAY,CAAC,GAAGT,IAAIS,EAAE,MAAM,CAAC,IAAIL,EAAMK,EAAE,OAAN,EAAWL,EAAE,IAAIgC,GAAE7B,EAAEA,EAAE,YAAY,KAAKV,CAAC,EAAMY,EAAE,OAAN,EAAWL,EAAE,IAAIK,EAAE,KAAKF,EAAEE,EAAE,KAAKA,EAAE,QAAQ,KAAKZ,CAAC,EAAMY,EAAE,OAAN,IAAaL,EAAE,IAAIiC,GAAE9B,EAAE,KAAKV,CAAC,GAAG,KAAK,KAAK,KAAKO,CAAC,EAAEK,EAAEV,EAAE,EAAEI,CAAC,CAAC,CAACH,KAAIS,GAAA,YAAAA,EAAG,SAAQF,EAAEoB,GAAE,SAAQ,EAAG3B,IAAI,CAAC,OAAO2B,GAAE,YAAYzB,GAAEJ,CAAC,CAAC,EAAED,EAAE,CAAC,IAAI,EAAE,EAAE,UAAUE,KAAK,KAAK,KAAcA,IAAT,SAAsBA,EAAE,UAAX,QAAoBA,EAAE,KAAKF,EAAEE,EAAE,CAAC,EAAE,GAAGA,EAAE,QAAQ,OAAO,GAAGA,EAAE,KAAKF,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAMuC,EAAC,CAAC,IAAI,MAAM,OAAC,QAAOrB,EAAA,KAAK,OAAL,YAAAA,EAAW,OAAM,KAAK,IAAI,CAAC,YAAYlB,EAAE,EAAEE,EAAED,EAAE,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK2B,EAAE,KAAK,KAAK,OAAO,KAAK,KAAK5B,EAAE,KAAK,KAAK,EAAE,KAAK,KAAKE,EAAE,KAAK,QAAQD,EAAE,KAAK,MAAKA,GAAA,YAAAA,EAAG,cAAa,EAAE,CAAC,IAAI,YAAY,CAAC,IAAID,EAAE,KAAK,KAAK,WAAW,MAAM,EAAE,KAAK,KAAK,OAAgB,IAAT,SAAiBA,GAAA,YAAAA,EAAG,YAAR,KAAmBA,EAAE,EAAE,YAAYA,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,CAAC,KAAKA,EAAE,EAAE,KAAK,CAACA,EAAEQ,GAAE,KAAKR,EAAE,CAAC,EAAES,GAAET,CAAC,EAAEA,IAAI4B,GAAS5B,GAAN,MAAcA,IAAL,IAAQ,KAAK,OAAO4B,GAAG,KAAK,KAAI,EAAG,KAAK,KAAKA,GAAG5B,IAAI,KAAK,MAAMA,IAAI2B,IAAG,KAAK,EAAE3B,CAAC,EAAWA,EAAE,aAAX,OAAsB,KAAK,EAAEA,CAAC,EAAWA,EAAE,WAAX,OAAoB,KAAK,EAAEA,CAAC,EAAEe,GAAEf,CAAC,EAAE,KAAK,EAAEA,CAAC,EAAE,KAAK,EAAEA,CAAC,CAAC,CAAC,EAAEA,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,aAAaA,EAAE,KAAK,IAAI,CAAC,CAAC,EAAEA,EAAE,CAAC,KAAK,OAAOA,IAAI,KAAK,KAAI,EAAG,KAAK,KAAK,KAAK,EAAEA,CAAC,EAAE,CAAC,EAAEA,EAAE,CAAC,KAAK,OAAO4B,GAAGnB,GAAE,KAAK,IAAI,EAAE,KAAK,KAAK,YAAY,KAAKT,EAAE,KAAK,EAAEK,GAAE,eAAeL,CAAC,CAAC,EAAE,KAAK,KAAKA,CAAC,CAAC,EAAEA,EAAE,OAAC,KAAK,CAAC,OAAO,EAAE,WAAWE,CAAC,EAAEF,EAAEC,EAAY,OAAOC,GAAjB,SAAmB,KAAK,KAAKF,CAAC,GAAYE,EAAE,KAAX,SAAgBA,EAAE,GAAG+B,GAAE,cAAcF,GAAE7B,EAAE,EAAEA,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,OAAO,GAAGA,GAAG,KAAGgB,EAAA,KAAK,OAAL,YAAAA,EAAW,QAAOjB,EAAE,KAAK,KAAK,EAAE,CAAC,MAAM,CAAC,MAAMD,EAAE,IAAIsC,GAAErC,EAAE,IAAI,EAAEC,EAAEF,EAAE,EAAE,KAAK,OAAO,EAAEA,EAAE,EAAE,CAAC,EAAE,KAAK,EAAEE,CAAC,EAAE,KAAK,KAAKF,CAAC,CAAC,CAAC,KAAKA,EAAE,CAAC,IAAI,EAAE6B,GAAE,IAAI7B,EAAE,OAAO,EAAE,OAAgB,IAAT,QAAY6B,GAAE,IAAI7B,EAAE,QAAQ,EAAE,IAAIiC,GAAEjC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAEA,EAAE,CAACW,GAAE,KAAK,IAAI,IAAI,KAAK,KAAK,CAAA,EAAG,KAAK,KAAI,GAAI,MAAM,EAAE,KAAK,KAAK,IAAIT,EAAED,EAAE,EAAE,UAAUS,KAAKV,EAAEC,IAAI,EAAE,OAAO,EAAE,KAAKC,EAAE,IAAIqC,GAAE,KAAK,EAAE3B,GAAC,CAAE,EAAE,KAAK,EAAEA,IAAG,EAAE,KAAK,KAAK,OAAO,CAAC,EAAEV,EAAE,EAAED,CAAC,EAAEC,EAAE,KAAKQ,CAAC,EAAET,IAAIA,EAAE,EAAE,SAAS,KAAK,KAAKC,GAAGA,EAAE,KAAK,YAAYD,CAAC,EAAE,EAAE,OAAOA,EAAE,CAAC,KAAKD,EAAE,KAAK,KAAK,YAAY,EAAE,OAAC,KAAIkB,EAAA,KAAK,OAAL,YAAAA,EAAA,UAAY,GAAG,GAAG,GAAGlB,IAAI,KAAK,MAAM,CAAC,MAAMO,EAAEP,EAAE,YAAYA,EAAE,OAAM,EAAGA,EAAEO,CAAC,CAAC,CAAC,aAAaP,EAAE,OAAU,KAAK,OAAd,SAAqB,KAAK,KAAKA,GAAEkB,EAAA,KAAK,OAAL,MAAAA,EAAA,UAAYlB,GAAG,CAAC,CAAC,MAAMqC,EAAC,CAAC,IAAI,SAAS,CAAC,OAAO,KAAK,QAAQ,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,YAAYrC,EAAE,EAAEE,EAAED,EAAES,EAAE,CAAC,KAAK,KAAK,EAAE,KAAK,KAAKkB,EAAE,KAAK,KAAK,OAAO,KAAK,QAAQ5B,EAAE,KAAK,KAAK,EAAE,KAAK,KAAKC,EAAE,KAAK,QAAQS,EAAER,EAAE,OAAO,GAAQA,EAAE,CAAC,IAAR,IAAgBA,EAAE,CAAC,IAAR,IAAW,KAAK,KAAK,MAAMA,EAAE,OAAO,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,QAAQA,GAAG,KAAK,KAAK0B,CAAC,CAAC,KAAK5B,EAAE,EAAE,KAAKE,EAAED,EAAE,CAAC,MAAMS,EAAE,KAAK,QAAQ,IAAIP,EAAE,GAAG,GAAYO,IAAT,OAAWV,EAAEQ,GAAE,KAAKR,EAAE,EAAE,CAAC,EAAEG,EAAE,CAACM,GAAET,CAAC,GAAGA,IAAI,KAAK,MAAMA,IAAI2B,GAAExB,IAAI,KAAK,KAAKH,OAAO,CAAC,MAAMC,EAAED,EAAE,IAAIM,EAAED,EAAE,IAAIL,EAAEU,EAAE,CAAC,EAAEJ,EAAE,EAAEA,EAAEI,EAAE,OAAO,EAAEJ,IAAID,EAAEG,GAAE,KAAKP,EAAEC,EAAEI,CAAC,EAAE,EAAEA,CAAC,EAAED,IAAIsB,KAAItB,EAAE,KAAK,KAAKC,CAAC,GAAGH,MAAI,CAACM,GAAEJ,CAAC,GAAGA,IAAI,KAAK,KAAKC,CAAC,GAAED,IAAIuB,EAAE5B,EAAE4B,EAAE5B,IAAI4B,IAAI5B,IAAIK,GAAG,IAAIK,EAAEJ,EAAE,CAAC,GAAG,KAAK,KAAKA,CAAC,EAAED,CAAC,CAACF,GAAG,CAACF,GAAG,KAAK,EAAED,CAAC,CAAC,CAAC,EAAEA,EAAE,CAACA,IAAI4B,EAAE,KAAK,QAAQ,gBAAgB,KAAK,IAAI,EAAE,KAAK,QAAQ,aAAa,KAAK,KAAK5B,GAAG,EAAE,CAAC,CAAC,CAAC,MAAMkC,WAAUG,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,EAAErC,EAAE,CAAC,KAAK,QAAQ,KAAK,IAAI,EAAEA,IAAI4B,EAAE,OAAO5B,CAAC,CAAC,CAAC,MAAMmC,WAAUE,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,KAAK,CAAC,CAAC,EAAErC,EAAE,CAAC,KAAK,QAAQ,gBAAgB,KAAK,KAAK,CAAC,CAACA,GAAGA,IAAI4B,CAAC,CAAC,CAAC,CAAC,MAAMQ,WAAUC,EAAC,CAAC,YAAYrC,EAAE,EAAEE,EAAED,EAAES,EAAE,CAAC,MAAMV,EAAE,EAAEE,EAAED,EAAES,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,KAAKV,EAAE,EAAE,KAAK,CAAC,IAAIA,EAAEQ,GAAE,KAAKR,EAAE,EAAE,CAAC,GAAG4B,KAAKD,GAAE,OAAO,MAAMzB,EAAE,KAAK,KAAKD,EAAED,IAAI4B,GAAG1B,IAAI0B,GAAG5B,EAAE,UAAUE,EAAE,SAASF,EAAE,OAAOE,EAAE,MAAMF,EAAE,UAAUE,EAAE,QAAQQ,EAAEV,IAAI4B,IAAI1B,IAAI0B,GAAG3B,GAAGA,GAAG,KAAK,QAAQ,oBAAoB,KAAK,KAAK,KAAKC,CAAC,EAAEQ,GAAG,KAAK,QAAQ,iBAAiB,KAAK,KAAK,KAAKV,CAAC,EAAE,KAAK,KAAKA,CAAC,CAAC,YAAYA,EAAE,OAAa,OAAO,KAAK,MAAxB,WAA6B,KAAK,KAAK,OAAKkB,EAAA,KAAK,UAAL,YAAAA,EAAc,OAAM,KAAK,QAAQlB,CAAC,EAAE,KAAK,KAAK,YAAYA,CAAC,CAAC,CAAC,CAAC,MAAMwC,EAAC,CAAC,YAAYxC,EAAE,EAAEE,EAAE,CAAC,KAAK,QAAQF,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,QAAQE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,KAAKF,EAAE,CAACQ,GAAE,KAAKR,CAAC,CAAC,CAAC,CAAM,MAA6DyC,GAAEzC,GAAE,uBAAuByC,IAAA,MAAAA,GAAIR,GAAEM,KAAIvC,GAAE,kBAAFA,GAAE,gBAAkB,CAAA,IAAI,KAAK,OAAO,EAAE,MAAM0C,GAAE,CAAC,EAAEnC,EAAEL,IAAI,CAAC,MAAMD,GAAEC,GAAA,YAAAA,EAAG,eAAcK,EAAE,IAAIG,EAAET,EAAE,WAAW,GAAYS,IAAT,OAAW,CAAC,MAAMV,GAAEE,GAAA,YAAAA,EAAG,eAAc,KAAKD,EAAE,WAAWS,EAAE,IAAI6B,GAAEhC,EAAE,aAAaK,GAAC,EAAGZ,CAAC,EAAEA,EAAE,OAAOE,GAAG,CAAA,CAAE,CAAC,CAAC,OAAOQ,EAAE,KAAK,CAAC,EAAEA,CAAC,ECJ16N;AAAA;AAAA;AAAA;AAAA,GAIG,MAAMR,GAAE,kBAAW,cAAgBF,EAAC,CAAC,aAAa,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,cAAc,CAAC,KAAK,IAAI,EAAE,KAAK,KAAK,MAAM,CAAC,kBAAkB,OAAC,MAAMA,EAAE,MAAM,iBAAgB,EAAG,OAAOkB,EAAA,KAAK,eAAc,eAAnBA,EAAmB,aAAelB,EAAE,YAAWA,CAAC,CAAC,OAAOA,EAAE,CAAC,MAAMK,EAAE,KAAK,OAAM,EAAG,KAAK,aAAa,KAAK,cAAc,YAAY,KAAK,aAAa,MAAM,OAAOL,CAAC,EAAE,KAAK,KAAKC,GAAEI,EAAE,KAAK,WAAW,KAAK,aAAa,CAAC,CAAC,mBAAmB,OAAC,MAAM,kBAAiB,GAAGa,EAAA,KAAK,OAAL,MAAAA,EAAW,aAAa,GAAG,CAAC,sBAAsB,OAAC,MAAM,qBAAoB,GAAGA,EAAA,KAAK,OAAL,MAAAA,EAAW,aAAa,GAAG,CAAC,QAAQ,CAAC,OAAOb,EAAC,CAAC,EAACE,GAAE,cAAc,GAAGA,GAAE,UAAa,IAAGL,GAAAA,GAAE,2BAAFA,MAAAA,GAAAA,KAAAA,GAA6B,CAAC,WAAWK,EAAC,GAAG,MAAMJ,GAAED,GAAE,0BAA0BC,IAAAA,MAAAA,GAAI,CAAC,WAAWI,EAAC,IAAyDL,GAAE,qBAAFA,GAAE,mBAAqB,KAAI,KAAK,OAAO,ECL/xB;AAAA;AAAA;AAAA;AAAA,GAKA,MAAMF,GAAE,GAAG,CAAC,EAAEG,IAAI,CAAUA,WAAEA,EAAE,gBAAgB,IAAI,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC,EAAC,EAAG,eAAe,OAAO,EAAE,CAAC,CAAC,ECJ7G;AAAA;AAAA;AAAA;AAAA,GAIG,MAAMA,GAAE,CAAC,UAAU,GAAG,KAAK,OAAO,UAAUH,GAAE,QAAQ,GAAG,WAAWC,EAAC,EAAEI,GAAE,CAAC,EAAEF,GAAE,EAAEE,IAAI,CAAC,KAAK,CAAC,KAAKC,EAAE,SAASC,CAAC,EAAEF,EAAE,IAAI,EAAE,WAAW,oBAAoB,IAAIE,CAAC,EAAE,GAAY,IAAT,QAAY,WAAW,oBAAoB,IAAIA,EAAE,EAAE,IAAI,GAAG,EAAaD,IAAX,YAAgB,EAAE,OAAO,OAAO,CAAC,GAAG,QAAQ,IAAI,EAAE,IAAID,EAAE,KAAK,CAAC,EAAeC,IAAb,WAAe,CAAC,KAAK,CAAC,KAAKH,CAAC,EAAEE,EAAE,MAAM,CAAC,IAAIA,EAAE,CAAC,MAAMC,EAAE,EAAE,IAAI,KAAK,IAAI,EAAE,EAAE,IAAI,KAAK,KAAKD,CAAC,EAAE,KAAK,cAAcF,EAAEG,EAAE,CAAC,CAAC,EAAE,KAAKL,EAAE,CAAC,OAAgBA,IAAT,QAAY,KAAK,EAAEE,EAAE,OAAO,EAAEF,CAAC,EAAEA,CAAC,CAAC,CAAC,CAAC,GAAcK,IAAX,SAAa,CAAC,KAAK,CAAC,KAAKH,CAAC,EAAEE,EAAE,OAAO,SAASA,EAAE,CAAC,MAAMC,EAAE,KAAKH,CAAC,EAAE,EAAE,KAAK,KAAKE,CAAC,EAAE,KAAK,cAAcF,EAAEG,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,MAAM,mCAAmCA,CAAC,CAAC,EAAE,SAASA,EAAE,EAAE,CAAC,MAAM,CAAC,EAAEH,IAAc,OAAOA,GAAjB,SAAmBE,GAAE,EAAE,EAAEF,CAAC,GAAG,CAACH,EAAEC,EAAEE,IAAI,CAAC,MAAME,EAAEJ,EAAE,eAAeE,CAAC,EAAE,OAAOF,EAAE,YAAY,eAAeE,EAAEH,CAAC,EAAEK,EAAE,OAAO,yBAAyBJ,EAAEE,CAAC,EAAE,MAAM,GAAG,EAAE,EAAEA,CAAC,CAAC,CCJryB;AAAA;AAAA;AAAA;AAAA,GAIG,SAASE,EAAEA,EAAE,CAAC,OAAOL,EAAE,CAAC,GAAGK,EAAE,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC,CCLvD;AAAA;AAAA;AAAA;AAAA,GAKA,MAAMJ,GAAE,CAACA,EAAED,EAAES,KAAKA,EAAE,aAAa,GAAGA,EAAE,WAAW,GAAG,QAAQ,UAAoB,OAAOT,GAAjB,UAAoB,OAAO,eAAeC,EAAED,EAAES,CAAC,EAAEA,GCJvH;AAAA;AAAA;AAAA;AAAA,GAIG,SAASR,GAAEA,EAAEI,EAAE,CAAC,MAAM,CAACC,EAAEJ,EAAEK,IAAI,CAAC,MAAMJ,EAAEH,GAAC,OAAE,QAAAkB,EAAAlB,EAAE,aAAF,YAAAkB,EAAc,cAAcjB,KAAI,MAAwP,OAAOD,GAAEM,EAAEJ,EAAE,CAAC,KAAK,CAAC,OAAOC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CCL5W;AAAA;AAAA;AAAA;AAAA,UAKA,cAAgB,KAAK,CAAC,YAAYD,EAAEF,EAAEC,EAAEE,EAAE,CAAC,MAAM,kBAAkB,CAAC,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,KAAK,QAAQD,EAAE,KAAK,cAAcF,EAAE,KAAK,SAASC,EAAE,KAAK,UAAUE,GAAG,EAAE,CAAC,ECLtK;AAAA;AAAA;AAAA;AAAA,GAKA,SAASG,GAAEA,EAAE,CAAC,OAAOA,CAAC,CCJtB;AAAA;AAAA;AAAA;AAAA,GAIA,IAAAqC,GAAG,KAAO,CAAC,YAAY3C,EAAEE,EAAEK,EAAEG,EAAE,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,SAAS,GAAG,KAAK,MAAM,OAAO,KAAK,EAAE,CAACV,EAAEE,IAAI,CAAC,KAAK,cAAc,KAAK,cAAcA,IAAI,KAAK,SAAS,GAAG,KAAK,YAAW,GAAI,KAAK,WAAW,KAAK,YAAW,GAAI,KAAK,MAAMF,EAAE,KAAK,KAAK,cAAa,EAAG,KAAK,UAAU,CAAC,KAAK,YAAY,KAAK,SAAS,GAAG,KAAK,UAAU,KAAK,SAASA,EAAEE,CAAC,GAAG,KAAK,YAAYA,CAAC,EAAE,KAAK,KAAKF,EAAWE,EAAE,UAAX,OAAmB,CAAC,MAAMF,EAAEE,EAAE,KAAK,QAAQF,EAAE,QAAQ,KAAK,SAASA,EAAE,SAAS,KAAK,UAAUA,EAAE,WAAW,EAAE,MAAM,KAAK,QAAQE,EAAE,KAAK,SAASK,EAAE,KAAK,UAAUG,GAAG,GAAG,KAAK,KAAK,cAAc,IAAI,CAAC,CAAC,eAAe,CAAC,KAAK,gBAAe,CAAE,CAAC,kBAAkB,CAAC,KAAK,cAAc,KAAK,YAAW,EAAG,KAAK,YAAY,OAAO,CAAC,iBAAiB,CAAC,KAAK,KAAK,cAAc,IAAIV,GAAE,KAAK,QAAQ,KAAK,KAAK,KAAK,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,ECLlxB;AAAA;AAAA;AAAA;AAAA,GAKA,MAAME,EAAC,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,MAAMA,EAAE,CAAC,KAAK,SAASA,CAAC,CAAC,CAAC,SAASA,EAAEF,EAAE,GAAG,CAAC,MAAMO,EAAEP,GAAG,CAAC,OAAO,GAAGE,EAAE,KAAK,CAAC,EAAE,KAAK,EAAEA,EAAEK,GAAG,KAAK,gBAAe,CAAE,CAAC,YAAYL,EAAE,CAAC,KAAK,cAAc,IAAI,IAAI,KAAK,gBAAgB,IAAI,CAAC,SAAS,CAACA,EAAE,CAAC,SAASF,CAAC,CAAC,IAAI,KAAK,cAAcE,EAAE,KAAK,EAAEF,CAAC,CAAC,EAAWE,IAAT,SAAa,KAAK,MAAMA,EAAE,CAAC,YAAYA,EAAEF,EAAEO,EAAE,CAAC,GAAG,CAACA,EAAE,OAAO,KAAKL,EAAE,KAAK,KAAK,EAAE,KAAK,cAAc,IAAIA,CAAC,GAAG,KAAK,cAAc,IAAIA,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,cAAc,OAAOA,CAAC,CAAC,EAAE,aAAaF,CAAC,CAAC,EAAE,KAAK,CAAC,SAASU,CAAC,EAAE,KAAK,cAAc,IAAIR,CAAC,EAAEA,EAAE,KAAK,MAAMQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,KAAK,cAAc,MAAK,CAAE,CAAC,CCJ5jB;AAAA;AAAA;AAAA;AAAA,GAIA,IAAAkC,GAAG,cAAgB,KAAK,CAAC,YAAY5C,EAAEE,EAAE,CAAC,MAAM,mBAAmB,CAAC,QAAQ,GAAG,SAAS,EAAE,CAAC,EAAE,KAAK,QAAQF,EAAE,KAAK,cAAcE,CAAC,CAAC,EAAA2C,GAAC,cAAgB3C,EAAC,CAAC,YAAYA,EAAED,EAAEM,EAAE,SAAC,MAAeN,EAAE,UAAX,OAAmBA,EAAE,aAAaM,CAAC,EAAE,KAAK,iBAAiBP,GAAG,CAAC,GAAGA,EAAE,UAAU,KAAK,QAAQ,OAAO,MAAME,EAAEF,EAAE,eAAeA,EAAE,aAAY,EAAG,CAAC,EAAEE,IAAI,KAAK,OAAOF,EAAE,kBAAkB,KAAK,YAAYA,EAAE,SAASE,EAAEF,EAAE,SAAS,EAAE,EAAE,KAAK,kBAAkBE,GAAG,CAAoC,GAAhCA,EAAE,UAAU,KAAK,UAAmBA,EAAE,eAAeA,EAAE,eAAe,CAAC,KAAK,KAAK,KAAK,OAAO,MAAMD,EAAE,IAAI,IAAI,SAAS,CAACC,EAAE,CAAC,aAAaK,CAAC,CAAC,IAAI,KAAK,cAAcN,EAAE,IAAIC,CAAC,IAAID,EAAE,IAAIC,CAAC,EAAEK,EAAE,cAAc,IAAIP,GAAE,KAAK,QAAQO,EAAEL,EAAE,EAAE,CAAC,GAAGA,EAAE,gBAAe,CAAE,EAAE,KAAK,KAAKA,EAAWD,EAAE,UAAX,OAAmB,KAAK,QAAQA,EAAE,QAAQ,KAAK,QAAQA,EAAE,KAAK,gBAAe,GAAGkB,GAAAD,EAAA,KAAK,MAAK,gBAAV,MAAAC,EAAA,KAAAD,EAA0B,KAAK,CAAC,iBAAiB,CAAC,KAAK,KAAK,iBAAiB,kBAAkB,KAAK,gBAAgB,EAAE,KAAK,KAAK,iBAAiB,mBAAmB,KAAK,iBAAiB,CAAC,CAAC,eAAe,CAAC,KAAK,KAAK,cAAc,IAAIjB,GAAE,KAAK,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,ECJhgC;AAAA;AAAA;AAAA;AAAA,GAIG,SAASQ,GAAE,CAAC,QAAQA,EAAE,UAAU,CAAC,EAAE,CAAC,MAAM,CAACN,EAAEG,IAAI,CAAW,OAAOA,GAAjB,SAAmBA,EAAE,gBAAgB,UAAU,CAAC,IAAIN,GAAE,KAAK,CAAC,QAAQS,EAAE,SAAST,GAAG,CAACG,EAAE,IAAI,KAAK,KAAKH,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAC,EAAGG,EAAE,YAAY,gBAAgBA,GAAG,CAAC,IAAIH,GAAEG,EAAE,CAAC,QAAQM,EAAE,SAAST,GAAG,CAACG,EAAEG,CAAC,EAAEN,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAC,CAAE,CAAC,CCyDjQ,MAAM8C,GAA4C,gBAgClD,MAAMC,EAAuB,CAKlC,YAAYC,EAA4C,CAJxD,KAAQ,cAAqC,KAC7C,KAAQ,iBAAmB,IAC3B,KAAQ,UAAyC,KAG/CA,EAAK,cAAc,IAAI,CACzB,CAMA,eAAgB,CAAC,CACjB,kBAAmB,CACjB,KAAK,WAAA,CACP,CAEA,IAAI,eAAeC,EAA0B,CAC3C,KAAK,UAAYA,CACnB,CAEA,QAAQC,EAA0C,CAChD,KAAK,WAAA,EAEL,KAAK,cAAgBA,EAAe,UAAWC,GAAU,OACvD,UAAWC,KAAQD,EACb,KAAK,aAAa,IAAIC,EAAK,EAAE,IACjC,KAAK,aAAa,IAAIA,EAAK,EAAE,GAE7BlC,EAAA,KAAK,YAAL,MAAAA,EAAA,UAAiB,CACf,KAAAkC,EACA,WAAYA,EAAK,SACjB,aAAcA,EAAK,IAAA,GAGzB,CAAC,CACH,CAEA,YAAmB,QACjBlC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,cACpB,KAAK,cAAgB,KACrB,KAAK,aAAa,MAAA,CACpB,CACF,CC/FO,MAAMmC,GAA6C,aCyBnD,SAASC,GAAkBC,EAA2BC,EAAkC,CAC7FD,EAAQ,UAAYC,CACtB,CAOO,SAASC,GAAkBF,EAAiC,CAC7DA,EAAQ,YACVA,EAAQ,UAAY,KAExB,CCjEA,IAAIG,GAAgB,SAAS5C,EAAGG,EAAG,CACjC,OAAAyC,GAAgB,OAAO,gBAClB,CAAE,UAAW,CAAA,aAAgB,OAAS,SAAU5C,EAAGG,EAAG,CAAEH,EAAE,UAAYG,CAAG,GAC1E,SAAUH,EAAGG,EAAG,CAAE,QAASJ,KAAKI,EAAO,OAAO,UAAU,eAAe,KAAKA,EAAGJ,CAAC,IAAGC,EAAED,CAAC,EAAII,EAAEJ,CAAC,EAAG,EAC7F6C,GAAc5C,EAAGG,CAAC,CAC3B,EAEO,SAAS0C,GAAU7C,EAAGG,EAAG,CAC9B,GAAI,OAAOA,GAAM,YAAcA,IAAM,KACjC,MAAM,IAAI,UAAU,uBAAyB,OAAOA,CAAC,EAAI,+BAA+B,EAC5FyC,GAAc5C,EAAGG,CAAC,EAClB,SAAS2C,GAAK,CAAE,KAAK,YAAc9C,CAAG,CACtCA,EAAE,UAAYG,IAAM,KAAO,OAAO,OAAOA,CAAC,GAAK2C,EAAG,UAAY3C,EAAE,UAAW,IAAI2C,EACjF,CAqFO,SAASC,GAAUC,EAASC,EAAYhC,EAAGiC,EAAW,CAC3D,SAASC,EAAMC,EAAO,CAAE,OAAOA,aAAiBnC,EAAImC,EAAQ,IAAInC,EAAE,SAAUoC,EAAS,CAAEA,EAAQD,CAAK,CAAG,CAAC,CAAG,CAC3G,OAAO,IAAKnC,IAAMA,EAAI,UAAU,SAAUoC,EAASC,EAAQ,CACvD,SAASC,EAAUH,EAAO,CAAE,GAAI,CAAEI,EAAKN,EAAU,KAAKE,CAAK,CAAC,CAAG,OAASjE,EAAG,CAAEmE,EAAOnE,CAAC,CAAG,CAAE,CAC1F,SAASsE,EAASL,EAAO,CAAE,GAAI,CAAEI,EAAKN,EAAU,MAASE,CAAK,CAAC,CAAG,OAASjE,EAAG,CAAEmE,EAAOnE,CAAC,CAAG,CAAE,CAC7F,SAASqE,EAAKE,EAAQ,CAAEA,EAAO,KAAOL,EAAQK,EAAO,KAAK,EAAIP,EAAMO,EAAO,KAAK,EAAE,KAAKH,EAAWE,CAAQ,CAAG,CAC7GD,GAAMN,EAAYA,EAAU,MAAMF,EAASC,GAAc,CAAA,CAAE,GAAG,MAAM,CACxE,CAAC,CACH,CAEO,SAASU,GAAYX,EAASY,EAAM,CACzC,IAAIpD,EAAI,CAAE,MAAO,EAAG,KAAM,UAAW,CAAE,GAAItB,EAAE,CAAC,EAAI,EAAG,MAAMA,EAAE,CAAC,EAAG,OAAOA,EAAE,CAAC,CAAG,EAAG,KAAM,CAAA,EAAI,IAAK,CAAA,CAAE,EAAIgB,EAAGI,EAAGpB,EAAGwB,EAAI,OAAO,QAAQ,OAAO,UAAa,WAAa,SAAW,QAAQ,SAAS,EAC/L,OAAOA,EAAE,KAAOmD,EAAK,CAAC,EAAGnD,EAAE,MAAWmD,EAAK,CAAC,EAAGnD,EAAE,OAAYmD,EAAK,CAAC,EAAG,OAAO,QAAW,aAAenD,EAAE,OAAO,QAAQ,EAAI,UAAW,CAAE,OAAO,IAAM,GAAIA,EAC1J,SAASmD,EAAKrE,EAAG,CAAE,OAAO,SAAUe,EAAG,CAAE,OAAOiD,EAAK,CAAChE,EAAGe,CAAC,CAAC,CAAG,CAAG,CACjE,SAASiD,EAAKM,EAAI,CACd,GAAI5D,EAAG,MAAM,IAAI,UAAU,iCAAiC,EAC5D,KAAOQ,IAAMA,EAAI,EAAGoD,EAAG,CAAC,IAAMtD,EAAI,IAAKA,GAAG,GAAI,CAC1C,GAAIN,EAAI,EAAGI,IAAMpB,EAAI4E,EAAG,CAAC,EAAI,EAAIxD,EAAE,OAAYwD,EAAG,CAAC,EAAIxD,EAAE,SAAcpB,EAAIoB,EAAE,SAAcpB,EAAE,KAAKoB,CAAC,EAAG,GAAKA,EAAE,OAAS,EAAEpB,EAAIA,EAAE,KAAKoB,EAAGwD,EAAG,CAAC,CAAC,GAAG,KAAM,OAAO5E,EAE3J,OADIoB,EAAI,EAAGpB,IAAG4E,EAAK,CAACA,EAAG,CAAC,EAAI,EAAG5E,EAAE,KAAK,GAC9B4E,EAAG,CAAC,EAAC,CACT,IAAK,GAAG,IAAK,GAAG5E,EAAI4E,EAAI,MACxB,IAAK,GAAG,OAAAtD,EAAE,QAAgB,CAAE,MAAOsD,EAAG,CAAC,EAAG,KAAM,EAAK,EACrD,IAAK,GAAGtD,EAAE,QAASF,EAAIwD,EAAG,CAAC,EAAGA,EAAK,CAAC,CAAC,EAAG,SACxC,IAAK,GAAGA,EAAKtD,EAAE,IAAI,MAAOA,EAAE,KAAK,IAAG,EAAI,SACxC,QACI,GAAMtB,EAAIsB,EAAE,KAAM,EAAAtB,EAAIA,EAAE,OAAS,GAAKA,EAAEA,EAAE,OAAS,CAAC,KAAO4E,EAAG,CAAC,IAAM,GAAKA,EAAG,CAAC,IAAM,GAAI,CAAEtD,EAAI,EAAG,QAAU,CAC3G,GAAIsD,EAAG,CAAC,IAAM,IAAM,CAAC5E,GAAM4E,EAAG,CAAC,EAAI5E,EAAE,CAAC,GAAK4E,EAAG,CAAC,EAAI5E,EAAE,CAAC,GAAK,CAAEsB,EAAE,MAAQsD,EAAG,CAAC,EAAG,KAAO,CACrF,GAAIA,EAAG,CAAC,IAAM,GAAKtD,EAAE,MAAQtB,EAAE,CAAC,EAAG,CAAEsB,EAAE,MAAQtB,EAAE,CAAC,EAAGA,EAAI4E,EAAI,KAAO,CACpE,GAAI5E,GAAKsB,EAAE,MAAQtB,EAAE,CAAC,EAAG,CAAEsB,EAAE,MAAQtB,EAAE,CAAC,EAAGsB,EAAE,IAAI,KAAKsD,CAAE,EAAG,KAAO,CAC9D5E,EAAE,CAAC,GAAGsB,EAAE,IAAI,IAAG,EACnBA,EAAE,KAAK,IAAG,EAAI,QAChC,CACUsD,EAAKF,EAAK,KAAKZ,EAASxC,CAAC,CAC7B,OAASrB,EAAG,CAAE2E,EAAK,CAAC,EAAG3E,CAAC,EAAGmB,EAAI,CAAG,QAAC,CAAWJ,EAAIhB,EAAI,CAAG,CACzD,GAAI4E,EAAG,CAAC,EAAI,EAAG,MAAMA,EAAG,CAAC,EAAG,MAAO,CAAE,MAAOA,EAAG,CAAC,EAAIA,EAAG,CAAC,EAAI,OAAQ,KAAM,EAAI,CAClF,CACF,CAkBO,SAASC,GAAS1E,EAAG,CAC1B,IAAID,EAAI,OAAO,QAAW,YAAc,OAAO,SAAUqB,EAAIrB,GAAKC,EAAED,CAAC,EAAGK,EAAI,EAC5E,GAAIgB,EAAG,OAAOA,EAAE,KAAKpB,CAAC,EACtB,GAAIA,GAAK,OAAOA,EAAE,QAAW,SAAU,MAAO,CAC1C,KAAM,UAAY,CACd,OAAIA,GAAKI,GAAKJ,EAAE,SAAQA,EAAI,QACrB,CAAE,MAAOA,GAAKA,EAAEI,GAAG,EAAG,KAAM,CAACJ,CAAC,CACzC,CACN,EACE,MAAM,IAAI,UAAUD,EAAI,0BAA4B,iCAAiC,CACvF,CAEO,SAAS4E,GAAO3E,EAAGG,EAAG,CAC3B,IAAIiB,EAAI,OAAO,QAAW,YAAcpB,EAAE,OAAO,QAAQ,EACzD,GAAI,CAACoB,EAAG,OAAOpB,EACf,IAAII,EAAIgB,EAAE,KAAKpB,CAAC,EAAGE,EAAG0E,EAAK,CAAA,EAAI9E,EAC/B,GAAI,CACA,MAAQK,IAAM,QAAUA,KAAM,IAAM,EAAED,EAAIE,EAAE,KAAI,GAAI,MAAMwE,EAAG,KAAK1E,EAAE,KAAK,CAC7E,OACO2E,EAAO,CAAE/E,EAAI,CAAE,MAAO+E,CAAK,CAAI,QACxC,CACM,GAAI,CACI3E,GAAK,CAACA,EAAE,OAASkB,EAAIhB,EAAE,SAAYgB,EAAE,KAAKhB,CAAC,CACnD,QACN,CAAgB,GAAIN,EAAG,MAAMA,EAAE,KAAO,CACpC,CACA,OAAO8E,CACT,CAkBO,SAASE,GAAcC,EAAIC,EAAMC,EAAM,CAC5C,GAAIA,GAAQ,UAAU,SAAW,EAAG,QAAS7E,EAAI,EAAGK,EAAIuE,EAAK,OAAQJ,EAAIxE,EAAIK,EAAGL,KACxEwE,GAAM,EAAExE,KAAK4E,MACRJ,IAAIA,EAAK,MAAM,UAAU,MAAM,KAAKI,EAAM,EAAG5E,CAAC,GACnDwE,EAAGxE,CAAC,EAAI4E,EAAK5E,CAAC,GAGtB,OAAO2E,EAAG,OAAOH,GAAM,MAAM,UAAU,MAAM,KAAKI,CAAI,CAAC,CACzD,CAEO,SAASE,GAAQhE,EAAG,CACzB,OAAO,gBAAgBgE,IAAW,KAAK,EAAIhE,EAAG,MAAQ,IAAIgE,GAAQhE,CAAC,CACrE,CAEO,SAASiE,GAAiBxB,EAASC,EAAYC,EAAW,CAC/D,GAAI,CAAC,OAAO,cAAe,MAAM,IAAI,UAAU,sCAAsC,EACrF,IAAIxC,EAAIwC,EAAU,MAAMF,EAASC,GAAc,EAAE,EAAGxD,EAAGgF,EAAI,CAAA,EAC3D,OAAOhF,EAAI,OAAO,QAAQ,OAAO,eAAkB,WAAa,cAAgB,QAAQ,SAAS,EAAGoE,EAAK,MAAM,EAAGA,EAAK,OAAO,EAAGA,EAAK,SAAUa,CAAW,EAAGjF,EAAE,OAAO,aAAa,EAAI,UAAY,CAAE,OAAO,IAAM,EAAGA,EACtN,SAASiF,EAAYxE,EAAG,CAAE,OAAO,SAAUK,EAAG,CAAE,OAAO,QAAQ,QAAQA,CAAC,EAAE,KAAKL,EAAGoD,CAAM,CAAG,CAAG,CAC9F,SAASO,EAAKrE,EAAGU,EAAG,CAAMQ,EAAElB,CAAC,IAAKC,EAAED,CAAC,EAAI,SAAUe,EAAG,CAAE,OAAO,IAAI,QAAQ,SAAUV,EAAGM,EAAG,CAAEsE,EAAE,KAAK,CAACjF,EAAGe,EAAGV,EAAGM,CAAC,CAAC,EAAI,GAAKwE,EAAOnF,EAAGe,CAAC,CAAG,CAAC,CAAG,EAAOL,IAAGT,EAAED,CAAC,EAAIU,EAAET,EAAED,CAAC,CAAC,GAAK,CACvK,SAASmF,EAAOnF,EAAGe,EAAG,CAAE,GAAI,CAAEiD,EAAK9C,EAAElB,CAAC,EAAEe,CAAC,CAAC,CAAG,OAASpB,EAAG,CAAEyF,EAAOH,EAAE,CAAC,EAAE,CAAC,EAAGtF,CAAC,CAAG,CAAE,CACjF,SAASqE,EAAKjE,EAAG,CAAEA,EAAE,iBAAiBgF,GAAU,QAAQ,QAAQhF,EAAE,MAAM,CAAC,EAAE,KAAKsF,EAASvB,CAAM,EAAIsB,EAAOH,EAAE,CAAC,EAAE,CAAC,EAAGlF,CAAC,CAAG,CACvH,SAASsF,EAAQzB,EAAO,CAAEuB,EAAO,OAAQvB,CAAK,CAAG,CACjD,SAASE,EAAOF,EAAO,CAAEuB,EAAO,QAASvB,CAAK,CAAG,CACjD,SAASwB,EAAO1E,EAAGK,EAAG,CAAML,EAAEK,CAAC,EAAGkE,EAAE,MAAK,EAAIA,EAAE,QAAQE,EAAOF,EAAE,CAAC,EAAE,CAAC,EAAGA,EAAE,CAAC,EAAE,CAAC,CAAC,CAAG,CACnF,CAQO,SAASK,GAAczF,EAAG,CAC/B,GAAI,CAAC,OAAO,cAAe,MAAM,IAAI,UAAU,sCAAsC,EACrF,IAAIoB,EAAIpB,EAAE,OAAO,aAAa,EAAG,EACjC,OAAOoB,EAAIA,EAAE,KAAKpB,CAAC,GAAKA,EAAI,OAAO0E,IAAa,WAAaA,GAAS1E,CAAC,EAAIA,EAAE,OAAO,QAAQ,EAAC,EAAI,EAAI,CAAA,EAAIwE,EAAK,MAAM,EAAGA,EAAK,OAAO,EAAGA,EAAK,QAAQ,EAAG,EAAE,OAAO,aAAa,EAAI,UAAY,CAAE,OAAO,IAAM,EAAG,GAC9M,SAASA,EAAKrE,EAAG,CAAE,EAAEA,CAAC,EAAIH,EAAEG,CAAC,GAAK,SAAUe,EAAG,CAAE,OAAO,IAAI,QAAQ,SAAU8C,EAASC,EAAQ,CAAE/C,EAAIlB,EAAEG,CAAC,EAAEe,CAAC,EAAGqE,EAAOvB,EAASC,EAAQ/C,EAAE,KAAMA,EAAE,KAAK,CAAG,CAAC,CAAG,CAAG,CAC/J,SAASqE,EAAOvB,EAASC,EAAQtD,EAAGO,EAAG,CAAE,QAAQ,QAAQA,CAAC,EAAE,KAAK,SAASA,EAAG,CAAE8C,EAAQ,CAAE,MAAO9C,EAAG,KAAMP,CAAC,CAAE,CAAG,EAAGsD,CAAM,CAAG,CAC7H,CA2EuB,OAAO,iBAAoB,YAAa,gBCvUxD,SAASyB,GAAW3B,EAAO,CAC9B,OAAO,OAAOA,GAAU,UAC5B,CCFO,SAAS4B,GAAiBC,EAAY,CACzC,IAAIC,EAAS,SAAUC,EAAU,CAC7B,MAAM,KAAKA,CAAQ,EACnBA,EAAS,MAAQ,IAAI,MAAK,EAAG,KACjC,EACIC,EAAWH,EAAWC,CAAM,EAChC,OAAAE,EAAS,UAAY,OAAO,OAAO,MAAM,SAAS,EAClDA,EAAS,UAAU,YAAcA,EAC1BA,CACX,CCRO,IAAIC,GAAsBL,GAAiB,SAAUE,EAAQ,CAChE,OAAO,SAAiCI,EAAQ,CAC5CJ,EAAO,IAAI,EACX,KAAK,QAAUI,EACTA,EAAO,OAAS;AAAA,EAA8CA,EAAO,IAAI,SAAUC,EAAK9F,EAAG,CAAE,OAAOA,EAAI,EAAI,KAAO8F,EAAI,SAAQ,CAAI,CAAC,EAAE,KAAK;AAAA,GAAM,EACjJ,GACN,KAAK,KAAO,sBACZ,KAAK,OAASD,CAClB,CACJ,CAAC,ECVM,SAASE,GAAUC,EAAKC,EAAM,CACjC,GAAID,EAAK,CACL,IAAIE,EAAQF,EAAI,QAAQC,CAAI,EAC5B,GAAKC,GAASF,EAAI,OAAOE,EAAO,CAAC,CACrC,CACJ,CCDA,IAAIC,IAAgB,UAAY,CAC5B,SAASA,EAAaC,EAAiB,CACnC,KAAK,gBAAkBA,EACvB,KAAK,OAAS,GACd,KAAK,WAAa,KAClB,KAAK,YAAc,IACvB,CACA,OAAAD,EAAa,UAAU,YAAc,UAAY,CAC7C,IAAIE,EAAK1F,EAAI2F,EAAK1F,EACdiF,EACJ,GAAI,CAAC,KAAK,OAAQ,CACd,KAAK,OAAS,GACd,IAAIU,EAAa,KAAK,WACtB,GAAIA,EAEA,GADA,KAAK,WAAa,KACd,MAAM,QAAQA,CAAU,EACxB,GAAI,CACA,QAASC,EAAelC,GAASiC,CAAU,EAAGE,EAAiBD,EAAa,KAAI,EAAI,CAACC,EAAe,KAAMA,EAAiBD,EAAa,KAAI,EAAI,CAC5I,IAAIE,EAAWD,EAAe,MAC9BC,EAAS,OAAO,IAAI,CACxB,CACJ,OACOC,EAAO,CAAEN,EAAM,CAAE,MAAOM,CAAK,CAAI,QAC5D,CACwB,GAAI,CACIF,GAAkB,CAACA,EAAe,OAAS9F,EAAK6F,EAAa,SAAS7F,EAAG,KAAK6F,CAAY,CAClG,QACxB,CAAkC,GAAIH,EAAK,MAAMA,EAAI,KAAO,CACxC,MAGAE,EAAW,OAAO,IAAI,EAG9B,IAAIK,EAAmB,KAAK,gBAC5B,GAAItB,GAAWsB,CAAgB,EAC3B,GAAI,CACAA,EAAgB,CACpB,OACOlH,EAAG,CACNmG,EAASnG,aAAakG,GAAsBlG,EAAE,OAAS,CAACA,CAAC,CAC7D,CAEJ,IAAImH,EAAc,KAAK,YACvB,GAAIA,EAAa,CACb,KAAK,YAAc,KACnB,GAAI,CACA,QAASC,EAAgBxC,GAASuC,CAAW,EAAGE,EAAkBD,EAAc,KAAI,EAAI,CAACC,EAAgB,KAAMA,EAAkBD,EAAc,KAAI,EAAI,CACnJ,IAAIE,EAAYD,EAAgB,MAChC,GAAI,CACAE,GAAcD,CAAS,CAC3B,OACOlB,EAAK,CACRD,EAASA,GAAgD,CAAA,EACrDC,aAAeF,GACfC,EAASnB,GAAcA,GAAc,CAAA,EAAIH,GAAOsB,CAAM,CAAC,EAAGtB,GAAOuB,EAAI,MAAM,CAAC,EAG5ED,EAAO,KAAKC,CAAG,CAEvB,CACJ,CACJ,OACOoB,EAAO,CAAEZ,EAAM,CAAE,MAAOY,CAAK,CAAI,QACxD,CACoB,GAAI,CACIH,GAAmB,CAACA,EAAgB,OAASnG,EAAKkG,EAAc,SAASlG,EAAG,KAAKkG,CAAa,CACtG,QACpB,CAA8B,GAAIR,EAAK,MAAMA,EAAI,KAAO,CACxC,CACJ,CACA,GAAIT,EACA,MAAM,IAAID,GAAoBC,CAAM,CAE5C,CACJ,EACAM,EAAa,UAAU,IAAM,SAAUgB,EAAU,CAC7C,IAAIxG,EACJ,GAAIwG,GAAYA,IAAa,KACzB,GAAI,KAAK,OACLF,GAAcE,CAAQ,MAErB,CACD,GAAIA,aAAoBhB,EAAc,CAClC,GAAIgB,EAAS,QAAUA,EAAS,WAAW,IAAI,EAC3C,OAEJA,EAAS,WAAW,IAAI,CAC5B,EACC,KAAK,aAAexG,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAASA,EAAK,CAAA,GAAI,KAAKwG,CAAQ,CAClG,CAER,EACAhB,EAAa,UAAU,WAAa,SAAUiB,EAAQ,CAClD,IAAIb,EAAa,KAAK,WACtB,OAAOA,IAAea,GAAW,MAAM,QAAQb,CAAU,GAAKA,EAAW,SAASa,CAAM,CAC5F,EACAjB,EAAa,UAAU,WAAa,SAAUiB,EAAQ,CAClD,IAAIb,EAAa,KAAK,WACtB,KAAK,WAAa,MAAM,QAAQA,CAAU,GAAKA,EAAW,KAAKa,CAAM,EAAGb,GAAcA,EAAa,CAACA,EAAYa,CAAM,EAAIA,CAC9H,EACAjB,EAAa,UAAU,cAAgB,SAAUiB,EAAQ,CACrD,IAAIb,EAAa,KAAK,WAClBA,IAAea,EACf,KAAK,WAAa,KAEb,MAAM,QAAQb,CAAU,GAC7BR,GAAUQ,EAAYa,CAAM,CAEpC,EACAjB,EAAa,UAAU,OAAS,SAAUgB,EAAU,CAChD,IAAIN,EAAc,KAAK,YACvBA,GAAed,GAAUc,EAAaM,CAAQ,EAC1CA,aAAoBhB,GACpBgB,EAAS,cAAc,IAAI,CAEnC,EACAhB,EAAa,OAAS,UAAY,CAC9B,IAAIkB,EAAQ,IAAIlB,EAChB,OAAAkB,EAAM,OAAS,GACRA,CACX,GAAC,EACMlB,CACX,KAEWmB,GAAqBnB,GAAa,MACtC,SAASoB,GAAe5D,EAAO,CAClC,OAAQA,aAAiBwC,IACpBxC,GAAS,WAAYA,GAAS2B,GAAW3B,EAAM,MAAM,GAAK2B,GAAW3B,EAAM,GAAG,GAAK2B,GAAW3B,EAAM,WAAW,CACxH,CACA,SAASsD,GAAcD,EAAW,CAC1B1B,GAAW0B,CAAS,EACpBA,EAAS,EAGTA,EAAU,YAAW,CAE7B,CC7IO,IAAIQ,GAAS,CAGhB,QAAS,MAGb,ECLWC,GAAkB,CACzB,WAAY,SAAUC,EAASC,EAAS,CAEpC,QADIC,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,EAAK,CAAC,EAAI,UAAUA,CAAE,EAM/B,OAAO,WAAW,MAAM,OAAQnD,GAAc,CAACgD,EAASC,CAAO,EAAGpD,GAAOqD,CAAI,CAAC,CAAC,CACnF,EACA,aAAc,SAAUE,EAAQ,CAE5B,OAAuF,aAAcA,CAAM,CAC/G,EACA,SAAU,MACd,EChBO,SAASC,GAAqBjC,EAAK,CACtC2B,GAAgB,WAAW,UAAY,CAM/B,MAAM3B,CAEd,CAAC,CACL,CCZO,SAASkC,IAAO,CAAE,CCElB,SAASC,GAAavF,EAAI,CAgBzBA,EAAE,CAEV,CCXA,IAAIwF,IAAc,SAAUzC,EAAQ,CAChCrC,GAAU8E,EAAYzC,CAAM,EAC5B,SAASyC,EAAWC,EAAa,CAC7B,IAAIC,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KACjC,OAAA2C,EAAM,UAAY,GACdD,GACAC,EAAM,YAAcD,EAChBZ,GAAeY,CAAW,GAC1BA,EAAY,IAAIC,CAAK,GAIzBA,EAAM,YAAcC,GAEjBD,CACX,CACA,OAAAF,EAAW,OAAS,SAAUI,EAAM7D,EAAO8D,EAAU,CACjD,OAAO,IAAIC,GAAeF,EAAM7D,EAAO8D,CAAQ,CACnD,EACAL,EAAW,UAAU,KAAO,SAAUvE,EAAO,CACrC,KAAK,WAIL,KAAK,MAAMA,CAAK,CAExB,EACAuE,EAAW,UAAU,MAAQ,SAAUpC,EAAK,CACpC,KAAK,YAIL,KAAK,UAAY,GACjB,KAAK,OAAOA,CAAG,EAEvB,EACAoC,EAAW,UAAU,SAAW,UAAY,CACpC,KAAK,YAIL,KAAK,UAAY,GACjB,KAAK,UAAS,EAEtB,EACAA,EAAW,UAAU,YAAc,UAAY,CACtC,KAAK,SACN,KAAK,UAAY,GACjBzC,EAAO,UAAU,YAAY,KAAK,IAAI,EACtC,KAAK,YAAc,KAE3B,EACAyC,EAAW,UAAU,MAAQ,SAAUvE,EAAO,CAC1C,KAAK,YAAY,KAAKA,CAAK,CAC/B,EACAuE,EAAW,UAAU,OAAS,SAAUpC,EAAK,CACzC,GAAI,CACA,KAAK,YAAY,MAAMA,CAAG,CAC9B,QACR,CACY,KAAK,YAAW,CACpB,CACJ,EACAoC,EAAW,UAAU,UAAY,UAAY,CACzC,GAAI,CACA,KAAK,YAAY,SAAQ,CAC7B,QACR,CACY,KAAK,YAAW,CACpB,CACJ,EACOA,CACX,GAAE/B,EAAY,EAMVsC,IAAoB,UAAY,CAChC,SAASA,EAAiBC,EAAiB,CACvC,KAAK,gBAAkBA,CAC3B,CACA,OAAAD,EAAiB,UAAU,KAAO,SAAU9E,EAAO,CAC/C,IAAI+E,EAAkB,KAAK,gBAC3B,GAAIA,EAAgB,KAChB,GAAI,CACAA,EAAgB,KAAK/E,CAAK,CAC9B,OACOc,EAAO,CACVkE,GAAqBlE,CAAK,CAC9B,CAER,EACAgE,EAAiB,UAAU,MAAQ,SAAU3C,EAAK,CAC9C,IAAI4C,EAAkB,KAAK,gBAC3B,GAAIA,EAAgB,MAChB,GAAI,CACAA,EAAgB,MAAM5C,CAAG,CAC7B,OACOrB,EAAO,CACVkE,GAAqBlE,CAAK,CAC9B,MAGAkE,GAAqB7C,CAAG,CAEhC,EACA2C,EAAiB,UAAU,SAAW,UAAY,CAC9C,IAAIC,EAAkB,KAAK,gBAC3B,GAAIA,EAAgB,SAChB,GAAI,CACAA,EAAgB,SAAQ,CAC5B,OACOjE,EAAO,CACVkE,GAAqBlE,CAAK,CAC9B,CAER,EACOgE,CACX,KACID,IAAkB,SAAU/C,EAAQ,CACpCrC,GAAUoF,EAAgB/C,CAAM,EAChC,SAAS+C,EAAeI,EAAgBnE,EAAO8D,EAAU,CACrD,IAAIH,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KAC7BiD,EACJ,OAAIpD,GAAWsD,CAAc,GAAK,CAACA,EAC/BF,EAAkB,CACd,KAAOE,GAAwE,OAC/E,MAAOnE,GAA6C,OACpD,SAAU8D,GAAsD,MAChF,EAcgBG,EAAkBE,EAG1BR,EAAM,YAAc,IAAIK,GAAiBC,CAAe,EACjDN,CACX,CACA,OAAOI,CACX,GAAEN,EAAU,EAEZ,SAASS,GAAqBlE,EAAO,CAK7BsD,GAAqBtD,CAAK,CAElC,CACA,SAASoE,GAAoB/C,EAAK,CAC9B,MAAMA,CACV,CAKO,IAAIuC,GAAiB,CACxB,OAAQ,GACR,KAAML,GACN,MAAOa,GACP,SAAUb,EACd,ECtLWc,IAAc,UAAY,CAAE,OAAQ,OAAO,QAAW,YAAc,OAAO,YAAe,cAAgB,GAAC,ECA/G,SAASC,GAAS5H,EAAG,CACxB,OAAOA,CACX,CCDO,SAAS6H,IAAO,CAEnB,QADIC,EAAM,CAAA,EACDpB,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCoB,EAAIpB,CAAE,EAAI,UAAUA,CAAE,EAE1B,OAAOqB,GAAcD,CAAG,CAC5B,CACO,SAASC,GAAcD,EAAK,CAC/B,OAAIA,EAAI,SAAW,EACRF,GAEPE,EAAI,SAAW,EACRA,EAAI,CAAC,EAET,SAAeE,EAAO,CACzB,OAAOF,EAAI,OAAO,SAAUG,EAAMC,EAAI,CAAE,OAAOA,EAAGD,CAAI,CAAG,EAAGD,CAAK,CACrE,CACJ,CCXA,IAAIG,IAAc,UAAY,CAC1B,SAASA,EAAWC,EAAW,CACvBA,IACA,KAAK,WAAaA,EAE1B,CACA,OAAAD,EAAW,UAAU,KAAO,SAAUE,EAAU,CAC5C,IAAIV,EAAa,IAAIQ,EACrB,OAAAR,EAAW,OAAS,KACpBA,EAAW,SAAWU,EACfV,CACX,EACAQ,EAAW,UAAU,UAAY,SAAUV,EAAgBnE,EAAO8D,EAAU,CACxE,IAAIH,EAAQ,KACRqB,EAAaC,GAAad,CAAc,EAAIA,EAAiB,IAAIJ,GAAeI,EAAgBnE,EAAO8D,CAAQ,EACnH,OAAAN,GAAa,UAAY,CACrB,IAAItH,EAAKyH,EAAOoB,EAAW7I,EAAG,SAAUgJ,EAAShJ,EAAG,OACpD8I,EAAW,IAAID,EAEPA,EAAS,KAAKC,EAAYE,CAAM,EAClCA,EAEMvB,EAAM,WAAWqB,CAAU,EAE3BrB,EAAM,cAAcqB,CAAU,CAAC,CAC/C,CAAC,EACMA,CACX,EACAH,EAAW,UAAU,cAAgB,SAAUM,EAAM,CACjD,GAAI,CACA,OAAO,KAAK,WAAWA,CAAI,CAC/B,OACO9D,EAAK,CACR8D,EAAK,MAAM9D,CAAG,CAClB,CACJ,EACAwD,EAAW,UAAU,QAAU,SAAUhB,EAAMuB,EAAa,CACxD,IAAIzB,EAAQ,KACZ,OAAAyB,EAAcC,GAAeD,CAAW,EACjC,IAAIA,EAAY,SAAUjG,EAASC,EAAQ,CAC9C,IAAI4F,EAAa,IAAIjB,GAAe,CAChC,KAAM,SAAU7E,EAAO,CACnB,GAAI,CACA2E,EAAK3E,CAAK,CACd,OACOmC,EAAK,CACRjC,EAAOiC,CAAG,EACV2D,EAAW,YAAW,CAC1B,CACJ,EACA,MAAO5F,EACP,SAAUD,CAC1B,CAAa,EACDwE,EAAM,UAAUqB,CAAU,CAC9B,CAAC,CACL,EACAH,EAAW,UAAU,WAAa,SAAUG,EAAY,CACpD,IAAI9I,EACJ,OAAQA,EAAK,KAAK,UAAY,MAAQA,IAAO,OAAS,OAASA,EAAG,UAAU8I,CAAU,CAC1F,EACAH,EAAW,UAAUS,EAAiB,EAAI,UAAY,CAClD,OAAO,IACX,EACAT,EAAW,UAAU,KAAO,UAAY,CAEpC,QADIU,EAAa,CAAA,EACRnC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCmC,EAAWnC,CAAE,EAAI,UAAUA,CAAE,EAEjC,OAAOqB,GAAcc,CAAU,EAAE,IAAI,CACzC,EACAV,EAAW,UAAU,UAAY,SAAUO,EAAa,CACpD,IAAIzB,EAAQ,KACZ,OAAAyB,EAAcC,GAAeD,CAAW,EACjC,IAAIA,EAAY,SAAUjG,EAASC,EAAQ,CAC9C,IAAIF,EACJyE,EAAM,UAAU,SAAUjH,EAAG,CAAE,OAAQwC,EAAQxC,CAAI,EAAG,SAAU2E,EAAK,CAAE,OAAOjC,EAAOiC,CAAG,CAAG,EAAG,UAAY,CAAE,OAAOlC,EAAQD,CAAK,CAAG,CAAC,CACxI,CAAC,CACL,EACA2F,EAAW,OAAS,SAAUC,EAAW,CACrC,OAAO,IAAID,EAAWC,CAAS,CACnC,EACOD,CACX,KAEA,SAASQ,GAAeD,EAAa,CACjC,IAAIlJ,EACJ,OAAQA,EAAKkJ,GAA+DrC,GAAO,WAAa,MAAQ7G,IAAO,OAASA,EAAK,OACjI,CACA,SAASsJ,GAAWtG,EAAO,CACvB,OAAOA,GAAS2B,GAAW3B,EAAM,IAAI,GAAK2B,GAAW3B,EAAM,KAAK,GAAK2B,GAAW3B,EAAM,QAAQ,CAClG,CACA,SAAS+F,GAAa/F,EAAO,CACzB,OAAQA,GAASA,aAAiBuE,IAAgB+B,GAAWtG,CAAK,GAAK4D,GAAe5D,CAAK,CAC/F,CCnGO,SAASuG,GAAQP,EAAQ,CAC5B,OAAOrE,GAAWqE,GAAW,KAA4B,OAASA,EAAO,IAAI,CACjF,CACO,SAASQ,GAAQC,EAAM,CAC1B,OAAO,SAAUT,EAAQ,CACrB,GAAIO,GAAQP,CAAM,EACd,OAAOA,EAAO,KAAK,SAAUU,EAAc,CACvC,GAAI,CACA,OAAOD,EAAKC,EAAc,IAAI,CAClC,OACOvE,EAAK,CACR,KAAK,MAAMA,CAAG,CAClB,CACJ,CAAC,EAEL,MAAM,IAAI,UAAU,wCAAwC,CAChE,CACJ,CChBO,SAASwE,GAAyBnC,EAAaoC,EAAQC,EAAYC,EAASC,EAAY,CAC3F,OAAO,IAAIC,GAAmBxC,EAAaoC,EAAQC,EAAYC,EAASC,CAAU,CACtF,CACA,IAAIC,IAAsB,SAAUlF,EAAQ,CACxCrC,GAAUuH,EAAoBlF,CAAM,EACpC,SAASkF,EAAmBxC,EAAaoC,EAAQC,EAAYC,EAASC,EAAYE,EAAmB,CACjG,IAAIxC,EAAQ3C,EAAO,KAAK,KAAM0C,CAAW,GAAK,KAC9C,OAAAC,EAAM,WAAasC,EACnBtC,EAAM,kBAAoBwC,EAC1BxC,EAAM,MAAQmC,EACR,SAAU5G,EAAO,CACf,GAAI,CACA4G,EAAO5G,CAAK,CAChB,OACOmC,EAAK,CACRqC,EAAY,MAAMrC,CAAG,CACzB,CACJ,EACEL,EAAO,UAAU,MACvB2C,EAAM,OAASqC,EACT,SAAU3E,EAAK,CACb,GAAI,CACA2E,EAAQ3E,CAAG,CACf,OACOA,EAAK,CACRqC,EAAY,MAAMrC,CAAG,CACzB,QAChB,CACoB,KAAK,YAAW,CACpB,CACJ,EACEL,EAAO,UAAU,OACvB2C,EAAM,UAAYoC,EACZ,UAAY,CACV,GAAI,CACAA,EAAU,CACd,OACO1E,EAAK,CACRqC,EAAY,MAAMrC,CAAG,CACzB,QAChB,CACoB,KAAK,YAAW,CACpB,CACJ,EACEL,EAAO,UAAU,UAChB2C,CACX,CACA,OAAAuC,EAAmB,UAAU,YAAc,UAAY,CACnD,IAAIhK,EACJ,GAAI,CAAC,KAAK,mBAAqB,KAAK,kBAAiB,EAAI,CACrD,IAAIkK,EAAW,KAAK,OACpBpF,EAAO,UAAU,YAAY,KAAK,IAAI,EACtC,CAACoF,KAAclK,EAAK,KAAK,cAAgB,MAAQA,IAAO,QAAkBA,EAAG,KAAK,IAAI,EAC1F,CACJ,EACOgK,CACX,GAAEzC,EAAU,ECxDD4C,GAAyB,CAChC,SAAU,SAAUC,EAAU,CAC1B,IAAIC,EAAU,sBACVC,EAAS,qBAMTnD,EAASkD,EAAQ,SAAUE,EAAW,CACtCD,EAAS,OACTF,EAASG,CAAS,CACtB,CAAC,EACD,OAAO,IAAI/E,GAAa,UAAY,CAAE,OAAO8E,GAAW,KAA4B,OAASA,EAAOnD,CAAM,CAAG,CAAC,CAClH,EACA,sBAAuB,UAAY,CAE/B,QADIF,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAG3B,OAAgG,sBAAuB,MAAM,OAAQnD,GAAc,GAAIH,GAAOqD,CAAI,CAAC,CAAC,CACxK,EACA,qBAAsB,UAAY,CAE9B,QADIA,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAG3B,OAA+F,qBAAsB,MAAM,OAAQnD,GAAc,GAAIH,GAAOqD,CAAI,CAAC,CAAC,CACtK,EACA,SAAU,MACd,ECjCWuD,GAA0B5F,GAAiB,SAAUE,EAAQ,CACpE,OAAO,UAAuC,CAC1CA,EAAO,IAAI,EACX,KAAK,KAAO,0BACZ,KAAK,QAAU,qBACnB,CACJ,CAAC,ECDG2F,IAAW,SAAU3F,EAAQ,CAC7BrC,GAAUgI,EAAS3F,CAAM,EACzB,SAAS2F,GAAU,CACf,IAAIhD,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KACjC,OAAA2C,EAAM,OAAS,GACfA,EAAM,iBAAmB,KACzBA,EAAM,UAAY,CAAA,EAClBA,EAAM,UAAY,GAClBA,EAAM,SAAW,GACjBA,EAAM,YAAc,KACbA,CACX,CACA,OAAAgD,EAAQ,UAAU,KAAO,SAAU5B,EAAU,CACzC,IAAI6B,EAAU,IAAIC,GAAiB,KAAM,IAAI,EAC7C,OAAAD,EAAQ,SAAW7B,EACZ6B,CACX,EACAD,EAAQ,UAAU,eAAiB,UAAY,CAC3C,GAAI,KAAK,OACL,MAAM,IAAID,EAElB,EACAC,EAAQ,UAAU,KAAO,SAAUzH,EAAO,CACtC,IAAIyE,EAAQ,KACZH,GAAa,UAAY,CACrB,IAAI5B,EAAK1F,EAET,GADAyH,EAAM,eAAc,EAChB,CAACA,EAAM,UAAW,CACbA,EAAM,mBACPA,EAAM,iBAAmB,MAAM,KAAKA,EAAM,SAAS,GAEvD,GAAI,CACA,QAASxH,EAAK0D,GAAS8D,EAAM,gBAAgB,EAAGmD,EAAK3K,EAAG,KAAI,EAAI,CAAC2K,EAAG,KAAMA,EAAK3K,EAAG,OAAQ,CACtF,IAAI4K,EAAWD,EAAG,MAClBC,EAAS,KAAK7H,CAAK,CACvB,CACJ,OACOgD,EAAO,CAAEN,EAAM,CAAE,MAAOM,CAAK,CAAI,QACxD,CACoB,GAAI,CACI4E,GAAM,CAACA,EAAG,OAAS5K,EAAKC,EAAG,SAASD,EAAG,KAAKC,CAAE,CACtD,QACpB,CAA8B,GAAIyF,EAAK,MAAMA,EAAI,KAAO,CACxC,CACJ,CACJ,CAAC,CACL,EACA+E,EAAQ,UAAU,MAAQ,SAAUtF,EAAK,CACrC,IAAIsC,EAAQ,KACZH,GAAa,UAAY,CAErB,GADAG,EAAM,eAAc,EAChB,CAACA,EAAM,UAAW,CAClBA,EAAM,SAAWA,EAAM,UAAY,GACnCA,EAAM,YAActC,EAEpB,QADI2F,EAAYrD,EAAM,UACfqD,EAAU,QACbA,EAAU,MAAK,EAAG,MAAM3F,CAAG,CAEnC,CACJ,CAAC,CACL,EACAsF,EAAQ,UAAU,SAAW,UAAY,CACrC,IAAIhD,EAAQ,KACZH,GAAa,UAAY,CAErB,GADAG,EAAM,eAAc,EAChB,CAACA,EAAM,UAAW,CAClBA,EAAM,UAAY,GAElB,QADIqD,EAAYrD,EAAM,UACfqD,EAAU,QACbA,EAAU,MAAK,EAAG,SAAQ,CAElC,CACJ,CAAC,CACL,EACAL,EAAQ,UAAU,YAAc,UAAY,CACxC,KAAK,UAAY,KAAK,OAAS,GAC/B,KAAK,UAAY,KAAK,iBAAmB,IAC7C,EACA,OAAO,eAAeA,EAAQ,UAAW,WAAY,CACjD,IAAK,UAAY,CACb,IAAIzK,EACJ,QAASA,EAAK,KAAK,aAAe,MAAQA,IAAO,OAAS,OAASA,EAAG,QAAU,CACpF,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACDyK,EAAQ,UAAU,cAAgB,SAAU3B,EAAY,CACpD,YAAK,eAAc,EACZhE,EAAO,UAAU,cAAc,KAAK,KAAMgE,CAAU,CAC/D,EACA2B,EAAQ,UAAU,WAAa,SAAU3B,EAAY,CACjD,YAAK,eAAc,EACnB,KAAK,wBAAwBA,CAAU,EAChC,KAAK,gBAAgBA,CAAU,CAC1C,EACA2B,EAAQ,UAAU,gBAAkB,SAAU3B,EAAY,CACtD,IAAIrB,EAAQ,KACRzH,EAAK,KAAM+K,EAAW/K,EAAG,SAAUgL,EAAYhL,EAAG,UAAW8K,EAAY9K,EAAG,UAChF,OAAI+K,GAAYC,EACLrE,IAEX,KAAK,iBAAmB,KACxBmE,EAAU,KAAKhC,CAAU,EAClB,IAAItD,GAAa,UAAY,CAChCiC,EAAM,iBAAmB,KACzBrC,GAAU0F,EAAWhC,CAAU,CACnC,CAAC,EACL,EACA2B,EAAQ,UAAU,wBAA0B,SAAU3B,EAAY,CAC9D,IAAI9I,EAAK,KAAM+K,EAAW/K,EAAG,SAAUiL,EAAcjL,EAAG,YAAagL,EAAYhL,EAAG,UAChF+K,EACAjC,EAAW,MAAMmC,CAAW,EAEvBD,GACLlC,EAAW,SAAQ,CAE3B,EACA2B,EAAQ,UAAU,aAAe,UAAY,CACzC,IAAItC,EAAa,IAAIQ,GACrB,OAAAR,EAAW,OAAS,KACbA,CACX,EACAsC,EAAQ,OAAS,SAAUjD,EAAawB,EAAQ,CAC5C,OAAO,IAAI2B,GAAiBnD,EAAawB,CAAM,CACnD,EACOyB,CACX,GAAE9B,EAAU,EAERgC,IAAoB,SAAU7F,EAAQ,CACtCrC,GAAUkI,EAAkB7F,CAAM,EAClC,SAAS6F,EAAiBnD,EAAawB,EAAQ,CAC3C,IAAIvB,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KACjC,OAAA2C,EAAM,YAAcD,EACpBC,EAAM,OAASuB,EACRvB,CACX,CACA,OAAAkD,EAAiB,UAAU,KAAO,SAAU3H,EAAO,CAC/C,IAAIhD,EAAIC,GACPA,GAAMD,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAAS,OAASA,EAAG,QAAU,MAAQC,IAAO,QAAkBA,EAAG,KAAKD,EAAIgD,CAAK,CACtI,EACA2H,EAAiB,UAAU,MAAQ,SAAUxF,EAAK,CAC9C,IAAInF,EAAIC,GACPA,GAAMD,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAAS,OAASA,EAAG,SAAW,MAAQC,IAAO,QAAkBA,EAAG,KAAKD,EAAImF,CAAG,CACrI,EACAwF,EAAiB,UAAU,SAAW,UAAY,CAC9C,IAAI3K,EAAIC,GACPA,GAAMD,EAAK,KAAK,eAAiB,MAAQA,IAAO,OAAS,OAASA,EAAG,YAAc,MAAQC,IAAO,QAAkBA,EAAG,KAAKD,CAAE,CACnI,EACA2K,EAAiB,UAAU,WAAa,SAAU7B,EAAY,CAC1D,IAAI9I,EAAIC,EACR,OAAQA,GAAMD,EAAK,KAAK,UAAY,MAAQA,IAAO,OAAS,OAASA,EAAG,UAAU8I,CAAU,KAAO,MAAQ7I,IAAO,OAASA,EAAK0G,EACpI,EACOgE,CACX,GAAEF,EAAO,EC7JLS,IAAmB,SAAUpG,EAAQ,CACrCrC,GAAUyI,EAAiBpG,CAAM,EACjC,SAASoG,EAAgBC,EAAQ,CAC7B,IAAI1D,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KACjC,OAAA2C,EAAM,OAAS0D,EACR1D,CACX,CACA,cAAO,eAAeyD,EAAgB,UAAW,QAAS,CACtD,IAAK,UAAY,CACb,OAAO,KAAK,SAAQ,CACxB,EACA,WAAY,GACZ,aAAc,EACtB,CAAK,EACDA,EAAgB,UAAU,WAAa,SAAUpC,EAAY,CACzD,IAAIsC,EAAetG,EAAO,UAAU,WAAW,KAAK,KAAMgE,CAAU,EACpE,OAACsC,EAAa,QAAUtC,EAAW,KAAK,KAAK,MAAM,EAC5CsC,CACX,EACAF,EAAgB,UAAU,SAAW,UAAY,CAC7C,IAAIlL,EAAK,KAAM+K,EAAW/K,EAAG,SAAUiL,EAAcjL,EAAG,YAAamL,EAASnL,EAAG,OACjF,GAAI+K,EACA,MAAME,EAEV,YAAK,eAAc,EACZE,CACX,EACAD,EAAgB,UAAU,KAAO,SAAUlI,EAAO,CAC9C8B,EAAO,UAAU,KAAK,KAAK,KAAO,KAAK,OAAS9B,CAAK,CACzD,EACOkI,CACX,GAAET,EAAO,ECjCEY,GAAwB,CAC/B,IAAK,UAAY,CACb,OAAQA,GAAsB,UAAY,MAAM,IAAG,CACvD,EACA,SAAU,MACd,ECFIC,IAAiB,SAAUxG,EAAQ,CACnCrC,GAAU6I,EAAexG,CAAM,EAC/B,SAASwG,EAAcC,EAAaC,EAAaC,EAAoB,CAC7DF,IAAgB,SAAUA,EAAc,KACxCC,IAAgB,SAAUA,EAAc,KACxCC,IAAuB,SAAUA,EAAqBJ,IAC1D,IAAI5D,EAAQ3C,EAAO,KAAK,IAAI,GAAK,KACjC,OAAA2C,EAAM,YAAc8D,EACpB9D,EAAM,YAAc+D,EACpB/D,EAAM,mBAAqBgE,EAC3BhE,EAAM,QAAU,CAAA,EAChBA,EAAM,oBAAsB,GAC5BA,EAAM,oBAAsB+D,IAAgB,IAC5C/D,EAAM,YAAc,KAAK,IAAI,EAAG8D,CAAW,EAC3C9D,EAAM,YAAc,KAAK,IAAI,EAAG+D,CAAW,EACpC/D,CACX,CACA,OAAA6D,EAAc,UAAU,KAAO,SAAUtI,EAAO,CAC5C,IAAIhD,EAAK,KAAMgL,EAAYhL,EAAG,UAAW0L,EAAU1L,EAAG,QAAS2L,EAAsB3L,EAAG,oBAAqByL,EAAqBzL,EAAG,mBAAoBwL,EAAcxL,EAAG,YACrKgL,IACDU,EAAQ,KAAK1I,CAAK,EAClB,CAAC2I,GAAuBD,EAAQ,KAAKD,EAAmB,IAAG,EAAKD,CAAW,GAE/E,KAAK,YAAW,EAChB1G,EAAO,UAAU,KAAK,KAAK,KAAM9B,CAAK,CAC1C,EACAsI,EAAc,UAAU,WAAa,SAAUxC,EAAY,CACvD,KAAK,eAAc,EACnB,KAAK,YAAW,EAIhB,QAHIsC,EAAe,KAAK,gBAAgBtC,CAAU,EAC9C9I,EAAK,KAAM2L,EAAsB3L,EAAG,oBAAqB0L,EAAU1L,EAAG,QACtE4L,EAAOF,EAAQ,MAAK,EACfrM,EAAI,EAAGA,EAAIuM,EAAK,QAAU,CAAC9C,EAAW,OAAQzJ,GAAKsM,EAAsB,EAAI,EAClF7C,EAAW,KAAK8C,EAAKvM,CAAC,CAAC,EAE3B,YAAK,wBAAwByJ,CAAU,EAChCsC,CACX,EACAE,EAAc,UAAU,YAAc,UAAY,CAC9C,IAAItL,EAAK,KAAMuL,EAAcvL,EAAG,YAAayL,EAAqBzL,EAAG,mBAAoB0L,EAAU1L,EAAG,QAAS2L,EAAsB3L,EAAG,oBACpI6L,GAAsBF,EAAsB,EAAI,GAAKJ,EAEzD,GADAA,EAAc,KAAYM,EAAqBH,EAAQ,QAAUA,EAAQ,OAAO,EAAGA,EAAQ,OAASG,CAAkB,EAClH,CAACF,EAAqB,CAGtB,QAFIG,EAAML,EAAmB,IAAG,EAC5BM,EAAO,EACF1M,EAAI,EAAGA,EAAIqM,EAAQ,QAAUA,EAAQrM,CAAC,GAAKyM,EAAKzM,GAAK,EAC1D0M,EAAO1M,EAEX0M,GAAQL,EAAQ,OAAO,EAAGK,EAAO,CAAC,CACtC,CACJ,EACOT,CACX,GAAEb,EAAO,ECrDLuB,IAAU,SAAUlH,EAAQ,CAC5BrC,GAAUuJ,EAAQlH,CAAM,EACxB,SAASkH,EAAOC,EAAWC,EAAM,CAC7B,OAAOpH,EAAO,KAAK,IAAI,GAAK,IAChC,CACA,OAAAkH,EAAO,UAAU,SAAW,SAAUG,EAAOC,EAAO,CAEhD,OAAO,IACX,EACOJ,CACX,GAAExG,EAAY,ECXH6G,GAAmB,CAC1B,YAAa,SAAUtF,EAASC,EAAS,CAErC,QADIC,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,EAAK,CAAC,EAAI,UAAUA,CAAE,EAM/B,OAAO,YAAY,MAAM,OAAQnD,GAAc,CAACgD,EAASC,CAAO,EAAGpD,GAAOqD,CAAI,CAAC,CAAC,CACpF,EACA,cAAe,SAAUE,EAAQ,CAE7B,OAAwF,cAAeA,CAAM,CACjH,EACA,SAAU,MACd,ECdImF,IAAe,SAAUxH,EAAQ,CACjCrC,GAAU6J,EAAaxH,CAAM,EAC7B,SAASwH,EAAYL,EAAWC,EAAM,CAClC,IAAIzE,EAAQ3C,EAAO,KAAK,KAAMmH,EAAWC,CAAI,GAAK,KAClD,OAAAzE,EAAM,UAAYwE,EAClBxE,EAAM,KAAOyE,EACbzE,EAAM,QAAU,GACTA,CACX,CACA,OAAA6E,EAAY,UAAU,SAAW,SAAUH,EAAOC,EAAO,CACrD,IAAIpM,EAEJ,GADIoM,IAAU,SAAUA,EAAQ,GAC5B,KAAK,OACL,OAAO,KAEX,KAAK,MAAQD,EACb,IAAII,EAAK,KAAK,GACVN,EAAY,KAAK,UACrB,OAAIM,GAAM,OACN,KAAK,GAAK,KAAK,eAAeN,EAAWM,EAAIH,CAAK,GAEtD,KAAK,QAAU,GACf,KAAK,MAAQA,EACb,KAAK,IAAMpM,EAAK,KAAK,MAAQ,MAAQA,IAAO,OAASA,EAAK,KAAK,eAAeiM,EAAW,KAAK,GAAIG,CAAK,EAChG,IACX,EACAE,EAAY,UAAU,eAAiB,SAAUL,EAAWO,EAAKJ,EAAO,CACpE,OAAIA,IAAU,SAAUA,EAAQ,GACzBC,GAAiB,YAAYJ,EAAU,MAAM,KAAKA,EAAW,IAAI,EAAGG,CAAK,CACpF,EACAE,EAAY,UAAU,eAAiB,SAAUG,EAAYF,EAAIH,EAAO,CAEpE,GADIA,IAAU,SAAUA,EAAQ,GAC5BA,GAAS,MAAQ,KAAK,QAAUA,GAAS,KAAK,UAAY,GAC1D,OAAOG,EAEPA,GAAM,MACNF,GAAiB,cAAcE,CAAE,CAGzC,EACAD,EAAY,UAAU,QAAU,SAAUH,EAAOC,EAAO,CACpD,GAAI,KAAK,OACL,OAAO,IAAI,MAAM,8BAA8B,EAEnD,KAAK,QAAU,GACf,IAAItI,EAAQ,KAAK,SAASqI,EAAOC,CAAK,EACtC,GAAItI,EACA,OAAOA,EAEF,KAAK,UAAY,IAAS,KAAK,IAAM,OAC1C,KAAK,GAAK,KAAK,eAAe,KAAK,UAAW,KAAK,GAAI,IAAI,EAEnE,EACAwI,EAAY,UAAU,SAAW,SAAUH,EAAOO,EAAQ,CACtD,IAAIC,EAAU,GACVC,EACJ,GAAI,CACA,KAAK,KAAKT,CAAK,CACnB,OACOpN,EAAG,CACN4N,EAAU,GACVC,EAAa7N,GAAQ,IAAI,MAAM,oCAAoC,CACvE,CACA,GAAI4N,EACA,YAAK,YAAW,EACTC,CAEf,EACAN,EAAY,UAAU,YAAc,UAAY,CAC5C,GAAI,CAAC,KAAK,OAAQ,CACd,IAAItM,EAAK,KAAMuM,EAAKvM,EAAG,GAAIiM,EAAYjM,EAAG,UACtC6M,EAAUZ,EAAU,QACxB,KAAK,KAAO,KAAK,MAAQ,KAAK,UAAY,KAC1C,KAAK,QAAU,GACf7G,GAAUyH,EAAS,IAAI,EACnBN,GAAM,OACN,KAAK,GAAK,KAAK,eAAeN,EAAWM,EAAI,IAAI,GAErD,KAAK,MAAQ,KACbzH,EAAO,UAAU,YAAY,KAAK,IAAI,CAC1C,CACJ,EACOwH,CACX,GAAEN,EAAM,ECvFJc,GAAa,EACbC,GACAC,GAAgB,CAAA,EACpB,SAASC,GAAmB9F,EAAQ,CAChC,OAAIA,KAAU6F,IACV,OAAOA,GAAc7F,CAAM,EACpB,IAEJ,EACX,CACO,IAAI+F,GAAY,CACnB,aAAc,SAAUnL,EAAI,CACxB,IAAIoF,EAAS2F,KACb,OAAAE,GAAc7F,CAAM,EAAI,GACnB4F,KACDA,GAAW,QAAQ,QAAO,GAE9BA,GAAS,KAAK,UAAY,CAAE,OAAOE,GAAmB9F,CAAM,GAAKpF,GAAM,CAAC,EACjEoF,CACX,EACA,eAAgB,SAAUA,EAAQ,CAC9B8F,GAAmB9F,CAAM,CAC7B,CACJ,ECrBIgG,GAAeD,GAAU,aAAcE,GAAiBF,GAAU,eAC3DG,GAAoB,CAC3B,aAAc,UAAY,CAEtB,QADIpG,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAG3B,OAAuFiG,GAAc,MAAM,OAAQpJ,GAAc,GAAIH,GAAOqD,CAAI,CAAC,CAAC,CACtJ,EACA,eAAgB,SAAUE,EAAQ,CAE9B,OAAyFiG,GAAgBjG,CAAM,CACnH,EACA,SAAU,MACd,ECdImG,IAAc,SAAUxI,EAAQ,CAChCrC,GAAU6K,EAAYxI,CAAM,EAC5B,SAASwI,EAAWrB,EAAWC,EAAM,CACjC,IAAIzE,EAAQ3C,EAAO,KAAK,KAAMmH,EAAWC,CAAI,GAAK,KAClD,OAAAzE,EAAM,UAAYwE,EAClBxE,EAAM,KAAOyE,EACNzE,CACX,CACA,OAAA6F,EAAW,UAAU,eAAiB,SAAUrB,EAAWM,EAAIH,EAAO,CAElE,OADIA,IAAU,SAAUA,EAAQ,GAC5BA,IAAU,MAAQA,EAAQ,EACnBtH,EAAO,UAAU,eAAe,KAAK,KAAMmH,EAAWM,EAAIH,CAAK,GAE1EH,EAAU,QAAQ,KAAK,IAAI,EACpBA,EAAU,aAAeA,EAAU,WAAaoB,GAAkB,aAAapB,EAAU,MAAM,KAAKA,EAAW,MAAS,CAAC,GACpI,EACAqB,EAAW,UAAU,eAAiB,SAAUrB,EAAWM,EAAIH,EAAO,CAClE,IAAIpM,EAEJ,GADIoM,IAAU,SAAUA,EAAQ,GAC5BA,GAAS,KAAOA,EAAQ,EAAI,KAAK,MAAQ,EACzC,OAAOtH,EAAO,UAAU,eAAe,KAAK,KAAMmH,EAAWM,EAAIH,CAAK,EAE1E,IAAIS,EAAUZ,EAAU,QACpBM,GAAM,QAAUvM,EAAK6M,EAAQA,EAAQ,OAAS,CAAC,KAAO,MAAQ7M,IAAO,OAAS,OAASA,EAAG,MAAQuM,IAClGc,GAAkB,eAAed,CAAE,EAC/BN,EAAU,aAAeM,IACzBN,EAAU,WAAa,QAInC,EACOqB,CACX,GAAEhB,EAAW,EClCTiB,IAAa,UAAY,CACzB,SAASA,EAAUC,EAAqB1B,EAAK,CACrCA,IAAQ,SAAUA,EAAMyB,EAAU,KACtC,KAAK,oBAAsBC,EAC3B,KAAK,IAAM1B,CACf,CACA,OAAAyB,EAAU,UAAU,SAAW,SAAUrB,EAAME,EAAOD,EAAO,CACzD,OAAIC,IAAU,SAAUA,EAAQ,GACzB,IAAI,KAAK,oBAAoB,KAAMF,CAAI,EAAE,SAASC,EAAOC,CAAK,CACzE,EACAmB,EAAU,IAAMlC,GAAsB,IAC/BkC,CACX,KCXIE,IAAkB,SAAU3I,EAAQ,CACpCrC,GAAUgL,EAAgB3I,CAAM,EAChC,SAAS2I,EAAeC,EAAiB5B,EAAK,CACtCA,IAAQ,SAAUA,EAAMyB,GAAU,KACtC,IAAI9F,EAAQ3C,EAAO,KAAK,KAAM4I,EAAiB5B,CAAG,GAAK,KACvD,OAAArE,EAAM,QAAU,CAAA,EAChBA,EAAM,QAAU,GACTA,CACX,CACA,OAAAgG,EAAe,UAAU,MAAQ,SAAUE,EAAQ,CAC/C,IAAId,EAAU,KAAK,QACnB,GAAI,KAAK,QAAS,CACdA,EAAQ,KAAKc,CAAM,EACnB,MACJ,CACA,IAAI7J,EACJ,KAAK,QAAU,GACf,EACI,IAAKA,EAAQ6J,EAAO,QAAQA,EAAO,MAAOA,EAAO,KAAK,EAClD,YAEEA,EAASd,EAAQ,MAAK,GAEhC,GADA,KAAK,QAAU,GACX/I,EAAO,CACP,KAAQ6J,EAASd,EAAQ,SACrBc,EAAO,YAAW,EAEtB,MAAM7J,CACV,CACJ,EACO2J,CACX,GAAEF,EAAS,EC/BPK,IAAiB,SAAU9I,EAAQ,CACnCrC,GAAUmL,EAAe9I,CAAM,EAC/B,SAAS8I,GAAgB,CACrB,OAAO9I,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC/D,CACA,OAAA8I,EAAc,UAAU,MAAQ,SAAUD,EAAQ,CAC9C,KAAK,QAAU,GACf,IAAIE,EAAU,KAAK,WACnB,KAAK,WAAa,OAClB,IAAIhB,EAAU,KAAK,QACf/I,EACJ6J,EAASA,GAAUd,EAAQ,MAAK,EAChC,EACI,IAAK/I,EAAQ6J,EAAO,QAAQA,EAAO,MAAOA,EAAO,KAAK,EAClD,aAEEA,EAASd,EAAQ,CAAC,IAAMc,EAAO,KAAOE,GAAWhB,EAAQ,MAAK,GAExE,GADA,KAAK,QAAU,GACX/I,EAAO,CACP,MAAQ6J,EAASd,EAAQ,CAAC,IAAMc,EAAO,KAAOE,GAAWhB,EAAQ,SAC7Dc,EAAO,YAAW,EAEtB,MAAM7J,CACV,CACJ,EACO8J,CACX,GAAEH,EAAc,EC1BLK,GAAgB,IAAIF,GAAcN,EAAU,ECA5CS,GAAiB,IAAIN,GAAenB,EAAW,EAC/C0B,GAAQD,GCAfE,IAAwB,SAAUnJ,EAAQ,CAC1CrC,GAAUwL,EAAsBnJ,CAAM,EACtC,SAASmJ,EAAqBhC,EAAWC,EAAM,CAC3C,IAAIzE,EAAQ3C,EAAO,KAAK,KAAMmH,EAAWC,CAAI,GAAK,KAClD,OAAAzE,EAAM,UAAYwE,EAClBxE,EAAM,KAAOyE,EACNzE,CACX,CACA,OAAAwG,EAAqB,UAAU,eAAiB,SAAUhC,EAAWM,EAAIH,EAAO,CAE5E,OADIA,IAAU,SAAUA,EAAQ,GAC5BA,IAAU,MAAQA,EAAQ,EACnBtH,EAAO,UAAU,eAAe,KAAK,KAAMmH,EAAWM,EAAIH,CAAK,GAE1EH,EAAU,QAAQ,KAAK,IAAI,EACpBA,EAAU,aAAeA,EAAU,WAAa9B,GAAuB,sBAAsB,UAAY,CAAE,OAAO8B,EAAU,MAAM,MAAS,CAAG,CAAC,GAC1J,EACAgC,EAAqB,UAAU,eAAiB,SAAUhC,EAAWM,EAAIH,EAAO,CAC5E,IAAIpM,EAEJ,GADIoM,IAAU,SAAUA,EAAQ,GAC5BA,GAAS,KAAOA,EAAQ,EAAI,KAAK,MAAQ,EACzC,OAAOtH,EAAO,UAAU,eAAe,KAAK,KAAMmH,EAAWM,EAAIH,CAAK,EAE1E,IAAIS,EAAUZ,EAAU,QACpBM,GAAM,MAAQA,IAAON,EAAU,cAAgBjM,EAAK6M,EAAQA,EAAQ,OAAS,CAAC,KAAO,MAAQ7M,IAAO,OAAS,OAASA,EAAG,MAAQuM,IACjIpC,GAAuB,qBAAqBoC,CAAE,EAC9CN,EAAU,WAAa,OAG/B,EACOgC,CACX,GAAE3B,EAAW,EC/BT4B,IAA2B,SAAUpJ,EAAQ,CAC7CrC,GAAUyL,EAAyBpJ,CAAM,EACzC,SAASoJ,GAA0B,CAC/B,OAAOpJ,IAAW,MAAQA,EAAO,MAAM,KAAM,SAAS,GAAK,IAC/D,CACA,OAAAoJ,EAAwB,UAAU,MAAQ,SAAUP,EAAQ,CACxD,KAAK,QAAU,GACf,IAAIE,EACAF,EACAE,EAAUF,EAAO,IAGjBE,EAAU,KAAK,WACf,KAAK,WAAa,QAEtB,IAAIhB,EAAU,KAAK,QACf/I,EACJ6J,EAASA,GAAUd,EAAQ,MAAK,EAChC,EACI,IAAK/I,EAAQ6J,EAAO,QAAQA,EAAO,MAAOA,EAAO,KAAK,EAClD,aAEEA,EAASd,EAAQ,CAAC,IAAMc,EAAO,KAAOE,GAAWhB,EAAQ,MAAK,GAExE,GADA,KAAK,QAAU,GACX/I,EAAO,CACP,MAAQ6J,EAASd,EAAQ,CAAC,IAAMc,EAAO,KAAOE,GAAWhB,EAAQ,SAC7Dc,EAAO,YAAW,EAEtB,MAAM7J,CACV,CACJ,EACOoK,CACX,GAAET,EAAc,EChCLU,GAA0B,IAAID,GAAwBD,EAAoB,ECD1EG,GAAQ,IAAIzF,GAAW,SAAUG,EAAY,CAAE,OAAOA,EAAW,UAAY,CAAC,ECAlF,SAASuF,GAAYrL,EAAO,CAC/B,OAAOA,GAAS2B,GAAW3B,EAAM,QAAQ,CAC7C,CCDA,SAAS+I,GAAK1G,EAAK,CACf,OAAOA,EAAIA,EAAI,OAAS,CAAC,CAC7B,CACO,SAASiJ,GAAkBrH,EAAM,CACpC,OAAOtC,GAAWoH,GAAK9E,CAAI,CAAC,EAAIA,EAAK,IAAG,EAAK,MACjD,CACO,SAASsH,GAAatH,EAAM,CAC/B,OAAOoH,GAAYtC,GAAK9E,CAAI,CAAC,EAAIA,EAAK,IAAG,EAAK,MAClD,CACO,SAASuH,GAAUvH,EAAMwH,EAAc,CAC1C,OAAO,OAAO1C,GAAK9E,CAAI,GAAM,SAAWA,EAAK,IAAG,EAAKwH,CACzD,CCbO,IAAIC,IAAe,SAAUlO,EAAG,CAAE,OAAOA,GAAK,OAAOA,EAAE,QAAW,UAAY,OAAOA,GAAM,UAAY,GCCvG,SAASmO,GAAU3L,EAAO,CAC7B,OAAO2B,GAAW3B,GAAU,KAA2B,OAASA,EAAM,IAAI,CAC9E,CCDO,SAAS4L,GAAoBpG,EAAO,CACvC,OAAO7D,GAAW6D,EAAMY,EAAiB,CAAC,CAC9C,CCHO,SAASyF,GAAgBC,EAAK,CACjC,OAAO,OAAO,eAAiBnK,GAAWmK,GAAQ,KAAyB,OAASA,EAAI,OAAO,aAAa,CAAC,CACjH,CCHO,SAASC,GAAiCvG,EAAO,CACpD,OAAO,IAAI,UAAU,iBAAmBA,IAAU,MAAQ,OAAOA,GAAU,SAAW,oBAAsB,IAAMA,EAAQ,KAAO,0HAA0H,CAC/P,CCFO,SAASwG,IAAoB,CAChC,OAAI,OAAO,QAAW,YAAc,CAAC,OAAO,SACjC,aAEJ,OAAO,QAClB,CACO,IAAIC,GAAWD,GAAiB,ECJhC,SAASE,GAAW1G,EAAO,CAC9B,OAAO7D,GAAW6D,GAAU,KAA2B,OAASA,EAAM2G,EAAe,CAAC,CAC1F,CCFO,SAASC,GAAmCC,EAAgB,CAC/D,OAAOjL,GAAiB,KAAM,UAAW,UAAgD,CACrF,IAAIkL,EAAQtP,EAAIgD,EAAOuM,EACvB,OAAOhM,GAAY,KAAM,SAAUtD,EAAI,CACnC,OAAQA,EAAG,MAAK,CACZ,IAAK,GACDqP,EAASD,EAAe,UAAS,EACjCpP,EAAG,MAAQ,EACf,IAAK,GACDA,EAAG,KAAK,KAAK,CAAC,EAAC,CAAI,EAAG,EAAE,CAAC,EACzBA,EAAG,MAAQ,EACf,IAAK,GAED,MAAO,CAAC,EAAGkE,GAAQmL,EAAO,KAAI,CAAE,CAAC,EACrC,IAAK,GAED,OADAtP,EAAKC,EAAG,OAAQ+C,EAAQhD,EAAG,MAAOuP,EAAOvP,EAAG,KACvCuP,EACE,CAAC,EAAGpL,GAAQ,MAAM,CAAC,EADR,CAAC,EAAG,CAAC,EAE3B,IAAK,GAAG,MAAO,CAAC,EAAGlE,EAAG,KAAI,CAAE,EAC5B,IAAK,GAAG,MAAO,CAAC,EAAGkE,GAAQnB,CAAK,CAAC,EACjC,IAAK,GAAG,MAAO,CAAC,EAAG/C,EAAG,KAAI,CAAE,EAC5B,IAAK,GACD,OAAAA,EAAG,KAAI,EACA,CAAC,EAAG,CAAC,EAChB,IAAK,GAAG,MAAO,CAAC,EAAG,EAAE,EACrB,IAAK,GACD,OAAAqP,EAAO,YAAW,EACX,CAAC,CAAC,EACb,IAAK,IAAI,MAAO,CAAC,CAAC,CAClC,CACQ,CAAC,CACL,CAAC,CACL,CACO,SAASE,GAAqBV,EAAK,CACtC,OAAOnK,GAAWmK,GAAQ,KAAyB,OAASA,EAAI,SAAS,CAC7E,CCzBO,SAASW,GAAUjH,EAAO,CAC7B,GAAIA,aAAiBG,GACjB,OAAOH,EAEX,GAAIA,GAAS,KAAM,CACf,GAAIoG,GAAoBpG,CAAK,EACzB,OAAOkH,GAAsBlH,CAAK,EAEtC,GAAIkG,GAAYlG,CAAK,EACjB,OAAOmH,GAAcnH,CAAK,EAE9B,GAAImG,GAAUnG,CAAK,EACf,OAAOoH,GAAYpH,CAAK,EAE5B,GAAIqG,GAAgBrG,CAAK,EACrB,OAAOqH,GAAkBrH,CAAK,EAElC,GAAI0G,GAAW1G,CAAK,EAChB,OAAOsH,GAAatH,CAAK,EAE7B,GAAIgH,GAAqBhH,CAAK,EAC1B,OAAOuH,GAAuBvH,CAAK,CAE3C,CACA,MAAMuG,GAAiCvG,CAAK,CAChD,CACO,SAASkH,GAAsBZ,EAAK,CACvC,OAAO,IAAInG,GAAW,SAAUG,EAAY,CACxC,IAAIkH,EAAMlB,EAAI1F,EAAiB,EAAC,EAChC,GAAIzE,GAAWqL,EAAI,SAAS,EACxB,OAAOA,EAAI,UAAUlH,CAAU,EAEnC,MAAM,IAAI,UAAU,gEAAgE,CACxF,CAAC,CACL,CACO,SAAS6G,GAAcM,EAAO,CACjC,OAAO,IAAItH,GAAW,SAAUG,EAAY,CACxC,QAAS,EAAI,EAAG,EAAImH,EAAM,QAAU,CAACnH,EAAW,OAAQ,IACpDA,EAAW,KAAKmH,EAAM,CAAC,CAAC,EAE5BnH,EAAW,SAAQ,CACvB,CAAC,CACL,CACO,SAAS8G,GAAYM,EAAS,CACjC,OAAO,IAAIvH,GAAW,SAAUG,EAAY,CACxCoH,EACK,KAAK,SAAUlN,EAAO,CAClB8F,EAAW,SACZA,EAAW,KAAK9F,CAAK,EACrB8F,EAAW,SAAQ,EAE3B,EAAG,SAAU3D,EAAK,CAAE,OAAO2D,EAAW,MAAM3D,CAAG,CAAG,CAAC,EAC9C,KAAK,KAAMiC,EAAoB,CACxC,CAAC,CACL,CACO,SAAS0I,GAAaK,EAAU,CACnC,OAAO,IAAIxH,GAAW,SAAUG,EAAY,CACxC,IAAIpD,EAAK1F,EACT,GAAI,CACA,QAASoQ,EAAazM,GAASwM,CAAQ,EAAGE,EAAeD,EAAW,KAAI,EAAI,CAACC,EAAa,KAAMA,EAAeD,EAAW,KAAI,EAAI,CAC9H,IAAIpN,EAAQqN,EAAa,MAEzB,GADAvH,EAAW,KAAK9F,CAAK,EACjB8F,EAAW,OACX,MAER,CACJ,OACO9C,EAAO,CAAEN,EAAM,CAAE,MAAOM,CAAK,CAAI,QAChD,CACY,GAAI,CACIqK,GAAgB,CAACA,EAAa,OAASrQ,EAAKoQ,EAAW,SAASpQ,EAAG,KAAKoQ,CAAU,CAC1F,QACZ,CAAsB,GAAI1K,EAAK,MAAMA,EAAI,KAAO,CACxC,CACAoD,EAAW,SAAQ,CACvB,CAAC,CACL,CACO,SAAS+G,GAAkBS,EAAe,CAC7C,OAAO,IAAI3H,GAAW,SAAUG,EAAY,CACxCyH,GAAQD,EAAexH,CAAU,EAAE,MAAM,SAAU3D,EAAK,CAAE,OAAO2D,EAAW,MAAM3D,CAAG,CAAG,CAAC,CAC7F,CAAC,CACL,CACO,SAAS4K,GAAuBV,EAAgB,CACnD,OAAOQ,GAAkBT,GAAmCC,CAAc,CAAC,CAC/E,CACA,SAASkB,GAAQD,EAAexH,EAAY,CACxC,IAAI0H,EAAiBC,EACjB9K,EAAK3F,EACT,OAAO2C,GAAU,KAAM,OAAQ,OAAQ,UAAY,CAC/C,IAAIK,EAAOuD,EACX,OAAOhD,GAAY,KAAM,SAAUtD,EAAI,CACnC,OAAQA,EAAG,MAAK,CACZ,IAAK,GACDA,EAAG,KAAK,KAAK,CAAC,EAAG,EAAG,EAAG,EAAE,CAAC,EAC1BuQ,EAAkB9L,GAAc4L,CAAa,EAC7CrQ,EAAG,MAAQ,EACf,IAAK,GAAG,MAAO,CAAC,EAAGuQ,EAAgB,KAAI,CAAE,EACzC,IAAK,GACD,GAAMC,EAAoBxQ,EAAG,OAAQ,EAACwQ,EAAkB,KAAO,MAAO,CAAC,EAAG,CAAC,EAG3E,GAFAzN,EAAQyN,EAAkB,MAC1B3H,EAAW,KAAK9F,CAAK,EACjB8F,EAAW,OACX,MAAO,CAAC,CAAC,EAEb7I,EAAG,MAAQ,EACf,IAAK,GAAG,MAAO,CAAC,EAAG,CAAC,EACpB,IAAK,GAAG,MAAO,CAAC,EAAG,EAAE,EACrB,IAAK,GACD,OAAAsG,EAAQtG,EAAG,KAAI,EACf0F,EAAM,CAAE,MAAOY,CAAK,EACb,CAAC,EAAG,EAAE,EACjB,IAAK,GAED,OADAtG,EAAG,KAAK,KAAK,CAAC,EAAC,CAAI,EAAG,EAAE,CAAC,EACnBwQ,GAAqB,CAACA,EAAkB,OAASzQ,EAAKwQ,EAAgB,QACrE,CAAC,EAAGxQ,EAAG,KAAKwQ,CAAe,CAAC,EAD0D,CAAC,EAAG,CAAC,EAEtG,IAAK,GACDvQ,EAAG,KAAI,EACPA,EAAG,MAAQ,EACf,IAAK,GAAG,MAAO,CAAC,EAAG,EAAE,EACrB,IAAK,GACD,GAAI0F,EAAK,MAAMA,EAAI,MACnB,MAAO,CAAC,CAAC,EACb,IAAK,IAAI,MAAO,CAAC,CAAC,EAClB,IAAK,IACD,OAAAmD,EAAW,SAAQ,EACZ,CAAC,CAAC,CAC7B,CACQ,CAAC,CACL,CAAC,CACL,CC7IO,SAAS4H,GAAgBC,EAAoB1E,EAAWC,EAAME,EAAOwE,EAAQ,CAC5ExE,IAAU,SAAUA,EAAQ,GAC5BwE,IAAW,SAAUA,EAAS,IAClC,IAAIC,EAAuB5E,EAAU,SAAS,UAAY,CACtDC,EAAI,EACA0E,EACAD,EAAmB,IAAI,KAAK,SAAS,KAAMvE,CAAK,CAAC,EAGjD,KAAK,YAAW,CAExB,EAAGA,CAAK,EAER,GADAuE,EAAmB,IAAIE,CAAoB,EACvC,CAACD,EACD,OAAOC,CAEf,CCbO,SAASC,GAAU7E,EAAWG,EAAO,CACxC,OAAIA,IAAU,SAAUA,EAAQ,GACzB5C,GAAQ,SAAUR,EAAQF,EAAY,CACzCE,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CAAE,OAAO0N,GAAgB5H,EAAYmD,EAAW,UAAY,CAAE,OAAOnD,EAAW,KAAK9F,CAAK,CAAG,EAAGoJ,CAAK,CAAG,EAAG,UAAY,CAAE,OAAOsE,GAAgB5H,EAAYmD,EAAW,UAAY,CAAE,OAAOnD,EAAW,UAAY,EAAGsD,CAAK,CAAG,EAAG,SAAUjH,EAAK,CAAE,OAAOuL,GAAgB5H,EAAYmD,EAAW,UAAY,CAAE,OAAOnD,EAAW,MAAM3D,CAAG,CAAG,EAAGiH,CAAK,CAAG,CAAC,CAAC,CACpa,CAAC,CACL,CCPO,SAAS2E,GAAY9E,EAAWG,EAAO,CAC1C,OAAIA,IAAU,SAAUA,EAAQ,GACzB5C,GAAQ,SAAUR,EAAQF,EAAY,CACzCA,EAAW,IAAImD,EAAU,SAAS,UAAY,CAAE,OAAOjD,EAAO,UAAUF,CAAU,CAAG,EAAGsD,CAAK,CAAC,CAClG,CAAC,CACL,CCHO,SAAS4E,GAAmBxI,EAAOyD,EAAW,CACjD,OAAOwD,GAAUjH,CAAK,EAAE,KAAKuI,GAAY9E,CAAS,EAAG6E,GAAU7E,CAAS,CAAC,CAC7E,CCFO,SAASgF,GAAgBzI,EAAOyD,EAAW,CAC9C,OAAOwD,GAAUjH,CAAK,EAAE,KAAKuI,GAAY9E,CAAS,EAAG6E,GAAU7E,CAAS,CAAC,CAC7E,CCJO,SAASiF,GAAc1I,EAAOyD,EAAW,CAC5C,OAAO,IAAItD,GAAW,SAAUG,EAAY,CACxC,IAAIzJ,EAAI,EACR,OAAO4M,EAAU,SAAS,UAAY,CAC9B5M,IAAMmJ,EAAM,OACZM,EAAW,SAAQ,GAGnBA,EAAW,KAAKN,EAAMnJ,GAAG,CAAC,EACrByJ,EAAW,QACZ,KAAK,SAAQ,EAGzB,CAAC,CACL,CAAC,CACL,CCZO,SAASqI,GAAiB3I,EAAOyD,EAAW,CAC/C,OAAO,IAAItD,GAAW,SAAUG,EAAY,CACxC,IAAImG,EACJ,OAAAyB,GAAgB5H,EAAYmD,EAAW,UAAY,CAC/CgD,EAAWzG,EAAM2G,EAAe,EAAC,EACjCuB,GAAgB5H,EAAYmD,EAAW,UAAY,CAC/C,IAAIjM,EACAgD,EACAuM,EACJ,GAAI,CACCvP,EAAKiP,EAAS,OAAQjM,EAAQhD,EAAG,MAAOuP,EAAOvP,EAAG,IACvD,OACOmF,EAAK,CACR2D,EAAW,MAAM3D,CAAG,EACpB,MACJ,CACIoK,EACAzG,EAAW,SAAQ,EAGnBA,EAAW,KAAK9F,CAAK,CAE7B,EAAG,EAAG,EAAI,CACd,CAAC,EACM,UAAY,CAAE,OAAO2B,GAAWsK,GAAa,KAA8B,OAASA,EAAS,MAAM,GAAKA,EAAS,OAAM,CAAI,CACtI,CAAC,CACL,CC5BO,SAASmC,GAAsB5I,EAAOyD,EAAW,CACpD,GAAI,CAACzD,EACD,MAAM,IAAI,MAAM,yBAAyB,EAE7C,OAAO,IAAIG,GAAW,SAAUG,EAAY,CACxC4H,GAAgB5H,EAAYmD,EAAW,UAAY,CAC/C,IAAIgD,EAAWzG,EAAM,OAAO,aAAa,EAAC,EAC1CkI,GAAgB5H,EAAYmD,EAAW,UAAY,CAC/CgD,EAAS,KAAI,EAAG,KAAK,SAAU3L,EAAQ,CAC/BA,EAAO,KACPwF,EAAW,SAAQ,EAGnBA,EAAW,KAAKxF,EAAO,KAAK,CAEpC,CAAC,CACL,EAAG,EAAG,EAAI,CACd,CAAC,CACL,CAAC,CACL,CCnBO,SAAS+N,GAA2B7I,EAAOyD,EAAW,CACzD,OAAOmF,GAAsBhC,GAAmC5G,CAAK,EAAGyD,CAAS,CACrF,CCSO,SAASqF,GAAU9I,EAAOyD,EAAW,CACxC,GAAIzD,GAAS,KAAM,CACf,GAAIoG,GAAoBpG,CAAK,EACzB,OAAOwI,GAAmBxI,EAAOyD,CAAS,EAE9C,GAAIyC,GAAYlG,CAAK,EACjB,OAAO0I,GAAc1I,EAAOyD,CAAS,EAEzC,GAAI0C,GAAUnG,CAAK,EACf,OAAOyI,GAAgBzI,EAAOyD,CAAS,EAE3C,GAAI4C,GAAgBrG,CAAK,EACrB,OAAO4I,GAAsB5I,EAAOyD,CAAS,EAEjD,GAAIiD,GAAW1G,CAAK,EAChB,OAAO2I,GAAiB3I,EAAOyD,CAAS,EAE5C,GAAIuD,GAAqBhH,CAAK,EAC1B,OAAO6I,GAA2B7I,EAAOyD,CAAS,CAE1D,CACA,MAAM8C,GAAiCvG,CAAK,CAChD,CCjCO,SAASvE,GAAKuE,EAAOyD,EAAW,CACnC,OAAOA,EAAYqF,GAAU9I,EAAOyD,CAAS,EAAIwD,GAAUjH,CAAK,CACpE,CCFO,SAAS+I,IAAK,CAEjB,QADItK,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAI+E,EAAYsC,GAAatH,CAAI,EACjC,OAAOhD,GAAKgD,EAAMgF,CAAS,CAC/B,CCPO,SAASuF,GAAWC,EAAqBxF,EAAW,CACvD,IAAIyF,EAAe/M,GAAW8M,CAAmB,EAAIA,EAAsB,UAAY,CAAE,OAAOA,CAAqB,EACjHhI,EAAO,SAAUX,EAAY,CAAE,OAAOA,EAAW,MAAM4I,GAAc,CAAG,EAC5E,OAAO,IAAI/I,GAAmGc,CAAI,CACtH,CCLO,IAAIkI,GAAa/M,GAAiB,SAAUE,EAAQ,CACvD,OAAO,UAA0B,CAC7BA,EAAO,IAAI,EACX,KAAK,KAAO,aACZ,KAAK,QAAU,yBACnB,CACJ,CAAC,ECNM,SAAS8M,GAAc5I,EAAQnC,EAAQ,CAE1C,OAAO,IAAI,QAAQ,SAAU5D,EAASC,EAAQ,CAC1C,IAAI2O,EAAY,GACZ1G,EACJnC,EAAO,UAAU,CACb,KAAM,SAAUhG,EAAO,CACnBmI,EAASnI,EACT6O,EAAY,EAChB,EACA,MAAO3O,EACP,SAAU,UAAY,CACd2O,EACA5O,EAAQkI,CAAM,EAMdjI,EAAO,IAAIyO,EAAY,CAE/B,CACZ,CAAS,CACL,CAAC,CACL,CCvBO,SAASG,GAAe9I,EAAQnC,EAAQ,CAE3C,OAAO,IAAI,QAAQ,SAAU5D,EAASC,EAAQ,CAC1C,IAAI4F,EAAa,IAAIjB,GAAe,CAChC,KAAM,SAAU7E,EAAO,CACnBC,EAAQD,CAAK,EACb8F,EAAW,YAAW,CAC1B,EACA,MAAO5F,EACP,SAAU,UAAY,CAKdA,EAAO,IAAIyO,EAAY,CAE/B,CACZ,CAAS,EACD3I,EAAO,UAAUF,CAAU,CAC/B,CAAC,CACL,CCtBO,SAASiJ,GAAY/O,EAAO,CAC/B,OAAOA,aAAiB,MAAQ,CAAC,MAAMA,CAAK,CAChD,CCKO,IAAIgP,GAAepN,GAAiB,SAAUE,EAAQ,CACzD,OAAO,SAA0BmN,EAAM,CAC/BA,IAAS,SAAUA,EAAO,MAC9BnN,EAAO,IAAI,EACX,KAAK,QAAU,uBACf,KAAK,KAAO,eACZ,KAAK,KAAOmN,CAChB,CACJ,CAAC,EACM,SAASjL,GAAQH,EAAQqL,EAAc,CAC1C,IAAIlS,EAAM+R,GAAYlL,CAAM,EAAI,CAAE,MAAOA,CAAM,EAAK,OAAOA,GAAW,SAAW,CAAE,KAAMA,CAAM,EAAKA,EAASsL,EAAQnS,EAAG,MAAOoS,EAAOpS,EAAG,KAAMC,EAAKD,EAAG,KAAMqS,EAAQpS,IAAO,OAASqS,GAAsBrS,EAAI2K,EAAK5K,EAAG,UAAWiM,EAAYrB,IAAO,OAA2EmD,GAAiBnD,EAAI2H,EAAKvS,EAAG,KAAMwS,EAAOD,IAAO,OAAS,KAAOA,EACjY,GAAIJ,GAAS,MAAQC,GAAQ,KACzB,MAAM,IAAI,UAAU,sBAAsB,EAE9C,OAAO5I,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAI2J,EACAC,EACAC,EAAY,KACZC,EAAO,EACPC,EAAa,SAAUzG,EAAO,CAC9BsG,EAAoBhC,GAAgB5H,EAAYmD,EAAW,UAAY,CACnE,GAAI,CACAwG,EAA2B,YAAW,EACtChD,GAAU4C,EAAM,CACZ,KAAMG,EACN,UAAWG,EACX,KAAMC,CAC9B,CAAqB,CAAC,EAAE,UAAU9J,CAAU,CAC5B,OACO3D,EAAK,CACR2D,EAAW,MAAM3D,CAAG,CACxB,CACJ,EAAGiH,CAAK,CACZ,EACAqG,EAA6BzJ,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CAChG0P,GAAsB,MAAgDA,EAAkB,YAAW,EACnGE,IACA9J,EAAW,KAAM6J,EAAY3P,CAAK,EAClCoP,EAAO,GAAKS,EAAWT,CAAI,CAC/B,EAAG,OAAW,OAAW,UAAY,CAC3BM,GAAsB,MAAgDA,EAAkB,QAC1FA,GAAsB,MAAgDA,EAAkB,YAAW,EAEvGC,EAAY,IAChB,CAAC,CAAC,EACF,CAACC,GAAQC,EAAWV,GAAS,KAAQ,OAAOA,GAAU,SAAWA,EAAQ,CAACA,EAAQlG,EAAU,IAAG,EAAMmG,CAAI,CAC7G,CAAC,CACL,CACA,SAASE,GAAoBL,EAAM,CAC/B,MAAM,IAAID,GAAaC,CAAI,CAC/B,CCvDO,SAASa,EAAIC,EAASnQ,EAAS,CAClC,OAAO4G,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIvD,EAAQ,EACZyD,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE8F,EAAW,KAAKiK,EAAQ,KAAKnQ,EAASI,EAAOuC,GAAO,CAAC,CACzD,CAAC,CAAC,CACN,CAAC,CACL,CCPA,IAAIyN,GAAU,MAAM,QACpB,SAASC,GAAYvK,EAAIzB,EAAM,CAC3B,OAAO+L,GAAQ/L,CAAI,EAAIyB,EAAG,MAAM,OAAQ3E,GAAc,CAAA,EAAIH,GAAOqD,CAAI,CAAC,CAAC,EAAIyB,EAAGzB,CAAI,CACtF,CACO,SAASiM,GAAiBxK,EAAI,CACjC,OAAOoK,EAAI,SAAU7L,EAAM,CAAE,OAAOgM,GAAYvK,EAAIzB,CAAI,CAAG,CAAC,CAChE,CCRA,IAAI+L,GAAU,MAAM,QAChBG,GAAiB,OAAO,eAAgBC,GAAc,OAAO,UAAWC,GAAU,OAAO,KACtF,SAASC,GAAqBrM,EAAM,CACvC,GAAIA,EAAK,SAAW,EAAG,CACnB,IAAIsM,EAAUtM,EAAK,CAAC,EACpB,GAAI+L,GAAQO,CAAO,EACf,MAAO,CAAE,KAAMA,EAAS,KAAM,IAAI,EAEtC,GAAIC,GAAOD,CAAO,EAAG,CACjB,IAAIE,EAAOJ,GAAQE,CAAO,EAC1B,MAAO,CACH,KAAME,EAAK,IAAI,SAAUC,EAAK,CAAE,OAAOH,EAAQG,CAAG,CAAG,CAAC,EACtD,KAAMD,CACtB,CACQ,CACJ,CACA,MAAO,CAAE,KAAMxM,EAAM,KAAM,IAAI,CACnC,CACA,SAASuM,GAAO1E,EAAK,CACjB,OAAOA,GAAO,OAAOA,GAAQ,UAAYqE,GAAerE,CAAG,IAAMsE,EACrE,CCpBO,SAASO,GAAaF,EAAMG,EAAQ,CACvC,OAAOH,EAAK,OAAO,SAAUnQ,EAAQoQ,EAAKrU,EAAG,CAAE,OAASiE,EAAOoQ,CAAG,EAAIE,EAAOvU,CAAC,EAAIiE,CAAS,EAAG,EAAE,CACpG,CCOO,SAASuQ,IAAgB,CAE5B,QADI5M,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAI+E,EAAYsC,GAAatH,CAAI,EAC7B6M,EAAiBxF,GAAkBrH,CAAI,EACvCjH,EAAKsT,GAAqBrM,CAAI,EAAG8M,EAAc/T,EAAG,KAAMyT,EAAOzT,EAAG,KACtE,GAAI+T,EAAY,SAAW,EACvB,OAAO9P,GAAK,CAAA,EAAIgI,CAAS,EAE7B,IAAI3I,EAAS,IAAIqF,GAAWqL,GAAkBD,EAAa9H,EAAWwH,EAE9D,SAAUG,EAAQ,CAAE,OAAOD,GAAaF,EAAMG,CAAM,CAAG,EAEvDxL,EAAQ,CAAC,EACjB,OAAO0L,EAAiBxQ,EAAO,KAAK4P,GAAiBY,CAAc,CAAC,EAAIxQ,CAC5E,CACO,SAAS0Q,GAAkBD,EAAa9H,EAAWgI,EAAgB,CACtE,OAAIA,IAAmB,SAAUA,EAAiB7L,IAC3C,SAAUU,EAAY,CACzBoL,GAAcjI,EAAW,UAAY,CAyBjC,QAxBIkI,EAASJ,EAAY,OACrBH,EAAS,IAAI,MAAMO,CAAM,EACzBC,EAASD,EACTE,EAAuBF,EACvBG,EAAU,SAAUjV,EAAG,CACvB6U,GAAcjI,EAAW,UAAY,CACjC,IAAIjD,EAAS/E,GAAK8P,EAAY1U,CAAC,EAAG4M,CAAS,EACvCsI,EAAgB,GACpBvL,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE4Q,EAAOvU,CAAC,EAAI2D,EACPuR,IACDA,EAAgB,GAChBF,KAECA,GACDvL,EAAW,KAAKmL,EAAeL,EAAO,MAAK,CAAE,CAAC,CAEtD,EAAG,UAAY,CACN,EAAEQ,GACHtL,EAAW,SAAQ,CAE3B,CAAC,CAAC,CACN,EAAGA,CAAU,CACjB,EACSzJ,EAAI,EAAGA,EAAI8U,EAAQ9U,IACxBiV,EAAQjV,CAAC,CAEjB,EAAGyJ,CAAU,CACjB,CACJ,CACA,SAASoL,GAAcjI,EAAWuI,EAASpJ,EAAc,CACjDa,EACAyE,GAAgBtF,EAAca,EAAWuI,CAAO,EAGhDA,EAAO,CAEf,CCjEO,SAASC,GAAezL,EAAQF,EAAYiK,EAAS2B,EAAYC,EAAcC,EAAQC,EAAmBC,EAAqB,CAClI,IAAIC,EAAS,CAAA,EACTX,EAAS,EACT7O,EAAQ,EACRyP,EAAa,GACbC,EAAgB,UAAY,CACxBD,GAAc,CAACD,EAAO,QAAU,CAACX,GACjCtL,EAAW,SAAQ,CAE3B,EACIoM,EAAY,SAAUlS,EAAO,CAAE,OAAQoR,EAASM,EAAaS,EAAWnS,CAAK,EAAI+R,EAAO,KAAK/R,CAAK,CAAI,EACtGmS,EAAa,SAAUnS,EAAO,CAE9BoR,IACA,IAAIgB,EAAgB,GACpB3F,GAAUsD,EAAQ/P,EAAOuC,GAAO,CAAC,EAAE,UAAUoE,GAAyBb,EAAY,SAAUuM,EAAY,CAMhGvM,EAAW,KAAKuM,CAAU,CAElC,EAAG,UAAY,CACXD,EAAgB,EACpB,EAAG,OAAW,UAAY,CACtB,GAAIA,EACA,GAAI,CACAhB,IAUA,QATIE,EAAU,UAAY,CACtB,IAAIgB,EAAgBP,EAAO,MAAK,EAC5BF,GAIAM,EAAWG,CAAa,CAEhC,EACOP,EAAO,QAAUX,EAASM,GAC7BJ,EAAO,EAEXW,EAAa,CACjB,OACO9P,EAAK,CACR2D,EAAW,MAAM3D,CAAG,CACxB,CAER,CAAC,CAAC,CACN,EACA,OAAA6D,EAAO,UAAUW,GAAyBb,EAAYoM,EAAW,UAAY,CACzEF,EAAa,GACbC,EAAa,CACjB,CAAC,CAAC,EACK,UAAY,CAEnB,CACJ,CCtDO,SAASM,GAASxC,EAASe,EAAgBY,EAAY,CAE1D,OADIA,IAAe,SAAUA,EAAa,KACtC/P,GAAWmP,CAAc,EAClByB,GAAS,SAAU9V,EAAGJ,EAAG,CAAE,OAAOyT,EAAI,SAAU/S,EAAGyV,EAAI,CAAE,OAAO1B,EAAerU,EAAGM,EAAGV,EAAGmW,CAAE,CAAG,CAAC,EAAE/F,GAAUsD,EAAQtT,EAAGJ,CAAC,CAAC,CAAC,CAAG,EAAGqV,CAAU,GAE1I,OAAOZ,GAAmB,WAC/BY,EAAaZ,GAEVtK,GAAQ,SAAUR,EAAQF,EAAY,CAAE,OAAO2L,GAAezL,EAAQF,EAAYiK,EAAS2B,CAAU,CAAG,CAAC,EACpH,CCZO,SAASe,GAASf,EAAY,CACjC,OAAIA,IAAe,SAAUA,EAAa,KACnCa,GAASnN,GAAUsM,CAAU,CACxC,CCJO,SAASgB,IAAY,CACxB,OAAOD,GAAS,CAAC,CACrB,CCAO,SAASE,IAAS,CAErB,QADI1O,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,OAAOwO,GAAS,EAAGzR,GAAKgD,EAAMsH,GAAatH,CAAI,CAAC,CAAC,CACrD,CCPO,SAAS2O,GAAMC,EAAmB,CACrC,OAAO,IAAIlN,GAAW,SAAUG,EAAY,CACxC2G,GAAUoG,EAAiB,CAAE,EAAE,UAAU/M,CAAU,CACvD,CAAC,CACL,CCFO,SAASgN,GAAMC,EAASC,EAAqB/J,EAAW,CACvD8J,IAAY,SAAUA,EAAU,GAChC9J,IAAc,SAAUA,EAAY8B,IACxC,IAAIkI,EAAmB,GACvB,OAAID,GAAuB,OACnB3H,GAAY2H,CAAmB,EAC/B/J,EAAY+J,EAGZC,EAAmBD,GAGpB,IAAIrN,GAAW,SAAUG,EAAY,CACxC,IAAIoN,EAAMnE,GAAYgE,CAAO,EAAI,CAACA,EAAU9J,EAAU,IAAG,EAAK8J,EAC1DG,EAAM,IACNA,EAAM,GAEV,IAAI9W,EAAI,EACR,OAAO6M,EAAU,SAAS,UAAY,CAC7BnD,EAAW,SACZA,EAAW,KAAK1J,GAAG,EACf,GAAK6W,EACL,KAAK,SAAS,OAAWA,CAAgB,EAGzCnN,EAAW,SAAQ,EAG/B,EAAGoN,CAAG,CACV,CAAC,CACL,CChCO,SAASC,GAASC,EAAQnK,EAAW,CACxC,OAAImK,IAAW,SAAUA,EAAS,GAC9BnK,IAAc,SAAUA,EAAY8B,IACpCqI,EAAS,IACTA,EAAS,GAENN,GAAMM,EAAQA,EAAQnK,CAAS,CAC1C,CCJO,SAASoK,IAAQ,CAEpB,QADIpP,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAI+E,EAAYsC,GAAatH,CAAI,EAC7ByN,EAAalG,GAAUvH,EAAM,GAAQ,EACrCqP,EAAUrP,EACd,OAAQqP,EAAQ,OAGVA,EAAQ,SAAW,EAEb7G,GAAU6G,EAAQ,CAAC,CAAC,EAEpBb,GAASf,CAAU,EAAEzQ,GAAKqS,EAASrK,CAAS,CAAC,EALjDmC,EAMZ,CCnBO,IAAImI,GAAQ,IAAI5N,GAAWtB,EAAI,ECFlC2L,GAAU,MAAM,QACb,SAASwD,GAAevP,EAAM,CACjC,OAAOA,EAAK,SAAW,GAAK+L,GAAQ/L,EAAK,CAAC,CAAC,EAAIA,EAAK,CAAC,EAAIA,CAC7D,CCDO,SAASwP,EAAOC,EAAW9T,EAAS,CACvC,OAAO4G,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIvD,EAAQ,EACZyD,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CAAE,OAAO0T,EAAU,KAAK9T,EAASI,EAAOuC,GAAO,GAAKuD,EAAW,KAAK9F,CAAK,CAAG,CAAC,CAAC,CACzJ,CAAC,CACL,CCHO,SAAS2T,IAAO,CAEnB,QADIL,EAAU,CAAA,EACLpP,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCoP,EAAQpP,CAAE,EAAI,UAAUA,CAAE,EAE9B,OAAAoP,EAAUE,GAAeF,CAAO,EACzBA,EAAQ,SAAW,EAAI7G,GAAU6G,EAAQ,CAAC,CAAC,EAAI,IAAI3N,GAAWiO,GAASN,CAAO,CAAC,CAC1F,CACO,SAASM,GAASN,EAAS,CAC9B,OAAO,SAAUxN,EAAY,CAazB,QAZI+N,EAAgB,CAAA,EAChBvC,EAAU,SAAUjV,EAAG,CACvBwX,EAAc,KAAKpH,GAAU6G,EAAQjX,CAAC,CAAC,EAAE,UAAUsK,GAAyBb,EAAY,SAAU9F,EAAO,CACrG,GAAI6T,EAAe,CACf,QAAS7X,EAAI,EAAGA,EAAI6X,EAAc,OAAQ7X,IACtCA,IAAMK,GAAKwX,EAAc7X,CAAC,EAAE,YAAW,EAE3C6X,EAAgB,IACpB,CACA/N,EAAW,KAAK9F,CAAK,CACzB,CAAC,CAAC,CAAC,CACP,EACS3D,EAAI,EAAGwX,GAAiB,CAAC/N,EAAW,QAAUzJ,EAAIiX,EAAQ,OAAQjX,IACvEiV,EAAQjV,CAAC,CAEjB,CACJ,CC3BO,SAASyX,GAAMC,EAAkB,CACpC,OAAOvN,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIkO,EAAW,GACXrE,EAAY,KACZsE,EAAqB,KACrBjC,EAAa,GACbkC,EAAc,UAAY,CAG1B,GAFAD,GAAuB,MAAiDA,EAAmB,YAAW,EACtGA,EAAqB,KACjBD,EAAU,CACVA,EAAW,GACX,IAAIhU,EAAQ2P,EACZA,EAAY,KACZ7J,EAAW,KAAK9F,CAAK,CACzB,CACAgS,GAAclM,EAAW,SAAQ,CACrC,EACIqO,EAAkB,UAAY,CAC9BF,EAAqB,KACrBjC,GAAclM,EAAW,SAAQ,CACrC,EACAE,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnEgU,EAAW,GACXrE,EAAY3P,EACPiU,GACDxH,GAAUsH,EAAiB/T,CAAK,CAAC,EAAE,UAAWiU,EAAqBtN,GAAyBb,EAAYoO,EAAaC,CAAe,CAAC,CAE7I,EAAG,UAAY,CACXnC,EAAa,IACZ,CAACgC,GAAY,CAACC,GAAsBA,EAAmB,SAAWnO,EAAW,SAAQ,CAC1F,CAAC,CAAC,CACN,CAAC,CACL,CChCO,SAASsO,GAAUC,EAAUpL,EAAW,CAC3C,OAAIA,IAAc,SAAUA,EAAY8B,IACjC+I,GAAM,UAAY,CAAE,OAAOhB,GAAMuB,EAAUpL,CAAS,CAAG,CAAC,CACnE,CCHO,SAASqL,GAAWC,EAAU,CACjC,OAAO/N,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAI0O,EAAW,KACXC,EAAY,GACZC,EACJF,EAAWxO,EAAO,UAAUW,GAAyBb,EAAY,OAAW,OAAW,SAAU3D,EAAK,CAClGuS,EAAgBjI,GAAU8H,EAASpS,EAAKmS,GAAWC,CAAQ,EAAEvO,CAAM,CAAC,CAAC,EACjEwO,GACAA,EAAS,YAAW,EACpBA,EAAW,KACXE,EAAc,UAAU5O,CAAU,GAGlC2O,EAAY,EAEpB,CAAC,CAAC,EACEA,IACAD,EAAS,YAAW,EACpBA,EAAW,KACXE,EAAc,UAAU5O,CAAU,EAE1C,CAAC,CACL,CCxBO,SAAS6O,GAAcC,EAAaC,EAAMC,EAASC,EAAYC,EAAoB,CACtF,OAAO,SAAUhP,EAAQF,EAAY,CACjC,IAAImP,EAAWH,EACX3L,EAAQ0L,EACRtS,EAAQ,EACZyD,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE,IAAI3D,EAAIkG,IACR4G,EAAQ8L,EAEAL,EAAYzL,EAAOnJ,EAAO3D,CAAC,GAEzB4Y,EAAW,GAAOjV,GAC5B+U,GAAcjP,EAAW,KAAKqD,CAAK,CACvC,EAAG6L,IACE,UAAY,CACTC,GAAYnP,EAAW,KAAKqD,CAAK,EACjCrD,EAAW,SAAQ,CACvB,EAAE,CAAC,CACX,CACJ,CClBO,SAASoP,GAAON,EAAaC,EAAM,CACtC,OAAOrO,GAAQmO,GAAcC,EAAaC,EAAM,UAAU,QAAU,EAAG,GAAO,EAAI,CAAC,CACvF,CCFA,IAAIM,GAAa,SAAU9S,EAAKrC,EAAO,CAAE,OAAQqC,EAAI,KAAKrC,CAAK,EAAGqC,CAAM,EACjE,SAAS+S,IAAU,CACtB,OAAO5O,GAAQ,SAAUR,EAAQF,EAAY,CACzCoP,GAAOC,GAAY,CAAA,CAAE,EAAEnP,CAAM,EAAE,UAAUF,CAAU,CACvD,CAAC,CACL,CCJO,SAASuP,GAAatC,EAAS9J,EAAW,CAC7C,OAAIA,IAAc,SAAUA,EAAY8B,IACjCvE,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIwP,EAAa,KACb3F,EAAY,KACZ4F,EAAW,KACXC,EAAO,UAAY,CACnB,GAAIF,EAAY,CACZA,EAAW,YAAW,EACtBA,EAAa,KACb,IAAItV,EAAQ2P,EACZA,EAAY,KACZ7J,EAAW,KAAK9F,CAAK,CACzB,CACJ,EACA,SAASyV,GAAe,CACpB,IAAIC,EAAaH,EAAWxC,EACxBjK,EAAMG,EAAU,IAAG,EACvB,GAAIH,EAAM4M,EAAY,CAClBJ,EAAa,KAAK,SAAS,OAAWI,EAAa5M,CAAG,EACtDhD,EAAW,IAAIwP,CAAU,EACzB,MACJ,CACAE,EAAI,CACR,CACAxP,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE2P,EAAY3P,EACZuV,EAAWtM,EAAU,IAAG,EACnBqM,IACDA,EAAarM,EAAU,SAASwM,EAAc1C,CAAO,EACrDjN,EAAW,IAAIwP,CAAU,EAEjC,EAAG,UAAY,CACXE,EAAI,EACJ1P,EAAW,SAAQ,CACvB,EAAG,OAAW,UAAY,CACtB6J,EAAY2F,EAAa,IAC7B,CAAC,CAAC,CACN,CAAC,CACL,CCxCO,SAASK,GAAelK,EAAc,CACzC,OAAOjF,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIkO,EAAW,GACfhO,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnEgU,EAAW,GACXlO,EAAW,KAAK9F,CAAK,CACzB,EAAG,UAAY,CACNgU,GACDlO,EAAW,KAAK2F,CAAY,EAEhC3F,EAAW,SAAQ,CACvB,CAAC,CAAC,CACN,CAAC,CACL,CCZO,SAAS8P,GAAKC,EAAO,CACxB,OAAOA,GAAS,EAER,UAAY,CAAE,OAAOzK,EAAO,EAC9B5E,GAAQ,SAAUR,EAAQF,EAAY,CACpC,IAAI8J,EAAO,EACX5J,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CAC/D,EAAE4P,GAAQiG,IACV/P,EAAW,KAAK9F,CAAK,EACjB6V,GAASjG,GACT9J,EAAW,SAAQ,EAG/B,CAAC,CAAC,CACN,CAAC,CACT,CCfO,SAASgQ,EAAqBC,EAAYC,EAAa,CAC1D,OAAIA,IAAgB,SAAUA,EAAc5Q,IAC5C2Q,EAAaA,GAA4DE,GAClEzP,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIoQ,EACA/G,EAAQ,GACZnJ,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE,IAAImW,EAAaH,EAAYhW,CAAK,GAC9BmP,GAAS,CAAC4G,EAAWG,EAAaC,CAAU,KAC5ChH,EAAQ,GACR+G,EAAcC,EACdrQ,EAAW,KAAK9F,CAAK,EAE7B,CAAC,CAAC,CACN,CAAC,CACL,CACA,SAASiW,GAAexZ,EAAGM,EAAG,CAC1B,OAAON,IAAMM,CACjB,CClBO,SAASqZ,GAAa1H,EAAc,CACvC,OAAIA,IAAiB,SAAUA,EAAe2H,IACvC7P,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIkO,EAAW,GACfhO,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnEgU,EAAW,GACXlO,EAAW,KAAK9F,CAAK,CACzB,EAAG,UAAY,CAAE,OAAQgU,EAAWlO,EAAW,SAAQ,EAAKA,EAAW,MAAM4I,EAAY,CAAE,CAAI,CAAC,CAAC,CACrG,CAAC,CACL,CACA,SAAS2H,IAAsB,CAC3B,OAAO,IAAI1H,EACf,CCXO,SAAS2H,GAAWvG,EAASe,EAAgB,CAMhD,OAAOtK,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIvD,EAAQ,EACRiS,EAAW,KACXxC,EAAa,GACjBhM,EAAO,UAAUW,GAAyBb,EAAY,SAAUyQ,EAAY,CACnE/B,IACDA,EAAW7N,GAAyBb,EAAY,OAAW,UAAY,CACnE0O,EAAW,KACXxC,GAAclM,EAAW,SAAQ,CACrC,CAAC,EACD2G,GAAUsD,EAAQwG,EAAYhU,GAAO,CAAC,EAAE,UAAUiS,CAAQ,EAElE,EAAG,UAAY,CACXxC,EAAa,GACb,CAACwC,GAAY1O,EAAW,SAAQ,CACpC,CAAC,CAAC,CACN,CAAC,CACL,CCrBO,SAASqJ,GAAMuE,EAAWjI,EAAc,CAC3C,IAAI+K,EAAkB,UAAU,QAAU,EAC1C,OAAO,SAAUxQ,EAAQ,CACrB,OAAOA,EAAO,KAA+EZ,GAAUwQ,GAAK,CAAC,EAAGY,EAAkBb,GAAelK,CAAY,EAAI2K,GAAa,UAAY,CAAE,OAAO,IAAIzH,EAAc,CAAC,CAAC,CAC3N,CACJ,CCTO,SAAS8H,GAAK7B,EAAaC,EAAM,CACpC,OAAOrO,GAAQmO,GAAcC,EAAaC,EAAM,UAAU,QAAU,EAAG,EAAI,CAAC,CAChF,CCCO,SAAS6B,GAAMC,EAAS,CACvBA,IAAY,SAAUA,EAAU,CAAA,GACpC,IAAI3Z,EAAK2Z,EAAQ,UAAWC,EAAY5Z,IAAO,OAAS,UAAY,CAAE,OAAO,IAAIyK,EAAW,EAAIzK,EAAIC,EAAK0Z,EAAQ,aAAcE,EAAe5Z,IAAO,OAAS,GAAOA,EAAI2K,EAAK+O,EAAQ,gBAAiBG,EAAkBlP,IAAO,OAAS,GAAOA,EAAI2H,EAAKoH,EAAQ,oBAAqBI,EAAsBxH,IAAO,OAAS,GAAOA,EACnU,OAAO,SAAUyH,EAAe,CAC5B,IAAIC,EACAC,EACAxP,EACAyP,EAAW,EACXC,EAAe,GACfC,EAAa,GACbC,EAAc,UAAY,CAC1BJ,GAAoB,MAA8CA,EAAgB,YAAW,EAC7FA,EAAkB,MACtB,EACIK,EAAQ,UAAY,CACpBD,EAAW,EACXL,EAAavP,EAAU,OACvB0P,EAAeC,EAAa,EAChC,EACIG,EAAsB,UAAY,CAClC,IAAIC,EAAOR,EACXM,EAAK,EACLE,GAAS,MAAmCA,EAAK,YAAW,CAChE,EACA,OAAOjR,GAAQ,SAAUR,EAAQF,EAAY,CACzCqR,IACI,CAACE,GAAc,CAACD,GAChBE,EAAW,EAEf,IAAII,EAAQhQ,EAAUA,GAAmDkP,IACzE9Q,EAAW,IAAI,UAAY,CACvBqR,IACIA,IAAa,GAAK,CAACE,GAAc,CAACD,IAClCF,EAAkBS,GAAYH,EAAqBT,CAAmB,EAE9E,CAAC,EACDW,EAAK,UAAU5R,CAAU,EACrB,CAACmR,GACDE,EAAW,IACXF,EAAa,IAAIpS,GAAe,CAC5B,KAAM,SAAU7E,EAAO,CAAE,OAAO0X,EAAK,KAAK1X,CAAK,CAAG,EAClD,MAAO,SAAUmC,EAAK,CAClBkV,EAAa,GACbC,EAAW,EACXJ,EAAkBS,GAAYJ,EAAOV,EAAc1U,CAAG,EACtDuV,EAAK,MAAMvV,CAAG,CAClB,EACA,SAAU,UAAY,CAClBiV,EAAe,GACfE,EAAW,EACXJ,EAAkBS,GAAYJ,EAAOT,CAAe,EACpDY,EAAK,SAAQ,CACjB,CACpB,CAAiB,EACDjL,GAAUzG,CAAM,EAAE,UAAUiR,CAAU,EAE9C,CAAC,EAAED,CAAa,CACpB,CACJ,CACA,SAASW,GAAYJ,EAAOK,EAAI,CAE5B,QADI3T,EAAO,CAAA,EACFC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,EAAK,CAAC,EAAI,UAAUA,CAAE,EAE/B,GAAI0T,IAAO,GAAM,CACbL,EAAK,EACL,MACJ,CACA,GAAIK,IAAO,GAGX,KAAIC,EAAe,IAAIhT,GAAe,CAClC,KAAM,UAAY,CACdgT,EAAa,YAAW,EACxBN,EAAK,CACT,CACR,CAAK,EACD,OAAO9K,GAAUmL,EAAG,MAAM,OAAQ7W,GAAc,CAAA,EAAIH,GAAOqD,CAAI,CAAC,CAAC,CAAC,EAAE,UAAU4T,CAAY,EAC9F,CCjFO,SAASC,GAAYC,EAAoBC,EAAY/O,EAAW,CAEnE,IAAIgP,EACAd,EAAW,GAKX,OAAAc,EAA6EF,EAE1ErB,GAAM,CACT,UAAW,UAAY,CAAE,OAAO,IAAIpO,GAAc2P,EAAYD,EAAY/O,CAAS,CAAG,EACtF,aAAc,GACd,gBAAiB,GACjB,oBAAqBkO,CAC7B,CAAK,CACL,CCjBO,SAASe,GAAKrC,EAAO,CACxB,OAAOpC,EAAO,SAAUrW,EAAGmF,EAAO,CAAE,OAAOsT,GAAStT,CAAO,CAAC,CAChE,CCDO,SAAS4V,GAAUzE,EAAW,CACjC,OAAOlN,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIsS,EAAS,GACT7V,EAAQ,EACZyD,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CAAE,OAAQoY,IAAWA,EAAS,CAAC1E,EAAU1T,EAAOuC,GAAO,KAAOuD,EAAW,KAAK9F,CAAK,CAAG,CAAC,CAAC,CACnK,CAAC,CACL,CCLO,SAASqY,IAAY,CAExB,QADIzH,EAAS,CAAA,EACJ1M,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpC0M,EAAO1M,CAAE,EAAI,UAAUA,CAAE,EAE7B,IAAI+E,EAAYsC,GAAaqF,CAAM,EACnC,OAAOpK,GAAQ,SAAUR,EAAQF,EAAY,EACxCmD,EAAY0J,GAAO/B,EAAQ5K,EAAQiD,CAAS,EAAI0J,GAAO/B,EAAQ5K,CAAM,GAAG,UAAUF,CAAU,CACjG,CAAC,CACL,CCTO,SAASwS,GAAUvI,EAASe,EAAgB,CAC/C,OAAOtK,GAAQ,SAAUR,EAAQF,EAAY,CACzC,IAAIyS,EAAkB,KAClBhW,EAAQ,EACRyP,EAAa,GACbC,EAAgB,UAAY,CAAE,OAAOD,GAAc,CAACuG,GAAmBzS,EAAW,SAAQ,CAAI,EAClGE,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnEuY,GAAoB,MAA8CA,EAAgB,YAAW,EAC7F,IAAIC,EAAa,EACbC,EAAalW,IACjBkK,GAAUsD,EAAQ/P,EAAOyY,CAAU,CAAC,EAAE,UAAWF,EAAkB5R,GAAyBb,EAAY,SAAUuM,EAAY,CAAE,OAAOvM,EAAW,KAAKgL,EAAiBA,EAAe9Q,EAAOqS,EAAYoG,EAAYD,GAAY,EAAInG,CAAU,CAAG,EAAG,UAAY,CAC9PkG,EAAkB,KAClBtG,EAAa,CACjB,CAAC,CAAC,CACN,EAAG,UAAY,CACXD,EAAa,GACbC,EAAa,CACjB,CAAC,CAAC,CACN,CAAC,CACL,CClBO,SAASyG,EAAUC,EAAU,CAChC,OAAOnS,GAAQ,SAAUR,EAAQF,EAAY,CACzC2G,GAAUkM,CAAQ,EAAE,UAAUhS,GAAyBb,EAAY,UAAY,CAAE,OAAOA,EAAW,SAAQ,CAAI,EAAGzB,EAAI,CAAC,EACvH,CAACyB,EAAW,QAAUE,EAAO,UAAUF,CAAU,CACrD,CAAC,CACL,CCLO,SAAS8S,GAAI3T,EAAgBnE,EAAO8D,EAAU,CACjD,IAAIiU,EAAclX,GAAWsD,CAAc,GAAKnE,GAAS8D,EAEjD,CAAE,KAAMK,EAAgB,MAAOnE,EAAO,SAAU8D,CAAQ,EAC1DK,EACN,OAAO4T,EACDrS,GAAQ,SAAUR,EAAQF,EAAY,CACpC,IAAI9I,GACHA,EAAK6b,EAAY,aAAe,MAAQ7b,IAAO,QAAkBA,EAAG,KAAK6b,CAAW,EACrF,IAAIC,EAAU,GACd9S,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE,IAAIhD,GACHA,EAAK6b,EAAY,QAAU,MAAQ7b,IAAO,QAAkBA,EAAG,KAAK6b,EAAa7Y,CAAK,EACvF8F,EAAW,KAAK9F,CAAK,CACzB,EAAG,UAAY,CACX,IAAIhD,EACJ8b,EAAU,IACT9b,EAAK6b,EAAY,YAAc,MAAQ7b,IAAO,QAAkBA,EAAG,KAAK6b,CAAW,EACpF/S,EAAW,SAAQ,CACvB,EAAG,SAAU3D,EAAK,CACd,IAAInF,EACJ8b,EAAU,IACT9b,EAAK6b,EAAY,SAAW,MAAQ7b,IAAO,QAAkBA,EAAG,KAAK6b,EAAa1W,CAAG,EACtF2D,EAAW,MAAM3D,CAAG,CACxB,EAAG,UAAY,CACX,IAAInF,EAAIC,EACJ6b,KACC9b,EAAK6b,EAAY,eAAiB,MAAQ7b,IAAO,QAAkBA,EAAG,KAAK6b,CAAW,IAE1F5b,EAAK4b,EAAY,YAAc,MAAQ5b,IAAO,QAAkBA,EAAG,KAAK4b,CAAW,CACxF,CAAC,CAAC,CACN,CAAC,EAEGzT,EACZ,CC/BO,SAAS2T,IAAiB,CAE7B,QADIC,EAAS,CAAA,EACJ9U,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpC8U,EAAO9U,CAAE,EAAI,UAAUA,CAAE,EAE7B,IAAI6L,EAAUzE,GAAkB0N,CAAM,EACtC,OAAOxS,GAAQ,SAAUR,EAAQF,EAAY,CAczC,QAbImT,EAAMD,EAAO,OACbE,EAAc,IAAI,MAAMD,CAAG,EAC3BjF,EAAWgF,EAAO,IAAI,UAAY,CAAE,MAAO,EAAO,CAAC,EACnDG,EAAQ,GACR7H,EAAU,SAAUjV,EAAG,CACvBoQ,GAAUuM,EAAO3c,CAAC,CAAC,EAAE,UAAUsK,GAAyBb,EAAY,SAAU9F,EAAO,CACjFkZ,EAAY7c,CAAC,EAAI2D,EACb,CAACmZ,GAAS,CAACnF,EAAS3X,CAAC,IACrB2X,EAAS3X,CAAC,EAAI,IACb8c,EAAQnF,EAAS,MAAM5O,EAAQ,KAAO4O,EAAW,MAE1D,EAAG3P,EAAI,CAAC,CACZ,EACShI,EAAI,EAAGA,EAAI4c,EAAK5c,IACrBiV,EAAQjV,CAAC,EAEb2J,EAAO,UAAUW,GAAyBb,EAAY,SAAU9F,EAAO,CACnE,GAAImZ,EAAO,CACP,IAAIvI,EAAS7P,GAAc,CAACf,CAAK,EAAGY,GAAOsY,CAAW,CAAC,EACvDpT,EAAW,KAAKiK,EAAUA,EAAQ,MAAM,OAAQhP,GAAc,CAAA,EAAIH,GAAOgQ,CAAM,CAAC,CAAC,EAAIA,CAAM,CAC/F,CACJ,CAAC,CAAC,CACN,CAAC,CACL,0SC/BC,SAAUwI,EAAMC,EAAY,CAIgBC,EAAO,QAC5CA,EAAA,QAAiBD,EAAU,EAE3BD,EAAK,IAAMC,EAAU,CAE7B,GAAEE,GAAM,UAAY,CAIhB,IAAIlV,EAAO,UAAW,CAAA,EAClBmV,EAAgB,YAChBC,EAAQ,OAAO,SAAWD,GAAmB,OAAO,OAAO,YAAcA,GACzE,kBAAkB,KAAK,OAAO,UAAU,SAAS,EAGjDE,EAAa,CACb,QACA,QACA,OACA,OACA,SAGAC,EAAiB,CAAA,EACjBC,EAAgB,KAGpB,SAASC,EAAW/N,EAAKgO,EAAY,CACjC,IAAIC,EAASjO,EAAIgO,CAAU,EAC3B,GAAI,OAAOC,EAAO,MAAS,WACvB,OAAOA,EAAO,KAAKjO,CAAG,EAEtB,GAAI,CACA,OAAO,SAAS,UAAU,KAAK,KAAKiO,EAAQjO,CAAG,CAC/D,MAAwB,CAER,OAAO,UAAW,CACd,OAAO,SAAS,UAAU,MAAM,MAAMiO,EAAQ,CAACjO,EAAK,SAAS,CAAC,CAClF,CACA,CAEA,CAGI,SAASkO,GAAa,CACd,QAAQ,MACJ,QAAQ,IAAI,MACZ,QAAQ,IAAI,MAAM,QAAS,SAAS,EAGpC,SAAS,UAAU,MAAM,MAAM,QAAQ,IAAK,CAAC,QAAS,SAAS,CAAC,GAGpE,QAAQ,OAAO,QAAQ,MAAK,CACxC,CAII,SAASC,EAAWH,EAAY,CAK5B,OAJIA,IAAe,UACfA,EAAa,OAGb,OAAO,UAAYN,EACZ,GACAM,IAAe,SAAWL,EAC1BO,EACA,QAAQF,CAAU,IAAM,OACxBD,EAAW,QAASC,CAAU,EAC9B,QAAQ,MAAQ,OAChBD,EAAW,QAAS,KAAK,EAEzBxV,CAEnB,CAII,SAAS6V,GAAwB,CAK7B,QAHIC,EAAQ,KAAK,SAAQ,EAGhB9d,EAAI,EAAGA,EAAIqd,EAAW,OAAQrd,IAAK,CACxC,IAAIyd,EAAaJ,EAAWrd,CAAC,EAC7B,KAAKyd,CAAU,EAAKzd,EAAI8d,EACpB9V,EACA,KAAK,cAAcyV,EAAYK,EAAO,KAAK,IAAI,CAC/D,CAMQ,GAHA,KAAK,IAAM,KAAK,MAGZ,OAAO,UAAYX,GAAiBW,EAAQ,KAAK,OAAO,OACxD,MAAO,kCAEnB,CAII,SAASC,EAAgCN,EAAY,CACjD,OAAO,UAAY,CACX,OAAO,UAAYN,IACnBU,EAAsB,KAAK,IAAI,EAC/B,KAAKJ,CAAU,EAAE,MAAM,KAAM,SAAS,EAEtD,CACA,CAII,SAASO,EAAqBP,EAAYQ,EAAQC,EAAa,CAE3D,OAAON,EAAWH,CAAU,GACrBM,EAAgC,MAAM,KAAM,SAAS,CACpE,CAEI,SAASI,EAAOC,EAAMC,EAAS,CAE7B,IAAIC,EAAO,KASPC,EAMAC,EAMAC,EAEAC,EAAa,WACb,OAAON,GAAS,SAClBM,GAAc,IAAMN,EACX,OAAOA,GAAS,WACzBM,EAAa,QAGf,SAASC,EAAuBC,EAAU,CACtC,IAAIC,GAAaxB,EAAWuB,CAAQ,GAAK,UAAU,YAAW,EAE9D,GAAI,SAAO,SAAWzB,GAAiB,CAACuB,GAGxC,IAAI,CACA,OAAO,aAAaA,CAAU,EAAIG,EAClC,MACd,MAA2B,CAAA,CAGjB,GAAI,CACA,OAAO,SAAS,OACd,mBAAmBH,CAAU,EAAI,IAAMG,EAAY,GACnE,MAA2B,CAAA,EAC3B,CAEM,SAASC,GAAoB,CACzB,IAAIC,EAEJ,GAAI,SAAO,SAAW5B,GAAiB,CAACuB,GAExC,IAAI,CACAK,EAAc,OAAO,aAAaL,CAAU,CAC1D,MAA2B,CAAA,CAGjB,GAAI,OAAOK,IAAgB5B,EACvB,GAAI,CACA,IAAI6B,EAAS,OAAO,SAAS,OACzBC,GAAa,mBAAmBP,CAAU,EAC1CQ,GAAWF,EAAO,QAAQC,GAAa,GAAG,EAC1CC,KAAa,KACbH,EAAc,WAAW,KACrBC,EAAO,MAAME,GAAWD,GAAW,OAAS,CAAC,GAC/C,CAAC,EAEzB,MAA+B,CAAA,CAIrB,OAAIX,EAAK,OAAOS,CAAW,IAAM,SAC7BA,EAAc,QAGXA,EACjB,CAEM,SAASI,GAAsB,CAC3B,GAAI,SAAO,SAAWhC,GAAiB,CAACuB,GAGxC,IAAI,CACA,OAAO,aAAa,WAAWA,CAAU,CACvD,MAA2B,CAAA,CAGjB,GAAI,CACA,OAAO,SAAS,OACd,mBAAmBA,CAAU,EAAI,0CACjD,MAA2B,CAAA,EAC3B,CAEM,SAASU,EAAejW,EAAO,CAC3B,IAAI2U,EAAQ3U,EAIZ,GAHI,OAAO2U,GAAU,UAAYQ,EAAK,OAAOR,EAAM,aAAa,IAAM,SAClEA,EAAQQ,EAAK,OAAOR,EAAM,YAAW,CAAE,GAEvC,OAAOA,GAAU,UAAYA,GAAS,GAAKA,GAASQ,EAAK,OAAO,OAChE,OAAOR,EAEP,MAAM,IAAI,UAAU,6CAA+C3U,CAAK,CAEtF,CAQMmV,EAAK,KAAOF,EAEZE,EAAK,OAAS,CAAE,MAAS,EAAG,MAAS,EAAG,KAAQ,EAAG,KAAQ,EACvD,MAAS,EAAG,OAAU,CAAC,EAE3BA,EAAK,cAAgBD,GAAWL,EAEhCM,EAAK,SAAW,UAAY,CACxB,OAAIG,GAEOD,GAGFD,CAEnB,EAEMD,EAAK,SAAW,SAAUR,EAAOuB,EAAS,CACtC,OAAAZ,EAAYW,EAAetB,CAAK,EAC5BuB,IAAY,IACZV,EAAuBF,CAAS,EAI7BZ,EAAsB,KAAKS,CAAI,CAChD,EAEMA,EAAK,gBAAkB,SAAUR,EAAO,CACpCU,EAAeY,EAAetB,CAAK,EAC9BgB,EAAiB,GAClBR,EAAK,SAASR,EAAO,EAAK,CAExC,EAEMQ,EAAK,WAAa,UAAY,CAC1BG,EAAY,KACZU,EAAmB,EACnBtB,EAAsB,KAAKS,CAAI,CACzC,EAEMA,EAAK,UAAY,SAASe,EAAS,CAC/Bf,EAAK,SAASA,EAAK,OAAO,MAAOe,CAAO,CAClD,EAEMf,EAAK,WAAa,SAASe,EAAS,CAChCf,EAAK,SAASA,EAAK,OAAO,OAAQe,CAAO,CACnD,EAEMf,EAAK,QAAU,UAAY,CAMvB,GALIf,IAAkBe,IAClBC,EAAiBa,EAAe7B,EAAc,UAAU,GAE5DM,EAAsB,KAAKS,CAAI,EAE3Bf,IAAkBe,EAClB,QAASgB,KAAahC,EACpBA,EAAegC,CAAS,EAAE,QAAO,CAGjD,EAGMf,EAAiBa,EACb7B,EAAgBA,EAAc,WAAa,QAE/C,IAAIgC,GAAeT,EAAiB,EAChCS,IAAgB,OAChBd,EAAYW,EAAeG,EAAY,GAE3C1B,EAAsB,KAAKS,CAAI,CACrC,CAQIf,EAAgB,IAAIY,EAEpBZ,EAAc,UAAY,SAAmBa,EAAM,CAC/C,GAAK,OAAOA,GAAS,UAAY,OAAOA,GAAS,UAAaA,IAAS,GACnE,MAAM,IAAI,UAAU,gDAAgD,EAGxE,IAAIoB,EAASlC,EAAec,CAAI,EAChC,OAAKoB,IACDA,EAASlC,EAAec,CAAI,EAAI,IAAID,EAChCC,EACAb,EAAc,gBAGfiC,CACf,EAGI,IAAIC,EAAQ,OAAO,SAAWtC,EAAiB,OAAO,IAAM,OAC5D,OAAAI,EAAc,WAAa,UAAW,CAClC,OAAI,OAAO,SAAWJ,GACf,OAAO,MAAQI,IAClB,OAAO,IAAMkC,GAGVlC,CACf,EAEIA,EAAc,WAAa,UAAsB,CAC7C,OAAOD,CACf,EAGIC,EAAc,QAAaA,EAEpBA,CACX,CAAC,gDC/VKmC,GAAiB,IACjBC,GAAmC,IACnCC,GAAmC,IACnCC,GAAqC,IAAM,IAC3CC,GAAgC,IAChCC,GAAiC,IACjCC,GAAiC,IACjCC,GAAkC,KAClCC,GAAqC,EACrCC,GAA0B,iBAE1BC,GAAoB,cAEpBC,GAAwB,uCACxBC,GAA0B,yCAE1BC,GAAiC,IAEjCC,GAAiC,IAEjCC,GAAmC,EAEnCC,GAAqC,IAErCC,GAAiC,EAEjCC,GAAmC,IAEnCC,GAAkC,IAElCC,GAA+B,IAO/BC,GAAiC,IAEjCC,GAAwC,OAExCC,GAA2B,OAE3BC,GAAkC,OAElCC,GAA4B,CACjC,kBACA,gBACA,uBACD,EAEMC,GAAoC,IAEpCC,GAAiC,GAEjCC,GAAuC,IAEvCC,GAAqC,EAErCC,GAAsC,IAEtCC,GAAwC,EAExCC,GAA6B,GAE7BC,GAA6B,EAE7BC,GAAmC,IAEnCC,GAA+B,IAE/BC,GAAoC,IAEpCC,GAAgC,EAEhCC,GAA8B,IAE9BC,GAAoC,IAEpCC,GAA+B,IAE/BC,GAA2C,IAE3CC,GAAiC,IAEjCC,GAAgC,EAEhCC,GAAoC,IAEpCC,GAAmC,IAEnCC,GAAmC,IAEnCC,GAA+B,GAE/BC,GAAgB,IAEhBC,GAAc,IAEdC,GAAmC,GAEnCC,GAAuC,GAEvCC,GAAiC,uBACjCC,GAAkC,wBAClCC,GAAiC,uBAEjCC,GAAoC,GAEpCC,GAAqC,GAErCC,GAAsC,GAEtCC,GAAkC,GAElCC,GAA6C,IAE7CC,GAA8C,IAE9CC,GAAgC,GAEhCC,GAA0C,GAE1CC,GAA4C,GAQ5CC,GAAuB,GAEvBC,GAAqC,KAI3C,IAAIC,GAAkB,cAAc,KAAM,CACzC,YAAYC,EAAIvJ,EAAS,CACxB,MAAM,mBAAmBuJ,EAAK,OAAOA,CAAE,GAAK,EAAE,GAAIvJ,CAAO,EACzD,KAAK,GAAKuJ,EACV,KAAK,KAAO,iBACb,CACD,EACIC,GAAqB,cAAc,KAAM,CAC5C,YAAYC,EAAS,kBAAmBzJ,EAAS,CAChD,MAAMyJ,EAAQzJ,CAAO,EACrB,KAAK,OAASyJ,EACd,KAAK,KAAO,oBACb,CACD,EACIC,GAA0B,cAAc,KAAM,CACjD,YAAYD,EAAS,sBAAuBzJ,EAAS,CACpD,MAAMyJ,EAAQzJ,CAAO,EACrB,KAAK,OAASyJ,EACd,KAAK,KAAO,yBACb,CACD,EACIE,GAA2B,cAAc,KAAM,CAClD,YAAYC,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,0BACb,CACD,EACI6J,GAA2B,cAAc,KAAM,CAClD,YAAYD,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,0BACb,CACD,EACI8J,GAAwB,cAAc,KAAM,CAC/C,YAAYF,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,uBACb,CACD,EACI+J,GAAsB,cAAc,KAAM,CAC7C,YAAYH,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,qBACb,CACD,EACIgK,GAAe,cAAc,KAAM,CACtC,YAAYJ,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,cACb,CACD,EACIiK,GAAkB,cAAc,KAAM,CACzC,YAAYC,EAAWC,EAAWnK,EAAS,CAC1C,MAAM,eAAekK,CAAS,oBAAoBC,CAAS,KAAMnK,CAAO,EACxE,KAAK,UAAYkK,EACjB,KAAK,UAAYC,EACjB,KAAK,KAAO,iBACb,CACD,EACIC,GAAwB,cAAc,KAAM,CAC/C,YAAYjgB,EAAQ,KAAM6V,EAAS,CAClC,MAAM,4CAA6C,CAClD,GAAGA,EACH,OAAOA,GAAA,YAAAA,EAAS,SAAU7V,aAAiB,MAAQA,EAAQ,OAC9D,CAAG,EACD,KAAK,MAAQA,EACb,KAAK,KAAO,uBACb,CACD,EACIkgB,GAA2B,cAAc,KAAM,CAClD,YAAYC,EAAc,eAAgBtK,EAAS,CAClD,MAAM,GAAGsK,CAAW,wCAAyCtK,CAAO,EACpE,KAAK,YAAcsK,EACnB,KAAK,KAAO,0BACb,CACD,EACIC,GAAqB,cAAc,KAAM,CAC5C,YAAYxQ,EAAKyQ,EAAe,CAC/B,MAAM,sCAAsCzQ,CAAG,MAAMyQ,EAAc,OAAO,GAAI,CAAE,MAAOA,EAAe,EACtG,KAAK,IAAMzQ,EACX,KAAK,cAAgByQ,EACrB,KAAK,KAAO,oBACb,CACD,EACIC,GAAuB,cAAc,KAAM,CAC9C,YAAY1Q,EAAKyQ,EAAe,CAC/B,MAAM,wCAAwCzQ,CAAG,MAAMyQ,EAAc,OAAO,GAAI,CAAE,MAAOA,EAAe,EACxG,KAAK,IAAMzQ,EACX,KAAK,cAAgByQ,EACrB,KAAK,KAAO,sBACb,CACD,EACIE,GAAoB,cAAc,KAAM,CAC3C,YAAY3Q,EAAKyQ,EAAe,CAC/B,MAAM,uCAAuCzQ,CAAG,MAAMyQ,EAAc,OAAO,GAAI,CAAE,MAAOA,EAAe,EACvG,KAAK,IAAMzQ,EACX,KAAK,cAAgByQ,EACrB,KAAK,KAAO,mBACb,CACD,EACIG,GAAmB,cAAc,KAAM,CAC1C,YAAY5Q,EAAKyQ,EAAe,CAC/B,MAAM,gCAAgCzQ,CAAG,MAAMyQ,EAAc,OAAO,GAAI,CAAE,MAAOA,EAAe,EAChG,KAAK,IAAMzQ,EACX,KAAK,cAAgByQ,EACrB,KAAK,KAAO,kBACb,CACD,EACII,GAAkB,cAAc,KAAM,CACzC,YAAYC,EAAa7K,EAAS,CACjC,MAAM,cAAc6K,CAAW,4BAA6B7K,CAAO,EACnE,KAAK,YAAc6K,EACnB,KAAK,KAAO,iBACb,CACD,EACIC,GAAkB,cAAc,KAAM,CACzC,YAAYlB,EAASzf,EAAQ,KAAM4gB,EAAY,WAAY/K,EAAS,CACnE,MAAM4J,EAAS,CACd,GAAG5J,EACH,OAAOA,GAAA,YAAAA,EAAS,SAAU7V,aAAiB,MAAQA,EAAQ,OAC9D,CAAG,EACD,KAAK,QAAUyf,EACf,KAAK,MAAQzf,EACb,KAAK,UAAY4gB,EACjB,KAAK,KAAO,iBACb,CACD,EACIC,GAAe,cAAc,KAAM,CACtC,YAAYC,EAAMrB,EAASsB,EAAMlL,EAASkK,EAAW,CACpD,MAAMN,EAAS5J,CAAO,EACtB,KAAK,KAAOiL,EACZ,KAAK,KAAOC,EACZ,KAAK,UAAYhB,EACjB,KAAK,KAAO,cACb,CACD,EACIiB,GAAgB,cAAc,KAAM,CACvC,YAAYvB,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,QAAU4J,EACf,KAAK,KAAO,eACb,CACD,EACIwB,GAAoB,cAAc,KAAM,CAC3C,YAAYxB,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,QAAU4J,EACf,KAAK,KAAO,mBACb,CACD,EACIyB,GAA0B,cAAc,KAAM,CACjD,YAAYlhB,EAAQ,KAAM6V,EAAS,CAClC,MAAM,8BAA+B,CACpC,GAAGA,EACH,OAAOA,GAAA,YAAAA,EAAS,SAAU7V,aAAiB,MAAQA,EAAQ,OAC9D,CAAG,EACD,KAAK,MAAQA,EACb,KAAK,KAAO,yBACb,CACD,EACImhB,GAA0B,cAAc,KAAM,CACjD,YAAYnhB,EAAQ,KAAM6V,EAAS,CAClC,MAAM,8BAA+B,CACpC,GAAGA,EACH,OAAOA,GAAA,YAAAA,EAAS,SAAU7V,aAAiB,MAAQA,EAAQ,OAC9D,CAAG,EACD,KAAK,MAAQA,EACb,KAAK,KAAO,yBACb,CACD,EACIohB,GAAkB,cAAc,KAAM,CACzC,YAAY3B,EAAS5J,EAAS,CAC7B,MAAM4J,EAAS5J,CAAO,EACtB,KAAK,KAAO,iBACb,CACD,EACIwL,GAAiB,cAAc,KAAM,CACxC,YAAYhB,EAAe,CAC1B,MAAM,kDAAmD,CAAE,MAAOA,aAAyB,MAAQA,EAAgB,OAAQ,EAC3H,KAAK,cAAgBA,EACrB,KAAK,KAAO,gBACb,CACD,EACIiB,GAAoB,cAAc,KAAM,CAC3C,YAAYjB,EAAe,CAC1B,MAAM,6CAA8C,CAAE,MAAOA,aAAyB,MAAQA,EAAgB,OAAQ,EACtH,KAAK,cAAgBA,EACrB,KAAK,KAAO,mBACb,CACD,EACIkB,GAAuB,cAAc,KAAM,CAC9C,YAAYC,EAAWnB,EAAe,CACrC,MAAM,kCAAkCmB,CAAS,GAAI,CAAE,MAAOnB,aAAyB,MAAQA,EAAgB,OAAQ,EACvH,KAAK,UAAYmB,EACjB,KAAK,cAAgBnB,EACrB,KAAK,KAAO,sBACb,CACD,EACIoB,GAAkB,cAAc,KAAM,CACzC,YAAYD,EAAWE,EAAMrB,EAAe,CAC3C,MAAM,eAAemB,CAAS,eAAeE,CAAI,GAAI,CAAE,MAAOrB,aAAyB,MAAQA,EAAgB,MAAM,CAAE,EACvH,KAAK,UAAYmB,EACjB,KAAK,KAAOE,EACZ,KAAK,cAAgBrB,EACrB,KAAK,KAAO,iBACb,CACD,EAEA,SAASsB,GAAoBtB,EAAe,CAC3C,OAAOA,aAAyB,OAAS3D,GAA0B,SAAS2D,EAAc,IAAI,CAC/F,CAUA,IAAIuB,GAAmB,cAAc,KAAM,CAC1C,YAAYJ,EAAWK,EAAOxB,EAAeyB,EAAQ,GAAO,CAC3D,MAAM,gBAAgBH,GAAoBtB,CAAa,EAAI,SAAW,QAAQ,QAAQmB,CAAS,KAAKK,CAAK,IAAK,CAAE,MAAOxB,aAAyB,MAAQA,EAAgB,OAAQ,EAChL,KAAK,UAAYmB,EACjB,KAAK,MAAQK,EACb,KAAK,cAAgBxB,EACrB,KAAK,MAAQyB,EACb,KAAK,KAAO,kBACb,CAEA,IAAI,QAAS,CACZ,OAAOH,GAAoB,KAAK,aAAa,CAC9C,CACD,EACII,GAAgB,cAAc,KAAM,CACvC,YAAY1B,EAAeZ,EAAU,qCAAsC,CAC1E,MAAMA,EAAS,CAAE,MAAOY,aAAyB,MAAQA,EAAgB,OAAQ,EACjF,KAAK,cAAgBA,EACrB,KAAK,KAAO,eACb,CACD,EA8BI2B,GAAiB,cAAc,KAAM,CACxC,YAAYC,EAAO5B,EAAe,CACjC,MAAM,gCAAgC4B,CAAK,GAAI,CAAE,MAAO5B,aAAyB,MAAQA,EAAgB,OAAQ,EACjH,KAAK,MAAQ4B,EACb,KAAK,cAAgB5B,EACrB,KAAK,KAAO,gBACb,CACD,EACI6B,GAAmB,cAAc,KAAM,CAC1C,YAAYzC,EAASY,EAAe,CACnC,MAAMZ,EAAS,CAAE,MAAOY,aAAyB,MAAQA,EAAgB,OAAQ,EACjF,KAAK,cAAgBA,EACrB,KAAK,KAAO,kBACb,CACD,EACI8B,GAAoB,cAAc,KAAM,CAC3C,YAAY1C,EAASY,EAAe,CACnC,MAAMZ,EAAS,CAAE,MAAOY,aAAyB,MAAQA,EAAgB,OAAQ,EACjF,KAAK,cAAgBA,EACrB,KAAK,KAAO,mBACb,CACD,EAIA,MAAM+B,GAAW,IAAuB,IAAI,KAAI,EAAI,YAAW,EACzDtJ,GAAgBuJ,GAAI,UAAU,YAAY,EAC1CC,GAAkBxJ,GAAc,cACtCA,GAAc,cAAgB,CAACE,EAAYuJ,EAAUC,IAAe,CACnE,MAAMC,EAAYH,GAAgBtJ,EAAYuJ,EAAUC,CAAU,EAClE,OAAO,YAAYrf,EAAM,CACxB,MAAMuf,EAAW,CAChBN,GAAQ,EACR,IACA,GAAGjf,CACN,EACEsf,EAAU,MAAM,OAAQC,CAAQ,CACjC,CACD,EACA,MAAMC,GAAqB7J,GAAc,OAAO,KAChDA,GAAc,SAAS6J,EAAkB,EACzC,IAAIC,GAAa,KAEjB,MAAMC,GAAaC,GAAa,CAC/BF,GAAaE,CACd,EACA,IAAIC,GAAe,CAAA,EAEnB,MAAMC,GAAmBnN,GAAY,CACpC,GAAIA,GAAW,KAAM,CACpBkN,GAAe,CAAA,EACf,MACD,CACAA,GAAe,CACd,GAAGA,GACH,GAAGlN,CACL,CACA,EAKMoN,GAAe5J,GAAU,CAC9BP,GAAc,SAASO,CAAK,CAC7B,EACM6J,GAAoB,IAClBN,IAAc9J,GAEhBqK,GAAmBC,GACpBA,GAAW,MAAQ,OAAOA,GAAY,UAAY,WAAYA,EAAgBA,EAAQ,SAAW,kBAC9F,GAEFC,GAAaxN,GAAY,CAC9B,KAAM,CAAE,aAAAyN,CAAY,EAAKP,GACzB,GAAI,CAACO,EAAc,OACnB,MAAMC,EAAiBL,GAAiB,EACxC,IAAIE,EACJ,GAAI,QAASvN,EAAS,GAAI,CACzBuN,EAAU,KAAK,MAAMvN,EAAQ,GAAG,CACjC,MAAQ,CACP0N,EAAe,MAAM,eAAe1N,EAAQ,KAAK,YAAW,CAAE,oBAAoB,EAClF,MACD,MACM,CAAC,QAAAuN,CAAO,EAAIvN,GAClB,MAAM2N,EAAML,GAAgBC,CAAO,EAAI,KAAK,UAAUA,EAAS,KAAM,CAAC,EAAIA,EAC1EG,EAAe,MAAM,GAAG1N,EAAQ,KAAK,YAAW,CAAE;AAAA,EAAQ2N,EAAK;AAAA,CAAI,CACpE,EACMC,EAAY,IAAM,CACvB,MAAMX,EAAWI,GAAiB,EAClC,OAAO,IAAI,MAAMJ,EAAU,CAAE,IAAIY,EAASC,EAAMC,EAAW,CAC1D,GAAID,IAAS,YAAa,OAAON,GACjC,MAAMpiB,EAAWiiB,GAAiB,EAC5BhkB,EAAQ,QAAQ,IAAI+B,EAAU0iB,CAAI,EACxC,OAAI,OAAOzkB,GAAU,WAAmBA,EAAM,KAAK+B,CAAQ,EACpD/B,CACR,EAAG,CACJ,EAcA,SAAS2kB,IAAa,CACrB,OAAOlR,EAAQzT,GAAUA,GAAS,IAAI,CACvC,CAIA,MAAM4kB,GAAe,CAAC9Y,EAAK+Y,EAAMpZ,IAAiB,CACjD,MAAMgF,EAAOoU,EAAK,MAAM,GAAG,EAC3B,IAAIvkB,EAASwL,EACb,UAAW4E,KAAOD,EAAM,GAAInQ,GAAU,OAAOA,GAAW,UAAYoQ,KAAOpQ,EAAQA,EAASA,EAAOoQ,CAAG,MACjG,QAAOjF,EACZ,OAAOnL,IAAW,OAASmL,EAAenL,CAC3C,EAmCA,SAASwkB,GAAQpR,EAAWqR,EAAO,CAClC,OAAO1f,GAAK2f,EAAStR,CAAS,EAAGuR,EAAMF,CAAK,CAAC,CAC9C,CAwCA,SAASG,GAASxR,EAAWyR,EAAY,CACxC,OAAO9f,GAAKyf,GAAQpR,EAAY0R,GACxBR,GAAaQ,EAAOD,CAAU,CACrC,EAAGH,EAAUhlB,GAAUA,IAAU,MAAM,CAAC,CAC1C,CAIA,MAAM6b,GAAS0I,EAAS,EAKxB,SAASc,IAAkB,CAC1B,OAAOvV,EAAKwV,GAAa,CACxB,GAAIA,EAAS,MACZzJ,MAAAA,GAAO,MAAM,wCAAyC,CACrD,KAAMyJ,EAAS,MAAM,KACrB,QAASA,EAAS,MAAM,QACxB,KAAMA,EAAS,MAAM,IACzB,CAAI,EACK,IAAI3D,GAAa2D,EAAS,MAAM,KAAMA,EAAS,MAAM,QAASA,EAAS,MAAM,IAAI,EAExFzJ,OAAAA,GAAO,MAAM,6CAA8CyJ,CAAQ,EAC5DA,CACR,CAAC,CACF,CC7nBO,MAAMC,WAA0B,KAAM,CAC7C,CACAA,GAAkB,UAAU,KAAO,oBACnC,SAASC,GAAiBC,EAAK,CAC3B,OAAO,mBAAmB,KAAKA,CAAG,EAAE,QAAQ,OAAQ,CAACpoB,EAAGV,IAAM,CAC1D,IAAIilB,EAAOjlB,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAW,EACnD,OAAIilB,EAAK,OAAS,IACdA,EAAO,IAAMA,GAEV,IAAMA,CACjB,CAAC,CAAC,CACN,CACA,SAAS8D,GAAgBD,EAAK,CAC1B,IAAIE,EAASF,EAAI,QAAQ,KAAM,GAAG,EAAE,QAAQ,KAAM,GAAG,EACrD,OAAQE,EAAO,OAAS,EAAC,CACrB,IAAK,GACD,MACJ,IAAK,GACDA,GAAU,KACV,MACJ,IAAK,GACDA,GAAU,IACV,MACJ,QACI,MAAM,IAAI,MAAM,4CAA4C,CACxE,CACI,GAAI,CACA,OAAOH,GAAiBG,CAAM,CAClC,MACY,CACR,OAAO,KAAKA,CAAM,CACtB,CACJ,CACO,SAASC,GAAUC,EAAOlP,EAAS,CACtC,GAAI,OAAOkP,GAAU,SACjB,MAAM,IAAIN,GAAkB,2CAA2C,EAE3E5O,IAAYA,EAAU,IACtB,MAAMmP,EAAMnP,EAAQ,SAAW,GAAO,EAAI,EACpCoP,EAAOF,EAAM,MAAM,GAAG,EAAEC,CAAG,EACjC,GAAI,OAAOC,GAAS,SAChB,MAAM,IAAIR,GAAkB,0CAA0CO,EAAM,CAAC,EAAE,EAEnF,IAAIE,EACJ,GAAI,CACAA,EAAUN,GAAgBK,CAAI,CAClC,OACOhqB,EAAG,CACN,MAAM,IAAIwpB,GAAkB,qDAAqDO,EAAM,CAAC,KAAK/pB,EAAE,OAAO,GAAG,CAC7G,CACA,GAAI,CACA,OAAO,KAAK,MAAMiqB,CAAO,CAC7B,OACOjqB,EAAG,CACN,MAAM,IAAIwpB,GAAkB,mDAAmDO,EAAM,CAAC,KAAK/pB,EAAE,OAAO,GAAG,CAC3G,CACJ,CCvDA,MAAMkqB,GAAY,CAAA,EAClB,QAAS5pB,EAAI,EAAGA,EAAI,IAAK,EAAEA,EACvB4pB,GAAU,MAAM5pB,EAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAE7C,SAAS6pB,GAAgB7jB,EAAK8jB,EAAS,EAAG,CAC7C,OAAQF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EAC7BF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzBF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzBF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzB,IACAF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzBF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzB,IACAF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzBF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzB,IACAF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzBF,GAAU5jB,EAAI8jB,EAAS,CAAC,CAAC,EACzB,IACAF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,EAC1BF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,EAC1BF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,EAC1BF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,EAC1BF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,EAC1BF,GAAU5jB,EAAI8jB,EAAS,EAAE,CAAC,GAAG,YAAW,CAChD,CC1BA,MAAMC,GAAQ,IAAI,WAAW,EAAE,EAChB,SAASC,IAAM,CAC1B,OAAO,OAAO,gBAAgBD,EAAK,CACvC,CCDA,SAASE,GAAG3P,EAAS4P,EAAKJ,EAAQ,CAC9B,OAAwB,OAAO,WACpB,OAAO,WAAU,EAErBK,GAAI7P,CAAoB,CACnC,CACA,SAAS6P,GAAI7P,EAAS4P,EAAKJ,EAAQ,OAC/BxP,EAAUA,GAAW,CAAA,EACrB,MAAM8P,EAAO9P,EAAQ,UAAU3Z,EAAA2Z,EAAQ,MAAR,YAAA3Z,EAAA,KAAA2Z,KAAmB0P,GAAG,EACrD,GAAII,EAAK,OAAS,GACd,MAAM,IAAI,MAAM,mCAAmC,EAEvD,OAAAA,EAAK,CAAC,EAAKA,EAAK,CAAC,EAAI,GAAQ,GAC7BA,EAAK,CAAC,EAAKA,EAAK,CAAC,EAAI,GAAQ,IAWtBP,GAAgBO,CAAI,CAC/B,CCpBA,IAAIC,GAAc,KAAM,CACvB,aAAc,CACb,KAAK,cAAgB,CAAA,EACrB,KAAK,SAAW,CAAA,EAChB,KAAK,YAAc,IAAIjf,EACxB,CACA,SAAU,QACTzK,EAAA,KAAK,mBAAL,MAAAA,EAAuB,QACvB,KAAK,cAAc,QAAS2pB,GAAQA,EAAI,aAAa,EACrD,KAAK,SAAS,QAASjf,GAAYA,EAAQ,UAAU,EACrD,KAAK,YAAY,KAAI,EACrB,KAAK,YAAY,SAAQ,CAC1B,CACA,iBAAiBgJ,EAAKgK,EAAS,CAC9B,KAAK,mBAAL,KAAK,iBAAqC,IAAI,KAC9C,IAAIkM,EAAS,KAAK,iBAAiB,IAAIlW,CAAG,EAC1C,OAAKkW,IACJA,EAASlM,EAAO,EAChB,KAAK,iBAAiB,IAAIhK,EAAKkW,CAAM,GAE/BA,CACR,CAcA,uBAAuBlW,EAAKgK,EAAS,CACpC,MAAMmM,EAAY,UAAUnW,CAAG,GAC/B,KAAK,mBAAL,KAAK,iBAAqC,IAAI,KAC9C,IAAIkW,EAAS,KAAK,iBAAiB,IAAIC,CAAS,EAChD,OAAKD,IACJA,EAASlM,EAAO,EAAG,KAAK5M,GAAUhD,EAAa,CAAC,EAChD,KAAK,iBAAiB,IAAI+b,EAAWD,CAAM,GAErCA,CACR,CASA,cAAczhB,EAAY,CACzB,OAAOA,EAAW,KAAK2I,GAAUhD,EAAa,CAAC,CAChD,CACA,YAAY3F,EAAYF,EAAgB,CACvC,MAAMmD,EAAejD,EAAW,UAAUF,CAAc,EACxD,KAAK,cAAc,KAAKmD,CAAY,CACrC,CACA,eAAgB,CACf,MAAMV,EAAU,IAAID,GACpB,YAAK,SAAS,KAAKC,CAAO,EACnBA,CACR,CACA,oBAAoBuQ,EAAYD,EAAY,CAC3C,MAAMtQ,EAAU,IAAIY,GAAc2P,EAAYD,CAAU,EACxD,YAAK,SAAS,KAAKtQ,CAAO,EACnBA,CACR,CACA,sBAAsBof,EAAc,CACnC,MAAMpf,EAAU,IAAIQ,GAAgB4e,CAAY,EAChD,YAAK,SAAS,KAAKpf,CAAO,EACnBA,CACR,CAIA,IAAI,YAAa,CAChB,OAAO,KAAK,YAAY,aAAY,CACrC,CACD,EAIA,MAAMqf,GAAsB,GACtBC,GAAwB,IACxBC,GAA0B,EAC1BC,GAAkB,CAAC,CAAE,WAAYC,EAAkB,OAAO,iBAAkB,aAAAC,EAAeJ,GAAuB,UAAAK,EAAYJ,MAA8B,CACjK,GAAIG,EAAe,EAAG,MAAM,IAAIlF,GAAgB,4BAA4B,EAC5E,GAAIiF,EAAkB,EAAG,MAAM,IAAIjF,GAAgB,+BAA+B,EAClF,GAAImF,EAAY,EAAG,MAAM,IAAInF,GAAgB,yBAAyB,EACtE,GAAIkF,EAAeD,EAAiB,MAAM,IAAIjF,GAAgB,qCAAqC,EACnG,IAAI9Y,EAAQ,KAAK,IAAIge,EAAcD,CAAe,EAClD,MAAO,IAAM,CACZ,GAAI/d,IAAU+d,EAAiB,OAAOA,EACtC,MAAMG,EAAele,EACrB,OAAAA,EAAQ,KAAK,IAAIA,EAAQie,EAAWF,CAAe,EAC5CG,CACR,CACD,EACMC,GAAa,MAAO,CAAE,cAAAC,EAAe,WAAYC,EAAUV,GAAqB,QAAAW,EAAS,UAAAC,EAAW,qBAAAC,KAA2B,CACpI,IAAIC,EAAoBJ,EAAU,EAC9BK,EAAO,EACX,MAAMC,EAAiB,SAAY,CAClC,GAAI,CACH,IAAIznB,EACJ,OAAIwnB,GAAQ,EAAGxnB,EAAS,MAAMknB,EAAa,EACtClnB,EAAS,MAAM,IAAI,QAAQ,CAACL,EAASC,IAAW,WAAW,IAAM,CACrEsnB,EAAa,EAAG,KAAKvnB,CAAO,EAAE,MAAMC,CAAM,CAC3C,EAAG4nB,CAAI,CAAC,EACJD,IAAmBF,GAAA,MAAAA,EAAYrnB,IAC5BA,CACR,OAASQ,EAAO,CACf,GAAI+mB,KAAsB,GAAK,EAACD,GAAA,MAAAA,EAAuB9mB,IACtD,OAAAgnB,GAAOJ,GAAA,YAAAA,MAAe,EACtBnD,EAAS,EAAG,MAAM,qBAAqBkD,EAAUI,CAAiB,OAAOJ,CAAO,EAAE,EAC3EM,EAAc,EACf,MAAMjnB,CACd,CACD,EACA,OAAOinB,EAAc,CACtB,EAIMC,GAAYzD,EAAS,EACrB0D,GAAa,CAClB,OAAQ,MACR,QAAS,CAAE,OAAQ,kBAAkB,CACtC,EACMC,GAAc,CACnB,OAAQ,OACR,QAAS,CACR,OAAQ,mBACR,eAAgB,kBAClB,CACA,EACA,IAAIC,IAAwBlrB,GAAA,cAAoCypB,EAAY,CAoB3E,YAAY0B,EAASC,EAAe1R,EAAU,CAAA,EAAI,CACjD,MAAK,EACL,KAAK,QAAUyR,EACf,KAAK,cAAgBC,EACrB,KAAK,YAAc,KAAK,cAAa,EACrC,KAAK,SAAW,KAAK,cAAa,EAClC,KAAK,SAAW,KAAK,sBAAsB,MAAM,EACjD,KAAK,WAAa1R,EAAQ,YAAc1Z,GAAsB,kBAC9D,KAAK,cAAgB0Z,EAAQ,eAAiB1Z,GAAsB,uBACpE,KAAK,cAAgB0Z,EAAQ,eAAiB1Z,GAAsB,uBACpE,KAAK,eAAiB0Z,EAAQ,gBAAkB1Z,GAAsB,uBACvE,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,SAAS,KACtB,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,YAAY,aAAY,CACrC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,MAAM,QAAQoK,EAAS,CACtB,KAAK,SAAS,KAAK,YAAY,EAC/B,GAAI,CACH,MAAMie,EAAW,MAAM,KAAK,iBAAiBje,CAAO,EACpD,YAAK,SAAS,KAAK,SAAS,EAC5B,KAAK,YAAY,KAAKie,CAAQ,EACvBA,CACR,OAASxkB,EAAO,CACfknB,GAAU,MAAM,yCAA0ClnB,CAAK,EAC/D,KAAK,SAAS,KAAK,OAAO,EAC1B,MAAMqB,EAAMrB,aAAiB,MAAQA,EAAQ,IAAI,MAAM,sBAAuB,CAAE,MAAOA,EAAO,EAC9F,WAAK,SAAS,KAAKqB,CAAG,EAChBA,CACP,CACD,CACA,MAAM,iBAAiBkF,EAAS,CAC/B,MAAMggB,EAAY,KAAK,MAAM,KAAK,cAAgB,KAAK,eAAiB,KAAK,IAAI,KAAK,WAAa,EAAG,CAAC,CAAC,EAClGK,EAAUR,GAAgB,CAC/B,aAAc,KAAK,cACnB,UAAAG,EACA,WAAY,KAAK,aACpB,CAAG,EACD,OAAOE,GAAW,CACjB,cAAe,SAAY,KAAK,eAAelgB,CAAO,EACtD,WAAY,KAAK,WACjB,QAAAqgB,EACA,UAAYpC,GAAa,CACxB,GAAIA,EAAS,QAAU,KAAOA,EAAS,OAAS,IAAK,MAAM,IAAIrF,GAAgB,iBAAiBqF,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,CACzI,CACH,CAAG,CACF,CACA,MAAM,eAAeje,EAAS,CAC7B,MAAMihB,EAAM,KAAK,SAASjhB,EAAQ,GAAG,EAC/BkhB,EAAU,KAAK,aAAalhB,EAAQ,OAAO,EAC3CmhB,EAAYnhB,EAAQ,SAAW,KAAK,eAC1C2gB,GAAU,MAAM,6CAA8C,CAC7D,OAAQ3gB,EAAQ,OAChB,IAAAihB,EACA,QAAS,OAAO,KAAKC,CAAO,EAAE,OAAO,CAACE,EAAK/X,KAC1C+X,EAAI/X,CAAG,EAAIA,IAAQ,gBAAkB,GAAG6X,EAAQ7X,CAAG,EAAE,UAAU,EAAG,EAAE,CAAC,MAAQ6X,EAAQ7X,CAAG,EACjF+X,GACL,CAAA,CAAE,EACL,KAAM,KAAK,aAAaphB,EAAQ,IAAI,CACvC,CAAG,EACD,MAAMqhB,EAAa,IAAI,gBACjBC,EAAY,WAAW,IAAMD,EAAW,MAAK,EAAIF,CAAS,EAChE,GAAI,CACH,MAAMlD,EAAW,MAAM,MAAMgD,EAAK,CACjC,OAAQjhB,EAAQ,OAChB,QAAAkhB,EACA,KAAMlhB,EAAQ,KACd,OAAQqhB,EAAW,MACvB,CAAI,EACD,aAAaC,CAAS,EACtB,MAAMC,EAAe,MAAM,KAAK,gBAAgBtD,CAAQ,EACxD,OAAA0C,GAAU,MAAM,6CAA8C,CAC7D,OAAQ1C,EAAS,OACjB,WAAYA,EAAS,WACrB,QAAS,CAAC,GAAGA,EAAS,QAAQ,QAAO,CAAE,EACvC,KAAMsD,EAAa,KAAOA,EAAa,KAAK,UAAU,EAAG,GAAG,EAAI,SACpE,CAAI,EACMA,CACR,OAAS9nB,EAAO,CAEf,MADA,aAAa6nB,CAAS,EAClB7nB,aAAiB,OAASA,EAAM,OAAS,aAAoB,IAAI4f,GAAoB,yBAAyB8H,CAAS,KAAM,CAAE,MAAO1nB,CAAK,CAAE,GACjJknB,GAAU,MAAM,0CAA2ClnB,CAAK,EAC1DA,EACP,CACD,CACA,SAASwnB,EAAK,CACb,MAAMO,EAAY,OAAOP,GAAQ,SAAWA,EAAMA,EAAI,SAAQ,EAC9D,OAAIO,EAAU,WAAW,SAAS,GAAKA,EAAU,WAAW,UAAU,EAAUA,EACzE,GAAG,KAAK,QAAQ,SAAS,GAAG,EAAI,KAAK,QAAQ,MAAM,EAAG,EAAE,EAAI,KAAK,OAAO,GAAGA,EAAU,WAAW,GAAG,EAAIA,EAAY,IAAIA,CAAS,EAAE,EAC1I,CACA,aAAaC,EAAgB,CAC5B,MAAMP,EAAU,CAAE,GAAGO,GAAkB,EAAE,EACnCC,EAAa,KAAK,cAAa,EACrC,OAAIA,EAAW,OACdR,EAAQ,cAAgB,UAAUQ,EAAW,KAAK,GAClDf,GAAU,MAAM,iEAAkEe,EAAW,MAAM,MAAM,GACnGf,GAAU,KAAK,qEAAqE,EACpFO,CACR,CAIA,aAAa/nB,EAAM,CAClB,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAAU,OAAOA,EAAO,oBAAsB,OAC3E,GAAI,CACH,MAAMwoB,EAAY,CAAE,GAAG,KAAK,MAAMxoB,CAAI,CAAC,EACvC,UAAWkQ,KAAO,OAAO,KAAKsY,CAAS,EAAO/rB,GAAsB,sBAAsB,IAAIyT,CAAG,GAAK,OAAOsY,EAAUtY,CAAG,GAAM,WAAUsY,EAAUtY,CAAG,EAAI,GAAGsY,EAAUtY,CAAG,EAAE,UAAU,EAAG,EAAE,CAAC,iBAC7L,OAAO,KAAK,UAAUsY,CAAS,CAChC,MAAQ,CACP,OAAOxoB,EAAK,OAAS,IAAM,GAAGA,EAAK,UAAU,EAAG,GAAG,CAAC,MAAQA,CAC7D,CACD,CACA,MAAM,gBAAgB8kB,EAAU,CAC/B,MAAMiD,EAAU,CAAA,EAChBjD,EAAS,QAAQ,QAAQ,CAACtlB,EAAO0Q,IAAQ,CACxC6X,EAAQ7X,CAAG,EAAI1Q,CAChB,CAAC,EACD,MAAMipB,EAAW,MAAM3D,EAAS,KAAI,EACpC,MAAO,CACN,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,QAAAiD,EACA,KAAMU,EACN,GAAI3D,EAAS,GACb,IAAKA,EAAS,GACjB,CACC,CACD,EAzJEroB,GAAK,kBAAoB,EAGzBA,GAAK,uBAAyB,IAG9BA,GAAK,uBAAyB,IAG9BA,GAAK,wBAA0B,IAG/BA,GAAK,sBAAwB,IAAI,IAAI,CACpC,aACA,QACA,WACH,CAAG,EAlByBA,IA6K5B,MAAMisB,GAAmB,EAInBC,GAAiB,CAACC,EAAQ5G,KAAU,CACzC,SAAU4G,EAAO,SACjB,MAAOA,EAAO,MACd,QAASA,EAAO,QAChB,KAAA5G,CACD,GACA,IAAI6G,GAAuB,KAAM,CAChC,aAAc,CACb,KAAK,QAAU,CACd,WAAY,CAAA,EACZ,YAAa,CAAA,EACb,WAAY,CAAA,CACf,CACC,CAWA,KAAK7G,EAAM4G,EAAQ,CAClB,MAAME,EAAQH,GAAeC,EAAQ5G,CAAI,EACnC+G,EAAU,KAAK,QAAQ/G,CAAI,EACjC,GAAI+G,EAAQ,OAAS,GAAKA,EAAQ,CAAC,EAAE,WAAaD,EAAM,SAAU,OAClE,MAAME,EAAWD,EAAQ,OAAQxtB,GAAMA,EAAE,WAAautB,EAAM,QAAQ,EACpE,KAAK,QAAQ9G,CAAI,EAAI,CAAC8G,EAAO,GAAGE,CAAQ,EAAE,MAAM,EAAGN,EAAgB,CACpE,CAOA,IAAI1G,EAAM,CACT,MAAM+G,EAAU,KAAK,QAAQ/G,CAAI,EACjC,GAAI+G,EAAQ,SAAW,EAAG,OAC1B,KAAM,CAACE,EAAK,GAAGC,CAAI,EAAIH,EACvB,YAAK,QAAQ/G,CAAI,EAAIkH,EACdD,CACR,CAaA,cAAcjH,EAAMmH,EAAkB,CACrC,MAAMC,EAAU,KAAK,QAAQpH,CAAI,EACjC,UAAW8G,KAASM,EAAS,CAC5B,MAAMC,EAAaF,EAAiB,KAAM/sB,GAAMA,EAAE,WAAa0sB,EAAM,QAAQ,EAC7E,GAAIO,EAAY,OAAOA,EACvB,MAAMC,EAAaH,EAAiB,KAAM/sB,GAAMA,EAAE,UAAY0sB,EAAM,SAAW1sB,EAAE,QAAU0sB,EAAM,KAAK,EACtG,GAAIQ,EAAY,OAAOA,CACxB,CACD,CAOA,WAAWtH,EAAM,CAChB,OAAO,KAAK,QAAQA,CAAI,CACzB,CAIA,OAAQ,CACP,KAAK,QAAQ,WAAa,CAAA,EAC1B,KAAK,QAAQ,YAAc,CAAA,EAC3B,KAAK,QAAQ,WAAa,CAAA,CAC3B,CACD,EAIA,SAASuH,GAAYC,EAAS,CAC7B,OAAOA,EAAU,GAClB,CACA,SAASC,GAAYC,EAAc,CAClC,OAAO,KAAK,MAAMA,EAAe,GAAG,EAAI,EACzC,CAIA,MAAMC,GAAY5F,EAAS,EAC3B,IAAI6F,EAAuB,MAAMA,EAAqB,CACrD,WAAW,UAAW,CACrB,YAAK,YAAL,KAAK,UAAc,IAAIA,IAChB,KAAK,SACb,CACA,aAAc,CACb,KAAK,mBAAqB9N,GAC1B,KAAK,sBAAwBC,GAC7B,KAAK,sBAAwBL,GAC7B,KAAK,kBAAoBC,GACzB,KAAK,kBAAoBC,GACzB,KAAK,kBAAoBC,GACzB,KAAK,qBAAuB,GAC5B,KAAK,UAAY,GACjB,KAAK,oBAAsBL,GAC3B,KAAK,oBAAsBC,GAC3B,KAAK,yBAA2B,CAC/B,eAAgB,GAChB,aAAc,GACd,uBAAwB,GACxB,qBAAsB,GACtB,gBAAiB,EACpB,EACE,KAAK,aAAe,GACpB,KAAK,aAAe,GACpB,KAAK,oBAAsB,KAC3B,KAAK,qBAAuB,KAC5B,KAAK,oBAAsB,KAC3B,KAAK,2BAA6B,CAAC,wBAAwB,EAC3D,KAAK,gCAAkC,CAAA,EACvC,KAAK,0BAA4B,CAChC,QACA,UACA,4BACA,iBACA,kBACA,4BACA,kBACA,eACA,aACH,EACE,KAAK,cAAgB,CAAA,EACrB,KAAK,qBAAuBwB,GAC5B,KAAK,qBAAuBC,GAC5B,KAAK,uBAAyBC,GAC9B,KAAK,wBAA0BC,GAC/B,KAAK,yBAA2BC,GAChC,KAAK,2BAA6BC,GAClC,KAAK,iBAAmBC,GACxB,KAAK,iBAAmBsM,GACxB,KAAK,oBAAsBC,GAC3B,KAAK,iBAAmBC,GACxB,KAAK,qBAAuBpM,GAC5B,KAAK,oBAAsBC,GAC3B,KAAK,gBAAkBC,GACvB,KAAK,qBAAuBC,GAC5B,KAAK,iBAAmBC,GACxB,KAAK,2BAA6BC,GAClC,KAAK,kBAAoBgM,GACzB,KAAK,oBAAsB9L,GAC3B,KAAK,oBAAsBkB,GAC3B,KAAK,6BAA+BC,GACpC,KAAK,+BAAiCC,GACtC,KAAK,uBAAyBb,GAC9B,KAAK,yBAA2BC,GAChC,KAAK,sBAAwBI,GAC7B,KAAK,wBAA0BC,GAC/B,KAAK,yBAA2BC,GAChC,KAAK,wBAA0B,OAC/B,KAAK,wBAA0B,OAC/B,KAAK,YAAcO,GACnB,KAAK,sBAAwBN,GAC7B,KAAK,4BAA8BC,GACnC,KAAK,6BAA+BC,GACpC,KAAK,qBAAuB,CAAA,EAC5B,KAAK,qBAAuB,CAAA,CAC7B,CACA,IAAI,uBAAwB,CAC3B,MAAO,CACN,aAAc,KAAK,aACnB,aAAc,KAAK,aACnB,4BAA6B,KAAK,4BAClC,4BAA6B,KAAK,2BACrC,CACC,CACA,IAAI,6BAA8B,CACjC,OAAO,KAAK,4BACb,CACA,IAAI,4BAA4B3f,EAAO,CACtC,KAAK,6BAA+BA,CACrC,CACA,IAAI,6BAA8B,CACjC,OAAO,KAAK,4BACb,CACA,IAAI,4BAA4BA,EAAO,CACtC,KAAK,6BAA+BA,CACrC,CACD,EAEA,MAAMyqB,GAAqB,CAC1B,oBACA,wBACA,oBACA,oBACA,sBACA,sBACA,qBACA,wBACA,uBACA,uBACA,yBACA,0BACA,2BACA,6BACA,mBACA,mBACA,sBACA,mBACA,uBACA,sBACA,kBACA,uBACA,mBACA,6BACA,oBACA,sBACA,8BACA,8BACD,EAEMC,GAAsB,CAC3B,eACA,eACA,uBACA,YACA,sBACA,+BACA,iCACA,yBACA,2BACA,wBACA,0BACA,2BACA,cACA,uBACD,EAEA,SAASC,IAA2B,CACnC,MAAMC,EAAYR,EAAqB,SACvC,MAAO,CACN,kBAAmBQ,EAAU,kBAC7B,sBAAuBA,EAAU,sBACjC,kBAAmBA,EAAU,kBAC7B,kBAAmBA,EAAU,kBAC7B,UAAWA,EAAU,UACrB,aAAcA,EAAU,aACxB,aAAcA,EAAU,aACxB,qBAAsBA,EAAU,qBAChC,UAAWA,EAAU,UACrB,oBAAqBA,EAAU,oBAC/B,oBAAqBA,EAAU,oBAC/B,mBAAoBA,EAAU,mBAC9B,sBAAuBA,EAAU,sBACjC,WAAYA,EAAU,WACtB,cAAeA,EAAU,cACzB,qBAAsBA,EAAU,qBAChC,qBAAsBA,EAAU,qBAChC,uBAAwBA,EAAU,uBAClC,wBAAyBA,EAAU,wBACnC,yBAA0BA,EAAU,yBACpC,2BAA4BA,EAAU,2BACtC,iBAAkBA,EAAU,iBAC5B,iBAAkBA,EAAU,iBAC5B,oBAAqBA,EAAU,oBAC/B,iBAAkBA,EAAU,iBAC5B,qBAAsBA,EAAU,qBAChC,oBAAqBA,EAAU,oBAC/B,gBAAiBA,EAAU,gBAC3B,qBAAsBA,EAAU,qBAChC,iBAAkBA,EAAU,iBAC5B,2BAA4BA,EAAU,2BACtC,kBAAmBA,EAAU,kBAC7B,oBAAqBA,EAAU,oBAC/B,oBAAqBA,EAAU,oBAC/B,6BAA8BA,EAAU,6BACxC,+BAAgCA,EAAU,+BAC1C,uBAAwBA,EAAU,uBAClC,yBAA0BA,EAAU,yBACpC,sBAAuBA,EAAU,sBACjC,wBAAyBA,EAAU,wBACnC,yBAA0BA,EAAU,yBACpC,YAAaA,EAAU,YACvB,sBAAuBA,EAAU,sBACjC,4BAA6BA,EAAU,4BACvC,6BAA8BA,EAAU,6BACxC,qBAAsBA,EAAU,qBAChC,qBAAsBA,EAAU,oBAClC,CACA,CAEA,SAASC,GAAuBC,EAAQ,CACvC,MAAMF,EAAYR,EAAqB,SACvC,UAAW1Z,KAAO+Z,GAAwBK,EAAOpa,CAAG,IAAM,SAAQka,EAAUla,CAAG,EAAIoa,EAAOpa,CAAG,GAC7F,UAAWA,KAAOga,GAAyBI,EAAOpa,CAAG,IAAM,SAAQka,EAAUla,CAAG,EAAIoa,EAAOpa,CAAG,GAC1Foa,EAAO,YAAc,SAAQF,EAAU,UAAYE,EAAO,WAC1DA,EAAO,aAAe,SAAQF,EAAU,WAAaE,EAAO,YAC5DA,EAAO,gBAAkB,SAAQF,EAAU,cAAgBE,EAAO,eAClEA,EAAO,uBAAyB,SAAQF,EAAU,qBAAuBE,EAAO,sBAChFA,EAAO,uBAAyB,SAAQF,EAAU,qBAAuBE,EAAO,qBACrF,CAUA,IAAIC,GAAoB,KAAM,CAC7B,aAAc,CACb,KAAK,SAAW,IACjB,CAKA,sBAAsBC,EAAS,CAC9B,KAAK,SAAWA,EAChB,KAAK,iBAAgB,CACtB,CAEA,IAAI,mBAAoB,CACvB,OAAOf,GAAYG,EAAqB,SAAS,iBAAiB,CACnE,CACA,IAAI,kBAAkBJ,EAAS,CAC9BI,EAAqB,SAAS,kBAAoBL,GAAYC,CAAO,EACrE,KAAK,eAAc,CACpB,CAEA,IAAI,uBAAwB,CAC3B,OAAOC,GAAYG,EAAqB,SAAS,qBAAqB,CACvE,CACA,IAAI,sBAAsBJ,EAAS,CAClCI,EAAqB,SAAS,sBAAwBL,GAAYC,CAAO,EACzE,KAAK,eAAc,CACpB,CAEA,IAAI,mBAAoB,CACvB,OAAOC,GAAYG,EAAqB,SAAS,iBAAiB,CACnE,CACA,IAAI,kBAAkBJ,EAAS,CAC9BI,EAAqB,SAAS,kBAAoBL,GAAYC,CAAO,EACrE,KAAK,eAAc,CACpB,CAEA,IAAI,mBAAoB,CACvB,OAAOC,GAAYG,EAAqB,SAAS,iBAAiB,CACnE,CACA,IAAI,kBAAkBJ,EAAS,CAC9BI,EAAqB,SAAS,kBAAoBL,GAAYC,CAAO,EACrE,KAAK,eAAc,CACpB,CAEA,IAAI,WAAY,CACf,OAAOI,EAAqB,SAAS,WAAa,EACnD,CACA,IAAI,UAAUpqB,EAAO,CACpBoqB,EAAqB,SAAS,UAAYpqB,EAC1C,KAAK,eAAc,CACpB,CAEA,IAAI,cAAe,CAClB,OAAOoqB,EAAqB,SAAS,YACtC,CACA,IAAI,aAAapqB,EAAO,CACvBoqB,EAAqB,SAAS,aAAepqB,EAC7C,KAAK,eAAc,CACpB,CAEA,IAAI,cAAe,CAClB,OAAOoqB,EAAqB,SAAS,YACtC,CACA,IAAI,aAAapqB,EAAO,CACvBoqB,EAAqB,SAAS,aAAepqB,EAC7C,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOoqB,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,CACrD,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,CACtD,CAEA,IAAI,qBAAsB,CACzB,OAAOoqB,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,CACrD,CAEA,IAAI,uBAAwB,CAC3B,OAAOoqB,EAAqB,SAAS,2BACtC,CACA,IAAI,sBAAsBpqB,EAAO,CAChCoqB,EAAqB,SAAS,4BAA8BpqB,CAC7D,CAEA,IAAI,uBAAwB,CAC3B,OAAOoqB,EAAqB,SAAS,2BACtC,CACA,IAAI,sBAAsBpqB,EAAO,CAChCoqB,EAAqB,SAAS,4BAA8BpqB,CAC7D,CAEA,IAAI,oBAAqB,CACxB,OAAOiqB,GAAYG,EAAqB,SAAS,kBAAkB,CACpE,CACA,IAAI,mBAAmBJ,EAAS,CAC/BI,EAAqB,SAAS,mBAAqBL,GAAYC,CAAO,EACtE,KAAK,eAAc,CACpB,CAEA,IAAI,uBAAwB,CAC3B,OAAOC,GAAYG,EAAqB,SAAS,qBAAqB,CACvE,CACA,IAAI,sBAAsBJ,EAAS,CAClCI,EAAqB,SAAS,sBAAwBL,GAAYC,CAAO,EACzE,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOI,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,IAAI,WAAY,CACf,OAAOoqB,EAAqB,SAAS,SACtC,CACA,IAAI,UAAUpqB,EAAO,CACpBoqB,EAAqB,SAAS,UAAYpqB,EAC1C,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOiqB,GAAYG,EAAqB,SAAS,mBAAmB,CACrE,CACA,IAAI,oBAAoBJ,EAAS,CAChCI,EAAqB,SAAS,oBAAsBL,GAAYC,CAAO,EACvE,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOC,GAAYG,EAAqB,SAAS,mBAAmB,CACrE,CACA,IAAI,oBAAoBJ,EAAS,CAChCI,EAAqB,SAAS,oBAAsBL,GAAYC,CAAO,EACvE,KAAK,eAAc,CACpB,CAEA,IAAI,YAAa,CAChB,OAAOI,EAAqB,SAAS,UACtC,CACA,IAAI,WAAWpqB,EAAO,CACrBoqB,EAAqB,SAAS,WAAapqB,EAC3C,KAAK,eAAc,CACpB,CAEA,IAAI,eAAgB,CACnB,OAAOoqB,EAAqB,SAAS,aACtC,CACA,IAAI,cAAcpqB,EAAO,CACxBoqB,EAAqB,SAAS,cAAgBpqB,EAC9C,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,IAAI,wBAAyB,CAC5B,OAAOoqB,EAAqB,SAAS,sBACtC,CACA,IAAI,uBAAuBpqB,EAAO,CACjCoqB,EAAqB,SAAS,uBAAyBpqB,EACvD,KAAK,eAAc,CACpB,CAEA,IAAI,yBAA0B,CAC7B,OAAOoqB,EAAqB,SAAS,uBACtC,CACA,IAAI,wBAAwBpqB,EAAO,CAClCoqB,EAAqB,SAAS,wBAA0BpqB,EACxD,KAAK,eAAc,CACpB,CAEA,IAAI,0BAA2B,CAC9B,OAAOoqB,EAAqB,SAAS,wBACtC,CACA,IAAI,yBAAyBpqB,EAAO,CACnCoqB,EAAqB,SAAS,yBAA2BpqB,EACzD,KAAK,eAAc,CACpB,CAEA,IAAI,4BAA6B,CAChC,OAAOoqB,EAAqB,SAAS,0BACtC,CACA,IAAI,2BAA2BpqB,EAAO,CACrCoqB,EAAqB,SAAS,2BAA6BpqB,EAC3D,KAAK,eAAc,CACpB,CAEA,IAAI,kBAAmB,CACtB,OAAOoqB,EAAqB,SAAS,gBACtC,CACA,IAAI,iBAAiBpqB,EAAO,CAC3BoqB,EAAqB,SAAS,iBAAmBpqB,EACjD,KAAK,eAAc,CACpB,CAEA,IAAI,kBAAmB,CACtB,OAAOoqB,EAAqB,SAAS,gBACtC,CACA,IAAI,iBAAiBpqB,EAAO,CAC3BoqB,EAAqB,SAAS,iBAAmBpqB,EACjD,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOoqB,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,EACpD,KAAK,eAAc,CACpB,CAEA,IAAI,kBAAmB,CACtB,OAAOoqB,EAAqB,SAAS,gBACtC,CACA,IAAI,iBAAiBpqB,EAAO,CAC3BoqB,EAAqB,SAAS,iBAAmBpqB,EACjD,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOoqB,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,EACpD,KAAK,eAAc,CACpB,CAEA,IAAI,iBAAkB,CACrB,OAAOoqB,EAAqB,SAAS,eACtC,CACA,IAAI,gBAAgBpqB,EAAO,CAC1BoqB,EAAqB,SAAS,gBAAkBpqB,EAChD,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOiqB,GAAYG,EAAqB,SAAS,oBAAoB,CACtE,CACA,IAAI,qBAAqBJ,EAAS,CACjCI,EAAqB,SAAS,qBAAuBL,GAAYC,CAAO,EACxE,KAAK,eAAc,CACpB,CAEA,IAAI,kBAAmB,CACtB,OAAOC,GAAYG,EAAqB,SAAS,gBAAgB,CAClE,CACA,IAAI,iBAAiBJ,EAAS,CAC7BI,EAAqB,SAAS,iBAAmBL,GAAYC,CAAO,EACpE,KAAK,eAAc,CACpB,CAEA,IAAI,4BAA6B,CAChC,OAAOC,GAAYG,EAAqB,SAAS,0BAA0B,CAC5E,CACA,IAAI,2BAA2BJ,EAAS,CACvCI,EAAqB,SAAS,2BAA6BL,GAAYC,CAAO,EAC9E,KAAK,eAAc,CACpB,CAEA,IAAI,mBAAoB,CACvB,OAAOC,GAAYG,EAAqB,SAAS,iBAAiB,CACnE,CACA,IAAI,kBAAkBJ,EAAS,CAC9BI,EAAqB,SAAS,kBAAoBL,GAAYC,CAAO,EACrE,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOI,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,EACpD,KAAK,eAAc,CACpB,CAEA,IAAI,qBAAsB,CACzB,OAAOoqB,EAAqB,SAAS,mBACtC,CACA,IAAI,oBAAoBpqB,EAAO,CAC9BoqB,EAAqB,SAAS,oBAAsBpqB,EACpD,KAAK,eAAc,CACpB,CAEA,IAAI,8BAA+B,CAClC,OAAOoqB,EAAqB,SAAS,4BACtC,CACA,IAAI,6BAA6BpqB,EAAO,CACvCoqB,EAAqB,SAAS,6BAA+BpqB,EAC7D,KAAK,eAAc,CACpB,CAEA,IAAI,gCAAiC,CACpC,OAAOoqB,EAAqB,SAAS,8BACtC,CACA,IAAI,+BAA+BpqB,EAAO,CACzCoqB,EAAqB,SAAS,+BAAiCpqB,EAC/D,KAAK,eAAc,CACpB,CAEA,IAAI,wBAAyB,CAC5B,OAAOoqB,EAAqB,SAAS,sBACtC,CACA,IAAI,uBAAuBpqB,EAAO,CACjCoqB,EAAqB,SAAS,uBAAyBpqB,EACvD,KAAK,eAAc,CACpB,CAEA,IAAI,0BAA2B,CAC9B,OAAOoqB,EAAqB,SAAS,wBACtC,CACA,IAAI,yBAAyBpqB,EAAO,CACnCoqB,EAAqB,SAAS,yBAA2BpqB,EACzD,KAAK,eAAc,CACpB,CAEA,IAAI,uBAAwB,CAC3B,OAAOoqB,EAAqB,SAAS,qBACtC,CACA,IAAI,sBAAsBpqB,EAAO,CAChCoqB,EAAqB,SAAS,sBAAwBpqB,EACtD,KAAK,eAAc,CACpB,CAEA,IAAI,yBAA0B,CAC7B,OAAOoqB,EAAqB,SAAS,uBACtC,CACA,IAAI,wBAAwBpqB,EAAO,CAClCoqB,EAAqB,SAAS,wBAA0BpqB,EACxD,KAAK,eAAc,CACpB,CAEA,IAAI,0BAA2B,CAC9B,OAAOoqB,EAAqB,SAAS,wBACtC,CACA,IAAI,yBAAyBpqB,EAAO,CACnCoqB,EAAqB,SAAS,yBAA2BpqB,EACzD,KAAK,eAAc,CACpB,CAEA,IAAI,yBAA0B,CAC7B,OAAOoqB,EAAqB,SAAS,uBACtC,CACA,IAAI,wBAAwBpqB,EAAO,CAClCoqB,EAAqB,SAAS,wBAA0BpqB,CACzD,CAEA,IAAI,yBAA0B,CAC7B,OAAOoqB,EAAqB,SAAS,uBACtC,CACA,IAAI,wBAAwBpqB,EAAO,CAClCoqB,EAAqB,SAAS,wBAA0BpqB,CACzD,CAEA,IAAI,aAAc,CACjB,OAAOoqB,EAAqB,SAAS,WACtC,CACA,IAAI,YAAYpqB,EAAO,CACtBoqB,EAAqB,SAAS,YAAcpqB,EAC5C,KAAK,eAAc,CACpB,CAEA,IAAI,uBAAwB,CAC3B,OAAOoqB,EAAqB,SAAS,qBACtC,CACA,IAAI,sBAAsBpqB,EAAO,CAChCoqB,EAAqB,SAAS,sBAAwBpqB,EACtD,KAAK,eAAc,CACpB,CAEA,IAAI,6BAA8B,CACjC,OAAOoqB,EAAqB,SAAS,2BACtC,CACA,IAAI,4BAA4BpqB,EAAO,CACtCoqB,EAAqB,SAAS,4BAA8BpqB,EAC5D,KAAK,eAAc,CACpB,CAEA,IAAI,8BAA+B,CAClC,OAAOoqB,EAAqB,SAAS,4BACtC,CACA,IAAI,6BAA6BpqB,EAAO,CACvCoqB,EAAqB,SAAS,6BAA+BpqB,EAC7D,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,IAAI,sBAAuB,CAC1B,OAAOoqB,EAAqB,SAAS,oBACtC,CACA,IAAI,qBAAqBpqB,EAAO,CAC/BoqB,EAAqB,SAAS,qBAAuBpqB,EACrD,KAAK,eAAc,CACpB,CAEA,gBAAiB,CAChB,GAAI,CAAC,KAAK,SAAU,OACpB,MAAM6hB,EAAO8I,GAAwB,EACrC,KAAK,SAAS,QAAQnO,GAAyBqF,EAAM,OAAO,EAAE,MAAO/gB,GAAU,CAC9EqpB,GAAU,MAAM,mDAAmD,OAAOrpB,CAAK,CAAC,EAAE,CACnF,CAAC,CACF,CAEA,kBAAmB,CACb,KAAK,UACV,KAAK,SAAS,QAAQ0b,GAAyB,OAAO,EAAE,KAAMsO,GAAW,CACpEA,GAAQD,GAAuBC,CAAM,CAC1C,CAAC,EAAE,MAAOhqB,GAAU,CACnBqpB,GAAU,MAAM,mDAAmD,OAAOrpB,CAAK,CAAC,EAAE,CACnF,CAAC,CACF,CACD,EAWA,SAASmqB,GAAQjrB,EAAO,CACvB,OAAIA,aAAiB,MAAcA,EAC5B,IAAI,MAAM,OAAOA,CAAK,CAAC,CAC/B,CAIA,MAAMkrB,GAAY3G,EAAS,EAErB4G,GAAsB,CAC3B,WAAYhM,GACZ,YAAaC,GACb,WAAYC,EACb,EACM+L,GAAsB,CAC3B,WAAY,CAAA,EACZ,YAAa,CAAA,EACb,WAAY,CAAA,CACb,EACMC,GAA8B,CACnC,WAAY,KACZ,YAAa,KACb,WAAY,IACb,EACA,IAAIC,GAA4B,cAAc5E,EAAY,CACzD,YAAY6E,EAAmBC,EAAgB,CAC9C,MAAK,EACL,KAAK,kBAAoBD,EACzB,KAAK,oBAAsB,IAAM,CAChCL,GAAU,MAAM,2CAA2C,EAC3D,KAAK,iBAAgB,CACtB,EACA,KAAK,eAAiB,KAAK,sBAAsBE,EAAmB,EACpE,KAAK,uBAAyB,KAAK,sBAAsBC,EAA2B,EACpF,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,eAAiB,IAAIhC,GAC1B,KAAK,kBAAoB,KAAK,cAAa,EAC3C,KAAK,qBAAuB,KAAK,sBAAsB,EAAK,EAC5D,KAAK,qBAAuB,KAAK,sBAAsB,EAAK,EAC5D,KAAK,6BAA+B,KACpC,KAAK,6BAA+B,KACpC,KAAK,kBAAoB,CAAA,EACzB,KAAK,gBAAkBmC,EACvB,KAAK,KAAI,CACV,CAEA,kBAAkBA,EAAgB,CACjC,KAAK,gBAAkBA,EACvB,KAAK,qBAAoB,CAC1B,CACA,IAAI,qCAAsC,CACzC,OAAI,KAAK,qBAAqB,MAAc,GACrC,KAAK,wBAAwB,KAAK,wBAAwB,CAClE,CACA,IAAI,qCAAsC,CACzC,OAAI,KAAK,qBAAqB,MAAc,GACrC,KAAK,wBAAwB,KAAK,wBAAwB,CAClE,CACA,wBAAwBC,EAAY,CACnC,GAAI,EAACA,GAAA,MAAAA,EAAY,WAAYA,EAAW,SAAS,KAAI,IAAO,GAAI,MAAO,CAAA,EACvE,MAAMC,EAAUD,EAAW,OAAS,aAAe,KAAK,kBAAoB,KAAK,kBAC3ErC,EAASsC,EAAQ,KAAMC,GAAaA,EAAS,WAAaF,EAAW,QAAQ,GAAKC,EAAQ,KAAMC,GAAaA,EAAS,QAAUF,EAAW,KAAK,EACtJ,OAAIrC,EAAe,CAAE,SAAU,CAAE,MAAOA,EAAO,SAAU,EAClD,CAAA,CACR,CACA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,SAAS,aAAY,EAAG,KAAK1Q,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5G,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,kBAAkB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAC7E,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,iBAAiB,sBAAuB,IAAM,KAAK,qBAAqB,aAAY,EAAG,KAAK5C,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5J,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,iBAAiB,sBAAuB,IAAM,KAAK,qBAAqB,aAAY,EAAG,KAAK5C,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5J,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,qBAAqB,KAClC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,qBAAqB,KAClC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,eAAe,KAAK5I,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CACxK,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,iBAAiB,sBAAuB,IAAM,KAAK,eAAe,KAAK5I,EAAK3G,GAAUA,EAAM,WAAW,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CAC1K,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,eAAe,KAAK5I,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CACxK,CACA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,iBAAiB,4BAA6B,IAAM,KAAK,uBAAuB,aAAY,EAAG,KAAK5I,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,EAAGE,GAAK3J,GAASic,GAAU,MAAM,0DAA2Djc,CAAI,CAAC,CAAC,CAAC,CACvS,CACA,IAAI,4BAA6B,CAChC,OAAO,KAAK,iBAAiB,6BAA8B,IAAM,KAAK,uBAAuB,aAAY,EAAG,KAAKa,EAAK3G,GAAUA,EAAM,WAAW,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,EAAGE,GAAK3J,GAASic,GAAU,MAAM,2DAA4Djc,CAAI,CAAC,CAAC,CAAC,CAC1S,CACA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,iBAAiB,4BAA6B,IAAM,KAAK,uBAAuB,aAAY,EAAG,KAAKa,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,EAAI4C,EAAU,KAAK,UAAU,EAAGE,GAAK3J,GAASic,GAAU,MAAM,0DAA2Djc,CAAI,CAAC,CAAC,CAAC,CACvS,CACA,IAAI,0BAA2B,CAC9B,OAAI,KAAK,qBAAqB,MAAc,KACrC,KAAK,uBAAuB,MAAM,UAC1C,CACA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,uBAAuB,MAAM,WAC1C,CACA,IAAI,0BAA2B,CAC9B,OAAI,KAAK,qBAAqB,MAAc,KACrC,KAAK,uBAAuB,MAAM,UAC1C,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,eAAe,MAAM,UAClC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,eAAe,MAAM,WAClC,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,eAAe,MAAM,UAClC,CACA,mBAAoB,CACd,KAAK,qBAAqB,QAC9B,KAAK,6BAA+B,KAAK,uBAAuB,MAAM,WACtE,KAAK,qBAAqB,KAAK,EAAI,EACnC,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAY,IAChB,CAAI,EAEH,CACA,kBAAmB,CAClB,GAAI,KAAK,qBAAqB,MAAO,CACpC,KAAK,qBAAqB,KAAK,EAAK,EACpC,MAAM2c,EAAW,KAAK,8BAAgC,KAAK,kBAAkB,CAAC,EAC9E,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAYA,CAChB,CAAI,EACD,KAAK,6BAA+B,IACrC,CACD,CACA,mBAAoB,CACd,KAAK,qBAAqB,QAC9B,KAAK,6BAA+B,KAAK,uBAAuB,MAAM,WACtE,KAAK,qBAAqB,KAAK,EAAI,EACnC,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAY,IAChB,CAAI,EAEH,CACA,kBAAmB,CAClB,GAAI,KAAK,qBAAqB,MAAO,CACpC,KAAK,qBAAqB,KAAK,EAAK,EACpC,MAAMA,EAAW,KAAK,8BAAgC,KAAK,kBAAkB,CAAC,EAC9E,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAYA,CAChB,CAAI,EACD,KAAK,6BAA+B,IACrC,CACD,CACA,uBAAuBxC,EAAQ,CAC1B,KAAK,qBAAqB,OAASA,GAAQ,KAAK,qBAAqB,KAAK,EAAK,EACnF,MAAMyC,EAAW,KAAK,uBAAuB,MAAM,WAC/CA,GAAYA,EAAS,YAAazC,GAAA,YAAAA,EAAQ,WAAU,KAAK,eAAe,KAAK,aAAcyC,CAAQ,EACvG,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAYzC,CACf,CAAG,EACGA,GAAQ,KAAK,uBAAuB,aAAcA,CAAM,CAC7D,CACA,uBAAuBA,EAAQ,CAC9B8B,GAAU,MAAM,0DAA2D9B,CAAM,EAC7E,KAAK,qBAAqB,OAASA,GAAQ,KAAK,qBAAqB,KAAK,EAAK,EACnF,MAAMyC,EAAW,KAAK,uBAAuB,MAAM,WAC/CA,GAAYA,EAAS,YAAazC,GAAA,YAAAA,EAAQ,WAAU,KAAK,eAAe,KAAK,aAAcyC,CAAQ,EACvG,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,WAAYzC,CACf,CAAG,EACGA,GAAQ,KAAK,uBAAuB,aAAcA,CAAM,CAC7D,CACA,wBAAwBA,EAAQ,CAC/B,MAAMyC,EAAW,KAAK,uBAAuB,MAAM,YAC/CA,GAAYA,EAAS,YAAazC,GAAA,YAAAA,EAAQ,WAAU,KAAK,eAAe,KAAK,cAAeyC,CAAQ,EACxG,KAAK,uBAAuB,KAAK,CAChC,GAAG,KAAK,uBAAuB,MAC/B,YAAazC,CAChB,CAAG,EACGA,GAAQ,KAAK,uBAAuB,cAAeA,CAAM,CAC9D,CACA,MAAO,CACN,KAAK,qBAAoB,EACzB,KAAK,YAAY,KAAK,eAAe,KAAK/T,GAAa+U,EAAqB,SAAS,kBAAkB,CAAC,EAAI0B,GAAiB,CAC5H,MAAMC,EAAkB,KAAK,uBAAuB,MAC9CC,EAAgB,KAAK,qBAAqB,MAAQ,KAAO,KAAK,cAAc,aAAcF,EAAa,WAAYC,EAAgB,WAAY3B,EAAqB,SAAS,mBAAmB,EAChM6B,EAAiB,KAAK,cAAc,cAAeH,EAAa,YAAaC,EAAgB,YAAa3B,EAAqB,SAAS,oBAAoB,EAC5J8B,EAAgB,KAAK,qBAAqB,MAAQ,KAAO,KAAK,cAAc,aAAcJ,EAAa,WAAYC,EAAgB,WAAY3B,EAAqB,SAAS,mBAAmB,EACtM,GAAI4B,IAAkBD,EAAgB,YAAcE,IAAmBF,EAAgB,aAAeG,IAAkBH,EAAgB,WAAY,CACnJ,MAAMI,EAAa/B,EAAqB,SAAS,yBACjD,KAAK,uBAAuB,KAAK,CAChC,WAAY+B,GAAc,CAACJ,EAAgB,WAAaC,EAAgBD,EAAgB,WACxF,YAAaI,GAAc,CAACJ,EAAgB,YAAcE,EAAiBF,EAAgB,YAC3F,WAAYI,GAAc,CAACJ,EAAgB,WAAaG,EAAgBH,EAAgB,UAC7F,CAAK,CACF,CACD,CAAC,EACD,KAAK,iBAAgB,CACtB,CAOA,cAAcvJ,EAAMkJ,EAASU,EAAUC,EAAW,CACjD,GAAIX,EAAQ,SAAW,EAAG,OAAO,KACjC,GAAIU,EAAU,CACb,GAAIV,EAAQ,KAAMtC,GAAWA,EAAO,WAAagD,EAAS,QAAQ,EAAG,OAAOA,EAC5E,MAAME,EAAeZ,EAAQ,OAAQtC,GAAWA,EAAO,QAAUgD,EAAS,KAAK,EAC/E,GAAIE,EAAa,SAAW,EAAG,OAAOA,EAAa,CAAC,EACpD,GAAIA,EAAa,OAAS,EAAG,CAC5B,MAAMxC,EAAawC,EAAa,KAAMlD,GAAWA,EAAO,UAAYgD,EAAS,OAAO,EACpF,OAAItC,IACJ,KAAK,oBAAoBtH,EAAM4J,EAAU,KAAM,iBAAiB,EACzD,KACR,CACA,MAAMG,EAAc,KAAK,eAAe,cAAc/J,EAAMkJ,CAAO,EACnE,GAAIa,EACH,OAAArB,GAAU,MAAM,mEAAmEqB,EAAY,KAAK,EAAE,EACtG,KAAK,oBAAoB/J,EAAM4J,EAAUG,EAAa,qBAAqB,EACpEA,EAER,MAAMC,GAAaH,EAAYX,EAAQ,KAAMtC,GAAWA,EAAO,WAAaiD,EAAU,UAAYjD,EAAO,QAAUiD,EAAU,KAAK,EAAI,SAAWX,EAAQ,CAAC,EAC1J,YAAK,oBAAoBlJ,EAAM4J,EAAUI,EAAW,qBAAqB,EAClEA,CACR,CACA,MAAMC,EAAY,KAAK,kBAAkBjK,CAAI,EAC7C,GAAIiK,EAAW,CACd,MAAMC,EAAgB,KAAK,uBAAuBlK,EAAMiK,EAAWf,CAAO,EAC1E,GAAIgB,EAAe,OAAOA,CAC3B,CACA,GAAIL,EAAW,CACd,MAAMM,EAAkBjB,EAAQ,KAAMtC,GAAWA,EAAO,WAAaiD,EAAU,UAAYjD,EAAO,QAAUiD,EAAU,KAAK,EAC3H,GAAIM,EAAiB,OAAOA,CAC7B,CACA,OAAOjB,EAAQ,CAAC,CACjB,CAKA,uBAAuBkB,EAAO9B,EAAQY,EAAS,CAC9C,MAAM7B,EAAa6B,EAAQ,KAAM9uB,GAAMA,EAAE,WAAakuB,EAAO,QAAQ,EACrE,GAAIjB,EAAY,OAAOA,EACvB,MAAMgD,EAAkBnB,EAAQ,KAAM9uB,GAAMA,EAAE,UAAYkuB,EAAO,SAAWluB,EAAE,QAAUkuB,EAAO,KAAK,EACpG,GAAI+B,EAAiB,OAAOA,EAC5B,MAAMP,EAAeZ,EAAQ,OAAQ9uB,GAAMA,EAAE,QAAUkuB,EAAO,KAAK,EACnE,OAAIwB,EAAa,SAAW,EAAUA,EAAa,CAAC,EAC7C,IACR,CACA,oBAAoB9J,EAAMsK,EAAgBN,EAAWpM,EAAQ,CAC5D,GAAI,CACH,KAAK,kBAAkB,KAAK,CAC3B,KAAAoC,EACA,eAAAsK,EACA,UAAAN,EACA,OAAApM,CACJ,CAAI,CACF,MAAQ,CAAC,CACV,CACA,MAAM,uBAAuBoC,EAAM4G,EAAQ,CAC1C,GAAI,CAAC,KAAK,iBAAmB,CAACgB,EAAqB,SAAS,uBAAwB,OACpF,MAAMU,EAAS,CACd,SAAU1B,EAAO,SACjB,MAAOA,EAAO,MACd,KAAMA,EAAO,KACb,QAASA,EAAO,OACnB,EACE,GAAI,CACH,MAAM,KAAK,gBAAgB,QAAQ+B,GAAoB3I,CAAI,EAAGsI,EAAQ,OAAO,CAC9E,OAAShqB,EAAO,CACfoqB,GAAU,MAAM,6DAA6D1I,CAAI,IAAK1hB,CAAK,CAC5F,CACD,CACA,MAAM,sBAAuB,CAC5B,GAAI,GAAC,KAAK,iBAAmB,CAACspB,EAAqB,SAAS,wBAC5D,UAAW5H,IAAQ,CAClB,aACA,cACA,YACH,EAAK,GAAI,CACN,MAAMsI,EAAS,MAAM,KAAK,gBAAgB,QAAQK,GAAoB3I,CAAI,EAAG,OAAO,EAChFsI,IAAQ,KAAK,kBAAoB,CACpC,GAAG,KAAK,kBACR,CAACtI,CAAI,EAAGsI,CACZ,EACE,OAAShqB,EAAO,CACfoqB,GAAU,MAAM,0DAA0D1I,CAAI,IAAK1hB,CAAK,CACzF,CACD,CAEA,MAAM,kBAAmB,CACxB,KAAK,eAAe,MAAK,EACzB,KAAK,kBAAoB,CAAA,EACzB,KAAK,6BAA+B,KACpC,KAAK,6BAA+B,KACpC,KAAK,qBAAqB,KAAK,EAAK,EACpC,KAAK,qBAAqB,KAAK,EAAK,EACpC,KAAK,uBAAuB,KAAKuqB,EAA2B,EAC5D,MAAM,KAAK,iBAAgB,CAC5B,CACA,wBAAyB,CACxB,KAAK,wBAAuB,EAC5B,KAAK,kBAAkB,aAAa,iBAAiB,eAAgB,KAAK,mBAAmB,EACzFjB,EAAqB,SAAS,sBAAwB,IAAG,KAAK,4BAA8BjX,GAASiX,EAAqB,SAAS,qBAAqB,EAAE,UAAU,IAAM,CAC7Kc,GAAU,MAAM,oDAAoD,EACpE,KAAK,iBAAgB,CACtB,CAAC,GACD,KAAK,iBAAgB,CACtB,CACA,yBAA0B,CACzB,KAAK,kBAAkB,aAAa,oBAAoB,eAAgB,KAAK,mBAAmB,EAC5F,KAAK,8BACR,KAAK,4BAA4B,YAAW,EAC5C,KAAK,4BAA8B,OAErC,CACA,MAAM,kBAAmB,CACxB,GAAI,CACH,MAAM6B,GAAiB,MAAM,KAAK,kBAAkB,aAAa,iBAAgB,GAAI,OAAO,CAACtE,EAAKW,IAAW,CAC5G,MAAM5G,EAAO4G,EAAO,KACpB,MAAO,CACN,GAAGX,EACH,CAACjG,CAAI,EAAG,CAAC,GAAGiG,EAAIjG,CAAI,EAAG4G,CAAM,CAClC,CACG,EAAG,CACF,WAAY,CAAA,EACZ,YAAa,CAAA,EACb,WAAY,CAAA,CAChB,CAAI,EACD,KAAK,eAAe,KAAK2D,CAAa,EACtC7B,GAAU,MAAM,yCAA0C,CACzD,YAAa6B,EAAc,WAAW,OACtC,aAAcA,EAAc,YAAY,OACxC,YAAaA,EAAc,WAAW,MAC1C,CAAI,CACF,OAASjsB,EAAO,CACfoqB,GAAU,MAAM,kDAAmDpqB,CAAK,EACxE,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,CAClC,CACD,CACA,MAAM,sBAAsB2qB,EAAY,CACvC,GAAIA,EAAW,OAAS,cAAe,OAAO,KAC9C,GAAI,CACH,MAAMuB,EAAc,KAAK,wBAAwBvB,CAAU,EACrDnsB,EAAS,MAAM,KAAK,kBAAkB,aAAa,aAAa,CACrE,MAAOmsB,EAAW,OAAS,aAAeuB,EAAc,GACxD,MAAOvB,EAAW,OAAS,aAAeuB,EAAc,EAC5D,CAAI,EACKC,GAAgBxB,EAAW,OAAS,aAAensB,EAAO,eAAc,EAAG,CAAC,EAAIA,EAAO,eAAc,EAAG,CAAC,GAAG,gBAAe,EACjI,OAAAA,EAAO,UAAS,EAAG,QAASxD,GAAMA,EAAE,MAAM,EACnCmxB,CACR,OAASnsB,EAAO,CACf,MAAAoqB,GAAU,MAAM,wDAAyDpqB,CAAK,EAC9E,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,EAC3BA,CACP,CACD,CACA,MAAM,cAAc2qB,EAAY,CAC/B,GAAI,CAACA,GAAcA,EAAW,OAAS,cAAe,MAAO,GAC7D,GAAI,CACH,OAAO,MAAM,KAAK,sBAAsBA,CAAU,IAAM,IACzD,MAAQ,CACP,MAAO,EACR,CACD,CACA,SAAU,CACT,KAAK,wBAAuB,EAC5B,MAAM,QAAO,CACd,CACD,EAKIyB,GAAsB,KAAM,CAC/B,aAAc,CACb,GAAI,OAAO,aAAiB,IAAa,MAAM,IAAIlM,GAAyB,cAAc,EAC1F,GAAI,OAAO,eAAmB,IAAa,MAAM,IAAIA,GAAyB,gBAAgB,EAC9F,GAAI,CACH,MAAMmM,EAAU,mBAChB,aAAa,QAAQA,EAAS,MAAM,EACpC,aAAa,WAAWA,CAAO,CAChC,OAASrsB,EAAO,CACf,MAAAyjB,IAAY,MAAM,kCAAmCzjB,CAAK,EACpD,IAAIkgB,GAAyB,cAAc,CAClD,CACD,CACA,QAAQoM,EAAO,CACd,OAAOA,IAAU,QAAU,aAAe,cAC3C,CACA,MAAM,QAAQ1c,EAAK1Q,EAAOotB,EAAQ,UAAW,CAC5C,YAAK,QAAQA,CAAK,EAAE,QAAQ1c,EAAK1Q,CAAK,EAC/B,QAAQ,QAAO,CACvB,CACA,MAAM,QAAQ0Q,EAAK0c,EAAQ,UAAW,CACrC,OAAO,QAAQ,QAAQ,KAAK,QAAQA,CAAK,EAAE,QAAQ1c,CAAG,CAAC,CACxD,CACA,MAAM,WAAWA,EAAK0c,EAAQ,UAAW,CACxC,YAAK,QAAQA,CAAK,EAAE,WAAW1c,CAAG,EAC3B,QAAQ,QAAO,CACvB,CACA,MAAM,MAAM0c,EAAQ,UAAW,CAC9B,MAAMC,EAAQ,KAAK,QAAQD,CAAK,EAC1BE,EAAe,CAAA,EACrB,QAASjxB,EAAI,EAAGA,EAAIgxB,EAAM,OAAQhxB,IAAK,CACtC,MAAMqU,EAAM2c,EAAM,IAAIhxB,CAAC,EACnBqU,GAAA,MAAAA,EAAK,WAAW,QAAQ4c,EAAa,KAAK5c,CAAG,CAClD,CACA,UAAWA,KAAO4c,EAAcD,EAAM,WAAW3c,CAAG,EACpD,OAAO,QAAQ,QAAO,CACvB,CACD,EAII6c,GAAiB,KAAM,CAC1B,YAAYC,EAAc,IAAIN,GAAuB,CACpD,KAAK,YAAcM,CACpB,CAKA,UAAUxtB,EAAO0Q,EAAK,CACrB,GAAwB1Q,GAAU,KAAM,OAAO,KAC/C,GAAI,CACH,OAAO,KAAK,UAAUA,CAAK,CAC5B,OAASjE,EAAG,CACX,MAAM,IAAImlB,GAAmBxQ,GAAO,UAAW3U,CAAC,CACjD,CACD,CAOA,MAAM,QAAQ2U,EAAK1Q,EAAOotB,EAAQ,UAAW,CAC5C,MAAMK,EAAa,KAAK,UAAUztB,EAAO0Q,CAAG,EAC5C,GAAI,CACH,MAAM,KAAK,YAAY,QAAQA,EAAK+c,EAAYL,CAAK,CACtD,OAAStsB,EAAO,CACf,MAAM,IAAIugB,GAAkB3Q,EAAK5P,CAAK,CACvC,CACD,CAYA,MAAM,QAAQ4P,EAAK0c,EAAQ,UAAW,CACrC,IAAI9qB,EACJ,GAAI,CACHA,EAAO,MAAM,KAAK,YAAY,QAAQoO,EAAK0c,CAAK,CACjD,OAAStsB,EAAO,CACf,MAAM,IAAIwgB,GAAiB5Q,EAAK5P,CAAK,CACtC,CACA,GAAI,CAACwB,EAAM,OAAO,KAClB,GAAI,CACH,OAAO,KAAK,MAAMA,CAAI,CACvB,OAASxB,EAAO,CACf,MAAM,IAAIsgB,GAAqB1Q,EAAK5P,CAAK,CAC1C,CACD,CAKA,MAAM,WAAW4P,EAAK0c,EAAQ,UAAW,CACxC,GAAI,CACH,MAAM,KAAK,YAAY,WAAW1c,EAAK0c,CAAK,CAC7C,OAAStsB,EAAO,CACf,MAAM,IAAIugB,GAAkB3Q,EAAK5P,CAAK,CACvC,CACD,CAKA,MAAM,UAAW,CAChB,GAAI,CACH,MAAM,KAAK,YAAY,MAAM,OAAO,EACpC,MAAM,KAAK,YAAY,MAAM,SAAS,CACvC,OAASA,EAAO,CACf,MAAM,IAAIugB,GAAkB,WAAYvgB,CAAK,CAC9C,CACD,CACD,EAII4sB,GAAsB,KAAM,CAC/B,aAAc,CACb,KAAK,eAAiB,GACtB,KAAK,sBAAwB,OAAO,UAAc,IAAc,UAAY,OAC5E,KAAK,SAAW,KAAK,QACrB,KAAK,YAAc,CAAA,CACpB,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,KAAK,EAClB,CACA,IAAI,MAAO,CACV,GAAI,CAAC,KAAK,MAAO,MAAM,IAAInM,GAAgB,MAAM,EACjD,OAAO,KAAK,KACb,CACA,IAAI,KAAKoM,EAAM,CACd,KAAK,MAAQA,CACd,CACA,IAAI,SAAU,CACb,OAAK,KAAK,kBACT,KAAK,eAAL,KAAK,aAAiB,IAAIT,IAC1B,KAAK,gBAAkB,IAAIK,GAAe,KAAK,YAAY,GAErD,KAAK,eACb,CACA,IAAI,MAAO,CACV,YAAK,yBAAL,KAAK,uBAA2B,IAAIpF,GAAsB,KAAK,SAAU,IAAM,KAAK,WAAW,GACxF,KAAK,sBACb,CACA,IAAI,qBAAsB,CACzB,GAAI,CAAC,KAAK,qBAAsB,MAAM,IAAI5G,GAAgB,sBAAsB,EAChF,OAAO,KAAK,oBACb,CACA,IAAI,oBAAoBqM,EAAqB,CAC5C,KAAK,qBAAuBA,CAC7B,CACA,IAAI,WAAY,CACf,GAAI,CAAC,KAAK,sBAAuB,MAAM,IAAIrM,GAAgB,uBAAuB,EAClF,OAAO,KAAK,qBACb,CACA,IAAI,UAAUsM,EAAsB,CACnC,KAAK,sBAAwBA,CAC9B,CACA,IAAI,kBAAmB,CACtB,YAAK,oBAAL,KAAK,kBAAsB,IAAIvC,GAA0B,KAAK,kBAAmB,KAAK,OAAO,GACtF,KAAK,iBACb,CACA,IAAI,mBAAoB,CACvB,GAAI,CAAC,KAAK,mBAAoB,CAC7B,GAAI,OAAO,kBAAsB,KAAe,OAAO,UAAc,IAAa,MAAM,IAAI/J,GAAgB,kJAAkJ,EAC9P,KAAK,mBAAqB,CACzB,kBACA,aAAc,UAAU,YAC5B,CACE,CACA,OAAO,KAAK,kBACb,CACA,IAAI,kBAAkBgK,EAAmB,CACxC,KAAK,mBAAqBA,EAC1B,KAAK,kBAAoB,MAC1B,CACA,IAAI,uBAAwB,CAC3B,MAAO,MAAM,KAAK,MAAM,KACzB,CACA,IAAI,aAAc,CACjB,MAAO,MAAM,KAAK,MAAM,KACzB,CACA,IAAI,kBAAmB,CACtB,MAAO,MAAM,KAAK,MAAM,MACzB,CACA,sBAAuB,OACtB,QAAOvuB,EAAA,KAAK,KAAK,UAAU,CAAC,IAArB,YAAAA,EAAwB,KAAM,EACtC,CACA,IAAI,QAAQorB,EAAS,CACpB,KAAK,SAAWA,EAChB,KAAK,uBAAyB,MAC/B,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,WACb,CACA,IAAI,WAAWW,EAAY,CAC1B,KAAK,YAAcA,CACpB,CACA,IAAI,YAAYyE,EAAa,CAC5B,KAAK,aAAeA,EACpB,KAAK,gBAAkB,MACxB,CACA,IAAI,GAAGM,EAAI,CACV,GAAI,CAACA,EAAI,OACT,MAAMC,EAAWD,EAAG,QAAQ,GAAG,EAC3BC,IAAa,KAChB,KAAK,MAAQD,EAAG,UAAU,EAAGC,CAAQ,EACrC,KAAK,QAAUD,EAAG,UAAUC,EAAW,CAAC,GAEzC,KAAK,SAAW,KAAK,QACrB,KAAK,uBAAyB,MAC/B,CACA,IAAI,WAAY,CACf,MAAO,SAAS,KAAK,OAAS,KAAK,IAAI,KAAK,SAAW,gBAAgB,EACxE,CACA,IAAI,SAAU,CACb,MAAO,kBAAkB,KAAK,SAAW,gBAAgB,EAC1D,CACD,EAIA,MAAMC,GAAYzJ,EAAS,EACrB0J,GAAe,UACfC,GAAkB,EAClBC,GAAkB,OAClBC,GAAc,eAIdC,GAAatc,GAAW,CAC7B,MAAMuc,EAAQ,IAAI,WAAWvc,CAAM,EACnC,IAAIwc,EAAS,GACb,UAAWC,KAAQF,EAAOC,GAAU,OAAO,aAAaC,CAAI,EAC5D,OAAO,KAAKD,CAAM,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,MAAO,EAAE,CAC9E,EAIME,GAAmBhJ,GACjB4I,GAAU,IAAI,YAAW,EAAG,OAAO5I,CAAG,EAAE,MAAM,EAUhDiJ,GAAuB,MAAOC,GAAQ,CAC3C,GAAIA,EAAI,MAAQ,MAAO,MAAM,IAAI,MAAM,4CAA4CA,EAAI,GAAG,0BAA0B,EACpH,MAAMC,EAAY,KAAK,UAAU,CAChC,EAAGD,EAAI,EACP,IAAKA,EAAI,IACT,EAAGA,EAAI,CACT,CAAE,EACD,OAAON,GAAU,MAAM,OAAO,OAAO,OAAO,UAAW,IAAI,YAAW,EAAG,OAAOO,CAAS,CAAC,CAAC,CAC5F,EACA,eAAeC,IAAa,CAC3B,OAAO,IAAI,QAAQ,CAAC5uB,EAASC,IAAW,CACvC,MAAMmH,EAAU,UAAU,KAAK4mB,GAAcC,EAAe,EAC5D7mB,EAAQ,gBAAkB,IAAM,CAC/B,MAAMynB,EAAKznB,EAAQ,OACdynB,EAAG,iBAAiB,SAASX,EAAe,GAAGW,EAAG,kBAAkBX,EAAe,CACzF,EACA9mB,EAAQ,UAAY,IAAMpH,EAAQoH,EAAQ,MAAM,EAChDA,EAAQ,QAAU,IAAMnH,EAAOmH,EAAQ,OAAyB,IAAI,MAAM,0BAA0B,CAAC,CACtG,CAAC,CACF,CACA,eAAe0nB,IAAoB,CAClC,GAAI,CACH,MAAMD,EAAK,MAAMD,GAAU,EAC3B,OAAO,MAAM,IAAI,QAAQ,CAAC5uB,EAASC,IAAW,CAC7C,MAAM8uB,EAAKF,EAAG,YAAYX,GAAiB,UAAU,EAC/Cc,EAAMD,EAAG,YAAYb,EAAe,EAAE,IAAIC,EAAW,EAC3Da,EAAI,UAAY,IAAMhvB,EAAQgvB,EAAI,QAAU,IAAI,EAChDA,EAAI,QAAU,IAAM/uB,EAAO+uB,EAAI,OAAyB,IAAI,MAAM,wCAAwC,CAAC,EAC3GD,EAAG,WAAa,IAAMF,EAAG,MAAK,CAC/B,CAAC,CACF,OAAShuB,EAAO,CACf,OAAAktB,GAAU,KAAK,iDAAkDltB,CAAK,EAC/D,IACR,CACD,CACA,eAAeouB,GAAgBC,EAAS,CACvC,GAAI,CACH,MAAML,EAAK,MAAMD,GAAU,EAC3B,MAAM,IAAI,QAAQ,CAAC5uB,EAASC,IAAW,CACtC,MAAM8uB,EAAKF,EAAG,YAAYX,GAAiB,WAAW,EACtDa,EAAG,YAAYb,EAAe,EAAE,IAAIgB,EAASf,EAAW,EACxDY,EAAG,WAAa,IAAM,CACrBF,EAAG,MAAK,EACR7uB,EAAO,CACR,EACA+uB,EAAG,QAAU,IAAM,CAClBF,EAAG,MAAK,EACR5uB,EAAO8uB,EAAG,OAAyB,IAAI,MAAM,sCAAsC,CAAC,CACrF,CACD,CAAC,CACF,OAASluB,EAAO,CACfktB,GAAU,KAAK,+CAAgDltB,CAAK,CACrE,CACD,CACA,eAAesuB,IAAsB,CACpC,GAAI,CACH,MAAMN,EAAK,MAAMD,GAAU,EAC3B,MAAM,IAAI,QAAQ,CAAC5uB,EAASC,IAAW,CACtC,MAAM8uB,EAAKF,EAAG,YAAYX,GAAiB,WAAW,EACtDa,EAAG,YAAYb,EAAe,EAAE,OAAOC,EAAW,EAClDY,EAAG,WAAa,IAAM,CACrBF,EAAG,MAAK,EACR7uB,EAAO,CACR,EACA+uB,EAAG,QAAU,IAAM,CAClBF,EAAG,MAAK,EACR5uB,EAAO8uB,EAAG,OAAyB,IAAI,MAAM,0CAA0C,CAAC,CACzF,CACD,CAAC,CACF,OAASluB,EAAO,CACfktB,GAAU,KAAK,mDAAoDltB,CAAK,CACzE,CACD,CAgCA,IAAIuuB,GAAmB,KAAM,CAC5B,aAAc,CACb,KAAK,SAAW,KAChB,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,aAAe,EACrB,CAUA,MAAM,MAAO,CACZ,GAAI,KAAK,aAAc,OAAO,KAAK,YACnC,MAAMvE,EAAS,MAAMiE,GAAiB,EACtC,GAAIjE,EAAQ,GAAI,CACf,MAAMwE,EAAW,IAAI,cAAc,OAAO,gBAAgB,EAC1D,aAAM,OAAO,OAAO,KAAK,oBAAqBxE,EAAO,WAAYwE,CAAQ,EACzE,KAAK,SAAWxE,EAChB,KAAK,WAAa,MAAM,OAAO,OAAO,UAAU,MAAOA,EAAO,SAAS,EACvE,KAAK,aAAe,MAAM4D,GAAqB,KAAK,UAAU,EAC9D,KAAK,aAAe,GACpBV,GAAU,MAAM,wDAAyD,KAAK,YAAY,EACnF,KAAK,YACb,OAASltB,EAAO,CACfktB,GAAU,KAAK,uDAAwDltB,CAAK,EAC5E,MAAMsuB,GAAmB,CAC1B,CACA,OAAApB,GAAU,MAAM,gCAAgC,EAChD,KAAK,SAAW,MAAM,OAAO,OAAO,YAAY,CAC/C,KAAM,oBACN,cAAe,KACf,eAAgB,IAAI,WAAW,CAC9B,EACA,EACA,CACJ,CAAI,EACD,KAAM,SACT,EAAK,GAAO,CAAC,OAAQ,QAAQ,CAAC,EAC5B,KAAK,WAAa,MAAM,OAAO,OAAO,UAAU,MAAO,KAAK,SAAS,SAAS,EAC9E,KAAK,aAAe,MAAMU,GAAqB,KAAK,UAAU,EAC9D,KAAK,aAAe,GACpB,MAAMQ,GAAgB,KAAK,QAAQ,EACnClB,GAAU,MAAM,wDAAyD,KAAK,YAAY,EACnF,KAAK,YACb,CAOA,IAAI,aAAc,CACjB,GAAI,CAAC,KAAK,aAAc,MAAM,IAAInL,GAAc,sDAAsD,EACtG,OAAO,KAAK,YACb,CAIA,IAAI,aAAc,CACjB,OAAO,KAAK,YACb,CAUA,MAAM,gBAAgB0M,EAAQ,CAC7B,MAAMrL,EAAU,CACf,IAAK,OAAO,WAAU,EACtB,IAAKqL,EAAO,OACZ,IAAKA,EAAO,IACZ,IAAK,KAAK,MAAM,KAAK,IAAG,EAAK,GAAG,CACnC,EACE,OAAIA,EAAO,cAAarL,EAAQ,IAAMmK,GAAU,MAAM,OAAO,OAAO,OAAO,UAAW,IAAI,YAAW,EAAG,OAAOkB,EAAO,WAAW,CAAC,CAAC,GAC5H,KAAK,UAAUrL,CAAO,CAC9B,CAUA,MAAM,eAAeqL,EAAQ,CAC5B,MAAMrL,EAAU,CACf,IAAK,OAAO,WAAU,EACtB,IAAK,UACL,IAAKqL,EAAO,OACZ,IAAK,KAAK,MAAM,KAAK,IAAG,EAAK,GAAG,CACnC,EACE,OAAO,KAAK,UAAUrL,CAAO,CAC9B,CAKA,SAAU,CACT,KAAK,SAAW,KAChB,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,aAAe,GACpBkL,GAAmB,EACnBpB,GAAU,MAAM,6BAA6B,CAC9C,CACA,IAAI,WAAY,CACf,GAAI,CAAC,KAAK,WAAY,MAAM,IAAInL,GAAc,sDAAsD,EACpG,OAAO,KAAK,UACb,CACA,IAAI,YAAa,CAChB,GAAI,CAAC,KAAK,SAAU,MAAM,IAAIA,GAAc,sDAAsD,EAClG,OAAO,KAAK,SAAS,UACtB,CACA,MAAM,UAAUqB,EAAS,CACxB,MAAMsL,EAAS,CACd,IAAK,WACL,IAAK,QACL,IAAK,KAAK,SACb,EACQC,EAAe,GAAGhB,GAAgB,KAAK,UAAUe,CAAM,CAAC,CAAC,IAAIf,GAAgB,KAAK,UAAUvK,CAAO,CAAC,CAAC,GAC3G,MAAO,GAAGuL,CAAY,IAAIpB,GAAU,MAAM,OAAO,OAAO,KAAK,oBAAqB,KAAK,WAAY,IAAI,YAAW,EAAG,OAAOoB,CAAY,CAAC,CAAC,CAAC,EAC5I,CACD,EAIA,MAAMC,GAAYnL,EAAS,EAK3B,SAASoL,IAA0B,CAClC,OAAO,OAAO,OAAW,KAAe,OAAO,OAAO,kBAAqB,UAC5E,CAKA,SAASC,IAAiB,CACzB,GAAI,OAAO,UAAc,IAAa,OACtC,KAAM,CAAE,WAAA3Y,CAAU,EAAK,UACvB,OAAOA,GAAA,YAAAA,EAAY,gBAAiB,MACrC,CAIA,SAAS4Y,IAAuB,CAC/B,GAAI,SAAO,UAAc,KACzB,OAAO,UAAU,YAAc,MAChC,CAQA,IAAIC,GAAiB,cAAcpJ,EAAY,CAC9C,aAAc,CACb,MAAK,EACL,KAAK,WAAa,KAAK,sBAAsB,OAAO,UAAc,IAAc,UAAU,OAAS,EAAI,EACvG,KAAK,gBAAkB,KAAK,cAAa,EACzC,KAAK,UAAY,KAAK,aAAa,KAAK,IAAI,EAC5C,KAAK,WAAa,KAAK,cAAc,KAAK,IAAI,EAC9C,KAAK,oBAAsB,KAAK,uBAAuB,KAAK,IAAI,EAChE,KAAK,mBAAqB,GAC1B,KAAK,gBAAe,CACrB,CACA,IAAI,WAAY,CACf,OAAO,KAAK,WAAW,aAAY,EAAG,KAAKhO,EAAU,KAAK,WAAW,CAAC,CACvE,CACA,IAAI,UAAW,CACd,OAAO,KAAK,WAAW,KACxB,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,EAAG,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC5E,CACA,SAAU,CACT,KAAK,gBAAe,EACpB,MAAM,QAAO,CACd,CACA,iBAAkB,CACjB,GAAI,CAACiX,GAAuB,EAAI,CAC/BD,GAAU,MAAM,2EAA2E,EAC3F,MACD,CACA,OAAO,iBAAiB,SAAU,KAAK,SAAS,EAChD,OAAO,iBAAiB,UAAW,KAAK,UAAU,EAClD,MAAMzY,EAAa4Y,GAAoB,EACnC5Y,GAAYA,EAAW,iBAAiB,SAAU,KAAK,mBAAmB,EAC9E,KAAK,mBAAqB,GAC1ByY,GAAU,MAAM,0CAA0C,CAC3D,CACA,iBAAkB,CACjB,GAAK,KAAK,mBACV,IAAIC,GAAuB,EAAI,CAC9B,OAAO,oBAAoB,SAAU,KAAK,SAAS,EACnD,OAAO,oBAAoB,UAAW,KAAK,UAAU,EACrD,MAAM1Y,EAAa4Y,GAAoB,EACnC5Y,GAAYA,EAAW,oBAAoB,SAAU,KAAK,mBAAmB,CAClF,CACA,KAAK,mBAAqB,GAC1ByY,GAAU,MAAM,yCAAyC,EAC1D,CACA,cAAe,CACdA,GAAU,KAAK,qCAAqC,EACpD,KAAK,WAAW,KAAK,EAAI,EACzB,KAAK,gBAAgB,KAAK,CACzB,KAAM,SACN,UAAW,KAAK,IAAG,EACnB,YAAaE,GAAc,CAC9B,CAAG,CACF,CACA,eAAgB,CACfF,GAAU,KAAK,sCAAsC,EACrD,KAAK,WAAW,KAAK,EAAK,EAC1B,KAAK,gBAAgB,KAAK,CACzB,KAAM,UACN,UAAW,KAAK,IAAG,CACtB,CAAG,CACF,CACA,wBAAyB,CACxB,MAAMK,EAAcH,GAAc,EAClCF,GAAU,KAAK,sDAAsDK,GAAe,SAAS,EAAE,EAC/F,KAAK,gBAAgB,KAAK,CACzB,KAAM,oBACN,UAAW,KAAK,IAAG,EACnB,YAAAA,CACH,CAAG,CACF,CACD,EAWA,SAASC,GAAaxN,EAAM,CAC3B,GAAI,OAAO,aAAiB,KAAe,OAAO,aAAa,iBAAoB,WAAY,MAAO,CAAA,EACtG,MAAMyK,EAAe,aAAa,gBAAgBzK,CAAI,EACtD,GAAI,CAACyK,EAAc,MAAO,CAAA,EAC1B,MAAMrd,EAAuB,IAAI,IAC3BqgB,EAAS,CAAA,EACf,UAAWC,KAASjD,EAAa,OAAQ,CACxC,MAAMxS,EAAO0V,GAAiBD,EAAM,QAAQ,EACxCzV,GAAQ,CAAC7K,EAAK,IAAI6K,CAAI,IACzB7K,EAAK,IAAI6K,CAAI,EACbwV,EAAO,KAAKxV,CAAI,EAElB,CACA,OAAOwV,CACR,CAIA,SAASE,GAAiBC,EAAU,CACnC,MAAMC,EAAaD,EAAS,QAAQ,GAAG,EACvC,OAAOC,GAAc,EAAID,EAAS,UAAUC,EAAa,CAAC,EAAID,CAC/D,CAOA,SAASE,IAA0B,CAClC,OAAI,OAAO,WAAe,IAAoB,GACvC,0BAA2B,YAAc,8BAA+B,UAChF,CAIA,SAASC,IAA6B,CACrC,OAAI,OAAO,iBAAqB,IAAoB,GAC7C,cAAe,iBAAiB,SACxC,CAKA,SAASC,IAAkB,CAC1B,OAAI,OAAO,aAAiB,IAAoB,GACzC,OAAO,aAAa,UAAU,eAAkB,UACxD,CAWA,SAASC,GAA2BC,EAAU,CAC7C,MAAMC,GAAeD,GAAA,YAAAA,EAAU,eAAgBE,GAAwB,EACjEC,EAAkB,OAAOF,GAAA,YAAAA,EAAc,eAAiB,WACxDG,EAAqB,OAAOH,GAAA,YAAAA,EAAc,kBAAoB,WAC9D1D,EAAe,CACpB,OAAQyD,EAAW,OAAOA,EAAS,mBAAsB,WAAa,OAAO,WAAe,KAAe,sBAAuB,WAClI,aAAcG,EACd,gBAAiBC,EACjB,YAAaA,EACb,iBAAkBC,GAAsB,EACxC,UAAWP,GAAe,EAC1B,kBAAmBF,GAAuB,EAC1C,qBAAsBC,GAA0B,EAChD,YAAaP,GAAa,OAAO,EACjC,YAAaA,GAAa,OAAO,CACnC,EACC,OAAO,OAAO,OAAO/C,CAAY,CAClC,CAOA,SAAS8D,IAAyB,CACjC,GAAI,OAAO,UAAc,IAAa,MAAO,GAC7C,MAAMJ,EAAeC,GAAwB,EAC7C,MAAI,CAACD,GAAgB,OAAOA,EAAa,iBAAoB,WAAmB,GACzE,UAAU,UAAU,SAAS,SAAS,CAC9C,CAIA,SAASC,IAA2B,CACnC,OAAI,OAAO,UAAc,IAAoB,UAAU,aAChD,IACR,CAIA,MAAMI,GAAYzM,EAAS,EACrB0M,GAAgC,GAChCC,GAA2B,IAC3BC,GAA2B,IAC3BC,GAAyB,IAU/B,IAAIC,GAAkB,cAAc3K,EAAY,CAC/C,YAAY4K,EAAkBC,EAAYC,EAAaC,EAAgBC,EAAQ/a,EAAU,GAAI,CAC5F,MAAK,EACL,KAAK,iBAAmB2a,EACxB,KAAK,WAAaC,EAClB,KAAK,YAAcC,EACnB,KAAK,eAAiBC,EACtB,KAAK,OAASC,EACd,KAAK,SAAW,CACf,SAAU/a,EAAQ,UAAYsa,GAC9B,cAAeta,EAAQ,eAAiB,GACxC,YAAaA,EAAQ,YACrB,YAAaA,EAAQ,WACxB,CACC,CAKA,MAAM,IAAInS,EAAa,CACtB,MAAMmtB,EAAW,CAAA,EACjB,GAAI,CACH,MAAMC,EAAY,KAAK,cAAa,EAC/BA,EAAU,WAAWD,EAAS,KAAK,yBAAyB,EACjE,MAAMjG,EAAU,MAAM,KAAK,YAAW,EACjCA,EAAQ,WAAW,SAASiG,EAAS,KAAK,gCAAgC,EAC1EjG,EAAQ,WAAW,SAASiG,EAAS,KAAK,gCAAgC,EAC/E,MAAME,EAAe,MAAM,KAAK,oBAAmB,EAC/CA,EAAa,OAAS,SAAUF,EAAS,KAAK,uDAAuD,EAChGE,EAAa,OAAS,SAASF,EAAS,KAAK,yDAAyD,EAC1GE,EAAa,eAAeF,EAAS,KAAK,4BAA4B,EAC3E,IAAIG,EAAY,KAChB,GAAI,CAAC,KAAK,SAAS,cAAe,GAAI,CACrCA,EAAY,MAAM,KAAK,mBAAmBttB,CAAW,CACtD,OAAS1D,EAAO,CACfkwB,GAAU,KAAK,iDAAkDlwB,CAAK,EACtE6wB,EAAS,KAAK,6BAA6B,CAC5C,CACA,MAAO,CACN,GAAIC,EAAU,WAAaC,EAAa,OAAS,UAAYnG,EAAQ,WAAW,QAChF,UAAAkG,EACA,aAAAC,EACA,UAAAC,EACA,QAAApG,EACA,SAAAiG,CACJ,CACE,OAAS7wB,EAAO,CACf,MAAAkwB,GAAU,MAAM,2CAA4ClwB,CAAK,EAC3D,IAAIgiB,GAAe,YAAahiB,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,CAChG,QAAC,CACA,KAAK,QAAO,CACb,CACD,CACA,eAAgB,CACf,MAAO,CACN,UAAW,KAAK,YAChB,MAAO,KAAK,cACf,CACC,CACA,MAAM,aAAc,CACnB,MAAMixB,EAAc,KAAK,SAAS,aAAe,KAAK,iBAAiB,yBACjEC,EAAc,KAAK,SAAS,aAAe,KAAK,iBAAiB,yBACjEC,EAAoB,KAAK,iBAAiB,0BAChD,IAAIC,EAAe,GACfC,EAAe,GACfC,EACJ,GAAI,CACH,MAAMpF,EAAc,CAAA,EAChB+E,EAAa/E,EAAY,MAAQ,CAAE,SAAU,CAAE,MAAO+E,EAAY,SAAU,EAC3E/E,EAAY,MAAQ,GACrBgF,EAAahF,EAAY,MAAQ,CAAE,SAAU,CAAE,MAAOgF,EAAY,SAAU,EAC3EhF,EAAY,MAAQ,GACzBoF,EAAc,MAAM,QAAQ,KAAK,CAAC,UAAU,aAAa,aAAapF,CAAW,EAAG,IAAI,QAAQ,CAAC5vB,EAAG8C,IAAW,WAAW,IAAMA,EAAuB,IAAI,MAAM,sBAAsB,CAAC,EAAGkxB,EAAsB,CAAC,CAAC,CAAC,EACpN,UAAWiB,KAASD,EAAY,YAC3BC,EAAM,OAAS,SAAWA,EAAM,aAAe,SAAQH,EAAe,IACtEG,EAAM,OAAS,SAAWA,EAAM,aAAe,SAAQF,EAAe,GAE5E,OAASrxB,EAAO,CACfkwB,GAAU,KAAK,wCAAyClwB,CAAK,CAC9D,QAAC,CACIsxB,GAAaA,EAAY,UAAS,EAAG,QAASt2B,GAAMA,EAAE,MAAM,CACjE,CACA,MAAO,CACN,WAAY,CACX,QAASo2B,EACT,OAAQH,CACZ,EACG,WAAY,CACX,QAASI,EACT,OAAQH,CACZ,EACG,YAAa,CACZ,UAAW,CAAC,CAACC,EACb,OAAQA,CACZ,CACA,CACC,CACA,MAAM,qBAAsB,CAC3B,IAAIK,EACJ,GAAI,CACHA,EAAK,IAAI,kBAAkB,CAAE,WAAY,KAAK,UAAU,CAAE,EAC1D,MAAMC,EAAiBD,EACjBE,EAAiC,IAAI,IACrCC,EAAY,KAAK,IAAG,EACpBC,EAAoB,IAAI,QAASzyB,GAAY,CAClD,MAAM0yB,EAAU,WAAW1yB,EAASixB,EAAwB,EAC5DqB,EAAe,eAAkBnN,GAAU,CAC1C,GAAIA,EAAM,UAAW,CACpB,MAAMwN,EAAexN,EAAM,UAAU,UACjCwN,EAAa,SAAS,UAAU,GAAGJ,EAAe,IAAI,MAAM,EAC5DI,EAAa,SAAS,WAAW,GAAGJ,EAAe,IAAI,OAAO,EAC9DI,EAAa,SAAS,WAAW,GAAGJ,EAAe,IAAI,OAAO,CACnE,MACC,aAAaG,CAAO,EACpB1yB,EAAO,CAET,CACD,CAAC,EACDqyB,EAAG,kBAAkB,gBAAgB,EACrC,MAAMO,EAAQ,MAAMP,EAAG,YAAW,EAClC,MAAMA,EAAG,oBAAoBO,CAAK,EAClC,MAAMH,EACN,MAAMI,EAAQ,KAAK,IAAG,EAAKL,EACrBM,EAAgBP,EAAe,IAAI,OAAO,EAC1CQ,EAAgBR,EAAe,IAAI,OAAO,EAC1CS,EAAUT,EAAe,IAAI,MAAM,EACzC,IAAIU,EAAO,SACX,OAAID,GAAWF,EAAeG,EAAO,SAC5BF,IAAeE,EAAO,SACxB,CACN,KAAAA,EACA,cAAAF,EACA,cAAAD,EACA,MAAAD,CACJ,CACE,OAAShyB,EAAO,CACf,OAAAkwB,GAAU,KAAK,kDAAmDlwB,CAAK,EAChE,CACN,KAAM,SACN,cAAe,GACf,cAAe,GACf,MAAO,CACX,CACE,QAAC,CACIwxB,GAAIA,EAAG,MAAK,CACjB,CACD,CACA,MAAM,mBAAmB9tB,EAAa,CACrC,IAAItF,EACJ,GAAI,CACHA,EAAO,MAAM,KAAK,OAAOsF,EAAa,CACrC,MAAO,GACP,MAAO,EACX,CAAI,EACD,MAAMsK,GAAe5P,EAAK,QAAQ,KAAKuU,EAAQzX,GAAMA,IAAM,WAAW,EAAG4Z,GAAK,CAAC,EAAG5R,GAAQmtB,EAAwB,CAAC,CAAC,EACpH,MAAMgC,EAAa,KAAK,SAAS,SAAW,IAC5C,MAAM,IAAI,QAASlzB,GAAY,WAAWA,EAASkzB,CAAU,CAAC,EAC9D,MAAMC,EAAUl0B,EAAK,eACrB,IAAIm0B,EAAa,EACbC,EAAe,EACnB,GAAIF,EAAQ,OAAS,EAAG,CACvB,MAAMG,EAASH,EAAQA,EAAQ,OAAS,CAAC,EACrCG,EAAO,2BAA6B,SAAQF,EAAa,KAAK,MAAME,EAAO,yBAA2B,GAAG,GAC7G,MAAMC,EAAeD,EAAO,MAAM,gBAAkBA,EAAO,MAAM,gBAC7DJ,EAAa,GAAKK,EAAe,IAAGF,EAAeD,EACxD,CACA,MAAO,CACN,WAAAA,EACA,aAAAC,CACJ,CACE,QAAC,CACA,GAAIp0B,EAAM,GAAI,CACb,MAAMA,EAAK,OAAM,CAClB,MAAQ,CAAC,CACV,CACD,CACA,SAAU,CACT,MAAM,QAAO,CACd,CACD,EAIA,MAAMu0B,GAAYlP,EAAS,EAI3B,SAASmP,IAA2B,CACnC,GAAI,CACH,OAAO,OAAO,SAAa,KAAe,OAAO,SAAS,kBAAqB,YAAc,OAAO,SAAS,iBAAoB,QAClI,MAAQ,CACP,MAAO,EACR,CACD,CAKA,SAASC,IAAuB,CAC/B,GAAI,CACH,GAAI,OAAO,SAAa,KAAe,OAAO,SAAS,iBAAoB,SAAU,OAAO,SAAS,kBAAoB,UAAY,UAAY,QAClJ,MAAQ,CAAC,CACT,MAAO,SACR,CAQA,IAAIC,GAAuB,cAAclN,EAAY,CACpD,aAAc,CACb,MAAK,EACL,KAAK,aAAe,KAAK,sBAAsBiN,GAAoB,CAAE,EACrE,KAAK,mBAAqB,KAAK,cAAa,EAC5C,KAAK,kBAAoBD,GAAwB,EACjD,KAAK,cAAgB,KAAK,wBAAwB,KAAK,IAAI,EACvD,KAAK,mBACR,SAAS,iBAAiB,mBAAoB,KAAK,aAAa,EAChED,GAAU,MAAM,6DAA6D,GACvEA,GAAU,MAAM,oFAAoF,CAC5G,CAKA,IAAI,aAAc,CACjB,OAAO,KAAK,aAAa,KAAK/a,EAAU,KAAK,WAAW,CAAC,CAC1D,CAIA,IAAI,YAAa,CAChB,OAAO,KAAK,aAAa,KAC1B,CAKA,IAAI,mBAAoB,CACvB,OAAO,KAAK,mBAAmB,KAAKA,EAAU,KAAK,WAAW,CAAC,CAChE,CACA,SAAU,CACL,KAAK,oBACR,SAAS,oBAAoB,mBAAoB,KAAK,aAAa,EACnE+a,GAAU,MAAM,yDAAyD,GAE1E,MAAM,QAAO,CACd,CAIA,yBAA0B,CACzB,MAAMI,EAAWF,GAAoB,EAC/BG,EAAgB,KAAK,aAAa,MACxC,GAAID,IAAaC,EAAe,OAChC,KAAK,aAAa,KAAKD,CAAQ,EAC/B,MAAME,EAAc,CACnB,KAAMD,EACN,GAAID,EACJ,UAAW,KAAK,IAAG,CACtB,EACE,KAAK,mBAAmB,KAAKE,CAAW,EACxCN,GAAU,MAAM,2CAA4C,CAC3D,KAAMK,EACN,GAAID,CACP,CAAG,CACF,CACD,EAIIG,GAAY,cAActN,EAAY,CACzC,YAAYuN,EAAUC,EAAM,CAC3B,MAAK,EACL,KAAK,SAAWD,EAChB,KAAK,KAAOC,EACZ,KAAK,SAAWthB,GAAM,IAAM3R,GAAK,KAAK,MAAK,CAAE,CAAC,EAAE,KAAK6W,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,CAChG,CACA,MAAM,OAAQ,CACb,MAAM4M,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,IAAK,KAAK,SACV,OAAQ,MACR,QAAS,CAAE,OAAQ,kBAAkB,CACxC,CAAG,EACD,GAAIA,EAAS,IAAMA,EAAS,KAAM,CACjC,MAAMzD,EAAO,KAAK,MAAMyD,EAAS,IAAI,EACrC,YAAK,iBAAiBzD,CAAI,EACnB,EACR,CACA,MAAO,EACR,CACD,EAUIsS,GAAO,cAAcH,EAAU,CAClC,YAAYE,EAAM,CACjB,MAAM,8BAA+BA,CAAI,CAC1C,CACA,iBAAiBrS,EAAM,CACtB,KAAK,GAAKA,EAAK,GACf,KAAK,MAAQA,EAAK,MAClB,KAAK,UAAYA,EAAK,WACtB,KAAK,SAAWA,EAAK,UACrB,KAAK,YAAcA,EAAK,aACxB,KAAK,SAAWA,EAAK,UACrB,KAAK,SAAWA,EAAK,UACrB,KAAK,QAAUA,EAAK,QACpB,KAAK,OAASA,EAAK,OACnB,KAAK,YAAcA,EAAK,aACxB,KAAK,oBAAsBA,EAAK,sBAChC,KAAK,YAAcA,EAAK,aAAe,CACtC,YAAaA,EAAK,aAAa,aAC/B,OAAQA,EAAK,aAAa,MAC7B,EAAM,OACJ,KAAK,UAAYA,EAAK,iBACtB,KAAK,UAAYA,EAAK,UACvB,CACD,EAIA,MAAMuS,GAAmB7E,IACjB,CACN,QAAS,MACT,GAAIA,EAAO,IAAMjJ,GAAE,EACnB,GAAGiJ,CACL,GAEM8E,GAAmB9E,IACjB,CACN,QAAS,MACT,GAAGA,CACL,GAKM+E,GAA0B,CAC/B,MAAO,EACP,MAAO,EACP,SAAU,CACX,EACMC,GAAchF,GACZ6E,GAAgB,CACtB,OAAQ,qBACR,OAAQ,CACP,QAASE,GACT,WAAY,GACZ,GAAG/E,CACN,CACA,CAAE,EAKIiF,GAAqBjF,GAAW,CACrC,KAAM,CAAE,WAAAkF,EAAY,GAAGC,CAAU,EAAKnF,EACtC,OAAO6E,GAAgB,CACtB,OAAQ,4BACR,OAAQ,CACP,eAAgBM,EAChB,GAAGD,EAAa,CAAE,WAAAA,GAAe,CAAA,CACpC,CACA,CAAE,CACF,EAIME,GAAkB,CAACprB,EAAIhC,IACrB8sB,GAAgB,CACtB,GAAA9qB,EACA,OAAQ,CAAE,UAAwB,KAAK,IAAG,EAAK,GAAG,CACpD,CAAE,EAKIqrB,GAAa,CAAC,CAAE,OAAA7a,EAAQ,OAAAwV,KACtB6E,GAAgB,CACtB,OAAAra,EACA,OAAAwV,CACF,CAAE,EAKIsF,GAAyB,CAC9B,GAAI,SACJ,kBAAmB,qBACnB,iBAAkB,wBAClB,mBAAoB,0BACpB,WAAY,iBACZ,aAAc,mBACd,kBAAmB,wBACpB,EACMC,GAAyB,IAAI,IAAI,CACtC,YACA,cACA,cACD,CAAC,EAMKC,GAAqBxF,GAAW,CACrC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAQ,cAAc,EAAG,OAAOA,EAC1E,MAAMyF,EAAqBzF,EAAO,aAC5B0F,EAAuB,OAAO,QAAQD,CAAkB,EAAE,OAAO,CAACvM,EAAK,CAAC/X,EAAK1Q,CAAK,IAAM,CAC7F,GAAI80B,GAAuB,IAAIpkB,CAAG,EAAG,OAAO+X,EAC5C,MAAMyM,EAAYL,GAAuBnkB,CAAG,GAAKA,EACjD,MAAO,CACN,GAAG+X,EACH,CAACyM,CAAS,EAAGl1B,CAChB,CACC,EAAG,CAAA,CAAE,EACL,MAAO,CACN,GAAGuvB,EACH,aAAc0F,CAChB,CACA,EACME,GAAwBpb,GACtB,CAACwV,EAAS,KACT6E,GAAgB,CACtB,OAAAra,EACA,OAAQgb,GAAkBxF,CAAM,CACnC,CAAG,EAGG6F,GAAe7F,GACb6E,GAAgB,CACtB,OAAQ,eACR,OAAA7E,CACF,CAAE,EAEI8F,GAAcF,GAAqB,cAAc,EACjDG,GAAWH,GAAqB,WAAW,EAE3CI,GAAcJ,GAAqB,cAAc,EACjDK,GAAYL,GAAqB,YAAY,EAC7CM,GAAcN,GAAqB,cAAc,EACjDO,GAAiBP,GAAqB,iBAAiB,EACvDQ,GAAYR,GAAqB,YAAY,EAC7CS,GAAqB,CAC1B,gBAAiB,KACjB,UAAW,KACX,cAAe,KAChB,EAIMC,GAAuBtsB,GAAO8qB,GAAgB,CACnD,GAAA9qB,EACA,OAAQ,CAAA,CACT,CAAC,EAIKusB,GAAYvR,EAAS,EAC3B,IAAIwR,GAAgB,KAAM,CACzB,YAAY/K,EAASsG,EAAkB0E,EAAuBC,EAAW,CACxE,KAAK,QAAUjL,EACf,KAAK,iBAAmBsG,EACxB,KAAK,sBAAwB0E,EAC7B,KAAK,UAAYC,EACjB,KAAK,WAAa,QAAQ,QAAO,CAClC,CACA,MAAM,WAAY,CACjB,MAAM,KAAK,OAAQC,IACX,CAAA,EACP,CACF,CACA,WAAWC,EAAS,CACnB,KAAK,QAAUA,CAChB,CACA,MAAM,cAAe,CACpB,GAAI,CACH,OAAO,MAAM,KAAK,QAAQ,QAAQ,KAAK,SAAS,GAAK,CAAA,CACtD,OAASr1B,EAAO,CACf,OAAAg1B,GAAU,KAAK,iEAAkEh1B,CAAK,EAC/E,CAAA,CACR,CACD,CACA,MAAM,cAAco1B,EAAU,CAC7B,GAAI,CACH,MAAM,KAAK,QAAQ,QAAQ,KAAK,UAAWA,CAAQ,CACpD,OAASp1B,EAAO,CACfg1B,GAAU,KAAK,4DAA6Dh1B,CAAK,CAClF,CACD,CAOA,MAAM,OAAOs1B,EAAS,CACrB,MAAMzxB,EAAO,KAAK,WAAW,KAAK,SAAY,CAC7C,MAAM0xB,EAAU,MAAMD,EAAQ,MAAM,KAAK,aAAY,CAAE,EACvD,MAAM,KAAK,cAAcC,CAAO,CACjC,CAAC,EACD,YAAK,WAAa1xB,EAAK,MAAM,IAAA,EAAY,EAClCA,CACR,CACA,MAAM,OAAOzF,EAAM,CAClB,GAAI,CAACA,EAAK,GAAI,CACb42B,GAAU,KAAK,2DAA2D,EAC1E,MACD,CACA,MAAMtxB,EAActF,EAAK,GACnBo3B,EAAa,CAClB,OAAQp3B,EAAK,OACb,YAAAsF,EACA,gBAAiBtF,EAAK,gBACtB,iBAAkBA,EAAK,gBAAgB,QAAU,WAAa,KAAK,iBAAiB,yBAA2B,KAC/G,iBAAkBA,EAAK,gBAAgB,QAAU,WAAa,KAAK,iBAAiB,yBAA2B,KAC/G,WAAY,KAAK,IAAG,CACvB,EACE,MAAM,KAAK,OAAQg3B,IAAc,CAChC,GAAGA,EACH,CAACh3B,EAAK,EAAE,EAAGo3B,CACd,EAAI,CACH,CACA,MAAM,OAAOp3B,EAAM,CAClB,MAAM,KAAK,OAAQg3B,GAAa,CAC/B,KAAM,CAAE,CAACh3B,EAAK,EAAE,EAAG9B,EAAG,GAAGm5B,CAAS,EAAKL,EACvC,OAAOK,CACR,CAAC,CACF,CACA,MAAM,OAAQ,CACb,MAAM,KAAK,OAAO,KAAO,CAAA,EAAG,CAC7B,CAgBA,MAAM,eAAgB,CACrB,MAAML,EAAW,MAAM,KAAK,aAAY,EACxC,MAAM,KAAK,cAAa,EACxB,SAAW,CAACM,EAAQF,CAAU,IAAK,OAAO,QAAQJ,CAAQ,EAAG,CAC5D,KAAM,CAAE,YAAA1xB,CAAW,EAAK8xB,EAClB3f,EAAU,KAAK,iBAAiB2f,CAAU,EAChD,IAAIG,EAAY,GAChB,QAASC,EAAU,EAAGA,GAAW,EAAGA,IAAW,GAAI,CAClD,MAAM,KAAK,QAAQ,mBAAmBlyB,EAAa,CAClD,OAAAgyB,EACA,GAAG7f,CACR,CAAK,EACDmf,GAAU,KAAK,mCAAmCU,CAAM,aAAaE,CAAO,GAAG,EAC/ED,EAAY,GACZ,KACD,OAAS31B,EAAO,CACfg1B,GAAU,KAAK,oCAAoCY,CAAO,sBAAsBF,CAAM,IAAK11B,CAAK,EAC5F41B,EAAU,GAAG,MAAM,IAAI,QAASv6B,GAAM,WAAWA,GAAIu6B,EAAU,GAAK,GAAG,CAAC,CAC7E,CACKD,IACJX,GAAU,KAAK,6DAA6DU,CAAM,sBAAsB,EACxG,MAAM,KAAK,OAAO,CACjB,GAAIA,EACJ,gBAAiBF,EAAW,eACjC,CAAK,EAEH,CACD,CAKA,iBAAiBA,EAAY,CAC5B,KAAM,CAAE,MAAOK,EAAgB,MAAOC,CAAc,EAAKN,EAAW,gBAC9D,CAAE,iBAAAO,EAAkB,iBAAAC,EAAkB,OAAAC,CAAM,EAAKT,EACjDU,EAAeL,EAAe,SAAS,MAAM,EAC7CM,EAAeL,EAAe,SAAS,MAAM,EAC7CM,EAAYP,EAAe,SAAS,MAAM,EAC1CQ,EAAYP,EAAe,SAAS,MAAM,EAChD,MAAO,CACN,OAAAG,EACA,aAAAC,EACA,aAAAC,EACA,4BAA6BC,EAAY,CACxC,MAAO,GACP,GAAG,KAAK,iBAAiB,wBAAwBL,CAAgB,CACrE,EAAO,OACJ,4BAA6BM,EAAY,CACxC,MAAO,GACP,GAAG,KAAK,iBAAiB,wBAAwBL,CAAgB,CACrE,EAAO,OACJ,SAAU,EACb,CACC,CAUA,MAAM,yBAAyBN,EAAQ,CACtC,MAAMN,EAAW,MAAM,KAAK,aAAY,EACxC,GAAK,OAAO,OAAOA,EAAUM,CAAM,EACnC,OAAO,KAAK,iBAAiBN,EAASM,CAAM,CAAC,CAC9C,CACA,MAAM,eAAgB,CACrB,MAAM1tB,EAAM,KAAK,IAAG,EACd0f,EAAY,KAAK,sBACvB,MAAM,KAAK,OAAQ0N,GAAa,CAC/B,MAAMK,EAAY,CAAE,GAAGL,CAAQ,EAC/B,IAAIkB,EAAU,GACd,SAAW,CAACZ,EAAQF,CAAU,IAAK,OAAO,QAAQJ,CAAQ,EAAOptB,EAAMwtB,EAAW,WAAa9N,IAC9F,OAAO+N,EAAUC,CAAM,EACvBY,EAAU,IAEX,OAAOA,EAAUb,EAAYL,CAC9B,CAAC,CACF,CACD,EAOA,MAAMmB,GAAiB,CACtB,GAAI,GACJ,IAAK,EACN,EAIMC,GAA8B,CACnC,UAAWD,GACX,UAAWA,GACX,KAAMA,GACN,UAAWA,GACX,iBAAkB,GAClB,sBAAuB,GACvB,cAAe,GACf,SAAU,GACV,KAAM,GACN,OAAQ,GACR,WAAY,GACZ,QAAS,GACT,WAAY,EACb,EAIME,GAA4B,CACjC,KAAMD,GACN,OAAQA,GACR,IAAK,GACL,UAAW,GACX,UAAW,GACX,WAAYD,GACZ,KAAMA,GACN,OAAQ,GACR,YAAa,EACd,EAaA,SAASG,GAAuBC,EAAe,CAC9C,OAAIA,EAAc,SAAW,EAAUJ,GAChC,CACN,GAAII,EAAc,KAAMC,GAAS,CAACA,EAAK,SAAS,MAAM,CAAC,EACvD,IAAKD,EAAc,KAAMC,GAAS,CAACA,EAAK,SAAS,KAAK,CAAC,CACzD,CACA,CASA,SAASC,GAAuBC,EAAOC,EAAYp0B,EAAQq0B,EAAY,CACtE,OAAOF,EAAM,OAAQF,GAASA,IAASG,GAAcH,IAAS,GAAGG,CAAU,IAAIp0B,CAAM,IAAMi0B,EAAK,WAAW,GAAGG,CAAU,IAAIp0B,CAAM,IAAIq0B,CAAU,EAAE,CAAC,CACpJ,CASA,SAASC,GAAqBH,EAAOC,EAAYp0B,EAAQq0B,EAAY,CACpE,OAAOF,EAAM,KAAMF,GAASA,IAASG,GAAcp0B,IAAW,MAAQi0B,IAAS,GAAGG,CAAU,IAAIp0B,CAAM,IAAMi0B,EAAK,WAAW,GAAGG,CAAU,IAAIp0B,EAAS,GAAGA,CAAM,IAAM,EAAE,GAAGq0B,CAAU,EAAE,CAAC,CACxL,CAIA,SAASE,GAA0BJ,EAAOC,EAAY,CACrD,OAAID,EAAM,OAAQF,GAASA,EAAK,WAAWG,CAAU,GAAKH,IAASG,CAAU,EAAE,SAAW,EAAUP,GAC7F,CACN,UAAWE,GAAuBG,GAAuBC,EAAOC,EAAY,OAAQ,OAAO,CAAC,EAC5F,UAAWL,GAAuBG,GAAuBC,EAAOC,EAAY,OAAQ,OAAO,CAAC,EAC5F,KAAML,GAAuBI,EAAM,OAAQF,GAASA,IAASG,GAAcH,EAAK,WAAW,GAAGG,CAAU,OAAO,CAAC,CAAC,EACjH,UAAWL,GAAuBI,EAAM,OAAQF,GAASA,IAASG,GAAcH,EAAK,WAAW,GAAGG,CAAU,YAAY,CAAC,CAAC,EAC3H,iBAAkBE,GAAqBH,EAAOC,EAAY,aAAc,QAAQ,EAChF,sBAAuBE,GAAqBH,EAAOC,EAAY,aAAc,aAAa,EAC1F,cAAeE,GAAqBH,EAAOC,EAAY,UAAW,QAAQ,EAC1E,SAAUE,GAAqBH,EAAOC,EAAY,KAAM,UAAU,EAClE,KAAME,GAAqBH,EAAOC,EAAY,KAAM,MAAM,EAC1D,OAAQE,GAAqBH,EAAOC,EAAY,KAAM,QAAQ,EAC9D,WAAYE,GAAqBH,EAAOC,EAAY,KAAM,YAAY,EACtE,QAASE,GAAqBH,EAAOC,EAAY,KAAM,SAAS,EAChE,WAAYE,GAAqBH,EAAOC,EAAY,KAAM,YAAY,CACxE,CACA,CAUA,SAASI,GAAoBhL,EAAc,CAC1C,OAAIA,EAAa,SAAW,EAAUsK,GAC/B,CACN,KAAMS,GAA0B/K,EAAc,MAAM,EACpD,OAAQ+K,GAA0B/K,EAAc,QAAQ,EACxD,IAAKA,EAAa,KAAMiL,GAAQA,IAAQ,KAAK,EAC7C,UAAWjL,EAAa,KAAMiL,GAAQA,EAAI,WAAW,QAAQ,CAAC,EAC9D,UAAWjL,EAAa,KAAMiL,GAAQA,EAAI,WAAW,OAAO,CAAC,EAC7D,WAAYV,GAAuBvK,EAAa,OAAQyK,GAASA,EAAK,WAAW,QAAQ,CAAC,CAAC,EAC3F,KAAMF,GAAuBvK,EAAa,OAAQyK,GAASA,EAAK,WAAW,MAAM,CAAC,CAAC,EACnF,OAAQzK,EAAa,KAAMiL,GAAQA,IAAQ,QAAQ,EACnD,YAAajL,EAAa,KAAMiL,GAAQA,IAAQ,aAAa,CAC/D,CACA,CAqBA,IAAIC,GAAmB,cAAczR,EAAY,CAChD,eAAe0R,EAAO,CACrB,MAAM,GAAGA,CAAK,EACd,KAAK,QAAU,KAAK,sBAAsBb,EAAyB,CACpE,CAQA,cAActK,EAAc,CAC3B,MAAM4G,EAAWoE,GAAoBhL,CAAY,EACjD,KAAK,QAAQ,KAAK4G,CAAQ,CAC3B,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAK/jB,EAAK3G,GAAUA,EAAM,IAAI,EAAG2M,EAAoB,CAAE,CAAC,CAClH,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,MAAM,EAAG2M,EAAoB,CAAE,CAAC,CACtH,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MAAM,MAC3B,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,iBAAiB,OAAQ,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,GAAG,EAAG2M,EAAoB,CAAE,CAAC,CAChH,CAEA,IAAI,KAAM,CACT,OAAO,KAAK,QAAQ,MAAM,GAC3B,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,SAAS,EAAG2M,EAAoB,CAAE,CAAC,CAC5H,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,MAAM,SAC3B,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,SAAS,EAAG2M,EAAoB,CAAE,CAAC,CAC5H,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,MAAM,SAC3B,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,CAAE,CAAC,CAC9H,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,UAC3B,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,IAAI,EAAG2M,EAAoB,CAAE,CAAC,CAClH,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,MAAM,EAAG2M,EAAoB,CAAE,CAAC,CACtH,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MAAM,MAC3B,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,QAAQ,KAAKhG,EAAK3G,GAAUA,EAAM,WAAW,EAAG2M,EAAoB,CAAE,CAAC,CAChI,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,QAAQ,MAAM,WAC3B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,aAAY,CACjC,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,QAAQ,KACrB,CACD,EAIA,SAASuiB,GAAiBC,EAAI,CAC7B,OAAOA,EAAK,cAAgB,WAC7B,CACA,SAASC,GAAsBD,EAAI,CAClC,OAAOA,EAAK,iBAAmB,gBAChC,CAIA,MAAME,GAAYjU,EAAS,EACrBkU,GAAe,CAAA,EAQrB,IAAIC,GAAc,cAAchS,EAAY,CAC3C,YAAYnd,EAAIovB,EAAerH,EAAkB,CAChD,MAAK,EACL,KAAK,cAAgBqH,EACrB,KAAK,iBAAmBrH,EACxB,KAAK,QAAU,KAAK,sBAAsBmH,EAAY,EACtD,KAAK,GAAKlvB,CACX,CAEA,OAAOsY,EAAM,CACZ,KAAK,QAAQ,KAAK,CACjB,GAAG,KAAK,QAAQ,MAChB,GAAGA,CACN,CAAG,CACF,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAKoD,EAAO9b,GAAUA,EAAM,IAAI,EAAGyvB,EAAsB,CAAE,CAAC,CACtH,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,IAAI,EAAGyvB,EAAsB,CAAE,CAAC,CACtH,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,UAAU,EAAGyvB,EAAsB,CAAE,CAAC,CAClI,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,iBAAiB,WAAY,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,OAAO,EAAGyvB,EAAsB,CAAE,CAAC,CAC5H,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,WAAW,EAAGyvB,EAAsB,CAAE,CAAC,CACnI,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,WAAW,EAAGyvB,EAAsB,CAAE,CAAC,CACnI,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,IAAI,EAAGyvB,EAAsB,CAAE,CAAC,CACtH,CASA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,YAAY,EAAGyvB,EAAsB,CAAE,CAAC,CACrI,CAQA,IAAI,eAAgB,CACnB,OAAO,KAAK,iBAAiB,gBAAiB,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,aAAa,EAAGyvB,EAAsB,CAAE,CAAC,CACvI,CASA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,iBAAiB,EAAGyvB,EAAsB,CAAE,CAAC,CAC/I,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,iBAAiB,EAAGyvB,EAAsB,CAAE,CAAC,CAC/I,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,iBAAiB,YAAa,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,SAAS,EAAGyvB,EAAsB,CAAE,CAAC,CAC/H,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,iBAAiB,EAAGyvB,EAAsB,CAAE,CAAC,CAC/I,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,UAAU,EAAGyvB,EAAsB,CAAE,CAAC,CAClI,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,iBAAiB,WAAY,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,OAAO,EAAGyvB,EAAsB,CAAE,CAAC,CAC5H,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,IAAI,EAAGyvB,EAAsB,CAAE,CAAC,CACtH,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,aAAa,EAAGyvB,EAAsB,CAAE,CAAC,CACjI,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,UAAU,EAAGyvB,EAAsB,CAAE,CAAC,CACjI,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,OAAO,EAAGyvB,EAAsB,CAAE,CAAC,CAC3H,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,OAAO,EAAGyvB,EAAsB,CAAE,CAAC,CAC9H,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,MAAM,SAAW,EACtC,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,iBAAiB,YAAa,IAAM,KAAK,QAAQ,KAAK3T,EAAO9b,GAAUA,EAAM,QAAQ,EAAGyvB,EAAsB,CAAE,CAAC,CAC9H,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,QAAQ,MAAM,QAC3B,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,YAAc,EACzC,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,YAAc,EACzC,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,MAAM,SAAW,EACtC,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,aAAe,EAC1C,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,aAAe,EAC1C,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,MAAQ,EACnC,CAMA,IAAI,aAAc,CACjB,OAAO,KAAK,QAAQ,MAAM,YAC3B,CAKA,IAAI,cAAe,CAClB,OAAO,KAAK,QAAQ,MAAM,aAC3B,CAKA,IAAI,kBAAmB,CACtB,OAAO,KAAK,QAAQ,MAAM,iBAC3B,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,QAAQ,MAAM,mBAAqB,EAChD,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,QAAQ,MAAM,WAAa,EACxC,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,QAAQ,MAAM,mBAAqB,EAChD,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,QAAQ,MAAM,YAAc,EACzC,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,MAAM,SAAW,EACtC,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MAAM,aAC3B,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,MAAM,UAC3B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MAAM,OAC3B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MAAM,OAC3B,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,QAAQ,KACrB,CAEA,MAAM,YAAa,CAClB,MAAM7e,EAASse,GAAiB,KAAK,IAAI,EACzC,MAAM,KAAK,cAAc,KAAK,GAAIte,EAAQ,CAAA,CAAE,CAC7C,CAEA,MAAM,iBAAkB,CACvB,MAAM,KAAK,cAAc,KAAK,GAAIwe,GAAsB,KAAK,UAAU,EAAG,EAAE,CAC7E,CAEA,MAAM,MAAO,CACZ,MAAM,KAAK,cAAc,KAAK,GAAI,YAAa,CAAE,SAAU,CAAC,OAAO,EAAG,CACvE,CAEA,MAAM,QAAS,CACd,MAAM,KAAK,cAAc,KAAK,GAAI,cAAe,CAAE,SAAU,CAAC,OAAO,EAAG,CACzE,CAEA,MAAM,YAAa,CAClB,OAAO,KAAK,WAAa,KAAK,OAAM,EAAK,KAAK,KAAI,CACnD,CAEA,MAAM,WAAY,CACjB,MAAM,KAAK,cAAc,KAAK,GAAI,YAAa,CAAE,SAAU,CAAC,OAAO,EAAG,CACvE,CAEA,MAAM,aAAc,CACnB,MAAM,KAAK,cAAc,KAAK,GAAI,cAAe,CAAE,SAAU,CAAC,OAAO,EAAG,CACzE,CAEA,MAAM,iBAAkB,CACvB,OAAO,KAAK,WAAa,KAAK,YAAW,EAAK,KAAK,UAAS,CAC7D,CAEA,MAAM,wBAAyB,CAC9B,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CACxD,kBAAmB,CAAC,KAAK,iBACzB,UAAW,KAAK,SAChB,kBAAmB,KAAK,gBAC3B,CAAG,CACF,CAEA,MAAM,0BAA2B,CAChC,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CACxD,kBAAmB,KAAK,iBACxB,UAAW,CAAC,KAAK,SACjB,kBAAmB,KAAK,gBAC3B,CAAG,CACF,CAEA,MAAM,wBAAyB,CAC9B,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CACxD,kBAAmB,KAAK,iBACxB,UAAW,KAAK,SAChB,kBAAmB,CAAC,KAAK,gBAC5B,CAAG,CACF,CAEA,MAAM,kBAAmB,CACxB,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CAAE,WAAY,CAAC,KAAK,WAAY,CAC1F,CAcA,MAAM,yBAAyBv4B,EAAO,CACrC,MAAM,KAAK,cAAc,KAAK,GAAI,kCAAmC,CAAE,YAAaA,EAAO,CAC5F,CAWA,MAAM,oBAAoBA,EAAO,CAChC,MAAM,KAAK,cAAc,KAAK,GAAI,6BAA8B,CAAE,OAAQA,EAAO,CAClF,CAYA,MAAM,qBAAqBA,EAAO,CACjC,MAAM,KAAK,cAAc,KAAK,GAAI,0BAA2B,CAAE,OAAQA,EAAO,CAC/E,CAaA,MAAM,YAAYA,EAAO,CACxB,MAAMmJ,EAAQ,KAAK,QAAQ,MACrB0vB,EAAS,CACd,UAAW,KAAK,GAChB,QAAS1vB,EAAM,SAAW,GAC1B,QAASA,EAAM,SAAW,EAC7B,EACE,MAAM,KAAK,cAAc0vB,EAAQ,2BAA4B,CAAE,QAAS,CAAC,CACxE,OAAAA,EACA,SAAU74B,CACb,CAAG,EAAG,CACL,CAEA,MAAM,QAAS,CACd,MAAMmJ,EAAQ,KAAK,QAAQ,MACrB0vB,EAAS,CACd,UAAW,KAAK,GAChB,QAAS1vB,EAAM,SAAW,GAC1B,QAASA,EAAM,SAAW,EAC7B,EACE,MAAM,KAAK,cAAc0vB,EAAQ,qBAAsB,CAAA,CAAE,CAC1D,CAEA,MAAM,KAAM,CACX,MAAM,KAAK,cAAc,KAAK,GAAI,WAAY,CAAA,CAAE,CACjD,CAMA,MAAM,QAAQC,EAAO,CACpB,MAAM,IAAI3Y,EACX,CAMA,MAAM,WAAW2Y,EAAO,CACvB,MAAM,IAAI3Y,EACX,CAEA,SAAU,CACT,KAAK,cAAgB,OACrB,MAAM,QAAO,CACd,CACD,EAOI4Y,GAAkB,cAAcL,EAAY,CAE/C,YAAYnvB,EAAIovB,EAAeK,EAAc1H,EAAkB,CAC9D,MAAM/nB,EAAIovB,EAAerH,CAAgB,EACzC,KAAK,aAAe0H,EACpB,KAAK,cAAgB,KAAK,sBAAsB,EAAK,EACrD,KAAK,aAAe,IAAIb,EACzB,CACA,SAAU,CACT,KAAK,aAAa,QAAO,EACzB,MAAM,QAAO,CACd,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,cAAc,aAAY,CACvC,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,cAAc,KAC3B,CAKA,MAAM,mBAAoB,CACrB,KAAK,cAAc,QACvB,KAAK,cAAc,KAAK,EAAI,EAC5B,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CACxD,kBAAmB,GACnB,UAAW,GACX,kBAAmB,EACtB,CAAG,EACF,CAKA,MAAM,oBAAqB,CACrB,KAAK,cAAc,QACxB,KAAK,cAAc,KAAK,EAAK,EAC7B,MAAM,KAAK,cAAc,KAAK,GAAI,sBAAuB,CACxD,kBAAmB,GACnB,UAAW,GACX,kBAAmB,EACtB,CAAG,EACF,CAUA,MAAM,kBAAmB,CACxB,GAAI,CACH,MAAM,KAAK,aAAa,eAAc,CACvC,OAASr3B,EAAO,CACf,MAAA03B,GAAU,MAAM,qDAAsD13B,CAAK,EACrEA,CACP,CACD,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,aAAa,kBAC1B,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,aAAa,iBAC1B,CAEA,MAAM,iBAAkB,CACvB,OAAO,KAAK,aAAa,kBAAiB,CAC3C,CASA,MAAM,oBAAoB6V,EAAS,CAClC,GAAI,CACH,MAAM,KAAK,aAAa,eAAeA,CAAO,CAC/C,OAAS7V,EAAO,CACf,MAAA03B,GAAU,MAAM,6DAA8D13B,CAAK,EAC7EA,CACP,CACD,CAEA,MAAM,uBAAuByI,EAAI,CAChC,OAAO,KAAK,aAAa,mBAAmBA,CAAE,CAC/C,CAEA,MAAM,oBAAoB,CAAE,YAAAyjB,EAAa,OAAA1tB,CAAM,EAAK,CAAA,EAAI,CACvD,MAAM25B,EAAQjM,GAAe1tB,EAAS,OAAS,GAC/C,OAAO,KAAK,aAAa,oBAAoB,CAC5C,MAAA25B,EACA,4BAA6BjM,EAC7B,iBAAkB1tB,CACrB,CAAG,CACF,CAEA,MAAM,oBAAoB,CAAE,YAAA0tB,EAAa,OAAA1tB,CAAM,EAAK,CAAA,EAAI,CACvD,MAAM45B,EAAQlM,GAAe1tB,EAAS,OAAS,GAC/C,OAAO,KAAK,aAAa,oBAAoB,CAC5C,MAAA45B,EACA,4BAA6BlM,EAC7B,iBAAkB1tB,CACrB,CAAG,CACF,CAEA,MAAM,gBAAgBqX,EAAU,GAAI,CACnC,MAAM,KAAK,aAAa,oBAAoBA,CAAO,CACpD,CAEA,uBAAuByS,EAAQzS,EAAU,GAAI,CAC5C,KAAK,iBAAiB,uBAAuByS,CAAM,EAC/CzS,EAAQ,iBAAgByT,EAAqB,SAAS,oBAAsBhB,EACjF,CAEA,MAAM,+BAA+B4D,EAAa,CACjD,MAAM,KAAK,aAAa,uBAAuB,CAAE,MAAOA,CAAW,CAAE,CACtE,CAEA,MAAM,2BAA2BA,EAAa,CAC7C,MAAM,KAAK,aAAa,uBAAuBA,CAAW,CAC3D,CAEA,uBAAuB5D,EAAQzS,EAAU,GAAI,CAC5C,KAAK,iBAAiB,uBAAuByS,CAAM,EAC/CzS,EAAQ,iBAAgByT,EAAqB,SAAS,oBAAsBhB,EACjF,CAEA,MAAM,+BAA+B4D,EAAa,CACjD,MAAM,KAAK,aAAa,uBAAuB,CAAE,MAAOA,CAAW,CAAE,CACtE,CAEA,wBAAwB5D,EAAQzS,EAAU,GAAI,CAC7C,KAAK,iBAAiB,wBAAwByS,CAAM,EAChDzS,EAAQ,iBAAgByT,EAAqB,SAAS,qBAAuBhB,EAClF,CAKA,wBAAyB,CACpB,KAAK,cAAc,QACtBoP,GAAU,MAAM,2EAA2E,EAC3F,KAAK,cAAc,KAAK,EAAK,EAE/B,CAEA,MAAM,wBAAyB,CAC9B,KAAK,uBAAsB,EAC3B,MAAM,MAAM,uBAAsB,CACnC,CAEA,MAAM,0BAA2B,CAChC,KAAK,uBAAsB,EAC3B,MAAM,MAAM,yBAAwB,CACrC,CAEA,MAAM,wBAAyB,CAC9B,KAAK,uBAAsB,EAC3B,MAAM,MAAM,uBAAsB,CACnC,CAEA,MAAM,MAAO,CACZ,GAAI,CACH,MAAM,MAAM,KAAI,CACjB,OAAS13B,EAAO,CACf03B,GAAU,KAAK,4GAA6G13B,CAAK,CAClI,QAAC,CACA,KAAK,aAAa,yBAAwB,CAC3C,CACD,CAEA,MAAM,QAAS,CACd,GAAI,CACH,MAAM,MAAM,OAAM,CACnB,OAASA,EAAO,CACf03B,GAAU,KAAK,8GAA+G13B,CAAK,CACpI,QAAC,CACA,MAAM,KAAK,aAAa,2BAA0B,CACnD,CACD,CAEA,MAAM,WAAY,CACjB,GAAI,CACH,MAAM,MAAM,UAAS,CACtB,OAASA,EAAO,CACf03B,GAAU,KAAK,4GAA6G13B,CAAK,CAClI,QAAC,CACA,KAAK,aAAa,yBAAwB,CAC3C,CACD,CAEA,MAAM,aAAc,CACnB,GAAI,CACH,MAAM,MAAM,YAAW,CACxB,OAASA,EAAO,CACf03B,GAAU,KAAK,8GAA+G13B,CAAK,CACpI,QAAC,CACA,MAAM,KAAK,aAAa,2BAA0B,CACnD,CACD,CACD,EAEA,MAAMq4B,GAAqBC,GACnBA,aAAuBL,GAK/B,SAASM,GAASr5B,EAAO,CACxB,OAAO,OAAOA,GAAU,UAAYA,IAAU,IAC/C,CACA,SAASs5B,EAAYxtB,EAAK4E,EAAK,CAC9B,OAAOA,KAAO5E,CACf,CACA,SAASytB,GAAiBv5B,EAAO,CAChC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,IAAI,GAAK,OAAOA,EAAM,IAAO,UAAYs5B,EAAYt5B,EAAO,QAAQ,GAAK,OAAOA,EAAM,QAAW,QAC3M,CACA,SAASw5B,GAAkBx5B,EAAO,CACjC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,IAAI,GAAK,OAAOA,EAAM,IAAO,WAAas5B,EAAYt5B,EAAO,QAAQ,GAAKs5B,EAAYt5B,EAAO,OAAO,EAC9M,CACA,SAASy5B,GAAuBz5B,EAAO,CACtC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,IAAI,GAAK,OAAOA,EAAM,IAAO,WAAas5B,EAAYt5B,EAAO,OAAO,GAAKq5B,GAASr5B,EAAM,KAAK,GAAKs5B,EAAYt5B,EAAM,MAAO,MAAM,GAAKs5B,EAAYt5B,EAAM,MAAO,SAAS,GAAKs5B,EAAYt5B,EAAO,QAAQ,GAAKq5B,GAASr5B,EAAM,MAAM,GAAKs5B,EAAYt5B,EAAM,OAAQ,MAAM,GAAKA,EAAM,OAAO,OAAS,OAASs5B,EAAYt5B,EAAM,OAAQ,SAAS,EACxb,CAcA,SAAS05B,GAAyBC,EAAW,CAC5C,OAAQ35B,GAAU45B,GAAqB55B,CAAK,GAAKA,EAAM,aAAe25B,CACvE,CACA,SAASE,GAAoB75B,EAAO,CACnC,OAAOu5B,GAAiBv5B,CAAK,GAAKA,EAAM,SAAW,oBAAsBq5B,GAASr5B,EAAM,MAAM,GAAKs5B,EAAYt5B,EAAM,OAAQ,YAAY,CAC1I,CAiBA,SAAS45B,GAAqB55B,EAAO,CACpC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,YAAY,GAAK,OAAOA,EAAM,YAAe,UAAYs5B,EAAYt5B,EAAO,QAAQ,CAClI,CACA,SAAS85B,GAAyB95B,EAAO,CACxC,OAAO45B,GAAqB55B,CAAK,IAAM+5B,GAAqB/5B,CAAK,GAAKg6B,GAAmBh6B,CAAK,GAAKi6B,GAAsBj6B,CAAK,GAAKk6B,GAAoBl6B,CAAK,GAAKm6B,GAAmBn6B,CAAK,GAAKo6B,GAAsBp6B,CAAK,GAAKq6B,GAAsBr6B,CAAK,GAAKs6B,GAAwBt6B,CAAK,GAAKu6B,GAAuBv6B,CAAK,GAAKw6B,GAAqBx6B,CAAK,GAAKy6B,GAAwBz6B,CAAK,GAAK06B,GAAwB16B,CAAK,GAAK26B,GAAwB36B,CAAK,GAAK46B,GAA8B56B,CAAK,GAAK66B,GAAqC76B,CAAK,EACzhB,CACA,MAAM86B,GAAyCpB,GAAyB,gCAAgC,EAClGiB,GAA0BjB,GAAyB,gBAAgB,EACnEK,GAAuBL,GAAyB,aAAa,EAC7DM,GAAqBN,GAAyB,WAAW,EACzDO,GAAwBP,GAAyB,cAAc,EAC/DQ,GAAsBR,GAAyB,YAAY,EAC3DS,GAAqBT,GAAyB,WAAW,EACzDU,GAAwBV,GAAyB,cAAc,EAC/DW,GAAwBX,GAAyB,cAAc,EAC/DY,GAA0BZ,GAAyB,gBAAgB,EACnEa,GAAyBb,GAAyB,eAAe,EACjEc,GAAuBd,GAAyB,aAAa,EAC7De,GAA0Bf,GAAyB,gBAAgB,EACnEgB,GAA0BhB,GAAyB,gBAAgB,EACnEkB,GAAgClB,GAAyB,sBAAsB,EAC/EmB,GAAuCnB,GAAyB,8BAA8B,EACpG,SAASqB,GAAoB/6B,EAAO,CACnC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,cAAc,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKs5B,EAAYt5B,EAAO,WAAW,GAAKs5B,EAAYt5B,EAAO,cAAc,CACtK,CACA,SAASg7B,GAAuBh7B,EAAO,CACtC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKs5B,EAAYt5B,EAAO,iBAAiB,GAAKs5B,EAAYt5B,EAAO,QAAQ,CAChI,CAIA,MAAMi7B,GAAY1W,EAAS,EACrB2W,GAAsB,CAAA,EAE5B,IAAIC,GAAoB,cAAczU,EAAY,CACjD,YAAY0U,EAAmBzkB,EAAU,GAAI,CAC5C,MAAK,EACL,KAAK,kBAAoBykB,EACzB,KAAK,QAAUzkB,EACf,KAAK,QAA0B,IAAI,IACnC,KAAK,eAAiC,IAAI,IAC1C,KAAK,eAAiB,KAAK,sBAAsB,CAAA,CAAE,EACnD,KAAK,OAAS,KAAK,sBAAsB,IAAI,EAC7C,KAAK,eAAiB,KAAK,sBAAsBukB,EAAmB,EACpE,KAAK,kBAAiB,CACvB,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,iBAAiB,gBAAiB,IAAM,KAAK,eAAe,aAAY,EAAG,KAAKprB,EAAKurB,GAAuB,OAAO,OAAOA,CAAkB,CAAC,CAAC,CAAC,CAC5J,CACA,IAAI,cAAe,CAClB,OAAO,OAAO,OAAO,KAAK,eAAe,KAAK,CAC/C,CACA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,OAAO,eAAe,KAAK1W,GAAU,CAAE,CAAC,CAC1F,CACA,qBAAqB2W,EAAe,CACnC,OAAO,KAAK,eAAe,IAAIA,CAAa,CAC7C,CACA,UAAU9E,EAAQ,CACjB,KAAK,QAAQ,IAAIA,CAAM,CACxB,CACA,cAAcA,EAAQ,CACrB,OAAO,KAAK,QAAQ,IAAIA,CAAM,CAC/B,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,eAAe,KAAK1mB,EAAK3G,GAAUA,EAAM,SAAS,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACjJ,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,UAAU,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACnJ,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,SAAS,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACjJ,CACA,IAAI,UAAW,CACd,OAAO,KAAK,iBAAiB,WAAY,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,OAAO,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CAC7I,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,SAAS,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACjJ,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,oBAAoB,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACpK,CACA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,MAAM,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CAC3I,CACA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,IAAI,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACvI,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,iBAAiB,gBAAiB,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,YAAY,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACvJ,CACA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,WAAW,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CAChJ,CACA,IAAI,UAAW,CACd,OAAO,KAAK,iBAAiB,WAAY,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,OAAO,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CAC7I,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,iBAAiB,gBAAiB,IAAM,KAAK,eAAe,KAAK7U,EAAK3G,GAAUA,EAAM,aAAa,EAAG2M,EAAoB,EAAI6O,GAAU,CAAE,CAAC,CACxJ,CACA,IAAI,MAAO,CACV,OAAO,KAAK,OAAO,KACpB,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,eAAe,MAAM,eAAiB,CAAA,CACnD,CACA,IAAI,WAAY,CACf,OAAO,KAAK,eAAe,MAAM,WAAa,EAC/C,CACA,IAAI,WAAY,CACf,OAAO,KAAK,eAAe,MAAM,WAAa,EAC/C,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,eAAe,MAAM,sBAAwB,EAC1D,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,eAAe,MAAM,QAAU,EAC5C,CACA,IAAI,MAAO,CACV,OAAO,KAAK,eAAe,MAAM,MAAQ,CAAA,CAC1C,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,eAAe,MAAM,WAClC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,eAAe,MAAM,SAAW,CAAA,CAC7C,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,eAAe,MAAM,cAAgB,CAAA,CAClD,CACA,eAAepb,EAAI,CAClB,OAAO,KAAK,QAAQ,IAAIA,CAAE,GAAK,KAAK,eAAe,IAAIA,CAAE,CAC1D,CACA,mBAAoB,CACnB,KAAK,YAAY,KAAK,iBAAmBgyB,GAAoB,SAC5DN,GAAU,MAAM,uEAAwE,CACvF,OAAQM,EAAgB,QACxB,cAAeA,EAAgB,eACnC,CAAI,EACD,MAAMC,EAAeD,EAAgB,aAC/BtO,EAAesO,EAAgB,aACrC,KAAK,OAAS,KAAK,QAAUA,EAAgB,UAC7C,KAAK,aAAe,KAAK,cAAgBA,EAAgB,eACzD,KAAK,QAAQ,IAAIA,EAAgB,OAAO,EACxC,KAAK,eAAe,IAAIA,EAAgB,eAAe,EACvD,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,UAAWC,EAAa,UACxB,WAAYA,EAAa,WACzB,UAAWA,EAAa,UACxB,QAASA,EAAa,QACtB,UAAWA,EAAa,UACxB,qBAAsBA,EAAa,qBACnC,OAAQA,EAAa,OACrB,KAAMA,EAAa,KACnB,aAAAvO,CACJ,CAAI,EACD,KAAK,mBAAmBuO,EAAa,OAAO,GAC5Cx+B,EAAA,KAAK,OAAO,QAAZ,MAAAA,EAAmB,aAAa,cAAciwB,IAC1ChwB,EAAA,KAAK,OAAO,QAAZ,MAAAA,EAAmB,aAAa,WAAW,KAAK,cAAa,CAClE,CAAC,EACD,KAAK,YAAY,KAAK,eAAiBw+B,GAAW,CACjDR,GAAU,MAAM,kEAAmEQ,CAAM,EACzF,KAAK,kBAAkBA,CAAM,CAC9B,CAAC,EACD,KAAK,YAAY,KAAK,kBAAkB,YAAcC,GAAoB,CACzET,GAAU,MAAM,gEAAiES,EAAgB,OAAO,SAAS,EACjH,MAAMC,EAAe,CAAE,GAAG,KAAK,eAAe,KAAK,EAC/CD,EAAgB,OAAO,aAAaC,GACvC,OAAOA,EAAaD,EAAgB,OAAO,SAAS,EACpD,KAAK,eAAe,KAAKC,CAAY,GAC/BV,GAAU,KAAK,yEAAyES,EAAgB,OAAO,SAAS,EAAE,CAClI,CAAC,EACD,KAAK,YAAY,KAAK,kBAAkB,aAAeE,GAAqB,CAC3EX,GAAU,MAAM,mDAAoDW,CAAgB,EACpF,MAAMC,EAAcD,EAAiB,aACrC,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,UAAWC,EAAY,UACvB,WAAYA,EAAY,WACxB,UAAWA,EAAY,UACvB,QAASA,EAAY,QACrB,UAAWA,EAAY,UACvB,qBAAsBA,EAAY,qBAClC,OAAQA,EAAY,OACpB,KAAMA,EAAY,IACtB,CAAI,CACF,CAAC,EACD,KAAK,YAAY,KAAK,oBAAsBC,GAAuB,CAClEb,GAAU,MAAM,qDAAsDa,CAAkB,EACxF,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,YAAaA,EAAmB,GAChC,cAAeA,EAAmB,MACtC,CAAI,EACD,KAAK,2BAA2BA,CAAkB,CACnD,CAAC,CACF,CACA,2BAA2BA,EAAoB,CAC1C,OAAO,KAAK,KAAK,eAAe,KAAK,EAAE,OAAS,GAAK,CAACA,EAAmB,OAAO,KAAMC,GAAU,CAAC,CAACA,EAAM,SAAS,GAAGd,GAAU,KAAK,gGAAgG,EACvOa,EAAmB,OAAO,OAAQC,GAAU,CAAC,CAACA,EAAM,SAAS,EAAE,OAAQA,GAChEA,EAAM,aAAa,KAAK,eAAe,MAItC,IAHNd,GAAU,KAAK,oEAAoEc,EAAM,SAAS,EAAE,EAC7F,GAGR,EAAE,IAAKA,IACP,KAAK,eAAe,MAAMA,EAAM,SAAS,EAAE,OAAO,CAAE,SAAUA,EAAO,EAC9D,KAAK,eAAe,MAAMA,EAAM,SAAS,EAChD,EAAE,QAAS3C,GAAgB,CACvBD,GAAkBC,CAAW,GAAG,KAAK,OAAO,KAAKA,CAAW,EAChE,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,CAACA,EAAY,EAAE,EAAGA,CACtB,CAAI,CACF,CAAC,CACF,CACA,eAAgB,CACV,KAAK,QACV,KAAK,kBAAkB,cAAc,KAAK,OAAQ,mBAAoB,EAAE,EAAE,KAAM9T,GAAa,CAC5F,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,QAASA,EAAS,OAAO,OAC7B,CAAI,CACF,CAAC,EAAE,MAAOxkB,GAAU,CACnBm6B,GAAU,MAAM,8CAA+Cn6B,CAAK,CACrE,CAAC,CACF,CACA,mBAAmBk7B,EAAS,CAC3BA,EAAQ,QAASP,GAAW,KAAK,kBAAkBA,CAAM,CAAC,CAC3D,CACA,kBAAkBA,EAAQ,CACzB,GAAI,EAAEA,EAAO,aAAa,KAAK,eAAe,OAAQ,CACrD,MAAMQ,EAAiB,KAAK,kBAAkB,kBAAkBR,EAAO,UAAW,KAAK,MAAM,EAC7F,KAAK,eAAe,KAAK,CACxB,GAAG,KAAK,eAAe,MACvB,CAACA,EAAO,SAAS,EAAGQ,CACxB,CAAI,CACF,CACA,MAAM7C,EAAc,KAAK,eAAe,MAAMqC,EAAO,SAAS,EACxDS,EAAW9C,EAAY,MAC7B6B,GAAU,MAAM,4CAA6CQ,EAAO,UAAW,CAC9E,SAAAS,EACA,SAAUT,CACb,CAAG,EACDrC,EAAY,OAAO,CAClB,GAAG8C,EACH,GAAGT,CACN,CAAG,EACGtC,GAAkBC,CAAW,GAAG,KAAK,OAAO,KAAKA,CAAW,EAChE,KAAK,eAAe,KAAK,KAAK,eAAe,KAAK,CACnD,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,iBAAiB,mBAAoB,IAAM,KAAK,kBAAkB,WAAW,KAAK3lB,EAAOsnB,EAAmB,EAAGniB,GAAKwM,GAAU,CACzI6V,GAAU,MAAM,yCAA0C7V,CAAK,CAChE,CAAC,CAAC,CAAC,CACJ,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,iBAAiB,sBAAuB,IAAM,KAAK,kBAAkB,WAAW,KAAKF,GAAS8V,GAAwB,QAAQ,EAAGpiB,GAAKwM,GAAU,CAC3J6V,GAAU,MAAM,4CAA6C7V,CAAK,CACnE,CAAC,CAAC,CAAC,CACJ,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,iBAAiB,iBAAkB,IAAM/R,GAAM,KAAK,kBAAkB,cAAe,KAAK,kBAAkB,eAAgB,KAAK,kBAAkB,cAAc,EAAE,KAAKvD,EAAKsV,GAAUA,EAAM,MAAM,EAAGxM,GAAKwM,GAAU,CAChO6V,GAAU,MAAM,2CAA4C7V,CAAK,CAClE,CAAC,CAAC,CAAC,CACJ,CACA,SAAU,CACT,OAAO,OAAO,KAAK,eAAe,KAAK,EAAE,QAASgU,GAAgB,CACjEA,EAAY,QAAO,CACpB,CAAC,EACD,KAAK,eAAe,KAAK,EAAE,EAC3B,KAAK,OAAO,KAAK,IAAI,EACrB,KAAK,QAAQ,MAAK,EAClB,KAAK,eAAe,MAAK,EACzB,KAAK,OAAS,OACd,KAAK,aAAe,OACpB,KAAK,kBAAoB,OACzB,KAAK,YAAc,OACnB,MAAM,QAAO,CACd,CACD,EAWA,MAAM+C,GAAiB,IAAI,IAAI,CAC9B,WACA,WACA,WACA,UACD,CAAC,EAmBD,SAASC,GAA8BC,EAAK,CAC3C,MAAM/7B,EAAS,CACd,MAAO,WACP,MAAO,UACT,EACC,GAAI,CAAC+7B,EAAK,OAAO/7B,EACjB,MAAMg8B,EAAQD,EAAI,MAAM,OAAO,EAC/B,IAAIE,EAAmB,KACnBC,EAAmB,KACvB,UAAWC,KAAQH,EAAO,GAAIG,EAAK,WAAW,IAAI,EAC7CF,IAAkBj8B,EAAOi8B,CAAgB,EAAIC,GAAoB,YACjEC,EAAK,WAAW,SAAS,EAAGF,EAAmB,QAC1CE,EAAK,WAAW,SAAS,EAAGF,EAAmB,QACnDA,EAAmB,KACxBC,EAAmB,aACTD,GAAoBE,EAAK,WAAW,IAAI,EAAG,CACrD,MAAMC,EAAOD,EAAK,UAAU,CAAC,EAAE,KAAI,EAC/BN,GAAe,IAAIO,CAAI,IAAGF,EAAmBE,EAClD,CACA,OAAIH,IAAkBj8B,EAAOi8B,CAAgB,EAAIC,GAAoB,YAC9Dl8B,CACR,CAwBA,SAASq8B,GAAwBN,EAAK,CACrC,GAAI,CAACA,EAAK,MAAO,GACjB,MAAMC,EAAQD,EAAI,MAAM;AAAA,CAAM,EACxBO,EAA+B,CAAA,EACrC,IAAIC,EAAiB,GACrB,UAAWJ,KAAQH,EAAO,GAAIG,EAAK,WAAW,IAAI,EACjDI,GAAkB,EAClBD,EAA6BC,CAAc,EAAI,UACrCJ,EAAK,WAAW,cAAc,EAAG,CAC3C,MAAMK,EAAY,mCAAmC,KAAKL,CAAI,EAC1DK,GAAaA,EAAU,CAAC,IAAM,SAAQF,EAA6BC,CAAc,GAAK,EAC3F,CACA,MAAO,CAACD,EAA6B,QAAUA,EAA6B,MAAO/mB,GAAUA,EAAQ,CAAC,CACvG,CAqBA,SAASknB,GAAcV,EAAKW,EAAiB,CAAA,EAAIC,EAAiB,CAAA,EAAI,CACrE,GAAI,CAACZ,GAAOW,EAAe,SAAW,GAAKC,EAAe,SAAW,EAAG,OAAOZ,EAC/E,MAAMa,EAAWC,GAAuBd,CAAG,EACrC/7B,EAAS,CAAC48B,EAAS,CAAC,CAAC,EAC3B,QAAS7gC,EAAI,EAAGA,EAAI6gC,EAAS,OAAQ7gC,IAAK,CACzC,MAAM+gC,EAAUF,EAAS7gC,CAAC,EACpBghC,EAAQD,EAAQ,MAAM,OAAO,EAAE,CAAC,EAClCC,EAAM,WAAW,SAAS,GAAKL,EAAe,OAAS,EAAG18B,EAAO,KAAKg9B,GAAqBF,EAASJ,CAAc,CAAC,EAC9GK,EAAM,WAAW,SAAS,GAAKJ,EAAe,OAAS,EAAG38B,EAAO,KAAKg9B,GAAqBF,EAASH,CAAc,CAAC,EACvH38B,EAAO,KAAK88B,CAAO,CACzB,CACA,OAAO98B,EAAO,KAAK,EAAE,CACtB,CAiBA,SAASi9B,GAAiBlB,EAAKmB,EAAaxd,GAAoC,CAC/E,GAAI,CAACqc,EAAK,OAAOA,EACjB,MAAMoB,EAAkBC,GAAoBrB,CAAG,EAC/C,GAAIoB,IAAoB,KAAM,OAAOpB,EACrC,MAAMC,EAAQD,EAAI,MAAM,OAAO,EACzBsB,EAAe,CAAA,EACfC,EAAa,UAAUH,CAAe,IAC5C,IAAII,EAAY,GAChB,UAAWpB,KAAQH,EAAWG,EAAK,WAAWmB,CAAU,GACvDC,EAAY,GACZF,EAAa,KAAKG,GAAmBrB,EAAMe,CAAU,CAAC,GAChDG,EAAa,KAAKlB,CAAI,EAC7B,GAAI,CAACoB,EAAW,CACf,MAAME,EAAa,YAAYN,CAAe,IACxCO,EAAW,CAAA,EACjB,UAAWvB,KAAQkB,EAClBK,EAAS,KAAKvB,CAAI,EACdA,EAAK,WAAWsB,CAAU,GAAGC,EAAS,KAAK,UAAUP,CAAe,8CAA8CD,CAAU,EAAE,EAEnI,OAAOQ,EAAS,KAAK;AAAA,CAAM,CAC5B,CACA,OAAOL,EAAa,KAAK;AAAA,CAAM,CAChC,CASA,SAASM,GAAoB5B,EAAK6B,EAAc,CAAA,EAAIC,EAAc,CAAA,EAAI,CACrE,OAAOpB,GAAcV,EAAK8B,EAAaD,CAAW,CACnD,CAOA,SAASf,GAAuBd,EAAK,CACpC,OAAOA,EAAI,MAAM,QAAQ,CAC1B,CAIA,SAASiB,GAAqBF,EAASgB,EAAgB,OACtD,MAAM9B,EAAQc,EAAQ,MAAM,OAAO,EAC7BiB,EAAa/B,EAAM,CAAC,EAAE,MAAM,GAAG,EACrC,GAAI+B,EAAW,OAAS,EAAG,OAAOjB,EAClC,MAAMkB,EAAeD,EAAW,MAAM,CAAC,EACjCE,EAA4B,IAAI,IACtC,UAAW9B,KAAQH,EAAO,CACzB,MAAMkC,EAAQ,8BAA8B,KAAK/B,CAAI,EACjD+B,GAAOD,EAAU,IAAIC,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC5C,CACA,MAAMC,EAAsBL,EAAe,IAAKhiC,GAAMA,EAAE,aAAa,EAC/DiwB,EAAY,CAAA,EACZkK,EAAY,CAAA,EAClB,UAAWmI,KAAMJ,EAAc,CAC9B,MAAMK,IAAY3hC,EAAAuhC,EAAU,IAAIG,CAAE,IAAhB,YAAA1hC,EAAmB,gBAAiB,GAClDyhC,EAAoB,QAAQE,CAAS,GAAK,EAAGtS,EAAU,KAAKqS,CAAE,EAC7DnI,EAAU,KAAKmI,CAAE,CACvB,CACArS,EAAU,KAAK,CAAC5vB,EAAGM,IAAM,SACxB,MAAM6hC,IAAQ5hC,EAAAuhC,EAAU,IAAI9hC,CAAC,IAAf,YAAAO,EAAkB,gBAAiB,GAC3C6hC,IAAQ5hC,EAAAshC,EAAU,IAAIxhC,CAAC,IAAf,YAAAE,EAAkB,gBAAiB,GACjD,OAAOwhC,EAAoB,QAAQG,CAAK,EAAIH,EAAoB,QAAQI,CAAK,CAC9E,CAAC,EACD,MAAMC,EAAe,CAAC,GAAGzS,EAAW,GAAGkK,CAAS,EAChD,MAAO,CAAC,CAAC,GAAG8H,EAAW,MAAM,EAAG,CAAC,EAAG,GAAGS,CAAY,EAAE,KAAK,GAAG,EAAG,GAAGxC,EAAM,MAAM,CAAC,CAAC,EAAE,KAAK;AAAA,CAAM,CAC/F,CAMA,SAASoB,GAAoBrB,EAAK,CACjC,MAAMmC,EAAQ,gCAAgC,KAAKnC,CAAG,EACtD,OAAOmC,EAAQA,EAAM,CAAC,EAAI,IAC3B,CAMA,SAASV,GAAmBiB,EAAUvB,EAAY,CACjD,IAAIl9B,EAASy+B,EACb,OAAKz+B,EAAO,SAAS,SAAS,IAAGA,GAAU,aACtCA,EAAO,SAAS,eAAe,IAAGA,GAAU,mBAC5CA,EAAO,SAAS,oBAAoB,IAAGA,GAAU,sBAAsBk9B,CAAU,IAC/El9B,CACR,CAIA,MAAM0+B,GAAYza,EAAS,EAC3B,IAAI0a,GAAyB,cAAcvY,EAAY,CACtD,YAAY6L,EAAgB2M,EAAsCvoB,EAAU,CAAA,EAAI,CAC/E,MAAK,EACL,KAAK,eAAiB4b,EACtB,KAAK,qCAAuC2M,EAC5C,KAAK,iCAAmC,IAAM,CAC7C,KAAM,CAAE,kBAAAC,GAAsB,KAAK,eACnCH,GAAU,MAAM,4DAA4DG,CAAiB,EAAE,EAC3FA,IAAsB,aAAa,KAAK,oBAAoB,KAAK,CACpE,MAAO,YACP,SAAU,EACd,CAAI,CACF,EACA,KAAK,sBAAyB/Z,GAAU,CACvC4Z,GAAU,MAAM,yDAA0D5Z,EAAM,SAAS,EACzF,KAAK,YAAY,mBAAmB,EAChCA,EAAM,UAAW,KAAK,kBAAoB,WAAW,IAAM,CAC1D,KAAK,eAAe,oBAAsB,aAC7C4Z,GAAU,KAAK,mEAAmE,EAClF,KAAK,0BAAyB,EAEhC,EAAG,KAAK,mBAAmB,GAE1BA,GAAU,MAAM,2EAA2E,EAC3F,KAAK,YAAY,mBAAmB,EACpC,KAAK,2BAA0B,EAEjC,EACA,KAAK,oBAAsB,KAAK,sBAAsB,CACrD,MAAO,MACP,SAAU,EACb,CAAG,EACD,KAAK,oBAAsBroB,EAAQ,qBAAuBqF,GAC1D,KAAK,oBAAsBrF,EAAQ,qBAAuBsF,GAC1D,KAAK,UAAYtF,EAAQ,WAAa,GACtC,KAAK,oBAAmB,EACxB,KAAK,YAAY,KAAK,qCAAqC,KAAKlD,EAAQ2rB,GAAkBA,CAAa,CAAC,EAAIA,GAAkB,CACzHA,IACH,KAAK,oBAAmB,EACxB,KAAK,kBAAoB,WAAW,IAAM,CACrC,KAAK,eAAe,oBAAsB,aAC7CJ,GAAU,KAAK,mEAAmE,EAClF,KAAK,0BAAyB,EAEhC,EAAG,KAAK,mBAAmB,EAE7B,CAAC,CACF,CACA,qBAAsB,CACrB,KAAK,eAAe,oBAAoB,eAAgB,KAAK,qBAAqB,EAClF,KAAK,eAAe,iBAAiB,eAAgB,KAAK,qBAAqB,EAC/E,KAAK,eAAe,oBAAoB,0BAA2B,KAAK,gCAAgC,EACxG,KAAK,eAAe,iBAAiB,0BAA2B,KAAK,gCAAgC,CACtG,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,oBAAoB,KAAKjmB,GAAe,KAAK,oCAAoC,EAAGtF,EAAO,CAAC,CAACrW,EAAGgiC,CAAa,IAAMA,CAAa,EAAGtvB,EAAI,CAAC,CAAC3G,EAAO/L,CAAC,IAAM+L,EAAM,KAAK,CAAC,CAChL,CACA,IAAI,6BAA8B,OACjC,MAAMkzB,GAAMr/B,EAAA,KAAK,eAAe,mBAApB,YAAAA,EAAsC,IAClD,OAAO2/B,GAAwBN,GAAO,EAAE,CACzC,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,SACb,CACA,aAAar8B,EAAO,CACnB,KAAK,UAAYA,CAClB,CACA,4BAA6B,CAC5Bg/B,GAAU,MAAM,0DAA0D,EAC1EA,GAAU,MAAM,0DAA0D,KAAK,eAAe,iBAAiB,EAAE,EACjHA,GAAU,MAAM,iDAAiD,EACjE,KAAK,oBAAoB,KAAK,CAC7B,MAAO,WACP,SAAU,KAAK,2BAClB,CAAG,EACD,KAAK,cAAa,CACnB,CACA,eAAgB,CACf,KAAK,eAAe,oBAAoB,0BAA2B,KAAK,gCAAgC,EACxG,KAAK,eAAe,oBAAoB,eAAgB,KAAK,qBAAqB,EAClF,KAAK,eAAc,CACpB,CACA,2BAA4B,OAC3B,KAAK,YAAY,mBAAmB,EACpC,MAAMK,EAAW,KAAK,4BAClBA,GACHL,GAAU,MAAM,6CAA6C,EAC7D,KAAK,oBAAoB,KAAK,CAC7B,MAAO,UACP,SAAAK,CACJ,CAAI,EACD,KAAK,cAAa,GACZL,GAAU,MAAM;AAAA,GAA+BhiC,EAAA,KAAK,eAAe,mBAApB,YAAAA,EAAsC,GAAG,CAChG,CACA,2BAA4B,CACvB,KAAK,mBAAmB,KAAK,YAAY,mBAAmB,EAChEgiC,GAAU,KAAK,gDAAgD,EAC/D,MAAMK,EAAW,KAAK,4BAClB,CAACA,GAAY,CAAC,KAAK,UAAW,KAAK,iCAAgC,GAEtEL,GAAU,MAAM,yEAAyE,EACzF,KAAK,oBAAoB,KAAK,CAC7B,MAAO,UACP,SAAAK,CACJ,CAAI,EACD,KAAK,cAAa,EAEpB,CACA,kCAAmC,CAClCL,GAAU,MAAM,8EAA8E,EAC9F,KAAK,UAAY,GACjB,KAAK,eAAe,iBAAiB,CACpC,GAAG,KAAK,eAAe,iBAAgB,EACvC,mBAAoB,OACvB,CAAG,EACD,KAAK,eAAe,WAAU,CAC/B,CACA,YAAYrM,EAAS,CAChB,KAAKA,CAAO,IACf,aAAa,KAAKA,CAAO,CAAC,EAC1B,KAAKA,CAAO,EAAI,OAElB,CACA,gBAAiB,CAChBqM,GAAU,MAAM,8CAA8C,EAC9D,KAAK,YAAY,mBAAmB,EACpC,KAAK,YAAY,mBAAmB,CACrC,CACA,sBAAuB,CACtB,KAAK,eAAe,oBAAoB,0BAA2B,KAAK,gCAAgC,EACxG,KAAK,eAAe,oBAAoB,eAAgB,KAAK,qBAAqB,CACnF,CACA,SAAU,CACTA,GAAU,MAAM,4DAA4D,EAC5E,KAAK,eAAc,EACnB,KAAK,qBAAoB,EACzB,MAAM,QAAO,CACd,CACD,EAIA,MAAMM,GAAY/a,EAAS,EAmB3B,IAAIgb,GAAqB,cAAc7Y,EAAY,CAClD,YAAY/P,EAAU,GAAI,CACzB,MAAK,EACL,KAAK,aAAe,KACpB,KAAK,aAAe,KACpB,KAAK,aAAe,EACpB,KAAK,OAAS,KAAK,sBAAsB,CAAC,EAC1C,KAAK,eAAiB,EACtB,KAAK,eAAiBA,EAAQ,sBAAwB,IAAM,IAAI,eAAe,EAC/E,KAAK,UAAY,KAAK,cAAc,WAAU,EAC9C,KAAK,UAAY,KAAK,cAAc,eAAc,EAClD,KAAK,UAAU,QAAU,KACzB,KAAK,UAAU,sBAAwB,GACvC,KAAK,gBAAkB,IAAI,WAAW,IAAI,YAAY,KAAK,UAAU,OAAO,CAAC,EAC7E,KAAK,aAAe,KAAK,cAAc,6BAA4B,EACnE,KAAK,UAAU,QAAQ,KAAK,SAAS,EACrC,KAAK,UAAU,QAAQ,KAAK,YAAY,EACxC,KAAK,mBAAqBA,EAAQ,mBAAqBoI,GACvD,KAAK,gBAAkBpI,EAAQ,gBAAkBqI,GACjD,KAAK,gBAAkBrI,EAAQ,gBAAkBmI,GACjD,MAAM0gB,EAAU7oB,EAAQ,aAAe,EACvC,KAAK,OAAO,KAAK6oB,CAAO,EACxB,KAAK,mBAAkB,CACxB,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,OAAO,aAAY,CAChC,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,OAAO,KACpB,CAMA,IAAI,aAAc,CACjB,KAAM,CAACnN,CAAK,EAAI,KAAK,aAAa,OAAO,eAAc,EACvD,OAAOA,CACR,CAKA,IAAI,QAAS,CACZ,OAAO,KAAK,cAAclf,GAAS,KAAK,gBAAiBhI,EAAuB,EAAE,KAAK2E,EAAI,IAAM,KAAK,aAAY,CAAE,CAAC,CAAC,CACvH,CAKA,IAAI,WAAY,CACf,OAAO,KAAK,cAAc,KAAK,OAAO,KAAKA,EAAKqK,GAAU,KAAK,iBAAiBA,CAAK,CAAC,EAAGrE,EAAoB,CAAE,CAAC,CACjH,CAMA,QAAQ9V,EAAO,CACd,MAAMy/B,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGz/B,CAAK,CAAC,EAC9C,KAAK,OAAO,KAAKy/B,CAAO,EACxB,KAAK,mBAAkB,CACxB,CAOA,aAAaruB,EAAQ,CACpB,KAAK,eAAiBA,EAAS,EAAI,EACnC,KAAK,mBAAkB,CACxB,CACA,oBAAqB,CACpB,KAAK,UAAU,KAAK,MAAQ,KAAK,OAAO,MAAQ,KAAK,cACtD,CAWA,cAAcihB,EAAO,CACpB,GAAI,KAAK,aAAc,CACtB,GAAI,CACH,KAAK,aAAa,WAAU,CAC7B,OAASvxB,EAAO,CACfw+B,GAAU,MAAM,iDAAkDx+B,CAAK,CACxE,CACA,KAAK,aAAe,IACrB,CACI,KAAK,eAAc,KAAK,aAAe,MACtCuxB,IACL,KAAK,aAAe,IAAI,YAAY,CAACA,CAAK,CAAC,EAC3C,KAAK,aAAe,KAAK,cAAc,wBAAwB,KAAK,YAAY,EAChF,KAAK,aAAa,QAAQ,KAAK,SAAS,EACpC,KAAK,cAAc,QAAU,aAAa,KAAK,cAAc,OAAM,EAAG,MAAOvxB,GAAU,CAC1Fw+B,GAAU,KAAK,mDAAoDx+B,CAAK,CACzE,CAAC,EACF,CACA,SAAU,CACT,GAAI,KAAK,aAAc,CACtB,GAAI,CACH,KAAK,aAAa,WAAU,CAC7B,MAAQ,CAAC,CACT,KAAK,aAAe,IACrB,CACA,GAAI,CACH,KAAK,UAAU,WAAU,EACzB,KAAK,UAAU,WAAU,CAC1B,MAAQ,CAAC,CACT,KAAK,cAAc,MAAK,EAAG,MAAOA,GAAU,CAC3Cw+B,GAAU,MAAM,oDAAqDx+B,CAAK,CAC3E,CAAC,EACD,MAAM,QAAO,CACd,CACA,cAAe,CACd,GAAI,CAAC,KAAK,aAAc,MAAO,GAC/B,KAAK,UAAU,sBAAsB,KAAK,eAAe,EACzD,IAAI4+B,EAAM,EACV,UAAWC,KAAU,KAAK,gBAAiB,CAC1C,MAAMC,GAAcD,EAAS,KAAO,IACpCD,GAAOE,EAAaA,CACrB,CACA,OAAO,KAAK,KAAKF,EAAM,KAAK,gBAAgB,MAAM,CACnD,CACA,iBAAiBvlB,EAAO,CACvB,MAAMrR,EAAM,KAAK,IAAG,EACpB,OAAIqR,GAAS,KAAK,oBACjB,KAAK,aAAerR,EACb,IAEDA,EAAM,KAAK,aAAe,KAAK,eACvC,CACD,EAIA,MAAM+2B,GAAYtb,EAAS,EAC3B,IAAIub,GAAwB,cAAcpZ,EAAY,CACrD,YAAY/P,EAAS,CACpB,MAAK,EACL,KAAK,QAAUA,EACf,KAAK,uBAA0ByO,GAAU,CACxC,KAAK,kBAAkB,KAAKA,CAAK,CAClC,EACA,KAAK,cAAgB,KAAK,sBAAsB,IAAI,EACpD,KAAK,mBAAqB,KAAK,sBAAsB,CAAA,CAAE,EACvD,KAAK,mBAAqB,KAAK,sBAAsB,CAAA,CAAE,EACvD,KAAK,kBAAoB,KAAK,cAAa,CAC5C,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,cAAc,aAAY,EAAG,KAAK1M,EAAU,KAAK,UAAU,CAAC,CACzE,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,mBAAmB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAC9E,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,mBAAmB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAC9E,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,kBAAkB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAC7E,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,cAAc,KAC3B,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,mBAAmB,KAChC,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,mBAAmB,KAChC,CAIA,MAAM,kBAAmB,SACxBmnB,GAAU,MAAM,sDAAsD,EACtE,IAAIvgC,EACJ,GAAI,KAAK,QAAQ,kBAAoB,KAAK,QAAQ,iBAAkB,CACnE,MAAMygC,EAAS,CAAC,KAAG/iC,EAAA,KAAK,QAAQ,mBAAb,YAAAA,EAA+B,cAAe,CAAA,EAAI,KAAGC,EAAA,KAAK,QAAQ,mBAAb,YAAAA,EAA+B,cAAe,CAAA,CAAE,EACxHqC,EAAS,IAAI,YAAYygC,CAAM,CAChC,SAAW,KAAK,QAAQ,UAAY,cACnCF,GAAU,MAAM,kFAAmF,EAAQ,KAAK,QAAQ,2BAA4B,EACpJvgC,EAAS,MAAM,KAAK,QAAQ,gBAAgB,CAC3C,MAAO,GACP,MAAO,EAAQ,KAAK,QAAQ,2BAChC,CAAI,EACDugC,GAAU,MAAM,uDAAwDvgC,CAAM,MACxE,CACN,MAAM0tB,EAAc,CACnB,MAAO,KAAK,QAAQ,4BACpB,MAAO,KAAK,QAAQ,2BACxB,EACG6S,GAAU,MAAM,kEAAmE7S,CAAW,EAC9F1tB,EAAS,MAAM,KAAK,QAAQ,aAAa0tB,CAAW,EACpD6S,GAAU,MAAM,+CAAgDvgC,CAAM,CACvE,CACA,YAAK,cAAc,KAAKA,CAAM,EAC9B,KAAK,mBAAmB,KAAKA,EAAO,eAAc,CAAE,EACpD,KAAK,mBAAmB,KAAKA,EAAO,eAAc,CAAE,EAC7CA,CACR,CAMA,SAAS+yB,EAAO,CACf,MAAM2N,EAAc,KAAK,cAAc,OAAS,IAAI,YACpD,OAAA3N,EAAM,iBAAiB,QAAS,KAAK,sBAAsB,EAC3D2N,EAAY,SAAS3N,CAAK,EAC1B,KAAK,cAAc,KAAK2N,CAAW,EAC/B3N,EAAM,OAAS,QAAS,KAAK,mBAAmB,KAAK2N,EAAY,gBAAgB,EAChF,KAAK,mBAAmB,KAAKA,EAAY,eAAc,CAAE,EAC9DH,GAAU,MAAM,2BAA2BxN,EAAM,IAAI,gBAAiBA,EAAM,EAAE,EACvE2N,CACR,CAMA,YAAYC,EAAS,CACpB,MAAM3gC,EAAS,KAAK,cAAc,MAC5B+yB,EAAQ/yB,GAAA,YAAAA,EAAQ,YAAY,KAAMxD,GAAMA,EAAE,KAAOmkC,GACvD,GAAI,CAAC5N,EAAO,CACXwN,GAAU,MAAM,4CAA4CI,CAAO,EAAE,EACrE,MACD,CACA,OAAA5N,EAAM,oBAAoB,QAAS,KAAK,sBAAsB,EAC9D/yB,GAAA,MAAAA,EAAQ,YAAY+yB,GACpBA,EAAM,KAAI,EACV,KAAK,cAAc,KAAK/yB,CAAM,EAC1B+yB,EAAM,OAAS,QAAS,KAAK,mBAAmB,MAAK/yB,GAAA,YAAAA,EAAQ,mBAAoB,EAAE,EAClF,KAAK,mBAAmB,MAAKA,GAAA,YAAAA,EAAQ,mBAAoB,CAAA,CAAE,EAChEugC,GAAU,MAAM,2BAA2BxN,EAAM,IAAI,kBAAmB4N,CAAO,EACxE5N,CACR,CAIA,wBAAyB,CACxB,OAAO,KAAK,cAAc,OAAS,IAAI,WACxC,CAIA,eAAe/yB,EAAQ,CACtB,KAAK,cAAc,KAAKA,CAAM,CAC/B,CAIA,sBAAsB+yB,EAAO,CAC5BA,EAAM,iBAAiB,QAAS,KAAK,sBAAsB,CAC5D,CAIA,cAAc1b,EAAS,CACtB,KAAK,QAAU,CACd,GAAG,KAAK,QACR,GAAGA,CACN,CACC,CAIA,eAAgB,QACf3Z,EAAA,KAAK,cAAc,QAAnB,MAAAA,EAA0B,YAAY,QAASq1B,GAAU,CACxDwN,GAAU,MAAM,iDAAiDxN,EAAM,IAAI,EAAE,EAC7EA,EAAM,oBAAoB,QAAS,KAAK,sBAAsB,EAC9DA,EAAM,KAAI,CACX,EACD,CAIA,SAAU,CACT,KAAK,cAAa,EAClB,MAAM,QAAO,CACd,CACD,EAIA,MAAM6N,GAAY3b,EAAS,EACrB4b,GAAe,CAACC,EAAMC,IACvBD,GAAQC,EAAa,WAChBD,GAAQ,CAACC,EAAa,WACtB,CAACD,GAAQC,EAAa,WACxB,WAER,IAAIC,GAAwB,cAAc5Z,EAAY,CACrD,YAAY/P,EAAS,CACpB,MAAK,EACL,KAAK,eAAiBA,EAAQ,eAC9B,KAAK,QAAUA,CAChB,CACA,IAAI,oBAAqB,CACxB,OAAO,OAAO,KAAK,eAAe,gBAAmB,UACtD,CACA,IAAI,aAAc,CACjB,OAAO,OAAO,KAAK,eAAe,UAAa,UAChD,CACA,IAAI,cAAe,CAClB,OAAO,OAAO,KAAK,eAAe,WAAc,YAAc,CAAC,KAAK,oBAAsB,CAAC,KAAK,WACjG,CACA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,OACrB,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,UAAY,mBACzB,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,UAAY,aACzB,CACA,IAAI,aAAc,CACjB,MAAO,EAAQ,KAAK,QAAQ,SAC7B,CACA,IAAI,OAAQ,CACX,MAAO,EAAQ,KAAK,QAAQ,GAC7B,CACA,IAAI,cAAe,CAClB,MAAO,EAAQ,KAAK,QAAQ,YAC7B,CACA,IAAI,cAAe,CAClB,MAAO,EAAQ,KAAK,QAAQ,YAC7B,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,QAAQ,sBAAsB,WAC3C,CACA,IAAI,6BAA8B,CACjC,OAAO,KAAK,QAAQ,+BAA8B,CACnD,CACA,IAAI,6BAA8B,CACjC,OAAO,KAAK,QAAQ,+BAA8B,CACnD,CACA,IAAI,gBAAiB,CACpB,GAAI,KAAK,mBAAoB,MAAO,WACpC,KAAM,CAAE,YAAAqpB,CAAW,EAAK,KAClBO,EAAgBP,GAAA,YAAAA,EAAa,iBAAiB,KAAM3N,GAAUA,EAAM,SACpEmO,EAAmB,EAAQ,KAAK,4BAChCC,EAAsB,EAAQ,KAAK,aACzC,OAAON,GAAaI,GAAiBC,EAAkBC,CAAmB,CAC3E,CACA,IAAI,gBAAiB,CACpB,GAAI,KAAK,oBAAsB,KAAK,cAAe,MAAO,WAC1D,GAAI,KAAK,MAAO,MAAO,WACvB,KAAM,CAAE,YAAAT,CAAW,EAAK,KAClBU,EAAgBV,GAAA,YAAAA,EAAa,iBAAiB,KAAM3N,GAAUA,EAAM,SACpEsO,EAAmB,EAAQ,KAAK,4BAChCC,EAAsB,EAAQ,KAAK,aACzC,OAAOT,GAAaO,GAAiBC,EAAkBC,CAAmB,CAC3E,CACA,IAAI,eAAgB,CACnB,GAAK,KAAK,YACV,MAAO,CACN,IACA,IACA,GACH,EAAI,IAAKC,IAAS,CACf,OAAQ,GACR,IAAAA,EACA,sBAAuB,OAAOA,CAAG,EAAI,GAAK,CAC7C,EAAI,CACH,CAOA,kBAAkBre,EAAM,CACvB,MAAMwK,EAAcxK,IAAS,QAAU,KAAK,4BAA8B,KAAK,4BAC/E,OAAO,OAAOwK,GAAgB,UAAY,CAAA,EAAKA,CAChD,CACA,kBAAkBxK,EAAM,CACvB,OAAO,KAAK,eAAe,gBAAe,EAAG,OAAQ1mB,GAAM0mB,IAAS,QAAU1mB,EAAE,SAAS,MAAM,OAAS0mB,CAAI,CAC7G,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBAAkB,OAAO,CACtC,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBAAkB,OAAO,CACtC,CACA,MAAM,uBAAuB6P,EAAO2N,EAAac,EAAa,OAC7D,MAAMC,EAAU1O,EAAM,OAAS,QACzB3Q,EAAYqf,EAAU,KAAK,eAAiB,KAAK,eACjDC,EAAoB,CACzB,UAAAtf,EACA,cAAeqf,EAAU,OAAS,KAAK,cACvC,QAASrf,IAAc,WAAa,OAAS,CAACse,CAAW,CAC5D,EACEE,GAAU,MAAM,mEAAmE7N,EAAM,IAAI,UAAW,CACvG,YAAAyO,EACA,kBAAAE,CACH,CAAG,EACGA,EAAkB,WAAa,CAAC,WAAY,UAAU,EAAE,SAASA,EAAkB,SAAS,IAAOF,GACtG,MAAMA,EAAY,OAAO,aAAazO,CAAK,EAC3CyO,EAAY,UAAYE,EAAkB,WACtChkC,EAAAgkC,EAAkB,UAAlB,MAAAhkC,EAA2B,KAAMsC,GAAW,EAAQA,KACvD4gC,GAAU,MAAM,4EAA4E7N,EAAM,IAAI,UAAW2O,EAAkB,OAAO,EAC1IF,EAAY,OAAO,WAAW,GAAGE,EAAkB,OAAO,KAG3Dd,GAAU,MAAM,4DAA4D7N,EAAM,IAAI,UAAWA,EAAM,EAAE,EACzG,KAAK,eAAe,eAAeA,EAAO2O,CAAiB,GAE7D,CACA,gBAAgBxe,EAAM7L,EAAU,CAAE,2BAA4B,EAAK,EAAI,WACtE,GAAI,CACH,MAAMsqB,EAAe,KAAK,kBAAkBze,CAAI,EAChD,UAAWse,KAAeG,EAAc,KAAIjkC,EAAA8jC,EAAY,OAAO,QAAnB,YAAA9jC,EAA0B,cAAe,OAAQ,CAC5F,MAAMijC,EAAUa,EAAY,OAAO,MAAM,GACzCA,EAAY,OAAO,MAAM,KAAI,EAC7B,KAAK,QAAQ,sBAAsB,YAAYb,CAAO,EAClDtpB,EAAQ,6BAA4BmqB,EAAY,UAAY,WACjE,CACD,OAAShgC,EAAO,CACfo/B,GAAU,MAAM,gDAAiD1d,EAAM1hB,CAAK,GAC5E8G,GAAA3K,EAAA,KAAK,SAAQ,UAAb,MAAA2K,EAAA,KAAA3K,EAAuB,IAAIslB,GAAgB,kBAAmBC,EAAM1hB,CAAK,EAC1E,CACD,CACA,MAAM,mBAAmB0hB,EAAM,SAC9B,GAAI,CACH0d,GAAU,MAAM,oDAAqD1d,CAAI,EACzE,MAAMwK,EAAc,CAAA,EACdiU,EAAe,KAAK,kBAAkBze,CAAI,EAChD,UAAWse,KAAeG,EAAc,CACvC,KAAM,CAAE,MAAA5O,GAAUyO,EAAY,OAC9B,GAAI,CAACzO,GAASA,EAAM,aAAe,QAAS,CAC3C,MAAM6O,GAAY7O,GAAA,YAAAA,EAAO,OAAQyO,EAAY,SAAS,MAAM,MACxDI,IAAc,SAAWA,IAAc,WAASlU,EAAYkU,CAAS,EAAI,KAAK,kBAAkBA,CAAS,EAC9G,CACD,CAEA,GADAhB,GAAU,MAAM,0DAA2DlT,CAAW,EAClF,OAAO,KAAKA,CAAW,EAAE,SAAW,EAAG,CAC1CkT,GAAU,KAAK,yEAA0E1d,CAAI,EAC7F,MACD,CACA,MAAM2e,GAAa,MAAM,KAAK,QAAQ,aAAanU,CAAW,GAAG,UAAS,EAC1EkT,GAAU,MAAM,yDAA0DiB,CAAS,EACnF,UAAWC,KAAYD,EAAW,CACjC,KAAK,QAAQ,sBAAsB,SAASC,CAAQ,EACpD,MAAMF,EAAYE,EAAS,KACrBC,EAAoB,KAAK,kBAAkBH,CAAS,EAAE,CAAC,EAC7DG,EAAkB,UAAYH,IAAc,QAAU,KAAK,eAAiB,KAAK,eACjFhB,GAAU,MAAM,mEAAoEgB,EAAWG,EAAkB,SAAS,EAC1H,MAAMA,EAAkB,OAAO,aAAaD,CAAQ,CACrD,CACD,OAAStgC,EAAO,CACfo/B,GAAU,MAAM,mDAAoD1d,EAAM1hB,CAAK,GAC/E7D,GAAAD,EAAA,KAAK,SAAQ,UAAb,MAAAC,EAAA,KAAAD,EAAuB,IAAIulB,GAAgB,qBAAsBC,EAAM1hB,CAAK,EAC7E,CACD,CACA,MAAM,mBAAmB0hB,EAAM6P,EAAO,CACrC,MAAM4O,EAAeze,IAAS,QAAU,KAAK,kBAAoB,KAAK,kBACtE,UAAWse,KAAeG,EAAc,MAAMH,EAAY,OAAO,aAAazO,CAAK,CACpF,CACA,MAAM,wBAAwBa,EAAM,CACnC,GAAIA,IAAS,SACb,WAAW1Q,IAAQ,CAAC,QAAS,OAAO,EAAG,CACtC,MAAMye,EAAeze,IAAS,QAAU,KAAK,kBAAoB,KAAK,kBACtE,UAAWse,KAAeG,EAAc,CACvC,MAAMvf,EAAYc,IAAS,QAAU,KAAK,eAAiB,KAAK,eAC5D,CAAC,WAAY,UAAU,EAAE,SAASd,CAAS,IAC9Cof,EAAY,UAAYpf,EACxB,MAAMof,EAAY,OAAO,aAAa,IAAI,EAC1CA,EAAY,OAAO,WAAU,EAE/B,CACD,CACA,GAAI,KAAK,iBAAmB,YAAc,KAAK,OAAS,KAAK,mBAAoB,CAChF,KAAM,CAAE,gBAAAQ,EAAkB,CAAC,EAAK,KAAK,QACrC,QAAS,EAAI,EAAG,EAAI,OAAOA,CAAe,EAAG,IAAK,KAAK,eAAe,eAAe,QAAS,CAAE,UAAW,WAAY,CACxH,EACD,CACA,MAAM,yBAAyB9e,EAAMwK,EAAa,SACjD,GAAI,CAACA,EACJ,YAAK,gBAAgBxK,CAAI,EAClB,QAAQ,QAAO,EAEvB,MAAM+e,EAAU,KAAK,eAAe,WAAU,EAAG,OAAQC,GAAM,OAAK,QAAAxkC,EAAAwkC,EAAO,QAAP,YAAAxkC,EAAc,QAASwlB,GAAQgf,EAAO,MAAM,aAAe,OAAM,EACrI,UAAWA,KAAUD,EAAS,CAC7B,KAAM,CAAE,MAAAlP,CAAK,EAAKmP,EAClB,GAAInP,EAAO,CACV,MAAMoP,EAAqB,CAC1B,GAAGpP,EAAM,eAAc,EACvB,GAAGrF,CACR,EACI,GAAI,CACH,MAAMqF,EAAM,iBAAiBoP,CAAkB,EAC/CvB,GAAU,MAAM,mCAAmC1d,CAAI,uBAAwBif,CAAkB,EACjGvB,GAAU,MAAM,mCAAmC1d,CAAI,uBAAwB6P,EAAM,gBAAgB,CACtG,OAASvxB,EAAO,CACfo/B,GAAU,KAAK,uDAAuD1d,CAAI,UAAU6P,EAAM,EAAE,2CAA4CvxB,CAAK,EAC7I,GAAI,CACH,MAAM,KAAK,qBAAqB0gC,EAAQnP,EAAO7P,EAAMif,CAAkB,CACxE,OAASC,EAAe,CACvBxB,GAAU,KAAK,sEAAsE1d,CAAI,UAAWkf,CAAa,GACjHzkC,GAAAD,EAAA,KAAK,SAAQ,UAAb,MAAAC,EAAA,KAAAD,EAAuB,IAAIulB,GAAgB,2BAA4BC,EAAMkf,CAAa,EAC3F,CACD,CACD,CACD,CACD,CASA,MAAM,qBAAqBF,EAAQG,EAAUnf,EAAMof,EAAmB,CACrE,KAAM,CAAE,SAAAC,CAAQ,EAAKF,EAAS,YAAW,EACnCG,EAAwB,CAC7B,GAAGF,EACH,GAAGC,EAAW,CAAE,SAAU,CAAE,MAAOA,CAAQ,CAAE,EAAK,CAAA,CACrD,EACQ5B,EAAU0B,EAAS,GACzBA,EAAS,KAAI,EACb,KAAK,QAAQ,sBAAsB,YAAY1B,CAAO,EACtD,MAAMmB,GAAY,MAAM,KAAK,QAAQ,aAAa,CAAE,CAAC5e,CAAI,EAAGsf,CAAqB,CAAE,GAAG,UAAS,EAAG,KAAMhmC,GAAMA,EAAE,OAAS0mB,CAAI,EAC7H,GAAI,CAAC4e,EAAU,MAAM,IAAI7e,GAAgB,uBAAwBC,EAAsB,IAAI,MAAM,sDAAsD,CAAC,EACxJ,MAAMgf,EAAO,aAAaJ,CAAQ,EAClC,KAAK,QAAQ,sBAAsB,SAASA,CAAQ,EACpDlB,GAAU,MAAM,oEAAoE1d,CAAI,gBAAgB4e,EAAS,EAAE,EAAE,CACtH,CACA,oBAAqB,CACpB,OAAI,KAAK,eAAe,kBAAoB,YAAoB,KAAK,eAAe,gBAAe,EAAG,OAAO,CAAC3Y,EAAKqY,KAC3G,CACN,GAAGrY,EACH,CAACqY,EAAY,SAAS,MAAM,IAAI,EAAGA,EAAY,SACnD,GACK,CACF,MAAO,WACP,MAAO,UACV,CAAG,EACM,CACN,MAAO,KAAK,eACZ,MAAO,KAAK,cACf,CACC,CACA,qBAAqBvO,EAAgB,CACpC,KAAK,eAAiBA,CACvB,CACA,cAAc5b,EAAS,CACtB,KAAK,QAAU,CACd,GAAG,KAAK,QACR,GAAGA,CACN,CACC,CACD,EAIA,MAAMorB,EAAYxd,EAAS,EAC3B,IAAIyd,GAA8B,cAActb,EAAY,CAC3D,YAAY/P,EAAU,GAAIsrB,EAA0B3Q,EAAkB,CACrE,MAAK,EACL,KAAK,QAAU3a,EACf,KAAK,0BAA4B,GACjC,KAAK,mBAAqB,KAAK,cAAa,EAC5C,KAAK,kBAAoB/D,GAAM,IAAM3R,GAAK,KAAK,KAAI,CAAE,CAAC,EAAE,KAAKqX,GAAU,IAAM,KAAK,uBAAuB,oBAAoB,KAAK7E,EAAQyuB,GAAsB,CAAC,CAAC,MAAO,WAAW,EAAE,SAASA,CAAiB,CAAC,EAAGtpB,GAAI,IAAM,CAC7N,KAAK,iBAAgB,CACtB,CAAC,EAAGnF,EAAO,IAAM,KAAK,0BAA0B,EAAG3D,EAAI,IAAA,OAAM,OAAA9S,EAAA,KAAK,iBAAL,YAAAA,EAAqB,iBAAgB,EAAG2nB,GAAU,EAAI/L,GAAKupB,GAAS,CAC5HA,EAAK,OAAS,WAAU,KAAK,MAAQ,QAC1C,CAAC,CAAC,CAAC,EAAGrqB,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,EAChD,KAAK,kBAAoB,IACzB,KAAK,kCAAoC,IAAM,CAC9C,GAAI,KAAK,eAAgB,CACxB,KAAM,CAAE,mBAAA0pB,GAAuB,KAAK,eACpCL,EAAU,MAAM,kEAAkEK,CAAkB,EAAE,EACtG,KAAK,qBAAqB,KAAK,KAAK,eAAe,kBAAkB,CACtE,CACD,EACA,KAAK,+BAAiC,IAAM,CAC3C,GAAI,KAAK,eAAgB,CACxB,KAAM,CAAE,gBAAAC,GAAoB,KAAK,eACjCN,EAAU,MAAM,8DAA8DM,CAAe,EAAE,EAC3FA,IAAoB,aAAa,KAAK,sBAAqB,EAC/D,KAAK,kBAAkB,KAAK,KAAK,eAAe,eAAe,CAChE,CACD,EACA,KAAK,8BAAgC,IAAM,OAC1CN,EAAU,MAAM,8DAA6D/kC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,cAAc,EAAE,CACnH,EACA,KAAK,iCAAmC,IAAM,CACzC,KAAK,gBAAgB,KAAK,oBAAoB,KAAK,KAAK,eAAe,iBAAiB,CAC7F,EACA,KAAK,2BAA8BooB,GAAU,CAC5C2c,EAAU,MAAM,mEAAoE3c,CAAK,EACzF,KAAK,mBAAmB,KAAI,CAC7B,EACA,KAAK,0BAA4B,MAAO5C,EAAMiJ,IAAe,WAC5D,GAAI,CACH,KAAM,CAAE,YAAAuU,CAAW,EAAK,KACxB,GAAI,CAACA,EAAa,CACjB+B,EAAU,KAAK,iFAAiF,EAChG,MACD,CACAA,EAAU,MAAM,mDAAmDvf,CAAI,iBAAkBwd,EAAY,WAAW,EAChH,MAAM3N,EAAQ2N,EAAY,YAAY,KAAMsC,GAAYA,EAAQ,OAAS9f,CAAI,EAC7E,GAAI6P,EAAO,CAIV,IAHAr1B,EAAA,KAAK,wBAAL,MAAAA,EAA4B,gBAAgBwlB,GAC5C,KAAK,sBAAsB,YAAY6P,EAAM,EAAE,EAC/C0P,EAAU,MAAM,kDAAkDvf,CAAI,WAAW6P,EAAM,EAAE,GAAI2N,EAAY,UAAS,CAAE,EAChH,CAACvU,EAAY,CAChBsW,EAAU,MAAM,iCAAiCvf,CAAI,8BAA8B,EACnF,MACD,CACA,MAAM+f,GAAe,MAAM,KAAK,aAAa,CAAE,CAAC/f,CAAI,EAAG,CACtD,GAAG6P,EAAM,eAAc,EACvB,GAAG,KAAK,iBAAiB,wBAAwB5G,CAAU,CACjE,EAAQ,GAAG,UAAS,EAAG,KAAM3vB,GAAMA,EAAE,OAAS0mB,CAAI,EACzC+f,IACHR,EAAU,MAAM,4CAA4Cvf,CAAI,WAAW+f,EAAY,EAAE,EAAE,EAC3F,KAAK,sBAAsB,SAASA,CAAW,EAC/C,OAAMtlC,EAAA,KAAK,wBAAL,YAAAA,EAA4B,mBAAmBulB,EAAM+f,IAC3DR,EAAU,MAAM,2CAA2Cvf,CAAI,WAAW+f,EAAY,EAAE,IAAI36B,EAAA,KAAK,cAAL,YAAAA,EAAkB,WAAW,EAE3H,CACAm6B,EAAU,MAAM,iCAAiCvf,CAAI,0BAA2BiJ,GAAA,YAAAA,EAAY,KAAK,CAClG,OAAS3qB,EAAO,CACf,MAAAihC,EAAU,MAAM,kDAAkDvf,CAAI,iBAAkB1hB,CAAK,EAC7F,KAAK,SAAS,KAAK,IAAIyhB,GAAgB,4BAA6BC,EAAM1hB,CAAK,CAAC,EAC1EA,CACP,CACD,EACA,KAAK,gBAAkB,KAAK,sBAAsB,EAAK,EACvD,KAAK,UAAY,KACjB,KAAK,qBAAuB,KAAK,oBAAoB,CAAC,EACtD,KAAK,kBAAoB,KAAK,oBAAoB,CAAC,EACnD,KAAK,iBAAmB,KAAK,oBAAoB,CAAC,EAClD,KAAK,oBAAsB,KAAK,oBAAoB,CAAC,EACrD,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,gBAAkB,KAAK,oBAAoB,CAAC,EACjD,KAAK,cAAgB,KAAK,oBAAoB,CAAC,EAC/C,KAAK,oBAAsB,KAAK,oBAAoB,CAAC,EACrD,KAAK,eAAiB,KAAK,sBAAsB,IAAI,EACrD,KAAK,4BAA8B,KACnC,KAAK,oBAAsB,KAC3B,KAAK,iBAAmBwwB,GAAoB,CAAA,EAC5C,KAAK,GAAK3a,EAAQ,QAAU2P,GAAE,EAC9B,KAAK,MAAQ2b,EAA2B,SAAW,QACnD,KAAK,QAAUA,EAA2B,CACzC,KAAM,QACN,IAAKA,CACR,EAAM,OACJ,KAAK,4BAA8BA,EAA2B7F,GAA8B6F,CAAwB,EAAI,KACxH,MAAMO,EAAgB,KAAK,4BAA8B,CACxD,MAAO,KAAK,4BAA4B,MAAM,SAAS,MAAM,EAC7D,MAAO,KAAK,4BAA4B,MAAM,SAAS,MAAM,EAC7D,aAAc,KAAK,4BAA4B,MAAM,SAAS,MAAM,EACpE,aAAc,KAAK,4BAA4B,MAAM,SAAS,MAAM,CACvE,EAAM,CAAA,EACJ,KAAK,QAAU,CACd,GAAG7rB,EACH,MAAOA,EAAQ,OAAS6rB,EAAc,MACtC,MAAO7rB,EAAQ,OAAS6rB,EAAc,MACtC,aAAc7rB,EAAQ,cAAgB6rB,EAAc,cAAgBpY,EAAqB,SAAS,aAClG,aAAczT,EAAQ,cAAgB6rB,EAAc,cAAgBpY,EAAqB,SAAS,YACrG,EACE,KAAK,sBAAwB,IAAI0V,GAAsB,CACtD,QAAS,KAAK,QACd,iBAAkB,KAAK,QAAQ,iBAC/B,iBAAkB,KAAK,QAAQ,iBAC/B,4BAA6B,KAAK,4BAClC,4BAA6B,KAAK,4BAClC,aAAc,MAAO9S,GAAgB,KAAK,aAAaA,CAAW,EAClE,gBAAiB,MAAOyV,GAAc,KAAK,gBAAgBA,CAAS,CACvE,CAAG,CACF,CACA,IAAI,wBAAyB,CAC5B,GAAI,CAAC,KAAK,wBAAyB,MAAM,IAAIlhB,GAAgB,2CAA2C,EACxG,OAAO,KAAK,uBACb,CACA,IAAI,4BAA6B,CAChC,GAAI,CAAC,KAAK,eAAgB,MAAO,GACjC,KAAM,CAAE,iBAAAmhB,EAAkB,eAAAC,CAAc,EAAK,KAAK,eAClD,MAAI,CAACD,GAAoB,CAAC/F,GAAwB+F,EAAiB,GAAG,EAAU,GACzEA,EAAiB,OAAS,SAAWC,IAAmB,oBAAsBD,EAAiB,OAAS,UAAYC,IAAmB,QAC/I,CACA,uBAAwB,CACnB,KAAK,kBACR,aAAa,KAAK,eAAe,EACjC,KAAK,gBAAkB,OAEzB,CACA,YAAYC,EAAU,CACrB,KAAK,UAAYA,CAClB,CACA,IAAI,UAAW,CACd,OAAO,KAAK,SACb,CACA,gBAAgBpgB,EAAM7L,EAAU,CAAE,2BAA4B,EAAK,EAAI,WACtE,MAAMksB,EAAergB,IAAS,SAAWA,IAAS,OAC9CqgB,GAAgB,KAAK,qBAAqB,KAAK,6BAA4B,EAC1EA,EACIrgB,IAAS,QAAQvlB,EAAA,KAAK,wBAAL,MAAAA,EAA4B,gBAAgB,QAAS0Z,GACrE,KAAK,sBAAqB/O,EAAA,KAAK,wBAAL,MAAAA,EAA4B,gBAAgB4a,EAAM7L,IAFnE3Z,EAAA,KAAK,wBAAL,MAAAA,EAA4B,gBAAgBwlB,EAAM7L,EAGtE,CACA,8BAA+B,OAC9B,MAAMmsB,EAAY,KAAK,sBAAsB,iBAC7C,UAAWzQ,KAASyQ,EAAezQ,EAAM,aAAe,SACvDA,EAAM,KAAI,EACV,KAAK,sBAAsB,YAAYA,EAAM,EAAE,IAEhDr1B,EAAA,KAAK,sBAAL,MAAAA,EAA0B,cAAc,KACzC,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,CACzC,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,gBAAgB,KAC7B,CACA,0BAA0B2Z,EAAS,CAClC,KAAK,QAAU,CACd,GAAG,KAAK,QACR,GAAGA,CACN,CACC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,oBAAoB,aAAY,EAAG,KAAK+B,EAAU,KAAK,UAAU,CAAC,CAAC,CAClI,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,iBAAiB,mBAAoB,IAAM,KAAK,sBAAsB,iBAAiB,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CACpI,CACA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,SAAS,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5G,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,iBAAiB,iBAAkB,IAAM,KAAK,gBAAgB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAC1H,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,cAAc,eAAe,KAAKjF,EAAQsvB,GAAgBA,CAAW,EAAGrqB,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5J,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,oBAAoB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAClI,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,sBAAsB,aAAa,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5H,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,iBAAiB,gBAAiB,IAAM,KAAK,eAAe,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CACxH,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,sBAAsB,kBAAkB,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CACtI,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,sBAAsB,kBAAkB,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CACtI,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,iBAAiB,sBAAuB,IAAM,KAAK,qBAAqB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CACpI,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,iBAAiB,mBAAoB,IAAM,KAAK,kBAAkB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAC9H,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,iBAAiB,aAAY,EAAG,KAAKA,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5H,CACA,IAAI,MAAO,CACV,OAAO,KAAK,KACb,CACA,IAAI,SAAU,CACb,OAAO,KAAK,QAAQ,SAAW,MAChC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,UAAY,mBACzB,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,UAAY,MACzB,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,UAAY,aACzB,CACA,IAAI,YAAa,CAChB,GAAI,CAAC,KAAK,QAAQ,qBAAsB,OAAO,KAAK,QAAQ,YAAc,CAAA,EAC1E,MAAMsqB,EAAoB,gBAC1B,OAAQ,KAAK,QAAQ,YAAc,CAAA,GAAI,IAAKC,GAAW,CACtD,MAAMC,EAAO,MAAM,QAAQD,EAAO,IAAI,EAAIA,EAAO,KAAO,CAACA,EAAO,IAAI,EACpE,MAAO,CACN,GAAGA,EACH,KAAMC,EAAK,OAAQ5a,GAAQA,EAAI,SAAS0a,CAAiB,CAAC,CAC9D,CACE,CAAC,CACF,CACA,IAAI,kBAAmB,CACtB,KAAM,CAAE,WAAYG,EAAa,GAAGC,CAAW,EAAK,KAAK,QACzD,MAAO,CACN,aAAc,aACd,qBAAsB,GACtB,WAAY,KAAK,WACjB,mBAAoB,KAAK,QAAQ,UAAY,QAAU,MACvD,aAAc,eACd,GAAGA,CACN,CACC,CACA,IAAI,cAAe,CAClB,MAAO,EAAQ,KAAK,QAAQ,YAC7B,CACA,IAAI,cAAe,CAClB,MAAO,EAAQ,KAAK,QAAQ,YAC7B,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,sBAAsB,WACnC,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,eAAe,KAC5B,CACA,IAAI,6BAA8B,CACjC,GAAI,KAAK,QAAQ,QAAU,IAAS,CAAC,KAAK,QAAQ,4BAA6B,MAAO,GACtF,MAAMC,EAAoB,KAAK,iBAAiB,oCAChD,OAAIA,IAAsB,GAAc,GAGjC,CACN,GAHiB,OAAO,KAAK,QAAQ,6BAAgC,SAAW,KAAK,QAAQ,4BAA8B,CAAA,EAI3H,GAHmB,OAAOA,GAAsB,SAAWA,EAAoB,CAAA,CAIlF,CACC,CACA,IAAI,6BAA8B,CACjC,GAAI,CAAC,KAAK,QAAQ,OAAS,CAAC,KAAK,QAAQ,4BAA6B,MAAO,GAC7E,MAAMA,EAAoB,KAAK,iBAAiB,oCAChD,OAAIA,IAAsB,GAAc,GAGjC,CACN,GAHiB,OAAO,KAAK,QAAQ,6BAAgC,SAAW,KAAK,QAAQ,4BAA8B,CAAA,EAI3H,GAHmB,OAAOA,GAAsB,SAAWA,EAAoB,CAAA,CAIlF,CACC,CACA,IAAI,iCAAkC,OACrC,QAAOrmC,EAAA,KAAK,QAAQ,oBAAb,YAAAA,EAAgC,oBAAqB,iBAC7D,CACA,IAAI,cAAe,CAClB,MAAM2Z,EAAU,CAAE,WAAY,KAAK,0BAA4B,GAAO,MAAM,EAC5E,OAAQ,KAAK,QAAO,CACnB,IAAK,cACL,IAAK,oBAAqB,MAAO,CAChC,GAAGA,EACH,oBAAqB,GACrB,oBAAqB,EACzB,EACG,IAAK,OACL,QAAS,MAAO,CACf,GAAGA,EACH,oBAAqB,KAAK,QAAQ,cAAgB,GAClD,oBAAqB,KAAK,QAAQ,cAAgB,EAAQ,KAAK,2BACnE,CACA,CACC,CACA,IAAI,eAAgB,CACnB,MAAO,CAAE,WAAY,KAAK,0BAA4B,GAAO,MAAM,CACpE,CAOA,MAAM,MAAO,CACZ,YAAK,cAAL,KAAK,YAAgB,KAAK,OAAM,GACzB,KAAK,WACb,CAKA,MAAM,QAAS,CACd,GAAI,CACH,KAAK,oBAAmB,EACxB,KAAK,YAAY,KAAK,mBAAmB,KAAKvC,GAAU,CAAC,EAAGkC,GAAW,SAAY,KAAK,iBAAgB,CAAE,CAAC,EAAG,CAC7G,KAAM,IAAM,CACXyrB,EAAU,MAAM,wEAAwE,CACzF,EACA,MAAQjhC,GAAU,CACjBihC,EAAU,MAAM,yDAA0DjhC,CAAK,EAC/E,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,CAClC,CACJ,CAAI,EACD,KAAK,YAAYuS,GAAM,KAAK,iBAAiB,0BAA0B,KAAKvD,EAAK2b,GAAe,CAAC,QAASA,CAAU,CAAC,CAAC,EAAG,KAAK,iBAAiB,0BAA0B,KAAK3b,EAAK2b,GAAe,CAAC,QAASA,CAAU,CAAC,CAAC,CAAC,EAAE,KAAKtT,GAAU,IAAM,CAAC,KAAK,sBAAsB,WAAW,CAAC,EAAG,MAAO,CAACqK,EAAMiJ,CAAU,IAAM,CACxTsW,EAAU,MAAM,mEAAoE,CACnF,KAAAvf,EACA,WAAAiJ,CACL,CAAK,EACD,MAAM,KAAK,0BAA0BjJ,EAAMiJ,CAAU,CACtD,CAAC,EACG,KAAK,OAAS,UAAY,KAAK,SAClC,MAAM,KAAK,kBAAiB,EAC5B,KAAK,cAAc,KAAK,EAAI,EAC5B,KAAK,oBAAmB,EACxB,KAAK,gBAAgB,KAAK,EAAI,EAC9B,MAAM,KAAK,sBAAsB,KAAK,OAAO,IAE7C,MAAM,KAAK,mBAAkB,EAC7B,KAAK,cAAc,KAAK,EAAI,EAE9B,OAAS3qB,EAAO,CACfihC,EAAU,MAAM,sDAAuDjhC,CAAK,EAC5E,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,EACjC,KAAK,QAAO,CACb,CACD,CACA,qBAAsB,CACrB,KAAK,eAAiB,IAAI,KAAK,gCAAgC,KAAK,gBAAgB,EACpF,KAAK,eAAe,iBAAiB,oBAAqB,KAAK,0BAA0B,EACzF,KAAK,wBAA0B,IAAIm+B,GAAuB,KAAK,eAAgB,KAAK,eAAgB,CACnG,oBAAqB,KAAK,QAAQ,oBAClC,oBAAqB,KAAK,QAAQ,oBAClC,UAAW,KAAK,QAAQ,SAC3B,CAAG,EACD,KAAK,sBAAwB,IAAIqB,GAAsB,CACtD,eAAgB,KAAK,eACrB,QAAS,KAAK,QACd,UAAW,KAAK,QAAQ,UACxB,IAAK,KAAK,QAAQ,IAClB,gBAAiB,KAAK,QAAQ,gBAC9B,aAAc,KAAK,aACnB,aAAc,KAAK,aACnB,sBAAuB,KAAK,sBAC5B,+BAAgC,IAAM,KAAK,4BAC3C,+BAAgC,IAAM,KAAK,4BAC3C,aAAc,MAAOtT,GAAgB,KAAK,aAAaA,CAAW,EAClE,QAAUlsB,GAAU,CACnB,KAAK,SAAS,KAAKA,CAAK,CACzB,CACH,CAAG,CACF,CACA,MAAM,kBAAmB,CACxB,GAAI,KAAK,cAAe,CACvBihC,EAAU,MAAM,0EAA0E,EAC1F,MACD,CAEA,GADA,KAAK,oBAAmB,EACpB,KAAK,OAAS,SAAU,CAC3BA,EAAU,MAAM,sFAAsF,EACtG,MACD,CACA,KAAK,gBAAgB,KAAK,EAAI,EAC9BA,EAAU,MAAM,qDAAqD,EACrE,GAAI,CACH,KAAM,CAAE,aAAAuB,CAAY,EAAK,KACzBvB,EAAU,MAAM,6DAA8DuB,CAAY,EAC1F,MAAM,KAAK,YAAYA,CAAY,CACpC,OAASxiC,EAAO,CACfihC,EAAU,MAAM,0DAA2DjhC,CAAK,EAChF,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,CAClC,CACD,CAIA,MAAM,YAAY6V,EAAS,CAC1B,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAI4K,GAAgB,sCAAsC,EAC1F,MAAMsR,EAAQ,MAAM,KAAK,eAAe,YAAYlc,CAAO,EAC3D,MAAM,KAAK,oBAAoBkc,CAAK,CACrC,CACA,MAAM,mBAAmB,CAAE,OAAA0Q,EAAQ,IAAAlH,GAAO,CACzC,IAAImH,EAAiBD,IAAW,SAChC,GAAI,CACCA,IAAW,YAAclH,IAC5B0F,EAAU,MAAM,qDAAsD1F,CAAG,EACzE,MAAM,KAAK,sBAAsB,CAChC,KAAM,SACN,IAAAA,CACL,CAAK,EAEH,OAASv7B,EAAO,CACfihC,EAAU,MAAM,8DAA+DjhC,CAAK,EACpF,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,EACjC0iC,EAAiB,EAClB,QAAC,CACIA,EAAgB,KAAK,eAAc,EAClC,KAAK,uBAAuB,iCAAgC,CAClE,CACD,CACA,MAAM,kBAAkB,CAAE,OAAAD,EAAQ,IAAAlH,GAAO,CACxC,OAAQkH,EAAM,CACb,IAAK,WACJ,KAAK,MAAQ,SACb,KAAK,QAAU,CACd,KAAM,QACN,IAAAlH,CACL,EACI,MAAM,KAAK,oBAAmB,EAC9B,MACD,IAAK,SACJ0F,EAAU,MAAM,uEAAuE,EACvF,KAGJ,CACC,CAMA,MAAM,cAAc0B,EAAgB,OACnC,GAAIA,EAAgB,CACnB,KAAM,CAAE,MAAAxK,EAAO,MAAAC,EAAO,aAAAlC,EAAc,aAAAC,EAAc,sBAAAyM,CAAqB,EAAKD,EAC5E,KAAK,QAAU,CACd,GAAG,KAAK,QACR,GAAGxK,IAAU,OAAS,CAAE,MAAAA,CAAK,EAAK,CAAA,EAClC,GAAGC,IAAU,OAAS,CAAE,MAAAA,CAAK,EAAK,CAAA,EAClC,GAAGlC,IAAiB,OAAS,CAAE,aAAAA,CAAY,EAAK,CAAA,EAChD,GAAGC,IAAiB,OAAS,CAAE,aAAAA,CAAY,EAAK,CAAA,EAChD,GAAGyM,IAA0B,OAAS,CAAE,sBAAAA,GAA0B,CAAA,CACtE,GACG1mC,EAAA,KAAK,wBAAL,MAAAA,EAA4B,cAAc,CACzC,aAAc,KAAK,aACnB,aAAc,KAAK,YACvB,GACG,KAAK,sBAAsB,cAAc,CACxC,4BAA6B,KAAK,4BAClC,4BAA6B,KAAK,2BACtC,CAAI,CACF,CACA,MAAM,KAAK,iBAAgB,EAC3B,KAAM,CAAE,cAAA2mC,CAAa,EAAK,KAC1B5B,EAAU,MAAM,sEAAuE4B,CAAa,EACpG,MAAM,KAAK,aAAaA,CAAa,CACtC,CACA,MAAM,qBAAsB,CAC3B,GAAI,CAAC,KAAK,QAAS,MAAM,IAAIpiB,GAAgB,2CAA2C,EACxF,KAAK,gBAAgB,KAAK,EAAI,EAC9B,MAAM,KAAK,sBAAsB,KAAK,OAAO,EAC7C,KAAM,CAAE,cAAAoiB,CAAa,EAAK,KAC1B5B,EAAU,MAAM,8DAA+D4B,CAAa,EAC5F,MAAM,KAAK,aAAaA,CAAa,CACtC,CACA,gBAAiB,CAChB,KAAK,0BAA4B,GACjC,KAAK,gBAAkB,WAAW,IAAM,OACvC,KAAK,sBAAqB,IACtB3mC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,mBAAoB,cAC5C+kC,EAAU,MAAM,6FAA6F,EAC7G,KAAK,uBAAuB,iCAAgC,EAE9D,EAAG,KAAK,iBAAiB,CAC1B,CACA,MAAM,2BAA2B1F,EAAM,GAAI,CAC1C,OAAO,QAAQ,QAAQA,CAAG,CAC3B,CACA,MAAM,oBAAoB9M,EAAQ,OACjC,MAAMqU,EAAa,MAAM,KAAK,0BAA0BrU,EAAO,GAAG,EAClE,OAAOvyB,EAAA,KAAK,iBAAL,YAAAA,EAAqB,oBAAoB,CAC/C,GAAGuyB,EACH,IAAKqU,CACR,EACC,CACA,MAAM,0BAA0BvH,EAAM,GAAI,CACzC,IAAI/7B,EAAS+7B,EACb,MAAMwH,EAAuB,KAAK,QAAQ,sBAAwBzZ,EAAqB,SAAS,qBAC1F0Z,EAAuB,KAAK,QAAQ,sBAAwB1Z,EAAqB,SAAS,qBAC1F2Z,EAAS,KAAK,QAAQ,QAAU3Z,EAAqB,SAAS,YACpE,OAAIyZ,EAAqB,OAAS,GAAKC,EAAqB,OAAS,KACpExjC,EAAS29B,GAAoB39B,EAAQujC,EAAsBC,CAAoB,EAC/E/B,EAAU,MAAM,iEAAkE,CACjF,qBAAA8B,EACA,qBAAAC,CACJ,CAAI,GAEEC,IACHzjC,EAASi9B,GAAiBj9B,CAAM,EAChCyhC,EAAU,MAAM,0DAA0D,GAEpE,QAAQ,QAAQzhC,CAAM,CAC9B,CAIA,MAAM,aAAaqW,EAAS,CAC3B,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAI4K,GAAgB,sCAAsC,EAC1F,MAAMyiB,EAAS,MAAM,KAAK,eAAe,aAAartB,CAAO,EAC7D,MAAM,KAAK,oBAAoBqtB,CAAM,CACtC,CAIA,qBAAsB,CACrB,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAIziB,GAAgB,sCAAsC,EAC1F,KAAK,qBAAqB,KAAK,KAAK,eAAe,kBAAkB,EACrE,KAAK,kBAAkB,KAAK,KAAK,eAAe,eAAe,EAC/D,KAAK,iBAAiB,KAAK,KAAK,eAAe,cAAc,EAC7D,KAAK,oBAAoB,KAAK,KAAK,eAAe,iBAAiB,EACnE,KAAK,oBAAoB,KAAK,KAAK,eAAe,iBAAiB,EACnE,KAAK,eAAe,oBAAoB,0BAA2B,KAAK,gCAAgC,EACxG,KAAK,eAAe,iBAAiB,0BAA2B,KAAK,gCAAgC,EACrG,KAAK,eAAe,oBAAoB,2BAA4B,KAAK,iCAAiC,EAC1G,KAAK,eAAe,iBAAiB,2BAA4B,KAAK,iCAAiC,EACvG,KAAK,eAAe,oBAAoB,wBAAyB,KAAK,8BAA8B,EACpG,KAAK,eAAe,iBAAiB,wBAAyB,KAAK,8BAA8B,EACjG,KAAK,eAAe,oBAAoB,uBAAwB,KAAK,6BAA6B,EAClG,KAAK,eAAe,iBAAiB,uBAAwB,KAAK,6BAA6B,CAChG,CACA,kBAAmB,CAClB,KAAK,gBAAgB,KAAK,EAAK,CAChC,CAeA,MAAM,kBAAkB0iB,EAAW,CAClC,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAI1iB,GAAgB,sCAAsC,EAC1F,MAAM2iB,EAAgBD,GAAa,CAAC,KAAK,QAAQ,UACjD,GAAIC,EAAe,GAAI,CACtB,KAAK,eAAe,iBAAiB,CACpC,GAAG,KAAK,eAAe,iBAAgB,EACvC,mBAAoB,OACxB,CAAI,EACDnC,EAAU,MAAM,sEAAsE,CACvF,OAASjhC,EAAO,CACfihC,EAAU,KAAK,iEAAkEjhC,CAAK,CACvF,CACA,KAAK,oBAAmB,EACxB,KAAK,gBAAgB,KAAK,EAAI,EAC9BihC,EAAU,MAAM,uDAAuDkC,EAAY,gBAAkB,EAAE,GAAG,EAC1G,GAAI,CACH,MAAMpR,EAAQ,MAAM,KAAK,eAAe,YAAY,CAAE,WAAY,GAAM,EACxE,MAAM,KAAK,oBAAoBA,CAAK,CACrC,OAAS/xB,EAAO,CACf,MAAAihC,EAAU,MAAM,0DAA2DjhC,CAAK,EAChF,KAAK,SAAS,KAAKmqB,GAAQnqB,CAAK,CAAC,EACjC,KAAK,iBAAgB,EACjBojC,GAAe,KAAK,0BAAyB,EAC3CpjC,CACP,CACIojC,GAAep1B,GAAe6E,GAAK,KAAK,oBAAoB,KAAKF,EAAQtK,GAAUA,IAAU,UAAU,EAAGyM,GAAK,CAAC,CAAC,EAAG9C,GAAM6L,EAAiC,EAAE,KAAK7O,EAAI,IAAM,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,IAAM,KAAK,0BAAyB,CAAE,EAAE,MAAOhP,GAAU,CAC3PihC,EAAU,KAAK,6EAA8EjhC,CAAK,EAClG,KAAK,0BAAyB,CAC/B,CAAC,CACF,CACA,2BAA4B,OAC3B,GAAI,EACH9D,EAAA,KAAK,iBAAL,MAAAA,EAAqB,iBAAiB,CACrC,GAAG,KAAK,eAAe,iBAAgB,EACvC,mBAAoB,KAAK,QAAQ,UAAY,QAAU,KAC3D,GACG+kC,EAAU,MAAM,6DAA6D,CAC9E,OAASjhC,EAAO,CACfihC,EAAU,KAAK,wEAAyEjhC,CAAK,CAC9F,CACD,CAIA,MAAM,oBAAqB,CAC1B,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAIygB,GAAgB,sCAAsC,EAC1F,MAAM,KAAK,iBAAgB,EAC3B,MAAM,KAAK,kBAAiB,CAC7B,CACA,MAAM,kBAAmB,mBAExB,GADAwgB,EAAU,MAAM,qEAAqE,EACjF,KAAK,wBAAyB,CACjC,GAAI,CAAC,KAAK,cAAgB,CAAC,KAAK,aAAc,MAAM,IAAIjgB,GAAc,yEAAyE,EAC/IigB,EAAU,MAAM,mFAAmF,EACnG,KAAK,6BAA4B,EACjC,MACD,CACA,IAAI/B,EACJ,GAAI,CACHA,EAAc,KAAK,aAAe,MAAM,KAAK,sBAAsB,iBAAgB,CACpF,OAASl/B,EAAO,CACf,KAAK,wBAAwBA,CAAK,EAClC,MACD,CACA,KAAI9D,EAAA,KAAK,wBAAL,YAAAA,EAA4B,eAAgB,GAAO,CACtD+kC,EAAU,KAAK,mFAAmF,GAClG9kC,EAAA,KAAK,iBAAL,MAAAA,EAAqB,UAAU+iC,GAC1B,KAAK,gBACT+B,EAAU,MAAM,mFAAmF,EACnG,KAAK,mBAAmB,KAAI,GAE7B,MACD,CACA,UAAWvf,IAAQ,CAAC,QAAS,OAAO,EAAG,CACtC,MAAMud,GAAUvd,IAAS,QAAUwd,EAAY,eAAc,EAAKA,EAAY,eAAc,GAAI,IAAI,CAAC3N,EAAO9vB,KAAW,CACtH,MAAAA,EACA,MAAA8vB,CACJ,EAAK,EACF,SAAW,CAAE,MAAA9vB,EAAO,MAAA8vB,CAAK,IAAM0N,EAE9B,GADA,KAAK,sBAAsB,sBAAsB1N,CAAK,IAClDzqB,EAAA,KAAK,wBAAL,YAAAA,EAA4B,qBAAsB,GAAO,CAC5D,MAAMq5B,GAAgBze,IAAS,SAAUjT,EAAA,KAAK,wBAAL,YAAAA,EAA4B,mBAAoB40B,EAAA,KAAK,wBAAL,YAAAA,EAA4B,oBAAsB,CAAA,EAC3I,OAAMC,EAAA,KAAK,wBAAL,YAAAA,EAA4B,uBAAuB/R,EAAO2N,EAAaiB,EAAa1+B,CAAK,GAChG,MACCw/B,EAAU,MAAM,0DAA0Dvf,CAAI,UAAW6P,EAAM,EAAE,GACjGgS,EAAA,KAAK,iBAAL,MAAAA,EAAqB,SAAShS,EAAO2N,EAGxC,CACD,CAEA,uBAAwB,CACvB,MAAMsE,EAAkB,GAAQ,KAAK,QAAQ,kBAAoB,KAAK,QAAQ,kBAC9E,OAAO,KAAK,UAAY,QAAU,CAAC,KAAK,aAAe,CAACA,GAAmB,CAAC,KAAK,6BAA+B,CAAC,KAAK,2BACvH,CAEA,IAAI,qBAAsB,CACzB,MAAMC,EAAa,EAAQ,KAAK,4BAC1BC,EAAa,EAAQ,KAAK,4BAChC,OAAID,GAAcC,EAAmB,aAC9BA,EAAa,QAAU,OAC/B,CASA,wBAAwB1jC,EAAO,CAC9B,GAAI,KAAK,UAAY,cAAe,MAAM,IAAI4hB,GAAiB,mBAAoB,SAAU5hB,EAAO,EAAK,EACzG,GAAI,KAAK,UAAY,oBAAqB,MAAM,IAAI4hB,GAAiB,iBAAkB,KAAK,oBAAqB5hB,EAAO,EAAK,EAC7H,MAAM2jC,EAAa,KAAK,cAAgB,KAAK,aAC7C,GAAI,GAAG,KAAK,QAAQ,uBAAyB,KAASA,GAAa,MAAM,IAAI/hB,GAAiB,oBAAqB,KAAK,oBAAqB5hB,EAAO,EAAI,EACxJihC,EAAU,KAAK,kFAAmFjhC,CAAK,EACvG,KAAK,SAAS,KAAK,IAAI4hB,GAAiB,oBAAqB,KAAK,oBAAqB5hB,EAAO,EAAK,CAAC,EACpG,KAAK,6BAA4B,CAClC,CAMA,8BAA+B,WAC1B,KAAK,OAAS,aACd9D,EAAA,KAAK,wBAAL,YAAAA,EAA4B,qBAAsB,OACrDC,EAAA,KAAK,iBAAL,MAAAA,EAAqB,eAAe,QAAS,CAAE,UAAW,KAAK,aAAe,WAAa,cAC3F2K,EAAA,KAAK,iBAAL,MAAAA,EAAqB,eAAe,QAAS,CAAE,UAAW,KAAK,aAAe,WAAa,cAEvF,KAAK,eAAe,KAAK,mBAAmB,KAAI,EACtD,CACA,MAAM,aAAaolB,EAAa,OAC/B,SAAQhwB,EAAA,KAAK,QAAQ,oBAAb,YAAAA,EAAgC,eAAgB,UAAU,cAAc,aAAagwB,CAAW,CACzG,CACA,MAAM,gBAAgBrW,EAAS,OAC9B,MAAMga,IAAe3zB,EAAA,KAAK,QAAQ,oBAAb,YAAAA,EAAgC,eAAgB,UAAU,aAC/E,GAAI,CAAC2zB,EAAa,gBAAiB,MAAM,IAAIpP,GAAgB,iEAAiE,EAC9H,OAAOoP,EAAa,gBAAgBha,CAAO,CAC5C,CACA,MAAM,mBAAoB,OACzB,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAI4K,GAAgB,sCAAsC,EAC1F,KAAK,eAAe,QAAW6D,GAAU,OAExC,GADA2c,EAAU,MAAM,uDAAwD3c,EAAM,MAAM,IAAI,EACpFA,EAAM,QAAQ,CAAC,EAAG,KAAK,eAAe,KAAKA,EAAM,QAAQ,CAAC,CAAC,MAC1D,CACJ,MAAMsf,IAAiB1nC,EAAA,KAAK,eAAe,QAApB,YAAAA,EAA2B,cAAe,CAAA,EAC3D2nC,EAAY,IAAI,YAAY,CAAC,GAAGD,EAAgBtf,EAAM,KAAK,CAAC,EAClE,KAAK,eAAe,KAAKuf,CAAS,CACnC,CACD,EACA,OAAM3nC,EAAA,KAAK,wBAAL,YAAAA,EAA4B,wBAAwB,KAAK,MAChE,CACA,MAAM,mBAAmBwlB,EAAM,WAC9B,MAAMqgB,EAAergB,IAAS,SAAWA,IAAS,OAC9CqgB,GAAgB,KAAK,qBAAqB,MAAM,KAAK,gCAA+B,EACnFA,EACIrgB,IAAS,OAAQ,OAAMvlB,EAAA,KAAK,wBAAL,YAAAA,EAA4B,mBAAmB,UACrE,KAAK,qBAAqB,OAAM2K,EAAA,KAAK,wBAAL,YAAAA,EAA4B,mBAAmB4a,IAFtE,OAAMxlB,EAAA,KAAK,wBAAL,YAAAA,EAA4B,mBAAmBwlB,GAGzE,CACA,MAAM,iCAAkC,OACvC,GAAI,CAAC,KAAK,oBAAqB,OAC/B,MAAMwK,IAAchwB,EAAA,KAAK,wBAAL,YAAAA,EAA4B,kBAAkB,WAAY,CAAA,EAC9E,IAAIsC,EACJ,GAAI,CACHA,EAAS,MAAM,KAAK,aAAa,CAAE,MAAO0tB,CAAW,CAAE,CACxD,OAASlsB,EAAO,CACfihC,EAAU,MAAM,+EAAgFjhC,CAAK,EACrG,KAAK,SAAS,KAAK,IAAIyhB,GAAgB,4BAA6B,QAASzhB,CAAK,CAAC,EACnF,MACD,CACA,MAAMsgC,EAAW9hC,EAAO,eAAc,EAAG,GAAG,CAAC,EACxC8hC,IACL,KAAK,sBAAsB,SAASA,CAAQ,EAC5C,KAAK,oBAAoB,cAAcA,CAAQ,EAChD,CAQA,0BAA2B,CAC1B,GAAI,KAAK,oBAAqB,OAAO,KAAK,oBAC1C,GAAI,CAAC,KAAK,eAAgB,OAAO,KACjC,GAAI,CACH,KAAK,oBAAsB,IAAI7B,EAChC,OAASz+B,EAAO,CACf,OAAAihC,EAAU,KAAK,qEAAsEjhC,CAAK,EACnF,IACR,CACA,YAAK,YAAY,KAAK,sBAAsB,kBAAmB,IAAM,CACpE,KAAK,gCAA+B,CACrC,CAAC,EACD,KAAK,gCAA+B,EAC7B,KAAK,mBACb,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,mBACb,CACA,MAAM,iCAAkC,SACvC,GAAI,CAAC,KAAK,qBAAuB,CAAC,KAAK,eAAgB,OACvD,MAAM8jC,EAAM,KAAK,sBAAsB,iBAAiB,GAAG,CAAC,EAC5D,KAAK,oBAAoB,cAAcA,GAAO,IAAI,EAClD,MAAMpD,IAAUvkC,GAAAD,EAAA,KAAK,wBAAL,YAAAA,EAA4B,kBAAkB,GAAG,KAAjD,YAAAC,EAAsD,SAAU,KAAK,eAAe,WAAU,EAAG,KAAMjB,GAAC,OAAK,QAAAgB,EAAAhB,EAAE,QAAF,YAAAgB,EAAS,QAAS,QAAO,EACtJ,GAAI,GAACwkC,GAAU,CAACoD,GAChB,GAAI,CACH,MAAMpD,EAAO,aAAa,KAAK,oBAAoB,WAAW,CAC/D,OAAS1gC,EAAO,CACfihC,EAAU,KAAK,+EAAgFjhC,CAAK,CACrG,CACD,CAKA,cAAcuxB,EAAO,CACpB,GAAI,CAAC,KAAK,eAAgB,CACzB,MAAMvxB,EAAQ,IAAIygB,GAAgB,sCAAsC,EACxE,WAAK,SAAS,KAAKzgB,CAAK,EAClBA,CACP,CACA,GAAI,CACH,MAAMk/B,EAAc,KAAK,sBAAsB,SAAS3N,CAAK,EAC7D,KAAK,eAAe,SAASA,EAAO2N,CAAW,EAC/C+B,EAAU,MAAM,iCAAiC1P,EAAM,IAAI,gBAAiBA,EAAM,EAAE,CACrF,OAASvxB,EAAO,CACf,MAAAihC,EAAU,MAAM,+CAA+C1P,EAAM,IAAI,UAAWvxB,CAAK,EACzF,KAAK,SAAS,KAAK,IAAIyhB,GAAgB,gBAAiB8P,EAAM,KAAMvxB,CAAK,CAAC,EACpEA,CACP,CACD,CAKA,iBAAiBm/B,EAAS,WACzB,GAAI,CAAC,KAAK,eAAgB,CACzB,MAAMn/B,EAAQ,IAAIygB,GAAgB,sCAAsC,EACxE,WAAK,SAAS,KAAKzgB,CAAK,EAClBA,CACP,CACA,MAAM0gC,EAAS,KAAK,eAAe,WAAU,EAAG,KAAMqD,UAAa,QAAA7nC,EAAA6nC,EAAS,QAAT,YAAA7nC,EAAgB,MAAOijC,EAAO,EACjG,GAAI,CAACuB,EAAQ,CACZO,EAAU,MAAM,kDAAkD9B,CAAO,EAAE,EAC3E,MACD,CACA,GAAI,CACH,KAAK,eAAe,YAAYuB,CAAM,EACtC,KAAK,sBAAsB,YAAYvB,CAAO,EAC9C8B,EAAU,MAAM,kCAAiC/kC,EAAAwkC,EAAO,QAAP,YAAAxkC,EAAc,IAAI,kBAAmBijC,CAAO,CAC9F,OAASn/B,EAAO,CACf,MAAAihC,EAAU,MAAM,mDAAkD9kC,EAAAukC,EAAO,QAAP,YAAAvkC,EAAc,IAAI,UAAW6D,CAAK,EACpG,KAAK,SAAS,KAAK,IAAIyhB,GAAgB,qBAAoB3a,EAAA45B,EAAO,QAAP,YAAA55B,EAAc,OAAQ,UAAW9G,CAAK,CAAC,EAC5FA,CACP,CACD,CAMA,cAAcuxB,EAAO,CACpB,MAAMqS,EAAiB,CAAC,GAAGrS,EAAM,OAAS,QAAU,KAAK,sBAAsB,iBAAmB,KAAK,sBAAsB,gBAAgB,EAC7I,UAAWyS,KAAiBJ,EAAgB,KAAK,iBAAiBI,EAAc,EAAE,EAClF,KAAK,cAAczS,CAAK,CACzB,CACA,MAAM,yBAAyB7P,EAAMwK,EAAa,OACjD,OAAMhwB,EAAA,KAAK,wBAAL,YAAAA,EAA4B,yBAAyBwlB,EAAMwK,GAClE,CAOA,MAAM,iCAAiCA,EAAa,OACnD,MAAMuU,GAAUvkC,EAAA,KAAK,iBAAL,YAAAA,EAAqB,aAAa,OAAQhB,GAAC,OAAK,QAAAgB,EAAAhB,EAAE,QAAF,YAAAgB,EAAS,QAAS,SAAWhB,EAAE,MAAM,aAAe,SACpH,GAAI,CAACulC,GAAWA,EAAQ,SAAW,EAAG,CACrCQ,EAAU,KAAK,+DAA+D,EAC9E,MACD,CACA,UAAWP,KAAUD,EAAS,CAC7B,MAAMI,EAAWH,EAAO,MACxB,GAAI,CAACG,EAAU,SACf,KAAM,CAAE,SAAAE,CAAQ,EAAKF,EAAS,YAAW,EACnCC,EAAoB,CACzB,GAAGD,EAAS,eAAc,EAC1B,GAAG3U,EACH,GAAG6U,EAAW,CAAE,SAAU,CAAE,MAAOA,CAAQ,CAAE,EAAK,CAAA,CACtD,EACS5B,EAAU0B,EAAS,GACzBA,EAAS,KAAI,EACb,KAAK,sBAAsB,YAAY1B,CAAO,EAC9C,MAAMmB,GAAY,MAAM,KAAK,aAAa,CAAE,MAAOQ,EAAmB,GAAG,eAAc,EAAG,CAAC,EAC3F,MAAMJ,EAAO,aAAaJ,CAAQ,EAClC,KAAK,sBAAsB,SAASA,CAAQ,EAC5CW,EAAU,MAAM,2FAA2FX,EAAS,EAAE,EAAE,CACzH,CACD,CAKA,SAAU,WACTW,EAAU,MAAM,yEAAyE,KAAK,OAAO,EAAE,EACvG,KAAK,sBAAqB,GAC1B/kC,EAAA,KAAK,0BAAL,MAAAA,EAA8B,WAC9BC,EAAA,KAAK,sBAAL,MAAAA,EAA0B,UAC1B,KAAK,oBAAsB,KAC3B,KAAK,sBAAsB,QAAO,GAClC2K,EAAA,KAAK,wBAAL,MAAAA,EAA4B,UACxB,KAAK,iBACR,KAAK,iBAAgB,EACrB,KAAK,mBAAkB,EACvB,KAAK,eAAe,MAAK,EACzB,KAAK,eAAiB,QAEvB,MAAM,QAAO,CACd,CACA,oBAAqB,CAChB,KAAK,iBACR,KAAK,eAAe,oBAAoB,0BAA2B,KAAK,gCAAgC,EACxG,KAAK,eAAe,oBAAoB,2BAA4B,KAAK,iCAAiC,EAC1G,KAAK,eAAe,oBAAoB,wBAAyB,KAAK,8BAA8B,EACpG,KAAK,eAAe,oBAAoB,uBAAwB,KAAK,6BAA6B,EAClG,KAAK,eAAe,oBAAoB,oBAAqB,KAAK,0BAA0B,EAE9F,CACA,kBAAmB,QAClB5K,EAAA,KAAK,eAAe,QAApB,MAAAA,EAA2B,YAAY,QAASq1B,GAAU,CACzD0P,EAAU,MAAM,wDAAwD1P,EAAM,IAAI,EAAE,EACpFA,EAAM,KAAI,CACX,EACD,CACA,IAAI,iBAAkB,OACrB,QAAOr1B,EAAA,KAAK,wBAAL,YAAAA,EAA4B,uBAAwB,KAAK,6BAA+B,CAC9F,MAAO,WACP,MAAO,UACV,CACC,CACA,MAAM,sBAAsBuyB,EAAQ,CACnC,GAAI,CAAC,KAAK,eAAgB,MAAM,IAAIhO,GAAgB,sCAAsC,EAC1F,MAAMwjB,EAAc,MAAM,KAAK,2BAA2BxV,EAAO,GAAG,EAC9DyU,EAAS,CACd,GAAGzU,EACH,IAAKwV,CACR,EACE,OAAAhD,EAAU,MAAM,4DAA6DiC,CAAM,EAC5E,KAAK,eAAe,qBAAqBA,CAAM,CACvD,CACD,EAIA,SAASgB,GAAqBhlC,EAAO,CACpC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,IAAI,CAC9G,CACA,SAASilC,GAAqBjlC,EAAO,CACpC,GAAI,CAACglC,GAAqBhlC,CAAK,EAAG,MAAO,GACzC,MAAMskB,EAAMtkB,EACZ,OAAOskB,EAAI,SAAW,gBAAkB+U,GAAS/U,EAAI,MAAM,GAAKgV,EAAYhV,EAAI,OAAQ,KAAK,GAAKgV,EAAYhV,EAAI,OAAQ,QAAQ,CACnI,CAKA,SAAS4gB,GAAyBllC,EAAO,CACxC,OAAKglC,GAAqBhlC,CAAK,EACxBA,EAAM,SAAW,YADiB,EAE1C,CACA,SAASmlC,GAAqBnlC,EAAO,CACpC,OAAKglC,GAAqBhlC,CAAK,EACxBA,EAAM,SAAW,eADiB,EAE1C,CACA,SAASolC,GAAyBplC,EAAO,CACxC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,QAAQ,GAAKA,EAAM,SAAW,gBAAkBq5B,GAASr5B,EAAM,MAAM,GAAKs5B,EAAYt5B,EAAM,OAAQ,QAAQ,CACtN,CACA,SAASqlC,GAAwBrlC,EAAO,CACvC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,QAAQ,GAAKA,EAAM,SAAW,eAAiBq5B,GAASr5B,EAAM,MAAM,GAAKs5B,EAAYt5B,EAAM,OAAQ,QAAQ,GAAKs5B,EAAYt5B,EAAM,OAAQ,KAAK,CACzP,CACA,SAASslC,GAA8BtlC,EAAO,CAC7C,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,QAAQ,GAAKA,EAAM,SAAW,qBAAuBq5B,GAASr5B,EAAM,MAAM,GAAKs5B,EAAYt5B,EAAM,OAAQ,aAAa,CAChO,CACA,SAASulC,GAAuBvlC,EAAO,CACtC,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,SAAS,GAAKA,EAAM,UAAY,OAASs5B,EAAYt5B,EAAO,QAAQ,GAAKA,EAAM,SAAW,YACxI,CAMA,SAASwlC,GAA6BxlC,EAAO,CAC5C,OAAOq5B,GAASr5B,CAAK,GAAKs5B,EAAYt5B,EAAO,QAAQ,GAAK,OAAOA,EAAM,QAAW,QACnF,CAIA,MAAMylC,EAAYlhB,EAAS,EAe3B,SAASmhB,GAAoBzhC,EAAM,CAClC,OAAOA,EAAK,UAAY,CAACA,EAAK,UAAY,CAACA,EAAK,eAAiB,GAAKA,EAAK,eAAiB,EAC7F,CACA,IAAI0hC,GAAe,cAAcjf,EAAY,CAC5C,YAAYkf,EAAa,CACxB,MAAK,EACL,KAAK,YAAcA,CACpB,CACA,SAAU,CACT,KAAK,YAAc,OACnB,MAAM,QAAO,CACd,CACD,EACIC,GAAqB,cAAcF,EAAa,CACnD,YAAYvK,EAAmB0K,EAAexU,EAAkB/F,EAAmB5U,EAAU,GAAI,CAChG,MAAMykB,CAAiB,EACvB,KAAK,kBAAoBA,EACzB,KAAK,cAAgB0K,EACrB,KAAK,iBAAmBxU,EACxB,KAAK,kBAAoB/F,EACzB,KAAK,qBAAuB,KAAK,sBAAsB,CAAA,CAAE,EACzD,KAAK,SAAW,KAAK,sBAAsB,IAAI,EAC/C,KAAK,kBAAoB,KAAK,oBAAoB,CAAC,EACnD,KAAK,oBAAsB,KAAK,sBAAsB,MAAM,EAC5D,KAAK,uBAAyC,IAAI,IAClD,KAAK,sBAAwB,IAC7B,KAAK,SAAW,KAAK,sBAAsB5U,EAAQ,QAAU,IAAI,EACjE,KAAK,QAAUA,EAAQ,QACvB,KAAK,eAAiBA,EAAQ,eAC9B,KAAK,kBAAiB,EACtB,KAAK,uBAAsB,CAC5B,CACA,MAAM,MAAO,CACZ,MAAMovB,EAAqBxQ,GAAY,CACtC,OAAQ,KAAK,kBAAkB,GAC/B,aAAc,CAAE,OAAQ,KAAK,kBAAkB,EAAE,EACjD,OAAQ,MACX,CAAG,EACD,GAAI,CACH,MAAM,KAAK,aAAawQ,CAAkB,CAC3C,OAASjlC,EAAO,CACf,MAAA2kC,EAAU,KAAK,gFAAiF3kC,CAAK,EAC/FA,CACP,CACD,CACA,MAAM,QAAS,CACd,MAAMilC,EAAqBxQ,GAAY,CACtC,OAAQ,KAAK,kBAAkB,GAC/B,aAAc,CAAE,OAAQ,KAAK,kBAAkB,EAAE,EACjD,OAAQ,QACX,CAAG,EACD,GAAI,CACH,MAAM,KAAK,aAAawQ,CAAkB,CAC3C,OAASjlC,EAAO,CACf,MAAA2kC,EAAU,KAAK,kFAAmF3kC,CAAK,EACjGA,CACP,CACD,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,mBAAmB,eAChC,CACA,IAAI,qBAAsB,CACzB,OAAO,KAAK,qBAAqB,aAAY,CAC9C,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,qBAAqB,KAClC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,aAAc,OACjB,QAAO9D,EAAA,KAAK,uBAAuB,IAAI,KAAK,kBAAkB,EAAE,IAAzD,YAAAA,EAA4D,cAAe,IACnF,CACA,IAAI,cAAe,OAClB,QAAOA,EAAA,KAAK,uBAAuB,IAAI,KAAK,kBAAkB,EAAE,IAAzD,YAAAA,EAA4D,eAAgB,IACpF,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,SAAS,KACtB,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,oBAAoB,KACjC,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,oBAAoB,aAAY,CAC7C,CACA,IAAI,oBAAqB,CACxB,MAAMgpC,EAAoB,KAAK,uBAAuB,IAAI,KAAK,kBAAkB,EAAE,EACnF,GAAI,CAACA,EAAmB,MAAM,IAAIzkB,GAAgB,gCAAgC,EAClF,OAAOykB,CACR,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,iBAAiB,mBAAoB,IAAM3yB,GAAM,KAAK,kBAAkB,aAAY,EAAI,KAAK,mBAAmB,iBAAiB,KAAKI,EAAQ4uB,GAAoB,CAC7K,YACA,eACA,QACH,EAAI,SAASA,CAAe,CAAC,CAAC,CAAC,CAAC,CAC/B,CACA,mBAAoB,CACnB,KAAK,YAAY,KAAK,iBAAmBjd,GAAU,OAClD,MAAM6gB,GAAejpC,EAAAooB,EAAM,aAAa,QAAQ,KAAM/nB,GAAMA,EAAE,UAAY+nB,EAAM,OAAO,IAAlE,YAAApoB,EAAqE,QACtFipC,GAAc,KAAK,gBAAgBA,CAAY,EAC/C7gB,EAAM,WAAW,KAAK,gBAAgBA,EAAM,SAAS,CAC1D,CAAC,EACD,KAAK,YAAY,KAAK,YAAcA,GAAU,OAC7CqgB,EAAU,MAAM,gEAAiErgB,CAAK,EACtF,KAAM,CAAE,IAAAiX,EAAK,OAAA6J,CAAM,EAAK9gB,EACxB,KAAK,wBAAwB8gB,EAAQ,SAAS,GAC9ClpC,EAAA,KAAK,uBAAuB,IAAIkpC,CAAM,IAAtC,MAAAlpC,EAAyC,mBAAmB,CAC3D,OAAQ,WACR,IAAAq/B,CACJ,EACE,CAAC,EACD,KAAK,YAAY,KAAK,aAAejX,GAAU,OAC9CqgB,EAAU,MAAM,+CAAgDrgB,CAAK,EACrE,KAAM,CAAE,IAAAiX,EAAK,OAAA6J,CAAM,EAAK9gB,EACxB,KAAK,wBAAwB8gB,EAAQ,YAAY,GACjDlpC,EAAA,KAAK,uBAAuB,IAAIkpC,CAAM,IAAtC,MAAAlpC,EAAyC,mBAAmB,CAC3D,OAAQ,WACR,IAAAq/B,CACJ,EACE,CAAC,EACD,KAAK,YAAY,KAAK,kBAAoBjX,GAAU,CACnDqgB,EAAU,MAAM,oDAAqDrgB,CAAK,EAC1E,KAAM,CAAE,YAAA+gB,EAAa,OAAAD,CAAM,EAAK9gB,EAC1BghB,EAAwB,KAAK,uBAAuB,IAAIF,CAAM,EAC9D,CAAE,MAAAjN,EAAO,MAAAC,CAAK,EAAKiN,GACxB,SAAY,OACZ,GAAI,CACClN,GAASmN,GAAuB,MAAMA,EAAsB,iCAAiCnN,CAAK,EAClGC,GAAO,MAAMkN,GAAA,YAAAA,EAAuB,yBAAyB,QAASlN,IAC1E,KAAK,kBAAkB,uBAAuB,CAC7C,MAAAD,EACA,MAAAC,EACA,UAAW,KAAK,IAAG,CACzB,CAAM,CACF,OAASp4B,EAAO,CACf2kC,EAAU,KAAK,6DAA8D3kC,CAAK,GAClF9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,EAC1F,CACD,GAAC,CACF,CAAC,EACD,KAAK,YAAY,KAAK,WAAaulC,GAAc,CAChD,KAAK,cAAc,OAAO,KAAK,oBAAmB,CAAE,EACpD,KAAK,cAAcA,CAAS,CAC7B,CAAC,CACF,CAWA,gBAAgBtP,EAAQ,CACnB,CAAC,KAAK,SAAS,OAASA,IAC3B0O,EAAU,MAAM,sCAAsC1O,CAAM,EAAE,EAC9D,KAAK,SAAS,KAAKA,CAAM,EAE3B,CACA,gBAAgBuP,EAAQ,CACnB,CAAC,KAAK,SAAS,OAASA,IAC3Bb,EAAU,MAAM,qCAAqCa,CAAM,EAAE,EAC7D,KAAK,SAAS,KAAKA,CAAM,EAE3B,CACA,MAAM,cAAcD,EAAW,OAC9B,GAAI,CACH,MAAME,EAAmB5Q,GAAU,CAAE,GAAG0Q,CAAS,CAAE,EACnD,MAAM,KAAK,aAAaE,CAAgB,CACzC,OAASzlC,EAAO,CACf2kC,EAAU,KAAK,mEAAoE3kC,CAAK,GACxF9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe,IAAImlB,GAAerhB,CAAK,EACxC,CACD,CACA,MAAM,uBAAuB6V,EAAU,GAAI,OAC1C,KAAM,CAAE,MAAAsiB,EAAO,MAAAC,CAAK,EAAKviB,EACzB,GAAI,CACCsiB,GAAO,MAAM,KAAK,mBAAmB,yBAAyB,QAASA,CAAK,EAC5EC,GAAO,MAAM,KAAK,mBAAmB,yBAAyB,QAASA,CAAK,CACjF,OAASp4B,EAAO,CACf,MAAA2kC,EAAU,KAAK,oDAAqD3kC,CAAK,GACzE9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,GACnFA,CACP,CACD,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,SAAS,KACtB,CAEA,oBAAoB0lC,EAAY,CAC/B,MAAO,CACN,OAAQ,KAAK,QAAU,OACvB,GAAIA,GAAc,KAAK,kBAAkB,GACzC,GAAI,KAAK,kBAAkB,GAC3B,gBAAiB,KAAK,kBAAkB,eAC3C,CACC,CAUA,iBAAkB,CACjB,GAAI,CACH,MAAMlU,EAAK,KAAK,mBAAmB,eACnC,GAAI,CAACA,EAAI,CACRmT,EAAU,KAAK,yDAAyD,EACxE,MACD,CACA,MAAMgB,EAAgBnU,EAAG,aAAY,EAAG,KAAMn2B,GAAMA,EAAE,MAAM,OAAS,OAAO,EAC5E,GAAI,CAACsqC,EAAe,CACnBhB,EAAU,KAAK,wDAAwD,EACvE,MACD,CACI,OAAOgB,EAAc,iBAAoB,YAC5CA,EAAc,gBAAe,EAC7BhB,EAAU,MAAM,yEAAyE,GACnFA,EAAU,MAAM,2DAA2D,CACnF,OAAS3kC,EAAO,CACf2kC,EAAU,KAAK,uDAAwD3kC,CAAK,CAC7E,CACD,CAYA,MAAM,kBAAkBmjC,EAAW,CAClC,GAAI,CACH,MAAMvb,EAAa,KAAK,mBACxB,GAAI,CAACA,EAAW,eAAgB,CAC/B+c,EAAU,KAAK,oDAAoD,EACnE,MACD,CACA,MAAM/c,EAAW,kBAAkBub,CAAS,EAC5CwB,EAAU,KAAK,wCAAwCxB,EAAY,gBAAkB,EAAE,EAAE,CAC1F,OAASnjC,EAAO,CACf,MAAA2kC,EAAU,MAAM,sCAAuC3kC,CAAK,EACtDA,CACP,CACD,CAWA,MAAM,qBAAqBmjC,EAAW,CACrC,MAAMyC,EAAU,MAAM,KAAK,KAAK,uBAAuB,SAAS,EAChE,SAAW,CAACn9B,EAAImf,CAAU,IAAKge,EAAS,GAAI,CAC3C,GAAI,CAAChe,EAAW,eAAgB,CAC/B+c,EAAU,MAAM,8CAA8Cl8B,CAAE,wBAAwB,EACxF,QACD,CACA,MAAMmf,EAAW,kBAAkBub,CAAS,EAC5CwB,EAAU,KAAK,iDAAiDl8B,CAAE,GAAG06B,EAAY,gBAAkB,EAAE,EAAE,CACxG,OAASnjC,EAAO,CACf2kC,EAAU,KAAK,8CAA8Cl8B,CAAE,IAAKzI,CAAK,CAC1E,CACD,CAOA,oBAAqB,CACpB,SAAW,CAACyI,EAAImf,CAAU,IAAK,KAAK,uBAAwB,CAC3D,GAAIA,EAAW,cAAe,CAC7B+c,EAAU,MAAM,oEAAoEl8B,CAAE,EAAE,EACxF,QACD,CACA,GAAI,CACH,MAAM+oB,EAAK5J,EAAW,eACtB,GAAI,CAAC4J,EAAI,SACT,MAAMmU,EAAgBnU,EAAG,aAAY,EAAG,KAAMn2B,GAAMA,EAAE,MAAM,OAAS,OAAO,EAC5E,GAAI,CAACsqC,EAAe,SAChB,OAAOA,EAAc,iBAAoB,aAC5CA,EAAc,gBAAe,EAC7BhB,EAAU,MAAM,8CAA8Cl8B,CAAE,EAAE,EAEpE,OAASzI,EAAO,CACf2kC,EAAU,KAAK,mDAAmDl8B,CAAE,gBAAiBzI,CAAK,CAC3F,CACD,CACD,CACA,IAAI,kBAAmB,CACtB,OAAO,KAAK,kBAAkB,WAAW,KAAK2S,EAAOsnB,EAAmB,EAAGriB,EAAU,KAAK,UAAU,CAAC,CACtG,CACA,IAAI,aAAc,CACjB,OAAO,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASmgB,GAAyB,QAAQ,EAAG3sB,EAAU,KAAK,UAAU,CAAC,CAC3H,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASkgB,GAA0B,QAAQ,EAAG1sB,EAAU,KAAK,UAAU,CAAC,CAAC,CACzK,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASogB,GAA+B,QAAQ,EAAG5sB,EAAU,KAAK,UAAU,CAAC,CAAC,CACnL,CACA,IAAI,WAAY,CACf,OAAO,KAAK,iBAAiB,YAAa,IAAM,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASggB,GAA0B,QAAQ,EAAGxsB,EAAU,KAAK,UAAU,CAAC,CAAC,CACtK,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASigB,GAAsB,QAAQ,EAAGzsB,EAAU,KAAK,UAAU,CAAC,CAAC,CACrK,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,kBAAkB,gBAAgB,KAAKwM,GAASqgB,GAAwB,QAAQ,EAAG7sB,EAAU,KAAK,UAAU,CAAC,CAAC,CACrK,CACA,MAAM,aAAa6H,EAASomB,EAAY,GAAI,SAC3C,MAAMC,EAAqBxR,GAAY,CACtC,OAAQuR,EAAU,QAAU,KAAK,kBAAkB,GACnD,QAASA,EAAU,SAAW,KAAK,SAAS,OAAS,GACrD,QAAApmB,EACA,UAAWomB,EAAU,SACxB,CAAG,EACKrhB,EAAW,MAAM,KAAK,kBAAkB,QAAQshB,CAAkB,EACxE,GAAIthB,EAAS,MAAO,CACnB,MAAMxkB,EAAQ,IAAI6gB,GAAa2D,EAAS,MAAM,KAAMA,EAAS,MAAM,QAASA,EAAS,MAAM,IAAI,EAC/F,OAAAtoB,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,GACRwkB,CACR,CACA,MAAMuhB,EAAcjiB,GAAaU,EAAU,eAAe,EAC1D,GAAIuhB,GAAA,MAAAA,EAAa,MAAO,CACvB,MAAM/lC,EAAQ,IAAI6gB,GAAaklB,EAAY,MAAM,KAAMA,EAAY,MAAM,QAASA,EAAY,MAAM,IAAI,EACxG,OAAA5pC,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe6D,GACRwkB,CACR,CACA,OAAOA,CACR,CACA,MAAM,qBAAqB/E,EAAS6lB,EAAuB,SAC1D,MAAMU,EAAcvmB,EAAQ,OACtBwmB,EAAkB,KAAK,8BAA8BX,EAAuB7lB,CAAO,EACzF,GAAI,CACH,MAAM+E,EAAW,MAAM,KAAK,aAAa/E,EAASwmB,CAAe,EACjE,OAAQD,EAAW,CAClB,IAAK,eACJ,KAAK,sBAAsBxhB,EAAU8gB,CAAqB,EAC1D,MACD,IAAK,eACJ,MAAM,KAAK,sBAAsB9gB,EAAU8gB,CAAqB,EAChE,MACD,QACJ,CACE,OAAStlC,EAAO,CACf2kC,EAAU,MAAM,uCAAuCqB,CAAW,IAAKhmC,CAAK,GAC5E9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,GACrFgmC,IAAgB,kBAAgB7pC,EAAA,KAAK,iBAAL,MAAAA,EAAA,WACrC,CACD,CACA,MAAM,sBAAsBqoB,EAAU8gB,EAAuB,OAC5D,GAAI,CAAC9gB,EAAS,MAAO,CACpB,MAAM3a,EAASia,GAAaU,EAAU,6BAA6B,EAC7D+W,EAAMzX,GAAaU,EAAU,0BAA0B,EAC7D,GAAI3a,IAAW,eAAmB0xB,EAAK,GAAI,CAC1C,MAAM+J,EAAsB,mBAAmB,CAC9C,OAAQ,WACR,IAAA/J,CACL,CAAK,CACF,OAASv7B,EAAO,CACf2kC,EAAU,KAAK,oDAAqD3kC,CAAK,EACzE,MAAMkmC,EAAclmC,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,GAC9F9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAegqC,EAChB,CACD,CACD,CACA,wBAAwBxQ,EAAQ+M,EAAQ,OACvC,MAAM6C,EAAwB,KAAK,uBAAuB,IAAI5P,CAAM,EACpE,GAAI,CAAC4P,EAAuB,CAC3B,MAAMa,EAAiB,IAAI1lB,GAAgB,mFAAmFiV,CAAM,EAAE,EACtIiP,EAAU,MAAM,mDAAoD,CACnE,OAAAjP,EACA,OAAA+M,EACA,eAAA0D,CACJ,CAAI,GACDjqC,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAeiqC,GACf,MACD,CACIb,EAAsB,cAAc,KAAK,kBAAkB,KAAK7C,CAAM,CAC3E,CACA,sBAAsBje,EAAU8gB,EAAuB,OACtD,GAAI,CAAC9gB,EAAS,OAASV,GAAaU,EAAU,8BAA8B,IAAM,eAAgB,CACjG,KAAK,wBAAwB8gB,EAAsB,GAAI,QAAQ,EAC/D,KAAK,SAAS,KAAKxhB,GAAaU,EAAU,gBAAgB,GAAK,IAAI,EACnE,MAAMsd,EAAWhe,GAAaU,EAAU,+BAA+B,GAAK,KACtEkR,EAAS5R,GAAaU,EAAU,6BAA6B,GAAK,KACxEmgB,EAAU,MAAM,yCAA0C,CACzD,OAAAjP,EACA,SAAAoM,EACA,SAAAtd,CACJ,CAAI,EACD,KAAK,SAAS,KAAKsd,CAAQ,EAC3BwD,EAAsB,YAAYxD,CAAQ,EACtCpM,GACH,KAAK,kBAAkB,UAAUA,CAAM,EACvC,KAAK,cAAc,OAAO,KAAK,oBAAoBA,CAAM,CAAC,GACpDiP,EAAU,KAAK,sDAAuD,CAC5E,OAAQ,KAAK,OACb,OAAAjP,CACJ,CAAI,EACDiP,EAAU,KAAK,yCAAyC,EACxDA,EAAU,MAAM,2BAA2B,KAAK,SAAS,KAAK,aAAa,KAAK,SAAS,KAAK,EAAE,CACjG,KAAO,CACNA,EAAU,MAAM,uCAAwCngB,CAAQ,EAChE,MAAM4hB,EAAc5hB,EAAS,MAAQ,IAAI3D,GAAa2D,EAAS,MAAM,KAAMA,EAAS,MAAM,QAASA,EAAS,MAAM,IAAI,EAAoB,IAAI,MAAM,0CAA0C,GAC9LtoB,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAekqC,EAChB,CACD,CACA,IAAI,yBAA0B,CAC7B,MAAO,CACN,WAAY,KAAK,kBAAkB,cAAc,YAAc9c,EAAqB,SAAS,WAC7F,UAAWA,EAAqB,SAAS,WAAaA,EAAqB,SAAS,qBACpF,qBAAsBA,EAAqB,SAAS,qBACpD,oBAAqBA,EAAqB,SAAS,oBACnD,oBAAqBA,EAAqB,SAAS,mBACtD,CACC,CACA,wBAAyB,CACxB,KAAM,CAAE,QAAAzT,GAAY,KAAK,kBACnByvB,EAAwB,IAAIpE,GAA4B,CAC7D,QAAS,OACT,OAAQ,KAAK,kBAAkB,GAC/B,MAAOrrB,EAAQ,MACf,MAAOA,EAAQ,MACf,4BAA6BA,EAAQ,4BACrC,4BAA6BA,EAAQ,4BACrC,iBAAkBA,EAAQ,iBAC1B,iBAAkBA,EAAQ,iBAC1B,aAAcA,EAAQ,aACtB,aAAcA,EAAQ,aACtB,sBAAuBA,EAAQ,sBAC/B,kBAAmB,KAAK,kBACxB,qBAAsBA,EAAQ,qBAC9B,qBAAsBA,EAAQ,qBAC9B,OAAQA,EAAQ,OAChB,GAAG,KAAK,uBACX,EAAKA,EAAQ,UAAW,KAAK,gBAAgB,EAC3C,KAAK,6BAA6ByvB,CAAqB,EACvD,KAAK,qBAAoB,EACzB,KAAK,wBAAuB,EAC5B,KAAK,gBAAgBA,CAAqB,EAC1C,KAAK,uBAAuB,IAAIA,EAAsB,GAAIA,CAAqB,EAC/E,KAAK,qBAAqB,KAAK,MAAM,KAAK,KAAK,uBAAuB,OAAM,CAAE,CAAC,EAC/E,KAAK,YAAYA,EAAsB,QAAUtlC,GAAU,QAC1D9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,EAChB,CAAC,EACG6V,EAAQ,WAAW,KAAK,oBAAoByvB,CAAqB,CACtE,CACA,MAAM,oBAAoBA,EAAuB,WAChDX,EAAU,MAAM,qEAAqE,EACrF,MAAM0B,EAAqB,MAAMr4B,GAAe6E,GAAK,KAAK,UAAW,KAAK,kBAAkB,SAAS,EAAE,KAAK+E,EAAU,KAAK,UAAU,CAAC,CAAC,EAAE,MAAM,IAAM,IAAI,EACzJ,GAAIyuB,IAAuB,KAAM,CAChC1B,EAAU,MAAM,6DAA6D,EAC7E,MACD,CACA,GAAID,GAA6B2B,CAAkB,EAClD1B,EAAU,KAAK,6DAA6D,GAC5EzoC,EAAA,KAAK,cAAL,MAAAA,EAAkB,kBACPmqC,EAQL,CACN1B,EAAU,MAAM,4DAA4D,EAC5E,MAAM9B,EAAgB,KAAK,kBAAkB,mBAC7C,GAAI,CACH,MAAMyC,EAAsB,cAAczC,CAAa,CACxD,OAAS7iC,EAAO,CACf2kC,EAAU,MAAM,iDAAkD3kC,CAAK,GACvE8G,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe9G,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,EAC1F,CACD,KAjBgC,CAC/B2kC,EAAU,KAAK,gDAAgD,EAC/D,GAAI,CACH,MAAM,KAAK,IAAI,WAAW,CAC3B,QAAC,CACA,KAAK,kBAAkB,KAAK,cAAc,GAC1CxoC,EAAA,KAAK,cAAL,MAAAA,EAAkB,SACnB,CACD,CAUD,CACA,yBAA0B,CACzB,KAAK,YAAY,KAAK,aAAc,MAAOmqC,GAAgB,CAC1D3B,EAAU,MAAM,iEAAkE2B,CAAW,EAC7F,KAAM,CAAE,OAAAlB,CAAM,EAAKkB,EACnB,MAAM,KAAK,cAAc,OAAO,CAC/B,OAAQ,KAAK,QAAU,OACvB,GAAIlB,EACJ,GAAIkB,EAAY,iBAChB,gBAAiB,CAChB,MAAO,WACP,MAAO,UACZ,CACA,CAAI,CACF,CAAC,CACF,CACA,gBAAgBhB,EAAuB,CACtC,KAAK,iBAAmBA,EAAsB,iBAAiB,KAAK3yB,EAAQtK,GAAUA,IAAU,WAAW,EAAG2G,EAAI,IAAMs2B,EAAsB,eAAe,EAAG/tB,GAAU+tB,EAAsB,eAAe,EAAG1tB,EAAU,KAAK,UAAU,CAAC,EAC5O,KAAK,aAAe0tB,EAAsB,aAAa,KAAKzhB,GAAU,EAAIjM,EAAU,KAAK,UAAU,CAAC,EACpG,KAAK,cAAgB0tB,EAAsB,cAAc,KAAKzhB,GAAU,EAAIjM,EAAU,KAAK,UAAU,CAAC,CACvG,CACA,6BAA6B0tB,EAAuB,CACnD,KAAK,YAAYA,EAAsB,kBAAkB,KAAK3yB,EAAQ+N,GAAgBA,IAAgB,IAAI,EAAG9I,EAAU,KAAK,UAAU,CAAC,EAAI8I,GAAgB,CAC1J,KAAM,CAAE,KAAA0R,EAAM,IAAAmJ,CAAG,EAAK7a,EAChB6lB,EAAe,KAAK,aAAajB,CAAqB,EACtD5G,EAAU,CAAC4G,EAAsB,0BACvC,GAAIlT,IAAS,SAAU,CACtB,MAAMoU,EAAsB7R,GAAY,CACvC,aAAA4R,EACA,IAAAhL,CACL,CAAK,EACD,KAAK,iCAAiCiL,EAAqBlB,CAAqB,CACjF,SAAW5G,EAAS,CACnB,MAAM8H,EAAsBjS,GAAY,CACvC,aAAAgS,EACA,IAAAhL,CACL,CAAK,EACD,KAAK,qBAAqBiL,EAAqBlB,CAAqB,CACrE,KAAO,CACN,MAAMkB,EAAsB/R,GAAY,CACvC,aAAA8R,EACA,IAAAhL,EACA,OAAQ,aACb,CAAK,EACD,KAAK,qBAAqBiL,EAAqBlB,CAAqB,CACrE,CACD,CAAC,CACF,CACA,sBAAuB,CACtB,KAAK,YAAY,KAAK,UAAW,IAAM,OACtC,KAAK,kBAAkB,KAAK,cAAc,EAC1C,KAAK,cAAc,OAAO,KAAK,oBAAmB,CAAE,GACpDppC,EAAA,KAAK,cAAL,MAAAA,EAAkB,SACnB,CAAC,CACF,CACA,8BAA8BopC,EAAuBmB,EAAc,CAClE,IAAI3hC,EACJ,OAAKwgC,EAAsB,4BAC1BxgC,EAAY,CAAA,EACRwgC,EAAsB,aAAcxgC,EAAU,KAAK,GAAGwkB,EAAqB,SAAS,yBAAyB,EACxGgc,EAAsB,mBAAoBxgC,EAAU,KAAK,GAAGwkB,EAAqB,SAAS,+BAA+B,EACzHgc,EAAsB,eAAexgC,EAAU,KAAK,GAAGwkB,EAAqB,SAAS,0BAA0B,GAElH,CACN,OAAQgc,EAAsB,GAC9B,QAASV,GAAoB,CAC5B,SAAUT,GAAqBsC,CAAY,EAC3C,SAAU,KAAK,kBAAkB,QAAQ,WAAa,GACtD,eAAgB,KAAK,kBAAkB,QAAQ,OAC/C,cAAe,KAAK,SAAS,KACjC,CAAI,EACD,UAAA3hC,CACH,CACC,CACA,MAAM,iCAAiC0hC,EAAqBE,EAA6B,WACxF/B,EAAU,MAAM,gFAAgF,EAChG,MAAM0B,EAAqB,MAAMr4B,GAAe6E,GAAK,KAAK,UAAW,KAAK,kBAAkB,SAAS,EAAE,KAAK+E,EAAU,KAAK,UAAU,CAAC,CAAC,EAAE,MAAM,IAAM,IAAI,EACzJ,GAAIyuB,IAAuB,KAAM,CAChC1B,EAAU,MAAM,6DAA6D,EAC7E,MACD,CACA,GAAID,GAA6B2B,CAAkB,EAClD1B,EAAU,KAAK,oDAAoD,GACnEzoC,EAAA,KAAK,cAAL,MAAAA,EAAkB,kBACPmqC,EAQL,CACN1B,EAAU,MAAM,+CAA+C,EAC/D,GAAI,CACH,KAAK,wBAAwB+B,EAA4B,GAAI,YAAY,EACzE,MAAM,KAAK,qBAAqBF,EAAqBE,CAA2B,EAChF,MAAMA,EAA4B,mBAAmB,CAAE,OAAQ,MAAM,CAAE,EACvE,MAAM,KAAK,cAAc,OAAO,KAAK,oBAAmB,CAAE,CAC3D,OAAS1mC,EAAO,CACf2kC,EAAU,MAAM,8CAA+C3kC,CAAK,GACpE8G,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe9G,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,GACzF,MAAM0mC,EAA4B,mBAAmB,CAAE,OAAQ,QAAQ,CAAE,CAC1E,CACD,KApBgC,CAC/B/B,EAAU,KAAK,2DAA2D,EAC1E,GAAI,CACH,MAAM,KAAK,IAAI,WAAW,CAC3B,QAAC,CACA,KAAK,kBAAkB,KAAK,cAAc,GAC1CxoC,EAAA,KAAK,cAAL,MAAAA,EAAkB,SACnB,CACD,CAaD,CACA,aAAauqC,EAA6B,CACzC,MAAM5E,EAAW4E,EAA4B,UAAY,KAAK,SAAS,OAAS,OAC1EC,EAASD,EAA4B,UAAY,QAAU,CAACA,EAA4B,2BAA6B,KAAK,kBAAkB,QAAQ,SAC1J,MAAO,CACN,GAAIA,EAA4B,aAAe,KAAK,kBAAkB,GAAKA,EAA4B,GACvG,kBAAmB,KAAK,kBAAkB,IAAM,KAAK,kBAAkB,KACvE,OAAAC,EACA,YAAaA,EACb,WAAY,KAAK,kBAAkB,SACnC,aAAc,KAAK,kBAAkB,KACrC,iBAAkB,KAAK,kBAAkB,OACzC,mBAAoB,KAAK,kBAAkB,GAC3C,cAAe,CACd,aAAc,KAAK,kBAAkB,GACrC,SAAA7E,EACA,GAAG,KAAK,kBAAkB,aAC9B,EACG,YAAa4E,EAA4B,cACzC,iBAAkBA,EAA4B,mBAC9C,cAAe,GACf,QAASzrB,EACZ,CACC,CACA,0BAA2B,CAC1B,OAAO,KAAK,mBAAmB,gBAAgB,OAAO,CACvD,CACA,0BAA2B,CAC1B,OAAO,KAAK,mBAAmB,gBAAgB,OAAO,CACvD,CACA,MAAM,4BAA6B,CAClC,OAAO,KAAK,mBAAmB,mBAAmB,OAAO,CAC1D,CACA,MAAM,4BAA6B,CAClC,OAAO,KAAK,mBAAmB,mBAAmB,OAAO,CAC1D,CAEA,0BAA2B,CAC1B,OAAO,KAAK,mBAAmB,yBAAwB,CACxD,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,mBAAmB,kBAChC,CACA,MAAM,eAAepF,EAAU,CAC9B,MAAO,GACP,MAAO,EACT,EAAI,CACF,OAAO,KAAK,6BAA6B,oBAAqBA,CAAO,CACtE,CASA,MAAM,oBAAoBA,EAAU,CAAE,MAAO,EAAI,EAAI,OACpD,IAAI+wB,EACJ,KAAM,CAAE,gBAAAC,GAAoB,KAAK,mBAGjC,IAFIhxB,EAAQ,OAASA,EAAQ,8BAAgCA,EAAQ,kBAAoBgxB,EAAgB,MAAM,WAAW,MAAM,MAAID,EAAa,UAC7I/wB,EAAQ,OAASA,EAAQ,8BAAgCA,EAAQ,kBAAoB,CAACgxB,EAAgB,MAAM,WAAW,MAAM,MAAID,EAAaA,IAAe,QAAU,OAAS,SAChLA,EACH,KAAK,mBAAmB,0BAA0B/wB,CAAO,EACzD,MAAM,KAAK,mBAAmB,mBAAmB+wB,CAAU,MACrD,CACN,MAAM5mC,EAAQ,IAAIghB,GAAc,6BAA6B,EAC7D,MAAA9kB,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,GACTA,CACP,CACD,CACA,MAAM,eAAe6V,EAAU,CAAE,MAAO,EAAK,EAAI,CAChD,MAAM,KAAK,6BAA6B,cAAeA,CAAO,CAC/D,CACA,MAAM,6BAA6BixB,EAASjxB,EAAS,CACpD,MAAMkxB,EAAgBD,IAAY,cAClC,IAAIE,EACA1B,EAAwB,KAC5B,GAAI,CACH,OAAIyB,GAAe,KAAK,oBAAoB,KAAK,UAAU,EAC3DzB,EAAwB,IAAIpE,GAA4B,CACvD,GAAGrrB,EACH,GAAG,KAAK,wBACR,QAAAixB,EACA,kBAAmB,KAAK,iBAC5B,EAAM,OAAQ,KAAK,gBAAgB,EAChC,KAAK,6BAA6BxB,CAAqB,EACnDyB,IAAe,KAAK,eAAiBzB,EAAsB,IAC/D,KAAK,uBAAuB,IAAIA,EAAsB,GAAIA,CAAqB,EAC/E,KAAK,qBAAqB,KAAK,MAAM,KAAK,KAAK,uBAAuB,OAAM,CAAE,CAAC,EAC/E,KAAK,YAAYA,EAAsB,QAAUtlC,GAAU,OAC1DgnC,MAA6BhnC,IAC7B9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,EAAO,CAAE,MAAO,EAAK,EACrC,CAAC,EACD,MAAMgO,GAAes3B,EAAsB,iBAAiB,KAAK3yB,EAAQtK,GAAUA,IAAU,WAAW,EAAGyM,GAAK,CAAC,EAAG5R,GAAQ,KAAK,qBAAqB,EAAG0U,EAAU,KAAK,UAAU,CAAC,CAAC,EAChLmvB,GAAe,KAAK,oBAAoB,KAAK,SAAS,EAC1DpC,EAAU,KAAK,yDAAyDmC,CAAO,IAAI,EAC5ExB,EAAsB,EAC9B,OAAStlC,EAAO,CAIf,GAHA2kC,EAAU,KAAK,iEAAkE3kC,CAAK,EAClFslC,GAAuBA,EAAsB,QAAO,EACpDyB,GAAe,KAAK,oBAAoB,KAAK,MAAM,EACnDC,EAA0B,MAAMA,aAAoCplB,IAAoBolB,EAAyB,yBAAyB,MAAQA,EAAyB,cAAgBA,EAC/L,GAAIhnC,aAAiB6N,GAAY,CAChC82B,EAAU,MAAM,uEAAuE,EACvF,MACD,CACA,MAAM3kC,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,EAAO,CACjF,CACD,CACA,MAAM,mBAAmByI,EAAI,CAC5B,OAAO,KAAK,+BAA+BA,CAAE,CAC9C,CACA,sBAAsBoN,EAAU,CAC/B,YAAa,GACb,YAAa,EACf,EAAI,CACF,IAAIoxB,EAGJ,GAFIpxB,EAAQ,cAAaoxB,EAAc,SACnCpxB,EAAQ,cAAaoxB,EAAcA,IAAgB,QAAU,OAAS,SACtEA,EAAa,OAAO,KAAK,mBAAmB,gBAAgBA,EAAa,CAAE,2BAA4B,GAAM,CAClH,CACA,MAAM,mBAAoB,CAEzB,GADK,CAAC,WAAY,SAAS,EAAE,SAAS,KAAK,oBAAoB,KAAK,GAAGtC,EAAU,KAAK,iDAAiD,EACnI,CAAC,KAAK,eAAgB,CACzBA,EAAU,MAAM,wDAAwD,EACxE,MACD,CACA,KAAK,oBAAoB,KAAK,UAAU,EACxC,MAAM,KAAK,+BAA+B,KAAK,cAAc,EAC7D,KAAK,eAAiB,OACtB,KAAK,oBAAoB,KAAK,MAAM,CACrC,CACA,MAAM,+BAA+Bl8B,EAAI,CACxC,MAAM68B,EAAwB,KAAK,uBAAuB,IAAI78B,CAAE,EAChE,GAAI,CACC68B,GAAuB,MAAM,KAAK,gBAAgBA,CAAqB,CAC5E,QAAC,CACAA,GAAA,MAAAA,EAAuB,UACvB,KAAK,uBAAuB,OAAO78B,CAAE,EACrC,KAAK,qBAAqB,KAAK,MAAM,KAAK,KAAK,uBAAuB,OAAM,CAAE,CAAC,CAChF,CACD,CACA,MAAM,gBAAgB68B,EAAuB4B,EAAO,CACnD,GAAI,CACH,MAAMC,EAAcD,EAAQ,CAC3B,MAAAA,EACA,UAAWpS,GAAmBoS,CAAK,CACvC,EAAO,CAAA,EACJ,MAAM,KAAK,aAAa1S,GAAS,CAChC,GAAG2S,EACH,aAAc,KAAK,aAAa7B,CAAqB,CACzD,CAAI,CAAC,CACH,OAAStlC,EAAO,CACf,MAAA2kC,EAAU,KAAK,+EAAgF3kC,CAAK,EAC9FA,CACP,CACD,CACA,MAAM,IAAIknC,EAAO,CAChB,KAAK,cAAc,OAAO,KAAK,oBAAmB,CAAE,EACpD,MAAM5B,EAAwB,KAAK,uBAAuB,IAAI,KAAK,kBAAkB,EAAE,EACnFA,GAAuB,MAAM,KAAK,gBAAgBA,EAAuB4B,CAAK,CACnF,CACA,MAAM,WAAWE,EAAM,CACtB,MAAMC,EAAmB3S,GAAU,CAClC,OAAQ,KAAK,kBAAkB,GAC/B,aAAc,CAAE,OAAQ,KAAK,kBAAkB,EAAE,EACjD,KAAA0S,CACH,CAAG,EACD,GAAI,CACH,MAAM,KAAK,aAAaC,CAAgB,CACzC,OAASrnC,EAAO,CACf,MAAA2kC,EAAU,KAAK,6CAA8C3kC,CAAK,EAC5DA,CACP,CACD,CACA,MAAM,SAAS6V,EAAS,CACvB,MAAM4J,EAAUgV,GAAY,CAC3B,GAAG5e,EACH,aAAc,KAAK,aAAa,KAAK,kBAAkB,EACvD,OAAQ,UACX,CAAG,EACD,GAAI,CACH8uB,EAAU,MAAM,kDAAmD9uB,CAAO,EAC1E,MAAM,KAAK,aAAa4J,CAAO,CAChC,OAASzf,EAAO,CACf,MAAA2kC,EAAU,MAAM,2CAA4C3kC,CAAK,EAC3DA,CACP,CACD,CACA,SAAU,CACT,KAAK,uBAAuB,QAASslC,GAA0B,CAC9DA,EAAsB,QAAO,CAC9B,CAAC,EACD,KAAK,uBAAuB,MAAK,EACjC,KAAK,qBAAqB,SAAQ,EAClC,MAAM,QAAO,CACd,CACD,EAIA,MAAMgC,GAAY7jB,EAAS,EAU3B,IAAI8jB,GAAmB,cAAc3hB,EAAY,CAChD,YAAY/P,EAAU,GAAI,CACzB,MAAK,EACL,KAAK,QAAU,KACf,KAAK,QAAU,KACf,KAAK,eAAiBA,EAAQ,sBAAwB,IAAM,IAAI,eAAe,EAC/E,KAAK,UAAY,KAAK,cAAc,eAAc,EAClD,KAAK,UAAU,QAAU,KACzB,KAAK,UAAU,sBAAwB,GACvC,KAAK,gBAAkB,IAAI,WAAW,IAAI,YAAY,KAAK,UAAU,OAAO,CAAC,EAC7E,KAAK,gBAAkBA,EAAQ,gBAAkBmI,EAClD,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,cAAc3L,GAAS,KAAK,gBAAiBhI,EAAuB,EAAE,KAAK2E,EAAI,IAAM,KAAK,aAAY,CAAE,CAAC,CAAC,CACvH,CAKA,UAAUxQ,EAAQ,CACjB,GAAI,KAAK,QAAS,CACjB,GAAI,CACH,KAAK,QAAQ,WAAU,CACxB,OAASwB,EAAO,CACfsnC,GAAU,MAAM,gDAAiDtnC,CAAK,CACvE,CACA,KAAK,QAAU,KACf,KAAK,QAAU,IAChB,CACI,CAACxB,GAAUA,EAAO,eAAc,EAAG,SAAW,IAClD,KAAK,QAAU,IAAI,YAAYA,EAAO,eAAc,CAAE,EACtD,KAAK,QAAU,KAAK,cAAc,wBAAwB,KAAK,OAAO,EACvE,CACA,SAAU,CACT,GAAI,KAAK,QAAS,CACjB,GAAI,CACH,KAAK,QAAQ,WAAU,CACxB,MAAQ,CAAC,CACT,KAAK,QAAU,IAChB,CACA,KAAK,cAAc,MAAK,EAAG,MAAOwB,GAAU,CAC3CsnC,GAAU,MAAM,kDAAmDtnC,CAAK,CACzE,CAAC,EACD,MAAM,QAAO,CACd,CACA,cAAe,CACd,GAAI,CAAC,KAAK,QAAS,MAAO,GAC1B,KAAK,UAAU,sBAAsB,KAAK,eAAe,EACzD,IAAI4+B,EAAM,EACV,UAAWC,KAAU,KAAK,gBAAiB,CAC1C,MAAMC,GAAcD,EAAS,KAAO,IACpCD,GAAOE,EAAaA,CACrB,CACA,OAAO,KAAK,KAAKF,EAAM,KAAK,gBAAgB,MAAM,CACnD,CACD,EAUA,MAAM4I,GAAY/jB,EAAS,EACrBgkB,GAA8B,IAC9BC,GAA2B,GAC3BC,GAAuC,IACvCC,GAAuC,IACvCC,GAAuC,EACvCC,GAAwC,EACxCC,GAAsC,EACtCC,GAAuC,GACvCC,GAAkC,EAClCC,GAAiC,GACvC,SAASC,GAAyBC,EAAMC,EAAU,CACjD,MAAMC,EAAQF,EAAOC,EACrB,OAAIC,IAAU,EAAU,EACjBF,EAAOE,EAAQ,GACvB,CACA,SAASC,GAAiBC,EAAM,CAC/B,OAAO,OAAOA,GAAS,UAAYA,IAAS,MAAQ,SAAUA,GAAQA,EAAK,OAAS,aACrF,CACA,SAASC,GAAoBD,EAAM,CAClC,OAAO,OAAOA,GAAS,UAAYA,IAAS,MAAQ,SAAUA,GAAQA,EAAK,OAAS,gBACrF,CACA,IAAIE,GAAkB,cAAc9iB,EAAY,CAC/C,YAAY6L,EAAgB1uB,EAAS,GAAI,CACxC,MAAK,EACL,KAAK,eAAiB0uB,EACtB,KAAK,QAAU,GACf,KAAK,yBAA2B,EAChC,KAAK,0BAA4B,EACjC,KAAK,yBAA2B,EAChC,KAAK,0BAA4B,EACjC,KAAK,kBAAoB,EACzB,KAAK,6BAA+B,OACpC,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,WAAa,KAAK,sBAAsB,CAC5C,IAAK,EACL,OAAQ,EACR,MAAO,EACV,CAAG,EACD,KAAK,gBAAkB,KAAK,sBAAsB,CAAA,CAAE,EACpD,KAAK,iBAAmB,KAAK,sBAAsB,CAAA,CAAE,EACrD,KAAK,kBAAoB1uB,EAAO,mBAAqB0kC,GACrD,KAAK,oBAAsB1kC,EAAO,iBAAmB2kC,GACrD,KAAK,yBAA2B3kC,EAAO,0BAA4B4kC,GACnE,KAAK,yBAA2B5kC,EAAO,0BAA4B6kC,GACnE,KAAK,0BAA4B7kC,EAAO,2BAA6B8kC,GACrE,KAAK,2BAA6B9kC,EAAO,4BAA8B+kC,GACvE,KAAK,yBAA2B/kC,EAAO,0BAA4BglC,GACnE,KAAK,0BAA4BhlC,EAAO,2BAA6BilC,GACrE,KAAK,sBAAwBjlC,EAAO,uBAAyBklC,GAC7D,KAAK,qBAAuBllC,EAAO,sBAAwBmlC,EAC5D,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,CACzC,CAEA,IAAI,eAAgB,CACnB,MAAO,CAAC,GAAG,KAAK,gBAAgB,KAAK,CACtC,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,iBAAiB,oBAAqB,IAAM,KAAK,gBAAgB,KAAKl5B,EAAK25B,GAAWA,EAAO,SAAW,CAAC,EAAG3zB,EAAoB,EAAI4C,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5K,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,gBAAgB,MAAM,SAAW,CAC9C,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,aAAY,CAC1C,CAEA,IAAI,gBAAiB,CACpB,MAAO,CAAC,GAAG,KAAK,iBAAiB,KAAK,CACvC,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,iBAAiB,iBAAkB,IAAM,KAAK,gBAAgB,KAAKnG,GAAUk3B,GAAWxoC,GAAKwoC,EAAO,OAAQptC,GAAMA,EAAE,WAAa,UAAU,CAAC,CAAC,EAAGqc,EAAU,KAAK,UAAU,CAAC,CAAC,CACxL,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,OAAQ,CACP,GAAI,KAAK,QAAS,OAClB,KAAK,QAAU,GACf,MAAM5P,EAAM,KAAK,IAAG,EACpB,KAAK,0BAA4BA,EACjC,KAAK,0BAA4BA,EACjCw/B,GAAU,MAAM,6CAA6C,EAC7D,KAAK,YAAYn1B,GAAS,KAAK,iBAAiB,EAAE,KAAKM,EAAO,IAAM,KAAK,OAAO,EAAG6E,GAAU,IAAMrX,GAAK,KAAK,eAAe,SAAQ,CAAE,EAAE,KAAKqT,GAAYnS,IACxJmmC,GAAU,KAAK,yCAA0CnmC,CAAG,EACrDiJ,GACP,CAAC,CAAC,EAAGqI,EAAO,IAAM,KAAK,OAAO,EAAG3D,EAAK45B,GAAW,KAAK,cAAcA,CAAM,CAAC,CAAC,EAAI/J,GAAW,KAAK,SAAS,KAAKA,CAAM,CAAC,EACtH,KAAK,YAAY,KAAK,SAAS,KAAK/pB,GAAK,KAAK,mBAAmB,EAAGR,GAAO,EAAItF,EAAK65B,IAAa,CAChG,IAAKA,EAAQ,OAAO,CAAC3tC,EAAGe,IAAMf,EAAIe,EAAE,cAAe,CAAC,EAAI4sC,EAAQ,OAChE,OAAQA,EAAQ,OAAO,CAAC3tC,EAAGe,IAAMf,EAAIe,EAAE,YAAa,CAAC,EAAI4sC,EAAQ,OACjE,MAAO,EACV,EAAI,CAAC,EAAIC,GAAa,CACnBtB,GAAU,MAAM,+CAA+CsB,EAAS,IAAI,QAAQ,CAAC,CAAC,cAAcA,EAAS,OAAO,QAAQ,CAAC,CAAC,IAAI,EAClI,KAAK,WAAW,KAAKA,CAAQ,CAC9B,CAAC,EACD,KAAK,YAAY,KAAK,SAAS,KAAKnzB,GAAK,CAACgS,EAAKkX,KAAY,CAC1D,KAAMlX,EAAI,QACV,QAASkX,CACZ,GAAM,CACH,KAAM,KACN,QAAS,IACZ,CAAG,EAAGlsB,EAAQo2B,GAASA,EAAK,UAAY,IAAI,CAAC,EAAG,CAAC,CAAE,KAAApkC,EAAM,QAAA8jB,CAAO,IAAO,CACpE,MAAMugB,EAAQvgB,EAAQ,UACtB,KAAK,qBAAqBA,EAASugB,CAAK,EACxC,MAAML,EAAS,KAAK,aAAalgB,EAAS9jB,EAAMqkC,CAAK,EACrD,KAAK,gBAAgB,KAAKL,CAAM,CACjC,CAAC,EACD,KAAK,YAAY,KAAK,SAAS,KAAKhzB,GAAK,CAACmT,EAAS+V,IAAW,CAC7D,MAAMoK,EAASpK,EAAO,UAAY,KAAK,qBAAuB,IACxDvM,EAAU,CACf,UAAWuM,EAAO,UAClB,MAAO,CACN,gBAAiBA,EAAO,qBACxB,YAAaA,EAAO,iBACpB,OAAQA,EAAO,WACpB,EACI,MAAO,CACN,gBAAiBA,EAAO,qBACxB,YAAaA,EAAO,gBACzB,EACI,cAAeA,EAAO,cACtB,yBAA0BA,EAAO,wBACrC,EACG,MAAO,CAAC,GAAG/V,EAAQ,OAAQvsB,GAAMA,EAAE,UAAY0sC,CAAM,EAAG3W,CAAO,CAChE,EAAG,CAAA,CAAE,CAAC,EAAIA,GAAY,KAAK,iBAAiB,KAAKA,CAAO,CAAC,CAC1D,CACA,MAAO,CACD,KAAK,UACV,KAAK,QAAU,GACfkV,GAAU,MAAM,6CAA6C,EAC9D,CACA,SAAU,CACTA,GAAU,MAAM,8CAA8C,EAC9D,KAAK,KAAI,EACT,MAAM,QAAO,CACd,CACA,cAAcoB,EAAQ,CACrB,IAAIM,EAAuB,EACvBC,EAAmB,EACnBC,EAAc,EACdC,EAAuB,EACvBC,EAAmB,EACnBC,EAAgB,EAChBC,EACJ,OAAAZ,EAAO,QAASJ,GAAS,CACpBD,GAAiBC,CAAI,IAAOA,EAAK,OAAS,SAC7CU,GAAwBV,EAAK,iBAAmB,EAChDW,GAAoBX,EAAK,aAAe,EACxCY,EAAc,KAAK,IAAIA,GAAcZ,EAAK,QAAU,GAAK,GAAG,IAE5Da,GAAwBb,EAAK,iBAAmB,EAChDc,GAAoBd,EAAK,aAAe,IAErCC,GAAoBD,CAAI,GAAKA,EAAK,QAAU,aAAeA,EAAK,YACnEe,EAAgBf,EAAK,qBAAuBA,EAAK,qBAAuB,IAAM,KAAK,kBACnFgB,EAA2BhB,EAAK,0BAA4B,KAAK,6BAEnE,CAAC,EACM,CACN,qBAAAU,EACA,iBAAAC,EACA,YAAAC,EACA,qBAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,yBAAAC,EACA,UAAW,KAAK,IAAG,CACtB,CACC,CACA,qBAAqB3K,EAAQ72B,EAAK,CAC7B62B,EAAO,uBAAyB,KAAK,2BACxC,KAAK,yBAA2BA,EAAO,qBACvC,KAAK,0BAA4B72B,GAE9B62B,EAAO,uBAAyB,KAAK,2BACxC,KAAK,yBAA2BA,EAAO,qBACvC,KAAK,0BAA4B72B,GAE9B62B,EAAO,cAAgB,IAAG,KAAK,kBAAoBA,EAAO,eAC1DA,EAAO,2BAA6B,SAAQ,KAAK,6BAA+BA,EAAO,yBAC5F,CACA,aAAaA,EAAQ4K,EAAYzhC,EAAK,CACrC,MAAM2gC,EAAS,CAAA,EACTG,EAAW,KAAK,WAAW,MAC3BY,EAAiB1hC,EAAM,KAAK,0BAC9B0hC,EAAiB,KAAK,0BAA0Bf,EAAO,KAAK,CAC/D,KAAM,mBACN,SAAU,WACV,UAAW3gC,EACX,MAAO0hC,EACP,UAAW,KAAK,wBACnB,CAAG,EACD,MAAMC,EAAiB3hC,EAAM,KAAK,0BAQlC,GAPI2hC,EAAiB,KAAK,0BAA0BhB,EAAO,KAAK,CAC/D,KAAM,mBACN,SAAU,UACV,UAAW3gC,EACX,MAAO2hC,EACP,UAAW,KAAK,wBACnB,CAAG,EACGb,EAAS,MAAO,CACnB,MAAMc,EAAM/K,EAAO,cACbgL,EAAcf,EAAS,IAC7B,GAAIe,EAAc,EAAG,CACpB,MAAMC,EAAWF,EAAMC,EACnBC,EAAW,KAAK,2BAA4BnB,EAAO,KAAK,CAC3D,KAAM,WACN,SAAU,WACV,UAAW3gC,EACX,MAAO4hC,EACP,UAAWC,EAAc,KAAK,0BACnC,CAAK,EACQC,EAAW,KAAK,2BAA2BnB,EAAO,KAAK,CAC/D,KAAM,WACN,SAAU,UACV,UAAW3gC,EACX,MAAO4hC,EACP,UAAWC,EAAc,KAAK,yBACnC,CAAK,CACF,CACA,MAAME,EAASlL,EAAO,YAChBmL,EAAiBlB,EAAS,OAC5BkB,EAAiB,GAChBD,EAASC,EAAiB,KAAK,uBAAuBrB,EAAO,KAAK,CACrE,KAAM,cACN,SAAU,UACV,UAAW3gC,EACX,MAAO+hC,EACP,UAAWC,EAAiB,KAAK,qBACtC,CAAK,CAEH,CACA,GAAIP,EAAY,CACf,MAAMQ,EAAqB,KAAK,IAAI,EAAGpL,EAAO,qBAAuB4K,EAAW,oBAAoB,EAC9FS,EAAiB,KAAK,IAAI,EAAGrL,EAAO,iBAAmB4K,EAAW,gBAAgB,EAClFU,EAAqB,KAAK,IAAI,EAAGtL,EAAO,qBAAuB4K,EAAW,oBAAoB,EAC9FW,EAAiB,KAAK,IAAI,EAAGvL,EAAO,iBAAmB4K,EAAW,gBAAgB,EAClFY,EAAqBJ,EAAqBE,EAC1CG,EAAcnC,GAAyB+B,EAAiBE,EAAgBC,CAAkB,EAC5FC,EAAc,KAAK,0BAA2B3B,EAAO,KAAK,CAC7D,KAAM,mBACN,SAAU,WACV,UAAW3gC,EACX,MAAOsiC,EACP,UAAW,KAAK,yBACpB,CAAI,EACQA,EAAc,KAAK,0BAA0B3B,EAAO,KAAK,CACjE,KAAM,mBACN,SAAU,UACV,UAAW3gC,EACX,MAAOsiC,EACP,UAAW,KAAK,wBACpB,CAAI,CACF,CACA,OAAO3B,CACR,CACD,EAIA,MAAM4B,GAAY9mB,EAAS,EACrB+mB,GAA2B,IAC3BC,GAAsB,IACtBC,GAA8B,IAC9B/sB,GAAiC,IACjCgtB,GAAuB,EACvBztB,GAA6B,EAC7BC,GAAmC,IACnCC,GAA+B,IAC/BwtB,GAAwC,IACxCC,GAAyC,IACzCC,GAAyC,EAMzCC,GAA0B,IAAI,IAAI,CACvC,WACA,cACA,kBACD,CAAC,EAcD,IAAIC,GAAsB,cAAcplB,EAAY,CACnD,YAAYqlB,EAAW/yB,EAAQnV,EAAS,CAAA,EAAI,CAC3C,MAAK,EACL,KAAK,gBAAkB,KAAK,sBAAsB,MAAM,EACxD,KAAK,gBAAkB,KAAK,cAAa,EACzC,KAAK,uBAAyB,KAAK,sBAAsB,EAAK,EAC9D,KAAK,gBAAkB,KAAK,sBAAsB,EAAK,EACvD,KAAK,UAAY,KAAK,cAAa,EACnC,KAAK,cAAgB,EACrB,KAAK,oBAAsB,EAC3B,KAAK,oBAAsB,EAC3B,KAAK,uBAAyB,EAC9B,KAAK,eAAiB,EACtB,KAAK,eAAiB,KAAK,cAAa,EACxC,KAAK,WAAakoC,EAClB,KAAK,QAAU/yB,EACf,KAAK,QAAU,CACd,eAAgBnV,EAAO,gBAAkBynC,GACzC,WAAYznC,EAAO,YAAc0nC,GACjC,iBAAkB1nC,EAAO,kBAAoB2nC,GAC7C,oBAAqB3nC,EAAO,qBAAuB4a,GACnD,YAAa5a,EAAO,aAAe4nC,GACnC,oBAAqB5nC,EAAO,qBAAuB,GACnD,iBAAkBA,EAAO,kBAAoBma,GAC7C,sBAAuBna,EAAO,uBAAyBoa,GACvD,mBAAoBpa,EAAO,oBAAsBqa,GACjD,4BAA6Bra,EAAO,6BAA+B6nC,GACnE,6BAA8B7nC,EAAO,8BAAgC8nC,GACrE,sBAAuB9nC,EAAO,uBAAyB,GACvD,2BAA4BA,EAAO,4BAA8B+nC,EACpE,EACE,KAAK,aAAY,EACjB,KAAK,gCAA+B,CACrC,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,EAAG,KAAKlzB,EAAU,KAAK,WAAW,CAAC,CAC5E,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,gBAAgB,KAC7B,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,EAAG,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC5E,CACA,IAAI,uBAAwB,CAC3B,OAAO,KAAK,uBAAuB,aAAY,EAAG,KAAKA,EAAU,KAAK,WAAW,CAAC,CACnF,CACA,IAAI,sBAAuB,CAC1B,OAAO,KAAK,uBAAuB,KACpC,CAKA,YAAYszB,EAAS,CACpB,KAAK,UAAU,KAAKA,CAAO,CAC5B,CAKA,MAAM,mBAAoB,CACzB,GAAI,KAAK,gBAAgB,QAAU,aAAc,CAChDX,GAAU,KAAK,gFAAgF,EAC/F,MACD,CACAA,GAAU,KAAK,mDAAmD,EAClE,KAAK,aAAa,YAAY,EAC9B,MAAM,KAAK,kBAAkB,EAAK,EAClC,KAAK,cAAa,CACnB,CAIA,iBAAkB,CACjB,KAAK,gBAAgB,gBAAgB,CACtC,CAKA,OAAQ,CACPA,GAAU,KAAK,yCAAyC,EACxD,KAAK,cAAgB,EACrB,KAAK,oBAAsB,EAC3B,KAAK,oBAAsB,EAC3B,KAAK,uBAAyB,EAC9B,KAAK,eAAiB,EACtB,KAAK,aAAa,MAAM,CACzB,CAMA,oBAAqB,EAChB,KAAK,gBAAgB,QAAU,YAAc,KAAK,gBAAgB,QAAU,UAC/EA,GAAU,KAAK,iEAAiE,EAChF,KAAK,eAAiB,EACtB,KAAK,aAAa,MAAM,EACxB,KAAK,YAAY,CAChB,OAAQ,UACR,OAAQ,+BACZ,CAAI,EAEH,CAKA,gBAAgBY,EAAa,CAC5B,GAAI,CAAC,KAAK,QAAQ,sBAAuB,OACzC,MAAMC,EAAiB,KAAK,uBAAuB,MAC/C,CAACA,GAAkBD,EAAc,KAAK,QAAQ,6BACjD,KAAK,uBAAuB,KAAK,EAAI,EACrC,KAAK,WAAW,aAAY,EAC5B,KAAK,UAAU,CACd,OAAQ,iBACR,OAAQ,aAAaA,CAAW,wBAAwB,KAAK,QAAQ,2BAA2B,OAChG,UAAW,KAAK,IAAG,CACvB,CAAI,EACDZ,GAAU,KAAK,oDAAoDY,CAAW,UAAU,KAAK,QAAQ,2BAA2B,MAAM,GAC5HC,GAAkBD,GAAe,KAAK,QAAQ,+BACxD,KAAK,uBAAuB,KAAK,EAAK,EACtC,KAAK,WAAW,YAAW,EAC3B,KAAK,UAAU,CACd,OAAQ,iBACR,OAAQ,aAAaA,CAAW,wBAAwB,KAAK,QAAQ,4BAA4B,OACjG,UAAW,KAAK,IAAG,CACvB,CAAI,EACDZ,GAAU,KAAK,oDAAoDY,CAAW,WAAW,KAAK,QAAQ,4BAA4B,MAAM,EAE1I,CAMA,oBAAoBxC,EAAQ,CAC3B,MAAM0C,EAAgB1C,EAAO,KAAM,GAAM,EAAE,OAAS,kBAAkB,EAClE0C,IAAkB,KAAK,gBAAgB,OAAO,KAAK,gBAAgB,KAAKA,CAAa,CAC1F,CAKA,0BAA2B,CAC1B,MAAMC,EAAU,KAAK,WAAW,uBAAsB,EAClDA,IAAY,aAAeA,IAAY,aAC1Cf,GAAU,KAAK,0EAA0E,EACzF,KAAK,UAAU,CACd,OAAQ,mBACR,OAAQ,yDACR,UAAW,KAAK,IAAG,CACvB,CAAI,IAEDA,GAAU,KAAK,iEAAiE,EAChF,KAAK,UAAU,CACd,OAAQ,iBACR,OAAQ,4EACR,UAAW,KAAK,IAAG,CACvB,CAAI,EACD,KAAK,YAAY,CAChB,OAAQ,UACR,OAAQ,yBACZ,CAAI,GAEF,KAAK,MAAK,CACX,CACA,SAAU,CACT,KAAK,eAAe,KAAI,EACxB,KAAK,eAAe,SAAQ,EAC5B,MAAM,QAAO,CACd,CACA,cAAe,CACd,KAAK,YAAY,KAAK,UAAU,KAAKzyB,GAAI,IAAM,CAC1C,KAAK,gBAAgB,QAAU,QAAQ,KAAK,aAAa,YAAY,CAC1E,CAAC,EAAGvD,GAAa,KAAK,QAAQ,cAAc,EAAG0D,GAAe,KAAK,QAAQ,eAAe,EAAGtF,EAAO,CAAC,CAAA,CAAG44B,CAAc,IAAM,KAAK,eAAeA,CAAc,CAAC,EAAGv8B,EAAI,CAAC,CAACk8B,CAAO,IAAMA,CAAO,EAAG11B,GAAY01B,GAAY,KAAK,sBAAsBA,CAAO,CAAC,EAAGtzB,EAAUrF,GAAM,KAAK,YAAa,KAAK,cAAc,CAAC,CAAC,EAAG,CACtT,KAAM,IAAM,CAAC,EACb,MAAQlR,GAAQ,CACfkpC,GAAU,MAAM,sCAAuClpC,CAAG,EAC1D,KAAK,aAAa,MAAM,CACzB,CACH,CAAG,CACF,CASA,iCAAkC,CACjC,GAAI,CAAC,KAAK,QAAQ,sBAAuB,OACzC,MAAMmqC,EAAU,KAAK,QAAQ,2BAA6B,IAC1D,KAAK,YAAYz7B,GAAc,CAAC,KAAK,uBAAwB,KAAK,eAAe,CAAC,EAAE,KAAKyH,GAAU,CAAC,CAACi0B,EAAaJ,CAAa,IAC1HI,GAAe,CAACJ,EAAsBr5B,GAAMw5B,CAAO,EAChDlhC,EACP,EAAGsN,EAAU,KAAK,WAAW,CAAC,EAAG,IAAM,CACvC,KAAK,uBAAuB,KAAK,EAAK,EACtC,KAAK,WAAW,YAAW,EAC3B,KAAK,UAAU,CACd,OAAQ,iBACR,OAAQ,sBAAsB,KAAK,QAAQ,0BAA0B,sBACrE,UAAW,KAAK,IAAG,CACvB,CAAI,EACD2yB,GAAU,KAAK,6DAA6D,KAAK,QAAQ,0BAA0B,GAAG,CACvH,CAAC,CACF,CACA,eAAegB,EAAgB,CAC9B,OAAI,KAAK,WAAW,iBACnBhB,GAAU,MAAM,6DAA6D,EAC7E,KAAK,aAAa,MAAM,EACjB,IAEHgB,EAKA,KAAK,WAAW,kBAKjB,KAAK,oBACRhB,GAAU,MAAM,qDAAqD,EACrE,KAAK,aAAa,UAAU,EACrB,IAED,IATNA,GAAU,MAAM,wDAAwD,EACxE,KAAK,aAAa,MAAM,EACjB,KAPPA,GAAU,MAAM,yDAAyD,EACzE,KAAK,aAAa,MAAM,EACjB,GAaT,CACA,kBAAmB,CAClB,OAAO,KAAK,MAAQ,KAAK,cAC1B,CACA,sBAAsBW,EAAS,CAC9B,YAAK,aAAa,YAAY,EAC9BX,GAAU,KAAK,0DAA0DW,EAAQ,MAAM,WAAWA,EAAQ,MAAM,EAAE,EAC3G/qC,GAAK,KAAK,SAAS+qC,CAAO,CAAC,EAAE,KAAKpzB,GAAI,IAAM,KAAK,cAAa,CAAE,EAAGtE,GAAYnS,IACrFkpC,GAAU,MAAM,8CAA+ClpC,CAAG,EAClE,KAAK,cAAa,EACXiJ,GACP,CAAC,CACH,CACA,MAAM,SAAS4gC,EAAS,CAEvB,GADA,KAAK,gBAAgBA,EAAQ,MAAM,EAC/BA,EAAQ,WAAaH,GAAwB,IAAIG,EAAQ,SAAS,EAAG,CACxEX,GAAU,MAAM,gDAAgDW,EAAQ,SAAS,uCAAuC,EACxH,MACD,CACI,KAAK,cAAgB,KAAK,QAAQ,aACjC,MAAM,KAAK,kBAAkB,EAAK,GAEnC,KAAK,QAAQ,qBAAuB,KAAK,cAAgB,KAAK,QAAQ,aACrE,MAAM,KAAK,kBAAkB,EAAI,GAElC,KAAK,eAAiB,KAAK,QAAQ,cACtC,KAAK,UAAU,CACd,OAAQ,uBACR,OAAQ,OAAO,KAAK,QAAQ,WAAW,+BACvC,QAAS,KAAK,cACd,YAAa,KAAK,QAAQ,YAC1B,UAAW,KAAK,IAAG,CACvB,CAAI,EACDX,GAAU,KAAK,oDAAoD,EAErE,CACA,gBAAgBjrB,EAAQ,CACvB,MAAMtX,EAAM,KAAK,IAAG,EACpB,GAAIA,EAAM,KAAK,uBAAwB,CACtCuiC,GAAU,MAAM,iEAAiE,EACjF,MACD,CAKA,GAJIviC,EAAM,KAAK,oBAAsB,KAAK,QAAQ,wBACjD,KAAK,oBAAsB,EAC3B,KAAK,oBAAsBA,GAExB,KAAK,qBAAuB,KAAK,QAAQ,iBAAkB,CAC9D,KAAK,uBAAyBA,EAAM,KAAK,QAAQ,mBACjDuiC,GAAU,MAAM,sDAAsD,KAAK,QAAQ,gBAAgB,qBAAqB,KAAK,sBAAsB,EAAE,EACrJ,MACD,CACA,KAAK,qBAAuB,EAC5B,KAAK,WAAW,gBAAe,EAC/B,KAAK,UAAU,CACd,OAAQ,qBACR,OAAAjrB,EACA,UAAWtX,CACd,CAAG,EACDuiC,GAAU,MAAM,kDAAkD,KAAK,mBAAmB,IAAI,KAAK,QAAQ,gBAAgB,GAAG,CAC/H,CACA,MAAM,kBAAkBpH,EAAW,CAClC,KAAK,eAAiB,EACtB,MAAMuI,EAAOvI,EAAY,sBAAwB,oBACjDoH,GAAU,KAAK,wBAAwBmB,CAAI,0BAA0B,KAAK,aAAa,IAAI,KAAK,QAAQ,WAAW,EAAE,EACrH,KAAK,UAAU,CACd,OAAQ,mBACR,OAAQ,GAAGA,CAAI,eACf,QAAS,KAAK,cACd,YAAa,KAAK,QAAQ,YAC1B,UAAW,KAAK,IAAG,CACtB,CAAG,EACD,GAAI,CACH,OAAI,MAAM,KAAK,YAAY,KAAK,WAAW,kBAAkBvI,CAAS,EAAG,KAAK,QAAQ,mBAAmB,GACxG,KAAK,UAAU,CACd,OAAQ,qBACR,OAAQ,GAAGuI,CAAI,yBACf,QAAS,KAAK,cACd,YAAa,KAAK,QAAQ,YAC1B,UAAW,KAAK,IAAG,CACxB,CAAK,EACDnB,GAAU,KAAK,wBAAwBmB,CAAI,wBAAwB,EACnE,KAAK,cAAgB,EACd,KAER,KAAK,UAAU,CACd,OAAQ,kBACR,OAAQ,GAAGA,CAAI,8BACf,QAAS,KAAK,cACd,YAAa,KAAK,QAAQ,YAC1B,UAAW,KAAK,IAAG,CACvB,CAAI,EACDnB,GAAU,KAAK,wBAAwBmB,CAAI,qBAAqB,EACzD,GACR,MAAQ,CACP,YAAK,UAAU,CACd,OAAQ,mBACR,OAAQ,GAAGA,CAAI,gCAAgC,KAAK,QAAQ,mBAAmB,KAC/E,QAAS,KAAK,cACd,YAAa,KAAK,QAAQ,YAC1B,UAAW,KAAK,IAAG,CACvB,CAAI,EACDnB,GAAU,KAAK,wBAAwBmB,CAAI,wBAAwB,EAC5D,EACR,CACD,CACA,MAAM,YAAYt/B,EAAS4T,EAAW,CACrC,OAAO,IAAI,QAAQ,CAAC7gB,EAASC,IAAW,CACvC,MAAMyoB,EAAY,WAAW,IAAM,CAClCzoB,EAAuB,IAAI,MAAM,iBAAiB4gB,CAAS,IAAI,CAAC,CACjE,EAAGA,CAAS,EACZ5T,EAAQ,KAAMlN,GAAU,CACvB,aAAa2oB,CAAS,EACtB1oB,EAAQD,CAAK,CACd,EAAImC,GAAQ,CACX,aAAawmB,CAAS,EACtBzoB,EAAOiC,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,CAAC,CAC3D,CAAC,CACF,CAAC,CACF,CACA,aAAagH,EAAO,CACnB,MAAM1D,EAAO,KAAK,gBAAgB,MAC9BA,IAAS0D,IACZkiC,GAAU,MAAM,8BAA8B5lC,CAAI,OAAO0D,CAAK,EAAE,EAChE,KAAK,gBAAgB,KAAKA,CAAK,EAEjC,CACA,eAAgB,CACf,KAAK,eAAiB,KAAK,IAAG,EAAK,KAAK,QAAQ,WAChD,KAAK,aAAa,UAAU,EACxB,KAAK,uBAAuB,KAAK,sBAAsB,YAAW,EACtE,KAAK,sBAAwB2J,GAAM,KAAK,QAAQ,UAAU,EAAE,KAAK8C,GAAK,CAAC,EAAG8C,EAAU,KAAK,WAAW,EAAGjF,EAAO,IAAM,KAAK,gBAAgB,QAAU,UAAU,CAAC,EAAE,UAAU,IAAM,KAAK,aAAa,MAAM,CAAC,CAC1M,CACA,UAAU2R,EAAO,CAChB,KAAK,gBAAgB,KAAKA,CAAK,CAChC,CACD,EAQIqnB,GAAqB,KAAM,CAC9B,YAAY9T,EAAeK,EAAc1H,EAAkB,CAC1D,KAAK,cAAgBqH,EACrB,KAAK,aAAeK,EACpB,KAAK,iBAAmB1H,CACzB,CAIA,sBAAsB/nB,EAAI,CACzB,OAAO,IAAIwvB,GAAgBxvB,EAAI,KAAK,cAAe,KAAK,aAAc,KAAK,gBAAgB,CAC5F,CAIA,kBAAkBA,EAAI,CACrB,OAAO,IAAImvB,GAAYnvB,EAAI,KAAK,cAAe,KAAK,gBAAgB,CACrE,CACD,EAKA,MAAMmjC,GAAiB,KAEjBC,GAAuB,KAEvBC,GAAsB,IAEtBC,GAAe,EACfC,GAAe,IAEfC,GAAU,EAEVC,GAAU,EAEVC,GAA0B,EAC1BC,GAAqB,IACrBC,GAAqB,EACrBC,GAAqB,EAe3B,SAASC,GAAW3C,EAAKG,EAAQyC,EAAY,CAC5C,MAAMC,EAAOb,IAAkBhC,EAAM,EAAIG,GAAU8B,GAAuBW,EAAaV,GACjFzwC,EAAI,KAAK,IAAI2wC,GAAc,KAAK,IAAID,GAAcU,CAAI,CAAC,EACvDC,EAAM,EAAI,KAAOrxC,EAAIA,GAAKA,EAAI,KAAO,IAAMA,GAAK,KACtD,OAAO,KAAK,IAAI6wC,GAAS,KAAK,IAAID,GAASS,CAAG,CAAC,CAChD,CAYA,SAASC,GAAkBD,EAAK,CAC/B,OAAIA,GAAOP,GAAgC,YACvCO,GAAON,GAA2B,OAClCM,GAAOL,GAA2B,OAClCK,GAAOJ,GAA2B,OAC/B,UACR,CAIA,MAAMM,GAAYnpB,EAAS,EAMrBopB,GAAsB,2BAOtBC,GAAgC,EAAI,EACpCC,GAAyBrpC,GAAgB,CAC9C,GAAI,CAACA,EAAa,MAAO,CAAA,EACzB,GAAI,CACH,MAAM8jB,EAAM,IAAI,IAAI,eAAe9jB,CAAW,EAAE,EAC1C+qB,EAAS,CAAA,EACf,OAAAjH,EAAI,aAAa,QAAQ,CAACtoB,EAAO0Q,IAAQ,CACxC6e,EAAO7e,CAAG,EAAI1Q,CACf,CAAC,EACMuvB,CACR,OAASzuB,EAAO,CACf,OAAA4sC,GAAU,KAAK,oCAAoClpC,CAAW,GAAI1D,CAAK,EAChE,CAAA,CACR,CACD,EAQA,IAAIgtC,GAAa,cAAcpnB,EAAY,CAC1C,YAAYqnB,EAAep3B,EAASq3B,EAAgBC,EAAS,CAC5D,MAAK,EACL,KAAK,cAAgBF,EACrB,KAAK,QAAUp3B,EACf,KAAK,QAAUs3B,EACf,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,kBAAoB,MACzB,KAAK,WAAa,KAAK,oBAAmB,EAC1C,KAAK,WAAa,GAClB,KAAK,gBAAkB,KAAK,sBAAsB,CAAE,GAAG7jB,EAAqB,SAAS,cAAe,EACpG,KAAK,gBAAkB,KAAK,sBAAsB,CAAA,CAAE,EACpD,KAAK,iBAAmB,KAAK,sBAAsB,CAAA,CAAE,EACrD,KAAK,mBAAqB,KAAK,sBAAsB,EAAI,EACzD,KAAK,eAAiB,KAAK,sBAAsB,CAAC,EAClD,KAAK,eAAiB,KAAK,sBAAsB,WAAW,EAC5D,KAAK,gBAAkB,KAAK,sBAAsB,MAAM,EACxD,KAAK,gBAAkB,KAAK,cAAa,EACzC,KAAK,uBAAyB,KAAK,sBAAsB,EAAK,EAC9D,KAAK,qBAAuB,KAAK,cAAa,EAC9C,KAAK,qBAAuC,IAAI,IAChD,KAAK,mBAAqB,GAC1B,KAAK,kBAAoB,KACzB,KAAK,GAAKzT,EAAQ,QAAU2P,GAAE,EAC9B,KAAK,GAAK3P,EAAQ,GAClB,KAAK,gBAAgB,KAAK,CACzB,GAAG,KAAK,gBAAgB,MACxB,GAAGk3B,GAAsBl3B,EAAQ,EAAE,EACnC,GAAGA,EAAQ,aACd,CAAG,EACD,KAAK,YAAY,KAAK,gBAAkB4J,GAAY,CACnD,MAAM2tB,EAAWtpB,GAAarE,EAAS,sBAAsB,EACzD2tB,GAAU,KAAK,gBAAgB,KAAK,CACvC,GAAG,KAAK,gBAAgB,MACxB,GAAGA,CACP,CAAI,CACF,CAAC,EACD,MAAMC,EAAWH,EAAe,mBAAmB,IAAI,EACvD,KAAK,aAAeG,EAAS,aAC7B,KAAK,kBAAoBA,EAAS,kBAC9Bx3B,EAAQ,WACX,KAAK,SAAW,KAAK,sBAAsB,SAAS,EACpD,KAAK,kBAAoB,WACnB,KAAK,SAAW,KAAK,sBAAsB,KAAK,EACvD,KAAM,CAAE,iBAAA2a,EAAkB,eAAA8c,CAAc,EAAKJ,EAC7C,KAAK,gBAAkBI,EACvB,KAAK,mBAAqB,IAAI3B,GAAmB,KAAK,cAAc,KAAK,IAAI,EAAG,KAAK,aAAcnb,CAAgB,EACnH,KAAK,YAAYje,GAAM,KAAK,SAAS,aAAY,EAAI,KAAK,aAAa,gBAAgB,EAAE,KAAKyC,EAAoB,EAAI4C,EAAU,KAAK,WAAW,CAAC,EAAI6qB,GAAW,OAC/J,KAAK,kBAAoBA,EACrBA,IAAW,aAAe,CAAC,KAAK,cAAe,KAAK,yBAAwB,EACvEA,IAAW,iBACnBvmC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,UACpB,KAAK,cAAgB,SACXumC,IAAW,aAAeA,IAAW,WAAU,KAAK,yBAAwB,CACxF,CAAC,CACF,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,cAAc,KAAK,SAAS,aAAY,CAAE,CACvD,CAKA,UAAU8K,EAAW,CAChB,KAAK,SAAS,QAAU,aAAe,KAAK,SAAS,QAAU,WACnE,KAAK,SAAS,KAAKA,CAAS,EACxBA,EAAU,QACb,KAAK,SAAS,KAAK,QAAQ,EAC3B,KAAK,QAAO,GAEd,CAEA,oBAAqB,QACpBrxC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,oBACxB,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,QAAQ,UAAY,UAAY,UAC7C,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,cAAciE,GAAK,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,KAAKyX,EAAU,KAAK,WAAW,CAAC,CACjF,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,QAAQ,QACrB,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,QAAQ,IACrB,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,QAAQ,MACrB,CAEA,MAAM,qBAAsB,CAC3B,MAAM,IAAIyH,EACX,CAEA,MAAM,qBAAsB,CAC3B,MAAM,IAAIA,EACX,CAEA,UAAUqW,EAAQ,CACjB,KAAK,kBAAkB,UAAUA,CAAM,CACxC,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,kBAAkB,YAC/B,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,kBAAkB,YAC/B,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,kBAAkB,IAC/B,CAEA,MAAM,YAAa,CAClB,MAAMzc,EAAS,KAAK,OAAS,cAAgB,YAC7C,MAAM,KAAK,cAAc,KAAK,QAAU,GAAIA,EAAQ,EAAE,CACvD,CAMA,MAAM,YAAa,CACd,KAAK,WAAY,MAAM,KAAK,aAAa,OAAM,EAC9C,MAAM,KAAK,aAAa,KAAI,EACjC,KAAK,WAAa,CAAC,KAAK,UACzB,CAEA,MAAM,gBAAiB,CACtB,MAAM,IAAIoG,EACX,CAEA,MAAM,gBAAiB,CACtB,MAAM,IAAIA,EACX,CAMA,MAAM,QAAQ2Y,EAAO,CACpB,MAAM,IAAI3Y,EACX,CAMA,MAAM,WAAW2Y,EAAO,CACvB,MAAM,IAAI3Y,EACX,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,kBAAkB,aAAa,EAAE,KAAKzH,EAAU,KAAK,WAAW,CAAC,CACjG,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,kBAAkB,YAC/B,CAYA,MAAM,cAAcmgB,EAAQ9e,EAAQ9V,EAAM,WACzC,MAAMsrB,EAAS,KAAK,kBAAkBsJ,EAAQ50B,EAAM8V,CAAM,EACpD1S,EAAU+sB,GAAgB,CAC/B,OAAAra,EACA,OAAAwV,CACH,CAAG,EACD,GAAI,CACH,MAAMjK,EAAW,MAAM,KAAK,cAAc,QAAQje,CAAO,EACzD,GAAIoyB,GAAuBnU,CAAQ,EAAG,MAAM,IAAI3D,GAAa,WAAS3kB,EAAAsoB,EAAS,SAAT,YAAAtoB,EAAiB,OAAQ,GAAG,EAAG,8BAA8B+c,CAAM,MAAK9c,EAAAqoB,EAAS,SAAT,YAAAroB,EAAiB,IAAI,KAAI2K,EAAA0d,EAAS,SAAT,YAAA1d,EAAiB,OAAO,GAAI,OAAQ,OAAQP,EAAQ,EAAE,EAC7N,OAAOie,CACR,OAASxkB,EAAO,CACf,MAAA4sC,GAAU,MAAM,iCAAiC3zB,CAAM,eAAgBwV,EAAQzuB,CAAK,EAC9EA,CACP,CACD,CACA,kBAAkB+3B,EAAQ50B,EAAM8V,EAAQ,CACvC,MAAMY,EAAO,CACZ,QAAS,KAAK,QAAU,GACxB,QAAS,KAAK,GACd,UAAW,KAAK,aAAa,QAAU,EAC1C,EACE,OAAIZ,IAAW4zB,GAA4B,CAC1C,GAAG1pC,EACH,KAAA0W,CACH,EACM,OAAOke,GAAW,SAAiB,CACtC,GAAG50B,EACH,KAAA0W,EACA,QAAS,CAACke,CAAM,CACnB,EACS,CACN,GAAG50B,EACH,KAAA0W,EACA,OAAQ,CACP,QAAS,KAAK,QAAU,GACxB,QAAS,KAAK,GACd,UAAWke,CACf,CACA,CACC,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,uBAAuB,UAAW,IAAMxlB,GAAM,KAAK,SAAS,aAAY,EAAI,KAAK,aAAa,gBAAgB,EAAE,KAAKyC,IAAwB8C,GAAK2qB,GAAW,CACxK,KAAK,kBAAoBA,CAC1B,CAAC,CAAC,CAAC,CACJ,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,kBAAkB,aAAa,EAAE,KAAK7qB,EAAU,KAAK,WAAW,CAAC,CACjG,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,cAAc,KAAK,kBAAkB,KAAK,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CACzF,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,cAAc,KAAK,kBAAkB,UAAU,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC9F,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,cAAc,KAAK,kBAAkB,UAAU,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC9F,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,cAAc,KAAK,kBAAkB,kBAAkB,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CACtG,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,cAAc,KAAK,kBAAkB,OAAO,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC3F,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,cAAc,KAAK,kBAAkB,KAAK,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CACzF,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,kBAAkB,aAAa,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CACjG,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,cAAc,KAAK,kBAAkB,OAAO,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC3F,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,iBACb,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,kBAAkB,SAC/B,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,kBAAkB,SAC/B,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBAAkB,iBAC/B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,kBAAkB,MAC/B,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,kBAAkB,IAC/B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,kBAAkB,MAC/B,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,cAAc,KAAK,kBAAkB,QAAQ,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC5F,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,kBAAkB,OAC/B,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,cAAc,KAAK,aAAa,YAAY,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC3F,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,aAAa,WAC1B,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,aAAa,aAAa,EAAE,KAAKA,EAAU,KAAK,WAAW,CAAC,CAC5F,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,aAAa,YAC1B,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,cAAc,KAAK,gBAAgB,aAAY,CAAE,CAC9D,CAEA,IAAI,eAAgB,CACnB,MAAO,CAAE,GAAG,KAAK,gBAAgB,KAAK,CACvC,CAEA,IAAI,cAAc41B,EAAW,CAC5B,KAAK,gBAAgB,KAAK,CACzB,GAAG,KAAK,gBAAgB,MACxB,GAAGA,CACN,CAAG,CACF,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,cAAc,KAAK,gBAAgB,aAAY,CAAE,CAC9D,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,gBAAgB,KAC7B,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,cAAc,KAAK,mBAAmB,aAAY,CAAE,CACjE,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,mBAAmB,KAChC,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,cAAc,KAAK,iBAAiB,aAAY,CAAE,CAC/D,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,iBAAiB,KAC9B,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,eAAe,aAAY,CAAE,CAC7D,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,eAAe,aAAY,CAAE,CAC7D,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,cAAc,KAAK,gBAAgB,aAAY,CAAE,CAC9D,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,cAAc,KAAK,gBAAgB,aAAY,CAAE,CAC9D,CAEA,IAAI,uBAAwB,CAC3B,OAAO,KAAK,cAAc,KAAK,uBAAuB,aAAY,CAAE,CACrE,CAEA,IAAI,qBAAsB,CACzB,OAAO,KAAK,cAAc,KAAK,qBAAqB,aAAY,CAAE,CACnE,CAKA,uBAAuBlpB,EAAO,CAC7B,KAAK,qBAAqB,KAAKA,CAAK,CACrC,CAEA,iBAAkB,UACjBnoB,GAAAD,EAAA,KAAK,cAAa,kBAAlB,MAAAC,EAAA,KAAAD,EACD,CAEA,MAAM,mBAAoB,SACzB,OAAMC,GAAAD,EAAA,KAAK,cAAa,oBAAlB,YAAAC,EAAA,KAAAD,GACP,CAKA,0BAA2B,CAC1B,MAAMs1B,EAAK,KAAK,kBAEhB,GADAob,GAAU,MAAM,uCAAuCpb,EAAK,SAAW,WAAW,qBAAqBA,GAAA,YAAAA,EAAI,eAAe,EAAE,EACxH,CAACA,EAAI,CACRob,GAAU,KAAK,+DAA+D,EAC9E,MACD,CACA,GAAI,CACH,MAAMa,EAAQnkB,EAAqB,SACnC,KAAK,cAAgB,IAAIof,GAAgBlX,EAAI,CAC5C,kBAAmBic,EAAM,qBACzB,gBAAiBA,EAAM,qBACvB,yBAA0BA,EAAM,uBAChC,0BAA2BA,EAAM,wBACjC,2BAA4BA,EAAM,wBAA0BX,GAC5D,yBAA0BW,EAAM,yBAA2B,IAC3D,0BAA2BA,EAAM,yBAA2B,IAC5D,sBAAuBA,EAAM,2BAC7B,qBAAsBA,EAAM,gBAChC,CAAI,EACD,KAAK,iBAAmB,IAAIzC,GAAoB,CAC/C,gBAAiB,IAAM,SACtB,GAAI,CACC,KAAK,aAAa,mBAAoB,KAAK,aAAa,mBAAkB,GACzE7uC,GAAAD,EAAA,KAAK,cAAa,kBAAlB,MAAAC,EAAA,KAAAD,EACN,MAAQ,CAAC,CACV,EACA,kBAAmB,MAAOinC,GAAc,SACvC,GAAI,CACC,KAAK,aAAa,qBAAsB,MAAM,KAAK,aAAa,qBAAqBA,CAAS,EAC7F,OAAMhnC,GAAAD,EAAA,KAAK,cAAa,oBAAlB,YAAAC,EAAA,KAAAD,EAAsCinC,GAClD,MAAQ,CACP,MAAO,EACR,CACA,OAAO,KAAK,+BAA8B,CAC3C,EACA,aAAc,IAAM,CACnB,GAAI,CACH,KAAK,aAAa,yBAAwB,EAC1CyJ,GAAU,MAAM,wCAAwC,CACzD,MAAQ,CACPA,GAAU,MAAM,iDAAiD,CAClE,CACD,EACA,YAAa,IAAM,CAClB,KAAK,aAAa,2BAA0B,EAAG,MAAM,IAAM,CAC1DA,GAAU,MAAM,gDAAgD,CACjE,CAAC,CACF,EACA,cAAe,IAAM,KAAK,aAAa,mBAAmB,cAC1D,gBAAiB,IAAM,KAAK,oBAAsB,YAClD,uBAAwB,IAAMpb,EAAG,eACrC,EAAM,CAAE,gBAAiB,KAAK,cAAc,cAAc,EAAI,CAC1D,eAAgBic,EAAM,qBACtB,WAAYA,EAAM,iBAClB,iBAAkBA,EAAM,2BACxB,oBAAqBA,EAAM,kBAC3B,YAAaA,EAAM,oBACnB,oBAAqBA,EAAM,oBAC3B,iBAAkBA,EAAM,iBACxB,sBAAuBA,EAAM,oBAC7B,mBAAoBA,EAAM,gBAC9B,CAAI,EACD,KAAK,YAAY,KAAK,cAAc,eAAiB9E,GAAW,OAC/D,KAAK,gBAAgB,KAAKA,CAAM,GAChCzsC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,oBAAoBysC,EAC5C,CAAC,EACD,KAAK,YAAY,KAAK,cAAc,kBAAoB+E,GAAY,CACnE,KAAK,mBAAmB,KAAKA,CAAO,CACrC,CAAC,EACD,KAAK,YAAY,KAAK,cAAc,gBAAkBpb,GAAY,OAEjE,GADA,KAAK,iBAAiB,KAAKA,CAAO,EAC9BA,EAAQ,OAAS,EAAG,CACvB,MAAMG,EAASH,EAAQA,EAAQ,OAAS,CAAC,EACnCqb,EAAYlb,EAAO,MAAM,gBAAkBA,EAAO,MAAM,gBACxDmb,EAAYnb,EAAO,MAAM,YAAcA,EAAO,MAAM,YACpDob,EAAUF,EAAYC,EAAY,EAAIA,GAAaD,EAAYC,GAAa,IAAM,EAClFlB,EAAMH,GAAW9Z,EAAO,cAAeA,EAAO,MAAM,OAAQob,CAAO,EACzE,KAAK,eAAe,KAAKnB,CAAG,EAC5B,KAAK,eAAe,KAAKC,GAAkBD,CAAG,CAAC,EAC3Cja,EAAO,2BAA6B,UAAQv2B,EAAA,KAAK,mBAAL,MAAAA,EAAuB,gBAAgBu2B,EAAO,yBAA2B,KAC1H,CACD,CAAC,EACD,KAAK,YAAY,KAAK,cAAc,eAAiBqb,GAAU,QAC9D5xC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,YAAY,CAClC,OAAQ,QACR,OAAQ,GAAG4xC,EAAM,IAAI,KAAKA,EAAM,QAAQ,GACxC,UAAWA,EAAM,IACtB,EACG,CAAC,EACD,KAAK,YAAY,KAAK,iBAAiB,eAAiBzlC,GAAU,CACjE,KAAK,gBAAgB,KAAKA,CAAK,CAChC,CAAC,EACD,KAAK,YAAY,KAAK,iBAAiB,eAAiBic,GAAU,CACjE,KAAK,gBAAgB,KAAKA,CAAK,EAC3BA,EAAM,SAAW,yBACpBsoB,GAAU,KAAK,0DAA0D,EACzE,KAAK,UAAU,CACd,KAAM,UACN,MAAO,GACP,MAAuB,IAAI,MAAM,8CAA8C,EAC/E,OAAQ,KAAK,EACnB,CAAM,EAEH,CAAC,EACD,KAAK,YAAY,KAAK,iBAAiB,sBAAwBnB,GAAgB,CAC9E,KAAK,uBAAuB,KAAKA,CAAW,CAC7C,CAAC,EACG,KAAK,iBAAiB,KAAK,YAAY,KAAK,gBAAkBnnB,GAAU,SACvEA,EAAM,OAAS,WAAWpoB,EAAA,KAAK,mBAAL,MAAAA,EAAuB,YAAY,CAChE,OAAQ,UACR,OAAQ,sBACb,GACaooB,EAAM,OAAS,YAAUnoB,EAAA,KAAK,mBAAL,MAAAA,EAAuB,2BAC1D,CAAC,EACD,KAAK,YAAY,KAAK,cAAc,eAAe,KAAKib,GAAK,CAAC,EAAGzE,EAAO,OAAO,CAAC,EAAG,IAAM,OACxFi6B,GAAU,MAAM,2DAA2D,GAC3E1wC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,0BACxB,CAAC,EACD,KAAK,cAAc,MAAK,EACxB0wC,GAAU,MAAM,oDAAqD,KAAK,EAAE,CAC7E,OAAS5sC,EAAO,CACf4sC,GAAU,KAAK,qDAAsD5sC,CAAK,CAC3E,CACD,CAUA,MAAM,gCAAiC,CACtC,MAAMwxB,EAAK,KAAK,kBAChB,GAAI,CAACA,EAAI,MAAO,GAChB,MAAMuc,EAAW,KAAK,IAAG,EAAKjwB,GAC9B,OAAS,CACR,MAAMzV,EAAQmpB,EAAG,gBACjB,GAAInpB,IAAU,YAAa,MAAO,GAElC,GADIA,IAAU,UAAYA,IAAU,UAChC,KAAK,OAAS0lC,EAAU,MAAO,GACnC,MAAM,IAAI,QAAS5uC,GAAY,WAAWA,EAAS4e,EAAgC,CAAC,CACrF,CACD,CAKA,0BAA2B,SAC1B,GAAI,EACH7hB,EAAA,KAAK,gBAAL,MAAAA,EAAoB,WACpBC,EAAA,KAAK,mBAAL,MAAAA,EAAuB,SACxB,MAAQ,CAAC,CACT,KAAK,cAAgB,OACrB,KAAK,iBAAmB,MACzB,CAEA,kBAAkB2lC,EAAU0D,EAAQ,CACnC,OAAI1D,KAAc0D,GAAU,KAAK,aAAa,QAAgB,KAAK,mBAAmB,sBAAsB1D,CAAQ,EAC7G,KAAK,mBAAmB,kBAAkBA,CAAQ,CAC1D,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,cAAc,KAAK,aAAa,gBAAgB,EAAE,KAAKlqB,EAAU,KAAK,WAAW,CAAC,CAC/F,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,aAAa,eAC1B,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,cAAc,KAAK5I,EAAK6rB,GAAiBA,EAAa,IAAKvC,GAAgBA,EAAY,EAAE,CAAC,CAAC,CAAC,CACxJ,CAWA,MAAM,QAAQ/xB,EAASsP,EAAS,CAC/B,OAAO,KAAK,cAAc,QAAQtP,EAASsP,CAAO,CACnD,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,aAAa,OAC1B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,aAAa,MAC1B,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,aAAa,OAC1B,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,aAAa,MAC1B,CACA,mBAAmByO,EAAO,CACzB,GAAI,CACHsoB,GAAU,MAAM,qDAAsDtoB,CAAK,EAC3E,MAAMoR,EAAS5R,GAAaQ,EAAO,sBAAsB,GAAKR,GAAaQ,EAAO,gBAAgB,EAC5FkW,EAAgB1W,GAAaQ,EAAO,wBAAwB,EAClE,OAAAsoB,GAAU,MAAM,gDAAgDlX,CAAM,uBAAuB8E,CAAa,cAAc,EACjH9E,IAAW,KAAK,IAAM,CAAC,CAACA,GAAU,KAAK,kBAAkB,cAAcA,CAAM,GAAK,CAAC,CAAC8E,GAAiB,KAAK,kBAAkB,qBAAqBA,CAAa,CACtK,OAASx6B,EAAO,CACf,OAAA4sC,GAAU,MAAM,2DAA4D5sC,CAAK,EAC1E,EACR,CACD,CACA,IAAI,oBAAqB,CACxB,OAAO,KAAK,iBAAiB,qBAAsB,IAAM,KAAK,cAAc,gBAAgB,KAAK2S,EAAQ2R,GAAU,KAAK,mBAAmBA,CAAK,CAAC,EAAGxM,GAAKwM,GAAU,CAClKsoB,GAAU,MAAM,sCAAuCtoB,CAAK,CAC7D,CAAC,EAAG1M,EAAU,KAAK,UAAU,EAAGhC,GAAK,CAAE,CAAC,CACzC,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,uBAAuB,eAAgB,IAAM,KAAK,mBAAmB,KAAKwO,GAAS+U,GAAuB,QAAQ,EAAGvhB,EAAU,KAAK,UAAU,CAAC,CAAC,CAC7J,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,uBAAuB,gBAAiB,IAAM,KAAK,mBAAmB,KAAKwM,GAASqV,GAAwB,QAAQ,EAAG7hB,EAAU,KAAK,UAAU,CAAC,CAAC,CAC/J,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,uBAAuB,cAAe,IAAM,KAAK,mBAAmB,KAAKwM,GAASsV,GAAsB,QAAQ,EAAG9hB,EAAU,KAAK,UAAU,CAAC,CAAC,CAC3J,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,uBAAuB,iBAAkB,IAAM,KAAK,mBAAmB,KAAKwM,GAASoV,GAAyB,QAAQ,EAAG5hB,EAAU,KAAK,UAAU,CAAC,CAAC,CACjK,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,uBAAuB,iBAAkB,IAAM,KAAK,mBAAmB,KAAKwM,GAASuV,GAAyB,QAAQ,EAAG/hB,EAAU,KAAK,UAAU,CAAC,CAAC,CACjK,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,uBAAuB,cAAe,IAAM,KAAK,mBAAmB,KAAKwM,GAASgV,GAAqB,QAAQ,EAAGxhB,EAAU,KAAK,UAAU,CAAC,CAAC,CAC1J,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,uBAAuB,iBAAkB,IAAM,KAAK,mBAAmB,KAAKwM,GAASwV,GAAyB,QAAQ,EAAGhiB,EAAU,KAAK,UAAU,CAAC,CAAC,CACjK,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,aAAa,mBAAmB,cAC7C,CAEA,IAAI,iBAAkB,CACrB,OAAO,KAAK,uBAAuB,kBAAmB,IAAM,KAAK,WAAW,KAAK5I,EAAKsV,GAAU,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CAAC,CAAC,CAAC,CACpI,CAwBA,UAAUuU,EAAW,CACpB,MAAM/S,EAAS,KAAK,qBAAqB,IAAI+S,CAAS,EACtD,GAAI/S,EAAQ,OAAOA,EACnB,MAAMkoB,EAAY,KAAK,mBAAmB,KAAKr7B,EAAQ2R,GAAUA,EAAM,aAAeuU,CAAS,EAAG7pB,EAAKsV,GAAU,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,CAAC,EAAG1M,EAAU,KAAK,WAAW,CAAC,EAChL,YAAK,oBAAoBihB,CAAS,EAAE,KAAK,IAAM,CAC9C,KAAK,qBAAqB,IAAIA,EAAWmV,CAAS,CACnD,EAAIhuC,GAAU,CACb,KAAK,qBAAqB,OAAO64B,CAAS,EAC1C+T,GAAU,KAAK,+BAA+B/T,CAAS,yBAA0B74B,CAAK,CACvF,CAAC,EACD,KAAK,qBAAqB,IAAI64B,EAAWmV,CAAS,EAC3CA,CACR,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,mBAAmB,KAAK5pB,GAASyV,GAAyB,QAAQ,EAAG/hB,GAAKwM,GAAUsoB,GAAU,MAAM,0CAA2CtoB,CAAK,CAAC,EAAG1M,EAAU,KAAK,UAAU,EAAGhC,GAAK,CAAE,CAAC,CACxP,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,iBAAiB,aAAc,IAAM,KAAK,mBAAmB,KAAKwO,GAAS4U,GAA0B,QAAQ,EAAGlhB,GAAKwM,GAAUsoB,GAAU,MAAM,gCAAiCtoB,CAAK,CAAC,EAAG1M,EAAU,KAAK,UAAU,EAAGhC,GAAK,CAAE,CAAC,CAC1O,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,WAAW,KAAKwO,GAASwV,GAAyB,QAAQ,CAAC,CAAC,CACrH,CAYA,MAAM,QAAS,CACd,KAAK,SAAS,KAAK,eAAe,EAClC,GAAI,CACH,MAAM,KAAK,aAAa,IAAG,CAC5B,QAAC,CACA,KAAK,QAAO,CACb,CACD,CAWA,MAAM,WAAWwN,EAAM,CACtB,OAAO,KAAK,aAAa,WAAWA,CAAI,CACzC,CAoBA,OAAOvxB,EAAS,CACf,KAAK,oBAAsBA,EAC3B,KAAK,WAAW,KAAK,EAAI,CAC1B,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,mBACb,CAOA,QAAS,CACR,KAAK,WAAW,KAAK,EAAK,CAC3B,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,cAAc,KAAK,WAAW,aAAY,CAAE,CACzD,CA0BA,MAAM,UAAUo4B,EAAQC,EAAW,CAClC,GAAI,CAAC,KAAK,QAAQ,SAASD,CAAM,EAAG,MAAM,IAAIjtB,GAAc,UAAUitB,CAAM,kDAAkD,KAAK,QAAQ,KAAK,IAAI,CAAC,EAAE,EACvJ,MAAMzI,EAAS,MAAMx3B,GAAe,KAAK,QAAQ,KAAK2E,EAAQlK,GAAOA,IAAO,IAAI,CAAC,CAAC,EAClF,MAAM,KAAK,cAAc+8B,EAAQ,kBAAmB,CAAE,OAAAyI,CAAM,CAAE,EAC9D,MAAME,EAAkB,OAAO,QAAQD,GAAa,CAAA,CAAE,EACtD,GAAIC,EAAgB,SAAW,EAC/B,SAAW,CAACrM,EAAUsM,CAAQ,IAAKD,EAAiB,CACnD,MAAM7V,EAAc,KAAK,aAAa,KAAMz8B,GAAMA,EAAE,KAAOimC,CAAQ,EACnE,GAAI,CAACxJ,EAAa,CACjBsU,GAAU,KAAK,4BAA4B9K,CAAQ,iDAAiDsM,CAAQ,EAAE,EAC9G,QACD,CACA,MAAM9V,EAAY,YAAY8V,CAAQ,CACvC,CACD,CAOA,MAAM,SAASv4B,EAAS,CACvB,OAAO,KAAK,aAAa,SAASA,CAAO,CAC1C,CAmBA,uBAAuB3W,EAAO,CAC7B,MAAMmvC,EAAW,KAAK,aAAa,yBAAwB,EAC3D,GAAI,CAACA,EAAU,CACdzB,GAAU,KAAK,2DAA2D,EAC1E,MACD,CACA,MAAM0B,EAAU,KAAK,IAAI,EAAG,KAAK,IAAI,IAAKpvC,CAAK,CAAC,EAChDmvC,EAAS,QAAQC,EAAU,GAAG,CAC/B,CAEA,IAAI,sBAAuB,CAC1B,MAAMD,EAAW,KAAK,aAAa,yBAAwB,EAC3D,OAAKA,EACE,KAAK,uBAAuB,uBAAwB,IAAMA,EAAS,MAAM,KAAKr/B,EAAKu/B,GAAeA,EAAa,GAAG,EAAG32B,EAAU,KAAK,WAAW,CAAC,CAAC,EADlInK,GAAG,GAAG,EAAE,KAAKmK,EAAU,KAAK,WAAW,CAAC,CAE/D,CAMA,IAAI,kBAAmB,CACtB,MAAMy2B,EAAW,KAAK,aAAa,yBAAwB,EAC3D,OAAKA,EACE,KAAK,uBAAuB,mBAAoB,IAAMA,EAAS,OAAO,KAAKz2B,EAAU,KAAK,WAAW,EAAGhC,GAAK,CAAE,CAAC,EADjGnI,GAAG,CAAC,EAAE,KAAKmK,EAAU,KAAK,WAAW,CAAC,CAE7D,CAKA,IAAI,gBAAiB,CACpB,MAAMy2B,EAAW,KAAK,aAAa,yBAAwB,EAC3D,OAAKA,EACE,KAAK,uBAAuB,iBAAkB,IAAMA,EAAS,UAAU,KAAKz2B,EAAU,KAAK,WAAW,EAAGhC,GAAK,CAAE,CAAC,EADlGnI,GAAG,EAAK,EAAE,KAAKmK,EAAU,KAAK,WAAW,CAAC,CAEjE,CAYA,kBAAmB,CAClB,MAAMy2B,EAAW,KAAK,aAAa,yBAAwB,EAC3D,GAAI,CAACA,EAAU,CACdzB,GAAU,KAAK,qDAAqD,EACpE,MACD,CACAyB,EAAS,aAAa,EAAK,EAC3B,KAAK,mBAAqB,EAC3B,CAEA,mBAAoB,QACnBnyC,EAAA,KAAK,aAAa,qBAAlB,MAAAA,EAAsC,aAAa,IACnD,KAAK,mBAAqB,EAC3B,CAKA,oBAAoBoU,EAAQ,OACtB,KAAK,sBACVpU,EAAA,KAAK,aAAa,qBAAlB,MAAAA,EAAsC,aAAaoU,GACpD,CAQA,MAAM,oBAAoBk+B,EAAS,CAClC,MAAM,KAAK,aAAa,uBAAuB,CAAE,MAAO,CAAE,iBAAkBA,CAAO,EAAI,CACxF,CAEA,MAAM,oBAAoBA,EAAS,CAClC,MAAM,KAAK,aAAa,uBAAuB,CAAE,MAAO,CAAE,iBAAkBA,CAAO,EAAI,CACxF,CAEA,MAAM,mBAAmBA,EAAS,CACjC,MAAM,KAAK,aAAa,uBAAuB,CAAE,MAAO,CAAE,gBAAiBA,CAAO,EAAI,CACvF,CAUA,IAAI,mBAAoB,CACvB,OAAO,KAAK,uBAAuB,oBAAqB,IAAM,CAC7D,KAAK,oBAAL,KAAK,kBAAsB,IAAIjH,IAC/B,MAAMkH,EAAQ,KAAK,kBACnB,YAAK,YAAY,KAAK,aAAa,cAAgBjwC,GAAW,CAC7DiwC,EAAM,UAAUjwC,CAAM,CACvB,CAAC,EACMiwC,EAAM,OAAO,KAAK72B,EAAU,KAAK,WAAW,EAAGhC,IAAO,CAC9D,CAAC,CACF,CAEA,SAAU,OACL,KAAK,SAAS,QAAU,cAC5B,KAAK,SAAS,KAAK,WAAW,EAC9B,KAAK,yBAAwB,GAC7B1Z,EAAA,KAAK,oBAAL,MAAAA,EAAwB,UACxB,KAAK,kBAAoB,KACzB,KAAK,aAAa,QAAO,EACzB,KAAK,kBAAkB,QAAO,EAC9B,MAAM,QAAO,EACd,CAOA,MAAM,oBAAoB28B,EAAW,CACpC,MAAMpZ,EAAUmV,GAAe,CAC9B,OAAQ,KAAK,GACb,aAAc,CAACiE,CAAS,CAC3B,CAAG,EACKpK,EAAS,CACd,OAAQ,KAAK,GACb,QAAS,KAAK,aAAa,QAAU,GACrC,QAAAhP,CACH,EACE,MAAM,KAAK,cAAc,QAAQ6U,GAAY7F,CAAM,CAAC,CACrD,CACD,EAQA,SAASigB,GAAmB1uC,EAAO,CAClC,OAAIA,aAAiB8f,GAAwB,UACzC9f,aAAiB6gB,GAAqB,YACtC7gB,aAAiByhB,IACjBzhB,aAAiB4hB,GAAyB,QAC1C5hB,aAAiBwf,IAA4Bxf,aAAiB0f,GAAiC,UAC5F,UACR,CAKA,MAAMivB,GAAwB,IAAI,IAAI,CACrCpyB,GACAE,GACAD,EACD,CAAC,EAED,SAASoyB,GAAa5uC,EAAO,CAE5B,OADIA,aAAiBqhB,IACjBrhB,aAAiByhB,GAAwB,GACzCzhB,aAAiB4hB,GAAyB5hB,EAAM,MAChD,EAAAA,aAAiB8f,IACjB9f,aAAiB6gB,IAAgB8tB,GAAsB,IAAI3uC,EAAM,IAAI,EAE1E,CAKA,IAAI6uC,GAAc,KAAM,CACvB,YAAYC,EAAgBte,EAAkBwU,EAAeva,EAAmB6iB,EAAgB,CAC/F,KAAK,eAAiBwB,EACtB,KAAK,iBAAmBte,EACxB,KAAK,cAAgBwU,EACrB,KAAK,kBAAoBva,EACzB,KAAK,eAAiB6iB,CACvB,CAIA,WAAWH,EAASt3B,EAAS,CAC5B,OAAO,IAAIm3B,GAAW,KAAK,eAAgBn3B,EAAS,CACnD,mBAAqBk5B,IACb,CACN,aAAc,IAAIhK,GAAmBgK,EAAc,KAAK,cAAe,KAAK,iBAAkB,KAAK,kBAAmB,CACrH,OAAQl5B,EAAQ,OAChB,QAAS,CAAC7V,EAAO2hC,IAAc,CAC9B,MAAM4L,EAAY,CACjB,KAAMmB,GAAmB1uC,CAAK,EAC9B,OAAO2hC,GAAA,YAAAA,EAAW,QAASiN,GAAa5uC,CAAK,EAC7C,MAAAA,EACA,OAAQ+uC,EAAa,EAC7B,EACOA,EAAa,UAAUxB,CAAS,CACjC,EACA,eAAgB,IAAM,CACrBwB,EAAa,mBAAkB,CAChC,CACN,CAAM,EACD,kBAAmB,IAAI1U,GAAkB0U,CAAY,CAC1D,GAEG,iBAAkB,KAAK,iBACvB,eAAgB,KAAK,cACxB,EAAK5B,CAAO,CACX,CACD,EAIA,MAAM6B,GAAYvrB,EAAS,EAC3B,IAAIwrB,GAAU,KAAM,CACnB,YAAYC,EAAUzgB,EAAQ2E,EAAM,CACnC,KAAK,SAAW8b,EAChB,KAAK,KAAO9b,EACZ,KAAK,OAAU+b,GAAU,GACzB,KAAK,OAAU3tC,GAASA,EACxB,KAAK,QAAU,GAAG,KAAK,QAAQ,IAAIitB,CAAM,EAC1C,CACA,MAAM,MAAO,CACZ,GAAI,CAAC,KAAK,QACT,YAAK,QAAU,GACR,CAAA,EAER,MAAMjK,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,GAAG2C,GACH,IAAK,KAAK,OACb,CAAG,EACD,GAAI3C,EAAS,IAAQA,EAAS,KAAM,CACnC,MAAMhlB,EAAS,KAAK,MAAMglB,EAAS,IAAI,EACvC,YAAK,QAAUhlB,EAAO,MAAM,KAC5B,KAAK,QAAU,CAAC,CAAC,KAAK,QACfA,EAAO,KAAK,OAAO,KAAK,MAAM,EAAE,IAAI,KAAK,MAAM,CACvD,CACA,OAAAwvC,GAAU,MAAM,wBAAwB,EACjC,CAAA,CACR,CACA,MAAM,GAAG3yC,EAAG,CACX,MAAMmoB,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,GAAG2C,GACH,IAAK,GAAG,KAAK,QAAQ,IAAI,OAAO9qB,CAAC,CAAC,EACrC,CAAG,EACD,GAAImoB,EAAS,IAAQA,EAAS,KAAM,OAAO,KAAK,MAAMA,EAAS,IAAI,CACpE,CACD,EACI4qB,GAAmB,cAAcxpB,EAAY,CAChD,YAAYypB,EAAiBC,EAAStpC,EAAS,CAC9C,MAAK,EACL,KAAK,gBAAkBqpC,EACvB,KAAK,QAAUC,EACf,KAAK,QAAUtpC,EACf,KAAK,eAAiC,IAAI,IAC1C,KAAK,oBAAsC,IAAI,IAC/C,KAAK,WAAc+a,GAAS,OAC3B,GAAI,CAACA,EAAK,GAAI,OACd,MAAMwuB,EAAW,KAAK,eAAe,IAAIxuB,EAAK,EAAE,GAAK,CAAA,EAC/CwU,EAAU,CAAA,EACVia,EAAU,IAAI,IAAI,CAAC,GAAG,OAAO,KAAKD,CAAQ,EAAG,GAAG,OAAO,KAAKxuB,CAAI,CAAC,CAAC,EACxE,UAAWnR,KAAO4/B,EAAS,CAC1B,MAAMC,EAAcF,EAAS3/B,CAAG,EAC1B8/B,EAAS3uB,EAAKnR,CAAG,EACnB8/B,IAAW,QAAUD,IAAgB,QAAU,OAAOA,GAAgB,UAAYA,IAAgB,MAAQ,CAAC,MAAM,QAAQA,CAAW,GAAK,OAAOC,GAAW,UAAYA,IAAW,MAAQ,CAAC,MAAM,QAAQA,CAAM,EAAGna,EAAQ3lB,CAAG,EAAI,CACpO,GAAG6/B,EACH,GAAGC,CACR,EACaA,IAAW,OAAQna,EAAQ3lB,CAAG,EAAI8/B,EACtCna,EAAQ3lB,CAAG,EAAI6/B,CACrB,CACA,KAAK,eAAe,IAAI1uB,EAAK,GAAIwU,CAAO,GACxCr5B,EAAA,KAAK,oBAAoB,IAAI6kB,EAAK,EAAE,IAApC,MAAA7kB,EAAuC,KAAKq5B,GAC5C,KAAK,SAAS,KAAK,MAAM,KAAK,KAAK,eAAe,OAAM,CAAE,CAAC,CAC5D,EACA,KAAK,UAAY,KAAK,sBAAsB,EAAK,EACjD,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,UAAY,KAAK,sBAAsB,EAAI,EAChD,KAAK,YAAY,KAAK,QAAS,KAAK,UAAU,EAC9C,KAAK,SAAWzjB,GAAM,IAAM3R,GAAK,KAAK,KAAI,CAAE,CAAC,EAAE,KAAKqX,GAAU,IAAM,KAAK,SAAS,EAAGxC,EAAoB,EAAIgC,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,CACxJ,CACA,IAAI,UAAW,CACd,OAAO,KAAK,UAAU,aAAY,CACnC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,UAAU,KACvB,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,gBAAgB,SAAW,EACxC,CACA,IAAI,UAAW,CACd,OAAO,KAAK,iBAAiB,WAAY,IAAM,KAAK,UAAU,KAAK5C,EAAoB,EAAIoC,GAAK,CAAC,EAAGzE,EAAQg9B,GAAY,CAACA,CAAO,EAAG3gC,EAAI,IAAA,EAAY,EAAG4I,EAAU,KAAK,UAAU,CAAC,CAAC,CAClL,CACA,IAAI,QAAS,CACZ,OAAO,MAAM,KAAK,KAAK,eAAe,OAAM,CAAE,CAC/C,CACA,MAAM,MAAO,CACZ,GAAI,KAAK,gBAAgB,UAAY,GAAO,CAC3C,KAAK,UAAU,KAAK,EAAK,EACzB,MACD,CACA,MAAM,KAAK,UAAS,CACrB,CACA,MAAM,WAAY,OACjB,GAAI,CACH,KAAK,UAAU,KAAK,EAAI,GACvB,MAAM,KAAK,gBAAgB,KAAI,GAAI,QAAQ,KAAK,UAAU,EAC3D,KAAK,UAAU,KAAK,KAAK,gBAAgB,SAAW,EAAK,EACzD,KAAK,UAAU,KAAK,EAAK,CAC1B,OAAS5X,EAAO,CACfgvC,GAAU,MAAM,0CAA2ChvC,CAAK,EAChE,KAAK,UAAU,KAAK,KAAK,gBAAgB,SAAW,EAAK,EACzD,KAAK,UAAU,KAAK,EAAK,GACzB9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe,IAAIqlB,GAAqB,YAAavhB,CAAK,EAC3D,CACD,CACA,MAAM,SAAS4P,EAAK1Q,EAAO,WAC1B,GAAI,CACH,KAAK,UAAU,KAAK,EAAI,EACxB,MAAM6hB,EAAO,OAAM5kB,GAAAD,EAAA,KAAK,iBAAgB0T,KAArB,YAAAzT,EAAA,KAAAD,EAA4BgD,IAC/C,YAAK,UAAU,KAAK,EAAK,EACrB6hB,GAAM,KAAK,WAAWA,CAAI,EACvBA,CACR,OAAS/gB,EAAO,CACfgvC,GAAU,MAAM,6BAA6B,OAAOp/B,CAAG,CAAC,IAAI,OAAO1Q,CAAK,CAAC,MAAOc,CAAK,EACrF,KAAK,UAAU,KAAK,EAAK,GACzB8G,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe,IAAIya,GAAqB,YAAY,OAAO3R,CAAG,CAAC,IAAK5P,CAAK,EAC1E,CACD,CACA,KAAKyI,EAAI,SACR,GAAI,CAAC,KAAK,oBAAoB,IAAIA,CAAE,EAAG,CACtC,KAAK,oBAAoB,IAAIA,EAAI,IAAIjB,GAAc,CAAC,CAAC,EACrD,MAAMuZ,EAAO,KAAK,eAAe,IAAItY,CAAE,EACnCsY,GAAM7kB,EAAA,KAAK,oBAAoB,IAAIuM,CAAE,IAA/B,MAAAvM,EAAkC,KAAK6kB,GAC5C,KAAK,SAAS,KAAMtY,CAAE,CAC5B,CACA,OAAOtM,EAAA,KAAK,oBAAoB,IAAIsM,CAAE,IAA/B,YAAAtM,EAAkC,cAC1C,CACA,MAAM,MAAMyT,EAAK1Q,EAAO,CACvB,MAAM6hB,EAAO,MAAM,KAAK,KAAK,eAAe,OAAM,CAAE,EAAE,KAAMvf,GAASA,EAAKoO,CAAG,IAAM1Q,CAAK,GAAK,MAAM,KAAK,SAAS0Q,EAAK1Q,CAAK,EAC3H,OAAO6hB,EAAO,KAAK,KAAKA,EAAK,EAAE,EAAI,MACpC,CACA,UAAW,CACN,KAAK,gBAAgB,UAAY,IAAO,KAAK,UAAS,CAC3D,CACA,SAAU,CACT,KAAK,oBAAoB,QAASna,GAAYA,EAAQ,UAAU,EAChE,KAAK,oBAAoB,MAAK,EAC9B,MAAM,QAAO,CACd,CACD,EACIgpC,GAA8B,KAAM,CACvC,YAAYC,EAAoBC,EAAYv0C,GAAM,CAAC,CAACA,EAAGw0C,EAAUvuC,GAASA,EAAM,CAC/E,KAAK,mBAAqBquC,EAC1B,KAAK,OAASC,EACd,KAAK,OAASC,CACf,CACA,IAAI,UAAW,CACd,OAAO,KAAK,mBAAmB,QAChC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,mBAAmB,OAChC,CACA,IAAI,UAAW,CACd,OAAO,KAAK,mBAAmB,QAChC,CACA,IAAI,SAAU,CACb,OAAO,KAAK,mBAAmB,OAChC,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,mBAAmB,OAAO,OAAO,KAAK,MAAM,EAAE,IAAI,KAAK,MAAM,CAC1E,CACA,IAAI,SAAU,CACb,OAAO,KAAK,WAAL,KAAK,SAAa,KAAK,mBAAmB,QAAQ,KAAK/gC,EAAKc,GAAWA,EAAO,OAAO,KAAK,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,EAC3H,CACA,KAAKrH,EAAI,CACR,MAAMunC,EAAY,KAAK,mBAAmB,KAAKvnC,CAAE,EACjD,OAAQunC,GAAwBA,EAAU,KAAKzrC,GAAKoO,EAAO,KAAK,MAAM,EAAG3D,EAAI,KAAK,MAAM,CAAC,CAAC,CAC3F,CACA,MAAM,MAAMY,EAAK1Q,EAAO,CACvB,MAAM8wC,EAAY,MAAM,KAAK,mBAAmB,MAAMpgC,EAAK1Q,CAAK,EAChE,OAAQ8wC,GAAwBA,EAAU,KAAKzrC,GAAKoO,EAAO,KAAK,MAAM,EAAG3D,EAAI,KAAK,MAAM,CAAC,CAAC,CAC3F,CACA,UAAW,CACV,KAAK,mBAAmB,SAAQ,CACjC,CACA,SAAU,CACT,KAAK,mBAAmB,QAAO,CAChC,CACD,EAUIihC,GAAU,cAAcrqB,EAAY,CACvC,YAAYsqB,EAAWpjB,EAAqBqjB,EAAiB,CAC5D,MAAK,EACL,KAAK,UAAYD,EACjB,KAAK,oBAAsBpjB,EAC3B,KAAK,gBAAkBqjB,EACvB,KAAK,yBAA2B,UAC/B,KAAK,sBAAwB,KAAK,uBAAyB,MAAM,KAAK,oBAAoB,iCAAiC,KAAK,EAAE,EAC9H,KAAK,sBAAsB,SAAS,KAAK,sBAAsB,SAAQ,EACpE,KAAK,uBAEb,KAAK,cAAgBr+B,GAAM,KAAK,wBAAwB,EAAE,KAAK9C,EAAI,IAAM,KAAK,WAAW,EAAGgI,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,EACtI,KAAK,SAAW9F,GAAM,KAAK,wBAAwB,EAAE,KAAK9C,EAAI,IAAM,KAAK,OAAO,EAAGgI,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,EAC7H,KAAK,QAAU,KAAK,sBAAsB,IAAI,CAC/C,CAEA,OAAOvP,EAAO,CACb,MAAM+nC,EAAS,CACd,GAAG,KAAK,QAAQ,MAChB,GAAG/nC,CACN,EACE,KAAK,QAAQ,KAAK+nC,CAAM,CACzB,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,QAAQ,KACrB,CAEA,IAAI,IAAK,CACR,OAAO,KAAK,SACb,CAEA,IAAI,MAAO,CACV,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI3vB,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,WAAY,CACf,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAIA,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,UAC3B,CAEA,IAAI,gBAAiB,CACpB,OAAO,KAAK,OAAS,OAAS,KAAK,SAAS,MAAQ,KAAK,SAAS,KACnE,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7U,EAAK3G,GAAUA,EAAM,YAAY,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CACnJ,CAEA,IAAI,aAAc,CACjB,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,YAC3B,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7U,EAAK3G,GAAUA,EAAM,WAAW,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CACjJ,CAEA,IAAI,YAAa,CAChB,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,WAC3B,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,iBAAiB,YAAa,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7M,GAAY,CAAC,EAAGhI,EAAK3G,GAAUA,EAAM,SAAS,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CAC7J,CAEA,IAAI,UAAW,CACd,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,SAC3B,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,iBAAiB,cAAe,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7M,GAAY,CAAC,EAAGhI,EAAK3G,GAAUA,EAAM,WAAW,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CACjK,CAEA,IAAI,YAAa,CAChB,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,WAC3B,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,iBAAiB,QAAS,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7M,GAAY,CAAC,EAAGhI,EAAK3G,GAAUA,EAAM,IAAI,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CACpJ,CAEA,IAAI,MAAO,CACV,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,IAC3B,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,iBAAiB,YAAa,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7M,GAAY,CAAC,EAAGhI,EAAK3G,GAAUA,EAAM,QAAQ,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CAC5J,CAEA,IAAI,UAAW,CACd,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAI6I,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,QAC3B,CAEA,IAAI,QAAS,CACZ,GAAI,CAAC,KAAK,QAAQ,MAAO,MAAM,IAAIA,GAAgB,uBAAuB,EAC1E,OAAO,KAAK,QAAQ,MAAM,MAC3B,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,iBAAiB,UAAW,IAAM,KAAK,QAAQ,KAAKoD,GAAU,EAAI7M,GAAY,CAAC,EAAGhI,EAAK3G,GAAUA,EAAM,MAAM,EAAGuP,EAAU,KAAK,UAAU,CAAC,CAAC,CACxJ,CAWA,MAAM,SAASy4B,EAAM,CACpB,OAAO,KAAK,oBAAoB,SAASA,EAAM,KAAK,EAAE,CACvD,CAUA,IAAI,aAAc,CACjB,GAAK,KAAK,sBACV,YAAK,eAAiB,KAAK,gBAAkB,IAAIT,GAA4B,KAAK,sBAAwBpuC,GAASA,EAAK,UAAY,OAASA,IAAU,CACtJ,GAAIA,EAAK,GACT,KAAMA,EAAK,KACX,QAASA,EAAK,GACd,aAAc,KAAK,gBAAgB,KAAKA,EAAK,sBAAsB,CACtE,EAAI,EACK,KAAK,cACb,CASA,IAAI,SAAU,CACb,GAAK,KAAK,sBACV,YAAK,UAAY,KAAK,WAAa,IAAIouC,GAA4B,KAAK,sBAAwBpuC,GAASA,EAAK,UAAY,MAAQA,IAAU,CAC3I,GAAIA,EAAK,GACT,KAAMA,EAAK,KACX,OAAQA,EAAK,QAAQ,OACrB,QAASA,EAAK,QAAQ,WACtB,MAAOA,EAAK,QAAQ,SACpB,aAAc,KAAK,gBAAgB,KAAKA,EAAK,sBAAsB,CACtE,EAAI,EACK,KAAK,SACb,CAEA,IAAI,WAAY,CACf,MAAM,IAAI6d,EACX,CAEA,IAAI,UAAW,CACd,MAAM,IAAIA,EACX,CACD,EAIA,MAAMixB,GAAY7sB,EAAS,EACrB8sB,GAAsBt1C,GAAM,CAEjC,GADAq1C,GAAU,MAAM,4BAA6Br1C,CAAC,EAC1C,CAACA,GAAK,OAAOA,GAAM,SAAU,MAAO,GACxC,MAAMuE,EAASvE,EACTu8B,EAAK,OAAOh4B,EAAO,UAAa,UAAY,OAAOA,EAAO,UAAa,UAAY,OAAOA,EAAO,eAAkB,UAAY,OAAOA,EAAO,cAAc,KAAQ,UAAY,OAAOA,EAAO,cAAc,YAAe,UAAY,OAAOA,EAAO,cAAc,mBAAsB,SAC9R,OAAA8wC,GAAU,MAAM,mCAAoC9Y,CAAE,EAC/CA,CACR,EACA,IAAIgZ,IAAa1pC,GAAA,KAAiB,CAIjC,YAAYP,EAASkqC,EAAY56B,EAAS,CACzC,KAAK,GAAK2P,GAAE,EACZ8qB,GAAU,MAAM,eAAe,KAAK,EAAE,aAAa/pC,EAAQ,EAAE,YAAYA,EAAQ,MAAM,uBAAuB,EAC9G,KAAK,QAAUA,EACf,MAAMyZ,GAAYnK,GAAA,YAAAA,EAAS,YAAa/O,GAAW,iBAC7C4pC,EAAS76B,GAAA,YAAAA,EAAS,OACxB,KAAK,QAAU,IAAI,QAAQ,CAAC1W,EAASC,IAAW,CAC/C,GAAIsxC,GAAA,MAAAA,EAAQ,QAAS,CACpBtxC,EAAO,IAAI,aAAa,4BAA6B,YAAY,CAAC,EAClE,MACD,CACA,IAAIuxC,EAAY,GAChB,MAAMrpC,EAAeuL,GAAK49B,EAAW,KAAK99B,EAAQnT,GAAWA,EAAO,KAAO+G,EAAQ,EAAE,EAAGuO,GAAK,CAAC,CAAC,EAAG,IAAIjQ,GAAYG,GAAe,CAChI,MAAM6sB,EAAU,WAAW,IAAM,CAChC7sB,EAAW,MAAM,IAAI8a,GAAgBvZ,EAAQ,GAAIyZ,CAAS,CAAC,CAC5D,EAAGA,CAAS,EACZ,MAAO,IAAM,aAAa6R,CAAO,CAClC,CAAC,EAAG6e,EAAS,IAAI7rC,GAAYG,GAAe,CAC3C,MAAM4rC,EAAe,IAAM,CAC1B5rC,EAAW,MAAM,IAAI,aAAa,4BAA6B,YAAY,CAAC,CAC7E,EACA,OAAA0rC,EAAO,iBAAiB,QAASE,CAAY,EACtC,IAAMF,EAAO,oBAAoB,QAASE,CAAY,CAC9D,CAAC,EAAIn+B,EAAK,EAAE,UAAU,CACrB,KAAO+R,GAAa,CAEnB,GADAmsB,EAAY,GACRnsB,EAAS,MAAO,CACnB,MAAMqsB,EAAW,IAAIhwB,GAAa2D,EAAS,MAAM,KAAMA,EAAS,MAAM,QAASA,EAAS,MAAM,KAAM,OAAQje,EAAQ,EAAE,EACtH+pC,GAAU,MAAM,eAAe,KAAK,EAAE,aAAa/pC,EAAQ,EAAE,sCAAuCsqC,CAAQ,EAC5GzxC,EAAOyxC,CAAQ,CAChB,MACCP,GAAU,MAAM,eAAe,KAAK,EAAE,aAAa/pC,EAAQ,EAAE,qCAAsCie,CAAQ,EAC3GrlB,EAAQqlB,CAAQ,EAEjBld,EAAa,YAAW,CACzB,EACA,MAAQtH,GAAU,CACjBswC,GAAU,MAAM,eAAe,KAAK,EAAE,aAAa/pC,EAAQ,EAAE,kCAAmCvG,CAAK,EACrG2wC,EAAY,GACZvxC,EAAOY,CAAK,EACZsH,EAAa,YAAW,CACzB,EACA,SAAU,IAAM,CACfgpC,GAAU,MAAM,eAAe,KAAK,EAAE,aAAa/pC,EAAQ,EAAE,wBAAwB,EAChFoqC,GAAWvxC,EAAO,IAAI0gB,GAAgBvZ,EAAQ,GAAIyZ,CAAS,CAAC,EACjE1Y,EAAa,YAAW,CACzB,CACJ,CAAI,CACF,CAAC,CACF,CACA,MAAM,KAAKwpC,EAAaC,EAAY,CACnC,OAAO,KAAK,QAAQ,KAAKD,EAAaC,CAAU,CACjD,CACA,MAAM,MAAMA,EAAY,CACvB,OAAO,KAAK,QAAQ,MAAMA,CAAU,CACrC,CACA,MAAM,QAAQC,EAAW,CACxB,OAAO,KAAK,QAAQ,QAAQA,CAAS,CACtC,CACD,EA7DElqC,GAAK,iBAAmB,IAFTA,IAmEjB,MAAMmqC,EAAWxtB,EAAS,EAS1B,SAASytB,GAAgB3D,EAAW,CACnC,OAAOA,EAAU,OAAS,EAAEA,EAAU,iBAAiB3rB,GACxD,CACA,MAAMuvB,GAAuBt7B,GAAY,SACxC,MAAM3V,GAAKhE,EAAA2Z,EAAQ,KAAR,YAAA3Z,EAAY,MAAM,KAAK,GAC5Bk1C,GAASj1C,EAAA0Z,EAAQ,OAAR,MAAA1Z,EAAc,WAAW,iBAAmB0Z,EAAQ,KAAK,QAAQ,gBAAiB,EAAE,EAAIA,EAAQ,KACzG8D,EAAOzZ,GAAMkxC,EACnB,GAAI,CAACz3B,EAAM,MAAM,IAAIwF,GAAgB,6BAA6B,EAClE,OAAOxF,CACR,EACA,IAAI03B,GAAuB,cAAczrB,EAAY,CACpD,YAAY2B,EAAe+pB,EAAWpnB,EAASqnB,EAAuB/gB,EAAkBwU,EAAeva,EAAmB+mB,EAAalE,EAAgB,CACtJ,MAAK,EACL,KAAK,cAAgB/lB,EACrB,KAAK,UAAY+pB,EACjB,KAAK,QAAUpnB,EACf,KAAK,sBAAwBqnB,EAC7B,KAAK,cAAgBvM,EACrB,KAAK,YAAcwM,EACnB,KAAK,kBAAoB,IACzB,KAAK,MAAQ,sBACb,KAAK,UAAY,GACjB,KAAK,oBAAsB,KAAK,oBAAoB,CAAC,EACrD,KAAK,eAAiB,CACrB,MAAO,EACP,MAAO,EACP,SAAU,CACb,EACE,KAAK,gBAAkB,KAAK,sBAAsB,MAAM,EACxD,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,YAAc,KAAK,sBAAsB,CAAE,KAAM,kBAAmB,EACzE,KAAK,gBAAkB,GACvB,KAAK,WAAa,KAAK,sBAAsB,IAAI,EACjD,KAAK,QAAU,KAAK,sBAAsB,CAAA,CAAE,EAC5C,KAAK,aAAe,KAAK,sBAAsB,CAAA,CAAE,EACjDxM,EAAc,WAAW,IAAI,EAC7B,KAAK,YAAc,IAAI6J,GAAY,KAAMre,EAAkBwU,EAAeva,EAAmB6iB,CAAc,EAC3G,KAAK,aAAex7B,GAAM,IAAM3R,GAAK,KAAK,KAAI,CAAE,CAAC,EAAE,KAAK6W,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,CACnG,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,iBAAiB,iBAAkB,IAAM,KAAK,OAAO,KAAK5I,EAAK7Q,GAAUA,EAAM,OAAQC,GAASA,EAAK,YAAc,SAAS,CAAC,CAAC,CAAC,CAC5I,CACA,IAAI,eAAgB,CACnB,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,EAAE,OAAQA,GAASA,EAAK,YAAc,SAAS,CACvF,CACA,IAAI,WAAY,CACf,OAAO,KAAK,WAAW,aAAY,CACpC,CACA,IAAI,UAAW,CACd,OAAO,KAAK,WAAW,KACxB,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,iBAAiB,SAAU,IAAM,KAAK,QAAQ,KAAK4Q,EAAK7Q,GAAU,OAAO,OAAOA,CAAK,CAAC,CAAC,CAAC,CACrG,CACA,IAAI,OAAQ,CACX,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,CACxC,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,aAAa,KAC1B,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,CACzC,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,gBAAgB,KAC7B,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,YAAY,KAAK6Q,EAAK3G,GAAUA,EAAM,OAAS,eAAe,EAAG2M,EAAoB,CAAE,CACpG,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,YAAY,MAAM,OAAS,eACxC,CAOA,IAAI,aAAc,CACjB,OAAO,KAAK,eACb,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,YAAY,KACzB,CAMA,aAAay8B,EAAW,CACvB,KAAK,WAAaA,CACnB,CACA,MAAM,QAAQlrC,EAASsP,EAAS,CAC/B,GAAI,CACH,OAAO,MAAM,KAAK,UAAU,QAAQtP,EAASsP,CAAO,CACrD,OAAS7V,EAAO,CACfixC,MAAAA,EAAS,MAAM,0BAA2BjxC,CAAK,EAC/C,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,EACxFA,CACP,CACD,CACA,KAAKyf,EAAS,CACb,KAAK,UAAU,KAAKA,CAAO,CAC5B,CACA,MAAM,MAAO,CACZ,aAAM,KAAK,kCAAiC,EAC5C,KAAK,qBAAoB,EAClB,EACR,CACA,sBAAuB,CACtBwxB,EAAS,MAAM,uCAAuC,EACtD,KAAK,YAAY,KAAK,gBAAiB,MAAOS,GAAmB,CAChET,EAAS,MAAM,gDAAiDS,CAAc,EAC9E,GAAI,CACH,MAAM,KAAK,kCAAkCA,EAAe,mBAAmB,CAChF,OAAS1xC,EAAO,CACfixC,EAAS,MAAM,yDAA0DjxC,CAAK,EAC9E,KAAK,SAAS,KAAK,IAAIigB,GAAsBjgB,CAAK,CAAC,CACpD,CACD,CAAC,EACD,KAAK,YAAY,KAAK,UAAU,kBAAkB,KAAK2S,EAAQ8vB,GAAWA,IAAW,gBAAkBA,IAAW,cAAc,CAAC,EAAG,IAAM,CACrI,KAAK,YAAY,MAAM,OAAS,iBAAiB,KAAK,YAAY,KAAK,CAAE,KAAM,iBAAiB,CAAE,CACvG,CAAC,EACD,KAAK,YAAY,KAAK,UAAU,kBAAkB,KAAK9vB,EAAQ8vB,GAAWA,IAAW,WAAW,EAAGjtB,GAAW,KAC7Gy7B,EAAS,MAAM,6DAA6D,EACrE9wC,GAAK,KAAK,aAAY,CAAE,EAAE,KAAKqT,GAAYxT,IACjD,KAAK,0BAA0BA,CAAK,EAAE,MAAOqB,GAAQ,CACpD4vC,EAAS,MAAM,mDAAoD5vC,CAAG,CACvE,CAAC,EACMiJ,GACP,CAAC,EACF,CAAC,EAAG,MAAM,EACX,KAAK,YAAY,KAAK,aAAc,MAAOqnC,GAAW,CACrDV,EAAS,MAAM,mCAAoCU,CAAM,EACzD,GAAI,CACH,MAAM,KAAK,kBAAkBA,CAAM,CACpC,OAAS3xC,EAAO,CACfixC,EAAS,MAAM,yCAA0CjxC,CAAK,EAC9D,KAAK,SAAS,KAAK,IAAIkhB,GAAwBlhB,CAAK,CAAC,CACtD,CACD,CAAC,EACD,KAAK,YAAY,KAAK,aAAc,MAAO2mC,GAAW,CACrDsK,EAAS,MAAM,mCAAoCtK,CAAM,EACzD,GAAI,CACH,MAAM,KAAK,kBAAkBA,CAAM,CACpC,OAAS3mC,EAAO,CACfixC,EAAS,MAAM,yCAA0CjxC,CAAK,EAC9D,KAAK,SAAS,KAAK,IAAImhB,GAAwBnhB,CAAK,CAAC,CACtD,CACD,CAAC,CACF,CACA,MAAM,mCAAoC,CACzC,GAAI,CACH,MAAM4xC,EAAc,MAAM,KAAK,QAAQ,QAAQ,KAAK,qBAAqB,EACzE,KAAK,oBAAoB,KAAKA,GAAe,MAAM,CACpD,OAAS5xC,EAAO,CACfixC,EAAS,MAAM,uDAAwDjxC,CAAK,EAC5E,KAAK,oBAAoB,KAAK,MAAM,CACrC,CACD,CACA,MAAM,kCAAkC6xC,EAAoB,CAC3D,GAAI,CAACA,EAAoB,CACxBZ,EAAS,MAAM,qDAAqD,EACpE,GAAI,CACH,MAAM,KAAK,QAAQ,WAAW,KAAK,qBAAqB,EACxD,KAAK,oBAAoB,KAAK,MAAM,CACrC,OAASjxC,EAAO,CACfixC,MAAAA,EAAS,MAAM,qDAAsDjxC,CAAK,EACpEA,CACP,CACA,MACD,CACA,GAAI,CACHixC,EAAS,MAAM,mDAAmD,EAClE,MAAM,KAAK,QAAQ,QAAQ,KAAK,sBAAuBY,CAAkB,EACzE,KAAK,oBAAoB,KAAKA,CAAkB,CACjD,OAAS7xC,EAAO,CACfixC,MAAAA,EAAS,MAAM,uDAAwDjxC,CAAK,EACtEA,CACP,CACD,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,gBAAgB,KAAK8X,GAAK0L,GAAQ,CAC5FytB,EAAS,MAAM,uCAAwCztB,CAAG,CAC3D,CAAC,EAAGY,GAAS4V,GAAwC,QAAQ,EAAGliB,GAAKwM,GAAU,CAC9E2sB,EAAS,MAAM,gDAAiD3sB,EAAM,mBAAmB,CAC1F,CAAC,CAAC,CAAC,CACJ,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,iBAAiB,kBAAmB,IAAM,KAAK,UAAU,eAAe,KAAKF,GAAS2U,GAAqB,QAAQ,EAAGnjB,GAAK,CAAE,CAAC,CAC3I,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,gBAAgB,KAAKjD,EAAOknB,EAAuB,EAAGlnB,EAAQ2R,GAAU6f,GAAqB7f,EAAM,MAAM,CAAC,EAAGtV,EAAKsV,IAAW,CACpL,QAASA,EAAM,QACf,GAAGA,EAAM,OAAO,MACnB,EAAI,CAAC,CAAC,CACL,CACA,IAAI,cAAe,CAClB,OAAO,KAAK,iBAAiB,eAAgB,IAAM,KAAK,gBAAgB,KAAK3R,EAAOknB,EAAuB,EAAGlnB,EAAQ2R,GAAU+f,GAAqB/f,EAAM,MAAM,CAAC,EAAGtV,EAAKsV,IAAW,CACpL,QAASA,EAAM,QACf,GAAGA,EAAM,OAAO,MACnB,EAAI,CAAC,CAAC,CACL,CACA,IAAI,UAAW,CACd,MAAO,CAAA,CACR,CACA,IAAI,UAAW,CACd,MAAO,CAAA,CACR,CACA,IAAI,QAAS,CACZ,MAAO,CAAA,CACR,CACA,IAAI,gBAAiB,CACpB,MAAM2D,EAAa,KAAK,cAAa,EACrC,GAAI,CAACA,EAAW,MAAO,MAAM,IAAIxH,GAAgB,+BAA+B,EAChF,MAAO,CAAE,UAAWwH,EAAW,KAAK,CACrC,CACA,MAAM,SAAU,CACf,MAAMja,GAAe,KAAK,YAAY,EACtC,MAAM,KAAK,UAAU,QAAO,EAC5B,MAAMA,GAAe,KAAK,eAAe,KAAK4J,EAAU,KAAK,UAAU,EAAGjF,EAAO,OAAO,EAAGmC,GAAK,CAAC,EAAG5R,GAAQ,CAAE,MAAO,IAAI,CAAE,CAAC,CAAC,CAC9H,CACA,MAAM,0BAA0BlD,EAAO,CACtCixC,EAAS,MAAM,wBAAyBjxC,CAAK,EAC7C,MAAM8xC,EAAyB9xC,aAAiB6gB,KAAiB7gB,EAAM,OAASuc,IAAyCvc,EAAM,OAASwc,IAA4Bxc,EAAM,OAASyc,IAC7Ks1B,EAAiB,MAAM/jC,GAAe,KAAK,oBAAoB,KAAK8G,GAAK,CAAC,CAAC,CAAC,IAAM,OACxF,GAAIg9B,GAA0BC,EAAgB,CAC7Cd,EAAS,MAAM,oFAAoF,EACnG,GAAI,CACH,MAAM,KAAK,8BAA6B,CACzC,OAASe,EAAc,CACtBf,EAAS,MAAM,8CAA+Ce,CAAY,CAC3E,QAAC,CACA,KAAK,UAAU,UAAS,CACzB,CACD,MAAO,KAAK,SAAS,KAAKhyC,CAAK,CAChC,CAaA,MAAM,+BAAgC,CACrC,MAAM,KAAK,UAAU,YAAY,MAAM,EACvC,MAAM,KAAK,kCAAkC,MAAM,EACnD,KAAK,gBAAgB,KAAK,MAAM,CACjC,CAeA,MAAM,sBAAuB,CAC5B,MAAM,KAAK,8BAA6B,EACxC,MAAM,KAAK,cAAc,UAAS,CACnC,CACA,MAAM,gBAAgBiyC,EAAqB,CAC1C,GAAI,CACH,MAAM,KAAK,QAAQ,QAAQ,KAAK,sBAAuBA,CAAmB,CAC3E,OAASjyC,EAAO,CACfixC,EAAS,MAAM,mDAAoDjxC,CAAK,EACxE,KAAK,SAAS,KAAK,IAAIigB,GAAsBjgB,CAAK,CAAC,CACpD,CACD,CACA,MAAM,eAAe+kB,EAAOmtB,EAAWr8B,EAAS,SAC/Co7B,EAAS,MAAM,qCAAqC,EACpD,GAAI,CACH,IAAIkB,EAAoBD,EACxB,GAAI,CAACC,KAAqBj2C,EAAA,KAAK,cAAL,MAAAA,EAAkB,aAAa,GAAI,CAC5Di2C,EAAoB,MAAM,KAAK,YAAY,eAAe,CAAE,OAAQ,4BAA6B,CAClG,OAASnyC,EAAO,CACf,GAAI,KAAK,YAAa,MAAMA,EAC5BixC,EAAS,KAAK,4DAA6DjxC,CAAK,CACjF,CACA,MAAMuG,EAAUmtB,GAAkB,CACjC,UAASv3B,EAAA,KAAK,gBAAgB,QAArB,YAAAA,EAA4B,aAAc,GACnD,UAAW4oB,EACX,GAAGotB,EAAoB,CAAE,WAAYA,GAAsB,CAAA,CAC/D,CAAI,EACD,MAAMrkC,GAAc3N,GAAK,KAAK,UAAU,QAAQoG,CAAO,CAAC,EAAE,KAAKge,GAAe,EAAIzP,GAAK,CAAC,EAAGtB,GAAYnS,GAAQ,CAC9G4vC,MAAAA,EAAS,MAAM,0CAA2C5vC,CAAG,EACvDA,CACP,CAAC,CAAC,CAAC,EACCwU,GAAA,MAAAA,EAAS,cAAa,KAAK,gBAAkB,IACjDo7B,EAAS,MAAM,oEAAoE,CACpF,OAASjxC,EAAO,CACfixC,MAAAA,EAAS,MAAM,sCAAuCjxC,CAAK,EAC3D,KAAK,SAAS,KAAK,IAAIigB,GAAsBjgB,CAAK,CAAC,EAC7CA,CACP,CACD,CACA,MAAM,cAAe,SACpBixC,EAAS,MAAM,2CAA2C,EAC1D,MAAMmB,EAAkB,MAAMpkC,GAAe+B,GAAc,CAC1D,SAAU,KAAK,UAAU,UACzB,oBAAqB,KAAK,mBAC7B,CAAG,EAAE,KAAK+E,GAAK,CAAC,CAAC,CAAC,EAChBm8B,EAAS,MAAM;AAAA,EAAiC,CAC/C,SAAUmB,EAAgB,SAC1B,iBAAiBl2C,EAAAk2C,EAAgB,sBAAhB,YAAAl2C,EAAqC,MACzD,CAAG,EACD,MAAMm2C,EAAoBD,EAAgB,qBAAuBA,EAAgB,SAC3EE,EAAc,KAAK,cAAa,EAAG,MACnCC,EAAcF,GAAqBC,EACzC,IAAIJ,EAMJ,GALIK,EAAatB,EAAS,MAAM,oEAAoE,EAC3F,KAAK,mBAAqB,KAAK,cACvCA,EAAS,MAAM,uDAAuD,EACtE,MAAM,KAAK,kBAAiB,IAExB,CAACsB,GAAe,KAAK,gBAAgBp2C,EAAA,KAAK,cAAL,MAAAA,EAAkB,aAAa,GAAI,CAC5E+1C,EAAY,MAAM,KAAK,YAAY,eAAe,CAAE,OAAQ,qBAAsB,CACnF,OAASlyC,EAAO,CACf,GAAI,KAAK,YAAa,MAAMA,EAC5BixC,EAAS,KAAK,yEAA0EjxC,CAAK,CAC9F,CACA,MAAMwyC,EAAoB/e,GAAW,CACpC,eAAgB8e,EAAc,CAAE,UAAWD,CAAW,EAAK,KAAK,eAChE,QAAS,KAAK,eACd,MAAO,KAAK,MACZ,SAAU,KAAK,SACf,SAAU,KAAK,SACf,OAAQ,KAAK,OACb,WAAY,KAAK,UACjB,GAAGJ,EAAY,CAAE,WAAYA,CAAS,EAAK,CAAA,EAC3C,GAAGK,EAAc,CAChB,oBAAqBH,EAAgB,oBACrC,SAAUA,EAAgB,QAC9B,EAAO,CAAA,CACP,CAAG,EACK5tB,EAAW,MAAM1W,GAAc3N,GAAK,KAAK,UAAU,QAAQqyC,CAAiB,CAAC,EAAE,KAAKjuB,GAAe,EAAIvV,EAAKyjC,GAAQA,EAAI,MAAM,EAAG9/B,EAAO49B,EAAkB,EAAGz4B,GAAI,IAAM,CAC5Km5B,EAAS,MAAM,oEAAoE,CACpF,CAAC,EAAGn8B,GAAK,CAAC,EAAGtB,GAAYnS,GAAQ,CAChC4vC,MAAAA,EAAS,MAAM,uCAAwC5vC,CAAG,EACpDA,CACP,CAAC,CAAC,CAAC,EACH4vC,EAAS,MAAM,8CAA+C,CAC7D,YAAa,CAAC,CAACzsB,EAAS,SACxB,iBAAkB,CAAC,CAACA,EAAS,cAC7B,cAAe,CAAC,CAACA,EAAS,WAC7B,CAAG,EACGA,EAAS,UAAU,MAAM,KAAK,UAAU,YAAYA,EAAS,QAAQ,EACzE,KAAK,gBAAgB,KAAKA,EAAS,aAAa,EAChD,KAAK,aAAa,KAAKA,EAAS,aAAe,CAAA,CAAE,EACjD,KAAK,YAAY,KAAK,CAAE,KAAM,eAAe,CAAE,EAC/CysB,EAAS,MAAM,iDAAiD,CACjE,CACA,MAAM,YAAa,CAClB,KAAK,UAAU,WAAU,EACzB,KAAK,YAAY,KAAK,CAAE,KAAM,iBAAiB,CAAE,EACjD,MAAM,KAAK,qBAAoB,CAChC,CACA,MAAM,kBAAkBU,EAAQ,CAC/B,MAAM7M,EAAc,MAAM,KAAK,WAAW,CACzC,OAAQ6M,EAAO,QACf,OAAQA,EAAO,OACf,UAAWA,EAAO,IAClB,OAAQA,EAAO,eACf,GAAIA,EAAO,iBACX,SAAUA,EAAO,eACjB,KAAMA,EAAO,iBACb,iBAAkBA,EAAO,kBACzB,cAAeA,EAAO,aACzB,CAAG,EACD,KAAK,QAAQ,KAAK,CACjB,CAAC,GAAG7M,EAAY,EAAE,EAAE,EAAGA,EACvB,GAAG,KAAK,QAAQ,KACnB,CAAG,CACF,CAUA,MAAM,kBAAkB6B,EAAQ,CAC/B,KAAM,CAAE,OAAAvB,CAAM,EAAKuB,EACnB,GAAIvB,KAAU,KAAK,QAAQ,MAAO,CACjC6L,EAAS,MAAM,4CAA4C7L,CAAM,iCAAiC,EAClG,MACD,CACA,MAAMsN,EAAgB,MAAM,KAAK,cAAc,yBAAyBtN,CAAM,EAC9E6L,EAAS,MAAM,kDAAkD7L,CAAM,EAAE,EACzE,MAAMN,EAAc,MAAM,KAAK,WAAW,CACzC,OAAQ6B,EAAO,QACf,OAAQvB,EACR,OAAQuB,EAAO,eACf,GAAIA,EAAO,iBACX,SAAUA,EAAO,eACjB,KAAMA,EAAO,iBACb,SAAU,GACV,GAAG+L,CACN,CAAG,EACD,KAAK,QAAQ,KAAK,CACjB,CAAC,GAAG5N,EAAY,EAAE,EAAE,EAAGA,EACvB,GAAG,KAAK,QAAQ,KACnB,CAAG,CACF,CACA,MAAM,mBAAmBphC,EAAamS,EAAU,GAAI,CACnD,MAAM88B,EAAiBjvC,aAAuBusC,GAAUvsC,EAAY,eAAiBA,EACrF,IAAIohC,EACJ,GAAI,CACH,OAAAA,EAAc,MAAM,KAAK,WAAW,CACnC,GAAI6N,EACJ,GAAG98B,CACP,CAAI,EACD,MAAM7H,GAAe6E,GAAKiyB,EAAY,QAAQ,KAAKnyB,EAAQlK,GAAO,EAAQA,CAAG,EAAGqM,GAAK,CAAC,EAAG5R,GAAQ,KAAK,iBAAiB,CAAC,EAAG4hC,EAAY,QAAQ,KAAKnyB,EAAOu+B,EAAe,EAAGp8B,GAAK,CAAC,EAAG0C,GAAW+1B,GAAc7/B,GAAW,IAAM6/B,EAAU,KAAK,CAAC,CAAC,CAAC,CAAC,EACnP,KAAK,QAAQ,KAAK,CACjB,CAAC,GAAGzI,EAAY,EAAE,EAAE,EAAGA,EACvB,GAAG,KAAK,QAAQ,KACpB,CAAI,EACMA,CACR,OAAS9kC,EAAO,CACfixC,EAAS,MAAM,0CAA2CjxC,CAAK,EAC/D8kC,GAAA,MAAAA,EAAa,UACb,MAAMyI,EAAY,IAAI5sB,GAAgB3gB,aAAiBkO,GAAe,sBAAwB,uBAAwBlO,EAAO,UAAU,EACvI,WAAK,SAAS,KAAKutC,CAAS,EACtBA,CACP,CACD,CACA,MAAM,WAAW13B,EAAU,GAAI,CAC9B,GAAI,CACH,MAAM+8B,EAAazB,GAAoBt7B,CAAO,EAC9C,IAAIs3B,EACJ,GAAI,CACH,GAAI,CAAC,KAAK,WAAY,MAAM,IAAI1sB,GAAgB,2BAA2B,EAC3E,MAAMyvB,EAAY,MAAM,KAAK,WAAW,mBAAmB0C,CAAU,EACrE,GAAI,CAAC1C,EAAW,MAAM,IAAIzvB,GAAgB,iBAAiBmyB,CAAU,YAAY,EAEjF,GADAzF,EAAU,KAAK,WAAW,IAAI+C,CAAS,EACnC,CAAC/C,EAAS,MAAM,IAAI1sB,GAAgB,eAAeyvB,CAAS,YAAY,CAC7E,MAAQ,CACPe,EAAS,KAAK,yCAAyC2B,CAAU,2BAA2B,CAC7F,CACA,MAAM9N,EAAc,KAAK,YAAY,WAAWqI,EAAS,CAAE,GAAGt3B,EAAS,EACvE,YAAK,YAAYivB,EAAY,QAAQ,KAAKnyB,EAAQ8vB,GAAWA,IAAW,WAAW,EAAG3tB,GAAK,CAAC,CAAC,EAAG,IAAM,CACrG,KAAM,CAAE,CAAC,GAAGgwB,EAAY,EAAE,EAAE,EAAGxoC,EAAG,GAAGu2C,CAAc,EAAK,KAAK,QAAQ,MACrE,KAAK,QAAQ,KAAKA,CAAc,CACjC,CAAC,EACM/N,CACR,OAAS9kC,EAAO,CACfixC,MAAAA,EAAS,MAAM,yCAA0CjxC,CAAK,EACxD,IAAI2gB,GAAgB,oBAAqB3gB,EAAO6V,EAAQ,UAAY,UAAY,UAAU,CACjG,CACD,CACA,SAAU,CACT,UAAWzX,KAAQ,OAAO,OAAO,KAAK,QAAQ,KAAK,EAAGA,EAAK,OAAM,EACjE,MAAM,QAAO,CACd,CACD,EACI00C,GAAuB,KAAM,CAChC,YAAYC,EAAsB,CACjC,KAAK,qBAAuBA,CAC7B,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,qBAAqB,cAClC,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,qBAAqB,aAClC,CACA,IAAI,iBAAkB,CACrB,OAAO,KAAK,qBAAqB,eAClC,CACA,IAAI,YAAa,CAChB,OAAO,KAAK,qBAAqB,UAClC,CACA,MAAM,QAAQxsC,EAASsP,EAAS,CAC/B,OAAO,KAAK,qBAAqB,QAAQtP,EAASsP,CAAO,CAC1D,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,qBAAqB,cAClC,CACA,IAAI,eAAgB,CACnB,OAAO,KAAK,qBAAqB,aAClC,CACA,IAAI,QAAS,CACZ,OAAO,KAAK,qBAAqB,MAClC,CACA,IAAI,OAAQ,CACX,OAAO,KAAK,qBAAqB,KAClC,CACD,EAIA,MAAMm9B,GAAYhoC,GAAQ,OAAOA,GAAQ,SAInCioC,GAAWxvB,EAAS,EAC1B,IAAIyvB,GAA8B,cAAcjE,EAAQ,CACvD,YAAYkE,EAAS/f,EAAM,CAC1B,MAAM,6BAA6B+f,CAAO,YAAa,gBAAiB/f,CAAI,EAC5E,KAAK,QAAU+f,CAChB,CACD,EACIC,GAAgC,cAAchE,EAAiB,CAClE,YAAY+D,EAAS7D,EAASlc,EAAMptB,EAAS,CAC5C,MAAM,IAAIktC,GAA4BC,EAAS/f,CAAI,EAAGkc,EAAStpC,CAAO,CACvE,CACD,EACIqtC,GAAuB,KAAM,CAChC,YAAYpG,EAAe7Z,EAAMkgB,EAAkBttC,EAAS,CAC3D,KAAK,cAAgBinC,EACrB,KAAK,KAAO7Z,EACZ,KAAK,iBAAmBkgB,EACxB,KAAK,QAAUttC,EACf,KAAK,SAA2B,IAAI,GACrC,CACA,MAAM,KAAKkqC,EAAW,CACrB,MAAMqD,EAAoB,KAAK,iBAAgB,EAC/C,GAAI,CACH,MAAM/uB,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,GAAG4C,GACH,IAAK,iCACL,KAAM,KAAK,UAAU,CACpB,uBAAwBmsB,EACxB,mBAAoB,CAACrD,EAAWqD,CAAiB,CACtD,CAAK,CACL,CAAI,EACD,GAAI/uB,EAAS,IAAQA,EAAS,KAAM,CACnC,MAAMzD,EAAO,KAAK,MAAMyD,EAAS,IAAI,EACrC,GAAIwuB,GAASjyB,EAAK,QAAQ,EACzB,YAAK,SAAS,IAAImvB,EAAWnvB,EAAK,QAAQ,EACnCA,EAAK,QAEd,CACA,MAAM,IAAIE,GAAkB,mCAAmC,CAChE,OAASjhB,EAAO,CACfizC,MAAAA,GAAS,MAAM,sDAAuDjzC,CAAK,EACrEA,CACP,CACD,CACA,MAAM,iCAAiCkwC,EAAW,CACjD,MAAMiD,EAAU,KAAK,SAAS,IAAIjD,CAAS,GAAK,MAAM,KAAK,KAAKA,CAAS,EACzE,OAAO,QAAQ,QAAQ,IAAIkD,GAA8BD,EAAS,KAAK,cAAc,gBAAgB,KAAK/uB,GAAS0V,GAA+B,QAAQ,EAAGhiB,GAAKwM,GAAU2uB,GAAS,MAAM,8CAA+C3uB,CAAK,CAAC,EAAGtV,EAAKyf,IAAY,CAAE,GAAGA,CAAM,EAAG,CAAC,EAAG,KAAK,KAAM,KAAK,OAAO,CAAC,CAC/S,CACA,MAAM,SAAS4hB,EAAMmD,EAAsB,CAC1C,MAAML,EAAU,KAAK,SAAS,IAAIK,CAAoB,GAAK,MAAM,KAAK,KAAKA,CAAoB,EACzFD,EAAoB,KAAK,iBAAgB,EAC/C,GAAI,CACH,IAAK,MAAM,KAAK,KAAK,QAAQ,CAC5B,GAAGnsB,GACH,IAAK,uBACL,KAAM,KAAK,UAAU,CACpB,SAAU+rB,EACV,uBAAwBI,EACxB,KAAAlD,CACL,CAAK,CACL,CAAI,GAAG,GAAI,OACR,MAAM,IAAIpvB,GAAkB,wCAAwC,CACrE,OAASjhB,EAAO,CACfizC,MAAAA,GAAS,MAAM,sDAAuDjzC,CAAK,EACrEA,CACP,CACD,CACD,EAIA,MAAMyzC,GAAWhwB,EAAS,EAO1B,SAASiwB,GAAiB3yB,EAAM,CAC/B,OAAIA,EAAK,WAAmBA,EAAK,WAC7BA,EAAK,WAAmB,KAAK,MAAM,KAAK,MAAQ,GAAG,EAAIA,EAAK,YAChE0yB,GAAS,KAAK,+DAA+D,EACtE,KAAK,MAAM,KAAK,IAAG,EAAK,GAAG,EAAI33B,GACvC,CASA,SAAS63B,GAAgB5yB,EAAM,CAC9B,OAAIA,EAAK,WAAmBA,EAAK,WAC7BA,EAAK,WAAmB,KAAK,IAAIA,EAAK,WAAa,KAAK,MAAM,KAAK,IAAG,EAAK,GAAG,EAAG,CAAC,EAC/EjF,EACR,CASA,IAAI83B,GAAqB,cAAchuB,EAAY,CAClD,YAAY4rB,EAAape,EAAMygB,EAActsB,EAAe,CAC3D,MAAK,EACL,KAAK,YAAciqB,EACnB,KAAK,KAAOpe,EACZ,KAAK,aAAeygB,EACpB,KAAK,cAAgBtsB,EACrB,KAAK,eAAiB,KAAK,sBAAsB,IAAI,EACrD,KAAK,mBAAqB,GAC1B,KAAK,QAAU,GACf,KAAK,mBAAqBzL,GAC1B,KAAK,YAAY,KAAK,eAAe,KAAKnJ,EAAO,OAAO,EAAG6E,GAAWs8B,GAAc,CACnF,MAAMC,EAAYL,GAAiBI,CAAS,EACtCE,EAAY,KAAK,IAAID,EAAY,IAAM,KAAK,IAAG,EAAKh4B,GAAgC,GAAG,EAC7F03B,OAAAA,GAAS,MAAM,wDAAwDO,CAAS,IAAI,EAC7EhiC,GAAMgiC,CAAS,CACvB,CAAC,CAAC,EAAG,IAAM,CACV,KAAK,eAAc,CACpB,CAAC,CACF,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBACb,CAgBA,MAAM,SAASnnB,EAAMwI,EAAS4e,EAAkB,OAC/C,KAAM,CAAE,UAAAC,CAAS,EAAKrnB,EACtB,GAAI,GAAC3wB,EAAAg4C,GAAA,YAAAA,EAAW,QAAX,MAAAh4C,EAAkB,SAASyf,KAC/B83B,OAAAA,GAAS,MAAM,0EAA0E,EAClF,CACN,UAAW,GACX,OAAQ,UACZ,EAEE,KAAK,SAAWpe,EAChB,KAAK,kBAAoB4e,EACzB,GAAI,CACH,MAAMnuB,EAAS,KAAK,eAAe,MACnC,GAAIA,GAAU,KAAK,aAAaA,CAAM,EAAG,CACxC2tB,GAAS,MAAM,yEAAyE,EACxF,MAAMU,EAAa,MAAM,KAAK,YAAY,eAAe,CAAE,OAAQ,4BAA6B,EAChG,aAAM9e,EAAQ,eAAevP,EAAO,MAAOquB,EAAY,CAAE,YAAa,GAAM,EAC5EF,EAAiB,CAAE,MAAOnuB,EAAO,KAAK,CAAE,EACjC,CAAE,UAAW,EAAI,CACzB,CACA,MAAMguB,EAAY,MAAM,KAAK,YAAW,EACpC,CAACA,EAAU,YAAc,CAACA,EAAU,YAAcI,EAAU,aAAYJ,EAAU,WAAaI,EAAU,YAC7G,KAAK,mBAAqBP,GAAgBG,CAAS,EACnD,MAAMM,EAAW,MAAM,KAAK,YAAY,eAAe,CAAE,OAAQ,4BAA6B,EAC9F,aAAM/e,EAAQ,eAAeye,EAAU,MAAOM,EAAU,CAAE,YAAa,GAAM,EAC7EH,EAAiB,CAAE,MAAOH,EAAU,KAAK,CAAE,EAC3CL,GAAS,KAAK,uDAAuD,EACrE,KAAK,eAAe,KAAKK,CAAS,EAC3B,CAAE,UAAW,EAAI,CACzB,OAAS9zC,EAAO,CACfyzC,OAAAA,GAAS,MAAM,qDAAsDzzC,CAAK,EAC1E,KAAK,aAAa,IAAI+hB,GAAc/hB,EAAO,qCAAqC,CAAC,EAC1E,CACN,UAAW,GACX,OAAQ,iBACZ,CACE,CACD,CAOA,aAAa+kB,EAAO,CACnB,OAAO2uB,GAAiB3uB,CAAK,EAAI,IAAM,KAAK,IAAG,EAAKhJ,EACrD,CAKA,MAAM,aAAc,CACnB,MAAMs4B,EAAY,MAAM,KAAK,YAAY,gBAAgB,CACxD,OAAQ,OACR,IAAKz4B,EACR,CAAG,EACK4I,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,IAAK5I,GACL,GAAGwL,GACH,KAAM,KAAK,UAAU,CACpB,WAAYitB,EACZ,UAAWv4B,EACf,CAAI,CACJ,CAAG,EACD,GAAI,CAAC0I,EAAS,IAAM,CAACA,EAAS,KAAM,MAAM,IAAItC,GAAiB,kCAAkCsC,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EACzI,MAAMzD,EAAO,KAAK,MAAMyD,EAAS,IAAI,EACrC,GAAI,CAACzD,EAAK,MAAO,MAAM,IAAImB,GAAiB,2CAA2C,EACvF,OAAOnB,CACR,CAQA,MAAM,aAAasU,EAASif,EAAcL,EAAkB,CAC3DR,GAAS,MAAM,2CAA2C,EAC1D,MAAMY,EAAY,MAAM,KAAK,YAAY,gBAAgB,CACxD,OAAQ,OACR,IAAKx4B,GACL,YAAay4B,CAChB,CAAG,EACK9vB,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,IAAK3I,GACL,GAAGuL,GACH,KAAM,KAAK,UAAU,CACpB,WAAYitB,EACZ,UAAW,KAAK,kBACpB,CAAI,CACJ,CAAG,EACD,GAAI,CAAC7vB,EAAS,IAAM,CAACA,EAAS,KAAM,MAAM,IAAIrC,GAAkB,mCAAmCqC,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,EAC3I,MAAMzD,EAAO,KAAK,MAAMyD,EAAS,IAAI,EACrC,GAAI,CAACzD,EAAK,MAAO,MAAM,IAAIoB,GAAkB,mDAAmD,EAC5F,CAACpB,EAAK,YAAc,CAACA,EAAK,aAAYA,EAAK,WAAa,KAAK,oBACjE,KAAK,mBAAqB4yB,GAAgB5yB,CAAI,EAC9C,MAAMqzB,EAAW,MAAM,KAAK,YAAY,eAAe,CAAE,OAAQ,4BAA6B,EAC9F,aAAM/e,EAAQ,eAAetU,EAAK,MAAOqzB,CAAQ,EACjDH,EAAiB,CAAE,MAAOlzB,EAAK,KAAK,CAAE,EACtC0yB,GAAS,KAAK,uDAAuD,EAC9D1yB,CACR,CAMA,MAAM,gBAAiB,CACtB,GAAI,KAAK,QAAS,CACjB0yB,GAAS,MAAM,gDAAgD,EAC/D,MACD,CACA,GAAI,KAAK,mBAAoB,CAC5BA,GAAS,MAAM,qDAAqD,EACpE,MACD,CACA,MAAMpe,EAAU,KAAK,SACf4e,EAAmB,KAAK,kBAC9B,GAAI,CAAC5e,GAAW,CAAC4e,EAAkB,CAClCR,GAAS,KAAK,mEAAmE,EACjF,MACD,CACA,GAAI,CAACpe,EAAQ,cAAe,CAC3Boe,GAAS,MAAM,4DAA4D,EAC3E,MACD,CACA,KAAK,mBAAqB,GAC1B,GAAI,CACH,MAAMa,EAAe,KAAK,cAAa,EAAG,MAC1C,GAAI,CAACA,EAAc,MAAM,IAAInyB,GAAkB,wCAAwC,EACvF,MAAMoyB,EAAe,MAAM,KAAK,aAAalf,EAASif,EAAcL,CAAgB,EACpF,KAAK,eAAe,KAAKM,CAAY,CACtC,OAASv0C,EAAO,CACfyzC,GAAS,MAAM,2DAA4DzzC,CAAK,EAChF,KAAK,aAAaA,aAAiBmiB,GAAoBniB,EAAQ,IAAImiB,GAAkB,iCAAkCniB,CAAK,CAAC,CAC9H,QAAC,CACA,KAAK,mBAAqB,EAC3B,CACD,CAKA,MAAM,aAAaq1B,EAASif,EAAcL,EAAkB,CAC3D,IAAIO,EACJ,QAAS5e,EAAU,EAAGA,EAAU5Z,GAAkC4Z,IAAW,GAAI,CAChF,OAAO,MAAM,KAAK,aAAaP,EAASif,EAAcL,CAAgB,CACvE,OAASj0C,EAAO,CAEf,GADAw0C,EAAYx0C,EACR41B,EAAU5Z,GAAmC,EAAG,CACnD,MAAM1T,EAAQ2T,GAAqC,KAAK,IAAI,EAAG2Z,CAAO,EACtE6d,GAAS,KAAK,iCAAiC7d,EAAU,CAAC,wBAAwBttB,CAAK,IAAI,EAC3F,MAAM,IAAI,QAASnJ,GAAY,WAAWA,EAASmJ,CAAK,CAAC,CAC1D,CACD,CACA,MAAMksC,aAAqB,MAAQA,EAAY,IAAIryB,GAAkB,gCAAiCqyB,CAAS,CAChH,CASA,OAAQ,CACP,KAAK,QAAU,EAChB,CAEA,QAAS,CACR,KAAK,QAAU,EAChB,CAEA,SAAU,CACT,MAAM,QAAO,CACd,CACD,EAIA,MAAMC,GAAWhxB,EAAS,EACpBixB,GAAmC,CAAClD,EAAape,EAAMygB,EAActsB,IAAkB,IAAIqsB,GAAmBpC,EAAape,EAAMygB,EAActsB,CAAa,EAqBlK,IAAIotB,GAA+B,cAAc/uB,EAAY,CAC5D,YAAY4rB,EAAaoD,EAAM,CAC9B,MAAK,EACL,KAAK,KAAOA,EACZ,KAAK,YAAc,GACnB,KAAK,sBAAwB,EACzBpD,GAAA,MAAAA,EAAa,cAAa,KAAK,qBAAuBoD,EAAK,2BAA6BF,IAAkClD,EAAaoD,EAAK,KAAO50C,GAAU40C,EAAK,SAAS,QAAQ50C,CAAK,EAAG,IAAM40C,EAAK,MAAM,MAAM,EACvN,CAEA,IAAI,yBAA0B,CAC7B,OAAO,KAAK,sBAAwB,MACrC,CAEA,IAAI,uBAAwB,CAC3B,OAAO,KAAK,oBAAsB,MACnC,CAQA,yBAAyBhlB,EAAUmkB,EAAWne,EAAU,EAAG,CACtD,KAAK,oBAAsB,QAAQ,aAAa,KAAK,iBAAiB,EAC1E,MAAMif,EAAkBjf,IAAY,EAAI,KAAK,IAAIme,EAAY,KAAK,IAAG,EAAK13B,GAA8B,GAAG,EAAI,KAAK,IAAIF,GAAmC,KAAK,IAAI,EAAGyZ,CAAO,GAAK,GAAK,KAAK,OAAM,EAAK,IAAKxZ,EAA+B,EAC5O,KAAK,kBAAoB,WAAW,SAAY,CAC/C,GAAI,CACH,GAAI,CAACwT,EAAS,QAAS,MAAM,IAAIrQ,GAAwB,8CAA8C,EACvG,MAAMu1B,EAAiB,MAAMllB,EAAS,QAAO,EAC7C,KAAK,KAAK,MAAM,MAAMklB,CAAc,EACpC,KAAK,KAAK,MAAM,QAAQA,CAAc,EACtCL,GAAS,KAAK,mDAAmD,EAC7DK,EAAe,WAAW,KAAK,yBAAyBllB,EAAUklB,EAAe,UAAW,CAAC,CAClG,OAAS90C,EAAO,CACf,MAAM+0C,EAAcnf,EAAU,EAC9B6e,GAAS,MAAM,oDAAoDM,CAAW,IAAI74B,EAA8B,KAAMlc,CAAK,EAC3H,KAAK,KAAK,SAAS,QAAQA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,EAClG+0C,EAAc74B,GAAgC,KAAK,yBAAyB0T,EAAUmkB,EAAWgB,CAAW,GAE/GN,GAAS,MAAM,wEAAwE,EACvF,KAAK,KAAK,SAAS,QAAQ,IAAItyB,GAAkB,6CAA6C,CAAC,EAC/F,KAAK,KAAK,SAAS,mBAAkB,EAEvC,CACD,EAAG0yB,CAAe,CACnB,CAQA,wBAAyB,CACpB,KAAK,oBAAsB,SAC9B,aAAa,KAAK,iBAAiB,EACnC,KAAK,kBAAoB,OAE3B,CAWA,SAAU,OACT,KAAK,uBAAsB,GAC3B34C,EAAA,KAAK,sBAAL,MAAAA,EAA0B,OAC3B,CAWA,MAAM,SAAS2wB,EAAMwI,EAAS,CAC7B,GAAI,KAAK,YAAa,CACrBof,GAAS,MAAM,8DAA8D,EAC7E,MACD,CACA,GAAI,CAAC,KAAK,oBAAqB,OAC/B,KAAK,oBAAoB,OAAM,EAC/B,MAAMO,EAAa,EAAE,KAAK,sBAC1B,KAAK,YAAc,GACnB,GAAI,CACH,MAAMx1C,EAAS,MAAM,KAAK,sBAAsB,KAAK,oBAAoB,SAASqtB,EAAMwI,EAAU4f,GAAS,KAAK,KAAK,MAAM,MAAMA,CAAI,CAAC,CAAC,EACvI,GAAID,IAAe,KAAK,sBAAuB,CAC9CP,GAAS,MAAM,2EAA2E,EAC1F,MACD,CACA,GAAIj1C,EAAO,UAAW,CACrB,KAAK,uBAAsB,EAC3Bi1C,GAAS,MAAM,0EAA0E,EACzF,MACD,CACAA,GAAS,KAAK,wEAAwEj1C,EAAO,MAAM,8CAA8C,EACjJ,KAAK,KAAK,SAAS,UAAU,CAC5B,KAAM,8BACN,OAAQ,qBACR,OAAQA,EAAO,OACf,QAAS,yCAAyCA,EAAO,MAAM,sCACnE,CAAI,CACF,QAAC,CACA,KAAK,YAAc,EACpB,CACD,CACA,SAAU,OACT,KAAK,uBAAsB,GAC3BtD,EAAA,KAAK,sBAAL,MAAAA,EAA0B,UAC1B,KAAK,oBAAsB,OAC3B,MAAM,QAAO,CACd,CAcA,MAAM,sBAAsBg5C,EAAO,CAClC,OAAO,IAAI,QAAS/1C,GAAY,CAC/B,MAAM0yB,EAAU,WAAW,IAAM,QAChC31B,EAAA,KAAK,sBAAL,MAAAA,EAA0B,QAC1BiD,EAAQ,CACP,UAAW,GACX,OAAQ,oBACb,CAAK,CACF,EAAGmd,EAA8B,EACjC44B,EAAM,KAAM11C,GAAW,CACtB,aAAaqyB,CAAO,EACpB1yB,EAAQK,CAAM,CACf,EAAIQ,GAAU,CACb,aAAa6xB,CAAO,EACpB,KAAK,KAAK,SAAS,QAAQ7xB,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,CAAC,CAAC,EACpFb,EAAQ,CACP,UAAW,GACX,OAAQ,iBACb,CAAK,CACF,CAAC,CACF,CAAC,CACF,CACD,EAIA,MAAMg2C,GAAW1xB,EAAS,EAEpB2xB,GAAqB,IAI3B,SAASC,IAAe,CACvB,GAAI,CACH,GAAI,OAAO,UAAc,KAAe,UAAU,UAAW,OAAO,UAAU,SAC/E,MAAQ,CAAC,CACT,MAAO,SACR,CASA,IAAIC,GAAuB,cAAc1vB,EAAY,CACpD,YAAY/P,EAAS,CACpB,MAAK,EACL,KAAK,QAAU,CAAA,EACf,KAAK,OAAS,CAAA,EACd,KAAK,eAAiB,CAAA,EACtB,KAAK,gBAAkB,KAAK,cAAa,EACzC,KAAK,YAAcA,EAAQ,WAC3B,KAAK,WAAaA,EAAQ,WAAau/B,GACvCD,GAAS,MAAM,mCAAoC,CAClD,WAAY,KAAK,YACjB,UAAW,KAAK,UACnB,CAAG,CACF,CAIA,IAAI,gBAAiB,CACpB,OAAO,KAAK,gBAAgB,aAAY,CACzC,CAQA,OAAOI,EAAUjxB,EAAOkxB,EAAS,CAChC,MAAMhtB,EAAQ,CACb,UAAW,KAAK,IAAG,EACnB,SAAA+sB,EACA,MAAAjxB,EACA,GAAGkxB,IAAY,OAAS,CAAE,QAAAA,GAAY,CAAA,CACzC,EACE,KAAK,QAAU,KAAK,gBAAgB,KAAK,QAAShtB,CAAK,EACvD,KAAK,gBAAgB,KAAKA,CAAK,CAChC,CAOA,mBAAmBlE,EAAOkxB,EAAS,CAClC,MAAMhtB,EAAQ,CACb,UAAW,KAAK,IAAG,EACnB,SAAU,SACV,MAAAlE,EACA,GAAGkxB,IAAY,OAAS,CAAE,QAAAA,GAAY,CAAA,CACzC,EACE,KAAK,eAAiB,KAAK,gBAAgB,KAAK,eAAgBhtB,CAAK,EACrE,KAAK,QAAU,KAAK,gBAAgB,KAAK,QAASA,CAAK,EACvD,KAAK,gBAAgB,KAAKA,CAAK,CAChC,CAMA,kBAAkBitB,EAAS,CAC1B,KAAK,OAAS,KAAK,oBAAoB,KAAK,OAAQA,CAAO,EAC3D,KAAK,OAAO,OAAQ,eAAgB,CACnC,OAAQA,EAAQ,OAChB,UAAWA,EAAQ,UACnB,SAAUA,EAAQ,SAClB,YAAaA,EAAQ,WACxB,CAAG,CACF,CAKA,QAAS,CACR,MAAO,CACN,WAAY,KAAK,YACjB,UAAWJ,GAAY,EACvB,WAAY,KAAK,IAAG,EACpB,OAAQ,CAAC,GAAG,KAAK,OAAO,EACxB,MAAO,CAAC,GAAG,KAAK,MAAM,EACtB,cAAe,CAAC,GAAG,KAAK,cAAc,CACzC,CACC,CAIA,OAAQ,CACP,KAAK,QAAU,CAAA,EACf,KAAK,OAAS,CAAA,EACd,KAAK,eAAiB,CAAA,EACtBF,GAAS,MAAM,sCAAsC,CACtD,CACA,SAAU,CACTA,GAAS,MAAM,gCAAgC,EAC/C,MAAM,QAAO,CACd,CAKA,gBAAgBlkC,EAAQuX,EAAO,CAC9B,MAAM+M,EAAU,CAAC,GAAGtkB,EAAQuX,CAAK,EACjC,OAAI+M,EAAQ,OAAS,KAAK,WAAmBA,EAAQ,MAAMA,EAAQ,OAAS,KAAK,UAAU,EACpFA,CACR,CAKA,oBAAoBtkB,EAAQuX,EAAO,CAClC,MAAM+M,EAAU,CAAC,GAAGtkB,EAAQuX,CAAK,EACjC,OAAI+M,EAAQ,OAAS,KAAK,WAAmBA,EAAQ,MAAMA,EAAQ,OAAS,KAAK,UAAU,EACpFA,CACR,CACD,EAIA,MAAMmgB,GAAgB/5C,KACbA,GAAA,YAAAA,EAAG,SAAU,KAAO,EAKvBg6C,GAAUtxC,GAAe,CAC9BA,EAAW,KAAKyQ,GAAK,CAAC,CAAC,EAAE,UAAS,CACnC,EAIM8gC,GAAWnyB,EAAS,EAC1B,IAAIoyB,GAAiB,cAAc5G,EAAQ,CAC1C,YAAY7b,EAAM,CACjB,MAAM,wBAAyB,8BAA+BA,CAAI,CACnE,CACA,MAAM,KAAKzZ,EAAM,CAChB,MAAM6K,EAAW,MAAM,KAAK,KAAK,QAAQ,CACxC,GAAG2C,GACH,IAAK,GAAG,KAAK,QAAQ,SAAS,mBAAmBxN,CAAI,CAAC,EACzD,CAAG,EACD,GAAI6K,EAAS,IAAQA,EAAS,KAAM,CACnC,MAAMhlB,EAAS,KAAK,MAAMglB,EAAS,IAAI,EACvC,GAAI,CAACkxB,GAAal2C,EAAO,IAAI,EAAG,OAAOA,EAAO,KAAK,CAAC,CACrD,CACAo2C,GAAS,MAAM,2BAA2B,CAC3C,CACD,EAEIE,GAAyB,cAAc1G,EAAiB,CAC3D,YAAYE,EAASlc,EAAMptB,EAAS,CACnC,MAAM,IAAI6vC,GAAeziB,CAAI,EAAGkc,EAAStpC,CAAO,CACjD,CACD,EAOI+vC,GAAmB,cAAcnwB,EAAY,CAChD,YAAYwN,EAAM6Z,EAAengB,EAAqB9mB,EAAS,CAC9D,MAAK,EACL,KAAK,KAAOotB,EACZ,KAAK,oBAAsBtG,EAC3B,KAAK,QAAU9mB,EACf,KAAK,cAAiByC,GAAO,OAC5B,MAAM0kC,EAAU,IAAI8C,GAAQxnC,EAAI,KAAK,oBAAqB,IAAI,EACxDpE,GAAanI,EAAA,KAAK,kBAAkB,KAAKuM,CAAE,IAA9B,YAAAvM,EAAiC,KAAK2nB,GAAU,EAAI7U,EAAK+R,IAC3EosB,EAAQ,OAAOpsB,CAAI,EACZosB,EACP,GACG9oC,IACHsxC,GAAOtxC,CAAU,EACjB,KAAK,oBAAoB,IAAIoE,EAAIpE,CAAU,GAE5C,KAAK,oBAAoB,IAAIoE,EAAI0kC,CAAO,CACzC,EACA,KAAK,YAAc,KAAK,sBAAsB,CAAA,CAAE,EAChD,KAAK,oBAAsC,IAAI,IAC/C,KAAK,oBAAsC,IAAI,IAC/C,KAAK,kBAAoB,IAAI2I,GAAuB7I,EAAc,gBAAgB,KAAK7oB,GAAS2V,GAAsC,QAAQ,EAAG/qB,EAAK1S,IAAO,GAAG,CAAC,EAAG,KAAK,KAAM,KAAK,OAAO,EAC3L,KAAK,kBAAiB,CACvB,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,kBAAkB,OAC/B,CACA,mBAAoB,CACnB,KAAK,YAAY,KAAK,kBAAkB,SAAU,IAAM,CACvD,MAAMizC,EAAW,MAAM,KAAK,KAAK,oBAAoB,OAAM,EAAG,IAAKpC,GAAYA,EAAQ,EAAE,CAAC,EACpF6I,EAAY,KAAK,kBAAkB,OAAO,OAAQ3tC,GAAU,CAACknC,EAAS,SAASlnC,EAAM,EAAE,CAAC,EACzFqtC,GAAaM,CAAS,IAC1BA,EAAU,QAAS3tC,GAAU,KAAK,cAAcA,EAAM,EAAE,CAAC,EACzD,KAAK,YAAY,KAAK,MAAM,KAAK,KAAK,oBAAoB,OAAM,CAAE,CAAC,EAErE,CAAC,CACF,CAEA,IAAI,YAAa,CAChB,OAAO,KAAK,YAAY,aAAY,CACrC,CAEA,IAAI,WAAY,CACf,OAAO,KAAK,YAAY,KACzB,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,kBAAkB,QAC/B,CAEA,IAAI,UAAW,CACd,OAAO,KAAK,kBAAkB,QAC/B,CAOA,UAAW,CACN,KAAK,kBAAkB,SAAS,KAAK,kBAAkB,SAAQ,CACpE,CAMA,KAAKI,EAAI,CACR,OAAK,KAAK,oBAAoB,IAAIA,CAAE,GAAG,KAAK,cAAcA,CAAE,EACrD,KAAK,oBAAoB,IAAIA,CAAE,CACvC,CAMA,IAAIynC,EAAW,CACd,OAAO,KAAK,oBAAoB,IAAIA,CAAS,CAC9C,CAUA,MAAM,mBAAmBv2B,EAAM,OAC9B,IAAIu2B,GAAYh0C,EAAA,KAAK,oBAAoB,OAAM,EAAG,KAAM+5C,GAASA,EAAK,OAASt8B,CAAI,IAAnE,YAAAzd,EAAsE,GACtF,GAAI,CAACg0C,EAAW,CACf,MAAMgG,EAAS,MAAM,KAAK,kBAAkB,MAAM,OAAQv8B,CAAI,EAC9D,GAAIu8B,EAAQ,CACX,MAAM7tC,EAAQ,MAAM2F,GAAekoC,CAAM,EACzC,KAAK,cAAc7tC,EAAM,EAAE,EAC3B6nC,EAAY7nC,EAAM,EACnB,CACD,CACA,OAAO6nC,CACR,CACD,EAIA,MAAMiG,GAAW1yB,EAAS,EAC1B,IAAI2yB,IAAsB3nC,GAAA,cAAkCmX,EAAY,CAUvE,YAAYmH,EAAsBmiB,EAAUmH,EAAmBxgC,EAAU,CAAA,EAAI,CAC5E,MAAK,EACL,KAAK,qBAAuBkX,EAC5B,KAAK,SAAWmiB,EAChB,KAAK,kBAAoBmH,EACzB,KAAK,aAAe,CAAA,EACpB,KAAK,gBAAkB,GACvB,KAAK,gBAAkB,IAAM,KAAK,WAAU,EAC5C,KAAK,iBAAoB/xB,GAAU,KAAK,YAAYA,CAAK,EACzD,KAAK,iBAAmB,IAAM,KAAK,YAAW,EAC9C,KAAK,mBAAsBA,GAAU,KAAK,cAAcA,CAAK,EAC7D,KAAK,SAAW,KAAK,sBAAsB,cAAc,EACzD,KAAK,mBAAqB,KAAK,cAAa,EAC5C,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,kBAAoBzO,EAAQ,mBAAqBpH,GAAoB,+BAC1E,KAAK,kBAAoBoH,EAAQ,mBAAqBpH,GAAoB,+BAC1E,KAAK,kBAAoBoH,EAAQ,mBAAqBpH,GAAoB,8BAC1E,KAAK,sBAAwB,KAAK,kBAClC,KAAK,cAAc,KAAK,KAAK,kBAAkB,UAAWsS,GAAS,CAClE,KAAK,KAAKA,CAAI,CACf,CAAC,CAAC,CACH,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,mBAAmB,aAAY,CAC5C,CACA,IAAI,SAAU,CACb,OAAO,KAAK,SAAS,aAAY,CAClC,CACA,SAAU,CACL,KAAK,SAAS,QAAU,cAAgB,KAAK,SAAS,QAAU,cACpE,KAAK,gBAAkB,GACvB,KAAK,SAAS,KAAK,YAAY,EAC/B,KAAK,gBAAe,EACrB,CACA,YAAa,CACZ,KAAK,gBAAkB,GACvB,KAAK,oBAAmB,EACxB,KAAK,uBAAsB,EAC3B,MAAMu1B,EAAgB,KAAK,SAAS,MAChCA,IAAkB,aAAeA,IAAkB,cAAgBA,IAAkB,eAAoB,KAAK,QACjH,KAAK,SAAS,KAAK,eAAe,EAClC,KAAK,OAAO,MAAK,GACX,KAAK,SAAS,KAAK,cAAc,EACnC,KAAK,SAAS,KAAK,cAAc,CACvC,CACA,WAAY,CACX,KAAK,gBAAkB,GACvB,KAAK,SAAS,KAAK,cAAc,EACjC,KAAK,qBAAoB,CAC1B,CACA,KAAKv1B,EAAM,OACN,KAAK,SAAS,QAAU,eAAe7kB,EAAA,KAAK,SAAL,YAAAA,EAAa,cAAe,GACtEi6C,GAAS,UAAU,CAClB,KAAM,OACN,IAAKp1B,CACT,CAAI,EACD,KAAK,OAAO,KAAKA,CAAI,GACf,KAAK,aAAa,KAAKA,CAAI,CACnC,CACA,iBAAkB,CACjB,GAAI,CACH,KAAK,oBAAmB,EACxB,KAAK,OAAS,IAAI,KAAK,qBAAqB,KAAK,QAAQ,EACzD,KAAK,wBAAuB,EAC5B,KAAK,uBAAsB,CAC5B,OAAS/gB,EAAO,CACf,MAAMqB,EAAMrB,aAAiB,MAAQA,EAAQ,IAAImf,GAAgB,4BAA4B,EAC7F,KAAK,SAAS,KAAK9d,CAAG,EACtB,KAAK,sBAAqB,CAC3B,CACD,CAKA,qBAAsB,CACrB,GAAI,CAAC,KAAK,OAAQ,OAClB,MAAMk1C,EAAY,KAAK,OACvB,KAAK,OAAS,OACd,KAAK,yBAAyBA,CAAS,EACvC,GAAI,CACHA,EAAU,MAAK,CAChB,MAAQ,CAAC,CACV,CACA,yBAA0B,CACpB,KAAK,SACV,KAAK,OAAO,iBAAiB,OAAQ,KAAK,eAAe,EACzD,KAAK,OAAO,iBAAiB,QAAS,KAAK,gBAAgB,EAC3D,KAAK,OAAO,iBAAiB,QAAS,KAAK,gBAAgB,EAC3D,KAAK,OAAO,iBAAiB,UAAW,KAAK,kBAAkB,EAChE,CACA,yBAAyBC,EAAQ,CAChC,GAAI,CACHA,EAAO,oBAAoB,OAAQ,KAAK,eAAe,EACvDA,EAAO,oBAAoB,QAAS,KAAK,gBAAgB,EACzDA,EAAO,oBAAoB,QAAS,KAAK,gBAAgB,EACzDA,EAAO,oBAAoB,UAAW,KAAK,kBAAkB,CAC9D,MAAQ,CAAC,CACV,CACA,YAAa,CACZ,KAAK,uBAAsB,EAC3B,KAAK,SAAS,KAAK,WAAW,EAC9B,KAAK,sBAAwB,KAAK,kBAClC,KAAK,kBAAiB,CACvB,CACA,YAAYC,EAAQ,CACnB,KAAK,uBAAsB,EACvB,KAAK,iBACR,KAAK,SAAS,KAAK,cAAc,EACjC,KAAK,qBAAoB,GACnB,KAAK,SAAS,KAAK,cAAc,CACzC,CACA,aAAc,CACb,MAAMz2C,EAAQ,IAAIwf,GAAyB,4BAA4B,EACvE,KAAK,SAAS,KAAKxf,CAAK,EACxB,KAAK,sBAAqB,CAC3B,CACA,cAAcskB,EAAO,CACpB6xB,GAAS,UAAU,CAClB,KAAM,OACN,IAAK7xB,EAAM,IACd,CAAG,EACD,KAAK,mBAAmB,KAAKA,CAAK,CACnC,CACA,uBAAwB,CACvB,KAAK,UAAS,CACf,CACA,sBAAuB,CACtB,KAAK,oBAAmB,EACxB,MAAMoyB,EAAgB,KAAK,uBAAyB,GAAK,KAAK,OAAM,EAAK,IACzE,KAAK,eAAiB,WAAW,IAAM,CAClC,KAAK,kBACR,KAAK,SAAS,KAAK,YAAY,EAC/B,KAAK,gBAAe,EACpB,KAAK,uBAAsB,EAE7B,EAAGA,CAAa,CACjB,CACA,wBAAyB,CACxB,KAAK,sBAAwB,KAAK,IAAI,KAAK,sBAAwB,EAAG,KAAK,iBAAiB,CAC7F,CACA,wBAAyB,CACxB,KAAK,uBAAsB,EAC3B,KAAK,uBAAyB,WAAW,IAAM,CAC9C,GAAI,KAAK,SAAS,QAAU,aAAc,CACzC,MAAM12C,EAAQ,IAAI2f,GAAsB,8BAA8B,EACtE,KAAK,SAAS,KAAK3f,CAAK,EACpB,KAAK,QAAQ,KAAK,OAAO,MAAK,CACnC,CACD,EAAG,KAAK,iBAAiB,CAC1B,CACA,wBAAyB,CACpB,KAAK,yBACR,aAAa,KAAK,sBAAsB,EACxC,KAAK,uBAAyB,OAEhC,CACA,qBAAsB,CACjB,KAAK,iBACR,aAAa,KAAK,cAAc,EAChC,KAAK,eAAiB,OAExB,CACA,mBAAoB,OACnB,KAAO,KAAK,aAAa,OAAS,KAAK9D,EAAA,KAAK,SAAL,YAAAA,EAAa,cAAe,GAAG,CACrE,MAAMujB,EAAU,KAAK,aAAa,MAAK,EACnCA,IAAY,QAAQ,KAAK,OAAO,KAAKA,CAAO,CACjD,CACD,CACD,EApLEhR,GAAK,+BAAiC,IAGtCA,GAAK,+BAAiC,IAGtCA,GAAK,8BAAgC,IARbA,IA0L1B,SAASkoC,GAAwBz3C,EAAO,CACvC,OAAOu5B,GAAiBv5B,CAAK,GAAKA,EAAM,SAAW,iBACpD,CAIA,MAAM03C,GAAWnzB,EAAS,EAC1B,IAAIozB,GAAmB,cAAcjxB,EAAY,CAChD,YAAYsE,EAAS4sB,EAAaC,EAAsBC,EAAWhxC,EAAS,CAC3E,MAAK,EACL,KAAK,QAAUkkB,EACf,KAAK,YAAc4sB,EACnB,KAAK,QAAU9wC,EACf,KAAK,UAAY,KAAK,oBAAoB,CAAC,EAC3C,KAAK,aAAe,GACpB,KAAK,YAAc,GACnB,KAAK,SAAW,IACR8R,GAAK2H,GAAY,CACvB,GAAIsZ,GAAoBtZ,CAAO,EAAG,GAAI,CACrCm3B,GAAS,MAAM,gCAAiC,CAAE,QAASn3B,EAAQ,GAAI,EACvE,KAAK,KAAKsV,GAAoBtV,EAAQ,EAAE,CAAC,CAC1C,OAASzf,EAAO,CACf42C,GAAS,MAAM,mDAAoD52C,CAAK,CACzE,CACD,CAAC,EAEF,KAAK,oBAAsB,IACnB2S,EAAQ8M,GAAY,CAC1B,GAAIk3B,GAAwBl3B,CAAO,EAAG,CACrC,GAAI,CACHm3B,GAAS,MAAM,0CAA2C,CAAE,OAAQn3B,EAAQ,GAAI,EAChF,KAAK,KAAKoU,GAAgBpU,EAAQ,EAAE,CAAC,CACtC,OAASzf,EAAO,CACf42C,GAAS,MAAM,4CAA6C52C,CAAK,CAClE,CACA,MAAO,EACR,CACA,MAAO,EACR,CAAC,EAEF,KAAK,mBAAqB,IAClB2S,EAAQ8M,GAAY,CAC1B,GAAI,CAACsZ,GAAoBtZ,CAAO,EAAG,MAAO,GAC1C,MAAMw3B,EAAex3B,EAAQ,OAAO,cACpC,GAAI,CAACw3B,EAAc,MAAO,GAC1B,GAAIx3B,EAAQ,OAAO,WAAW,WAAW,eAAe,EACvDm3B,OAAAA,GAAS,MAAM,4CAA4Cn3B,EAAQ,OAAO,UAAU,oBAAoBw3B,CAAY,GAAG,EAChH,GAER,MAAMC,EAAkB,KAAK,iBAC7B,GAAI,CAACA,EAAiB,MAAO,GAC7B,GAAI,CAACD,EAAa,SAASC,CAAe,EAAG,CAC5C,MAAMre,EAAYpZ,EAAQ,OAAO,WACjCm3B,OAAAA,GAAS,KAAK,uCAAuC/d,CAAS,kDAAkD,EACzG,EACR,CACA,MAAO,EACR,CAAC,EAEF,KAAK,mBAAqB,KAAK,cAAa,EAC5C,KAAK,sBAAwB,IAAIud,GAAoBW,EAAsBC,EAAW,KAAK,mBAAmB,eAAgB,CAC7H,kBAAmB1tB,EAAqB,SAAS,kBACjD,kBAAmBA,EAAqB,SAAS,kBACjD,kBAAmBA,EAAqB,SAAS,iBACpD,CAAG,EACD,KAAK,YAAY,KAAK,sBAAsB,QAAUtpB,GAAU,QAC/D9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,EAChB,CAAC,EACD,KAAK,aAAe8R,GAAM,IAAM3R,GAAK,KAAK,MAAK,CAAE,CAAC,EAAE,KAAK6W,GAAY,CAAC,EAAGY,EAAU,KAAK,UAAU,CAAC,EACnG,KAAK,iBAAmB,KAAK,sBAAsB,kBAAkB,KAAK5I,EAAKsV,GAAU,OACxF,GAAI,CACH,OAAO,KAAK,MAAMA,EAAM,IAAI,CAC7B,OAAStkB,EAAO,CACf42C,OAAAA,GAAS,MAAM,gDAAiD52C,CAAK,GACrE9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe,IAAIolB,GAAkBthB,CAAK,GACnC,IACR,CACD,CAAC,EAAG2S,EAAQ8M,GAAYA,IAAY,OAASiZ,GAAkBjZ,CAAO,GAAKgZ,GAAiBhZ,CAAO,EAAE,EAAGjM,GAAYxT,GAAU,OAC7H42C,OAAAA,GAAS,MAAM,wCAAyC52C,CAAK,GAC7D9D,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,GAClFsK,EACR,CAAC,EAAGsL,GAAK,EAAIgC,EAAU,KAAK,UAAU,CAAC,EACvC,KAAK,kBAAoB,KAAK,iBAAiB,KAAKjF,EAAO+lB,EAAiB,CAAC,EAC7E,KAAK,gBAAkB,KAAK,iBAAiB,KAAK,KAAK,WAAY,KAAK,oBAAmB,EAAI/lB,EAAQ8M,GAAY,CAACiZ,GAAkBjZ,CAAO,CAAC,EAAG,KAAK,qBAAsB7J,KAASgC,EAAU,KAAK,UAAU,CAAC,CAChN,CACA,MAAM,YAAYu/B,EAAU,CAC3B,KAAK,iBAAmBA,EACxB,KAAK,UAAU,KAAKA,CAAQ,EAC5B,MAAM,KAAK,yBAAyBA,CAAQ,CAC7C,CACA,IAAI,gBAAiB,CACpB,OAAO,KAAK,eACb,CACA,IAAI,mBAAoB,CACvB,OAAO,KAAK,sBAAsB,OACnC,CACA,MAAM,SAAU,CACf,OAAI,KAAK,cAAgB,KAAK,aAC7BP,GAAS,KAAK,6CAA6C,EACpD,QAAQ,QAAO,GAEhB,IAAI,QAAQ,CAACz3C,EAASC,IAAW,CACvC,KAAK,aAAe,GACpB,KAAK,YAAY,KAAK,aAAc,IAAM,CACzC,KAAK,sBAAsB,QAAO,EAClC,MAAMg4C,EAAgB,KAAK,sBAAsB,QAAQ,KAAKzkC,EAAQ8vB,GAAWA,IAAW,aAAeA,IAAW,cAAc,EAAG3tB,GAAK,CAAC,EAAG5R,GAAQ,GAAG,CAAC,EAAE,UAAU,CACvK,KAAOu/B,GAAW,OACjB,GAAIA,IAAW,YACd,KAAK,aAAe,GACpB,KAAK,YAAc,GACnBmU,GAAS,MAAM,oCAAoC,EACnDz3C,EAAO,MACD,CACN,KAAK,aAAe,GACpB,MAAMa,EAAQ,IAAI0f,GAAyB,mBAAmB,EAC9Dk3B,GAAS,MAAM,+BAA+B,GAC9C16C,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAe8D,GACfZ,EAAOY,CAAK,CACb,CACD,EACA,MAAQqB,GAAQ,OACf,KAAK,aAAe,GACpBu1C,GAAS,MAAM,gCAAiCv1C,CAAG,GACnDnF,EAAA,KAAK,UAAL,MAAAA,EAAA,UAAemF,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,EAAG,CAAE,MAAOA,CAAG,CAAE,GACjFjC,EAAOiC,CAAG,CACX,CACL,CAAK,EACD,KAAK,cAAc,KAAK+1C,CAAa,EACrC,KAAK,YAAY,KAAK,sBAAsB,QAAQ,KAAKzkC,EAAQ8vB,GAAWA,IAAW,cAAc,CAAC,EAAG,IAAM,CAC9GmU,GAAS,MAAM,0BAA0B,EACzC,KAAK,YAAc,EACpB,CAAC,CACF,CAAC,CACF,CAAC,CACF,CACA,WAAY,CACX,KAAK,sBAAsB,UAAS,CACrC,CACA,MAAM,QAAQrwC,EAASsP,EAAS,CAC/B,YAAK,KAAKtP,CAAO,EACV,IAAIiqC,GAAWjqC,EAAS,KAAK,kBAAmBsP,CAAO,EAAE,OACjE,CACA,KAAK4J,EAAS,CACb,MAAM2D,EAAU,KAAK,UAAU3D,CAAO,EACtC,KAAK,mBAAmB,KAAK2D,CAAO,CACrC,CACA,YAAa,CACZwzB,GAAS,MAAM,2BAA2B,EAC1C,KAAK,YAAc,GACnB,KAAK,aAAe,GACpB,KAAK,sBAAsB,WAAU,CACtC,CACA,SAAU,CACTA,GAAS,MAAM,wBAAwB,EACvC,KAAK,WAAU,EACf,MAAM,QAAO,EACb,KAAK,sBAAsB,QAAO,CACnC,CACA,MAAM,0BAA2B,CAChC,GAAI,CACH,MAAMS,EAAiB,MAAM,KAAK,QAAQ,QAAQ,KAAK,WAAW,EAClE,KAAK,iBAAmBA,GAAkB,OAC1C,KAAK,UAAU,KAAKA,GAAkB,MAAM,CAC7C,OAASr3C,EAAO,CACf42C,MAAAA,GAAS,MAAM,4CAA6C52C,CAAK,EAC3DA,CACP,CACD,CACA,MAAM,yBAAyBm3C,EAAU,CACxC,GAAI,CAACA,EAAU,CACd,GAAI,CACH,MAAM,KAAK,QAAQ,WAAW,KAAK,WAAW,CAC/C,OAASn3C,EAAO,CACf42C,MAAAA,GAAS,MAAM,0CAA2C52C,CAAK,EACzDA,CACP,CACA,MACD,CACA,GAAI,CACH,MAAMq3C,EAAiB,MAAM,KAAK,QAAQ,QAAQ,KAAK,WAAW,GAC9D,CAACA,GAAkBA,IAAmBF,IAAU,MAAM,KAAK,QAAQ,QAAQ,KAAK,YAAaA,CAAQ,CAC1G,OAASn3C,EAAO,CACf42C,MAAAA,GAAS,MAAM,wCAAyC52C,CAAK,EACvDA,CACP,CACD,CACA,MAAM,OAAQ,CACb,aAAM,KAAK,yBAAwB,EAC5B,EACR,CACD,EAIA,MAAM8iB,EAAWW,EAAS,EACpB6zB,GAA+B5zC,GAAgB,CACpD,GAAI,OAAOA,GAAgB,SAAU,CACpC,MAAM6zC,EAAkB7zC,EAAY,QAAQ,GAAG,EAC/C,GAAI6zC,IAAoB,GAAI,CAC3B,MAAMC,EAAc9zC,EAAY,UAAU6zC,EAAkB,CAAC,EACvDE,EAAU,IAAI,gBAAgBD,CAAW,EAAE,IAAI,SAAS,EAC9D,GAAIC,IAAY,QAAS,MAAO,CAC/B,MAAO,GACP,MAAO,GACP,aAAc,EAClB,EACQ,GAAIA,IAAY,QAAS,MAAO,CACpC,MAAO,GACP,MAAO,EACX,CACE,CACD,CACA,MAAO,CAAA,CACR,EAaG,IAACC,GAAa,cAAc9xB,EAAY,CAO1C,YAAY+xB,EAAoB9hC,EAAU,GAAI,CAC7C,MAAK,EACL,KAAK,YAAc,IAAIoU,GACvB,KAAK,OAAS,KAAK,sBAAsB,MAAM,EAC/C,KAAK,YAAc,KAAK,sBAAsB,MAAM,EACpD,KAAK,cAAgB,KAAK,sBAAsB,EAAK,EACrD,KAAK,eAAiB,KAAK,sBAAsB,EAAK,EACtD,KAAK,SAAW,KAAK,oBAAoB,CAAC,EAC1C,KAAK,WAAa,KAAK,oBAAoB,EAAE,EAC7C,KAAK,SAAW,CAAA,EAChB,KAAK,MAAQ,IAAI2C,GACjB,KAAK,oBAAsB+qB,EAC3B,KAAK,SAAW,CACf,GAAGruB,EAAqB,SAAS,yBACjC,GAAGzT,CACN,EACM,KAAK,SAAS,wBAAuB,KAAK,MAAM,YAAc,KAAK,SAAS,uBAC5E,KAAK,SAAS,iBAAgB,KAAK,MAAM,eAAiB,IAC1D,KAAK,SAAS,uBAAsB,KAAK,MAAM,UAAY,KAAK,SAAS,sBACzE,KAAK,SAAS,iBAAiB,KAAK,YAAY,sBAAsB,KAAK,MAAM,OAAO,EACxF,KAAK,SAAS,oBAAmB,KAAK,MAAM,kBAAoB,KAAK,SAAS,mBAC9E,KAAK,SAAS,SAAW,QAAQgN,GAAU,KAAK,SAAS,MAAM,EAC/D,KAAK,SAAS,UAAUI,GAAY,KAAK,SAAS,QAAQ,EAC1D,KAAK,SAAS,OAAOD,GAAgB,KAAK,SAAS,KAAK,EAC5D,KAAK,kBAAoB,KAAK,MAAM,iBAC/B,KAAK,SAAS,sBAAsB,KAAK,kBAAkB,uBAAsB,EACtF,KAAK,YAAY,KAAK,kBAAkB,QAAUhjB,GAAU,CAC3D,KAAK,SAAS,KAAKA,CAAK,CACzB,CAAC,EACD,KAAK,yBAAwB,EAC7B,KAAK,qBAAqB,KAAK,IAAM,CACpC,KAAK,KAAI,EAAG,MAAOA,GAAU,CAC5B8iB,EAAS,MAAM,qCAAsC9iB,CAAK,EAC1D,KAAK,MAAM,QAAQ,WAAW,sBAAsB,EACpD,KAAK,MAAM,QAAQ,WAAW,uBAAwB,OAAO,EAC7D,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CAAC,CACF,CAAC,EAAE,MAAOA,GAAU,CACnB8iB,EAAS,MAAM,qCAAsC9iB,CAAK,EAC1D,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CAAC,CACF,CAIA,MAAM,UAAW,OAChB,IAAI9D,EAAA,KAAK,eAAL,MAAAA,EAAmB,YAAa,OAAO,KAAK,aAAa,YAC7D,GAAI,CACH,KAAK,aAAe,IAAIqyB,GACxB,MAAMqpB,EAAc,MAAM,KAAK,aAAa,KAAI,EAChD90B,OAAAA,EAAS,MAAM,sDAAsD,EAC9D80B,CACR,OAAS53C,EAAO,CACf8iB,EAAS,KAAK,oEAAqE9iB,CAAK,EACxF,KAAK,aAAe,OACpB,MACD,CACD,CASA,MAAM,oBAAqB,CAC1B,MAAM43C,EAAc,MAAM,KAAK,SAAQ,EAsBvC,GArBA,KAAK,oBAAsB,IAAIjD,GAA6B,KAAK,aAAc,CAC9E,KAAM,KAAK,MAAM,KACjB,SAAU,CACT,QAAU30C,GAAU,KAAK,SAAS,KAAKA,CAAK,EAC5C,UAAY63C,GAAY,KAAK,WAAW,KAAKA,CAAO,EACpD,mBAAoB,IAAM,KAAK,KAAK,WAAU,CAClD,EACG,MAAO,CACN,KAAM,IAAM,KAAK,MAAM,WACvB,MAAQ5vB,GAAe,CACtB,KAAK,MAAM,WAAaA,CACzB,EACA,MAAQ6vB,GAAY,CACnB,KAAK,MAAM,WAAa,CACvB,GAAG,KAAK,MAAM,WACd,GAAGA,CACT,CACI,EACA,QAAU7vB,GAAe,KAAK,kBAAkBA,CAAU,CAC9D,CACA,CAAG,EACG,KAAK,oBAAqB,OAAO,KAAK,oBAAoB,KAAK,oBAAqB,OAAQ2vB,CAAW,EAC3G,UAAWtrB,KAAS,KAAK,MAAM,eAAiB,CAAC,QAAS,SAAS,EAAI,CAAC,SAAS,EAAG,GAAI,CACvF,MAAMxG,EAAS,MAAM,KAAK,MAAM,QAAQ,QAAQ,uBAAwBwG,CAAK,EAC7E,GAAIxG,GAAA,MAAAA,EAAQ,MACXhD,OAAAA,EAAS,MAAM,6CAA6CwJ,CAAK,SAAS,EACnE,MAAM,KAAK,oBAAoB,OAAQxG,CAAM,CAEtD,MAAQ,CAAC,CACT,MAAM,IAAIvG,GAAwB,yHAAyH,CAC5J,CACA,MAAM,oBAAoBo4B,EAAoBI,EAAaH,EAAa,SACvE,MAAMI,EAAeJ,KAAgB17C,EAAA,KAAK,eAAL,MAAAA,EAAmB,YAAc,KAAK,aAAa,YAAc,QAChG+7C,EAAeF,IAAgBJ,EAAqB,MAAMA,EAAmB,aAAaK,EAAe,CAAE,YAAaA,CAAY,EAAK,MAAM,EAAI,QACzJ,GAAI,CAACC,EAAc,MAAM,IAAI14B,GAAwB,2BAA2B,EAChF,GAAI04B,EAAa,MAAO,GAAI,CAC3B,MAAMC,EAAepzB,GAAUmzB,EAAa,MAAO,CAAE,OAAQ,GAAM,EACnE,KAAK,MAAM,GAAKC,EAAa,EAC9B,OAASl4C,EAAO,CACf8iB,MAAAA,EAAS,MAAM,0DAA2D9iB,CAAK,EACzE,IAAIuf,GAAwB,6CAA8C,CAAE,MAAOvf,CAAK,CAAE,CACjG,CACA,GAAI,CAACi4C,EAAa,OAAS,CAACA,EAAa,mBACxCn1B,MAAAA,EAAS,MAAM,4DAA4D,EACrE,IAAIvD,GAAwB,+CAA+C,EAElF,GAAI,CAAC,KAAK,MAAM,gBAAkB04B,EAAa,WAAaA,EAAa,UAAY,KAAK,MACzFn1B,MAAAA,EAAS,MAAM,iDAAiD,EAC1D,IAAIvD,GAAwB,oCAAoC,EAcvE,GAZI04B,EAAa,YAAaN,GAAA,MAAAA,EAAoB,UAASx7C,EAAA,KAAK,sBAAL,MAAAA,EAA0B,yBAAyBw7C,EAAoBM,EAAa,WACtIA,EAAa,WAAa,EAACN,GAAA,MAAAA,EAAoB,WACvD70B,EAAS,KAAK,iEAAiEm1B,EAAa,SAAS,mGAAmG,EACxM,KAAK,WAAW,KAAK,CACpB,KAAM,gCACN,OAAQ,qBACR,QAAS,gIACT,UAAWA,EAAa,SAC5B,CAAI,GAEF,KAAK,MAAM,WAAaA,EACxB,KAAK,kBAAkBA,CAAY,EAC/B,KAAK,aAAe,KAAK,eAAe,eAAiBA,EAAa,MAAO,GAAI,CACpF,MAAM,KAAK,eAAe,eAAeA,EAAa,KAAK,EAC3Dn1B,EAAS,KAAK,sDAAsD,CACrE,OAAS9iB,EAAO,CACf8iB,EAAS,MAAM,+DAAgE9iB,CAAK,EACpF,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CACD,CAEA,kBAAkBioB,EAAY,CACxBA,EAAW,QAChB,KAAK,MAAM,QAAQ,QAAQ,uBAAwBA,CAAU,EACzD,KAAK,MAAM,gBAAgB,KAAK,MAAM,QAAQ,QAAQ,uBAAwBA,EAAY,OAAO,EACtG,CACA,MAAM,MAAO,CAIZ,GAHA,KAAK,OAAO,KAAK,IAAIoL,GAAK,KAAK,MAAM,IAAI,CAAC,EACrC,KAAK,SAAS,gBAAgB,MAAM,KAAK,QAAO,EACjD,CAAC,KAAK,SAAS,wBAA0B,KAAK,gBAAgB,MAAM,KAAK,eAAe,MAAK,EAC7F,CAAC,KAAK,SAAS,aAAc,GAAI,CACpC,MAAM,KAAK,SAAQ,CACpB,OAASrzB,EAAO,CACf8iB,EAAS,MAAM,oCAAqC9iB,CAAK,EACzD,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CACA,KAAK,kBAAiB,CACvB,CACA,MAAM,mBAAoB,CACzB,GAAI,CAAC,KAAK,eAAgB,CACzB8iB,EAAS,MAAM,4CAA4C,EAC3D,MACD,CACA,GAAK,KAAK,SAAS,uBACnB,GAAI,CACH,MAAM,KAAK,eAAe,cAAa,CACxC,OAAS9iB,EAAO,CACf8iB,EAAS,MAAM,yCAA0C9iB,CAAK,EAC9D,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CACD,CAsCA,MAAM,SAAU,WACf,MAAM,KAAK,4BAA2B,EACtC,GAAI,CACH,MAAM6sB,EAAO,KAAK,OAAO,MACzB,GAAI,CAACA,EAAM,MAAM,IAAI1N,GAAgB,qCAAqC,EAC1E,GAAI,CAAC,MAAMnR,GAAe6e,EAAK,QAAQ,EAAG,MAAM,IAAI1N,GAAgB,2DAA2D,EAC/H,KAAK,MAAM,KAAO0N,CACnB,OAAS7sB,EAAO,CACf8iB,MAAAA,EAAS,MAAM,kDAAkD9iB,aAAiB,MAAQA,EAAM,QAAU,eAAe,4DAA4D,EAC/K,IAAImf,GAAgB,kCAAmC,CAAE,MAAOnf,CAAK,CAAE,CAC9E,CACA,MAAM6zC,EAAgB7zC,GAAU,CAC/B,KAAK,SAAS,KAAKA,CAAK,CACzB,EACA,KAAK,WAAa,IAAI62C,GAAiB,KAAK,MAAM,QAAS,KAAK,MAAM,YAAa,KAAK,MAAM,UAAWvtB,EAAqB,SAAS,WAAa,KAAK,MAAM,UAAWuqB,CAAY,EACtL,KAAK,eAAiB,IAAI5e,GAAc,KAAK,MAAM,QAAS,KAAK,MAAM,iBAAkB3L,EAAqB,SAAS,sBAAuB,KAAK,MAAM,gBAAgB,EACzK,KAAK,eAAiB,IAAI+nB,GAAqB,IAAM,KAAK,MAAM,WAAY,KAAK,WAAY,KAAK,MAAM,QAAS,KAAK,MAAM,sBAAuB,KAAK,MAAM,iBAAkB,KAAK,eAAgB,KAAK,MAAM,kBAAmB,KAAK,cAAcn1C,EAAA,KAAK,kBAAL,YAAAA,EAAsB,cAAc,EAC1R,KAAK,eAAiB,IAAI42C,GAAqB,KAAK,cAAc,EAClE,KAAK,eAAe,kBAAoB,SAAY,SACnD,GAAK,KAAK,oBACV,GAAI,CACH,MAAM8E,GAAc17C,EAAA,KAAK,eAAL,MAAAA,EAAmB,YAAc,KAAK,aAAa,YAAc,OACrF4mB,EAAS,MAAM,8DAA8D,EAC7E,MAAMgyB,EAAiB,MAAM,KAAK,oBAAoB,aAAa8C,EAAc,CAAE,YAAAA,GAAgB,MAAM,EACzG,KAAK,MAAM,WAAa9C,EACpBA,EAAe,WAAa,KAAK,oBAAoB,WAAS34C,EAAA,KAAK,sBAAL,MAAAA,EAA0B,yBAAyB,KAAK,oBAAqB24C,EAAe,YAC9JhyB,EAAS,MAAM,8DAA8D,CAC9E,OAAS9iB,EAAO,CACf8iB,MAAAA,EAAS,MAAM,4DAA6D9iB,CAAK,EACjF,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,EACxFA,CACP,CACD,EACA,KAAK,YAAY,KAAK,eAAe,QAAUA,GAAU,CACxD,KAAK,SAAS,KAAKA,CAAK,CACzB,CAAC,EACD,MAAM,KAAK,eAAe,QAAO,EACjC,OAAM7D,EAAA,KAAK,sBAAL,YAAAA,EAA0B,SAAS,KAAK,MAAM,KAAM,KAAK,iBAC/D,KAAK,YAAY,KAAK,eAAe,eAAe,KAAKib,GAAK,CAAC,EAAGzE,EAAO,OAAO,CAAC,EAAG,SAAY,OAC/F,GAAI,CACH,OAAMzW,EAAA,KAAK,sBAAL,YAAAA,EAA0B,SAAS,KAAK,MAAM,KAAM,KAAK,gBAChE,OAAS8D,EAAO,CACf8iB,EAAS,MAAM,kEAAmE9iB,CAAK,EACvF,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CACA,GAAI,CACH8iB,EAAS,MAAM,kDAAkD,EACjE,MAAM,KAAK,SAAQ,EACnBA,EAAS,MAAM,8DAA8D,CAC9E,OAAS9iB,EAAO,CACf8iB,EAAS,MAAM,uDAAwD9iB,CAAK,EAC5E,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,CAC/F,CACD,CAAC,EACD,MAAM8sB,EAAsB,IAAIumB,GAAqB,KAAK,eAAgB,KAAK,MAAM,KAAM,IAAM,KAAK,MAAM,qBAAoB,EAAIQ,CAAY,EAC1IpC,EAAY,IAAIsE,GAAiB,KAAK,MAAM,KAAM,KAAK,eAAgBjpB,EAAqB+mB,CAAY,EAC9G,KAAK,YAAY,KAAKpC,CAAS,EAC/B,KAAK,eAAe,aAAaA,CAAS,EAC1C,KAAK,cAAc,KAAK,EAAI,GAC5B3qC,EAAA,KAAK,wBAAL,MAAAA,EAA4B,OAAO,aAAc,aACjD,KAAK,YAAY,KAAK,eAAe,eAAe,KAAKsQ,GAAK,CAAC,EAAGzE,EAAO,OAAO,CAAC,EAAG,IAAM,QACzFzW,EAAA,KAAK,wBAAL,MAAAA,EAA4B,OAAO,aAAc,cAClD,CAAC,CACF,CAYA,IAAI,OAAQ,CACX,OAAO,KAAK,cAAc,KAAK,OAAO,aAAY,CAAE,CACrD,CAEA,IAAI,MAAO,CACV,OAAO,KAAK,OAAO,KACpB,CAaA,IAAI,YAAa,CAChB,OAAO,KAAK,cAAc,KAAK,YAAY,aAAY,CAAE,CAC1D,CAKA,IAAI,WAAY,CACf,OAAO,KAAK,YAAY,KACzB,CAEA,IAAI,eAAgB,CACnB,OAAO,KAAK,cAAc,KAAK,eAAe,aAAY,CAAE,CAC7D,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,eAAe,KAC5B,CAEA,IAAI,aAAc,CACjB,OAAO,KAAK,cAAc,KAC3B,CAEA,IAAI,cAAe,CAClB,OAAO,KAAK,cAAc,KAAK,cAAc,aAAY,CAAE,CAC5D,CAEA,IAAI,QAAS,CACZ,OAAO,KAAK,uBAAuB,SAAU,IAAM,KAAK,cAAc,KAAKsb,GAAW2gC,GAAcA,EAAY,KAAK,eAAe,eAAiB1qC,GAAG,EAAK,CAAC,CAAC,CAAC,CACjK,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,cAAc,KAAK,SAAS,aAAY,CAAE,CACvD,CAWA,IAAI,WAAY,CACf,OAAO,KAAK,cAAc,KAAK,WAAW,aAAY,CAAE,CACzD,CAEA,IAAI,sBAAuB,CAC1B,YAAK,wBAAL,KAAK,sBAA0BkiB,GAA2B,KAAK,SAAS,iBAAiB,GAClF,KAAK,qBACb,CAEA,IAAI,kBAAmB,CACtB,OAAO,KAAK,cAAc,KAAK,kBAAkB,gBAAgB,CAClE,CAKA,mBAAoB,CACnB,MAAM/E,EAAU,CACf,WAAY,KAAK,kBACjB,YAAa,KAAK,mBAClB,WAAY,KAAK,iBACpB,EACQwtB,EAAO,CACZ,WAAY,UACZ,UAAW,OAAO,UAAc,IAAc,UAAU,UAAY,UACpE,aAAc,KAAK,qBACnB,OAAQ,CAAA,EACR,MAAO,CAAA,EACP,cAAe,CAAA,EACf,QAAAxtB,CACH,EACE,GAAI,CAAC,KAAK,sBAAuB,OAAOwtB,EACxC,MAAMtU,EAAM,KAAK,sBAAsB,OAAM,EAC7C,MAAO,CACN,GAAGsU,EACH,WAAYtU,EAAI,WAChB,UAAWA,EAAI,UACf,OAAQA,EAAI,OACZ,MAAOA,EAAI,MACX,cAAeA,EAAI,cACnB,QAAAlZ,CACH,CACC,CAKA,0BAA2B,CAC1B,GAAI,CACH,KAAK,sBAAwB+E,GAA2B,KAAK,SAAS,iBAAiB,CACxF,OAAS3vB,EAAO,CACf8iB,EAAS,KAAK,uDAAwD9iB,CAAK,CAC5E,CACA,GAAI,CACH,KAAK,gBAAkB,IAAIgvB,EAC5B,OAAShvB,EAAO,CACf8iB,EAAS,KAAK,oDAAqD9iB,CAAK,CACzE,CACA,GAAI,CACH,KAAK,sBAAwB,IAAI8yB,GACjC,KAAK,YAAY,KAAK,sBAAsB,kBAAkB,KAAKngB,EAAQ2R,GAAUA,EAAM,KAAO,WAAagF,EAAqB,SAAS,uBAAuB,CAAC,EAAG,IAAM,CAC7KxG,EAAS,MAAM,mDAAmD,EAClE,GAAI,CACH,KAAK,kBAAkB,wBAAuB,EAC9C,KAAK,kBAAkB,uBAAsB,CAC9C,MAAQ,CAAC,CACV,CAAC,CACF,OAAS9iB,EAAO,CACf8iB,EAAS,KAAK,0DAA2D9iB,CAAK,CAC/E,CACA,GAAI,CACH,KAAK,sBAAwB,IAAIs1C,GAAqB,CAAE,WAAY,YAAY,CAAE,CACnF,OAASt1C,EAAO,CACf8iB,EAAS,KAAK,0DAA2D9iB,CAAK,CAC/E,CACD,CAeA,MAAM,YAAa,UAClB9D,EAAA,KAAK,sBAAL,MAAAA,EAA0B,WAC1BC,EAAA,KAAK,wBAAL,MAAAA,EAA4B,OAAO,aAAc,gBACjD,MAAM,KAAK,4BAA2B,EACtC,KAAK,cAAc,KAAK,EAAK,CAC9B,CAKA,MAAM,6BAA8B,CACnC,MAAMk5B,EAAU,KAAK,eACfic,EAAY,KAAK,WACvB,GAAIjc,EAAS,CACZ,GAAI,CACH,MAAMA,EAAQ,WAAU,CACzB,OAASr1B,EAAO,CACf8iB,EAAS,KAAK,qDAAsD9iB,CAAK,CAC1E,CACAq1B,EAAQ,QAAO,CAChB,CACIic,GAAWA,EAAU,QAAO,EAChC,KAAK,eAAiB,OACtB,KAAK,eAAiB,OACtB,KAAK,WAAa,OAClB,KAAK,eAAiB,MACvB,CACA,MAAM,oBAAqB,CAC1B,MAAMtjC,GAAe,KAAK,OAAO,KAAK2E,EAAQ0lC,GAAYA,IAAY,EAAI,CAAC,CAAC,CAC7E,CASA,MAAM,UAAW,CAChB,GAAI,CACH,MAAM,KAAK,mBAAkB,EAC7B,MAAM,KAAK,WAAW,QAAQvkB,GAAW,CACxC,OAAQ,oBACR,OAAQ,CAAA,CACZ,CAAI,CAAC,EACF,KAAK,eAAe,KAAK,EAAI,EAC7B,MACD,OAAS9zB,EAAO,CACf,GAAI,CAAC,KAAK,MAAM,WAAW,MAC1B,WAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,EACxFA,EAEP8iB,EAAS,MAAM,kEAAkE,EACjF,GAAI,CACH,MAAM,KAAK,eAAe,eAAe,KAAK,MAAM,WAAW,KAAK,EACpEA,EAAS,MAAM,+DAA+D,EAC9E,MAAM,KAAK,WAAW,QAAQgR,GAAW,CACxC,OAAQ,oBACR,OAAQ,CAAA,CACb,CAAK,CAAC,EACF,KAAK,eAAe,KAAK,EAAI,CAC9B,OAASwkB,EAAa,CACrBx1B,EAAS,MAAM,0DAA2Dw1B,CAAW,EACrF,MAAMC,EAAgB,IAAIh5B,GAAwB,oGAAqG,CAAE,MAAO+4B,aAAuB,MAAQA,EAAc,IAAI,MAAM,OAAOA,CAAW,EAAG,CAAE,MAAOA,CAAW,CAAE,EAAG,EACrQ,WAAK,SAAS,KAAKC,CAAa,EAC1BA,CACP,CACD,CACD,CAMA,MAAM,YAAa,CAClB,GAAI,CACH,MAAM,KAAK,WAAW,QAAQzkB,GAAW,CACxC,OAAQ,qBACR,OAAQ,CAAA,CACZ,CAAI,CAAC,EACF,KAAK,eAAe,KAAK,EAAK,CAC/B,OAAS9zB,EAAO,CACf8iB,MAAAA,EAAS,MAAM,0CAA2C9iB,CAAK,EAC/D,KAAK,SAAS,KAAKA,aAAiB,MAAQA,EAAQ,IAAI,MAAM,OAAOA,CAAK,EAAG,CAAE,MAAOA,CAAK,CAAE,CAAC,EACxFA,CACP,CACD,CAyBA,MAAM,KAAK0D,EAAamS,EAAU,GAAI,CACrC,MAAM2iC,EAAmB,CACxB,GAAGlvB,EAAqB,SAAS,sBACjC,GAAGguB,GAA4B5zC,CAAW,EAC1C,GAAGmS,CACN,EACE,aAAM,KAAK,mBAAkB,EAC7BiN,EAAS,MAAM,qCAAsC01B,CAAgB,EAC9D,KAAK,eAAe,mBAAmB90C,EAAa80C,CAAgB,CAC5E,CAqBA,MAAM,UAAU90C,EAAamS,EAAS,CACrC,MAAM4a,EAAa,KAAK,eAAe,YAAcnH,EAAqB,SAAS,YAAc,CAAA,EAC3FoH,EAAc,KAAK,cAAc,MACvC,OAAO,IAAIH,GAAgB,KAAK,kBAAmBE,EAAYC,EAAa,EAAG,MAAO9Z,EAAM6hC,IAAS,KAAK,KAAK7hC,EAAM6hC,CAAI,EAAG5iC,CAAO,EAAE,IAAInS,CAAW,CACrJ,CAEA,IAAI,SAAU,CACb,OAAO,KAAK,cACb,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,cAAc,KAAK,kBAAkB,kBAAkB,CACpE,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBAAkB,iBAC/B,CAEA,IAAI,qBAAsB,CACzB,OAAO,KAAK,cAAc,KAAK,kBAAkB,mBAAmB,CACrE,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,kBAAkB,kBAC/B,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,cAAc,KAAK,kBAAkB,kBAAkB,CACpE,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAK,kBAAkB,iBAC/B,CAEA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,cAAc,KAAK,kBAAkB,yBAAyB,CAC3E,CAEA,IAAI,4BAA6B,CAChC,OAAO,KAAK,cAAc,KAAK,kBAAkB,0BAA0B,CAC5E,CAEA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,cAAc,KAAK,kBAAkB,yBAAyB,CAC3E,CAEA,IAAI,0BAA2B,CAC9B,OAAO,KAAK,kBAAkB,wBAC/B,CAEA,IAAI,2BAA4B,CAC/B,OAAO,KAAK,kBAAkB,yBAC/B,CAEA,IAAI,0BAA2B,CAC9B,OAAO,KAAK,kBAAkB,wBAC/B,CAEA,IAAI,qCAAsC,CACzC,OAAO,KAAK,kBAAkB,mCAC/B,CAEA,IAAI,qCAAsC,CACzC,OAAO,KAAK,kBAAkB,mCAC/B,CAEA,wBAAwBinB,EAAY,CACnC,OAAO,KAAK,kBAAkB,wBAAwBA,CAAU,CACjE,CAEA,uBAAuBrC,EAAQ,CAC9B,KAAK,kBAAkB,uBAAuBA,CAAM,CACrD,CAEA,uBAAuBA,EAAQ,CAC9B,KAAK,kBAAkB,uBAAuBA,CAAM,CACrD,CAEA,wBAAwBA,EAAQ,CAC/B,KAAK,kBAAkB,wBAAwBA,CAAM,CACtD,CAeA,MAAM,+BAA+B/pB,EAAS,CAC7C,MAAM+pB,EAAS,KAAK,kBAAkB,0BACtC,GAAI,EAACA,GAAA,MAAAA,EAAQ,UAAU,MAAO,GAC9B,MAAMowB,EAAWn6C,EACjB,GAAI,OAAOm6C,EAAS,WAAc,WACjC51B,OAAAA,EAAS,KAAK,gEAAgE,EACvE,GAER,GAAI,CACH,aAAM41B,EAAS,UAAUpwB,EAAO,QAAQ,EACjC,EACR,OAAStoB,EAAO,CACf8iB,OAAAA,EAAS,KAAK,oDAAqD9iB,CAAK,EACjE,EACR,CACD,CAEA,wBAAyB,CACxB,KAAK,kBAAkB,uBAAsB,CAC9C,CAEA,yBAA0B,CACzB,KAAK,kBAAkB,wBAAuB,CAC/C,CAMA,MAAM,sBAAsB2qB,EAAY,CACvC,OAAO,KAAK,kBAAkB,sBAAsBA,CAAU,CAC/D,CAMA,MAAM,cAAcA,EAAY,CAC/B,OAAO,KAAK,kBAAkB,cAAcA,CAAU,CACvD,CAEA,kBAAkBD,EAAgB,CACjC,KAAK,kBAAkB,kBAAkBA,CAAc,CACxD,CAEA,MAAM,kBAAmB,CACxB,OAAO,KAAK,kBAAkB,iBAAgB,CAC/C,CAEA,MAAM,kBAAmB,CACxB,OAAO,KAAK,kBAAkB,iBAAgB,CAC/C,CAEA,mBAAoB,CACnB,KAAK,kBAAkB,kBAAiB,CACzC,CAEA,kBAAmB,CAClB,KAAK,kBAAkB,iBAAgB,CACxC,CAEA,mBAAoB,CACnB,KAAK,kBAAkB,kBAAiB,CACzC,CAEA,kBAAmB,CAClB,KAAK,kBAAkB,iBAAgB,CACxC,CAEA,IAAI,qBAAsB,CACzB,OAAO,KAAK,cAAc,KAAK,kBAAkB,mBAAmB,CACrE,CAEA,IAAI,qBAAsB,CACzB,OAAO,KAAK,cAAc,KAAK,kBAAkB,mBAAmB,CACrE,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,kBAAkB,kBAC/B,CAEA,IAAI,oBAAqB,CACxB,OAAO,KAAK,kBAAkB,kBAC/B,CASA,MAAM,wBAAwB7U,EAAU,CACvC,MAAO,GACP,MAAO,EACT,EAAI,CACF,MAAMqW,EAAc,CACnB,MAAOrW,EAAQ,OAAS,GACxB,MAAOA,EAAQ,OAAS,EAC3B,EACE,IAAI8iC,EAAe,GACfC,EAAe,GACfC,EACAC,EACJ,GAAI,CACH,MAAM7Z,GAAU,MAAM,KAAK,MAAM,kBAAkB,aAAa,aAAa/S,CAAW,GAAG,UAAS,EACpG,UAAWqF,KAAS0N,EAAQ,CAC3B,MAAM8Z,EAAWxnB,EAAM,YAAW,EAC9BA,EAAM,OAAS,SAClBonB,EAAe,GACXI,EAAS,WAAUF,EAAsB,KAAK,kBAAkB,KAAM/8C,GAAMA,EAAE,WAAai9C,EAAS,QAAQ,IACtGxnB,EAAM,OAAS,UACzBqnB,EAAe,GACXG,EAAS,WAAUD,EAAsB,KAAK,kBAAkB,KAAMh9C,GAAMA,EAAE,WAAai9C,EAAS,QAAQ,IAEjHxnB,EAAM,KAAI,CACX,CACD,OAASvxB,EAAO,CACf8iB,EAAS,KAAK,gDAAiD9iB,CAAK,CACrE,CAEA,GADA,MAAM,KAAK,kBAAkB,iBAAgB,EACzC24C,GAAgBE,EAAqB,CACxC,MAAMG,EAAgBH,EAAoB,SAC1CA,EAAsB,KAAK,kBAAkB,KAAM/8C,GAAMA,EAAE,WAAak9C,CAAa,GAAKH,CAC3F,CACA,GAAID,GAAgBE,EAAqB,CACxC,MAAMG,EAAgBH,EAAoB,SAC1CA,EAAsB,KAAK,kBAAkB,KAAMh9C,GAAMA,EAAE,WAAam9C,CAAa,GAAKH,CAC3F,CACA,OAAIH,GAAgBE,GAAuB,CAAC,KAAK,0BAA0B,KAAK,uBAAuBA,CAAmB,EACtHD,GAAgBE,GAAuB,CAAC,KAAK,0BAA0B,KAAK,uBAAuBA,CAAmB,EACnH,CACN,MAAOH,EACP,MAAOC,EACP,oBAAAC,EACA,oBAAAC,CACH,CACC,CAOA,MAAM,iBAAkB,CACvB,MAAM,KAAK,MAAM,QAAQ,SAAQ,EACjC,MAAMrL,EAAQnkB,EAAqB,SACnCmkB,EAAM,oBAAsB,KAC5BA,EAAM,qBAAuB,KAC7BA,EAAM,oBAAsB,KAC5B,MAAM,KAAK,kBAAkB,iBAAgB,CAC9C,CAUA,SAAU,gBACTvxC,EAAA,KAAK,sBAAL,MAAAA,EAA0B,UAC1B,KAAK,oBAAsB,QAC3BC,EAAA,KAAK,eAAL,MAAAA,EAAmB,UACnB,KAAK,eAAe,qBAAoB,EACxC,KAAK,WAAW,QAAO,EACvB,KAAK,eAAe,QAAO,EAC3B,GAAI,EACH2K,EAAA,KAAK,kBAAL,MAAAA,EAAsB,SACvB,MAAQ,CAAC,CACT,GAAI,EACH2H,EAAA,KAAK,wBAAL,MAAAA,EAA4B,SAC7B,MAAQ,CAAC,CACT,GAAI,EACH40B,EAAA,KAAK,wBAAL,MAAAA,EAA4B,SAC7B,MAAQ,CAAC,CACT,KAAK,gBAAkB,OACvB,KAAK,sBAAwB,OAC7B,KAAK,sBAAwB,OAC7B,MAAM,QAAO,CACd,CACD,EAIA,MAAMtoB,GAAS0I,EAAS,EAErB,IAACy1B,GAA+B,KAAM,CACxC,YAAYl7C,EAAMm7C,EAAY,CAC7B,KAAK,KAAOn7C,EACZ,KAAK,WAAam7C,CACnB,CACA,MAAM,UAAW,CAChB,MAAM3xB,EAAM,WAAW,KAAK,IAAI,4BAC1BE,EAAY,IACZE,EAAa,IAAI,gBACjBC,EAAY,WAAW,IAAMD,EAAW,MAAK,EAAIF,CAAS,EAChE,GAAI,CACH,MAAMlD,EAAW,MAAM,MAAMgD,EAAK,CACjC,OAAQ,OACR,QAAS,CAAE,eAAgB,kBAAkB,EAC7C,KAAM,KAAK,UAAU,CAAE,MAAO,KAAK,WAAY,EAC/C,OAAQI,EAAW,MACvB,CAAI,EAED,GADA,aAAaC,CAAS,EAClBrD,EAAS,GAAI,OAAQ,MAAMA,EAAS,KAAI,GAAI,MAChD,MAAM,IAAI3E,GAAa,0CAA0C2E,EAAS,MAAM,IAAIA,EAAS,UAAU,EAAE,CAC1G,OAASxkB,EAAO,CAEf,MADA,aAAa6nB,CAAS,EAClB7nB,aAAiB,OAASA,EAAM,OAAS,aAAoB,IAAI4f,GAAoB,yBAAyB8H,CAAS,KAAM,CAAE,MAAO1nB,CAAK,CAAE,GACjJ+a,GAAO,MAAM,4CAA6C/a,CAAK,EACzDA,EACP,CACD,CACA,MAAM,cAAe,CACpB,MAAO,CACN,MAAO,MAAM,KAAK,SAAQ,EAC1B,UAAW,KAAK,IAAG,EAAK,KAAO,GAClC,CACC,CACA,MAAM,SAAU,CACf,OAAO,KAAK,aAAY,CACzB,CACD,EAwCIo5C,GAA2B,KAAM,CACpC,YAAYrB,EAAa,CACxB,KAAK,YAAcA,CACpB,CAEA,MAAM,cAAe,CACpB,OAAO,QAAQ,QAAQ,KAAK,WAAW,CACxC,CACD,GA2BuB,IAAM,CAC5B,GAAI,OAAO,OAAW,IAAa,CAClC,MAAMzzB,EAAQ,IAAI,YAAY,sBAAuB,CAAE,OAAQ,CAAE,QAAS,YAAY,EAAI,EAC1F,OAAO,cAAcA,CAAK,CAC3B,CACD,GACc,uMC7iXd,MAAMvJ,GAAS0I,EAAA,EAGF41B,EAAAA,YAAN,cAA0BC,EAAW,CAArC,aAAA,CAAA,MAAA,GAAA,SAAA,EAmE2B,KAAA,OAA6B,KAU7D,KAAQ,mBAAyC,KACjD,KAAQ,oBAAsB,GAC9B,KAAQ,eAAiC,CAAA,CAAC,CAI1C,mBAAoB,CAClB,MAAM,kBAAA,EACF,CAAC,KAAK,QAAU,KAAK,WAAW,0BAAA,EAChC,KAAK,SACP,KAAK,mBAAqB,KAAK,OAC/B,KAAK,oBAAsB,KAAK,uBAAuB,KAAK,MAAM,EAEtE,CAEU,QAAQC,EAA+C,eAU/D,GATA,MAAM,QAAQA,CAAiB,EAG3BA,EAAkB,IAAI,MAAM,IAC9B,KAAK,4BAAA,EACD,CAAC,KAAK,QAAU,KAAK,WAAW,0BAAA,GAIlCA,EAAkB,IAAI,QAAQ,EAAG,CACnC,KAAK,4BAAA,EACL,MAAM/6C,EAAS,KAAK,OACdg7C,EAAY,KAAK,uBAAuBh7C,CAAM,EACpD,GAAIA,IAAW,KAAK,oBAAsBg7C,IAAc,KAAK,oBAAqB,CAChF,KAAK,mBAAqBh7C,EAC1B,KAAK,oBAAsBg7C,EAC3B,MAAMphB,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,mBACzCk8B,GAAO95B,GAAkB85B,EAAO55B,CAAM,CAC5C,CACF,CAOA,GAAI,CAAC,KAAK,QAAU,CAAC,KAAK,MAAQ+6C,EAAkB,IAAI,YAAY,EAAG,CACrE,MAAM/6C,IAASrC,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,KAC1Cq9C,EAAY,KAAK,uBAAuBh7C,CAAM,EACpD,GAAIA,IAAW,KAAK,oBAAsBg7C,IAAc,KAAK,oBAAqB,CAChF,KAAK,mBAAqBh7C,EAC1B,KAAK,oBAAsBg7C,EAC3B,MAAMphB,GAAQtxB,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,mBACzCsxB,GAAO95B,GAAkB85B,EAAO55B,CAAM,CAC5C,CACF,CAGI+6C,EAAkB,IAAI,eAAe,GACvC,KAAK,eAAalW,GAAA50B,EAAA,KAAK,gBAAL,YAAAA,EAAoB,sBAApB,YAAA40B,EAAyC,WAAY,EAAE,CAE7E,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,4BAAA,EACL,KAAK,qBAAA,CACP,CAIQ,2BAAkC,CACnC,KAAK,MACV,KAAK,eAAe,KAClB,KAAK,KAAK,cAAc,UAAW7kC,GAA+B,OAChE,MAAMg7C,EAAY,KAAK,uBAAuBh7C,CAAM,EACpD,GAAIA,IAAW,KAAK,oBAAsBg7C,IAAc,KAAK,oBAC3D,OAEF,KAAK,mBAAqBh7C,EAC1B,KAAK,oBAAsBg7C,EAC3B,KAAK,cAAA,EACL,MAAMphB,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,mBACzCk8B,GAAO95B,GAAkB85B,EAAO55B,CAAM,CAC5C,CAAC,CAAA,CAEL,CAEQ,uBAAuBA,EAAoC,CACjE,OAAKA,EACEA,EAAO,YAAY,IAAKxD,GAAM,GAAGA,EAAE,IAAI,IAAIA,EAAE,EAAE,EAAE,EAAE,KAAA,EAAO,KAAK,GAAG,EADrD,EAEtB,CAEQ,6BAAoC,CAC1C,KAAK,eAAe,QAAS6qB,GAAQA,EAAI,aAAa,EACtD,KAAK,eAAiB,CAAA,CACxB,CAIQ,aAAakb,EAAwB,OAC3C,MAAM3I,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,mBAGxCk8B,GAAA,MAAAA,EAAO,WACZA,EAAM,UAAU2I,CAAQ,EAAE,MAAO1/B,GAAQ,CACvC0Z,GAAO,MAAM,mDAAoD1Z,CAAG,CACtE,CAAC,CACH,CAIQ,sBAA6B,OACnC,MAAM+2B,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,mBACzCk8B,MAAyBA,CAAK,CACpC,CAIA,QAAS,CACP,OAAOqhB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,2BAUgB,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAShD,CACF,EArNaJ,EAAAA,YACJ,OAASK;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IA4DYC,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA7DfP,cA6DiB,UAAA,OAAA,CAAA,EAMIM,GAAA,CAA/BC,EAAS,CAAE,UAAW,EAAA,CAAO,CAAA,EAnEnBP,cAmEqB,UAAA,SAAA,CAAA,EAIxBM,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAtEIgxC,cAuEH,UAAA,aAAA,CAAA,EAIAM,GAAA,CAFPE,GAAQ,CAAE,QAASx7C,GAAgB,UAAW,GAAM,EACpDgK,EAAA,CAAM,EA1EIgxC,cA2EH,UAAA,gBAAA,CAAA,EA3EGA,EAAAA,YAANM,GAAA,CADNG,GAAc,eAAe,CAAA,EACjBT,aAAA,uMCPAU,EAAAA,YAAN,cAA0BT,EAAW,CAArC,aAAA,CAAA,MAAA,GAAA,SAAA,EAeuC,KAAA,OAAS,GAS5C,KAAQ,mBAAyC,KACjD,KAAQ,oBAAqC,CAAA,EAC7C,KAAQ,YAA0C,KAE3D,KAAQ,qBAAuC,CAAA,CAAC,CAEtC,QAAQhjB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,gBAAA,EACD,KAAK,MAAM,KAAK,aAAa,KAAK,IAAI,EAE9C,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,gBAAA,CACP,CAEQ,aAAal4B,EAAkB,CACrC,KAAK,qBAAqB,KACxBA,EAAK,aAAa,UAAWlD,GAAO,KAAK,mBAAqBA,CAAE,EAChEkD,EAAK,cAAc,UAAWxC,GAAO,KAAK,oBAAsBA,CAAE,EAClEwC,EAAK,MAAM,UAAWlD,GAAO,KAAK,YAAcA,CAAE,CAAA,CAEtD,CAEQ,iBAAwB,CAC9B,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,mBAAqB,KAC1B,KAAK,oBAAsB,CAAA,EAC3B,KAAK,YAAc,IACrB,CAEQ,eAAyC,aAC/C,MAAMsqC,EAAS,KAAK,MAAOtpC,EAAA,KAAK,cAAL,YAAAA,EAAkB,IAAK4K,GAAA3K,EAAA,KAAK,aAAL,YAAAA,EAAiB,OAAjB,YAAA2K,EAAuB,GACzE,OAAK0+B,GACU,KAAK,KAAO,KAAK,sBAAsB/2B,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,CAAA,GACzE,KAAMwsB,GAAUA,EAAM,YAAcuK,CAAM,EAF3C,MAGf,CAEA,QAAS,OACP,MAAMvK,EAAQ,KAAK,cAAA,EACnB,GAAI,CAACA,EAAO,OAAO,KAEnB,MAAMiE,EAAc,KAAK,KACrB,KAAK,qBACLhjC,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAe,KAEpC,GAAI,IADoBgjC,GAAA,YAAAA,EAAa,iBAAiB,SAAU,GAAK,GAChD,OAAO,KAE5B,MAAM8a,EAAQ;AAAA;AAAA,aAEL/e,EAAM,CAAC;AAAA,cACNA,EAAM,CAAC;AAAA,eACNA,EAAM,KAAK;AAAA,gBACVA,EAAM,MAAM;AAAA,iBACXA,EAAM,QAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA,MAM5Bgf,EAAa,KAAK,OACpB,4DACA,GAEJ,OAAOR;AAAAA,2DACgDO,CAAK;AAAA;AAAA;AAAA;AAAA,iEAICC,CAAU;AAAA;AAAA;AAAA;AAAA;AAAA,uBAKpD/a,CAAW;AAAA;AAAA;AAAA,KAIhC,CACF,EA3Ga6a,EAAAA,YACJ,OAASL;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAc4BC,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAf/BG,cAeiC,UAAA,SAAA,CAAA,EAGhBJ,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAlBfG,cAkBiB,UAAA,OAAA,CAAA,EAIpBJ,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EArBI0xC,cAsBH,UAAA,aAAA,CAAA,EAESJ,GAAA,CAAhBtxC,EAAA,CAAM,EAxBI0xC,cAwBM,UAAA,qBAAA,CAAA,EACAJ,GAAA,CAAhBtxC,EAAA,CAAM,EAzBI0xC,cAyBM,UAAA,sBAAA,CAAA,EACAJ,GAAA,CAAhBtxC,EAAA,CAAM,EA1BI0xC,cA0BM,UAAA,cAAA,CAAA,EA1BNA,EAAAA,YAANJ,GAAA,CADNG,GAAc,eAAe,CAAA,EACjBC,aAAA,EC/Bb;AAAA;AAAA;AAAA;AAAA,GAKA,MAAM/+C,GAAE,CAAC,UAAU,EAAE,MAAM,CAAkD,EAAEC,GAAE,GAAG,IAAI,KAAK,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAE,IAAAi/C,GAAC,KAAO,CAAC,YAAYl/C,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,KAAKA,EAAEC,EAAEM,EAAE,CAAC,KAAK,KAAKP,EAAE,KAAK,KAAKC,EAAE,KAAK,KAAKM,CAAC,CAAC,KAAKP,EAAEC,EAAE,CAAC,OAAO,KAAK,OAAOD,EAAEC,CAAC,CAAC,CAAC,OAAOD,EAAEC,EAAE,CAAC,OAAO,KAAK,OAAO,GAAGA,CAAC,CAAC,CAAC,ECJ3S;AAAA;AAAA;AAAA;AAAA,GAIG,MAAMA,WAAUI,EAAC,CAAC,YAAYE,EAAE,CAAC,GAAG,MAAMA,CAAC,EAAE,KAAK,GAAGP,EAAEO,EAAE,OAAOL,GAAE,MAAM,MAAM,MAAM,KAAK,YAAY,cAAc,uCAAuC,CAAC,CAAC,OAAOG,EAAE,CAAC,GAAGA,IAAIL,GAASK,GAAN,KAAQ,OAAO,KAAK,GAAG,OAAO,KAAK,GAAGA,EAAE,GAAGA,IAAIE,GAAE,OAAOF,EAAE,GAAa,OAAOA,GAAjB,SAAmB,MAAM,MAAM,KAAK,YAAY,cAAc,mCAAmC,EAAE,GAAGA,IAAI,KAAK,GAAG,OAAO,KAAK,GAAG,KAAK,GAAGA,EAAE,MAAMH,EAAE,CAACG,CAAC,EAAE,OAAOH,EAAE,IAAIA,EAAE,KAAK,GAAG,CAAC,WAAW,KAAK,YAAY,WAAW,QAAQA,EAAE,OAAO,CAAA,CAAE,CAAC,CAAC,CAACD,GAAE,cAAc,aAAaA,GAAE,WAAW,EAAE,MAAME,GAAEG,GAAEL,EAAC,ECuBtgBk/C,GAAQ,CACnB,UC7Ba;AAAA;AAAA;AAAA;AAAA;AAAA,ED8Bb,SE9Ba;AAAA,EF+Bb,KG/Ba;AAAA,EHgCb,aIhCa;AAAA;AAAA;AAAA,EJiCb,YKjCa;AAAA;AAAA;AAAA,ELkCb,eMlCa;AAAA,ENmCb,aOnCa;AAAA;AAAA;AAAA,EPoCb,MQpCa;AAAA,ERqCb,kBSrCa;AAAA;AAAA;AAAA,ETsCb,WUtCa;AAAA;AAAA;AAAA,EVuCb,aWvCa;AAAA,EXwCb,cYxCa;AAAA,EZyCb,UazCa;AAAA;AAAA;AAAA,Eb0Cb,Sc1Ca;AAAA;AAAA;AAAA,Ed2Cb,Oe3Ca;AAAA;AAAA;AAAA,Ef4Cb,agB5Ca;AAAA;AAAA;AAAA,EhB6Cb,YiB7Ca;AAAA;AAAA;AAAA,EjB8Cb,KkB9Ca;AAAA;AAAA;AAAA,ElB+Cb,emB/Ca;AAAA;AAAA;AAAA;AAAA,EnBgDb,mBoBhDa;AAAA;AAAA;AAAA;AAAA,EpBiDb,YqBjDa;AAAA;AAAA;AAAA;AAAA,ErBkDb,SsBlDa;AAAA;AAAA;AAAA,EtBmDb,cuBnDa;AAAA;AAAA;AAAA,EvBoDb,awBpDa;AAAA;AAAA;AAAA,ExBqDb,QyBrDa;AAAA;AAAA;AAAA;AAAA,EzBsDb,U0BtDa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,E1BuDb,W2BvDa;AAAA;AAAA;AAAA;AAAA;AAAA,C3BwDf,uM4BlDA,MAAMC,GAAe,GAiBRC,EAAAA,SAAN,cAAuBf,EAAW,CAAlC,aAAA,CAAA,MAAA,GAAA,SAAA,EAcwB,KAAA,KAAiB,QAClB,KAAA,KAAec,EAAA,CAE3C,QAAS,CACP,MAAMtW,EAAMqW,GAAM,KAAK,IAAI,EAE3B,GAAI,CAACrW,EACH,OAAO2V,IAGT,MAAMa,EAAQxW,EAAI,QAAQ,OAAQ,eAAe,KAAK,IAAI,aAAa,KAAK,IAAI,GAAG,EAEnF,OAAO2V,IAAOc,GAAWD,CAAK,CAAC,EACjC,CACF,EA5BaD,EAAAA,SACJ,OAASX;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAaaC,GAAA,CAA5BC,EAAS,CAAE,QAAS,EAAA,CAAM,CAAA,EAdhBS,WAckB,UAAA,OAAA,CAAA,EACDV,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAffS,WAeiB,UAAA,OAAA,CAAA,EAfjBA,EAAAA,SAANV,GAAA,CADNG,GAAc,YAAY,CAAA,EACdO,UAAA,uMCIAG,EAAAA,cAAN,cAA4BlB,EAAW,CAAvC,aAAA,CAAA,MAAA,GAAA,SAAA,EAE2B,KAAA,OAA6B,KAQjB,KAAA,OAAS,GAU5C,KAAQ,mBAAyC,KAE1D,KAAQ,qBAAuC,CAAA,EAGtC,KAAQ,aAAe,SAGhC,KAAQ,gBAAsC,IAAA,CAwC9C,IAAY,kBAAuC,OACjD,OAAI,KAAK,OAAe,KAAK,OACzB,KAAK,KAAa,KAAK,qBACpBp9C,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAe,IACzC,CAEA,IAAY,iBAA2B,OACrC,OAAO,KAAK,cAAcA,EAAA,KAAK,gBAAL,YAAAA,EAAoB,aAAc,EAC9D,CAEU,cAAqB,OAG7B,MAAMk8B,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,SACzCk8B,GACFA,EAAM,iBAAiB,QAAS,IAAM,CAC/B,KAAK,iBACRA,EAAM,OAAO,MAAM,IAAM,CAAC,CAAC,CAE/B,CAAC,CAEL,CAEU,QAAQmhB,EAA+C,SAC/D,MAAM,QAAQA,CAAiB,EAE3BA,EAAkB,IAAI,MAAM,IAC9B,KAAK,gBAAA,EACD,KAAK,MAAM,KAAK,aAAa,KAAK,IAAI,GAG5C,MAAMkB,EAAkB,KAAK,iBAMvBC,EACJnB,EAAkB,IAAI,QAAQ,GAC9BA,EAAkB,IAAI,MAAM,GAC5BA,EAAkB,IAAI,oBAAoB,GACzCA,EAAkB,IAAI,YAAY,GAAKkB,IAAoB,KAAK,gBAEnE,GAAIC,EAAkB,CACpB,MAAMtiB,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,SACzCk8B,IACF,KAAK,gBAAkBqiB,EACvBn8C,GAAkB85B,EAAOqiB,CAAe,EACxC,KAAK,mBAAA,EAET,CAKA,IACElB,EAAkB,IAAI,YAAY,GAClCA,EAAkB,IAAI,eAAe,GACrCmB,IAEI,CAAC,KAAK,gBAAiB,CACzB,MAAMtiB,GAAQj8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,SACzCi8B,GACFA,EAAM,OAAO,MAAM,IAAM,CAAC,CAAC,CAE/B,CAEJ,CAEA,sBAA6B,OAC3B,MAAM,qBAAA,EACN,MAAMA,GAAQl8B,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAc,SACzCk8B,MAAyBA,CAAK,EAClC,KAAK,gBAAA,CACP,CAEQ,aAAah6B,EAAkB,CACrC,KAAK,qBAAqB,KACxBA,EAAK,aAAa,UAAWlD,GAAO,KAAK,mBAAqBA,CAAE,CAAA,CAEpE,CAEQ,iBAAwB,CAC9B,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,mBAAqB,IAC5B,CAGQ,oBAA2B,CACjC,MAAMsD,EAAS,KAAK,iBACpB,GAAI,CAACA,EAAQ,OAEb,MAAM+yB,EAAQ/yB,EAAO,eAAA,EAAiB,CAAC,EACvC,GAAI,CAAC+yB,EAAO,OAEZ,MAAMwnB,EAAWxnB,EAAM,YAAA,EACjBopB,EAAI5B,EAAS,MACbr9C,EAAIq9C,EAAS,OAEf4B,GAAKj/C,GAAKi/C,EAAI,GAAKj/C,EAAI,IACzB,KAAK,aAAe,GAAGi/C,CAAC,MAAMj/C,CAAC,GAC/B,KAAK,MAAM,YAAY,2BAA4B,KAAK,YAAY,EAExE,CAEA,QAAS,CACP,OAAO+9C;AAAAA;AAAAA,QAEH,KAAK,gBACHA;AAAAA;AAAAA,kBAGA,IAAI;AAAA,KAEZ,CACF,EAxLae,EAAAA,cA8BJ,OAASd;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IA5BgBC,GAAA,CAA/BC,EAAS,CAAE,UAAW,EAAA,CAAO,CAAA,EAFnBY,gBAEqB,UAAA,SAAA,CAAA,EAGsCb,GAAA,CAArEC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,cAAe,CAAA,EALzDY,gBAK2D,UAAA,aAAA,CAAA,EAG1Cb,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EARfY,gBAQiB,UAAA,OAAA,CAAA,EAEgBb,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAV/BY,gBAUiC,UAAA,SAAA,CAAA,EAIpCb,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAbImyC,gBAcH,UAAA,aAAA,CAAA,EAIAb,GAAA,CAFPE,GAAQ,CAAE,QAASx7C,GAAgB,UAAW,GAAM,EACpDgK,EAAA,CAAM,EAjBImyC,gBAkBH,UAAA,gBAAA,CAAA,EAESb,GAAA,CAAhBtxC,EAAA,CAAM,EApBImyC,gBAoBM,UAAA,qBAAA,CAAA,EAKAb,GAAA,CAAhBtxC,EAAA,CAAM,EAzBImyC,gBAyBM,UAAA,eAAA,CAAA,EAzBNA,EAAAA,cAANb,GAAA,CADNG,GAAc,iBAAiB,CAAA,EACnBU,eAAA,ECXN,MAAMI,GAAYlB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,uMCgBZmB,EAAAA,eAAN,cAA6BvB,EAAW,CAAxC,aAAA,CAAA,MAAA,GAAA,SAAA,EA2HI,KAAQ,oBAAqC,CAAA,EAC7C,KAAQ,oBAAyC,CAAA,EACjD,KAAQ,YAA0C,KAE3D,KAAQ,qBAAuC,CAAA,EAG/C,KAAQ,YAA6B,KAErC,KAAQ,oBAAuB,GAAmB,CAChD,MAAMvhB,EAAS,EAAE,OACb,CAACA,EAAO,QAAQ,eAAe,GAAK,CAACA,EAAO,QAAQ,gBAAgB,IACtE,KAAK,YAAc,KAEvB,EAEA,KAAQ,cAAiB,GAA2B,CAC9C,EAAE,MAAQ,UAAY,KAAK,cAAgB,OAC7C,KAAK,YAAc,KAEvB,CAAA,CAEA,mBAAoB,CAClB,MAAM,kBAAA,EACN,SAAS,iBAAiB,QAAS,KAAK,mBAAmB,EAC3D,SAAS,iBAAiB,UAAW,KAAK,aAAa,CACzD,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,SAAS,oBAAoB,QAAS,KAAK,mBAAmB,EAC9D,SAAS,oBAAoB,UAAW,KAAK,aAAa,EAC1D,KAAK,gBAAA,CACP,CAEU,QAAQzB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,gBAAA,EACD,KAAK,MACP,KAAK,qBAAqB,KACxB,KAAK,KAAK,cAAc,UAAW16B,GAAO,KAAK,oBAAsBA,CAAE,EACvE,KAAK,KAAK,cAAc,UAAWC,GAAO,KAAK,oBAAsBA,CAAE,EACvE,KAAK,KAAK,MAAM,UAAWX,GAAO,KAAK,YAAcA,CAAE,CAAA,EAI/D,CAEQ,iBAAwB,CAC9B,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,oBAAsB,CAAA,EAC3B,KAAK,oBAAsB,CAAA,EAC3B,KAAK,YAAc,IACrB,CAIQ,YAAY4mC,EAAkB7mC,EAAgB,CACpDA,EAAE,gBAAA,EACF,KAAK,YAAc,KAAK,cAAgB6mC,EAAW,KAAOA,CAC5D,CAEQ,gBAAgBA,EAAkB,OAExC,OADqB,KAAK,KAAO,KAAK,sBAAsB5lC,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,CAAA,GACzE,KAAML,GAAMA,EAAE,KAAOimC,CAAQ,CACnD,CAEA,MAAc,iBAAiBA,EAAkB7mC,EAAyB,CACxEA,EAAE,gBAAA,EACF,MAAMq9B,EAAc,KAAK,gBAAgBwJ,CAAQ,EACjD,GAAKxJ,EACL,IAAI,CACEA,EAAY,WACd,MAAMA,EAAY,OAAA,EAElB,MAAMA,EAAY,KAAA,EAEpB,KAAK,cACH,IAAI,YAAY,4BAA6B,CAC3C,OAAQ,CAAE,YAAAA,EAAa,SAAAwJ,CAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,MAAQ,CAER,CACA,KAAK,YAAc,KACrB,CAEA,MAAc,iBAAiBA,EAAkB7mC,EAAyB,CACxEA,EAAE,gBAAA,EACF,MAAMq9B,EAAc,KAAK,gBAAgBwJ,CAAQ,EACjD,GAAKxJ,EACL,IAAI,CACEA,EAAY,WACd,MAAMA,EAAY,YAAA,EAElB,MAAMA,EAAY,UAAA,EAEpB,KAAK,cACH,IAAI,YAAY,4BAA6B,CAC3C,OAAQ,CAAE,YAAAA,EAAa,SAAAwJ,CAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,MAAQ,CAER,CACA,KAAK,YAAc,KACrB,CAEA,MAAc,cAAcA,EAAkB7mC,EAAyB,CACrEA,EAAE,gBAAA,EACF,MAAMq9B,EAAc,KAAK,gBAAgBwJ,CAAQ,EACjD,GAAKxJ,GAAA,MAAAA,EAAa,OAClB,IAAI,CACF,MAAMA,EAAY,OAAA,EAClB,KAAK,cACH,IAAI,YAAY,wBAAyB,CACvC,OAAQ,CAAE,YAAAA,EAAa,SAAAwJ,CAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,MAAQ,CAER,CACA,KAAK,YAAc,KACrB,CAIQ,iBAAkB,CACxB,OAAO2X;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,KAOT,CAEQ,oBAAoB3X,EAAkB,CAC5C,MAAMxJ,EAAc,KAAK,gBAAgBwJ,CAAQ,EAC3CgZ,EAAS,KAAK,cAAgBhZ,EAEpC,OAAO2X;AAAAA;AAAAA,+BAEoBqB,EAAS,OAAS,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAO/B7/C,GAAa,KAAK,iBAAiB6mC,EAAU7mC,CAAC,CAAC;AAAA,wBAC3Cq9B,GAAA,MAAAA,EAAa,WAAa,eAAiB,YAAY;AAAA;AAAA,YAEnEA,GAAA,MAAAA,EAAa,WAAa,SAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKnCr9B,GAAa,KAAK,iBAAiB6mC,EAAU7mC,CAAC,CAAC;AAAA,wBAC3Cq9B,GAAA,MAAAA,EAAa,WAAa,eAAiB,eAAe;AAAA;AAAA,YAEtEA,GAAA,MAAAA,EAAa,WAAa,eAAiB,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKlDr9B,GAAa,KAAK,cAAc6mC,EAAU7mC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAO9D,CAEQ,eAAeggC,EAAoB8f,EAAiB,CAC1D,MAAMjZ,EAAW7G,EAAM,UACjB+f,EAAU,iBAAiBD,EAAS,WAAa,EAAE,GAEnDf,EAAQ;AAAA;AAAA,aAEL/e,EAAM,CAAC;AAAA,cACNA,EAAM,CAAC;AAAA,eACNA,EAAM,KAAK;AAAA,gBACVA,EAAM,MAAM;AAAA,iBACXA,EAAM,QAAU,EAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,MAOlC,OAAOwe;AAAAA,oBACSuB,CAAO,2BAA2BhB,CAAK;AAAA,UAChDe,EAcC,KAbAtB;AAAAA;AAAAA;AAAAA;AAAAA,yBAIcx+C,GAAa,KAAK,YAAY6mC,EAAU7mC,CAAC,CAAC;AAAA;AAAA,iCAEnC,KAAK,cAAgB6mC,CAAQ;AAAA;AAAA;AAAA,kBAG5C,KAAK,iBAAiB;AAAA;AAAA,gBAExB,KAAK,oBAAoBA,CAAQ,CAAC;AAAA,aAElC;AAAA,+BACeA,CAAQ;AAAA;AAAA,KAGrC,CAEA,QAAS,aACP,MAAMmZ,EAAS,KAAK,KAAO,KAAK,sBAAsB/+C,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,CAAA,EACjFspC,EAAS,KAAK,MAAOrpC,EAAA,KAAK,cAAL,YAAAA,EAAkB,IAAKsS,GAAA3H,EAAA,KAAK,aAAL,YAAAA,EAAiB,OAAjB,YAAA2H,EAAuB,GAEnEysC,EAAWD,EACd,OAAQhgB,GAAUA,EAAM,SAAS,EACjC,IAAKA,GAAU,KAAK,eAAeA,EAAOA,EAAM,YAAcuK,CAAM,CAAC,EAExE,OAAOiU;AAAAA,QACHyB,CAAQ;AAAA;AAAA,KAGd,CACF,EAvWaL,EAAAA,eACJ,OAAS,CAACD,GAAWlB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAiH3B,EAIOC,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EArHIwyC,iBAsHH,UAAA,aAAA,CAAA,EAGoBlB,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAzHfiB,iBAyHiB,UAAA,OAAA,CAAA,EAEXlB,GAAA,CAAhBtxC,EAAA,CAAM,EA3HIwyC,iBA2HM,UAAA,sBAAA,CAAA,EACAlB,GAAA,CAAhBtxC,EAAA,CAAM,EA5HIwyC,iBA4HM,UAAA,sBAAA,CAAA,EACAlB,GAAA,CAAhBtxC,EAAA,CAAM,EA7HIwyC,iBA6HM,UAAA,cAAA,CAAA,EAKTlB,GAAA,CADPtxC,EAAA,CAAM,EAjIIwyC,iBAkIH,UAAA,cAAA,CAAA,EAlIGA,EAAAA,eAANlB,GAAA,CADNG,GAAc,iBAAiB,CAAA,EACnBe,gBAAA,uMCEb,MAAM9/B,GAAS0I,EAAA,EAGF03B,EAAAA,sBAAN,cAAoC7B,EAAW,CAA/C,aAAA,CAAA,MAAA,GAAA,SAAA,EA6HL,KAAA,cAAgB,GAGhB,KAAA,WAAa,GAGb,KAAA,QAAU,GASD,KAAQ,oBAAyC,CAAA,EACjD,KAAQ,oBAAgC,CAAA,EAEjD,KAAQ,qBAAuC,CAAA,EAEtC,KAAQ,QAAU,IAClB,KAAQ,UAAY,EAAA,CAEnB,QAAQhjB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,qBAAqB,QAASp7B,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,oBAAsB,CAAA,EAC3B,KAAK,oBAAsB,CAAA,EACvB,KAAK,MACP,KAAK,qBAAqB,KACxB,KAAK,KAAK,cAAc,UAAWW,GAAO,KAAK,oBAAsBA,CAAE,EACvE,KAAK,KAAK,cAAc,UAAWJ,GAAO,KAAK,oBAAsBA,CAAE,CAAA,EAI/E,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,qBAAqB,QAASP,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,CAC9B,CAIA,IAAY,cAAe,OAEzB,OADqB,KAAK,KAAO,KAAK,sBAAsBgB,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,CAAA,GACzE,KAAML,GAAMA,EAAE,KAAO,KAAK,aAAa,CAC7D,CAEA,IAAY,eAA0B,OACpC,OAAO,KAAK,KAAO,KAAK,sBAAsBK,EAAA,KAAK,aAAL,YAAAA,EAAiB,eAAgB,CAAA,CACjF,CAEA,IAAY,eAAyB,CACnC,OAAO,KAAK,cAAc,SAAS,iBAAiB,CACtD,CAEA,IAAY,eAAyB,CACnC,OAAO,KAAK,cAAc,SAAS,iBAAiB,CACtD,CAEA,IAAY,YAAsB,CAChC,OAAO,KAAK,cAAc,SAAS,cAAc,CACnD,CAIA,MAAc,kBAAmB,CAC/B,MAAML,EAAI,KAAK,aACf,GAAKA,EACL,GAAI,CACEA,EAAE,WACJ,MAAMA,EAAE,OAAA,EAER,MAAMA,EAAE,KAAA,CAEZ,OAASwF,EAAK,CACZ0Z,GAAO,MAAM,6CAA8C1Z,CAAG,CAChE,CACF,CAEA,MAAc,kBAAmB,CAC/B,MAAMxF,EAAI,KAAK,aACf,GAAKA,EACL,GAAI,CACEA,EAAE,WACJ,MAAMA,EAAE,YAAA,EAER,MAAMA,EAAE,UAAA,CAEZ,OAASwF,EAAK,CACZ0Z,GAAO,MAAM,6CAA8C1Z,CAAG,CAChE,CACF,CAEA,MAAc,SAAU,CACtB,MAAMxF,EAAI,KAAK,aACf,GAAKA,GAAA,MAAAA,EAAG,OACR,GAAI,CACF,MAAMA,EAAE,OAAA,CACV,OAASwF,EAAK,CACZ0Z,GAAO,MAAM,uCAAwC1Z,CAAG,CAC1D,CACF,CAEQ,gBAAgB,EAAU,CAChC,KAAK,QAAU,SAAU,EAAE,OAA4B,MAAO,EAAE,EAChE,KAAK,cACH,IAAI,YAAY,+BAAgC,CAC9C,OAAQ,CAAE,cAAe,KAAK,cAAe,OAAQ,KAAK,OAAA,EAC1D,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CAEQ,YAAa,CACnB,KAAK,UAAY,CAAC,KAAK,UACvB,KAAK,cACH,IAAI,YAAY,4BAA6B,CAC3C,OAAQ,CAAE,cAAe,KAAK,cAAe,OAAQ,KAAK,SAAA,EAC1D,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CAIA,QAAS,CACP,MAAMxF,EAAI,KAAK,aACf,GAAI,CAACA,EAAG,OAAO49C,2EAEf,MAAM2B,EAAa,KAAK,eAAiB,KAAK,eAAiB,KAAK,YAAc,KAAK,YAAc,KAAK,QAE1G,OAAO3B;AAAAA;AAAAA,wCAE6B59C,EAAE,MAAQ,aAAa;AAAA;AAAA;AAAA,YAGlDu/C,EAAmEC,EAAtD5B,gDAA6D;AAAA;AAAA,YAE3E,KAAK,cACHA;AAAAA,gCACkB59C,EAAE,WAAa,SAAW,EAAE,WAAW,KAAK,gBAAgB;AAAA,qCACvDA,EAAE,WAAa,UAAY,QAAQ;AAAA,oBACpDA,EAAE,WAAa,SAAW,MAAM;AAAA;AAAA,gBAGtCw/C,CAAO;AAAA;AAAA,YAET,KAAK,cACH5B;AAAAA,gCACkB59C,EAAE,WAAa,SAAW,EAAE,WAAW,KAAK,gBAAgB;AAAA,qCACvDA,EAAE,WAAa,aAAe,WAAW;AAAA,oBAC1DA,EAAE,WAAa,eAAiB,eAAe;AAAA;AAAA,gBAGrDw/C,CAAO;AAAA;AAAA,YAET,KAAK,WACH5B;AAAAA;AAAAA;AAAAA;AAAAA,8BAIgB,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAMb,OAAO,KAAK,OAAO,CAAC;AAAA,6BACpB,KAAK,eAAe;AAAA;AAAA;AAAA,gBAInC4B,CAAO;AAAA;AAAA,YAET,KAAK,QACH5B;AAAAA,gCACkB,KAAK,UAAY,SAAW,EAAE,WAAW,KAAK,UAAU;AAAA;AAAA,oBAEpE,KAAK,UAAY,QAAU,KAAK;AAAA;AAAA,gBAGtC4B,CAAO;AAAA;AAAA,YAET,KAAK,WACH5B;AAAAA,gDACkC,KAAK,OAAO;AAAA;AAAA;AAAA;AAAA,gBAK9C4B,CAAO;AAAA;AAAA;AAAA,KAInB,CACF,EAvUaF,EAAAA,sBACJ,OAAS,CAACP,GAAWlB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAyH3B,EAGDC,GAAA,CADCC,EAAS,CAAE,KAAM,OAAQ,UAAW,iBAAkB,CAAA,EA5H5CuB,wBA6HX,UAAA,gBAAA,CAAA,EAGAxB,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,cAAe,CAAA,EA/HzDuB,wBAgIX,UAAA,aAAA,CAAA,EAGAxB,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,WAAY,CAAA,EAlItDuB,wBAmIX,UAAA,UAAA,CAAA,EAIQxB,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAtII8yC,wBAuIH,UAAA,aAAA,CAAA,EAGoBxB,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA1IfuB,wBA0IiB,UAAA,OAAA,CAAA,EAEXxB,GAAA,CAAhBtxC,EAAA,CAAM,EA5II8yC,wBA4IM,UAAA,sBAAA,CAAA,EACAxB,GAAA,CAAhBtxC,EAAA,CAAM,EA7II8yC,wBA6IM,UAAA,sBAAA,CAAA,EAIAxB,GAAA,CAAhBtxC,EAAA,CAAM,EAjJI8yC,wBAiJM,UAAA,UAAA,CAAA,EACAxB,GAAA,CAAhBtxC,EAAA,CAAM,EAlJI8yC,wBAkJM,UAAA,YAAA,CAAA,EAlJNA,EAAAA,sBAANxB,GAAA,CADNG,GAAc,yBAAyB,CAAA,EAC3BqB,uBAAA,uMCHb,MAAMpgC,GAAS0I,EAAA,EAGF63B,EAAAA,aAAN,cAA2BhC,EAAW,CAAtC,aAAA,CAAA,MAAA,GAAA,SAAA,EA+EI,KAAQ,mBAAyC,KAE1D,KAAQ,qBAAuC,CAAA,EAWnB,KAAA,KAAO,EAKQ,KAAA,YAAyC,WAMb,KAAA,YAAc,GAKzD,KAAA,QAAU,GAK7B,KAAQ,QAAoB,CAAA,EA8BrC,KAAQ,YAAc,GAGtB,KAAQ,cAAgB,EAAA,CA/DxB,IAAY,kBAA4C,OACtD,OAAI,KAAK,OAAe,KAAK,OACzB,KAAK,KAAa,KAAK,oBAAsB,SAC1Cp9C,EAAA,KAAK,aAAL,YAAAA,EAAiB,cAAe,MACzC,CAgEA,mBAAoB,CAClB,MAAM,kBAAA,EACN,KAAK,QAAU,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,CAAC,EAC1C,MAAMq/C,EAAM,KAAK,iBACb,KAAK,aAAe,CAACA,EACvB,KAAK,kBAAA,EACIA,IACT,KAAK,cAAgBA,EACrB,KAAK,mBAAA,EAET,CAQU,QAAQhC,EAA+C,CAwB/D,GAvBA,MAAM,QAAQA,CAAiB,EAE3BA,EAAkB,IAAI,MAAM,IAC9B,KAAK,qBAAqB,QAASr+C,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,mBAAqB,KACtB,KAAK,MACP,KAAK,qBAAqB,KACxB,KAAK,KAAK,aAAa,UAAWA,GAAO,KAAK,mBAAqBA,CAAE,CAAA,GAKvEq+C,EAAkB,IAAI,aAAa,GAAK,KAAK,aAAe,CAAC,KAAK,kBACpE,KAAK,kBAAA,EAILA,EAAkB,IAAI,QAAQ,GAC9BA,EAAkB,IAAI,MAAM,GAC5BA,EAAkB,IAAI,oBAAoB,GAC1CA,EAAkB,IAAI,YAAY,EAEjB,CACjB,MAAM11C,EAAO,KAAK,iBACdA,IAAS,KAAK,gBAChB,KAAK,qBAAA,EACL,KAAK,cAAgBA,EACjBA,QAAW,mBAAA,EAEnB,CAEI01C,EAAkB,IAAI,MAAM,IAC9B,KAAK,QAAU,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,CAAC,EAE9C,CAKA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,qBAAA,EACL,KAAK,qBAAqB,QAASr+C,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,CAC9B,CAMO,kBAAyB,CAC9B,KAAK,qBAAA,EACL,KAAK,OAAS,MAChB,CAKQ,mBAA0B,CAC5B,KAAK,gBACT,KAAK,cAAgB,GAErB,UAAU,aACP,aAAa,CAAE,MAAO,GAAM,EAC5B,KAAMsgD,GAAgB,CAGrB,GAAI,CAAC,KAAK,YAAa,CACrBA,EAAY,YAAY,QAASxgD,GAAMA,EAAE,MAAM,EAC/C,MACF,CACA,KAAK,YAAc,GACnB,KAAK,OAASwgD,CAChB,CAAC,EACA,MAAOn6C,GAAQ,CACd,KAAK,cAAgB,GACrB0Z,GAAO,MAAM,+CAAgD1Z,CAAG,CAClE,CAAC,EACL,CAKQ,oBAA2B,CACjC,MAAM7C,EAAS,KAAK,eAAiB,KAAK,iBAC1C,GAAI,CAACA,EAAQ,OAIb,GADoBA,EAAO,eAAA,EACX,SAAW,EAAG,CAC5Buc,GAAO,KAAK,gDAAgD,EAC5D,MACF,CAEA,GAAI,CAEF,KAAK,cAAgB,IAAI,aAGrB,KAAK,cAAc,QAAU,aAC1B,KAAK,cAAc,OAAA,EAI1B,KAAK,UAAY,KAAK,cAAc,eAAA,EACpC,KAAK,UAAU,QAAU,IACzB,KAAK,UAAU,sBAAwB,GAGvC,KAAK,QAAU,KAAK,cAAc,wBAAwBvc,CAAM,EAChE,KAAK,QAAQ,QAAQ,KAAK,SAAS,EAGnC,MAAMi9C,EAAe,KAAK,UAAU,kBACpC,KAAK,WAAa,IAAI,WAAWA,CAAY,EAG7C,KAAK,mBAAA,CACP,OAASz7C,EAAO,CACd+a,GAAO,MAAM,iDAAkD/a,CAAK,CACtE,CACF,CAKQ,sBAA6B,CAE/B,KAAK,oBAAsB,SAC7B,qBAAqB,KAAK,iBAAiB,EAC3C,KAAK,kBAAoB,QAIvB,KAAK,UACP,KAAK,QAAQ,WAAA,EACb,KAAK,QAAU,QAIb,KAAK,YACP,KAAK,UAAU,WAAA,EACf,KAAK,UAAY,QAIf,KAAK,eAAiB,KAAK,cAAc,QAAU,WACrD,KAAK,cAAc,MAAA,EAAQ,MAAOqB,GAAQ0Z,GAAO,MAAM,+BAAgC1Z,CAAG,CAAC,EAC3F,KAAK,cAAgB,QAInB,KAAK,aAAe,KAAK,SAC3B,KAAK,OAAO,YAAY,QAASrG,GAAMA,EAAE,MAAM,EAC/C,KAAK,YAAc,IAGrB,KAAK,cAAgB,OAErB,KAAK,cAAgB,GAGrB,KAAK,WAAa,OAGlB,KAAK,QAAU,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,CAAC,CAC5C,CAKQ,oBAA2B,CACjC,MAAM0gD,EAAe,IAAM,CACzB,MAAMC,EAAW,KAAK,UAChBC,EAAY,KAAK,WACvB,GAAI,CAACD,GAAY,CAACC,EAChB,OAIFD,EAAS,qBAAqBC,CAAS,EAGvC,MAAMC,EAAmB,CAAA,EACnBC,EAAWF,EAAU,OACrBG,EAAa,KAAK,MAAMD,EAAW,KAAK,IAAI,EAElD,QAASvgD,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAAK,CAClC,MAAMygD,EAAWzgD,EAAIwgD,EACfE,EAAS,KAAK,IAAID,EAAWD,EAAYD,CAAQ,EAGvD,IAAIld,EAAM,EACV,QAASnhC,EAAIu+C,EAAUv+C,EAAIw+C,EAAQx+C,IACjCmhC,GAAOgd,EAAUn+C,CAAC,GAAK,EAEzB,MAAMy+C,EAAUtd,GAAOqd,EAASD,GAGhCH,EAAO,KAAKK,EAAU,GAAG,CAC3B,CAEA,KAAK,QAAUL,EACf,KAAK,cAAA,EAGL,KAAK,kBAAoB,sBAAsBH,CAAY,CAC7D,EAEA,KAAK,kBAAoB,sBAAsBA,CAAY,CAC7D,CAKQ,cAAcriC,EAAuB,CAC3C,OAAIA,EAAQ,GAAY,aACpBA,EAAQ,GAAY,eACpBA,EAAQ,IAAa,YAClB,EACT,CAKQ,SAASA,EAAwB,CACvC,OAAOA,EAAQ,GACjB,CAKA,QAAS,CAEP,MAAMwiC,EAAS,KAAK,QAAQ,SAAW,KAAK,KAAO,KAAK,QAAU,IAAI,MAAM,KAAK,IAAI,EAAE,KAAK,CAAC,EAGvFM,EAAON,EAAO,OAAO,CAAClgD,EAAWM,IAAc,KAAK,IAAIN,EAAGM,CAAC,EAAG,CAAC,EAChEmgD,EAAY,KAAK,MAAMD,EAAO,GAAG,EAEvC,OAAO1C;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,wBAQa2C,CAAS;AAAA;AAAA,UAEvBP,EAAO,IAAI,CAACxiC,EAAO5X,IAAU,CAC7B,MAAM46C,EAAW,KAAK,SAAShjC,CAAK,EAC9BijC,EAAa,KAAK,cAAcjjC,CAAK,EACrCkjC,EAAO,KAAK,IAAI,EAAGljC,EAAQ,KAAK,OAAO,EAEvC2gC,EACJ,KAAK,cAAgB,aAAe,UAAUuC,CAAI,MAAQ,WAAWA,CAAI,MAE3E,OAAO9C;AAAAA;AAAAA,2BAEU4C,EAAW,SAAW,EAAE,IAAIC,CAAU;AAAA,0BACvCD,EAAW,aAAe,EAAE;AAAA,uBAC/BrC,CAAK;AAAA,gCACIv4C,CAAK;AAAA;AAAA;AAAA,WAI7B,CAAC,CAAC;AAAA;AAAA,KAGR,CACF,EA1ba65C,EAAAA,aACJ,OAAS5B;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAkEYC,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAnEf0B,eAmEiB,UAAA,SAAA,CAAA,EAMA3B,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAzEf0B,eAyEiB,UAAA,OAAA,CAAA,EAIpB3B,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EA5EIizC,eA6EH,UAAA,aAAA,CAAA,EAES3B,GAAA,CAAhBtxC,EAAA,CAAM,EA/EIizC,eA+EM,UAAA,qBAAA,CAAA,EAaW3B,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA5Ff0B,eA4FiB,UAAA,OAAA,CAAA,EAKe3B,GAAA,CAA1CC,EAAS,CAAE,KAAM,OAAQ,QAAS,GAAM,CAAA,EAjG9B0B,eAiGgC,UAAA,cAAA,CAAA,EAM4B3B,GAAA,CAAtEC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,eAAgB,CAAA,EAvG1D0B,eAuG4D,UAAA,cAAA,CAAA,EAK3C3B,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA5Gf0B,eA4GiB,UAAA,UAAA,CAAA,EAKX3B,GAAA,CAAhBtxC,EAAA,CAAM,EAjHIizC,eAiHM,UAAA,UAAA,CAAA,EAjHNA,EAAAA,aAAN3B,GAAA,CADNG,GAAc,gBAAgB,CAAA,EAClBwB,cAAA,uMCpBb,MAAMvgC,GAAS0I,EAAA,EAqBF+4B,EAAAA,eAAN,cAA6BlD,EAAW,CAAxC,aAAA,CAAA,MAAA,GAAA,SAAA,EAkBI,KAAQ,YAA0C,KAE3D,KAAQ,qBAAuC,CAAA,EAEtC,KAAQ,YAAc,GAG/B,KAAA,gBAAkB,GAGlB,KAAA,cAAgB,GAGhB,KAAA,eAAiB,GAGjB,KAAA,iBAAmB,GAGnB,KAAA,aAAe,GAGf,KAAA,eAAiB,EAAA,CAIP,QAAQhjB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,gBAAA,EACD,KAAK,MACP,KAAK,qBAAqB,KACxB,KAAK,KAAK,MAAM,UAAWp7B,GAAO,KAAK,YAAcA,CAAE,CAAA,EAI/D,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,gBAAA,CACP,CAEQ,iBAAwB,CAC9B,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,YAAc,IACrB,CAEA,IAAY,gBAA6C,OACvD,OAAO,KAAK,KAAO,KAAK,cAAcgB,EAAA,KAAK,aAAL,YAAAA,EAAiB,OAAQ,IACjE,CAIQ,iBACN0uB,EACAU,EACc,CAId,MAAMxc,MAAW,IACXtP,EAAuB,CAAA,EAC7B,UAAW1D,KAAK8uB,EAAS,CACvB,MAAMniB,EAAK3M,EAAE,UAAY,aAAaA,EAAE,IAAI,GACxCgT,EAAK,IAAIrG,CAAE,IACfqG,EAAK,IAAIrG,CAAE,EACXjJ,EAAO,KAAK,CACV,GAAAiJ,EACA,MAAO3M,EAAE,QAAUA,EAAE,SAAWA,EAAE,SAAS,MAAM,EAAG,EAAE,EAAI,WAC1D,SAAUA,EAAE,YAAawvB,GAAA,YAAAA,EAAU,SAAA,CACpC,EACH,CACA,OAAO9rB,CACT,CAIQ,cAAe,QACrBtD,EAAA,KAAK,WAAL,MAAAA,EAAe,iBACjB,CAEQ,iBAAkB,QACxBA,EAAA,KAAK,WAAL,MAAAA,EAAe,iBACjB,CAEQ,kBAAmB,QACzBA,EAAA,KAAK,WAAL,MAAAA,EAAe,mBACjB,CAEQ,oBAAoB,EAAwC,CAClE,KAAK,YAAc,EAAE,OAAO,UAC9B,CAEQ,qBAAqB,EAAyC,CACpE,MAAM2d,EAAO,KAAK,eACbA,IAED,EAAE,OAAO,OACXA,EAAK,iBAAA,EAAmB,MAAOxY,GAAQ,CACrC0Z,GAAO,MAAM,sCAAuC1Z,CAAG,CACzD,CAAC,EAEDwY,EAAK,gBAAA,EAAkB,MAAOxY,GAAQ,CACpC0Z,GAAO,MAAM,2CAA4C1Z,CAAG,CAC9D,CAAC,EAEL,CAEQ,mBAAmBgiC,EAAwC,CACjE,MAAMxpB,EAAO,KAAK,eACbA,GAELA,EAAK,gBAAA,EAAkB,MAAOxY,GAAQ,CACpC0Z,GAAO,MAAM,oCAAqC1Z,CAAG,CACvD,CAAC,CACH,CAEQ,WAAY,OAClB,MAAMo7C,EAAS,KAAK,KAAO,IAAM,KAAK,KAAM,OAAA,GAAWvgD,EAAA,KAAK,aAAL,YAAAA,EAAiB,OACxEugD,GAAA,MAAAA,IAAW,MAAOp7C,GAAQ,CACxB0Z,GAAO,MAAM,gCAAiC1Z,CAAG,CACnD,GAEA,KAAK,cAAc,IAAI,YAAY,iBAAkB,CAAE,QAAS,GAAM,SAAU,EAAA,CAAM,CAAC,CACzF,CAEQ,gBAAgB,EAA0E,CAChG,GAAI,CAAC,KAAK,SAAU,OACpB,KAAM,CAAE,KAAAqgB,EAAM,SAAAqf,CAAA,EAAa,EAAE,OACvB2b,EAAQC,GAA4BA,EAAK,KAAM7gD,GAAMA,EAAE,WAAailC,CAAQ,GAAK,KAEnFrf,IAAS,OAAW,KAAK,SAAS,iBAAiBg7B,EAAK,KAAK,SAAS,iBAAiB,CAAC,EACxFh7B,IAAS,UAAW,KAAK,SAAS,iBAAiBg7B,EAAK,KAAK,SAAS,iBAAiB,CAAC,EACxFh7B,IAAS,WAAW,KAAK,SAAS,kBAAkBg7B,EAAK,KAAK,SAAS,kBAAkB,CAAC,CAChG,CAEQ,kBAAkB,EAAsC,CAC9D,GAAI,CAAC,KAAK,SAAU,OACpB,KAAM,CAAE,UAAAE,GAAc,EAAE,OAMlBC,EAL+C,CACnD,oBAAqB,IAAM,KAAK,SAAS,uBAAA,EACzC,YAAa,IAAM,KAAK,SAAS,eAAA,EACjC,oBAAqB,IAAM,KAAK,SAAS,uBAAA,CAAuB,EAE3CD,CAAS,EAC5BC,GACFA,EAAA,EAAS,MAAOx7C,GAAQ0Z,GAAO,MAAM,yCAA0C1Z,CAAG,CAAC,CAEvF,CAEQ,qBAAoC,CAC1C,MAAO,CACL,CAAE,GAAI,oBAAqB,MAAO,oBAAqB,SAAU,KAAK,SAAS,gBAAA,EAC/E,CAAE,GAAI,YAAa,MAAO,YAAa,SAAU,KAAK,SAAS,QAAA,EAC/D,CAAE,GAAI,oBAAqB,MAAO,oBAAqB,SAAU,KAAK,SAAS,gBAAA,CAAiB,CAEpG,CAIA,QAAS,CACP,GAAI,CAAC,KAAK,UAAY,CAAC,KAAK,KAAM,OAAOo4C,IAEzC,MAAM5/B,EAAO,KAAK,eACZijC,GAAkBjjC,GAAA,YAAAA,EAAM,qBAAsB,UAC9CkjC,GAAeljC,GAAA,YAAAA,EAAM,aAAc,GAEnC/d,EAAI,KAAK,SACf,OAAO29C;AAAAA;AAAAA;AAAAA,qBAGS39C,GAAA,YAAAA,EAAG,aAAc,EAAK;AAAA,wBACnBA,GAAA,YAAAA,EAAG,aAAc,EAAK;AAAA,yBACrBA,GAAA,YAAAA,EAAG,eAAgB,EAAK;AAAA,sBAC1B,KAAK,WAAW;AAAA,yBACbghD,CAAe;AAAA,sBAClBC,CAAY;AAAA,4BACN,KAAK,gBAAgB;AAAA,2BACtB,KAAK,eAAe;AAAA,yBACtB,KAAK,aAAa;AAAA,0BACjB,KAAK,cAAc;AAAA,wBACrB,KAAK,cAAgB,CAAC,CAACjhD,CAAC;AAAA,0BACtB,KAAK,cAAc;AAAA,sBACvBA,EAAI,KAAK,iBAAiBA,EAAE,kBAAmBA,EAAE,kBAAkB,EAAI,CAAA,CAAE;AAAA,yBACtEA,EAAI,KAAK,iBAAiBA,EAAE,kBAAmBA,EAAE,kBAAkB,EAAI,CAAA,CAAE;AAAA,0BACxEA,EAAI,KAAK,iBAAiBA,EAAE,mBAAoBA,EAAE,mBAAmB,EAAI,CAAA,CAAE;AAAA,yBAC5EA,EAAI,KAAK,oBAAA,EAAwB,CAAA,CAAE;AAAA,yBACnC,KAAK,YAAY;AAAA,4BACd,KAAK,eAAe;AAAA,6BACnB,KAAK,gBAAgB;AAAA,gCAClB,KAAK,mBAAmB;AAAA,kCACtB,KAAK,oBAAoB;AAAA,gCAC3B,KAAK,kBAAkB;AAAA,0BAC7B,KAAK,SAAS;AAAA,4BACZ,KAAK,eAAe;AAAA,8BAClB,KAAK,iBAAiB;AAAA;AAAA,KAGlD,CACF,EA3Na0gD,EAAAA,eACJ,OAAS9C;AAAAA;AAAAA;AAAAA;AAAAA,IAQRC,GAAA,CAFPE,GAAQ,CAAE,QAASx7C,GAAgB,UAAW,GAAM,EACpDgK,EAAA,CAAM,EARIm0C,iBASH,UAAA,WAAA,CAAA,EAIA7C,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAZIm0C,iBAaH,UAAA,aAAA,CAAA,EAGoB7C,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAhBf4C,iBAgBiB,UAAA,OAAA,CAAA,EAEX7C,GAAA,CAAhBtxC,EAAA,CAAM,EAlBIm0C,iBAkBM,UAAA,cAAA,CAAA,EAIA7C,GAAA,CAAhBtxC,EAAA,CAAM,EAtBIm0C,iBAsBM,UAAA,cAAA,CAAA,EAGjB7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,oBAAqB,CAAA,EAxB/D4C,iBAyBX,UAAA,kBAAA,CAAA,EAGA7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,kBAAmB,CAAA,EA3B7D4C,iBA4BX,UAAA,gBAAA,CAAA,EAGA7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,kBAAmB,CAAA,EA9B7D4C,iBA+BX,UAAA,iBAAA,CAAA,EAGA7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,oBAAqB,CAAA,EAjC/D4C,iBAkCX,UAAA,mBAAA,CAAA,EAGA7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,gBAAiB,CAAA,EApC3D4C,iBAqCX,UAAA,eAAA,CAAA,EAGA7C,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,kBAAmB,CAAA,EAvC7D4C,iBAwCX,UAAA,iBAAA,CAAA,EAxCWA,EAAAA,eAAN7C,GAAA,CADNG,GAAc,kBAAkB,CAAA,EACpB0C,gBAAA,uMCPAQ,EAAAA,aAAN,cAA2B1D,EAAW,CAAtC,aAAA,CAAA,MAAA,GAAA,SAAA,EAuGI,KAAQ,cAAmC,KAE3C,KAAQ,eAAgC,KACxC,KAAQ,UAAY,OAE7B,KAAQ,kBAAmC,KAC3C,KAAQ,YAA0B,MAClC,KAAQ,qBAAuC,CAAA,CAAC,CAEhD,IAAY,kBAA+B,OACzC,OAAO,KAAK,KAAO,KAAK,eAAiB,QAAQp9C,EAAA,KAAK,aAAL,YAAAA,EAAiB,SAAU,KAC9E,CAEU,QAAQo6B,EAAqC,CAQrD,GAPA,MAAM,QAAQA,CAAO,EAEjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,gBAAA,EACD,KAAK,MAAM,KAAK,aAAa,KAAK,IAAI,GAGxCA,EAAQ,IAAI,MAAM,GAAKA,EAAQ,IAAI,YAAY,GAAKA,EAAQ,IAAI,eAAe,EAAG,CACpF,MAAMmM,EAAS,KAAK,iBAChBA,IAAW,KAAK,cACdA,IAAW,aAAe,KAAK,cAAgB,YACjD,KAAK,oBAAA,EACIA,IAAW,aACpB,KAAK,mBAAA,EAEP,KAAK,YAAcA,EAEvB,CACF,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,mBAAA,EACL,KAAK,gBAAA,CACP,CAEQ,aAAarkC,EAAkB,CACrC,KAAK,qBAAqB,KACxBA,EAAK,QAAQ,UAAWlD,GAAM,CAC5B,KAAK,cAAgBA,CACvB,CAAC,CAAA,CAEL,CAEQ,iBAAwB,CAC9B,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,cAAgB,IACvB,CAEQ,qBAA4B,CAClC,KAAK,eAAiB,KAAK,IAAA,EAC3B,KAAK,UAAY,OACjB,KAAK,kBAAoB,OAAO,YAAY,IAAM,CAChD,GAAI,KAAK,eAAgB,CACvB,MAAM+hD,EAAU,KAAK,OAAO,KAAK,MAAQ,KAAK,gBAAkB,GAAI,EAC9DC,EAAQ,KAAK,MAAMD,EAAU,IAAI,EACjCE,EAAU,KAAK,MAAOF,EAAU,KAAQ,EAAE,EAC1CG,EAAOH,EAAU,GACvB,KAAK,UACHC,EAAQ,EACJ,GAAGA,CAAK,IAAIC,EAAQ,SAAA,EAAW,SAAS,EAAG,GAAG,CAAC,IAAIC,EAAK,SAAA,EAAW,SAAS,EAAG,GAAG,CAAC,GACnF,GAAGD,CAAO,IAAIC,EAAK,SAAA,EAAW,SAAS,EAAG,GAAG,CAAC,EACtD,CACF,EAAG,GAAI,CACT,CAEQ,oBAA2B,CAC7B,KAAK,oBACP,cAAc,KAAK,iBAAiB,EACpC,KAAK,kBAAoB,MAE3B,KAAK,eAAiB,KACtB,KAAK,UAAY,MACnB,CAEQ,eAAwB,CAC9B,MAAM3a,EAAS,KAAK,iBACpB,OAAQA,EAAA,CACN,IAAK,MACH,MAAO,QACT,IAAK,SACH,MAAO,YACT,IAAK,aACH,MAAO,gBACT,IAAK,UACH,MAAO,aACT,IAAK,YACH,MAAO,YACT,IAAK,aACH,MAAO,kBACT,IAAK,gBACH,MAAO,mBACT,IAAK,eACH,MAAO,eACT,IAAK,SACH,MAAO,SACT,IAAK,YACH,MAAO,QACT,QAEE,OAAO,OADoBA,CACF,CAC3B,CAEJ,CAEA,QAAS,CACP,MAAMA,EAAS,KAAK,iBACd4a,EAAa,KAAK,cAAA,EAExB,OAAO5D;AAAAA;AAAAA,wCAE6BhX,CAAM;AAAA,mCACXA,CAAM;AAAA,YAC7B4a,CAAU;AAAA;AAAA,UAEZ5a,IAAW,YACTgX,2CAA8C,KAAK,SAAS,UAC5D,IAAI;AAAA;AAAA,KAGd,CACF,EArOauD,EAAAA,aACJ,OAAS,CAACpC,GAAWlB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,KA4FzB,EAGyBC,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAhGfoD,eAgGiB,UAAA,OAAA,CAAA,EAIpBrD,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAnGI20C,eAoGH,UAAA,aAAA,CAAA,EAGSrD,GAAA,CAAhBtxC,EAAA,CAAM,EAvGI20C,eAuGM,UAAA,gBAAA,CAAA,EAEArD,GAAA,CAAhBtxC,EAAA,CAAM,EAzGI20C,eAyGM,UAAA,iBAAA,CAAA,EACArD,GAAA,CAAhBtxC,EAAA,CAAM,EA1GI20C,eA0GM,UAAA,YAAA,CAAA,EA1GNA,EAAAA,aAANrD,GAAA,CADNG,GAAc,gBAAgB,CAAA,EAClBkD,cAAA,ECxBb,MAAMz5C,GAAO,IAAM,QAAQ,QAAA,EACrB+5C,GAAW,IAAM,CAAC,EAKlBC,GAA8B,OAAO,OAAO,CAChD,GAAI,GACJ,UAAW,WACX,GAAI,OACJ,OAAQ,MACR,UAAW,GACX,UAAW,GACX,OAAQ,GACR,kBAAmB,GACnB,KAAM,OAAO,OAAO,EAAE,EACtB,aAAc,OAAO,OAAO,EAAE,EAC9B,KAAM,KACN,aAAc,KACd,YAAa,KACb,gBAAiB,OAAO,OAAO,CAAE,MAAO,WAAY,MAAO,WAAY,EACvE,OAAQ,OACR,QAAS,OAAO,OAAO,EAAE,EACzB,aAAc,OAAO,OAAO,EAAE,EAC9B,QAAS,OACT,aAAc,OAAO,OAAO,EAAE,EAC9B,OAAQh6C,GACR,WAAYA,GACZ,WAAYA,GACZ,UAAWA,GACX,eAAgBA,GAChB,eAAgBA,GAChB,WAAYA,GACZ,OAAQ+5C,GACR,OAAQA,EACV,CAAC,EAiBM,MAAME,EAA2B,CAMtC,YAAYx/C,EAAmB,CAJ/B,KAAQ,eAAiC,CAAA,EACzC,KAAQ,OAAoB,CAAE,GAAGu/C,EAAA,EACjC,KAAQ,UAAY,GAGlB,KAAK,UAAY,IAAIE,GAAgBz/C,EAAM,CACzC,QAASF,GACT,aAAc,KAAK,MAAA,CACpB,EACDE,EAAK,cAAc,IAAI,CACzB,CAEA,eAAgB,CAAC,CACjB,kBAAmB,CACjB,KAAK,WAAA,CACP,CAEA,QAAQI,EAAY,CAClB,KAAK,WAAA,EAML,KAAK,UAAY,GAGjB,KAAK,OAAO,CACV,GAAIA,EAAK,GACT,UAAWA,EAAK,UAChB,GAAIA,EAAK,EAAA,CACV,EAGD,KAAK,OAAO,CACV,OAAQ,IAAMA,EAAK,OAAA,EACnB,WAAY,IAAMA,EAAK,WAAA,EACvB,WAAY,IAAMA,EAAK,WAAA,EACvB,UAAW,CAAC6vC,EAAQC,EAAY,CAAA,IAAO9vC,EAAK,UAAU6vC,EAAQC,CAAS,EACvE,eAAgB,IAAM9vC,EAAK,eAAA,EAC3B,eAAgB,IAAMA,EAAK,eAAA,EAC3B,WAAas/C,GAAWt/C,EAAK,WAAWs/C,CAAM,EAC9C,OAAQ,IAAMt/C,EAAK,OAAA,EACnB,OAAQ,IAAMA,EAAK,OAAA,CAAO,CAC3B,EAED,KAAK,eAAiB,CACpBA,EAAK,QAAQ,UAAWqkC,GACtB,KAAK,OAAO,CAAE,OAAAA,EAAQ,CAAA,EAExBrkC,EAAK,WAAW,UAAWu/C,GACzB,KAAK,OAAO,CAAE,UAAAA,EAAW,CAAA,EAE3Bv/C,EAAK,WAAW,UAAWw/C,GACzB,KAAK,OAAO,CAAE,UAAAA,EAAW,CAAA,EAE3Bx/C,EAAK,QAAQ,UAAWy/C,GACtB,KAAK,OAAO,CAAE,OAAAA,EAAQ,CAAA,EAExBz/C,EAAK,mBAAmB,UAAW0/C,GACjC,KAAK,OAAO,CAAE,kBAAAA,EAAmB,CAAA,EAEnC1/C,EAAK,MAAM,UAAWsQ,GACpB,KAAK,OAAO,CAAE,KAAAA,EAAM,CAAA,EAEtBtQ,EAAK,cAAc,UAAWy8B,GAC5B,KAAK,OAAO,CAAE,aAAAA,EAAc,CAAA,EAE9Bz8B,EAAK,MAAM,UAAWyb,GACpB,KAAK,OAAO,CAAE,KAAAA,EAAM,CAAA,EAEtBzb,EAAK,cAAc,UAAW2/C,GAC5B,KAAK,OAAO,CAAE,aAAAA,EAAc,CAAA,EAE9B3/C,EAAK,aAAa,UAAW8gC,GAC3B,KAAK,OAAO,CAAE,YAAAA,EAAa,CAAA,EAE7B9gC,EAAK,iBAAiB,UAAWyoC,GAC/B,KAAK,OAAO,CAAE,gBAAAA,EAAiB,CAAA,EAEjCzoC,EAAK,QAAQ,UAAW6vC,GACtB,KAAK,OAAO,CAAE,OAAAA,EAAQ,CAAA,EAExB7vC,EAAK,SAAS,UAAW4/C,GACvB,KAAK,OAAO,CAAE,QAAAA,EAAS,CAAA,EAEzB5/C,EAAK,cAAc,UAAW6/C,GAC5B,KAAK,OAAO,CAAE,aAAAA,EAAc,CAAA,EAE9B7/C,EAAK,SAAS,UAAW+uC,GACvB,KAAK,OAAO,CAAE,QAAAA,EAAS,CAAA,EAEzB/uC,EAAK,cAAc,UAAW+tB,GAC5B,KAAK,OAAO,CAAE,aAAAA,EAAc,CAAA,CAC9B,EAGF,KAAK,UAAY,GACjB,KAAK,SAAA,CACP,CAEA,YAAa,CACX,KAAK,eAAe,QAASjxB,GAAMA,EAAE,aAAa,EAClD,KAAK,eAAiB,CAAA,EACtB,KAAK,OAAO,CAAE,GAAGqiD,GAAkB,CACrC,CAEQ,OAAOzF,EAA6B,CAC1C,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,GAAGA,CAAA,EAC9B,KAAK,WAAW,KAAK,SAAA,CAC5B,CAEQ,UAAW,CACjB,KAAK,UAAU,SAAS,KAAK,MAAM,CACrC,CACF,CCzKA,MAAMv0C,GAAO,IAAM,QAAQ,QAAA,EAIrB26C,GAA4B,OAAO,OAAO,CAC9C,kBAAmB,OAAO,OAAO,EAAE,EACnC,mBAAoB,OAAO,OAAO,EAAE,EACpC,kBAAmB,OAAO,OAAO,EAAE,EACnC,mBAAoB,KACpB,oBAAqB,KACrB,mBAAoB,KACpB,WAAY,GACZ,WAAY,GACZ,aAAc,GACd,iBAAkB,IAAM,CAAC,EACzB,kBAAmB,IAAM,CAAC,EAC1B,iBAAkB,IAAM,CAAC,EACzB,gBAAiB36C,GACjB,gBAAiBA,GACjB,kBAAmBA,GACnB,iBAAkB,GAClB,SAAU,GACV,iBAAkB,GAClB,uBAAwBA,GACxB,eAAgBA,GAChB,uBAAwBA,EAC1B,CAAC,EAoBM,MAAM46C,EAAyB,CAOpC,YAAYngD,EAAmB,CAL/B,KAAQ,IAA+B,KACvC,KAAQ,YAA8B,CAAA,EACtC,KAAQ,UAA4B,CAAA,EACpC,KAAQ,OAAuB,CAAE,GAAGkgD,EAAA,EAGlC,KAAK,UAAY,IAAIT,GAAgBz/C,EAAM,CACzC,QAASK,GACT,aAAc,KAAK,MAAA,CACpB,EACDL,EAAK,cAAc,IAAI,CACzB,CAEA,eAAgB,CAAC,CACjB,kBAAmB,CACjB,KAAK,WAAA,CACP,CAIA,eAAeogD,EAAsB,CACnC,KAAK,IAAMA,EACX,KAAK,YAAY,QAASljD,GAAMA,EAAE,aAAa,EAE/C,KAAK,OAAO,CACV,iBAAmBY,GAAMsiD,EAAG,uBAAuBtiD,CAAC,EACpD,kBAAoBA,GAAMsiD,EAAG,wBAAwBtiD,CAAC,EACtD,iBAAmBA,GAAMsiD,EAAG,uBAAuBtiD,CAAC,CAAA,CACrD,EAED,KAAK,YAAc,CACjBsiD,EAAG,mBAAmB,UAAWxzB,GAC/B,KAAK,OAAO,CAAE,kBAAmBA,EAAS,CAAA,EAE5CwzB,EAAG,oBAAoB,UAAWxzB,GAChC,KAAK,OAAO,CAAE,mBAAoBA,EAAS,CAAA,EAE7CwzB,EAAG,mBAAmB,UAAWxzB,GAC/B,KAAK,OAAO,CAAE,kBAAmBA,EAAS,CAAA,EAE5CwzB,EAAG,0BAA0B,UAAW91B,GACtC,KAAK,OAAO,CAAE,mBAAoBA,EAAQ,CAAA,EAE5C81B,EAAG,2BAA2B,UAAW91B,GACvC,KAAK,OAAO,CAAE,oBAAqBA,EAAQ,CAAA,EAE7C81B,EAAG,0BAA0B,UAAW91B,GACtC,KAAK,OAAO,CAAE,mBAAoBA,EAAQ,CAAA,CAC5C,EAGF81B,EAAG,uBAAA,CACL,CAGA,gBAAuB,CACjB,KAAK,KACP,KAAK,IAAI,uBAAA,CAEb,CAIA,YAAYhgD,EAAY,CACtB,KAAK,eAAA,EAGL,MAAMigD,EAAUjgD,EAAK,MAAM,UAAWyb,GAAS,CAC7C,KAAK,OAAO,CACV,gBAAiBA,EAAO,IAAMA,EAAK,aAAetW,GAClD,gBAAiBsW,EAAO,IAAMA,EAAK,kBAAoBtW,GACvD,kBAAmBsW,EAAO,IAAMA,EAAK,aAAetW,GACpD,uBAAwBsW,EAAO,IAAMA,EAAK,yBAA2BtW,GACrE,eAAgBsW,EAAO,IAAMA,EAAK,2BAA6BtW,GAC/D,uBAAwBsW,EAAO,IAAMA,EAAK,yBAA2BtW,EAAA,CACtE,CACH,CAAC,EAIK+6C,EAAgBlgD,EAAK,MACxB,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,YAAcpM,GAAG,EAAK,CAAE,CAAC,EAC/D,UAAW8wC,GAAU,KAAK,OAAO,CAAE,WAAYA,CAAA,CAAO,CAAC,EAEpDC,EAAgBpgD,EAAK,MACxB,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,YAAcpM,GAAG,EAAK,CAAE,CAAC,EAC/D,UAAW8wC,GAAU,KAAK,OAAO,CAAE,WAAYA,CAAA,CAAO,CAAC,EAEpDE,EAAkBrgD,EAAK,MAC1B,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,MAAQpM,GAAG,EAAK,CAAE,CAAC,EACzD,UAAWixC,GAAS,KAAK,OAAO,CAAE,aAAcA,CAAA,CAAM,CAAC,EAEpDC,EAAsBvgD,EAAK,MAC9B,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,kBAAoBpM,GAAG,EAAI,CAAE,CAAC,EACpE,UAAW+gC,GAAY,KAAK,OAAO,CAAE,iBAAkBA,CAAA,CAAS,CAAC,EAE9DoQ,EAAcxgD,EAAK,MACtB,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,UAAYpM,GAAG,EAAI,CAAE,CAAC,EAC5D,UAAW+gC,GAAY,KAAK,OAAO,CAAE,SAAUA,CAAA,CAAS,CAAC,EAEtDqQ,EAAsBzgD,EAAK,MAC9B,KAAKoZ,GAAWqC,GAAUA,EAAOA,EAAK,kBAAoBpM,GAAG,EAAI,CAAE,CAAC,EACpE,UAAW+gC,GAAY,KAAK,OAAO,CAAE,iBAAkBA,CAAA,CAAS,CAAC,EAEpE,KAAK,UAAY,CACf6P,EACAC,EAAeE,EAAeC,EAC9BE,EAAqBC,EAAaC,CAAA,CAEtC,CAEA,gBAAiB,CACf,KAAK,UAAU,QAAS3jD,GAAMA,EAAE,aAAa,EAC7C,KAAK,UAAY,CAAA,EACjB,KAAK,OAAO,CACV,WAAY,GACZ,WAAY,GACZ,aAAc,GACd,gBAAiBqI,GACjB,gBAAiBA,GACjB,kBAAmBA,GACnB,iBAAkB,GAClB,SAAU,GACV,iBAAkB,GAClB,uBAAwBA,GACxB,eAAgBA,GAChB,uBAAwBA,EAAA,CACzB,CACH,CAIA,YAAa,CACX,KAAK,YAAY,QAASrI,GAAMA,EAAE,aAAa,EAC/C,KAAK,YAAc,CAAA,EACnB,KAAK,eAAA,EACL,KAAK,OAAO,CAAE,GAAGgjD,GAAa,CAChC,CAIQ,OAAOpG,EAAgC,CAC7C,KAAK,OAAS,CAAE,GAAG,KAAK,OAAQ,GAAGA,CAAA,EACnC,KAAK,UAAU,SAAS,KAAK,MAAM,CACrC,CACF,sMC1KagH,EAAAA,eAAN,cAA6BxF,EAAW,CAAxC,aAAA,CAAA,MAAA,GAAA,SAAA,EAG2B,KAAA,KAAyB,OACzB,KAAA,iBAAiD,OAEjF,KAAQ,WAAa,IAAIkE,GAA2B,IAAI,EACxD,KAAQ,SAAW,IAAIW,GAAyB,IAAI,CAAA,CAE1C,QAAQ7nB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EAEjBA,EAAQ,IAAI,MAAM,IAChB,KAAK,MACP,KAAK,WAAW,QAAQ,KAAK,IAAI,EACjC,KAAK,SAAS,YAAY,KAAK,IAAI,IAEnC,KAAK,WAAW,WAAA,EAChB,KAAK,SAAS,eAAA,IAIdA,EAAQ,IAAI,kBAAkB,GAAK,KAAK,kBAC1C,KAAK,SAAS,eAAe,KAAK,gBAAgB,CAEtD,CAEA,sBAA6B,CAC3B,MAAM,qBAAA,EACN,KAAK,WAAW,WAAA,EAChB,KAAK,SAAS,WAAA,CAChB,CAEA,QAAS,CACP,OAAOmjB,gBACT,CACF,EApCaqF,EAAAA,eACJ,OAASpF,iCAEgBC,GAAA,CAA/BC,EAAS,CAAE,UAAW,EAAA,CAAO,CAAA,EAHnBkF,iBAGqB,UAAA,OAAA,CAAA,EACAnF,GAAA,CAA/BC,EAAS,CAAE,UAAW,EAAA,CAAO,CAAA,EAJnBkF,iBAIqB,UAAA,mBAAA,CAAA,EAJrBA,EAAAA,eAANnF,GAAA,CADNG,GAAc,kBAAkB,CAAA,EACpBgF,gBAAA,uMCOb,MAAMC,GAAe,YACfC,GAAgB,IAKhBC,GAAO,CACX,CAAE,MAAO,IAAK,QAAS,EAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,MAAA,EACvB,CAAE,MAAO,IAAK,QAAS,KAAA,EACvB,CAAE,MAAO,IAAK,QAAS,MAAA,EACvB,CAAE,MAAO,IAAK,QAAS,EAAA,EACvB,CAAE,MAAO,IAAK,QAAS,GAAA,EACvB,CAAE,MAAO,IAAK,QAAS,EAAA,CACzB,EAGaC,EAAAA,YAAN,cAA0B5F,EAAW,CAArC,aAAA,CAAA,MAAA,GAAA,SAAA,EAyKL,KAAA,eAA0B,GAI1B,KAAA,UAAqB,GAIrB,KAAA,YAAsB,eAEb,KAAQ,OAAiB,GACzB,KAAQ,WAA4B,KAE7C,KAAQ,gBAAwD,KAChE,KAAQ,gBAAkB,EAAA,CAElB,gBAAgBzvC,EAAoB,CAC1C,KAAK,iBAAA,EACL,KAAK,gBAAkB,GACvB,KAAK,gBAAkB,WAAW,IAAM,CACtC,KAAK,gBAAkB,GACvB,KAAK,gBAAkB,KACvBA,EAAA,CACF,EAAGm1C,EAAa,CAClB,CAEQ,kBAAmB,CACrB,KAAK,kBAAoB,OAC3B,aAAa,KAAK,eAAe,EACjC,KAAK,gBAAkB,KAE3B,CAES,sBAAuB,CAC9B,KAAK,iBAAA,EACL,MAAM,qBAAA,CACR,CAEQ,WAAY,CACd,KAAK,OAAO,SAAW,IAC3B,KAAK,OAAS,GACd,KAAK,cACH,IAAI,YAAY,uBAAwB,CACtC,OAAQ,CAAE,OAAQ,KAAK,MAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,EAEL,CAEQ,YAAYG,EAAe,CACjC,KAAK,QAAUA,EACf,KAAK,WAAaA,EAElB,KAAK,cACH,IAAI,YAAY,iBAAkB,CAChC,OAAQ,CAAE,MAAAA,EAAO,OAAQ,KAAK,MAAA,EAC9B,QAAS,GACT,SAAU,EAAA,CACX,CAAA,EAGH,WAAW,IAAM,CACf,KAAK,WAAa,IACpB,EAAG,GAAG,CACR,CAEQ,YAAa,CACf,KAAK,OAAO,SAAW,IAC3B,KAAK,OAAS,KAAK,OAAO,MAAM,EAAG,EAAE,EACrC,KAAK,cACH,IAAI,YAAY,uBAAwB,CACtC,OAAQ,CAAE,OAAQ,KAAK,MAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,EAEL,CAEQ,OAAQ,CACV,KAAK,OAAO,SAAW,GAC3B,KAAK,cACH,IAAI,YAAY,UAAW,CACzB,OAAQ,CAAE,OAAQ,KAAK,MAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CAOQ,WAAW,EAAkB,CACnC,KAAM,CAAE,IAAAvvC,GAAQ,EAEhB,GAAI,KAAK,UAAW,CACdA,IAAQ,SAAW,KAAK,iBAC1B,EAAE,eAAA,EACF,KAAK,MAAA,GAEP,MACF,CAEImvC,GAAa,KAAKnvC,CAAG,GACvB,EAAE,eAAA,EACF,KAAK,YAAYA,CAAG,GACXA,IAAQ,aACjB,EAAE,eAAA,EACF,KAAK,WAAA,GACIA,IAAQ,SAAW,KAAK,gBACjC,EAAE,eAAA,EACF,KAAK,MAAA,GACIA,IAAQ,OAAS,CAAC,EAAE,SAAW,CAAC,EAAE,SAE3C,EAAE,eAAA,CAEN,CAEQ,SAAS,EAAU,CACzB,GAAI,CAAC,KAAK,UAAW,OACrB,MAAM1Q,EAAS,EAAE,OAA4B,MAC7C,KAAK,OAASA,EACd,KAAK,cACH,IAAI,YAAY,mBAAoB,CAClC,OAAQ,CAAE,OAAQ,KAAK,MAAA,EACvB,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CAEA,QAAS,CACP,OAAOu6C;AAAAA;AAAAA;AAAAA;AAAAA,mBAIQ,KAAK,UAAY,OAAS,KAAK;AAAA;AAAA,qBAE7B,KAAK,MAAM;AAAA,0BACN,KAAK,WAAW;AAAA,uBACnB,KAAK,UAAU;AAAA,qBACjB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,qBAKb,IAAM,CACb,GAAI,KAAK,gBAAiB,CAAE,KAAK,gBAAkB,GAAO,MAAQ,CAClE,KAAK,WAAA,CACP,CAAC;AAAA,2BACc,IAAM,KAAK,gBAAgB,IAAM,KAAK,UAAA,CAAW,CAAC;AAAA,yBACpD,IAAM,KAAK,iBAAA,CAAkB;AAAA,4BAC1B,IAAM,KAAK,iBAAA,CAAkB;AAAA,6BAC5B,IAAM,KAAK,iBAAA,CAAkB;AAAA,wBAClC,KAAK,OAAO,SAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQpCwF,GAAK,IACJrvC,GAAQ6pC;AAAAA;AAAAA,6BAEQ,KAAK,aAAe7pC,EAAI,MAAQ,UAAY,EAAE;AAAA,4BAC/C,KAAK,aAAeA,EAAI,MAAQ,cAAgB,EAAE;AAAA,yBACrD,IAAM,CACb,GAAI,KAAK,gBAAiB,CAAE,KAAK,gBAAkB,GAAO,MAAQ,CAClE,KAAK,YAAYA,EAAI,KAAK,CAC5B,CAAC;AAAA,+BACcA,EAAI,QAAU,IACzB,IAAM,KAAK,gBAAgB,IAAM,KAAK,YAAY,GAAG,CAAC,EACtD,MAAS;AAAA,6BACAA,EAAI,QAAU,IAAM,IAAM,KAAK,iBAAA,EAAqB,MAAS;AAAA,gCAC1DA,EAAI,QAAU,IAAM,IAAM,KAAK,iBAAA,EAAqB,MAAS;AAAA,iCAC5DA,EAAI,QAAU,IAAM,IAAM,KAAK,iBAAA,EAAqB,MAAS;AAAA,8BAChEA,EAAI,KAAK,GAAGA,EAAI,QAAU,KAAKA,EAAI,OAAO,GAAK,EAAE,GAC7DA,EAAI,QAAU,IAAM,sBAAwB,EAC9C;AAAA;AAAA,0CAE0BA,EAAI,KAAK;AAAA,4CACPA,EAAI,OAAO;AAAA;AAAA,aAAA,CAG5C;AAAA;AAAA;AAAA,UAGD,KAAK,eACH6pC;AAAAA;AAAAA;AAAAA;AAAAA,yBAIa,KAAK,KAAK;AAAA,4BACP,KAAK,OAAO,SAAW,CAAC;AAAA,mCACjB,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA,cAKlC,IAAI;AAAA;AAAA,KAGd,CACF,EAxXayF,EAAAA,YACJ,OAAS,CAACtE,GAAWlB;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,GAoK3B,EAIDC,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,mBAAoB,CAAA,EAxK9DsF,cAyKX,UAAA,iBAAA,CAAA,EAIAvF,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,aAAc,CAAA,EA5KxDsF,cA6KX,UAAA,YAAA,CAAA,EAIAvF,GAAA,CADCC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EAhLfsF,cAiLX,UAAA,cAAA,CAAA,EAEiBvF,GAAA,CAAhBtxC,EAAA,CAAM,EAnLI62C,cAmLM,UAAA,SAAA,CAAA,EACAvF,GAAA,CAAhBtxC,EAAA,CAAM,EApLI62C,cAoLM,UAAA,aAAA,CAAA,EApLNA,EAAAA,YAANvF,GAAA,CADNG,GAAc,eAAe,CAAA,EACjBoF,aAAA,uMCtBb,MAAMnkC,GAAS0I,EAAA,EAGF27B,EAAAA,cAAN,cAA4B9F,EAAW,CAAvC,aAAA,CAAA,MAAA,GAAA,SAAA,EAQI,KAAQ,cAAmC,KAEpD,KAAQ,qBAAuC,CAAA,EAI/C,KAAA,eAAiB,GAIjB,KAAA,UAAY,GAIZ,KAAA,YAAc,cAAA,CAEJ,QAAQhjB,EAAqC,CACrD,MAAM,QAAQA,CAAO,EACjBA,EAAQ,IAAI,MAAM,IACpB,KAAK,qBAAqB,QAASp7B,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,EAC5B,KAAK,cAAgB,KACjB,KAAK,MACP,KAAK,qBAAqB,KACxB,KAAK,KAAK,QAAQ,UAAWA,GAAO,KAAK,cAAgBA,CAAE,CAAA,EAInE,CAEA,sBAAuB,CACrB,MAAM,qBAAA,EACN,KAAK,qBAAqB,QAASA,GAAMA,EAAE,aAAa,EACxD,KAAK,qBAAuB,CAAA,CAC9B,CAEQ,cAAc,EAAmD,SACvE,KAAM,CAAE,MAAAikD,GAAU,EAAE,OAEpB,IADe,KAAK,KAAO,KAAK,eAAgBjjD,EAAA,KAAK,aAAL,YAAAA,EAAiB,UAClD,YAAa,OAE5B,MAAMojC,EAAO,KAAK,KACbxjC,GAAc,KAAK,KAAM,WAAWA,CAAC,GACtCK,EAAA,KAAK,aAAL,YAAAA,EAAiB,WACrBmjC,GAAA,MAAAA,EAAO6f,GAAO,MAAO99C,GAAiB,CACpC0Z,GAAO,MAAM,uBAAwB1Z,CAAG,CAC1C,EACF,CAEA,QAAS,CACP,OAAOo4C;AAAAA;AAAAA;AAAAA,4BAGiB,KAAK,cAAc;AAAA,sBACzB,KAAK,SAAS;AAAA,sBACd,KAAK,WAAW;AAAA,0BACZ,KAAK,aAAa;AAAA;AAAA,KAG1C,CACF,EAjEUE,GAAA,CAFPE,GAAQ,CAAE,QAAS/7C,GAAkB,UAAW,GAAM,EACtDuK,EAAA,CAAM,EAFI+2C,gBAGH,UAAA,aAAA,CAAA,EAGoBzF,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EANfwF,gBAMiB,UAAA,OAAA,CAAA,EAEXzF,GAAA,CAAhBtxC,EAAA,CAAM,EARI+2C,gBAQM,UAAA,gBAAA,CAAA,EAMjBzF,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,mBAAoB,CAAA,EAb9DwF,gBAcX,UAAA,iBAAA,CAAA,EAIAzF,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,UAAW,aAAc,CAAA,EAjBxDwF,gBAkBX,UAAA,YAAA,CAAA,EAIAzF,GAAA,CADCC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EArBfwF,gBAsBX,UAAA,cAAA,CAAA,EAtBWA,EAAAA,cAANzF,GAAA,CADNG,GAAc,iBAAiB,CAAA,EACnBsF,eAAA,EC/BN,MAAMC,GAAmD,aCgBzD,MAAMC,EAAU,CAAhB,aAAA,CACL,KAAQ,SAAwB,CAAA,EAChC,KAAQ,WAA+B,KACvC,KAAQ,aAAiC,KACzC,KAAQ,YAA8B,KAGtC,KAAO,SAAuB,IAAM,CAAC,CAAA,CAG9B,YAA0B,CAC/B,MAAMC,EAAM,CAAC,GAAG,KAAK,QAAQ,EAC7B,OAAI,KAAK,YAAc,KAAK,aACtB,KAAK,cAAgB,OACvBA,EAAI,KAAK,KAAK,WAAY,KAAK,YAAY,EAE3CA,EAAI,KAAK,KAAK,aAAc,KAAK,UAAU,EAEpC,KAAK,WACdA,EAAI,KAAK,KAAK,UAAU,EACf,KAAK,cACdA,EAAI,KAAK,KAAK,YAAY,EAErBA,CACT,CAEA,IAAW,QAAkB,CAC3B,OACE,KAAK,SAAS,OAAS,GACvB,KAAK,aAAe,MACpB,KAAK,eAAiB,IAE1B,CAEA,IAAW,YAA6B,CACtC,OAAO,KAAK,WACd,CAEO,OAAc,CACnB,KAAK,SAAW,CAAA,EAChB,KAAK,WAAa,KAClB,KAAK,aAAe,KACpB,KAAK,YAAc,KACnB,KAAK,SAAA,CACP,CAEO,cAAclP,EAAoB,CAClCA,IACL,KAAK,aAAe,CAAE,QAAS,OAAQ,KAAAA,EAAM,MAAO,SAAA,EACpD,KAAK,YAAc,OACnB,KAAK,SAAA,EACP,CAEO,eAAeA,EAAoB,CACxC,GAAI,CAACA,EAAM,CAET,KAAK,aAAe,KACpB,KAAK,SAAA,EACL,MACF,CACA,KAAK,SAAW,CACd,GAAG,KAAK,SACR,CAAE,QAAS,OAAQ,KAAAA,EAAM,MAAO,UAAA,CAAW,EAE7C,KAAK,aAAe,KACpB,KAAK,YAAc,OACnB,KAAK,SAAA,CACP,CAEO,UAAUA,EAAoB,CACnC,GAAKA,EACL,IAAI,CAAC,KAAK,WACR,KAAK,WAAa,CAAE,QAAS,KAAM,KAAAA,EAAM,MAAO,SAAA,MAC3C,CACL,MAAMmP,EAAS,GAAG,KAAK,WAAW,IAAI,IAAInP,CAAI,GAC3C,QAAQ,OAAQ,GAAG,EACnB,KAAA,EACH,KAAK,WAAa,CAAE,GAAG,KAAK,WAAY,KAAMmP,CAAA,CAChD,CACA,KAAK,YAAc,KACnB,KAAK,SAAA,EACP,CAEO,aAAanP,EAAcoP,EAAuB,CACvD,GAAI,KAAK,WAAY,CACnB,MAAMC,EAAYrP,EAAK,OAAS,EAAIA,EAAO,KAAK,WAAW,KAC3D,KAAK,SAAW,CACd,GAAG,KAAK,SACR,CAAE,QAAS,KAAM,KAAMqP,EAAW,MAAO,UAAA,CAAW,EAEtD,KAAK,WAAa,IACpB,MAAWrP,EAAK,OAAS,IACvB,KAAK,SAAW,CACd,GAAG,KAAK,SACR,CAAE,QAAS,KAAM,KAAAA,EAAM,MAAO,UAAA,CAAW,GAG7C,KAAK,YAAcoP,EAAS,OAAS,KACrC,KAAK,SAAA,CACP,CACF,CCnHA,MAAM1kC,GAAS0I,EAAA,EAMTk8B,GAAiB,CACrB,oBACA,mBACA,wBACA,eACF,EAKA,SAASC,GAAgBvP,EAAsB,CAC7C,OAAOA,EAAK,QAAQ,+BAAgC,EAAE,EAAE,KAAA,CAC1D,CAEA,SAASwP,GAASxjD,EAAoB,CACpC,OAAO,OAAOA,GAAM,SAAWA,EAAI,EACrC,CAUO,MAAMyjD,EAAmD,CAO9D,YAAY9hD,EAAkB,CAJ9B,KAAQ,MAAQ,IAAIshD,GACpB,KAAQ,UAA+B,CAAA,EACvC,KAAQ,eAAiC,CAAA,EAGvC,KAAK,MAAQthD,EACb,KAAK,UAAY,IAAIy/C,GAAgBz/C,EAAM,CACzC,QAASqhD,GACT,aAAc,CAAE,QAAS,CAAA,CAAC,CAAE,CAC7B,EAED,KAAK,MAAM,SAAW,IAAM,KAAK,SAAA,EACjCrhD,EAAK,cAAc,IAAI,CACzB,CAEA,eAAsB,CAAC,CAEvB,kBAAyB,CACvB,KAAK,uBAAA,CACP,CAEA,QAAQI,EAA8B,CAMpC,GALA,KAAK,uBAAA,EACL,KAAK,MAAM,MAAA,EACX,KAAK,UAAY,CAAA,EACjB,KAAK,SAAA,EAED,EAACA,EAEL,UAAWy6B,KAAa8mB,GAAgB,CACtC,MAAM95B,EAAMznB,EAAK,UAAUy6B,CAAS,EAAE,UAAU,CAC9C,KAAOvU,GAAU,CACf,GAAI,CACF,KAAK,OAAOuU,EAAW,KAAK,eAAevU,CAAK,CAAC,CACnD,OAASjjB,EAAK,CACZ0Z,GAAO,KAAK,sCAAsC8d,CAAS,SAAUx3B,CAAG,CAC1E,CACF,EACA,MAAQA,GAAQ,CACd0Z,GAAO,KAAK,gDAAgD8d,CAAS,GAAIx3B,CAAG,CAC9E,CAAA,CACD,EACD,KAAK,eAAiB,CAAC,GAAG,KAAK,eAAgBwkB,CAAG,CACpD,CACF,CAEA,IAAI,OAAyB,CAC3B,OAAO,KAAK,UAAU,KACxB,CAGA,YAAY2C,EAA8B,CACxC,KAAK,UAAY,CAAC,GAAG,KAAK,UAAWA,CAAK,EAC1C,KAAK,SAAA,CACP,CAEQ,eAAelE,EAAyD,CAC9E,MAAMmK,EAASnK,EAAM,OACrB,OAAImK,GAAU,OAAOA,GAAW,SACvBA,EAEFnK,CACT,CAEQ,OAAOuU,EAAwBpK,EAAuC,CAC5E,OAAQoK,EAAA,CACN,IAAK,oBACH,KAAK,MAAM,cAAcgnB,GAASpxB,EAAO,IAAO,CAAC,EACjD,MACF,IAAK,mBAAoB,CACvB,MAAM4hB,EAAOuP,GAAgBC,GAASpxB,EAAO,IAAO,CAAC,EACrD,KAAK,MAAM,eAAe4hB,CAAI,EAC9B,KACF,CACA,IAAK,wBAAyB,CAC5B,MAAMA,EAAOwP,GAASpxB,EAAO,WAAgBA,EAAO,IAAO,EAC3D,KAAK,MAAM,UAAUqxB,GAAqB,sBAAsBzP,CAAI,CAAC,EACrE,KACF,CACA,IAAK,gBAAiB,CACpB,MAAMA,EAAOwP,GAASpxB,EAAO,IAAO,EACpC,KAAK,MAAM,aACTqxB,GAAqB,sBAAsBzP,CAAI,EAC/C5hB,EAAO,OAAY,QAAA,EAErB,KACF,CAAA,CAEJ,CAEQ,wBAA+B,CACrC,UAAW5I,KAAO,KAAK,eACrB,GAAI,CACFA,EAAI,YAAA,CACN,MAAQ,CAER,CAEF,KAAK,eAAiB,CAAA,CACxB,CAEA,OAAe,sBAAsBwqB,EAAsB,CAIzD,MAAM3S,EAAQ,0BAA0B,KAAK2S,CAAI,EACjD,GAAI,CAAC3S,EAAO,OAAO2S,EAAK,KAAA,EACxB,MAAM0P,EAAS1P,EAAK,MAAM,EAAG3S,EAAM,KAAK,EAAE,KAAA,EACpCsiB,EAAQ3P,EAAK,MAAM3S,EAAM,MAAQA,EAAM,CAAC,EAAE,MAAM,EAAE,KAAA,EACxD,OAAQqiB,GAAUC,GAAO,KAAA,CAC3B,CAEQ,mBAAmBx3B,EAAkB/mB,EAAgC,CAC3E,MAAO,CACL,GAAI,QAAQA,CAAK,IAAI+mB,EAAM,OAAO,IAAIA,EAAM,KAAK,GACjD,KAAMA,EAAM,UAAY,KAAO,QAAU,OACzC,MAAOA,EAAM,MACb,KAAMA,EAAM,IAAA,CAEhB,CAEQ,UAAiB,CAIvB,MAAMod,EAAU,CAAC,GAHG,KAAK,MACtB,WAAA,EACA,IAAI,CAAC3qC,EAAGM,IAAM,KAAK,mBAAmBN,EAAGM,CAAC,CAAC,EACb,GAAG,KAAK,SAAS,EAClD,KAAK,UAAU,SAAS,CAAE,QAAAqqC,CAAA,CAAS,EACnC,KAAK,MAAM,cAAA,CACb,CACF,CCxKA,MAAM7qB,GAAS0I,EAAA,EACTw8B,GAAkB,aAClBC,GAAkB,CAAC,OAAQ,WAAY,OAAQ,MAAM,EAG3D,SAASC,GAAS9jD,EAA2B,CAC3C,OAAQ6jD,GAAsC,SAAS7jD,CAAW,EAC7DA,EACD,MACN,CAsBO,MAAM+jD,EAAkD,CAI7D,YAAYpiD,EAAkB,CAC5B,KAAK,MAAQA,EACbA,EAAK,cAAc,IAAI,CACzB,CAEA,eAAsB,CAAC,CAEvB,kBAAyB,QACvB9B,EAAA,KAAK,gBAAL,MAAAA,EAAoB,cACpB,KAAK,cAAgB,MACvB,CAEA,QAAQkC,EAA8B,QACpClC,EAAA,KAAK,gBAAL,MAAAA,EAAoB,cACpB,KAAK,cAAgB,OAEhBkC,IAEL,KAAK,cAAgBA,EAAK,UAAU6hD,EAAe,EAAE,UAAW37B,GAAU,CACxEvJ,GAAO,MAAM,2CAA4CuJ,CAAK,EAC9D,MAAMmK,EAASnK,EAAM,OAChBmK,GACL,KAAK,OAAOA,CAAM,CACpB,CAAC,EACH,CAEQ,OAAOA,EAA+B,CACxCA,EAAO,OAAS,kBAClB,KAAK,sBAAsBA,CAAM,EAEjC,KAAK,mBAAmBA,CAAM,CAElC,CAEQ,sBAAsBA,EAA+B,CAC3D,MAAMrL,EAAiC,CACrC,QAAUqL,EAAO,SAAqC,GACtD,OAAQ0xB,GAAS1xB,EAAO,MAAS,EACjC,MAAOA,EAAO,MACd,SAAUA,EAAO,QAAU,EAG7B,KAAK,MAAM,cACT,IAAI,YAAmC,qBAAsB,CAC3D,OAAQrL,EACR,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CAEQ,mBAAmBqL,EAA+B,CACxD,KAAK,MAAM,cACT,IAAI,YAAY,2BAA4B,CAC1C,OAAQA,EACR,QAAS,GACT,SAAU,EAAA,CACX,CAAA,CAEL,CACF,sMClDa4xB,EAAAA,eAAN,cAA6B/G,EAAW,CAAxC,aAAA,CAAA,MAAA,GAAA,SAAA,EACuC,KAAA,WAAa,GACb,KAAA,QAAU,GACV,KAAA,OAAS,GAC5C,KAAQ,YAAc,GAmB/B,KAAQ,oBAAsB,IAAY,CACxC,MAAMgH,EAAO,SAAS,oBAAsB,KACxC,KAAK,cAAgBA,IACvB,KAAK,YAAcA,EACfA,EACF,KAAK,aAAa,aAAc,EAAE,EAElC,KAAK,gBAAgB,YAAY,EAGvC,CAAA,CA1BA,IAAI,YAAsB,CACxB,OAAO,KAAK,WACd,CAEA,kBAAyB,CACvB,KAAK,WAAa,CAAC,KAAK,UAC1B,CAEA,kBAAyB,CACnB,SAAS,kBACX,SAAS,iBAAiB,MAAM,IAAM,CAAC,CAAC,EAExC,KAAK,oBAAoB,MAAM,IAAM,CAAC,CAAC,CAE3C,CAcA,mBAA0B,CACxB,MAAM,kBAAA,EACN,SAAS,iBAAiB,mBAAoB,KAAK,mBAAmB,CACxE,CAEA,sBAA6B,CAC3B,MAAM,qBAAA,EACN,SAAS,oBAAoB,mBAAoB,KAAK,mBAAmB,CAC3E,CAuMA,QAAS,CACP,OAAO7G;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,YAUC,KAAK,QACHA;AAAAA;AAAAA;AAAAA;AAAAA,0BAIY,EAAE;AAAA;AAAA,sBAGd4B,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAYnB,CACF,EAlRagF,EAAAA,eA6CJ,OAAS3G;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IA5C4BC,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAD/ByG,iBACiC,UAAA,aAAA,CAAA,EACA1G,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAF/ByG,iBAEiC,UAAA,UAAA,CAAA,EACA1G,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAH/ByG,iBAGiC,UAAA,SAAA,CAAA,EAC3B1G,GAAA,CAAhBtxC,EAAA,CAAM,EAJIg4C,iBAIM,UAAA,cAAA,CAAA,EAJNA,EAAAA,eAAN1G,GAAA,CADNG,GAAc,mBAAmB,CAAA,EACrBuG,gBAAA,iJC3CAE,EAAAA,wBAAN,cAAsCjH,EAAW,CA6DtD,QAAS,CACP,OAAOG,6CACT,CACF,EAhEa8G,EAAAA,wBACJ,OAAS7G;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IADL6G,EAAAA,wBAAN5G,GAAA,CADNG,GAAc,4BAA4B,CAAA,EAC9ByG,yBAAA,uMCIAC,EAAAA,UAAN,cAAwBlH,EAAW,CAAnC,aAAA,CAAA,MAAA,GAAA,SAAA,EA4FL,KAAA,KAAO,GAKP,KAAQ,eAAgC,KA8BxC,KAAQ,cAAiB,GAAmB,CAC1C,EAAE,eAAA,EACF,KAAK,cAAA,CACP,EAGA,KAAQ,qBAAwB,GAAwB,CAClD,EAAE,SAAW,KAAK,QACpB,KAAK,cAAA,CAET,CAAA,CAtCA,QAAQhjB,EAA+B,CACjCA,EAAQ,IAAI,MAAM,IAChB,KAAK,MACP,KAAK,eAAiB,SAAS,KAAK,MAAM,SAC1C,KAAK,OAAO,UAAA,EACZ,SAAS,KAAK,MAAM,SAAW,UACtB,KAAK,OAAO,MACrB,KAAK,cAAA,EAGX,CAEQ,eAAsB,CAC5B,KAAK,OAAO,UAAU,IAAI,SAAS,EACnC,MAAMmqB,EAAWxlD,GAAsB,CACjCA,EAAE,SAAW,KAAK,SACtB,KAAK,OAAO,oBAAoB,eAAgBwlD,CAAO,EACvD,KAAK,OAAO,UAAU,OAAO,SAAS,EACtC,KAAK,OAAO,MAAA,EACR,KAAK,iBAAmB,OAC1B,SAAS,KAAK,MAAM,SAAW,KAAK,eACpC,KAAK,eAAiB,MAE1B,EACA,KAAK,OAAO,iBAAiB,eAAgBA,CAAO,CACtD,CAgBQ,eAAsB,CAC5B,MAAMC,EAAK,IAAI,YAAY,iBAAkB,CAC3C,QAAS,GACT,SAAU,GACV,WAAY,EAAA,CACb,EACG,KAAK,cAAcA,CAAE,IACvB,KAAK,KAAO,GAEhB,CAEA,mBAA0B,CACxB,MAAM,kBAAA,EACN,KAAK,eAAe,KAAK,IAAM,CAC7B,KAAK,OAAO,iBAAiB,SAAU,KAAK,aAAa,EACzD,KAAK,OAAO,iBAAiB,QAAS,KAAK,oBAAoB,CACjE,CAAC,CACH,CAEA,sBAA6B,CAC3B,MAAM,qBAAA,EACN,KAAK,OAAO,oBAAoB,SAAU,KAAK,aAAa,EAC5D,KAAK,OAAO,oBAAoB,QAAS,KAAK,oBAAoB,CACpE,CAEA,QAAS,CACP,OAAOjH;AAAAA;AAAAA,cAGT,CACF,EA1Ka+G,EAAAA,UACJ,OAAS9G;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IA2FhBC,GAAA,CADCC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EA3F/B4G,YA4FX,UAAA,OAAA,CAAA,EAGQ7G,GAAA,CADPgH,GAAM,QAAQ,CAAA,EA9FJH,YA+FH,UAAA,SAAA,CAAA,EA/FGA,EAAAA,UAAN7G,GAAA,CADNG,GAAc,aAAa,CAAA,EACf0G,WAAA,ECXb;AAAA;AAAA;AAAA;AAAA,GAIG,MAAMllD,GAAE,YAAYC,GAAE,KAAKD,GAAEH,GAAEF,GAAE,cAAcI,EAAC,CAAC,YAAYL,EAAE,OAAC,GAAG,MAAMA,CAAC,EAAEA,EAAE,OAAOE,GAAE,WAAqBF,EAAE,OAAZ,WAAkBA,EAAAA,EAAE,UAAFA,YAAAA,EAAW,QAAO,EAAE,MAAM,MAAM,4GAA4G,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,OAAO,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAEK,IAAI,CAAC,MAAMH,EAAE,EAAEG,CAAC,EAAE,OAAaH,GAAN,KAAQ,EAAE,EAAE,GAAGG,EAAEA,EAAE,SAAS,GAAG,EAAEA,EAAEA,EAAE,QAAQ,oCAAoC,KAAK,EAAE,YAAW,CAAE,IAAIH,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,OAAOD,EAAE,CAACI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAMH,CAAC,EAAED,EAAE,QAAQ,GAAY,KAAK,KAAd,OAAiB,OAAO,KAAK,GAAG,IAAI,IAAI,OAAO,KAAKI,CAAC,CAAC,EAAE,KAAK,OAAOA,CAAC,EAAE,UAAUL,KAAK,KAAK,GAASK,EAAEL,CAAC,GAAT,OAAa,KAAK,GAAG,OAAOA,CAAC,EAAEA,EAAE,SAAS,GAAG,EAAEE,EAAE,eAAeF,CAAC,EAAEE,EAAEF,CAAC,EAAE,MAAM,UAAUA,KAAKK,EAAE,CAAC,MAAMJ,EAAEI,EAAEL,CAAC,EAAE,GAASC,GAAN,KAAQ,CAAC,KAAK,GAAG,IAAID,CAAC,EAAE,MAAMK,EAAY,OAAOJ,GAAjB,UAAoBA,EAAE,SAASM,EAAC,EAAEP,EAAE,SAAS,GAAG,GAAGK,EAAEH,EAAE,YAAYF,EAAEK,EAAEJ,EAAE,MAAM,EAAE,GAAG,EAAEA,EAAEI,EAAEC,GAAE,EAAE,EAAEJ,EAAEF,CAAC,EAAEC,CAAC,CAAC,CAAC,OAAOD,EAAC,CAAC,CAAC,ECLv0B4lD,GAAe,0xyMCETC,GACJ,m5BCoBWC,EAAAA,eAAN,cAA6BxH,EAAW,CAAxC,aAAA,CAAA,MAAA,GAAA,SAAA,EAyCuC,KAAA,QAAU,GAGA,KAAA,WAAa,OAE1D,KAAQ,QAAU,EAAA,CAE3B,IAAY,MAAO,CACjB,OAAO,KAAK,QAAUsH,GAA2B,KAAK,GACxD,CAEA,IAAY,YAAa,CACvB,OAAO,KAAK,QAAUC,GAA+B,KAAK,SAC5D,CAEA,WAAWvqB,EAA+B,EACpCA,EAAQ,IAAI,KAAK,GAAKA,EAAQ,IAAI,SAAS,KAC7C,KAAK,QAAU,GAEnB,CAEA,QAAS,CACP,OAAOmjB;AAAAA,QACH,KAAK,WACHA;AAAAA;AAAAA,oBAEU,QAAQ,KAAK,QAAU,UAAY,EAAE,EAAE;AAAA,oBACvCsH,GAAS,CACf,mBAAoB,QAAQ,KAAK,UAAU,KAC3C,OAAQ,QAAQ,KAAK,UAAU,GAAA,CAChC,CAAC;AAAA,mBAEJ1F,CAAO;AAAA,QACT,KAAK,KACH5B;AAAAA;AAAAA,oBAEU,KAAK,QAAU,SAAW,EAAE;AAAA,kBAC9B,KAAK,IAAI;AAAA;AAAA,oBAEP,IAAM,CACZ,KAAK,QAAU,EACjB,CAAC;AAAA,cAEH4B,CAAO;AAAA,KAEf,CACF,EAvFayF,EAAAA,eACJ,OAASpH;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,IAwC4BC,GAAA,CAA3CC,EAAS,CAAE,KAAM,QAAS,QAAS,GAAM,CAAA,EAzC/BkH,iBAyCiC,UAAA,UAAA,CAAA,EAChBnH,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA1CfkH,iBA0CiB,UAAA,YAAA,CAAA,EACAnH,GAAA,CAA3BC,EAAS,CAAE,KAAM,MAAA,CAAQ,CAAA,EA3CfkH,iBA2CiB,UAAA,MAAA,CAAA,EAC0BnH,GAAA,CAArDC,EAAS,CAAE,KAAM,OAAQ,UAAW,cAAe,CAAA,EA5CzCkH,iBA4C2C,UAAA,aAAA,CAAA,EAErCnH,GAAA,CAAhBtxC,EAAA,CAAM,EA9CIy4C,iBA8CM,UAAA,UAAA,CAAA,EA9CNA,EAAAA,eAANnH,GAAA,CADNG,GAAc,kBAAkB,CAAA,EACpBgH,gBAAA,ECjBb,IAAIE,GAAkC,KACtC,MAAMC,GAAW,IAAyBD,QAAW,QAAA,QAAA,EAAA,KAAA,IAAAE,EAAA,GAE/CC,GAAsD,CAC1D,WAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,WAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,OAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,KAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,MAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAA,EAAA,EAClB,KAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,IAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,KAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,IAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,EAClB,SAAY,IAAM,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,CACpB,EAEMC,GAAgD,CACpD,WAAY,CAAC,YAAY,CAC3B,EAEMC,OAAc,IAEpB,eAAsBC,GAAgBC,EAA6B,CACjE,GAAIF,GAAQ,IAAIE,CAAI,EAAG,OAEvB,MAAMf,GAAA,EACN,UAAWgB,KAAOJ,GAAWG,CAAI,GAAK,CAAA,EACpC,MAAMD,GAAgBE,CAAG,EAE3B,MAAMC,EAASf,GAAYa,CAAI,EAC3BE,IACF,MAAMA,EAAA,EACNJ,GAAQ,IAAIE,CAAI,EAEpB,CAGA,eAAsBG,GAAUrhC,EAAcshC,EAAmC,CAC/E,MAAMJ,GAAQI,GAAY,aAAa,YAAA,EACvC,MAAML,GAAgBC,CAAI,EAC1B,MAAMK,EAAQ,MAAMpB,GAAA,EACdqB,EAAUD,EAAM,UAAUL,CAAI,EACpC,OAAOM,EAAUD,EAAM,UAAUvhC,EAAMwhC,EAASN,CAAI,EAAIlhC,CAC1D,sMC1CA,MAAM/F,GAAS0I,EAAA,EAkBT8+B,GAAgB,CACpB,aAAc,CACZ,IAAK,KAAM,IAAK,IAAK,KAAM,SAAU,IAAK,KAAM,KAAM,KACtD,KAAM,KAAM,KAAM,KAAM,KAAM,KAC9B,MAAO,OAAQ,aAAc,KAAM,QAAS,QAAS,QACrD,KAAM,KAAM,KAAM,MAAO,OAAQ,KAAA,EAEnC,aAAc,CAAC,OAAQ,SAAU,MAAO,MAAO,MAAO,QAAS,OAAO,EACtE,gBAAiB,GACjB,YAAa,CAAC,SAAU,SAAU,SAAU,QAAS,OAAQ,OAAO,EACpE,YAAa,CAAC,OAAO,CACvB,EAMA,IAAIC,GAAsB,GAC1B,SAASC,GAAiBC,EAAqC,CAC7D,OAAIF,KACJE,EAAU,QAAQ,0BAA4BC,GAAS,CACjDA,EAAK,UAAY,KAAOA,EAAK,aAAa,QAAQ,GACpDA,EAAK,aAAa,MAAO,qBAAqB,CAElD,CAAC,EACDH,GAAsB,IACfE,CACT,CAeaE,EAAAA,kBAAN,cAAgCtJ,EAAW,CAA3C,aAAA,CAAA,MAAA,GAAA,SAAA,EA+OuC,KAAA,KAAO,GACP,KAAA,OAAS,GACzB,KAAA,MAAQ,GACR,KAAA,QAAU,GACV,KAAA,OAAwB,OACxB,KAAA,SAAW,GAE9B,KAAQ,cAAgB,GACxB,KAAQ,cAA+B,OACvC,KAAQ,QAAU,GAG3B,KAAQ,UAAY,CAAA,CAIpB,mBAA0B,CACxB,MAAM,kBAAA,EACN,KAAK,IAAM,IAAI,eAAgB1T,GAAY,CACzC,MAAMpd,EAAQod,EAAQ,CAAC,EACnBpd,IAAO,KAAK,OAASA,EAAM,YAAY,OAAS,IACtD,CAAC,EAGD,MAAM7lB,EAAS,KAAK,cAChBA,GAAQ,KAAK,IAAI,QAAQA,CAAM,CACrC,CAEA,sBAA6B,OAC3B,MAAM,qBAAA,GACNzG,EAAA,KAAK,MAAL,MAAAA,EAAU,aACV,KAAK,IAAM,MACb,CAEU,QAAQo6B,EAAqC,CACrD,MAAM,QAAQA,CAAO,GACjBA,EAAQ,IAAI,SAAS,GAAKA,EAAQ,IAAI,QAAQ,GAAKA,EAAQ,IAAI,UAAU,IACtE,KAAK,eAAA,CAEd,CAEA,MAAc,gBAAgC,CAC5C,MAAM7tB,EAAK,EAAE,KAAK,UACZ,CAAE,QAAAo6C,EAAS,OAAAC,EAAQ,SAAAV,CAAA,EAAa,KAEtC,GAAIU,IAAW,OAAQ,CACrB,GAAIr6C,IAAO,KAAK,UAAW,OAC3B,KAAK,cAAgB,GACrB,KAAK,cAAgB,OACrB,MACF,CAEA,GAAI,CACF,IAAIgxC,EAAO,GAEX,GAAIqJ,IAAW,WAAY,CACzB,KAAM,CAAC,CAAE,OAAAC,CAAA,EAAU,CAAE,QAASL,EAAW,EAAI,MAAM,QAAQ,IAAI,CAC7D,QAAA,QAAA,EAAA,KAAA,IAAAM,EAAA,EACA,QAAA,QAAA,EAAA,KAAA,IAAAC,EAAA,CAAkB,CACnB,EACKnf,EAAM,MAAMif,EAAO,MAAMF,EAAS,CAAE,MAAO,GAAM,EACvDpJ,EAAOgJ,GAAiBC,CAAS,EAAE,SAAS5e,EAAKye,EAAa,CAChE,SAAWO,IAAW,OAAQ,CAC5B,KAAM,CAAE,QAASJ,CAAA,EAAc,MAAM,QAAA,QAAA,EAAA,KAAA,IAAAO,EAAA,EACrCxJ,EAAOgJ,GAAiBC,CAAS,EAAE,SAASG,EAASN,EAAa,CACpE,MAAWO,IAAW,SACpBrJ,EAAO,MAAM0I,GAAUU,EAAST,GAAY,WAAW,GAGzD,GAAI35C,IAAO,KAAK,UAAW,OAC3B,KAAK,cAAgBgxC,EACrB,KAAK,cAAgBqJ,CACvB,OAASzhD,EAAK,CAEZ,GADA0Z,GAAO,MAAM,4CAA6C1Z,CAAG,EACzDoH,IAAO,KAAK,UAAW,OAC3B,KAAK,cAAgB,GACrB,KAAK,cAAgB,MACvB,CACF,CAEQ,QAAe,CACrB,KAAK,cAAc,IAAI,YAAY,0BAA2B,CAAE,QAAS,GAAM,SAAU,EAAA,CAAM,CAAC,CAClG,CAEA,MAAc,OAAuB,CACnC,GAAI,CACF,MAAM,UAAU,UAAU,UAAU,KAAK,OAAO,EAChD,KAAK,QAAU,GACf,WAAW,IAAM,CAAE,KAAK,QAAU,EAAO,EAAG,GAAI,CAClD,MAAQ,CACNsS,GAAO,MAAM,wCAAwC,CACvD,CACF,CAEQ,aAAc,CACpB,OAAI,KAAK,SAAW,QAAW,KAAK,gBAAkB,KAAK,OAElD0+B,8BAAiC,KAAK,OAAO,SAElD,KAAK,gBAAkB,OAClBA;AAAAA;AAAAA,uBAEUc,GAAW,KAAK,aAAa,CAAC;AAAA;AAAA,QAI1Cd,8BAAiCc,GAAW,KAAK,aAAa,CAAC,QACxE,CAEA,QAAS,CACP,MAAM2I,EAAgB,KAAK,SAAW,QAAU,KAAK,SAErD,OAAOzJ;AAAAA;AAAAA;AAAAA,YAGC,KAAK,MACHA,qCAAwC,KAAK,KAAK,UAClD4B,CAAO;AAAA,YACT6H,EACEzJ,6BAAgC,KAAK,QAAQ,UAC7C4B,CAAO;AAAA;AAAA,gCAEW,KAAK,QAAU,YAAc,EAAE;AAAA;AAAA,qBAE1C,KAAK,KAAK;AAAA;AAAA,+BAEA,KAAK,QAAU,eAAiB,MAAM;AAAA;AAAA,4DAET,KAAK,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,YAK3D,KAAK,aAAa;AAAA;AAAA;AAAA,KAI5B,CACF,EAzXauH,EAAAA,kBACJ,OAASlJ;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,I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;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA,uMCUpC,MAAM3+B,GAAS0I,EAAA,EAmBFqjC,EAAAA,iBAAN,cAA+BxN,EAA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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,132,136,137,186,209,210,211,212,213,214,215,216,217,218,219,220]}