{"version":3,"sources":["src/js/utils/is.js","src/js/utils/events.js","src/js/utils/elements.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/support.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/objects.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/loadSprite.js","src/js/utils/time.js","src/js/controls.js","src/js/utils/urls.js","src/js/captions.js","src/js/config/defaults.js","src/js/config/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/loadImage.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/loadScript.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/source.js","src/js/plyr.js"],"names":["getConstructor","input","constructor","instanceOf","Boolean","isNullOrUndefined","isObject","Object","isNumber","Number","isNaN","isString","String","isBoolean","isFunction","Function","isArray","Array","isWeakMap","WeakMap","isNodeList","NodeList","isElement","Element","isTextNode","Text","isEvent","Event","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isEmpty","length","keys","isUrl","URL","string","startsWith","hostname","e","nullOrUndefined","object","number","boolean","function","array","weakMap","nodeList","element","textNode","event","keyboardEvent","cue","track","url","empty","supportsPassiveListeners","supported","options","defineProperty","get","addEventListener","removeEventListener","toggleListener","callback","toggle","passive","capture","is","events","split","forEach","type","eventListeners","push","on","call","off","once","onceCallback","args","apply","triggerEvent","bubbles","detail","CustomEvent","assign","plyr","dispatchEvent","unbindListeners","item","ready","Promise","resolve","setTimeout","elements","container","then","wrap","wrapper","targets","from","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","filter","value","key","setAttribute","createElement","text","document","innerText","insertAfter","target","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","s","selector","trim","className","replace","stripped","parts","start","charAt","class","id","toggleHidden","hidden","hide","removeAttribute","toggleClass","force","map","method","classList","contains","hasClass","matches","match","querySelectorAll","includes","prototype","getElements","getElement","querySelector","trapFocus","focusable","first","last","trap","keyCode","focused","activeElement","shiftKey","focus","preventDefault","setFocus","tabFocus","preventScroll","config","classNames","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","find","style","undefined","repaint","offsetHeight","browser","isIE","documentMode","isWebkit","documentElement","test","navigator","userAgent","isIPhone","platform","isIos","defaultCodecs","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","inputType","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","html5","getSources","sources","source","getAttribute","getQualityOptions","extend","player","set","currentTime","paused","preload","readyState","src","play","load","quality","cancelRequests","blankVideo","debug","log","dedupe","indexOf","closest","reduce","prev","curr","Math","abs","cloneDeep","JSON","parse","stringify","getDeep","path","obj","shift","generateId","prefix","floor","random","format","toString","i","getPercentage","current","max","toFixed","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","slice","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","vimeo","youtube","i18n","seekTime","title","Storage","enabled","storage","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","isCached","exists","getElementById","update","data","body","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","parseInt","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","iconUrl","location","cors","host","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","fullscreen","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","role","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","props","label","labelPressed","iconPressed","control","button","createRange","min","step","autocomplete","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","checked","flex","enumerable","children","node","listeners","bind","currentTrack","speed","parseFloat","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","setProgress","getElementsByTagName","nodeValue","buffered","percent","setProperty","updateSeekTooltip","tooltips","clientRect","getBoundingClientRect","visible","width","pageX","left","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","checkMenu","getBadge","sort","a","b","sorting","setCaptionsMenu","tracks","getTracks","toggled","language","unshift","setSpeedMenu","isVimeo","values","some","popup","firstItem","toggleMenu","show","isMenuItem","getMenuSize","tab","clone","position","opacity","scrollWidth","height","scrollHeight","size","restore","propertyName","setDownloadLink","download","create","inner","home","backButton","href","urls","isEmbed","inject","seektime","insertMethod","addProperty","controlPressed","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","setup","isVideo","isYouTube","protocol","blob","createObjectURL","browserLanguages","languages","userLanguage","active","trackEvents","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","embed","enableTextTrack","has","sortIsDefault","sorted","every","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","changed","caption","defaults","autoplay","autopause","toggleInvert","ratio","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","end","all","reset","disabled","advertisement","qualityBadge","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","google","publisherId","inactive","providers","types","getProviderByUrl","noop","Console","console","onChange","toggleFallback","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","Fullscreen","native","webkitEnterFullscreen","requestFullscreen","webkitExitFullscreen","cancelFullScreen","action","enter","exit","fullscreenElement","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","prefixes","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","err","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","recentTouchSeek","lastSeekTime","Date","now","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","seekByKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","timeStamp","removeCurrent","wasKeyDown","delay","hasAudio","initialized","managerPromise","isAudio","ended","proxyEvents","concat","defaultHandler","customHandlerKey","customHandler","hasCustomHandler","returned","proxy","inputEvent","rect","currentTarget","attribute","hasAttribute","done","seekTo","webkitDirectionInvertedFromDevice","deltaX","deltaY","direction","sign","this","loadScript","loadjs","success","parseId","regex","$2","getAspectRatio","getRatio","w","h","assurePlaybackState","hasPlayed","setAspectRatio","Vimeo","padding","paddingBottom","offset","transform","byline","portrait","transparent","gesture","thumbnail_large","pathname","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","name","setLoop","currentSrc","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","strippedCues","getPaused","frame","seconds","dimension","YT","onYouTubeReadyCallbacks","onYouTubeIframeAPIReady","getTitle","videoId","getVideoData","items","snippet","currentId","posterSrc","playerVars","hl","rel","showinfo","iv_load_policy","modestbranding","disablekb","widget_referrer","cc_load_policy","cc_lang_pref","onError","message","onPlaybackRateChange","instance","playbackRate","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","seeked","unMute","Ads","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","ima","trigger","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","AdDisplayContainer","requestAds","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","AdsRequest","adTagUrl","tagUrl","linearAdSlotWidth","offsetWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","cuePoint","seekElement","cuePercentage","AdEvent","onAdEvent","ad","getAd","LOADED","pollCountdown","isLinear","ALL_ADS_COMPLETED","loadAds","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","STARTED","MIDPOINT","COMPLETE","IMPRESSION","CLICK","cancel","contentComplete","seekedTime","discardAdBreak","splice","resize","ViewMode","NORMAL","initialize","init","adError","zIndex","destroy","handlers","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","base","insertElements","change","tagName","crossorigin","Plyr","failed","jQuery","original","search","truthy","searchParams","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline","t"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA;EACA;EACA;EAEA,IAAMA,cAAc,GAAG,SAAjBA,cAAiB,CAAAC,KAAK;EAAA,SAAKA,KAAK,KAAK,IAAV,IAAkB,OAAOA,KAAP,KAAiB,WAAnC,GAAiDA,KAAK,CAACC,WAAvD,GAAqE,IAA1E;EAAA,CAA5B;;EACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAACF,KAAD,EAAQC,WAAR;EAAA,SAAwBE,OAAO,CAACH,KAAK,IAAIC,WAAT,IAAwBD,KAAK,YAAYC,WAA1C,CAA/B;EAAA,CAAnB;;EACA,IAAMG,iBAAiB,GAAG,SAApBA,iBAAoB,CAAAJ,KAAK;EAAA,SAAIA,KAAK,KAAK,IAAV,IAAkB,OAAOA,KAAP,KAAiB,WAAvC;EAAA,CAA/B;;EACA,IAAMK,QAAQ,GAAG,SAAXA,QAAW,CAAAL,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0BM,MAA9B;EAAA,CAAtB;;EACA,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAAP,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0BQ,MAA1B,IAAoC,CAACA,MAAM,CAACC,KAAP,CAAaT,KAAb,CAAzC;EAAA,CAAtB;;EACA,IAAMU,QAAQ,GAAG,SAAXA,QAAW,CAAAV,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0BW,MAA9B;EAAA,CAAtB;;EACA,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAAAZ,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0BG,OAA9B;EAAA,CAAvB;;EACA,IAAMU,UAAU,GAAG,SAAbA,UAAa,CAAAb,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0Bc,QAA9B;EAAA,CAAxB;;EACA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAAAf,KAAK;EAAA,SAAIgB,KAAK,CAACD,OAAN,CAAcf,KAAd,CAAJ;EAAA,CAArB;;EACA,IAAMiB,SAAS,GAAG,SAAZA,SAAY,CAAAjB,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQkB,OAAR,CAAd;EAAA,CAAvB;;EACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAAAnB,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQoB,QAAR,CAAd;EAAA,CAAxB;;EACA,IAAMC,SAAS,GAAG,SAAZA,SAAY,CAAArB,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQsB,OAAR,CAAd;EAAA,CAAvB;;EACA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAAAvB,KAAK;EAAA,SAAID,cAAc,CAACC,KAAD,CAAd,KAA0BwB,IAA9B;EAAA,CAAxB;;EACA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAAAzB,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQ0B,KAAR,CAAd;EAAA,CAArB;;EACA,IAAMC,eAAe,GAAG,SAAlBA,eAAkB,CAAA3B,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQ4B,aAAR,CAAd;EAAA,CAA7B;;EACA,IAAMC,KAAK,GAAG,SAARA,KAAQ,CAAA7B,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQ8B,MAAM,CAACC,YAAf,CAAV,IAA0C7B,UAAU,CAACF,KAAD,EAAQ8B,MAAM,CAACE,MAAf,CAAxD;EAAA,CAAnB;;EACA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAAAjC,KAAK;EAAA,SAAIE,UAAU,CAACF,KAAD,EAAQkC,SAAR,CAAV,IAAiC,CAAC9B,iBAAiB,CAACJ,KAAD,CAAlB,IAA6BU,QAAQ,CAACV,KAAK,CAACmC,IAAP,CAA1E;EAAA,CAArB;;EAEA,IAAMC,OAAO,GAAG,SAAVA,OAAU,CAAApC,KAAK;EAAA,SACjBI,iBAAiB,CAACJ,KAAD,CAAjB,IACC,CAACU,QAAQ,CAACV,KAAD,CAAR,IAAmBe,OAAO,CAACf,KAAD,CAA1B,IAAqCmB,UAAU,CAACnB,KAAD,CAAhD,KAA4D,CAACA,KAAK,CAACqC,MADpE,IAEChC,QAAQ,CAACL,KAAD,CAAR,IAAmB,CAACM,MAAM,CAACgC,IAAP,CAAYtC,KAAZ,EAAmBqC,MAHvB;EAAA,CAArB;;EAKA,IAAME,KAAK,GAAG,SAARA,KAAQ,CAAAvC,KAAK,EAAI;EACnB;EACA,MAAIE,UAAU,CAACF,KAAD,EAAQ8B,MAAM,CAACU,GAAf,CAAd,EAAmC;EAC/B,WAAO,IAAP;EACH,GAJkB;;;EAOnB,MAAI,CAAC9B,QAAQ,CAACV,KAAD,CAAb,EAAsB;EAClB,WAAO,KAAP;EACH,GATkB;;;EAYnB,MAAIyC,MAAM,GAAGzC,KAAb;;EACA,MAAI,CAACA,KAAK,CAAC0C,UAAN,CAAiB,SAAjB,CAAD,IAAgC,CAAC1C,KAAK,CAAC0C,UAAN,CAAiB,UAAjB,CAArC,EAAmE;EAC/DD,IAAAA,MAAM,oBAAazC,KAAb,CAAN;EACH;;EAED,MAAI;EACA,WAAO,CAACoC,OAAO,CAAC,IAAII,GAAJ,CAAQC,MAAR,EAAgBE,QAAjB,CAAf;EACH,GAFD,CAEE,OAAOC,CAAP,EAAU;EACR,WAAO,KAAP;EACH;EACJ,CAtBD;;AAwBA,WAAe;EACXC,EAAAA,eAAe,EAAEzC,iBADN;EAEX0C,EAAAA,MAAM,EAAEzC,QAFG;EAGX0C,EAAAA,MAAM,EAAExC,QAHG;EAIXkC,EAAAA,MAAM,EAAE/B,QAJG;EAKXsC,EAAAA,OAAO,EAAEpC,SALE;EAMXqC,EAAAA,QAAQ,EAAEpC,UANC;EAOXqC,EAAAA,KAAK,EAAEnC,OAPI;EAQXoC,EAAAA,OAAO,EAAElC,SARE;EASXmC,EAAAA,QAAQ,EAAEjC,UATC;EAUXkC,EAAAA,OAAO,EAAEhC,SAVE;EAWXiC,EAAAA,QAAQ,EAAE/B,UAXC;EAYXgC,EAAAA,KAAK,EAAE9B,OAZI;EAaX+B,EAAAA,aAAa,EAAE7B,eAbJ;EAcX8B,EAAAA,GAAG,EAAE5B,KAdM;EAeX6B,EAAAA,KAAK,EAAEzB,OAfI;EAgBX0B,EAAAA,GAAG,EAAEpB,KAhBM;EAiBXqB,EAAAA,KAAK,EAAExB;EAjBI,CAAf;;ECnDA;AACA,EAMA;EACA;;EACA,IAAMyB,wBAAwB,GAAI,YAAM;EACpC;EACA,MAAIC,SAAS,GAAG,KAAhB;;EACA,MAAI;EACA,QAAMC,OAAO,GAAGzD,MAAM,CAAC0D,cAAP,CAAsB,EAAtB,EAA0B,SAA1B,EAAqC;EACjDC,MAAAA,GADiD,iBAC3C;EACFH,QAAAA,SAAS,GAAG,IAAZ;EACA,eAAO,IAAP;EACH;EAJgD,KAArC,CAAhB;EAMAhC,IAAAA,MAAM,CAACoC,gBAAP,CAAwB,MAAxB,EAAgC,IAAhC,EAAsCH,OAAtC;EACAjC,IAAAA,MAAM,CAACqC,mBAAP,CAA2B,MAA3B,EAAmC,IAAnC,EAAyCJ,OAAzC;EACH,GATD,CASE,OAAOnB,CAAP,EAAU;EAEX;;EAED,SAAOkB,SAAP;EACH,CAjBgC,EAAjC;;;AAoBA,EAAO,SAASM,cAAT,CAAwBf,OAAxB,EAAiCE,KAAjC,EAAwCc,QAAxC,EAAmG;EAAA;;EAAA,MAAjDC,MAAiD,uEAAxC,KAAwC;EAAA,MAAjCC,OAAiC,uEAAvB,IAAuB;EAAA,MAAjBC,OAAiB,uEAAP,KAAO;;EACtG;EACA,MAAI,CAACnB,OAAD,IAAY,EAAE,sBAAsBA,OAAxB,CAAZ,IAAgDoB,EAAE,CAACb,KAAH,CAASL,KAAT,CAAhD,IAAmE,CAACkB,EAAE,CAACxB,QAAH,CAAYoB,QAAZ,CAAxE,EAA+F;EAC3F;EACH,GAJqG;;;EAOtG,MAAMK,MAAM,GAAGnB,KAAK,CAACoB,KAAN,CAAY,GAAZ,CAAf,CAPsG;EAUtG;;EACA,MAAIZ,OAAO,GAAGS,OAAd,CAXsG;;EActG,MAAIX,wBAAJ,EAA8B;EAC1BE,IAAAA,OAAO,GAAG;EACN;EACAQ,MAAAA,OAAO,EAAPA,OAFM;EAGN;EACAC,MAAAA,OAAO,EAAPA;EAJM,KAAV;EAMH,GArBqG;;;EAwBtGE,EAAAA,MAAM,CAACE,OAAP,CAAe,UAAAC,IAAI,EAAI;EACnB,QAAI,KAAI,IAAI,KAAI,CAACC,cAAb,IAA+BR,MAAnC,EAA2C;EACvC;EACA,MAAA,KAAI,CAACQ,cAAL,CAAoBC,IAApB,CAAyB;EAAE1B,QAAAA,OAAO,EAAPA,OAAF;EAAWwB,QAAAA,IAAI,EAAJA,IAAX;EAAiBR,QAAAA,QAAQ,EAARA,QAAjB;EAA2BN,QAAAA,OAAO,EAAPA;EAA3B,OAAzB;EACH;;EAEDV,IAAAA,OAAO,CAACiB,MAAM,GAAG,kBAAH,GAAwB,qBAA/B,CAAP,CAA6DO,IAA7D,EAAmER,QAAnE,EAA6EN,OAA7E;EACH,GAPD;EAQH;;AAGD,EAAO,SAASiB,EAAT,CAAY3B,OAAZ,EAA6E;EAAA,MAAxDqB,MAAwD,uEAA/C,EAA+C;EAAA,MAA3CL,QAA2C;EAAA,MAAjCE,OAAiC,uEAAvB,IAAuB;EAAA,MAAjBC,OAAiB,uEAAP,KAAO;EAChFJ,EAAAA,cAAc,CAACa,IAAf,CAAoB,IAApB,EAA0B5B,OAA1B,EAAmCqB,MAAnC,EAA2CL,QAA3C,EAAqD,IAArD,EAA2DE,OAA3D,EAAoEC,OAApE;EACH;;AAGD,EAAO,SAASU,GAAT,CAAa7B,OAAb,EAA8E;EAAA,MAAxDqB,MAAwD,uEAA/C,EAA+C;EAAA,MAA3CL,QAA2C;EAAA,MAAjCE,OAAiC,uEAAvB,IAAuB;EAAA,MAAjBC,OAAiB,uEAAP,KAAO;EACjFJ,EAAAA,cAAc,CAACa,IAAf,CAAoB,IAApB,EAA0B5B,OAA1B,EAAmCqB,MAAnC,EAA2CL,QAA3C,EAAqD,KAArD,EAA4DE,OAA5D,EAAqEC,OAArE;EACH;;AAGD,EAAO,SAASW,IAAT,CAAc9B,OAAd,EAA+E;EAAA,MAAxDqB,MAAwD,uEAA/C,EAA+C;EAAA,MAA3CL,QAA2C;EAAA,MAAjCE,OAAiC,uEAAvB,IAAuB;EAAA,MAAjBC,OAAiB,uEAAP,KAAO;;EAClF,WAASY,YAAT,GAA+B;EAC3BF,IAAAA,GAAG,CAAC7B,OAAD,EAAUqB,MAAV,EAAkBU,YAAlB,EAAgCb,OAAhC,EAAyCC,OAAzC,CAAH;;EAD2B,sCAANa,IAAM;EAANA,MAAAA,IAAM;EAAA;;EAE3BhB,IAAAA,QAAQ,CAACiB,KAAT,CAAe,IAAf,EAAqBD,IAArB;EACH;;EAEDjB,EAAAA,cAAc,CAACa,IAAf,CAAoB,IAApB,EAA0B5B,OAA1B,EAAmCqB,MAAnC,EAA2CU,YAA3C,EAAyD,IAAzD,EAA+Db,OAA/D,EAAwEC,OAAxE;EACH;;AAGD,EAAO,SAASe,YAAT,CAAsBlC,OAAtB,EAAwE;EAAA,MAAzCwB,IAAyC,uEAAlC,EAAkC;EAAA,MAA9BW,OAA8B,uEAApB,KAAoB;EAAA,MAAbC,MAAa,uEAAJ,EAAI;;EAC3E;EACA,MAAI,CAAChB,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAD,IAAwBoB,EAAE,CAACb,KAAH,CAASiB,IAAT,CAA5B,EAA4C;EACxC;EACH,GAJ0E;;;EAO3E,MAAMtB,KAAK,GAAG,IAAImC,WAAJ,CAAgBb,IAAhB,EAAsB;EAChCW,IAAAA,OAAO,EAAPA,OADgC;EAEhCC,IAAAA,MAAM,EAAEnF,MAAM,CAACqF,MAAP,CAAc,EAAd,EAAkBF,MAAlB,EAA0B;EAC9BG,MAAAA,IAAI,EAAE;EADwB,KAA1B;EAFwB,GAAtB,CAAd,CAP2E;;EAe3EvC,EAAAA,OAAO,CAACwC,aAAR,CAAsBtC,KAAtB;EACH;;AAGD,EAAO,SAASuC,eAAT,GAA2B;EAC9B,MAAI,QAAQ,KAAKhB,cAAjB,EAAiC;EAC7B,SAAKA,cAAL,CAAoBF,OAApB,CAA4B,UAAAmB,IAAI,EAAI;EAAA,UACxB1C,OADwB,GACa0C,IADb,CACxB1C,OADwB;EAAA,UACfwB,IADe,GACakB,IADb,CACflB,IADe;EAAA,UACTR,QADS,GACa0B,IADb,CACT1B,QADS;EAAA,UACCN,OADD,GACagC,IADb,CACChC,OADD;EAEhCV,MAAAA,OAAO,CAACc,mBAAR,CAA4BU,IAA5B,EAAkCR,QAAlC,EAA4CN,OAA5C;EACH,KAHD;EAKA,SAAKe,cAAL,GAAsB,EAAtB;EACH;EACJ;;AAGD,EAAO,SAASkB,KAAT,GAAiB;EAAA;;EACpB,SAAO,IAAIC,OAAJ,CACH,UAAAC,OAAO;EAAA,WAAK,MAAI,CAACF,KAAL,GAAaG,UAAU,CAACD,OAAD,EAAU,CAAV,CAAvB,GAAsClB,EAAE,CAACC,IAAH,CAAQ,MAAR,EAAc,MAAI,CAACmB,QAAL,CAAcC,SAA5B,EAAuC,OAAvC,EAAgDH,OAAhD,CAA3C;EAAA,GADJ,EAELI,IAFK,CAEA,YAAM,EAFN,CAAP;EAGH;;EC/GM,SAASC,IAAT,CAAcH,QAAd,EAAwBI,OAAxB,EAAiC;EACpC;EACA,MAAMC,OAAO,GAAGL,QAAQ,CAAC/D,MAAT,GAAkB+D,QAAlB,GAA6B,CAACA,QAAD,CAA7C,CAFoC;EAKpC;;EACApF,EAAAA,KAAK,CAAC0F,IAAN,CAAWD,OAAX,EACKE,OADL,GAEK/B,OAFL,CAEa,UAACvB,OAAD,EAAUuD,KAAV,EAAoB;EACzB,QAAMC,KAAK,GAAGD,KAAK,GAAG,CAAR,GAAYJ,OAAO,CAACM,SAAR,CAAkB,IAAlB,CAAZ,GAAsCN,OAApD,CADyB;;EAIzB,QAAMO,MAAM,GAAG1D,OAAO,CAAC2D,UAAvB;EACA,QAAMC,OAAO,GAAG5D,OAAO,CAAC6D,WAAxB,CALyB;EAQzB;;EACAL,IAAAA,KAAK,CAACM,WAAN,CAAkB9D,OAAlB,EATyB;EAYzB;EACA;;EACA,QAAI4D,OAAJ,EAAa;EACTF,MAAAA,MAAM,CAACK,YAAP,CAAoBP,KAApB,EAA2BI,OAA3B;EACH,KAFD,MAEO;EACHF,MAAAA,MAAM,CAACI,WAAP,CAAmBN,KAAnB;EACH;EACJ,GArBL;EAsBH;;AAGD,EAAO,SAASQ,aAAT,CAAuBhE,OAAvB,EAAgCiE,UAAhC,EAA4C;EAC/C,MAAI,CAAC7C,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAD,IAAwBoB,EAAE,CAACb,KAAH,CAAS0D,UAAT,CAA5B,EAAkD;EAC9C;EACH,GAH8C;EAM/C;;;EACAhH,EAAAA,MAAM,CAACiH,OAAP,CAAeD,UAAf,EACKE,MADL,CACY;EAAA;EAAA,QAAIC,KAAJ;;EAAA,WAAe,CAAChD,EAAE,CAAC5B,eAAH,CAAmB4E,KAAnB,CAAhB;EAAA,GADZ,EAEK7C,OAFL,CAEa;EAAA;EAAA,QAAE8C,GAAF;EAAA,QAAOD,KAAP;;EAAA,WAAkBpE,OAAO,CAACsE,YAAR,CAAqBD,GAArB,EAA0BD,KAA1B,CAAlB;EAAA,GAFb;EAGH;;AAGD,EAAO,SAASG,aAAT,CAAuB/C,IAAvB,EAA6ByC,UAA7B,EAAyCO,IAAzC,EAA+C;EAClD;EACA,MAAMxE,OAAO,GAAGyE,QAAQ,CAACF,aAAT,CAAuB/C,IAAvB,CAAhB,CAFkD;;EAKlD,MAAIJ,EAAE,CAAC3B,MAAH,CAAUwE,UAAV,CAAJ,EAA2B;EACvBD,IAAAA,aAAa,CAAChE,OAAD,EAAUiE,UAAV,CAAb;EACH,GAPiD;;;EAUlD,MAAI7C,EAAE,CAAChC,MAAH,CAAUoF,IAAV,CAAJ,EAAqB;EACjBxE,IAAAA,OAAO,CAAC0E,SAAR,GAAoBF,IAApB;EACH,GAZiD;;;EAelD,SAAOxE,OAAP;EACH;;AAGD,EAAO,SAAS2E,WAAT,CAAqB3E,OAArB,EAA8B4E,MAA9B,EAAsC;EACzC,MAAI,CAACxD,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAD,IAAwB,CAACoB,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAA7B,EAAiD;EAC7C;EACH;;EAEDA,EAAAA,MAAM,CAACjB,UAAP,CAAkBI,YAAlB,CAA+B/D,OAA/B,EAAwC4E,MAAM,CAACf,WAA/C;EACH;;AAGD,EAAO,SAASgB,aAAT,CAAuBrD,IAAvB,EAA6BkC,MAA7B,EAAqCO,UAArC,EAAiDO,IAAjD,EAAuD;EAC1D,MAAI,CAACpD,EAAE,CAACpB,OAAH,CAAW0D,MAAX,CAAL,EAAyB;EACrB;EACH;;EAEDA,EAAAA,MAAM,CAACI,WAAP,CAAmBS,aAAa,CAAC/C,IAAD,EAAOyC,UAAP,EAAmBO,IAAnB,CAAhC;EACH;;AAGD,EAAO,SAASM,aAAT,CAAuB9E,OAAvB,EAAgC;EACnC,MAAIoB,EAAE,CAACrB,QAAH,CAAYC,OAAZ,KAAwBoB,EAAE,CAACvB,KAAH,CAASG,OAAT,CAA5B,EAA+C;EAC3CrC,IAAAA,KAAK,CAAC0F,IAAN,CAAWrD,OAAX,EAAoBuB,OAApB,CAA4BuD,aAA5B;EACA;EACH;;EAED,MAAI,CAAC1D,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAD,IAAwB,CAACoB,EAAE,CAACpB,OAAH,CAAWA,OAAO,CAAC2D,UAAnB,CAA7B,EAA6D;EACzD;EACH;;EAED3D,EAAAA,OAAO,CAAC2D,UAAR,CAAmBoB,WAAnB,CAA+B/E,OAA/B;EACH;;AAGD,EAAO,SAASgF,YAAT,CAAsBhF,OAAtB,EAA+B;EAClC,MAAI,CAACoB,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAL,EAA0B;EACtB;EACH;;EAHiC,MAK5BhB,MAL4B,GAKjBgB,OAAO,CAACiF,UALS,CAK5BjG,MAL4B;;EAOlC,SAAOA,MAAM,GAAG,CAAhB,EAAmB;EACfgB,IAAAA,OAAO,CAAC+E,WAAR,CAAoB/E,OAAO,CAACkF,SAA5B;EACAlG,IAAAA,MAAM,IAAI,CAAV;EACH;EACJ;;AAGD,EAAO,SAASmG,cAAT,CAAwBC,QAAxB,EAAkCC,QAAlC,EAA4C;EAC/C,MAAI,CAACjE,EAAE,CAACpB,OAAH,CAAWqF,QAAX,CAAD,IAAyB,CAACjE,EAAE,CAACpB,OAAH,CAAWqF,QAAQ,CAAC1B,UAApB,CAA1B,IAA6D,CAACvC,EAAE,CAACpB,OAAH,CAAWoF,QAAX,CAAlE,EAAwF;EACpF,WAAO,IAAP;EACH;;EAEDC,EAAAA,QAAQ,CAAC1B,UAAT,CAAoB2B,YAApB,CAAiCF,QAAjC,EAA2CC,QAA3C;EAEA,SAAOD,QAAP;EACH;;AAGD,EAAO,SAASG,yBAAT,CAAmCC,GAAnC,EAAwCC,kBAAxC,EAA4D;EAC/D;EACA;EACA;EACA;EAEA,MAAI,CAACrE,EAAE,CAAChC,MAAH,CAAUoG,GAAV,CAAD,IAAmBpE,EAAE,CAACb,KAAH,CAASiF,GAAT,CAAvB,EAAsC;EAClC,WAAO,EAAP;EACH;;EAED,MAAMvB,UAAU,GAAG,EAAnB;EACA,MAAMyB,QAAQ,GAAGD,kBAAjB;EAEAD,EAAAA,GAAG,CAAClE,KAAJ,CAAU,GAAV,EAAeC,OAAf,CAAuB,UAAAoE,CAAC,EAAI;EACxB;EACA,QAAMC,QAAQ,GAAGD,CAAC,CAACE,IAAF,EAAjB;EACA,QAAMC,SAAS,GAAGF,QAAQ,CAACG,OAAT,CAAiB,GAAjB,EAAsB,EAAtB,CAAlB;EACA,QAAMC,QAAQ,GAAGJ,QAAQ,CAACG,OAAT,CAAiB,QAAjB,EAA2B,EAA3B,CAAjB,CAJwB;;EAOxB,QAAME,KAAK,GAAGD,QAAQ,CAAC1E,KAAT,CAAe,GAAf,CAAd;EACA,QAAM+C,GAAG,GAAG4B,KAAK,CAAC,CAAD,CAAjB;EACA,QAAM7B,KAAK,GAAG6B,KAAK,CAACjH,MAAN,GAAe,CAAf,GAAmBiH,KAAK,CAAC,CAAD,CAAL,CAASF,OAAT,CAAiB,OAAjB,EAA0B,EAA1B,CAAnB,GAAmD,EAAjE,CATwB;;EAYxB,QAAMG,KAAK,GAAGN,QAAQ,CAACO,MAAT,CAAgB,CAAhB,CAAd;;EAEA,YAAQD,KAAR;EACI,WAAK,GAAL;EACI;EACA,YAAI9E,EAAE,CAAC3B,MAAH,CAAUiG,QAAV,KAAuBtE,EAAE,CAAChC,MAAH,CAAUsG,QAAQ,CAACU,KAAnB,CAA3B,EAAsD;EAClDV,UAAAA,QAAQ,CAACU,KAAT,eAAsBN,SAAtB;EACH;;EAED7B,QAAAA,UAAU,CAACmC,KAAX,GAAmBN,SAAnB;EACA;;EAEJ,WAAK,GAAL;EACI;EACA7B,QAAAA,UAAU,CAACoC,EAAX,GAAgBT,QAAQ,CAACG,OAAT,CAAiB,GAAjB,EAAsB,EAAtB,CAAhB;EACA;;EAEJ,WAAK,GAAL;EACI;EACA9B,QAAAA,UAAU,CAACI,GAAD,CAAV,GAAkBD,KAAlB;EAEA;;EAEJ;EACI;EAtBR;EAwBH,GAtCD;EAwCA,SAAOH,UAAP;EACH;;AAGD,EAAO,SAASqC,YAAT,CAAsBtG,OAAtB,EAA+BuG,MAA/B,EAAuC;EAC1C,MAAI,CAACnF,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAL,EAA0B;EACtB;EACH;;EAED,MAAIwG,IAAI,GAAGD,MAAX;;EAEA,MAAI,CAACnF,EAAE,CAACzB,OAAH,CAAW6G,IAAX,CAAL,EAAuB;EACnBA,IAAAA,IAAI,GAAG,CAACxG,OAAO,CAACuG,MAAhB;EACH;;EAED,MAAIC,IAAJ,EAAU;EACNxG,IAAAA,OAAO,CAACsE,YAAR,CAAqB,QAArB,EAA+B,EAA/B;EACH,GAFD,MAEO;EACHtE,IAAAA,OAAO,CAACyG,eAAR,CAAwB,QAAxB;EACH;EACJ;;AAGD,EAAO,SAASC,WAAT,CAAqB1G,OAArB,EAA8B8F,SAA9B,EAAyCa,KAAzC,EAAgD;EACnD,MAAIvF,EAAE,CAACrB,QAAH,CAAYC,OAAZ,CAAJ,EAA0B;EACtB,WAAOrC,KAAK,CAAC0F,IAAN,CAAWrD,OAAX,EAAoB4G,GAApB,CAAwB,UAAArH,CAAC;EAAA,aAAImH,WAAW,CAACnH,CAAD,EAAIuG,SAAJ,EAAea,KAAf,CAAf;EAAA,KAAzB,CAAP;EACH;;EAED,MAAIvF,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAJ,EAAyB;EACrB,QAAI6G,MAAM,GAAG,QAAb;;EACA,QAAI,OAAOF,KAAP,KAAiB,WAArB,EAAkC;EAC9BE,MAAAA,MAAM,GAAGF,KAAK,GAAG,KAAH,GAAW,QAAzB;EACH;;EAED3G,IAAAA,OAAO,CAAC8G,SAAR,CAAkBD,MAAlB,EAA0Bf,SAA1B;EACA,WAAO9F,OAAO,CAAC8G,SAAR,CAAkBC,QAAlB,CAA2BjB,SAA3B,CAAP;EACH;;EAED,SAAO,KAAP;EACH;;AAGD,EAAO,SAASkB,QAAT,CAAkBhH,OAAlB,EAA2B8F,SAA3B,EAAsC;EACzC,SAAO1E,EAAE,CAACpB,OAAH,CAAWA,OAAX,KAAuBA,OAAO,CAAC8G,SAAR,CAAkBC,QAAlB,CAA2BjB,SAA3B,CAA9B;EACH;;AAGD,EAAO,SAASmB,OAAT,CAAiBjH,OAAjB,EAA0B4F,QAA1B,EAAoC;AACvC;EAEA,WAASsB,KAAT,GAAiB;EACb,WAAOvJ,KAAK,CAAC0F,IAAN,CAAWoB,QAAQ,CAAC0C,gBAAT,CAA0BvB,QAA1B,CAAX,EAAgDwB,QAAhD,CAAyD,IAAzD,CAAP;EACH;;EAED,MAAMH,OAAO,GACTI,AAIAH,KALJ;EAOA,SAAOD,OAAO,CAACrF,IAAR,CAAa5B,OAAb,EAAsB4F,QAAtB,CAAP;EACH;;AAGD,EAAO,SAAS0B,WAAT,CAAqB1B,QAArB,EAA+B;EAClC,SAAO,KAAK7C,QAAL,CAAcC,SAAd,CAAwBmE,gBAAxB,CAAyCvB,QAAzC,CAAP;EACH;;AAGD,EAAO,SAAS2B,UAAT,CAAoB3B,QAApB,EAA8B;EACjC,SAAO,KAAK7C,QAAL,CAAcC,SAAd,CAAwBwE,aAAxB,CAAsC5B,QAAtC,CAAP;EACH;;AAGD,EAAO,SAAS6B,SAAT,GAAmD;EAAA,MAAhCzH,OAAgC,uEAAtB,IAAsB;EAAA,MAAhBiB,MAAgB,uEAAP,KAAO;;EACtD,MAAI,CAACG,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAL,EAA0B;EACtB;EACH;;EAED,MAAM0H,SAAS,GAAGJ,WAAW,CAAC1F,IAAZ,CAAiB,IAAjB,EAAuB,yDAAvB,CAAlB;EACA,MAAM+F,KAAK,GAAGD,SAAS,CAAC,CAAD,CAAvB;EACA,MAAME,IAAI,GAAGF,SAAS,CAACA,SAAS,CAAC1I,MAAV,GAAmB,CAApB,CAAtB;;EAEA,MAAM6I,IAAI,GAAG,SAAPA,IAAO,CAAA3H,KAAK,EAAI;EAClB;EACA,QAAIA,KAAK,CAACmE,GAAN,KAAc,KAAd,IAAuBnE,KAAK,CAAC4H,OAAN,KAAkB,CAA7C,EAAgD;EAC5C;EACH,KAJiB;;;EAOlB,QAAMC,OAAO,GAAGtD,QAAQ,CAACuD,aAAzB;;EAEA,QAAID,OAAO,KAAKH,IAAZ,IAAoB,CAAC1H,KAAK,CAAC+H,QAA/B,EAAyC;EACrC;EACAN,MAAAA,KAAK,CAACO,KAAN;EACAhI,MAAAA,KAAK,CAACiI,cAAN;EACH,KAJD,MAIO,IAAIJ,OAAO,KAAKJ,KAAZ,IAAqBzH,KAAK,CAAC+H,QAA/B,EAAyC;EAC5C;EACAL,MAAAA,IAAI,CAACM,KAAL;EACAhI,MAAAA,KAAK,CAACiI,cAAN;EACH;EACJ,GAlBD;;EAoBApH,EAAAA,cAAc,CAACa,IAAf,CAAoB,IAApB,EAA0B,KAAKmB,QAAL,CAAcC,SAAxC,EAAmD,SAAnD,EAA8D6E,IAA9D,EAAoE5G,MAApE,EAA4E,KAA5E;EACH;;AAGD,EAAO,SAASmH,QAAT,GAAoD;EAAA,MAAlCpI,OAAkC,uEAAxB,IAAwB;EAAA,MAAlBqI,QAAkB,uEAAP,KAAO;;EACvD,MAAI,CAACjH,EAAE,CAACpB,OAAH,CAAWA,OAAX,CAAL,EAA0B;EACtB;EACH,GAHsD;;;EAMvDA,EAAAA,OAAO,CAACkI,KAAR,CAAc;EAAEI,IAAAA,aAAa,EAAE;EAAjB,GAAd,EANuD;;EASvD,MAAID,QAAJ,EAAc;EACV3B,IAAAA,WAAW,CAAC1G,OAAD,EAAU,KAAKuI,MAAL,CAAYC,UAAZ,CAAuBH,QAAjC,CAAX;EACH;EACJ;;EC7SD;AACA,EAMO,IAAMI,kBAAkB,GAAI,YAAM;EACrC,MAAMzI,OAAO,GAAGyE,QAAQ,CAACF,aAAT,CAAuB,MAAvB,CAAhB;EAEA,MAAMlD,MAAM,GAAG;EACXqH,IAAAA,gBAAgB,EAAE,qBADP;EAEXC,IAAAA,aAAa,EAAE,eAFJ;EAGXC,IAAAA,WAAW,EAAE,+BAHF;EAIXC,IAAAA,UAAU,EAAE;EAJD,GAAf;EAOA,MAAMrH,IAAI,GAAGvE,MAAM,CAACgC,IAAP,CAAYoC,MAAZ,EAAoByH,IAApB,CAAyB,UAAA5I,KAAK;EAAA,WAAIF,OAAO,CAAC+I,KAAR,CAAc7I,KAAd,MAAyB8I,SAA7B;EAAA,GAA9B,CAAb;EAEA,SAAO5H,EAAE,CAAChC,MAAH,CAAUoC,IAAV,IAAkBH,MAAM,CAACG,IAAD,CAAxB,GAAiC,KAAxC;EACH,CAbiC,EAA3B;;AAgBP,EAAO,SAASyH,OAAT,CAAiBjJ,OAAjB,EAA0B;EAC7B8C,EAAAA,UAAU,CAAC,YAAM;EACb,QAAI;EACAwD,MAAAA,YAAY,CAACtG,OAAD,EAAU,IAAV,CAAZ;EACAA,MAAAA,OAAO,CAACkJ,YAAR,CAFA;;EAGA5C,MAAAA,YAAY,CAACtG,OAAD,EAAU,KAAV,CAAZ;EACH,KAJD,CAIE,OAAOT,CAAP,EAAU;EAEX;EACJ,GARS,EAQP,CARO,CAAV;EASH;;ECjCD;EACA;EACA;EACA;EAEA,IAAM4J,OAAO,GAAG;EACZC,EAAAA,IAAI;EAAE;EAAe,EAAS,CAAC,CAAC3E,QAAQ,CAAC4E,YAD7B;EAEZC,EAAAA,QAAQ,EAAE,sBAAsB7E,QAAQ,CAAC8E,eAAT,CAAyBR,KAA/C,IAAwD,CAAC,OAAOS,IAAP,CAAYC,SAAS,CAACC,SAAtB,CAFvD;EAGZC,EAAAA,QAAQ,EAAE,kBAAkBH,IAAlB,CAAuBC,SAAS,CAACG,QAAjC,CAHE;EAIZC,EAAAA,KAAK,EAAE,uBAAuBL,IAAvB,CAA4BC,SAAS,CAACG,QAAtC;EAJK,CAAhB;;ECKA,IAAME,aAAa,GAAG;EAClB,eAAa,QADK;EAElB,eAAa,GAFK;EAGlB,gBAAc,aAHI;EAIlB,eAAa,wBAJK;EAKlB,eAAa;EALK,CAAtB;;EASA,IAAMC,OAAO,GAAG;EACZ;EACAC,EAAAA,KAAK,EAAE,iBAAiBvF,QAAQ,CAACF,aAAT,CAAuB,OAAvB,CAFZ;EAGZ0F,EAAAA,KAAK,EAAE,iBAAiBxF,QAAQ,CAACF,aAAT,CAAuB,OAAvB,CAHZ;EAKZ;EACA;EACA2F,EAAAA,KAPY,iBAON1I,IAPM,EAOA2I,QAPA,EAOUC,WAPV,EAOuB;EAC/B,QAAMC,aAAa,GAAGlB,OAAO,CAACQ,QAAR,IAAoBS,WAApB,IAAmCL,OAAO,CAACK,WAAjE;EACA,QAAME,GAAG,GAAGP,OAAO,CAACvI,IAAD,CAAP,IAAiB2I,QAAQ,KAAK,OAA1C;EACA,QAAMI,EAAE,GAAGD,GAAG,IAAIP,OAAO,CAACS,UAAf,KAA8BhJ,IAAI,KAAK,OAAT,IAAoB,CAAC2H,OAAO,CAACQ,QAA7B,IAAyCU,aAAvE,CAAX;EAEA,WAAO;EACHC,MAAAA,GAAG,EAAHA,GADG;EAEHC,MAAAA,EAAE,EAAFA;EAFG,KAAP;EAIH,GAhBW;EAkBZ;EACA;EACAE,EAAAA,GAAG,EAAG,YAAM;EACR,QAAItB,OAAO,CAACQ,QAAZ,EAAsB;EAClB,aAAO,KAAP;EACH,KAHO;EAMR;;;EACA,QAAIvI,EAAE,CAACxB,QAAH,CAAY2E,aAAa,CAAC,OAAD,CAAb,CAAuBmG,yBAAnC,CAAJ,EAAmE;EAC/D,aAAO,IAAP;EACH,KATO;EAYR;;;EACA,QAAIjG,QAAQ,CAACkG,uBAAT,IAAoC,CAACpG,aAAa,CAAC,OAAD,CAAb,CAAuBqG,uBAAhE,EAAyF;EACrF,aAAO,IAAP;EACH;;EAED,WAAO,KAAP;EACH,GAlBI,EApBO;EAwCZ;EACA;EACAC,EAAAA,OAAO,EAAEzJ,EAAE,CAACxB,QAAH,CAAYnB,MAAM,CAACqM,qCAAnB,CA1CG;EA4CZ;EACA;EACAV,EAAAA,WAAW,EAAE,iBAAiB3F,QAAQ,CAACF,aAAT,CAAuB,OAAvB,CA9ClB;EAgDZ;EACA;EACA;EACAwG,EAAAA,IAnDY,gBAmDPC,SAnDO,EAmDI;EAAA,2BACQA,SAAS,CAAC1J,KAAV,CAAgB,GAAhB,CADR;EAAA;EAAA,QACL2J,SADK;;EAEZ,QAAIzJ,IAAI,GAAGwJ,SAAX,CAFY;;EAKZ,QAAI,CAAC,KAAKE,OAAN,IAAiBD,SAAS,KAAK,KAAKzJ,IAAxC,EAA8C;EAC1C,aAAO,KAAP;EACH,KAPW;;;EAUZ,QAAIvE,MAAM,CAACgC,IAAP,CAAY6K,aAAZ,EAA2B1C,QAA3B,CAAoC5F,IAApC,CAAJ,EAA+C;EAC3CA,MAAAA,IAAI,yBAAiBsI,aAAa,CAACkB,SAAD,CAA9B,OAAJ;EACH;;EAED,QAAI;EACA,aAAOlO,OAAO,CAAC0E,IAAI,IAAI,KAAK2J,KAAL,CAAWC,WAAX,CAAuB5J,IAAvB,EAA6BuE,OAA7B,CAAqC,IAArC,EAA2C,EAA3C,CAAT,CAAd;EACH,KAFD,CAEE,OAAOxG,CAAP,EAAU;EACR,aAAO,KAAP;EACH;EACJ,GAtEW;EAwEZ;EACA8L,EAAAA,UAAU,EAAE,gBAAgB5G,QAAQ,CAACF,aAAT,CAAuB,OAAvB,CAzEhB;EA2EZ;EACAiG,EAAAA,UAAU,EAAG,YAAM;EACf,QAAMc,KAAK,GAAG7G,QAAQ,CAACF,aAAT,CAAuB,OAAvB,CAAd;EACA+G,IAAAA,KAAK,CAAC9J,IAAN,GAAa,OAAb;EACA,WAAO8J,KAAK,CAAC9J,IAAN,KAAe,OAAtB;EACH,GAJW,EA5EA;EAkFZ;EACA;EACA+J,EAAAA,KAAK,EAAE,kBAAkB9G,QAAQ,CAAC8E,eApFtB;EAsFZ;EACAiC,EAAAA,WAAW,EAAE/C,kBAAkB,KAAK,KAvFxB;EAyFZ;EACA;EACAgD,EAAAA,aAAa,EAAE,gBAAgBhN,MAAhB,IAA0BA,MAAM,CAACiN,UAAP,CAAkB,0BAAlB,EAA8CzE;EA3F3E,CAAhB;;ECnBA;AACA,EAOA,IAAM0E,KAAK,GAAG;EACVC,EAAAA,UADU,wBACG;EAAA;;EACT,QAAI,CAAC,KAAKV,OAAV,EAAmB;EACf,aAAO,EAAP;EACH;;EAED,QAAMW,OAAO,GAAGlO,KAAK,CAAC0F,IAAN,CAAW,KAAK8H,KAAL,CAAWhE,gBAAX,CAA4B,QAA5B,CAAX,CAAhB,CALS;;EAQT,WAAO0E,OAAO,CAAC1H,MAAR,CAAe,UAAA2H,MAAM;EAAA,aAAI/B,OAAO,CAACgB,IAAR,CAAanJ,IAAb,CAAkB,KAAlB,EAAwBkK,MAAM,CAACC,YAAP,CAAoB,MAApB,CAAxB,CAAJ;EAAA,KAArB,CAAP;EACH,GAVS;EAYV;EACAC,EAAAA,iBAbU,+BAaU;EAChB;EACA,WAAOL,KAAK,CAACC,UAAN,CACFhK,IADE,CACG,IADH,EAEFgF,GAFE,CAEE,UAAAkF,MAAM;EAAA,aAAI3O,MAAM,CAAC2O,MAAM,CAACC,YAAP,CAAoB,MAApB,CAAD,CAAV;EAAA,KAFR,EAGF5H,MAHE,CAGKrH,OAHL,CAAP;EAIH,GAnBS;EAqBVmP,EAAAA,MArBU,oBAqBD;EACL,QAAI,CAAC,KAAKf,OAAV,EAAmB;EACf;EACH;;EAED,QAAMgB,MAAM,GAAG,IAAf,CALK;;EAQLjP,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,SAApC,EAA+C;EAC3CvK,MAAAA,GAD2C,iBACrC;EACF;EACA,YAAMiL,OAAO,GAAGF,KAAK,CAACC,UAAN,CAAiBhK,IAAjB,CAAsBsK,MAAtB,CAAhB;EACA,YAAMJ,MAAM,GAAGD,OAAO,CAAC/C,IAAR,CAAa,UAAAgD,MAAM;EAAA,iBAAIA,MAAM,CAACC,YAAP,CAAoB,KAApB,MAA+BG,MAAM,CAACJ,MAA1C;EAAA,SAAnB,CAAf,CAHE;;EAMF,eAAOA,MAAM,IAAI3O,MAAM,CAAC2O,MAAM,CAACC,YAAP,CAAoB,MAApB,CAAD,CAAvB;EACH,OAR0C;EAS3CI,MAAAA,GAT2C,eASvCxP,KATuC,EAShC;EACP;EACA,YAAMkP,OAAO,GAAGF,KAAK,CAACC,UAAN,CAAiBhK,IAAjB,CAAsBsK,MAAtB,CAAhB,CAFO;;EAKP,YAAMJ,MAAM,GAAGD,OAAO,CAAC/C,IAAR,CAAa,UAAAgD,MAAM;EAAA,iBAAI3O,MAAM,CAAC2O,MAAM,CAACC,YAAP,CAAoB,MAApB,CAAD,CAAN,KAAwCpP,KAA5C;EAAA,SAAnB,CAAf,CALO;;EAQP,YAAI,CAACmP,MAAL,EAAa;EACT;EACH,SAVM;;;EAAA,4BAa8CI,MAAM,CAACf,KAbrD;EAAA,YAaCiB,WAbD,iBAaCA,WAbD;EAAA,YAacC,MAbd,iBAacA,MAbd;EAAA,YAasBC,OAbtB,iBAasBA,OAbtB;EAAA,YAa+BC,UAb/B,iBAa+BA,UAb/B;;EAgBPL,QAAAA,MAAM,CAACf,KAAP,CAAaqB,GAAb,GAAmBV,MAAM,CAACC,YAAP,CAAoB,KAApB,CAAnB,CAhBO;;EAmBP,YAAIO,OAAO,KAAK,MAAZ,IAAsBC,UAA1B,EAAsC;EAClC;EACAL,UAAAA,MAAM,CAACpK,IAAP,CAAY,gBAAZ,EAA8B,YAAM;EAChCoK,YAAAA,MAAM,CAACE,WAAP,GAAqBA,WAArB,CADgC;;EAIhC,gBAAI,CAACC,MAAL,EAAa;EACTH,cAAAA,MAAM,CAACO,IAAP;EACH;EACJ,WAPD,EAFkC;;EAYlCP,UAAAA,MAAM,CAACf,KAAP,CAAauB,IAAb;EACH,SAhCM;;;EAmCPxK,QAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,eAAxC,EAAyD,KAAzD,EAAgE;EAC5DwB,UAAAA,OAAO,EAAEhQ;EADmD,SAAhE;EAGH;EA/C0C,KAA/C;EAiDH,GA9ES;EAgFV;EACA;EACAiQ,EAAAA,cAlFU,4BAkFO;EACb,QAAI,CAAC,KAAK1B,OAAV,EAAmB;EACf;EACH,KAHY;;;EAMbpG,IAAAA,aAAa,CAAC6G,KAAK,CAACC,UAAN,CAAiBhK,IAAjB,CAAsB,IAAtB,CAAD,CAAb,CANa;EASb;EACA;;EACA,SAAKuJ,KAAL,CAAW7G,YAAX,CAAwB,KAAxB,EAA+B,KAAKiE,MAAL,CAAYsE,UAA3C,EAXa;EAcb;EACA;;EACA,SAAK1B,KAAL,CAAWuB,IAAX,GAhBa;;EAmBb,SAAKI,KAAL,CAAWC,GAAX,CAAe,4BAAf;EACH;EAtGS,CAAd;;ECRA;AACA;AAMA,EAAO,SAASC,MAAT,CAAgBnN,KAAhB,EAAuB;EAC1B,MAAI,CAACuB,EAAE,CAACvB,KAAH,CAASA,KAAT,CAAL,EAAsB;EAClB,WAAOA,KAAP;EACH;;EAED,SAAOA,KAAK,CAACsE,MAAN,CAAa,UAACzB,IAAD,EAAOa,KAAP;EAAA,WAAiB1D,KAAK,CAACoN,OAAN,CAAcvK,IAAd,MAAwBa,KAAzC;EAAA,GAAb,CAAP;EACH;;AAGD,EAAO,SAAS2J,OAAT,CAAiBrN,KAAjB,EAAwBuE,KAAxB,EAA+B;EAClC,MAAI,CAAChD,EAAE,CAACvB,KAAH,CAASA,KAAT,CAAD,IAAoB,CAACA,KAAK,CAACb,MAA/B,EAAuC;EACnC,WAAO,IAAP;EACH;;EAED,SAAOa,KAAK,CAACsN,MAAN,CAAa,UAACC,IAAD,EAAOC,IAAP;EAAA,WAAiBC,IAAI,CAACC,GAAL,CAASF,IAAI,GAAGjJ,KAAhB,IAAyBkJ,IAAI,CAACC,GAAL,CAASH,IAAI,GAAGhJ,KAAhB,CAAzB,GAAkDiJ,IAAlD,GAAyDD,IAA1E;EAAA,GAAb,CAAP;EACH;;ECfM,SAASI,SAAT,CAAmB/N,MAAnB,EAA2B;EAC9B,SAAOgO,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAelO,MAAf,CAAX,CAAP;EACH;;AAGD,EAAO,SAASmO,OAAT,CAAiBnO,MAAjB,EAAyBoO,IAAzB,EAA+B;EAClC,SAAOA,IAAI,CAACvM,KAAL,CAAW,GAAX,EAAgB6L,MAAhB,CAAuB,UAACW,GAAD,EAAMzJ,GAAN;EAAA,WAAcyJ,GAAG,IAAIA,GAAG,CAACzJ,GAAD,CAAxB;EAAA,GAAvB,EAAsD5E,MAAtD,CAAP;EACH;;AAGD,EAAO,SAASwM,MAAT,GAAyC;EAAA,MAAzBrH,MAAyB,uEAAhB,EAAgB;;EAAA,oCAATiH,OAAS;EAATA,IAAAA,OAAS;EAAA;;EAC5C,MAAI,CAACA,OAAO,CAAC7M,MAAb,EAAqB;EACjB,WAAO4F,MAAP;EACH;;EAED,MAAMkH,MAAM,GAAGD,OAAO,CAACkC,KAAR,EAAf;;EAEA,MAAI,CAAC3M,EAAE,CAAC3B,MAAH,CAAUqM,MAAV,CAAL,EAAwB;EACpB,WAAOlH,MAAP;EACH;;EAED3H,EAAAA,MAAM,CAACgC,IAAP,CAAY6M,MAAZ,EAAoBvK,OAApB,CAA4B,UAAA8C,GAAG,EAAI;EAC/B,QAAIjD,EAAE,CAAC3B,MAAH,CAAUqM,MAAM,CAACzH,GAAD,CAAhB,CAAJ,EAA4B;EACxB,UAAI,CAACpH,MAAM,CAACgC,IAAP,CAAY2F,MAAZ,EAAoBwC,QAApB,CAA6B/C,GAA7B,CAAL,EAAwC;EACpCpH,QAAAA,MAAM,CAACqF,MAAP,CAAcsC,MAAd,sBAAyBP,GAAzB,EAA+B,EAA/B;EACH;;EAED4H,MAAAA,MAAM,CAACrH,MAAM,CAACP,GAAD,CAAP,EAAcyH,MAAM,CAACzH,GAAD,CAApB,CAAN;EACH,KAND,MAMO;EACHpH,MAAAA,MAAM,CAACqF,MAAP,CAAcsC,MAAd,sBAAyBP,GAAzB,EAA+ByH,MAAM,CAACzH,GAAD,CAArC;EACH;EACJ,GAVD;EAYA,SAAO4H,MAAM,MAAN,UAAOrH,MAAP,SAAkBiH,OAAlB,EAAP;EACH;;ECzCD;AACA;AAMA,EAAO,SAASmC,UAAT,CAAoBC,MAApB,EAA4B;EAC/B,mBAAUA,MAAV,cAAoBX,IAAI,CAACY,KAAL,CAAWZ,IAAI,CAACa,MAAL,KAAgB,KAA3B,CAApB;EACH;;AAGD,EAAO,SAASC,MAAT,CAAgBzR,KAAhB,EAAgC;EAAA,oCAANqF,IAAM;EAANA,IAAAA,IAAM;EAAA;;EACnC,MAAIZ,EAAE,CAACb,KAAH,CAAS5D,KAAT,CAAJ,EAAqB;EACjB,WAAOA,KAAP;EACH;;EAED,SAAOA,KAAK,CAAC0R,QAAN,GAAiBtI,OAAjB,CAAyB,UAAzB,EAAqC,UAACmB,KAAD,EAAQoH,CAAR;EAAA,WAActM,IAAI,CAACsM,CAAD,CAAJ,CAAQD,QAAR,EAAd;EAAA,GAArC,CAAP;EACH;;AAGD,EAAO,SAASE,aAAT,CAAuBC,OAAvB,EAAgCC,GAAhC,EAAqC;EACxC,MAAID,OAAO,KAAK,CAAZ,IAAiBC,GAAG,KAAK,CAAzB,IAA8BtR,MAAM,CAACC,KAAP,CAAaoR,OAAb,CAA9B,IAAuDrR,MAAM,CAACC,KAAP,CAAaqR,GAAb,CAA3D,EAA8E;EAC1E,WAAO,CAAP;EACH;;EAED,SAAO,CAAED,OAAO,GAAGC,GAAX,GAAkB,GAAnB,EAAwBC,OAAxB,CAAgC,CAAhC,CAAP;EACH;;AAGD,EAAO,SAASC,UAAT,GAAyD;EAAA,MAArChS,KAAqC,uEAA7B,EAA6B;EAAA,MAAzBmM,IAAyB,uEAAlB,EAAkB;EAAA,MAAd/C,OAAc,uEAAJ,EAAI;EAC5D,SAAOpJ,KAAK,CAACoJ,OAAN,CACH,IAAI6I,MAAJ,CAAW9F,IAAI,CAACuF,QAAL,GAAgBtI,OAAhB,CAAwB,2BAAxB,EAAqD,MAArD,CAAX,EAAyE,GAAzE,CADG,EAEHA,OAAO,CAACsI,QAAR,EAFG,CAAP;EAIH;;AAGD,EAAO,SAASQ,WAAT,GAAiC;EAAA,MAAZlS,KAAY,uEAAJ,EAAI;EACpC,SAAOA,KAAK,CAAC0R,QAAN,GAAiBtI,OAAjB,CAAyB,QAAzB,EAAmC,UAAAvB,IAAI;EAAA,WAAIA,IAAI,CAAC2B,MAAL,CAAY,CAAZ,EAAe2I,WAAf,KAA+BtK,IAAI,CAACuK,MAAL,CAAY,CAAZ,EAAeC,WAAf,EAAnC;EAAA,GAAvC,CAAP;EACH;;AAGD,EAAO,SAASC,YAAT,GAAkC;EAAA,MAAZtS,KAAY,uEAAJ,EAAI;EACrC,MAAIyC,MAAM,GAAGzC,KAAK,CAAC0R,QAAN,EAAb,CADqC;;EAIrCjP,EAAAA,MAAM,GAAGuP,UAAU,CAACvP,MAAD,EAAS,GAAT,EAAc,GAAd,CAAnB,CAJqC;;EAOrCA,EAAAA,MAAM,GAAGuP,UAAU,CAACvP,MAAD,EAAS,GAAT,EAAc,GAAd,CAAnB,CAPqC;;EAUrCA,EAAAA,MAAM,GAAGyP,WAAW,CAACzP,MAAD,CAApB,CAVqC;;EAarC,SAAOuP,UAAU,CAACvP,MAAD,EAAS,GAAT,EAAc,EAAd,CAAjB;EACH;;AAGD,EAAO,SAAS8P,WAAT,GAAiC;EAAA,MAAZvS,KAAY,uEAAJ,EAAI;EACpC,MAAIyC,MAAM,GAAGzC,KAAK,CAAC0R,QAAN,EAAb,CADoC;;EAIpCjP,EAAAA,MAAM,GAAG6P,YAAY,CAAC7P,MAAD,CAArB,CAJoC;;EAOpC,SAAOA,MAAM,CAAC+G,MAAP,CAAc,CAAd,EAAiB6I,WAAjB,KAAiC5P,MAAM,CAAC+P,KAAP,CAAa,CAAb,CAAxC;EACH;;AAGD,EAAO,SAASC,SAAT,CAAmBtD,MAAnB,EAA2B;EAC9B,MAAMuD,QAAQ,GAAG5K,QAAQ,CAAC6K,sBAAT,EAAjB;EACA,MAAMtP,OAAO,GAAGyE,QAAQ,CAACF,aAAT,CAAuB,KAAvB,CAAhB;EACA8K,EAAAA,QAAQ,CAACvL,WAAT,CAAqB9D,OAArB;EACAA,EAAAA,OAAO,CAACuP,SAAR,GAAoBzD,MAApB;EACA,SAAOuD,QAAQ,CAACG,UAAT,CAAoB9K,SAA3B;EACH;;AAGD,EAAO,SAAS+K,OAAT,CAAiBzP,OAAjB,EAA0B;EAC7B,MAAMmD,OAAO,GAAGsB,QAAQ,CAACF,aAAT,CAAuB,KAAvB,CAAhB;EACApB,EAAAA,OAAO,CAACW,WAAR,CAAoB9D,OAApB;EACA,SAAOmD,OAAO,CAACoM,SAAf;EACH;;EC3ED,IAAMG,SAAS,GAAG;EACdjF,EAAAA,GAAG,EAAE,KADS;EAEdI,EAAAA,OAAO,EAAE,SAFK;EAGdc,EAAAA,KAAK,EAAE,OAHO;EAIdgE,EAAAA,KAAK,EAAE,OAJO;EAKdC,EAAAA,OAAO,EAAE;EALK,CAAlB;EAQA,IAAMC,IAAI,GAAG;EACTjP,EAAAA,GADS,iBACkB;EAAA,QAAvByD,GAAuB,uEAAjB,EAAiB;EAAA,QAAbkE,MAAa,uEAAJ,EAAI;;EACvB,QAAInH,EAAE,CAACb,KAAH,CAAS8D,GAAT,KAAiBjD,EAAE,CAACb,KAAH,CAASgI,MAAT,CAArB,EAAuC;EACnC,aAAO,EAAP;EACH;;EAED,QAAInJ,MAAM,GAAGwO,OAAO,CAACrF,MAAM,CAACsH,IAAR,EAAcxL,GAAd,CAApB;;EAEA,QAAIjD,EAAE,CAACb,KAAH,CAASnB,MAAT,CAAJ,EAAsB;EAClB,UAAInC,MAAM,CAACgC,IAAP,CAAYyQ,SAAZ,EAAuBtI,QAAvB,CAAgC/C,GAAhC,CAAJ,EAA0C;EACtC,eAAOqL,SAAS,CAACrL,GAAD,CAAhB;EACH;;EAED,aAAO,EAAP;EACH;;EAED,QAAM0B,OAAO,GAAG;EACZ,oBAAcwC,MAAM,CAACuH,QADT;EAEZ,iBAAWvH,MAAM,CAACwH;EAFN,KAAhB;EAKA9S,IAAAA,MAAM,CAACiH,OAAP,CAAe6B,OAAf,EAAwBxE,OAAxB,CAAgC,gBAAkB;EAAA;EAAA,UAAhB8C,GAAgB;EAAA,UAAXD,KAAW;;EAC9ChF,MAAAA,MAAM,GAAGuP,UAAU,CAACvP,MAAD,EAASiF,GAAT,EAAcD,KAAd,CAAnB;EACH,KAFD;EAIA,WAAOhF,MAAP;EACH;EA1BQ,CAAb;;MCVM4Q;;;EACF,mBAAY9D,MAAZ,EAAoB;EAAA;;EAChB,SAAK+D,OAAL,GAAe/D,MAAM,CAAC3D,MAAP,CAAc2H,OAAd,CAAsBD,OAArC;EACA,SAAK5L,GAAL,GAAW6H,MAAM,CAAC3D,MAAP,CAAc2H,OAAd,CAAsB7L,GAAjC;EACH;;;;;0BAsBGA,KAAK;EACL,UAAI,CAAC2L,OAAO,CAACvP,SAAT,IAAsB,CAAC,KAAKwP,OAAhC,EAAyC;EACrC,eAAO,IAAP;EACH;;EAED,UAAME,KAAK,GAAG1R,MAAM,CAAC2R,YAAP,CAAoBC,OAApB,CAA4B,KAAKhM,GAAjC,CAAd;;EAEA,UAAIjD,EAAE,CAACb,KAAH,CAAS4P,KAAT,CAAJ,EAAqB;EACjB,eAAO,IAAP;EACH;;EAED,UAAMG,IAAI,GAAG7C,IAAI,CAACC,KAAL,CAAWyC,KAAX,CAAb;EAEA,aAAO/O,EAAE,CAAChC,MAAH,CAAUiF,GAAV,KAAkBA,GAAG,CAACrF,MAAtB,GAA+BsR,IAAI,CAACjM,GAAD,CAAnC,GAA2CiM,IAAlD;EACH;;;0BAEG7Q,QAAQ;EACR;EACA,UAAI,CAACuQ,OAAO,CAACvP,SAAT,IAAsB,CAAC,KAAKwP,OAAhC,EAAyC;EACrC;EACH,OAJO;;;EAOR,UAAI,CAAC7O,EAAE,CAAC3B,MAAH,CAAUA,MAAV,CAAL,EAAwB;EACpB;EACH,OATO;;;EAYR,UAAIyQ,OAAO,GAAG,KAAKtP,GAAL,EAAd,CAZQ;;EAeR,UAAIQ,EAAE,CAACb,KAAH,CAAS2P,OAAT,CAAJ,EAAuB;EACnBA,QAAAA,OAAO,GAAG,EAAV;EACH,OAjBO;;;EAoBRjE,MAAAA,MAAM,CAACiE,OAAD,EAAUzQ,MAAV,CAAN,CApBQ;;EAuBRhB,MAAAA,MAAM,CAAC2R,YAAP,CAAoBG,OAApB,CAA4B,KAAKlM,GAAjC,EAAsCoJ,IAAI,CAACE,SAAL,CAAeuC,OAAf,CAAtC;EACH;;;0BA3DsB;EACnB,UAAI;EACA,YAAI,EAAE,kBAAkBzR,MAApB,CAAJ,EAAiC;EAC7B,iBAAO,KAAP;EACH;;EAED,YAAM+K,IAAI,GAAG,SAAb,CALA;EAQA;;EACA/K,QAAAA,MAAM,CAAC2R,YAAP,CAAoBG,OAApB,CAA4B/G,IAA5B,EAAkCA,IAAlC;EACA/K,QAAAA,MAAM,CAAC2R,YAAP,CAAoBI,UAApB,CAA+BhH,IAA/B;EAEA,eAAO,IAAP;EACH,OAbD,CAaE,OAAOjK,CAAP,EAAU;EACR,eAAO,KAAP;EACH;EACJ;;;;;;EC/BL;EACA;EACA;EACA;AAEA,EAAe,SAASkR,KAAT,CAAenQ,GAAf,EAA2C;EAAA,MAAvBoQ,YAAuB,uEAAR,MAAQ;EACtD,SAAO,IAAI9N,OAAJ,CAAY,UAACC,OAAD,EAAU8N,MAAV,EAAqB;EACpC,QAAI;EACA,UAAMC,OAAO,GAAG,IAAIC,cAAJ,EAAhB,CADA;;EAIA,UAAI,EAAE,qBAAqBD,OAAvB,CAAJ,EAAqC;EACjC;EACH;;EAEDA,MAAAA,OAAO,CAAC/P,gBAAR,CAAyB,MAAzB,EAAiC,YAAM;EACnC,YAAI6P,YAAY,KAAK,MAArB,EAA6B;EACzB,cAAI;EACA7N,YAAAA,OAAO,CAAC4K,IAAI,CAACC,KAAL,CAAWkD,OAAO,CAACE,YAAnB,CAAD,CAAP;EACH,WAFD,CAEE,OAAOvR,CAAP,EAAU;EACRsD,YAAAA,OAAO,CAAC+N,OAAO,CAACE,YAAT,CAAP;EACH;EACJ,SAND,MAMO;EACHjO,UAAAA,OAAO,CAAC+N,OAAO,CAACG,QAAT,CAAP;EACH;EACJ,OAVD;EAYAH,MAAAA,OAAO,CAAC/P,gBAAR,CAAyB,OAAzB,EAAkC,YAAM;EACpC,cAAM,IAAImQ,KAAJ,CAAUJ,OAAO,CAACK,MAAlB,CAAN;EACH,OAFD;EAIAL,MAAAA,OAAO,CAACM,IAAR,CAAa,KAAb,EAAoB5Q,GAApB,EAAyB,IAAzB,EAxBA;;EA2BAsQ,MAAAA,OAAO,CAACF,YAAR,GAAuBA,YAAvB;EAEAE,MAAAA,OAAO,CAACO,IAAR;EACH,KA9BD,CA8BE,OAAO5R,CAAP,EAAU;EACRoR,MAAAA,MAAM,CAACpR,CAAD,CAAN;EACH;EACJ,GAlCM,CAAP;EAmCH;;ECzCD;AACA;AAQA,EAAe,SAAS6R,UAAT,CAAoB9Q,GAApB,EAAyB+F,EAAzB,EAA6B;EACxC,MAAI,CAACjF,EAAE,CAAChC,MAAH,CAAUkB,GAAV,CAAL,EAAqB;EACjB;EACH;;EAED,MAAM2N,MAAM,GAAG,OAAf;EACA,MAAMoD,KAAK,GAAGjQ,EAAE,CAAChC,MAAH,CAAUiH,EAAV,CAAd;EACA,MAAIiL,QAAQ,GAAG,KAAf;;EAEA,MAAMC,MAAM,GAAG,SAATA,MAAS;EAAA,WAAM9M,QAAQ,CAAC+M,cAAT,CAAwBnL,EAAxB,MAAgC,IAAtC;EAAA,GAAf;;EAEA,MAAMoL,MAAM,GAAG,SAATA,MAAS,CAACzO,SAAD,EAAY0O,IAAZ,EAAqB;EAChC1O,IAAAA,SAAS,CAACuM,SAAV,GAAsBmC,IAAtB,CADgC;;EAIhC,QAAIL,KAAK,IAAIE,MAAM,EAAnB,EAAuB;EACnB;EACH,KAN+B;;;EAShC9M,IAAAA,QAAQ,CAACkN,IAAT,CAAcC,qBAAd,CAAoC,YAApC,EAAkD5O,SAAlD;EACH,GAVD,CAXwC;;;EAwBxC,MAAI,CAACqO,KAAD,IAAU,CAACE,MAAM,EAArB,EAAyB;EACrB,QAAMM,UAAU,GAAG7B,OAAO,CAACvP,SAA3B,CADqB;;EAIrB,QAAMuC,SAAS,GAAGyB,QAAQ,CAACF,aAAT,CAAuB,KAAvB,CAAlB;EACAvB,IAAAA,SAAS,CAACsB,YAAV,CAAuB,QAAvB,EAAiC,EAAjC;;EAEA,QAAI+M,KAAJ,EAAW;EACPrO,MAAAA,SAAS,CAACsB,YAAV,CAAuB,IAAvB,EAA6B+B,EAA7B;EACH,KAToB;;;EAYrB,QAAIwL,UAAJ,EAAgB;EACZ,UAAMC,MAAM,GAAGrT,MAAM,CAAC2R,YAAP,CAAoBC,OAApB,WAA+BpC,MAA/B,cAAyC5H,EAAzC,EAAf;EACAiL,MAAAA,QAAQ,GAAGQ,MAAM,KAAK,IAAtB;;EAEA,UAAIR,QAAJ,EAAc;EACV,YAAMI,IAAI,GAAGjE,IAAI,CAACC,KAAL,CAAWoE,MAAX,CAAb;EACAL,QAAAA,MAAM,CAACzO,SAAD,EAAY0O,IAAI,CAACK,OAAjB,CAAN;EACH;EACJ,KApBoB;;;EAuBrBtB,IAAAA,KAAK,CAACnQ,GAAD,CAAL,CACK2C,IADL,CACU,UAAA+O,MAAM,EAAI;EACZ,UAAI5Q,EAAE,CAACb,KAAH,CAASyR,MAAT,CAAJ,EAAsB;EAClB;EACH;;EAED,UAAIH,UAAJ,EAAgB;EACZpT,QAAAA,MAAM,CAAC2R,YAAP,CAAoBG,OAApB,WACOtC,MADP,cACiB5H,EADjB,GAEIoH,IAAI,CAACE,SAAL,CAAe;EACXoE,UAAAA,OAAO,EAAEC;EADE,SAAf,CAFJ;EAMH;;EAEDP,MAAAA,MAAM,CAACzO,SAAD,EAAYgP,MAAZ,CAAN;EACH,KAhBL,EAiBKC,KAjBL,CAiBW,YAAM,EAjBjB;EAkBH;EACJ;;EC3ED;AACA;AAMA,EAAO,IAAMC,QAAQ,GAAG,SAAXA,QAAW,CAAA9N,KAAK;EAAA,SAAI+N,QAAQ,CAAE/N,KAAK,GAAG,EAAR,GAAa,EAAd,GAAoB,EAArB,EAAyB,EAAzB,CAAZ;EAAA,CAAtB;AACP,EAAO,IAAMgO,UAAU,GAAG,SAAbA,UAAa,CAAAhO,KAAK;EAAA,SAAI+N,QAAQ,CAAE/N,KAAK,GAAG,EAAT,GAAe,EAAhB,EAAoB,EAApB,CAAZ;EAAA,CAAxB;AACP,EAAO,IAAMiO,UAAU,GAAG,SAAbA,UAAa,CAAAjO,KAAK;EAAA,SAAI+N,QAAQ,CAAC/N,KAAK,GAAG,EAAT,EAAa,EAAb,CAAZ;EAAA,CAAxB;;AAGP,EAAO,SAASkO,UAAT,GAAsE;EAAA,MAAlDC,IAAkD,uEAA3C,CAA2C;EAAA,MAAxCC,YAAwC,uEAAzB,KAAyB;EAAA,MAAlBC,QAAkB,uEAAP,KAAO;;EACzE;EACA,MAAI,CAACrR,EAAE,CAAC1B,MAAH,CAAU6S,IAAV,CAAL,EAAsB;EAClB,WAAOD,UAAU,CAAC,IAAD,EAAOE,YAAP,EAAqBC,QAArB,CAAjB;EACH,GAJwE;;;EAOzE,MAAMrE,MAAM,GAAG,SAATA,MAAS,CAAAhK,KAAK;EAAA,WAAI,WAAIA,KAAJ,EAAY+K,KAAZ,CAAkB,CAAC,CAAnB,CAAJ;EAAA,GAApB,CAPyE;;;EAUzE,MAAIuD,KAAK,GAAGR,QAAQ,CAACK,IAAD,CAApB;EACA,MAAMI,IAAI,GAAGP,UAAU,CAACG,IAAD,CAAvB;EACA,MAAMK,IAAI,GAAGP,UAAU,CAACE,IAAD,CAAvB,CAZyE;;EAezE,MAAIC,YAAY,IAAIE,KAAK,GAAG,CAA5B,EAA+B;EAC3BA,IAAAA,KAAK,aAAMA,KAAN,MAAL;EACH,GAFD,MAEO;EACHA,IAAAA,KAAK,GAAG,EAAR;EACH,GAnBwE;;;EAsBzE,mBAAUD,QAAQ,IAAIF,IAAI,GAAG,CAAnB,GAAuB,GAAvB,GAA6B,EAAvC,SAA4CG,KAA5C,SAAoDtE,MAAM,CAACuE,IAAD,CAA1D,cAAoEvE,MAAM,CAACwE,IAAD,CAA1E;EACH;;ECdD,IAAMC,QAAQ,GAAG;EACb;EACAC,EAAAA,UAFa,wBAEA;EACT,QAAMxS,GAAG,GAAG,IAAInB,GAAJ,CAAQ,KAAKoJ,MAAL,CAAYwK,OAApB,EAA6BtU,MAAM,CAACuU,QAApC,CAAZ;EACA,QAAMC,IAAI,GAAG3S,GAAG,CAAC4S,IAAJ,KAAazU,MAAM,CAACuU,QAAP,CAAgBE,IAA7B,IAAsC/J,OAAO,CAACC,IAAR,IAAgB,CAAC3K,MAAM,CAAC0U,aAA3E;EAEA,WAAO;EACH7S,MAAAA,GAAG,EAAE,KAAKiI,MAAL,CAAYwK,OADd;EAEHE,MAAAA,IAAI,EAAJA;EAFG,KAAP;EAIH,GAVY;EAYb;EACAG,EAAAA,YAba,0BAaE;EACX,QAAI;EACA,WAAKrQ,QAAL,CAAc8P,QAAd,GAAyBtL,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBR,QAAtB,CAA+B1P,OAArD,CAAzB,CADA;;EAIA,WAAKJ,QAAL,CAAcuQ,OAAd,GAAwB;EACpB7G,QAAAA,IAAI,EAAEnF,WAAW,CAAC1F,IAAZ,CAAiB,IAAjB,EAAuB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8B7G,IAArD,CADc;EAEpB8G,QAAAA,KAAK,EAAEhM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BC,KAApD,CAFa;EAGpBC,QAAAA,OAAO,EAAEjM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BE,OAApD,CAHW;EAIpBC,QAAAA,MAAM,EAAElM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BG,MAApD,CAJY;EAKpBC,QAAAA,WAAW,EAAEnM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BI,WAApD,CALO;EAMpBC,QAAAA,IAAI,EAAEpM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BK,IAApD,CANc;EAOpBlJ,QAAAA,GAAG,EAAElD,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8B7I,GAApD,CAPe;EAQpBI,QAAAA,OAAO,EAAEtD,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BzI,OAApD,CARW;EASpB+I,QAAAA,QAAQ,EAAErM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BM,QAApD,CATU;EAUpBC,QAAAA,QAAQ,EAAEtM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BO,QAApD,CAVU;EAWpBC,QAAAA,UAAU,EAAEvM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BQ,UAApD;EAXQ,OAAxB,CAJA;;EAmBA,WAAK/Q,QAAL,CAAcgR,QAAd,GAAyBxM,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBU,QAA5C,CAAzB,CAnBA;;EAsBA,WAAKhR,QAAL,CAAciR,MAAd,GAAuB;EACnBC,QAAAA,IAAI,EAAE1M,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BC,IAAnD,CADa;EAEnBC,QAAAA,MAAM,EAAE3M,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BE,MAAnD;EAFW,OAAvB,CAtBA;;EA4BA,WAAKnR,QAAL,CAAcoR,OAAd,GAAwB;EACpBC,QAAAA,MAAM,EAAE7M,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBc,OAAtB,CAA8BC,MAApD,CADY;EAEpBhI,QAAAA,WAAW,EAAE7E,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBc,OAAtB,CAA8B/H,WAApD,CAFO;EAGpBiI,QAAAA,QAAQ,EAAE9M,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,KAAK2G,MAAL,CAAY8K,SAAZ,CAAsBc,OAAtB,CAA8BE,QAApD;EAHU,OAAxB,CA5BA;;EAmCA,UAAIjT,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcgR,QAAzB,CAAJ,EAAwC;EACpC,aAAKhR,QAAL,CAAcoR,OAAd,CAAsBG,WAAtB,GAAoC,KAAKvR,QAAL,CAAcgR,QAAd,CAAuBvM,aAAvB,YAC5B,KAAKe,MAAL,CAAYC,UAAZ,CAAuB+L,OADK,EAApC;EAGH;;EAED,aAAO,IAAP;EACH,KA1CD,CA0CE,OAAOC,KAAP,EAAc;EACZ;EACA,WAAK1H,KAAL,CAAW2H,IAAX,CAAgB,iEAAhB,EAAmFD,KAAnF,EAFY;;EAKZ,WAAKE,oBAAL,CAA0B,IAA1B;EAEA,aAAO,KAAP;EACH;EACJ,GAjEY;EAmEb;EACAC,EAAAA,UApEa,sBAoEFnT,IApEE,EAoEIyC,UApEJ,EAoEgB;EACzB,QAAM2Q,SAAS,GAAG,4BAAlB;EACA,QAAM7B,OAAO,GAAGF,QAAQ,CAACC,UAAT,CAAoBlR,IAApB,CAAyB,IAAzB,CAAhB;EACA,QAAMiT,QAAQ,aAAM,CAAC9B,OAAO,CAACE,IAAT,GAAgBF,OAAO,CAACzS,GAAxB,GAA8B,EAApC,cAA0C,KAAKiI,MAAL,CAAYuM,UAAtD,CAAd,CAHyB;;EAMzB,QAAMC,IAAI,GAAGtQ,QAAQ,CAACuQ,eAAT,CAAyBJ,SAAzB,EAAoC,KAApC,CAAb;EACA5Q,IAAAA,aAAa,CACT+Q,IADS,EAET9I,MAAM,CAAChI,UAAD,EAAa;EACfgR,MAAAA,IAAI,EAAE,cADS;EAEfvN,MAAAA,SAAS,EAAE;EAFI,KAAb,CAFG,CAAb,CAPyB;;EAgBzB,QAAMwN,GAAG,GAAGzQ,QAAQ,CAACuQ,eAAT,CAAyBJ,SAAzB,EAAoC,KAApC,CAAZ;EACA,QAAM/G,IAAI,aAAMgH,QAAN,cAAkBrT,IAAlB,CAAV,CAjByB;EAoBzB;EACA;;EACA,QAAI,UAAU0T,GAAd,EAAmB;EACfA,MAAAA,GAAG,CAACC,cAAJ,CAAmB,8BAAnB,EAAmD,MAAnD,EAA2DtH,IAA3D;EACH,KAxBwB;;;EA2BzBqH,IAAAA,GAAG,CAACC,cAAJ,CAAmB,8BAAnB,EAAmD,YAAnD,EAAiEtH,IAAjE,EA3ByB;;EA8BzBkH,IAAAA,IAAI,CAACjR,WAAL,CAAiBoR,GAAjB;EAEA,WAAOH,IAAP;EACH,GArGY;EAuGb;EACAK,EAAAA,WAxGa,uBAwGD/Q,GAxGC,EAwGe;EAAA,QAAXgR,IAAW,uEAAJ,EAAI;EACxB,QAAM7Q,IAAI,GAAGqL,IAAI,CAACjP,GAAL,CAASyD,GAAT,EAAc,KAAKkE,MAAnB,CAAb;EAEA,QAAMtE,UAAU,GAAGhH,MAAM,CAACqF,MAAP,CAAc,EAAd,EAAkB+S,IAAlB,EAAwB;EACvCjP,MAAAA,KAAK,EAAE,CAACiP,IAAI,CAACjP,KAAN,EAAa,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBjC,MAApC,EAA4CpC,MAA5C,CAAmDrH,OAAnD,EAA4DwY,IAA5D,CAAiE,GAAjE;EADgC,KAAxB,CAAnB;EAIA,WAAO/Q,aAAa,CAAC,MAAD,EAASN,UAAT,EAAqBO,IAArB,CAApB;EACH,GAhHY;EAkHb;EACA+Q,EAAAA,WAnHa,uBAmHD/Q,IAnHC,EAmHK;EACd,QAAIpD,EAAE,CAACb,KAAH,CAASiE,IAAT,CAAJ,EAAoB;EAChB,aAAO,IAAP;EACH;;EAED,QAAMgR,KAAK,GAAGjR,aAAa,CAAC,MAAD,EAAS;EAChC6B,MAAAA,KAAK,EAAE,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BrR;EADH,KAAT,CAA3B;EAIAoR,IAAAA,KAAK,CAAC1R,WAAN,CACIS,aAAa,CACT,MADS,EAET;EACI6B,MAAAA,KAAK,EAAE,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BD;EADvC,KAFS,EAKThR,IALS,CADjB;EAUA,WAAOgR,KAAP;EACH,GAvIY;EAyIb;EACAE,EAAAA,YA1Ia,wBA0IAC,UA1IA,EA0IYN,IA1IZ,EA0IkB;EAC3B,QAAMpR,UAAU,GAAGhH,MAAM,CAACqF,MAAP,CAAc,EAAd,EAAkB+S,IAAlB,CAAnB;EACA,QAAI7T,IAAI,GAAG0N,WAAW,CAACyG,UAAD,CAAtB;EAEA,QAAMC,KAAK,GAAG;EACV5V,MAAAA,OAAO,EAAE,QADC;EAEViB,MAAAA,MAAM,EAAE,KAFE;EAGV4U,MAAAA,KAAK,EAAE,IAHG;EAIVd,MAAAA,IAAI,EAAE,IAJI;EAKVe,MAAAA,YAAY,EAAE,IALJ;EAMVC,MAAAA,WAAW,EAAE;EANH,KAAd;EASA,KAAC,SAAD,EAAY,MAAZ,EAAoB,OAApB,EAA6BxU,OAA7B,CAAqC,UAAA8C,GAAG,EAAI;EACxC,UAAIpH,MAAM,CAACgC,IAAP,CAAYgF,UAAZ,EAAwBmD,QAAxB,CAAiC/C,GAAjC,CAAJ,EAA2C;EACvCuR,QAAAA,KAAK,CAACvR,GAAD,CAAL,GAAaJ,UAAU,CAACI,GAAD,CAAvB;EACA,eAAOJ,UAAU,CAACI,GAAD,CAAjB;EACH;EACJ,KALD,EAb2B;;EAqB3B,QAAIuR,KAAK,CAAC5V,OAAN,KAAkB,QAAlB,IAA8B,CAAC/C,MAAM,CAACgC,IAAP,CAAYgF,UAAZ,EAAwBmD,QAAxB,CAAiC,MAAjC,CAAnC,EAA6E;EACzEnD,MAAAA,UAAU,CAACzC,IAAX,GAAkB,QAAlB;EACH,KAvB0B;;;EA0B3B,QAAIvE,MAAM,CAACgC,IAAP,CAAYgF,UAAZ,EAAwBmD,QAAxB,CAAiC,OAAjC,CAAJ,EAA+C;EAC3C,UAAI,CAACnD,UAAU,CAACmC,KAAX,CAAiBgB,QAAjB,CAA0B,KAAKmB,MAAL,CAAYC,UAAZ,CAAuBwN,OAAjD,CAAL,EAAgE;EAC5D/R,QAAAA,UAAU,CAACmC,KAAX,eAAwB,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA/C;EACH;EACJ,KAJD,MAIO;EACH/R,MAAAA,UAAU,CAACmC,KAAX,GAAmB,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA1C;EACH,KAhC0B;;;EAmC3B,YAAQL,UAAR;EACI,WAAK,MAAL;EACIC,QAAAA,KAAK,CAAC3U,MAAN,GAAe,IAAf;EACA2U,QAAAA,KAAK,CAACC,KAAN,GAAc,MAAd;EACAD,QAAAA,KAAK,CAACE,YAAN,GAAqB,OAArB;EACAF,QAAAA,KAAK,CAACb,IAAN,GAAa,MAAb;EACAa,QAAAA,KAAK,CAACG,WAAN,GAAoB,OAApB;EACA;;EAEJ,WAAK,MAAL;EACIH,QAAAA,KAAK,CAAC3U,MAAN,GAAe,IAAf;EACA2U,QAAAA,KAAK,CAACC,KAAN,GAAc,MAAd;EACAD,QAAAA,KAAK,CAACE,YAAN,GAAqB,QAArB;EACAF,QAAAA,KAAK,CAACb,IAAN,GAAa,QAAb;EACAa,QAAAA,KAAK,CAACG,WAAN,GAAoB,OAApB;EACA;;EAEJ,WAAK,UAAL;EACIH,QAAAA,KAAK,CAAC3U,MAAN,GAAe,IAAf;EACA2U,QAAAA,KAAK,CAACC,KAAN,GAAc,gBAAd;EACAD,QAAAA,KAAK,CAACE,YAAN,GAAqB,iBAArB;EACAF,QAAAA,KAAK,CAACb,IAAN,GAAa,cAAb;EACAa,QAAAA,KAAK,CAACG,WAAN,GAAoB,aAApB;EACA;;EAEJ,WAAK,YAAL;EACIH,QAAAA,KAAK,CAAC3U,MAAN,GAAe,IAAf;EACA2U,QAAAA,KAAK,CAACC,KAAN,GAAc,iBAAd;EACAD,QAAAA,KAAK,CAACE,YAAN,GAAqB,gBAArB;EACAF,QAAAA,KAAK,CAACb,IAAN,GAAa,kBAAb;EACAa,QAAAA,KAAK,CAACG,WAAN,GAAoB,iBAApB;EACA;;EAEJ,WAAK,YAAL;EACI9R,QAAAA,UAAU,CAACmC,KAAX,eAAwB,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA/C;EACAxU,QAAAA,IAAI,GAAG,MAAP;EACAoU,QAAAA,KAAK,CAACC,KAAN,GAAc,MAAd;EACAD,QAAAA,KAAK,CAACb,IAAN,GAAa,MAAb;EACA;;EAEJ;EACI,YAAI3T,EAAE,CAACb,KAAH,CAASqV,KAAK,CAACC,KAAf,CAAJ,EAA2B;EACvBD,UAAAA,KAAK,CAACC,KAAN,GAAcrU,IAAd;EACH;;EACD,YAAIJ,EAAE,CAACb,KAAH,CAASqV,KAAK,CAACb,IAAf,CAAJ,EAA0B;EACtBa,UAAAA,KAAK,CAACb,IAAN,GAAaY,UAAb;EACH;;EA9CT;;EAiDA,QAAMM,MAAM,GAAG1R,aAAa,CAACqR,KAAK,CAAC5V,OAAP,CAA5B,CApF2B;;EAuF3B,QAAI4V,KAAK,CAAC3U,MAAV,EAAkB;EACd;EACAgV,MAAAA,MAAM,CAACnS,WAAP,CACI+O,QAAQ,CAAC8B,UAAT,CAAoB/S,IAApB,CAAyB,IAAzB,EAA+BgU,KAAK,CAACG,WAArC,EAAkD;EAC9C3P,QAAAA,KAAK,EAAE;EADuC,OAAlD,CADJ;EAKA6P,MAAAA,MAAM,CAACnS,WAAP,CACI+O,QAAQ,CAAC8B,UAAT,CAAoB/S,IAApB,CAAyB,IAAzB,EAA+BgU,KAAK,CAACb,IAArC,EAA2C;EACvC3O,QAAAA,KAAK,EAAE;EADgC,OAA3C,CADJ,EAPc;;EAcd6P,MAAAA,MAAM,CAACnS,WAAP,CACI+O,QAAQ,CAACuC,WAAT,CAAqBxT,IAArB,CAA0B,IAA1B,EAAgCgU,KAAK,CAACE,YAAtC,EAAoD;EAChD1P,QAAAA,KAAK,EAAE;EADyC,OAApD,CADJ;EAKA6P,MAAAA,MAAM,CAACnS,WAAP,CACI+O,QAAQ,CAACuC,WAAT,CAAqBxT,IAArB,CAA0B,IAA1B,EAAgCgU,KAAK,CAACC,KAAtC,EAA6C;EACzCzP,QAAAA,KAAK,EAAE;EADkC,OAA7C,CADJ;EAKH,KAxBD,MAwBO;EACH6P,MAAAA,MAAM,CAACnS,WAAP,CAAmB+O,QAAQ,CAAC8B,UAAT,CAAoB/S,IAApB,CAAyB,IAAzB,EAA+BgU,KAAK,CAACb,IAArC,CAAnB;EACAkB,MAAAA,MAAM,CAACnS,WAAP,CAAmB+O,QAAQ,CAACuC,WAAT,CAAqBxT,IAArB,CAA0B,IAA1B,EAAgCgU,KAAK,CAACC,KAAtC,CAAnB;EACH,KAlH0B;;;EAqH3B5J,IAAAA,MAAM,CAAChI,UAAD,EAAasB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8B9R,IAA9B,CAAD,EAAsCyC,UAAtC,CAAtC,CAAN;EACAD,IAAAA,aAAa,CAACiS,MAAD,EAAShS,UAAT,CAAb,CAtH2B;;EAyH3B,QAAIzC,IAAI,KAAK,MAAb,EAAqB;EACjB,UAAI,CAACJ,EAAE,CAACvB,KAAH,CAAS,KAAKkD,QAAL,CAAcuQ,OAAd,CAAsB9R,IAAtB,CAAT,CAAL,EAA4C;EACxC,aAAKuB,QAAL,CAAcuQ,OAAd,CAAsB9R,IAAtB,IAA8B,EAA9B;EACH;;EAED,WAAKuB,QAAL,CAAcuQ,OAAd,CAAsB9R,IAAtB,EAA4BE,IAA5B,CAAiCuU,MAAjC;EACH,KAND,MAMO;EACH,WAAKlT,QAAL,CAAcuQ,OAAd,CAAsB9R,IAAtB,IAA8ByU,MAA9B;EACH;;EAED,WAAOA,MAAP;EACH,GA9QY;EAgRb;EACAC,EAAAA,WAjRa,uBAiRD1U,IAjRC,EAiRKyC,UAjRL,EAiRiB;EAC1B;EACA,QAAMtH,KAAK,GAAG4H,aAAa,CACvB,OADuB,EAEvB0H,MAAM,CACF1G,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BxS,IAA7B,CAAD,CADvB,EAEF;EACIA,MAAAA,IAAI,EAAE,OADV;EAEI2U,MAAAA,GAAG,EAAE,CAFT;EAGI1H,MAAAA,GAAG,EAAE,GAHT;EAII2H,MAAAA,IAAI,EAAE,IAJV;EAKIhS,MAAAA,KAAK,EAAE,CALX;EAMIiS,MAAAA,YAAY,EAAE,KANlB;EAOI;EACApB,MAAAA,IAAI,EAAE,QARV;EASI,oBAAcpF,IAAI,CAACjP,GAAL,CAASY,IAAT,EAAe,KAAK+G,MAApB,CATlB;EAUI,uBAAiB,CAVrB;EAWI,uBAAiB,GAXrB;EAYI,uBAAiB;EAZrB,KAFE,EAgBFtE,UAhBE,CAFiB,CAA3B;EAsBA,SAAKlB,QAAL,CAAciR,MAAd,CAAqBxS,IAArB,IAA6B7E,KAA7B,CAxB0B;;EA2B1BkW,IAAAA,QAAQ,CAACyD,eAAT,CAAyB1U,IAAzB,CAA8B,IAA9B,EAAoCjF,KAApC;EAEA,WAAOA,KAAP;EACH,GA/SY;EAiTb;EACA4Z,EAAAA,cAlTa,0BAkTE/U,IAlTF,EAkTQyC,UAlTR,EAkToB;EAC7B,QAAM8P,QAAQ,GAAGxP,aAAa,CAC1B,UAD0B,EAE1B0H,MAAM,CACF1G,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBc,OAAtB,CAA8B3S,IAA9B,CAAD,CADvB,EAEF;EACI2U,MAAAA,GAAG,EAAE,CADT;EAEI1H,MAAAA,GAAG,EAAE,GAFT;EAGIrK,MAAAA,KAAK,EAAE,CAHX;EAII6Q,MAAAA,IAAI,EAAE,cAJV;EAKI,qBAAe;EALnB,KAFE,EASFhR,UATE,CAFoB,CAA9B,CAD6B;;EAiB7B,QAAIzC,IAAI,KAAK,QAAb,EAAuB;EACnBuS,MAAAA,QAAQ,CAACjQ,WAAT,CAAqBS,aAAa,CAAC,MAAD,EAAS,IAAT,EAAe,GAAf,CAAlC;EAEA,UAAMiS,SAAS,GAAG;EACdC,QAAAA,MAAM,EAAE,QADM;EAEdrC,QAAAA,MAAM,EAAE;EAFM,QAGhB5S,IAHgB,CAAlB;EAIA,UAAMkV,MAAM,GAAGF,SAAS,GAAG3G,IAAI,CAACjP,GAAL,CAAS4V,SAAT,EAAoB,KAAKjO,MAAzB,CAAH,GAAsC,EAA9D;EAEAwL,MAAAA,QAAQ,CAACrP,SAAT,eAA0BgS,MAAM,CAAC1H,WAAP,EAA1B;EACH;;EAED,SAAKjM,QAAL,CAAcoR,OAAd,CAAsB3S,IAAtB,IAA8BuS,QAA9B;EAEA,WAAOA,QAAP;EACH,GAlVY;EAoVb;EACA4C,EAAAA,UArVa,sBAqVFnV,IArVE,EAqVI;EACb,QAAMyC,UAAU,GAAGsB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBc,OAAtB,CAA8B3S,IAA9B,CAAD,CAA5C;EAEA,QAAMwB,SAAS,GAAGuB,aAAa,CAC3B,KAD2B,EAE3B0H,MAAM,CAAChI,UAAD,EAAa;EACfmC,MAAAA,KAAK,EAAE,UAAG,KAAKmC,MAAL,CAAYC,UAAZ,CAAuB2L,OAAvB,CAA+B5B,IAAlC,cAA0CtO,UAAU,CAACmC,KAAX,GAAmBnC,UAAU,CAACmC,KAA9B,GAAsC,EAAhF,EAAqFP,IAArF,EADQ;EAEf,oBAAcgK,IAAI,CAACjP,GAAL,CAASY,IAAT,EAAe,KAAK+G,MAApB;EAFC,KAAb,CAFqB,EAM3B,OAN2B,CAA/B,CAHa;;EAab,SAAKxF,QAAL,CAAcoR,OAAd,CAAsB3S,IAAtB,IAA8BwB,SAA9B;EAEA,WAAOA,SAAP;EACH,GArWY;EAuWb;EACA;EACA;EACA4T,EAAAA,qBA1Wa,iCA0WSC,QA1WT,EA0WmBrV,IA1WnB,EA0WyB;EAAA;;EAClC;EACAG,IAAAA,EAAE,CACEkV,QADF,EAEE,eAFF,EAGE,UAAA3W,KAAK,EAAI;EACL;EACA,UAAI,CAAC,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,EAAb,EAAiBkH,QAAjB,CAA0BlH,KAAK,CAAC4W,KAAhC,CAAL,EAA6C;EACzC;EACH,OAJI;;;EAOL5W,MAAAA,KAAK,CAACiI,cAAN;EACAjI,MAAAA,KAAK,CAAC6W,eAAN,GARK;;EAWL,UAAI7W,KAAK,CAACsB,IAAN,KAAe,SAAnB,EAA8B;EAC1B;EACH;;EAED,UAAMwV,aAAa,GAAG/P,OAAO,CAAC4P,QAAD,EAAW,wBAAX,CAA7B,CAfK;;EAkBL,UAAI,CAACG,aAAD,IAAkB,CAAC,EAAD,EAAK,EAAL,EAAS5P,QAAT,CAAkBlH,KAAK,CAAC4W,KAAxB,CAAtB,EAAsD;EAClDjE,QAAAA,QAAQ,CAACoE,aAAT,CAAuBrV,IAAvB,CAA4B,KAA5B,EAAkCJ,IAAlC,EAAwC,IAAxC;EACH,OAFD,MAEO;EACH,YAAIoD,MAAJ;;EAEA,YAAI1E,KAAK,CAAC4W,KAAN,KAAgB,EAApB,EAAwB;EACpB,cAAI5W,KAAK,CAAC4W,KAAN,KAAgB,EAAhB,IAAuBE,aAAa,IAAI9W,KAAK,CAAC4W,KAAN,KAAgB,EAA5D,EAAiE;EAC7DlS,YAAAA,MAAM,GAAGiS,QAAQ,CAACK,kBAAlB;;EAEA,gBAAI,CAAC9V,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrBA,cAAAA,MAAM,GAAGiS,QAAQ,CAAClT,UAAT,CAAoBwT,iBAA7B;EACH;EACJ,WAND,MAMO;EACHvS,YAAAA,MAAM,GAAGiS,QAAQ,CAACO,sBAAlB;;EAEA,gBAAI,CAAChW,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrBA,cAAAA,MAAM,GAAGiS,QAAQ,CAAClT,UAAT,CAAoB0T,gBAA7B;EACH;EACJ;;EAEDjP,UAAAA,QAAQ,CAACxG,IAAT,CAAc,KAAd,EAAoBgD,MAApB,EAA4B,IAA5B;EACH;EACJ;EACJ,KA5CH,EA6CE,KA7CF,CAAF,CAFkC;EAmDlC;;EACAjD,IAAAA,EAAE,CAACkV,QAAD,EAAW,OAAX,EAAoB,UAAA3W,KAAK,EAAI;EAC3B,UAAIA,KAAK,CAAC4W,KAAN,KAAgB,EAApB,EAAwB;EACpB;EACH;;EAEDjE,MAAAA,QAAQ,CAACyE,kBAAT,CAA4B1V,IAA5B,CAAiC,KAAjC,EAAuC,IAAvC,EAA6C,IAA7C;EACH,KANC,CAAF;EAOH,GAraY;EAuab;EACA2V,EAAAA,cAxaa,gCAwa+D;EAAA;;EAAA,QAA3DnT,KAA2D,QAA3DA,KAA2D;EAAA,QAApDoT,IAAoD,QAApDA,IAAoD;EAAA,QAA9ChW,IAA8C,QAA9CA,IAA8C;EAAA,QAAxCuO,KAAwC,QAAxCA,KAAwC;EAAA,0BAAjCyF,KAAiC;EAAA,QAAjCA,KAAiC,2BAAzB,IAAyB;EAAA,4BAAnBiC,OAAmB;EAAA,QAAnBA,OAAmB,6BAAT,KAAS;EACxE,QAAMxT,UAAU,GAAGsB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BxS,IAA7B,CAAD,CAA5C;EAEA,QAAMqV,QAAQ,GAAGtS,aAAa,CAC1B,QAD0B,EAE1B0H,MAAM,CAAChI,UAAD,EAAa;EACfzC,MAAAA,IAAI,EAAE,QADS;EAEfyT,MAAAA,IAAI,EAAE,eAFS;EAGf7O,MAAAA,KAAK,EAAE,UAAG,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA1B,cAAqC/R,UAAU,CAACmC,KAAX,GAAmBnC,UAAU,CAACmC,KAA9B,GAAsC,EAA3E,EAAgFP,IAAhF,EAHQ;EAIf,sBAAgB4R,OAJD;EAKfrT,MAAAA,KAAK,EAALA;EALe,KAAb,CAFoB,CAA9B;EAWA,QAAMsT,IAAI,GAAGnT,aAAa,CAAC,MAAD,CAA1B,CAdwE;;EAiBxEmT,IAAAA,IAAI,CAACnI,SAAL,GAAiBQ,KAAjB;;EAEA,QAAI3O,EAAE,CAACpB,OAAH,CAAWwV,KAAX,CAAJ,EAAuB;EACnBkC,MAAAA,IAAI,CAAC5T,WAAL,CAAiB0R,KAAjB;EACH;;EAEDqB,IAAAA,QAAQ,CAAC/S,WAAT,CAAqB4T,IAArB,EAvBwE;;EA0BxEza,IAAAA,MAAM,CAAC0D,cAAP,CAAsBkW,QAAtB,EAAgC,SAAhC,EAA2C;EACvCc,MAAAA,UAAU,EAAE,IAD2B;EAEvC/W,MAAAA,GAFuC,iBAEjC;EACF,eAAOiW,QAAQ,CAAC9K,YAAT,CAAsB,cAAtB,MAA0C,MAAjD;EACH,OAJsC;EAKvCI,MAAAA,GALuC,eAKnCsL,OALmC,EAK1B;EACT;EACA,YAAIA,OAAJ,EAAa;EACT9Z,UAAAA,KAAK,CAAC0F,IAAN,CAAWwT,QAAQ,CAAClT,UAAT,CAAoBiU,QAA/B,EACKzT,MADL,CACY,UAAA0T,IAAI;EAAA,mBAAI5Q,OAAO,CAAC4Q,IAAD,EAAO,wBAAP,CAAX;EAAA,WADhB,EAEKtW,OAFL,CAEa,UAAAsW,IAAI;EAAA,mBAAIA,IAAI,CAACvT,YAAL,CAAkB,cAAlB,EAAkC,OAAlC,CAAJ;EAAA,WAFjB;EAGH;;EAEDuS,QAAAA,QAAQ,CAACvS,YAAT,CAAsB,cAAtB,EAAsCmT,OAAO,GAAG,MAAH,GAAY,OAAzD;EACH;EAdsC,KAA3C;EAiBA,SAAKK,SAAL,CAAeC,IAAf,CACIlB,QADJ,EAEI,aAFJ,EAGI,UAAA3W,KAAK,EAAI;EACL,UAAIkB,EAAE,CAACjB,aAAH,CAAiBD,KAAjB,KAA2BA,KAAK,CAAC4W,KAAN,KAAgB,EAA/C,EAAmD;EAC/C;EACH;;EAED5W,MAAAA,KAAK,CAACiI,cAAN;EACAjI,MAAAA,KAAK,CAAC6W,eAAN;EAEAF,MAAAA,QAAQ,CAACY,OAAT,GAAmB,IAAnB;;EAEA,cAAQjW,IAAR;EACI,aAAK,UAAL;EACI,UAAA,MAAI,CAACwW,YAAL,GAAoB7a,MAAM,CAACiH,KAAD,CAA1B;EACA;;EAEJ,aAAK,SAAL;EACI,UAAA,MAAI,CAACuI,OAAL,GAAevI,KAAf;EACA;;EAEJ,aAAK,OAAL;EACI,UAAA,MAAI,CAAC6T,KAAL,GAAaC,UAAU,CAAC9T,KAAD,CAAvB;EACA;;EAEJ;EACI;EAdR;;EAiBAyO,MAAAA,QAAQ,CAACoE,aAAT,CAAuBrV,IAAvB,CAA4B,MAA5B,EAAkC,MAAlC,EAA0CR,EAAE,CAACjB,aAAH,CAAiBD,KAAjB,CAA1C;EACH,KA/BL,EAgCIsB,IAhCJ,EAiCI,KAjCJ;EAoCAqR,IAAAA,QAAQ,CAAC+D,qBAAT,CAA+BhV,IAA/B,CAAoC,IAApC,EAA0CiV,QAA1C,EAAoDrV,IAApD;EAEAgW,IAAAA,IAAI,CAAC1T,WAAL,CAAiB+S,QAAjB;EACH,GA1fY;EA4fb;EACAvE,EAAAA,UA7fa,2BA6f0B;EAAA,QAA5BC,IAA4B,uEAArB,CAAqB;EAAA,QAAlBE,QAAkB,uEAAP,KAAO;;EACnC;EACA,QAAI,CAACrR,EAAE,CAAC1B,MAAH,CAAU6S,IAAV,CAAL,EAAsB;EAClB,aAAOA,IAAP;EACH,KAJkC;;;EAOnC,QAAM4F,UAAU,GAAGjG,QAAQ,CAAC,KAAKmC,QAAN,CAAR,GAA0B,CAA7C;EAEA,WAAO/B,UAAU,CAACC,IAAD,EAAO4F,UAAP,EAAmB1F,QAAnB,CAAjB;EACH,GAvgBY;EAygBb;EACA2F,EAAAA,iBA1gBa,+BA0gBgD;EAAA,QAA3CxT,MAA2C,uEAAlC,IAAkC;EAAA,QAA5B2N,IAA4B,uEAArB,CAAqB;EAAA,QAAlBE,QAAkB,uEAAP,KAAO;;EACzD;EACA,QAAI,CAACrR,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAD,IAAuB,CAACxD,EAAE,CAAC1B,MAAH,CAAU6S,IAAV,CAA5B,EAA6C;EACzC;EACH,KAJwD;;;EAOzD3N,IAAAA,MAAM,CAACF,SAAP,GAAmBmO,QAAQ,CAACP,UAAT,CAAoBC,IAApB,EAA0BE,QAA1B,CAAnB;EACH,GAlhBY;EAohBb;EACA4F,EAAAA,YArhBa,0BAqhBE;EACX,QAAI,CAAC,KAAK5X,SAAL,CAAe8J,EAApB,EAAwB;EACpB;EACH,KAHU;;;EAMX,QAAInJ,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAciR,MAAd,CAAqBE,MAAhC,CAAJ,EAA6C;EACzCrB,MAAAA,QAAQ,CAACyF,QAAT,CAAkB1W,IAAlB,CAAuB,IAAvB,EAA6B,KAAKmB,QAAL,CAAciR,MAAd,CAAqBE,MAAlD,EAA0D,KAAKqE,KAAL,GAAa,CAAb,GAAiB,KAAKrE,MAAhF;EACH,KARU;;;EAWX,QAAI9S,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcuQ,OAAd,CAAsBK,IAAjC,CAAJ,EAA4C;EACxC,WAAK5Q,QAAL,CAAcuQ,OAAd,CAAsBK,IAAtB,CAA2B6E,OAA3B,GAAqC,KAAKD,KAAL,IAAc,KAAKrE,MAAL,KAAgB,CAAnE;EACH;EACJ,GAniBY;EAqiBb;EACAoE,EAAAA,QAtiBa,oBAsiBJ1T,MAtiBI,EAsiBe;EAAA,QAAXR,KAAW,uEAAH,CAAG;;EACxB,QAAI,CAAChD,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrB;EACH,KAHuB;;;EAMxBA,IAAAA,MAAM,CAACR,KAAP,GAAeA,KAAf,CANwB;;EASxByO,IAAAA,QAAQ,CAACyD,eAAT,CAAyB1U,IAAzB,CAA8B,IAA9B,EAAoCgD,MAApC;EACH,GAhjBY;EAkjBb;EACA6T,EAAAA,cAnjBa,0BAmjBEvY,KAnjBF,EAmjBS;EAAA;;EAClB,QAAI,CAAC,KAAKO,SAAL,CAAe8J,EAAhB,IAAsB,CAACnJ,EAAE,CAAClB,KAAH,CAASA,KAAT,CAA3B,EAA4C;EACxC;EACH;;EAED,QAAIkE,KAAK,GAAG,CAAZ;;EAEA,QAAMsU,WAAW,GAAG,SAAdA,WAAc,CAAC9T,MAAD,EAASjI,KAAT,EAAmB;EACnC,UAAMyH,KAAK,GAAGhD,EAAE,CAAC1B,MAAH,CAAU/C,KAAV,IAAmBA,KAAnB,GAA2B,CAAzC;EACA,UAAMoX,QAAQ,GAAG3S,EAAE,CAACpB,OAAH,CAAW4E,MAAX,IAAqBA,MAArB,GAA8B,MAAI,CAAC7B,QAAL,CAAcoR,OAAd,CAAsBC,MAArE,CAFmC;;EAKnC,UAAIhT,EAAE,CAACpB,OAAH,CAAW+T,QAAX,CAAJ,EAA0B;EACtBA,QAAAA,QAAQ,CAAC3P,KAAT,GAAiBA,KAAjB,CADsB;;EAItB,YAAMyR,KAAK,GAAG9B,QAAQ,CAAC4E,oBAAT,CAA8B,MAA9B,EAAsC,CAAtC,CAAd;;EACA,YAAIvX,EAAE,CAACpB,OAAH,CAAW6V,KAAX,CAAJ,EAAuB;EACnBA,UAAAA,KAAK,CAAC5Q,UAAN,CAAiB,CAAjB,EAAoB2T,SAApB,GAAgCxU,KAAhC;EACH;EACJ;EACJ,KAdD;;EAgBA,QAAIlE,KAAJ,EAAW;EACP,cAAQA,KAAK,CAACsB,IAAd;EACI;EACA,aAAK,YAAL;EACA,aAAK,SAAL;EACA,aAAK,QAAL;EACI4C,UAAAA,KAAK,GAAGmK,aAAa,CAAC,KAAKnC,WAAN,EAAmB,KAAKiI,QAAxB,CAArB,CADJ;;EAII,cAAInU,KAAK,CAACsB,IAAN,KAAe,YAAnB,EAAiC;EAC7BqR,YAAAA,QAAQ,CAACyF,QAAT,CAAkB1W,IAAlB,CAAuB,IAAvB,EAA6B,KAAKmB,QAAL,CAAciR,MAAd,CAAqBC,IAAlD,EAAwD7P,KAAxD;EACH;;EAED;EAEJ;;EACA,aAAK,SAAL;EACA,aAAK,UAAL;EACIsU,UAAAA,WAAW,CAAC,KAAK3V,QAAL,CAAcoR,OAAd,CAAsBC,MAAvB,EAA+B,KAAKyE,QAAL,GAAgB,GAA/C,CAAX;EAEA;;EAEJ;EACI;EAtBR;EAwBH;EACJ,GApmBY;EAsmBb;EACAvC,EAAAA,eAvmBa,2BAumBG1R,MAvmBH,EAumBW;EACpB;EACA,QAAM0G,KAAK,GAAGlK,EAAE,CAAClB,KAAH,CAAS0E,MAAT,IAAmBA,MAAM,CAACA,MAA1B,GAAmCA,MAAjD,CAFoB;;EAKpB,QAAI,CAACxD,EAAE,CAACpB,OAAH,CAAWsL,KAAX,CAAD,IAAsBA,KAAK,CAACS,YAAN,CAAmB,MAAnB,MAA+B,OAAzD,EAAkE;EAC9D;EACH,KAPmB;;;EAUpB,QAAI9E,OAAO,CAACqE,KAAD,EAAQ,KAAK/C,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BC,IAArC,CAAX,EAAuD;EACnD3I,MAAAA,KAAK,CAAChH,YAAN,CAAmB,eAAnB,EAAoC,KAAK8H,WAAzC;EACA,UAAMA,WAAW,GAAGyG,QAAQ,CAACP,UAAT,CAAoB,KAAKlG,WAAzB,CAApB;EACA,UAAMiI,QAAQ,GAAGxB,QAAQ,CAACP,UAAT,CAAoB,KAAK+B,QAAzB,CAAjB;EACA,UAAMjG,SAAM,GAAGyB,IAAI,CAACjP,GAAL,CAAS,WAAT,EAAsB,KAAK2H,MAA3B,CAAf;EACA+C,MAAAA,KAAK,CAAChH,YAAN,CACI,gBADJ,EAEI8J,SAAM,CAACrI,OAAP,CAAe,eAAf,EAAgCqG,WAAhC,EAA6CrG,OAA7C,CAAqD,YAArD,EAAmEsO,QAAnE,CAFJ;EAIH,KATD,MASO,IAAIpN,OAAO,CAACqE,KAAD,EAAQ,KAAK/C,MAAL,CAAY8K,SAAZ,CAAsBW,MAAtB,CAA6BE,MAArC,CAAX,EAAyD;EAC5D,UAAM4E,OAAO,GAAGxN,KAAK,CAAClH,KAAN,GAAc,GAA9B;EACAkH,MAAAA,KAAK,CAAChH,YAAN,CAAmB,eAAnB,EAAoCwU,OAApC;EACAxN,MAAAA,KAAK,CAAChH,YAAN,CAAmB,gBAAnB,YAAwCwU,OAAO,CAACpK,OAAR,CAAgB,CAAhB,CAAxC;EACH,KAJM,MAIA;EACHpD,MAAAA,KAAK,CAAChH,YAAN,CAAmB,eAAnB,EAAoCgH,KAAK,CAAClH,KAA1C;EACH,KAzBmB;;;EA4BpB,QAAI,CAAC+E,OAAO,CAACG,QAAb,EAAuB;EACnB;EACH,KA9BmB;;;EAiCpBgC,IAAAA,KAAK,CAACvC,KAAN,CAAYgQ,WAAZ,CAAwB,SAAxB,YAAsCzN,KAAK,CAAClH,KAAN,GAAckH,KAAK,CAACmD,GAApB,GAA0B,GAAhE;EACH,GAzoBY;EA2oBb;EACAuK,EAAAA,iBA5oBa,6BA4oBK9Y,KA5oBL,EA4oBY;EAAA;;EACrB;EACA,QACI,CAAC,KAAKqI,MAAL,CAAY0Q,QAAZ,CAAqBhF,IAAtB,IACA,CAAC7S,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAciR,MAAd,CAAqBC,IAAhC,CADD,IAEA,CAAC7S,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcoR,OAAd,CAAsBG,WAAjC,CAFD,IAGA,KAAKD,QAAL,KAAkB,CAJtB,EAKE;EACE;EACH,KAToB;;;EAYrB,QAAIyE,OAAO,GAAG,CAAd;EACA,QAAMI,UAAU,GAAG,KAAKnW,QAAL,CAAcgR,QAAd,CAAuBoF,qBAAvB,EAAnB;EACA,QAAMC,OAAO,aAAM,KAAK7Q,MAAL,CAAYC,UAAZ,CAAuB+L,OAA7B,cAAb;;EAEA,QAAMtT,MAAM,GAAG,gBAAAA,OAAM,EAAI;EACrByF,MAAAA,WAAW,CAAC,MAAI,CAAC3D,QAAL,CAAcoR,OAAd,CAAsBG,WAAvB,EAAoC8E,OAApC,EAA6CnY,OAA7C,CAAX;EACH,KAFD,CAhBqB;;;EAqBrB,QAAI,KAAKsK,KAAT,EAAgB;EACZtK,MAAAA,MAAM,CAAC,KAAD,CAAN;EACA;EACH,KAxBoB;;;EA2BrB,QAAIG,EAAE,CAAClB,KAAH,CAASA,KAAT,CAAJ,EAAqB;EACjB4Y,MAAAA,OAAO,GAAG,MAAMI,UAAU,CAACG,KAAjB,IAA0BnZ,KAAK,CAACoZ,KAAN,GAAcJ,UAAU,CAACK,IAAnD,CAAV;EACH,KAFD,MAEO,IAAIvS,QAAQ,CAAC,KAAKjE,QAAL,CAAcoR,OAAd,CAAsBG,WAAvB,EAAoC8E,OAApC,CAAZ,EAA0D;EAC7DN,MAAAA,OAAO,GAAGZ,UAAU,CAAC,KAAKnV,QAAL,CAAcoR,OAAd,CAAsBG,WAAtB,CAAkCvL,KAAlC,CAAwCwQ,IAAzC,EAA+C,EAA/C,CAApB;EACH,KAFM,MAEA;EACH;EACH,KAjCoB;;;EAoCrB,QAAIT,OAAO,GAAG,CAAd,EAAiB;EACbA,MAAAA,OAAO,GAAG,CAAV;EACH,KAFD,MAEO,IAAIA,OAAO,GAAG,GAAd,EAAmB;EACtBA,MAAAA,OAAO,GAAG,GAAV;EACH,KAxCoB;;;EA2CrBjG,IAAAA,QAAQ,CAACuF,iBAAT,CAA2BxW,IAA3B,CAAgC,IAAhC,EAAsC,KAAKmB,QAAL,CAAcoR,OAAd,CAAsBG,WAA5D,EAAyE,KAAKD,QAAL,GAAgB,GAAhB,GAAsByE,OAA/F,EA3CqB;;EA8CrB,SAAK/V,QAAL,CAAcoR,OAAd,CAAsBG,WAAtB,CAAkCvL,KAAlC,CAAwCwQ,IAAxC,aAAkDT,OAAlD,OA9CqB;EAiDrB;;EACA,QAAI1X,EAAE,CAAClB,KAAH,CAASA,KAAT,KAAmB,CAAC,YAAD,EAAe,YAAf,EAA6BkH,QAA7B,CAAsClH,KAAK,CAACsB,IAA5C,CAAvB,EAA0E;EACtEP,MAAAA,MAAM,CAACf,KAAK,CAACsB,IAAN,KAAe,YAAhB,CAAN;EACH;EACJ,GAjsBY;EAmsBb;EACAgY,EAAAA,UApsBa,sBAosBFtZ,KApsBE,EAosBK;EACd;EACA,QAAMuZ,MAAM,GAAG,CAACrY,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcoR,OAAd,CAAsBE,QAAjC,CAAD,IAA+C,KAAK9L,MAAL,CAAYmR,UAA1E,CAFc;;EAKd7G,IAAAA,QAAQ,CAACuF,iBAAT,CAA2BxW,IAA3B,CACI,IADJ,EAEI,KAAKmB,QAAL,CAAcoR,OAAd,CAAsB/H,WAF1B,EAGIqN,MAAM,GAAG,KAAKpF,QAAL,GAAgB,KAAKjI,WAAxB,GAAsC,KAAKA,WAHrD,EAIIqN,MAJJ,EALc;;EAad,QAAIvZ,KAAK,IAAIA,KAAK,CAACsB,IAAN,KAAe,YAAxB,IAAwC,KAAK2J,KAAL,CAAWwO,OAAvD,EAAgE;EAC5D;EACH,KAfa;;;EAkBd9G,IAAAA,QAAQ,CAAC4F,cAAT,CAAwB7W,IAAxB,CAA6B,IAA7B,EAAmC1B,KAAnC;EACH,GAvtBY;EAytBb;EACA0Z,EAAAA,cA1tBa,4BA0tBI;EACb;EACA,QAAI,CAAC,KAAKnZ,SAAL,CAAe8J,EAAhB,IAAuB,CAAC,KAAKhC,MAAL,CAAYmR,UAAb,IAA2B,KAAKtN,WAA3D,EAAyE;EACrE;EACH,KAJY;EAOb;EACA;EACA;;;EACA,QAAI,KAAKiI,QAAL,aAAiB,CAAjB,EAAsB,EAAtB,CAAJ,EAA8B;EAC1B/N,MAAAA,YAAY,CAAC,KAAKvD,QAAL,CAAcoR,OAAd,CAAsB/H,WAAvB,EAAoC,IAApC,CAAZ;EACA9F,MAAAA,YAAY,CAAC,KAAKvD,QAAL,CAAcgR,QAAf,EAAyB,IAAzB,CAAZ;EACA;EACH,KAdY;;;EAiBb,QAAI3S,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAciR,MAAd,CAAqBC,IAAhC,CAAJ,EAA2C;EACvC,WAAKlR,QAAL,CAAciR,MAAd,CAAqBC,IAArB,CAA0B3P,YAA1B,CAAuC,eAAvC,EAAwD,KAAK+P,QAA7D;EACH,KAnBY;;;EAsBb,QAAMwF,WAAW,GAAGzY,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcoR,OAAd,CAAsBE,QAAjC,CAApB,CAtBa;;EAyBb,QAAI,CAACwF,WAAD,IAAgB,KAAKtR,MAAL,CAAYuR,eAA5B,IAA+C,KAAKzN,MAAxD,EAAgE;EAC5DwG,MAAAA,QAAQ,CAACuF,iBAAT,CAA2BxW,IAA3B,CAAgC,IAAhC,EAAsC,KAAKmB,QAAL,CAAcoR,OAAd,CAAsB/H,WAA5D,EAAyE,KAAKiI,QAA9E;EACH,KA3BY;;;EA8Bb,QAAIwF,WAAJ,EAAiB;EACbhH,MAAAA,QAAQ,CAACuF,iBAAT,CAA2BxW,IAA3B,CAAgC,IAAhC,EAAsC,KAAKmB,QAAL,CAAcoR,OAAd,CAAsBE,QAA5D,EAAsE,KAAKA,QAA3E;EACH,KAhCY;;;EAmCbxB,IAAAA,QAAQ,CAACmG,iBAAT,CAA2BpX,IAA3B,CAAgC,IAAhC;EACH,GA9vBY;EAgwBb;EACAmY,EAAAA,gBAjwBa,4BAiwBIC,OAjwBJ,EAiwBa/Y,MAjwBb,EAiwBqB;EAC9BqF,IAAAA,YAAY,CAAC,KAAKvD,QAAL,CAAc6Q,QAAd,CAAuBN,OAAvB,CAA+B0G,OAA/B,CAAD,EAA0C,CAAC/Y,MAA3C,CAAZ;EACH,GAnwBY;EAqwBb;EACAgZ,EAAAA,aAtwBa,yBAswBCD,OAtwBD,EAswBUhX,SAtwBV,EAswBqBrG,KAtwBrB,EAswB4B;EACrC,QAAMud,IAAI,GAAG,KAAKnX,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BH,OAA9B,CAAb;EACA,QAAI5V,KAAK,GAAG,IAAZ;EACA,QAAIoT,IAAI,GAAGxU,SAAX;;EAEA,QAAIgX,OAAO,KAAK,UAAhB,EAA4B;EACxB5V,MAAAA,KAAK,GAAG,KAAK4T,YAAb;EACH,KAFD,MAEO;EACH5T,MAAAA,KAAK,GAAG,CAAChD,EAAE,CAACb,KAAH,CAAS5D,KAAT,CAAD,GAAmBA,KAAnB,GAA2B,KAAKqd,OAAL,CAAnC,CADG;;EAIH,UAAI5Y,EAAE,CAACb,KAAH,CAAS6D,KAAT,CAAJ,EAAqB;EACjBA,QAAAA,KAAK,GAAG,KAAKmE,MAAL,CAAYyR,OAAZ,EAAqBI,OAA7B;EACH,OANE;;;EASH,UAAI,CAAChZ,EAAE,CAACb,KAAH,CAAS,KAAKG,OAAL,CAAasZ,OAAb,CAAT,CAAD,IAAoC,CAAC,KAAKtZ,OAAL,CAAasZ,OAAb,EAAsB5S,QAAtB,CAA+BhD,KAA/B,CAAzC,EAAgF;EAC5E,aAAK0I,KAAL,CAAW2H,IAAX,iCAAyCrQ,KAAzC,mBAAuD4V,OAAvD;EACA;EACH,OAZE;;;EAeH,UAAI,CAAC,KAAKzR,MAAL,CAAYyR,OAAZ,EAAqBtZ,OAArB,CAA6B0G,QAA7B,CAAsChD,KAAtC,CAAL,EAAmD;EAC/C,aAAK0I,KAAL,CAAW2H,IAAX,8BAAsCrQ,KAAtC,mBAAoD4V,OAApD;EACA;EACH;EACJ,KA1BoC;;;EA6BrC,QAAI,CAAC5Y,EAAE,CAACpB,OAAH,CAAWwX,IAAX,CAAL,EAAuB;EACnBA,MAAAA,IAAI,GAAG0C,IAAI,IAAIA,IAAI,CAAC1S,aAAL,CAAmB,eAAnB,CAAf;EACH,KA/BoC;;;EAkCrC,QAAI,CAACpG,EAAE,CAACpB,OAAH,CAAWwX,IAAX,CAAL,EAAuB;EACnB;EACH,KApCoC;;;EAuCrC,QAAM3B,KAAK,GAAG,KAAK9S,QAAL,CAAc6Q,QAAd,CAAuBN,OAAvB,CAA+B0G,OAA/B,EAAwCxS,aAAxC,YAA0D,KAAKe,MAAL,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BrR,KAAtF,EAAd;EACAyR,IAAAA,KAAK,CAACtG,SAAN,GAAkBsD,QAAQ,CAACwH,QAAT,CAAkBzY,IAAlB,CAAuB,IAAvB,EAA6BoY,OAA7B,EAAsC5V,KAAtC,CAAlB,CAxCqC;;EA2CrC,QAAMQ,MAAM,GAAG4S,IAAI,IAAIA,IAAI,CAAChQ,aAAL,oBAA8BpD,KAA9B,SAAvB;;EAEA,QAAIhD,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAJ,EAAwB;EACpBA,MAAAA,MAAM,CAAC6S,OAAP,GAAiB,IAAjB;EACH;EACJ,GAtzBY;EAwzBb;EACA4C,EAAAA,QAzzBa,oBAyzBJL,OAzzBI,EAyzBK5V,KAzzBL,EAyzBY;EACrB,YAAQ4V,OAAR;EACI,WAAK,OAAL;EACI,eAAO5V,KAAK,KAAK,CAAV,GAAcyL,IAAI,CAACjP,GAAL,CAAS,QAAT,EAAmB,KAAK2H,MAAxB,CAAd,aAAmDnE,KAAnD,YAAP;;EAEJ,WAAK,SAAL;EACI,YAAIhD,EAAE,CAAC1B,MAAH,CAAU0E,KAAV,CAAJ,EAAsB;EAClB,cAAMyR,KAAK,GAAGhG,IAAI,CAACjP,GAAL,wBAAyBwD,KAAzB,GAAkC,KAAKmE,MAAvC,CAAd;;EAEA,cAAI,CAACsN,KAAK,CAAC7W,MAAX,EAAmB;EACf,6BAAUoF,KAAV;EACH;;EAED,iBAAOyR,KAAP;EACH;;EAED,eAAOhH,WAAW,CAACzK,KAAD,CAAlB;;EAEJ,WAAK,UAAL;EACI,eAAOyP,QAAQ,CAACwG,QAAT,CAAkBzY,IAAlB,CAAuB,IAAvB,CAAP;;EAEJ;EACI,eAAO,IAAP;EArBR;EAuBH,GAj1BY;EAm1Bb;EACA0Y,EAAAA,cAp1Ba,0BAo1BE5Z,OAp1BF,EAo1BW;EAAA;;EACpB;EACA,QAAI,CAACU,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BxN,OAAzC,CAAL,EAAwD;EACpD;EACH;;EAED,QAAMnL,IAAI,GAAG,SAAb;EACA,QAAMgW,IAAI,GAAG,KAAKzU,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BxN,OAA9B,CAAsCnF,aAAtC,CAAoD,eAApD,CAAb,CAPoB;;EAUpB,QAAIpG,EAAE,CAACvB,KAAH,CAASa,OAAT,CAAJ,EAAuB;EACnB,WAAKA,OAAL,CAAaiM,OAAb,GAAuBK,MAAM,CAACtM,OAAD,CAAN,CAAgByD,MAAhB,CAAuB,UAAAwI,OAAO;EAAA,eAAI,MAAI,CAACpE,MAAL,CAAYoE,OAAZ,CAAoBjM,OAApB,CAA4B0G,QAA5B,CAAqCuF,OAArC,CAAJ;EAAA,OAA9B,CAAvB;EACH,KAZmB;;;EAepB,QAAM1L,MAAM,GAAG,CAACG,EAAE,CAACb,KAAH,CAAS,KAAKG,OAAL,CAAaiM,OAAtB,CAAD,IAAmC,KAAKjM,OAAL,CAAaiM,OAAb,CAAqB3N,MAArB,GAA8B,CAAhF;EACA6T,IAAAA,QAAQ,CAACkH,gBAAT,CAA0BnY,IAA1B,CAA+B,IAA/B,EAAqCJ,IAArC,EAA2CP,MAA3C,EAhBoB;;EAmBpB+D,IAAAA,YAAY,CAACwS,IAAD,CAAZ,CAnBoB;;EAsBpB3E,IAAAA,QAAQ,CAAC0H,SAAT,CAAmB3Y,IAAnB,CAAwB,IAAxB,EAtBoB;;EAyBpB,QAAI,CAACX,MAAL,EAAa;EACT;EACH,KA3BmB;;;EA8BpB,QAAMuZ,QAAQ,GAAG,SAAXA,QAAW,CAAA7N,OAAO,EAAI;EACxB,UAAMkJ,KAAK,GAAGhG,IAAI,CAACjP,GAAL,wBAAyB+L,OAAzB,GAAoC,MAAI,CAACpE,MAAzC,CAAd;;EAEA,UAAI,CAACsN,KAAK,CAAC7W,MAAX,EAAmB;EACf,eAAO,IAAP;EACH;;EAED,aAAO6T,QAAQ,CAAC0C,WAAT,CAAqB3T,IAArB,CAA0B,MAA1B,EAAgCiU,KAAhC,CAAP;EACH,KARD,CA9BoB;;;EAyCpB,SAAKnV,OAAL,CAAaiM,OAAb,CACK8N,IADL,CACU,UAACC,CAAD,EAAIC,CAAJ,EAAU;EACZ,UAAMC,OAAO,GAAG,MAAI,CAACrS,MAAL,CAAYoE,OAAZ,CAAoBjM,OAApC;EACA,aAAOka,OAAO,CAAC3N,OAAR,CAAgByN,CAAhB,IAAqBE,OAAO,CAAC3N,OAAR,CAAgB0N,CAAhB,CAArB,GAA0C,CAA1C,GAA8C,CAAC,CAAtD;EACH,KAJL,EAKKpZ,OALL,CAKa,UAAAoL,OAAO,EAAI;EAChBkG,MAAAA,QAAQ,CAAC0E,cAAT,CAAwB3V,IAAxB,CAA6B,MAA7B,EAAmC;EAC/BwC,QAAAA,KAAK,EAAEuI,OADwB;EAE/B6K,QAAAA,IAAI,EAAJA,IAF+B;EAG/BhW,QAAAA,IAAI,EAAJA,IAH+B;EAI/BuO,QAAAA,KAAK,EAAE8C,QAAQ,CAACwH,QAAT,CAAkBzY,IAAlB,CAAuB,MAAvB,EAA6B,SAA7B,EAAwC+K,OAAxC,CAJwB;EAK/B6I,QAAAA,KAAK,EAAEgF,QAAQ,CAAC7N,OAAD;EALgB,OAAnC;EAOH,KAbL;EAeAkG,IAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4B,IAA5B,EAAkCJ,IAAlC,EAAwCgW,IAAxC;EACH,GA74BY;EA+4Bb;;EACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2CA;EACA;EAEA;EACAqD,EAAAA,eA/7Ba,6BA+7BK;EAAA;;EACd;EACA,QAAI,CAACzZ,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BtG,QAAzC,CAAL,EAAyD;EACrD;EACH,KAJa;;;EAOd,QAAMrS,IAAI,GAAG,UAAb;EACA,QAAMgW,IAAI,GAAG,KAAKzU,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BtG,QAA9B,CAAuCrM,aAAvC,CAAqD,eAArD,CAAb;EACA,QAAMsT,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,CAAf;EACA,QAAMX,MAAM,GAAGnE,OAAO,CAACge,MAAM,CAAC9b,MAAR,CAAtB,CAVc;;EAad6T,IAAAA,QAAQ,CAACkH,gBAAT,CAA0BnY,IAA1B,CAA+B,IAA/B,EAAqCJ,IAArC,EAA2CP,MAA3C,EAbc;;EAgBd+D,IAAAA,YAAY,CAACwS,IAAD,CAAZ,CAhBc;;EAmBd3E,IAAAA,QAAQ,CAAC0H,SAAT,CAAmB3Y,IAAnB,CAAwB,IAAxB,EAnBc;;EAsBd,QAAI,CAACX,MAAL,EAAa;EACT;EACH,KAxBa;;;EA2Bd,QAAMP,OAAO,GAAGoa,MAAM,CAAClU,GAAP,CAAW,UAACvG,KAAD,EAAQ+D,KAAR;EAAA,aAAmB;EAC1CA,QAAAA,KAAK,EAALA,KAD0C;EAE1CqT,QAAAA,OAAO,EAAE,MAAI,CAAC5D,QAAL,CAAcmH,OAAd,IAAyB,MAAI,CAAChD,YAAL,KAAsB5T,KAFd;EAG1C2L,QAAAA,KAAK,EAAE8D,QAAQ,CAACwG,QAAT,CAAkBzY,IAAlB,CAAuB,MAAvB,EAA6BvB,KAA7B,CAHmC;EAI1CmV,QAAAA,KAAK,EAAEnV,KAAK,CAAC4a,QAAN,IAAkBpI,QAAQ,CAAC0C,WAAT,CAAqB3T,IAArB,CAA0B,MAA1B,EAAgCvB,KAAK,CAAC4a,QAAN,CAAenM,WAAf,EAAhC,CAJiB;EAK1C0I,QAAAA,IAAI,EAAJA,IAL0C;EAM1ChW,QAAAA,IAAI,EAAE;EANoC,OAAnB;EAAA,KAAX,CAAhB,CA3Bc;;EAqCdd,IAAAA,OAAO,CAACwa,OAAR,CAAgB;EACZ9W,MAAAA,KAAK,EAAE,CAAC,CADI;EAEZqT,MAAAA,OAAO,EAAE,CAAC,KAAK5D,QAAL,CAAcmH,OAFZ;EAGZjL,MAAAA,KAAK,EAAEF,IAAI,CAACjP,GAAL,CAAS,UAAT,EAAqB,KAAK2H,MAA1B,CAHK;EAIZiP,MAAAA,IAAI,EAAJA,IAJY;EAKZhW,MAAAA,IAAI,EAAE;EALM,KAAhB,EArCc;;EA8Cdd,IAAAA,OAAO,CAACa,OAAR,CAAgBsR,QAAQ,CAAC0E,cAAT,CAAwBQ,IAAxB,CAA6B,IAA7B,CAAhB;EAEAlF,IAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4B,IAA5B,EAAkCJ,IAAlC,EAAwCgW,IAAxC;EACH,GAh/BY;EAk/Bb;EACA2D,EAAAA,YAn/Ba,wBAm/BAza,OAn/BA,EAm/BS;EAAA;;EAClB;EACA,QAAI,CAACU,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BlC,KAAzC,CAAL,EAAsD;EAClD;EACH;;EAED,QAAMzW,IAAI,GAAG,OAAb;EACA,QAAMgW,IAAI,GAAG,KAAKzU,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BlC,KAA9B,CAAoCzQ,aAApC,CAAkD,eAAlD,CAAb,CAPkB;;EAUlB,QAAIpG,EAAE,CAACvB,KAAH,CAASa,OAAT,CAAJ,EAAuB;EACnB,WAAKA,OAAL,CAAauX,KAAb,GAAqBvX,OAArB;EACH,KAFD,MAEO,IAAI,KAAKwK,OAAL,IAAgB,KAAKkQ,OAAzB,EAAkC;EACrC,WAAK1a,OAAL,CAAauX,KAAb,GAAqB,CAAC,GAAD,EAAM,IAAN,EAAY,CAAZ,EAAe,IAAf,EAAqB,GAArB,EAA0B,IAA1B,EAAgC,CAAhC,CAArB;EACH,KAdiB;;;EAiBlB,SAAKvX,OAAL,CAAauX,KAAb,GAAqB,KAAKvX,OAAL,CAAauX,KAAb,CAAmB9T,MAAnB,CAA0B,UAAA8T,KAAK;EAAA,aAAI,MAAI,CAAC1P,MAAL,CAAY0P,KAAZ,CAAkBvX,OAAlB,CAA0B0G,QAA1B,CAAmC6Q,KAAnC,CAAJ;EAAA,KAA/B,CAArB,CAjBkB;;EAoBlB,QAAMhX,MAAM,GAAG,CAACG,EAAE,CAACb,KAAH,CAAS,KAAKG,OAAL,CAAauX,KAAtB,CAAD,IAAiC,KAAKvX,OAAL,CAAauX,KAAb,CAAmBjZ,MAAnB,GAA4B,CAA5E;EACA6T,IAAAA,QAAQ,CAACkH,gBAAT,CAA0BnY,IAA1B,CAA+B,IAA/B,EAAqCJ,IAArC,EAA2CP,MAA3C,EArBkB;;EAwBlB+D,IAAAA,YAAY,CAACwS,IAAD,CAAZ,CAxBkB;;EA2BlB3E,IAAAA,QAAQ,CAAC0H,SAAT,CAAmB3Y,IAAnB,CAAwB,IAAxB,EA3BkB;;EA8BlB,QAAI,CAACX,MAAL,EAAa;EACT;EACH,KAhCiB;;;EAmClB,SAAKP,OAAL,CAAauX,KAAb,CAAmB1W,OAAnB,CAA2B,UAAA0W,KAAK,EAAI;EAChCpF,MAAAA,QAAQ,CAAC0E,cAAT,CAAwB3V,IAAxB,CAA6B,MAA7B,EAAmC;EAC/BwC,QAAAA,KAAK,EAAE6T,KADwB;EAE/BT,QAAAA,IAAI,EAAJA,IAF+B;EAG/BhW,QAAAA,IAAI,EAAJA,IAH+B;EAI/BuO,QAAAA,KAAK,EAAE8C,QAAQ,CAACwH,QAAT,CAAkBzY,IAAlB,CAAuB,MAAvB,EAA6B,OAA7B,EAAsCqW,KAAtC;EAJwB,OAAnC;EAMH,KAPD;EASApF,IAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4B,IAA5B,EAAkCJ,IAAlC,EAAwCgW,IAAxC;EACH,GAhiCY;EAkiCb;EACA+C,EAAAA,SAniCa,uBAmiCD;EAAA,QACAjH,OADA,GACY,KAAKvQ,QAAL,CAAc6Q,QAD1B,CACAN,OADA;EAER,QAAM8F,OAAO,GAAG,CAAChY,EAAE,CAACb,KAAH,CAAS+S,OAAT,CAAD,IAAsBrW,MAAM,CAACoe,MAAP,CAAc/H,OAAd,EAAuBgI,IAAvB,CAA4B,UAAArF,MAAM;EAAA,aAAI,CAACA,MAAM,CAAC1P,MAAZ;EAAA,KAAlC,CAAtC;EAEAD,IAAAA,YAAY,CAAC,KAAKvD,QAAL,CAAc6Q,QAAd,CAAuB6B,IAAxB,EAA8B,CAAC2D,OAA/B,CAAZ;EACH,GAxiCY;EA0iCb;EACA9B,EAAAA,kBA3iCa,8BA2iCM4C,IA3iCN,EA2iC8B;EAAA,QAAlB7R,QAAkB,uEAAP,KAAO;;EACvC,QAAI,KAAKtF,QAAL,CAAc6Q,QAAd,CAAuB2H,KAAvB,CAA6BhV,MAAjC,EAAyC;EACrC;EACH;;EAED,QAAI3B,MAAM,GAAGsV,IAAb;;EAEA,QAAI,CAAC9Y,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrBA,MAAAA,MAAM,GAAG3H,MAAM,CAACoe,MAAP,CAAc,KAAKtY,QAAL,CAAc6Q,QAAd,CAAuBuG,MAArC,EAA6CrR,IAA7C,CAAkD,UAAAoR,IAAI;EAAA,eAAI,CAACA,IAAI,CAAC3T,MAAV;EAAA,OAAtD,CAAT;EACH;;EAED,QAAMiV,SAAS,GAAG5W,MAAM,CAAC4C,aAAP,CAAqB,oBAArB,CAAlB;EAEAY,IAAAA,QAAQ,CAACxG,IAAT,CAAc,IAAd,EAAoB4Z,SAApB,EAA+BnT,QAA/B;EACH,GAzjCY;EA2jCb;EACAoT,EAAAA,UA5jCa,sBA4jCF9e,KA5jCE,EA4jCK;EAAA,QACN4e,KADM,GACI,KAAKxY,QAAL,CAAc6Q,QADlB,CACN2H,KADM;EAEd,QAAMtF,MAAM,GAAG,KAAKlT,QAAL,CAAcuQ,OAAd,CAAsBM,QAArC,CAFc;;EAKd,QAAI,CAACxS,EAAE,CAACpB,OAAH,CAAWub,KAAX,CAAD,IAAsB,CAACna,EAAE,CAACpB,OAAH,CAAWiW,MAAX,CAA3B,EAA+C;EAC3C;EACH,KAPa;;;EAAA,QAUN1P,MAVM,GAUKgV,KAVL,CAUNhV,MAVM;EAWd,QAAImV,IAAI,GAAGnV,MAAX;;EAEA,QAAInF,EAAE,CAACzB,OAAH,CAAWhD,KAAX,CAAJ,EAAuB;EACnB+e,MAAAA,IAAI,GAAG/e,KAAP;EACH,KAFD,MAEO,IAAIyE,EAAE,CAACjB,aAAH,CAAiBxD,KAAjB,KAA2BA,KAAK,CAACma,KAAN,KAAgB,EAA/C,EAAmD;EACtD4E,MAAAA,IAAI,GAAG,KAAP;EACH,KAFM,MAEA,IAAIta,EAAE,CAAClB,KAAH,CAASvD,KAAT,CAAJ,EAAqB;EACxB,UAAMgf,UAAU,GAAGJ,KAAK,CAACxU,QAAN,CAAepK,KAAK,CAACiI,MAArB,CAAnB,CADwB;EAIxB;EACA;;EACA,UAAI+W,UAAU,IAAK,CAACA,UAAD,IAAehf,KAAK,CAACiI,MAAN,KAAiBqR,MAAhC,IAA0CyF,IAA7D,EAAoE;EAChE;EACH;EACJ,KA1Ba;;;EA6BdzF,IAAAA,MAAM,CAAC3R,YAAP,CAAoB,eAApB,EAAqCoX,IAArC,EA7Bc;;EAgCdpV,IAAAA,YAAY,CAACiV,KAAD,EAAQ,CAACG,IAAT,CAAZ,CAhCc;;EAmCdhV,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BvE,IAAtD,EAA4DwK,IAA5D,CAAX,CAnCc;;EAsCd,QAAIA,IAAI,IAAIta,EAAE,CAACjB,aAAH,CAAiBxD,KAAjB,CAAZ,EAAqC;EACjCkW,MAAAA,QAAQ,CAACyE,kBAAT,CAA4B1V,IAA5B,CAAiC,IAAjC,EAAuC,IAAvC,EAA6C,IAA7C;EACH,KAFD,MAEO,IAAI,CAAC8Z,IAAD,IAAS,CAACnV,MAAd,EAAsB;EACzB;EACA6B,MAAAA,QAAQ,CAACxG,IAAT,CAAc,IAAd,EAAoBqU,MAApB,EAA4B7U,EAAE,CAACjB,aAAH,CAAiBxD,KAAjB,CAA5B;EACH;EACJ,GAxmCY;EA0mCb;EACAif,EAAAA,WA3mCa,uBA2mCDC,GA3mCC,EA2mCI;EACb,QAAMC,KAAK,GAAGD,GAAG,CAACpY,SAAJ,CAAc,IAAd,CAAd;EACAqY,IAAAA,KAAK,CAAC/S,KAAN,CAAYgT,QAAZ,GAAuB,UAAvB;EACAD,IAAAA,KAAK,CAAC/S,KAAN,CAAYiT,OAAZ,GAAsB,CAAtB;EACAF,IAAAA,KAAK,CAACrV,eAAN,CAAsB,QAAtB,EAJa;;EAOboV,IAAAA,GAAG,CAAClY,UAAJ,CAAeG,WAAf,CAA2BgY,KAA3B,EAPa;;EAUb,QAAMzC,KAAK,GAAGyC,KAAK,CAACG,WAApB;EACA,QAAMC,MAAM,GAAGJ,KAAK,CAACK,YAArB,CAXa;;EAcbrX,IAAAA,aAAa,CAACgX,KAAD,CAAb;EAEA,WAAO;EACHzC,MAAAA,KAAK,EAALA,KADG;EAEH6C,MAAAA,MAAM,EAANA;EAFG,KAAP;EAIH,GA/nCY;EAioCb;EACAjF,EAAAA,aAloCa,2BAkoC8B;EAAA;;EAAA,QAA7BzV,IAA6B,uEAAtB,EAAsB;EAAA,QAAlB6G,QAAkB,uEAAP,KAAO;EACvC,QAAMzD,MAAM,GAAGH,QAAQ,CAAC+M,cAAT,yBAAyC,KAAKnL,EAA9C,cAAoD7E,IAApD,EAAf,CADuC;;EAIvC,QAAI,CAACJ,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrB;EACH,KANsC;;;EASvC,QAAM5B,SAAS,GAAG4B,MAAM,CAACjB,UAAzB;EACA,QAAM6K,OAAO,GAAG7Q,KAAK,CAAC0F,IAAN,CAAWL,SAAS,CAAC4U,QAArB,EAA+B9O,IAA/B,CAAoC,UAAA+O,IAAI;EAAA,aAAI,CAACA,IAAI,CAACtR,MAAV;EAAA,KAAxC,CAAhB,CAVuC;;EAavC,QAAIwD,OAAO,CAACyB,WAAR,IAAuB,CAACzB,OAAO,CAAC0B,aAApC,EAAmD;EAC/C;EACAzI,MAAAA,SAAS,CAAC+F,KAAV,CAAgBsQ,KAAhB,aAA2B7K,OAAO,CAACyN,WAAnC;EACAjZ,MAAAA,SAAS,CAAC+F,KAAV,CAAgBmT,MAAhB,aAA4B1N,OAAO,CAAC2N,YAApC,QAH+C;;EAM/C,UAAMC,IAAI,GAAGvJ,QAAQ,CAAC+I,WAAT,CAAqBha,IAArB,CAA0B,IAA1B,EAAgCgD,MAAhC,CAAb,CAN+C;;EAS/C,UAAMyX,OAAO,GAAG,SAAVA,OAAU,CAAAnc,KAAK,EAAI;EACrB;EACA,YAAIA,KAAK,CAAC0E,MAAN,KAAiB5B,SAAjB,IAA8B,CAAC,CAAC,OAAD,EAAU,QAAV,EAAoBoE,QAApB,CAA6BlH,KAAK,CAACoc,YAAnC,CAAnC,EAAqF;EACjF;EACH,SAJoB;;;EAOrBtZ,QAAAA,SAAS,CAAC+F,KAAV,CAAgBsQ,KAAhB,GAAwB,EAAxB;EACArW,QAAAA,SAAS,CAAC+F,KAAV,CAAgBmT,MAAhB,GAAyB,EAAzB,CARqB;;EAWrBra,QAAAA,GAAG,CAACD,IAAJ,CAAS,MAAT,EAAeoB,SAAf,EAA0ByF,kBAA1B,EAA8C4T,OAA9C;EACH,OAZD,CAT+C;;;EAwB/C1a,MAAAA,EAAE,CAACC,IAAH,CAAQ,IAAR,EAAcoB,SAAd,EAAyByF,kBAAzB,EAA6C4T,OAA7C,EAxB+C;;EA2B/CrZ,MAAAA,SAAS,CAAC+F,KAAV,CAAgBsQ,KAAhB,aAA2B+C,IAAI,CAAC/C,KAAhC;EACArW,MAAAA,SAAS,CAAC+F,KAAV,CAAgBmT,MAAhB,aAA4BE,IAAI,CAACF,MAAjC;EACH,KA1CsC;;;EA6CvC5V,IAAAA,YAAY,CAACkI,OAAD,EAAU,IAAV,CAAZ,CA7CuC;;EAgDvClI,IAAAA,YAAY,CAAC1B,MAAD,EAAS,KAAT,CAAZ,CAhDuC;;EAmDvCiO,IAAAA,QAAQ,CAACyE,kBAAT,CAA4B1V,IAA5B,CAAiC,IAAjC,EAAuCgD,MAAvC,EAA+CyD,QAA/C;EACH,GAtrCY;EAwrCb;EACAkU,EAAAA,eAzrCa,6BAyrCK;EACd,QAAMtG,MAAM,GAAG,KAAKlT,QAAL,CAAcuQ,OAAd,CAAsBkJ,QAArC,CADc;;EAId,QAAI,CAACpb,EAAE,CAACpB,OAAH,CAAWiW,MAAX,CAAL,EAAyB;EACrB;EACH,KANa;;;EASdA,IAAAA,MAAM,CAAC3R,YAAP,CAAoB,MAApB,EAA4B,KAAKkY,QAAjC;EACH,GAnsCY;EAqsCb;EACA;EACAC,EAAAA,MAvsCa,kBAusCN/K,IAvsCM,EAusCA;EAAA;;EACT;EACA,QAAM1O,SAAS,GAAGuB,aAAa,CAAC,KAAD,EAAQgB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBR,QAAtB,CAA+B1P,OAAhC,CAAjC,CAA/B,CAFS;;EAKT,QAAI,KAAKoF,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,SAA9B,CAAJ,EAA8C;EAC1CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,SAAjC,CAAtB;EACH,KAPQ;;;EAUT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,QAA9B,CAAJ,EAA6C;EACzCpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,QAAjC,CAAtB;EACH,KAZQ;;;EAeT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,MAA9B,CAAJ,EAA2C;EACvCpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,MAAjC,CAAtB;EACH,KAjBQ;;;EAoBT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,cAA9B,CAAJ,EAAmD;EAC/CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,cAAjC,CAAtB;EACH,KAtBQ;;;EAyBT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CAAJ,EAA+C;EAC3C,UAAM2M,QAAQ,GAAGxP,aAAa,CAAC,KAAD,EAAQgB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBU,QAAvB,CAAjC,CAA9B,CAD2C;;EAI3CA,MAAAA,QAAQ,CAACjQ,WAAT,CACI+O,QAAQ,CAACqD,WAAT,CAAqBtU,IAArB,CAA0B,IAA1B,EAAgC,MAAhC,EAAwC;EACpCyE,QAAAA,EAAE,sBAAeqL,IAAI,CAACrL,EAApB;EADkC,OAAxC,CADJ,EAJ2C;;EAW3C0N,MAAAA,QAAQ,CAACjQ,WAAT,CAAqB+O,QAAQ,CAAC0D,cAAT,CAAwB3U,IAAxB,CAA6B,IAA7B,EAAmC,QAAnC,CAArB,EAX2C;EAe3C;;EACA,UAAI,KAAK2G,MAAL,CAAY0Q,QAAZ,CAAqBhF,IAAzB,EAA+B;EAC3B,YAAMM,OAAO,GAAGhQ,aAAa,CACzB,MADyB,EAEzB;EACI6B,UAAAA,KAAK,EAAE,KAAKmC,MAAL,CAAYC,UAAZ,CAAuB+L;EADlC,SAFyB,EAKzB,OALyB,CAA7B;EAQAR,QAAAA,QAAQ,CAACjQ,WAAT,CAAqByQ,OAArB;EACA,aAAKxR,QAAL,CAAcoR,OAAd,CAAsBG,WAAtB,GAAoCC,OAApC;EACH;;EAED,WAAKxR,QAAL,CAAcgR,QAAd,GAAyBA,QAAzB;EACA/Q,MAAAA,SAAS,CAACc,WAAV,CAAsB,KAAKf,QAAL,CAAcgR,QAApC;EACH,KAxDQ;;;EA2DT,QAAI,KAAKxL,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,cAA9B,CAAJ,EAAmD;EAC/CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC8D,UAAT,CAAoB/U,IAApB,CAAyB,IAAzB,EAA+B,aAA/B,CAAtB;EACH,KA7DQ;;;EAgET,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CAAJ,EAA+C;EAC3CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC8D,UAAT,CAAoB/U,IAApB,CAAyB,IAAzB,EAA+B,UAA/B,CAAtB;EACH,KAlEQ;;;EAqET,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,MAA9B,KAAyC,KAAKmB,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,QAA9B,CAA7C,EAAsF;EAClF,UAAM8M,MAAM,GAAG3P,aAAa,CAAC,KAAD,EAAQ;EAChC6B,QAAAA,KAAK,EAAE;EADyB,OAAR,CAA5B,CADkF;;EAMlF,UAAI,KAAKmC,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,MAA9B,CAAJ,EAA2C;EACvC8M,QAAAA,MAAM,CAACpQ,WAAP,CAAmB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,MAAjC,CAAnB;EACH,OARiF;;;EAWlF,UAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,QAA9B,CAAJ,EAA6C;EACzC;EACA,YAAMnD,UAAU,GAAG;EACfwK,UAAAA,GAAG,EAAE,CADU;EAEf2H,UAAAA,IAAI,EAAE,IAFS;EAGfhS,UAAAA,KAAK,EAAE,KAAKmE,MAAL,CAAY2L;EAHJ,SAAnB,CAFyC;;EASzCA,QAAAA,MAAM,CAACpQ,WAAP,CACI+O,QAAQ,CAACqD,WAAT,CAAqBtU,IAArB,CACI,IADJ,EAEI,QAFJ,EAGIqK,MAAM,CAAChI,UAAD,EAAa;EACfoC,UAAAA,EAAE,wBAAiBqL,IAAI,CAACrL,EAAtB;EADa,SAAb,CAHV,CADJ;EAUA,aAAKtD,QAAL,CAAcmR,MAAd,GAAuBA,MAAvB;EACH;;EAEDlR,MAAAA,SAAS,CAACc,WAAV,CAAsBoQ,MAAtB;EACH,KAvGQ;;;EA0GT,QAAI,KAAK3L,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CAAJ,EAA+C;EAC3CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,UAAjC,CAAtB;EACH,KA5GQ;;;EA+GT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,KAA6C,CAAChG,EAAE,CAACb,KAAH,CAAS,KAAKgI,MAAL,CAAYqL,QAArB,CAAlD,EAAkF;EAC9E,UAAMoC,OAAO,GAAGzR,aAAa,CAAC,KAAD,EAAQ;EACjC6B,QAAAA,KAAK,EAAE,YAD0B;EAEjCG,QAAAA,MAAM,EAAE;EAFyB,OAAR,CAA7B;EAKAyP,MAAAA,OAAO,CAAClS,WAAR,CACI+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,UAAjC,EAA6C;EACzC,yBAAiB,IADwB;EAEzC,iDAAkC8P,IAAI,CAACrL,EAAvC,CAFyC;EAGzC,yBAAiB;EAHwB,OAA7C,CADJ;EAQA,UAAMkV,KAAK,GAAGhX,aAAa,CAAC,KAAD,EAAQ;EAC/B6B,QAAAA,KAAK,EAAE,uBADwB;EAE/BC,QAAAA,EAAE,0BAAmBqL,IAAI,CAACrL,EAAxB,CAF6B;EAG/BE,QAAAA,MAAM,EAAE;EAHuB,OAAR,CAA3B;EAMA,UAAMmW,KAAK,GAAGnY,aAAa,CAAC,KAAD,CAA3B;EAEA,UAAMoY,IAAI,GAAGpY,aAAa,CAAC,KAAD,EAAQ;EAC9B8B,QAAAA,EAAE,0BAAmBqL,IAAI,CAACrL,EAAxB;EAD4B,OAAR,CAA1B,CAtB8E;;EA2B9E,UAAMoP,IAAI,GAAGlR,aAAa,CAAC,KAAD,EAAQ;EAC9B0Q,QAAAA,IAAI,EAAE;EADwB,OAAR,CAA1B;EAIA0H,MAAAA,IAAI,CAAC7Y,WAAL,CAAiB2R,IAAjB;EACAiH,MAAAA,KAAK,CAAC5Y,WAAN,CAAkB6Y,IAAlB;EACA,WAAK5Z,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8BwC,IAA9B,GAAqCA,IAArC,CAjC8E;;EAoC9E,WAAKpU,MAAL,CAAYqL,QAAZ,CAAqBrS,OAArB,CAA6B,UAAAC,IAAI,EAAI;EACjC;EACA,YAAMqV,QAAQ,GAAGtS,aAAa,CAC1B,QAD0B,EAE1B0H,MAAM,CAAC1G,yBAAyB,CAAC,MAAI,CAACgD,MAAL,CAAY8K,SAAZ,CAAsBC,OAAtB,CAA8BM,QAA/B,CAA1B,EAAoE;EACtEpS,UAAAA,IAAI,EAAE,QADgE;EAEtE4E,UAAAA,KAAK,YAAK,MAAI,CAACmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA5B,cAAuC,MAAI,CAACzN,MAAL,CAAYC,UAAZ,CAAuBwN,OAA9D,cAFiE;EAGtEf,UAAAA,IAAI,EAAE,UAHgE;EAItE,2BAAiB,IAJqD;EAKtE1O,UAAAA,MAAM,EAAE;EAL8D,SAApE,CAFoB,CAA9B,CAFiC;;EAcjCsM,QAAAA,QAAQ,CAAC+D,qBAAT,CAA+BhV,IAA/B,CAAoC,MAApC,EAA0CiV,QAA1C,EAAoDrV,IAApD,EAdiC;;EAiBjCG,QAAAA,EAAE,CAACkV,QAAD,EAAW,OAAX,EAAoB,YAAM;EACxBhE,UAAAA,QAAQ,CAACoE,aAAT,CAAuBrV,IAAvB,CAA4B,MAA5B,EAAkCJ,IAAlC,EAAwC,KAAxC;EACH,SAFC,CAAF;EAIA,YAAMkW,IAAI,GAAGnT,aAAa,CAAC,MAAD,EAAS,IAAT,EAAesL,IAAI,CAACjP,GAAL,CAASY,IAAT,EAAe,MAAI,CAAC+G,MAApB,CAAf,CAA1B;EAEA,YAAMnE,KAAK,GAAGG,aAAa,CAAC,MAAD,EAAS;EAChC6B,UAAAA,KAAK,EAAE,MAAI,CAACmC,MAAL,CAAYC,UAAZ,CAAuBiN,IAAvB,CAA4BrR;EADH,SAAT,CAA3B,CAvBiC;;EA4BjCA,QAAAA,KAAK,CAACmL,SAAN,GAAkBmC,IAAI,CAAClQ,IAAD,CAAtB;EAEAkW,QAAAA,IAAI,CAAC5T,WAAL,CAAiBM,KAAjB;EACAyS,QAAAA,QAAQ,CAAC/S,WAAT,CAAqB4T,IAArB;EACAjC,QAAAA,IAAI,CAAC3R,WAAL,CAAiB+S,QAAjB,EAhCiC;;EAmCjC,YAAMqD,IAAI,GAAG3V,aAAa,CAAC,KAAD,EAAQ;EAC9B8B,UAAAA,EAAE,0BAAmBqL,IAAI,CAACrL,EAAxB,cAA8B7E,IAA9B,CAD4B;EAE9B+E,UAAAA,MAAM,EAAE;EAFsB,SAAR,CAA1B,CAnCiC;;EAyCjC,YAAMqW,UAAU,GAAGrY,aAAa,CAAC,QAAD,EAAW;EACvC/C,UAAAA,IAAI,EAAE,QADiC;EAEvC4E,UAAAA,KAAK,YAAK,MAAI,CAACmC,MAAL,CAAYC,UAAZ,CAAuBwN,OAA5B,cAAuC,MAAI,CAACzN,MAAL,CAAYC,UAAZ,CAAuBwN,OAA9D;EAFkC,SAAX,CAAhC,CAzCiC;;EA+CjC4G,QAAAA,UAAU,CAAC9Y,WAAX,CACIS,aAAa,CACT,MADS,EAET;EACI,yBAAe;EADnB,SAFS,EAKTsL,IAAI,CAACjP,GAAL,CAASY,IAAT,EAAe,MAAI,CAAC+G,MAApB,CALS,CADjB,EA/CiC;;EA0DjCqU,QAAAA,UAAU,CAAC9Y,WAAX,CACIS,aAAa,CACT,MADS,EAET;EACI6B,UAAAA,KAAK,EAAE,MAAI,CAACmC,MAAL,CAAYC,UAAZ,CAAuBjC;EADlC,SAFS,EAKTsJ,IAAI,CAACjP,GAAL,CAAS,UAAT,EAAqB,MAAI,CAAC2H,MAA1B,CALS,CADjB,EA1DiC;;EAqEjC5G,QAAAA,EAAE,CACEuY,IADF,EAEE,SAFF,EAGE,UAAAha,KAAK,EAAI;EACL;EACA,cAAIA,KAAK,CAAC4W,KAAN,KAAgB,EAApB,EAAwB;EACpB;EACH,WAJI;;;EAOL5W,UAAAA,KAAK,CAACiI,cAAN;EACAjI,UAAAA,KAAK,CAAC6W,eAAN,GARK;;EAWLlE,UAAAA,QAAQ,CAACoE,aAAT,CAAuBrV,IAAvB,CAA4B,MAA5B,EAAkC,MAAlC,EAA0C,IAA1C;EACH,SAfH,EAgBE,KAhBF,CAAF,CArEiC;;EAyFjCD,QAAAA,EAAE,CAACib,UAAD,EAAa,OAAb,EAAsB,YAAM;EAC1B/J,UAAAA,QAAQ,CAACoE,aAAT,CAAuBrV,IAAvB,CAA4B,MAA5B,EAAkC,MAAlC,EAA0C,KAA1C;EACH,SAFC,CAAF,CAzFiC;;EA8FjCsY,QAAAA,IAAI,CAACpW,WAAL,CAAiB8Y,UAAjB,EA9FiC;;EAiGjC1C,QAAAA,IAAI,CAACpW,WAAL,CACIS,aAAa,CAAC,KAAD,EAAQ;EACjB0Q,UAAAA,IAAI,EAAE;EADW,SAAR,CADjB;EAMAyH,QAAAA,KAAK,CAAC5Y,WAAN,CAAkBoW,IAAlB;EAEA,QAAA,MAAI,CAACnX,QAAL,CAAc6Q,QAAd,CAAuBN,OAAvB,CAA+B9R,IAA/B,IAAuCqV,QAAvC;EACA,QAAA,MAAI,CAAC9T,QAAL,CAAc6Q,QAAd,CAAuBuG,MAAvB,CAA8B3Y,IAA9B,IAAsC0Y,IAAtC;EACH,OA3GD;EA6GAqB,MAAAA,KAAK,CAACzX,WAAN,CAAkB4Y,KAAlB;EACA1G,MAAAA,OAAO,CAAClS,WAAR,CAAoByX,KAApB;EACAvY,MAAAA,SAAS,CAACc,WAAV,CAAsBkS,OAAtB;EAEA,WAAKjT,QAAL,CAAc6Q,QAAd,CAAuB2H,KAAvB,GAA+BA,KAA/B;EACA,WAAKxY,QAAL,CAAc6Q,QAAd,CAAuB6B,IAAvB,GAA8BO,OAA9B;EACH,KAtQQ;;;EAyQT,QAAI,KAAKzN,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,KAA9B,KAAwC2C,OAAO,CAACU,GAApD,EAAyD;EACrDzH,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,KAAjC,CAAtB;EACH,KA3QQ;;;EA8QT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,SAA9B,KAA4C2C,OAAO,CAACc,OAAxD,EAAiE;EAC7D7H,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,SAAjC,CAAtB;EACH,KAhRQ;;;EAmRT,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CAAJ,EAA+C;EAC3C,UAAMnD,WAAU,GAAG;EACfjE,QAAAA,OAAO,EAAE,GADM;EAEf6c,QAAAA,IAAI,EAAE,KAAKL,QAFI;EAGf5X,QAAAA,MAAM,EAAE;EAHO,OAAnB;EAD2C,UAOnC4X,QAPmC,GAOtB,KAAKjU,MAAL,CAAYuU,IAPU,CAOnCN,QAPmC;;EAS3C,UAAI,CAACpb,EAAE,CAACd,GAAH,CAAOkc,QAAP,CAAD,IAAqB,KAAKO,OAA9B,EAAuC;EACnC9Q,QAAAA,MAAM,CAAChI,WAAD,EAAa;EACf8Q,UAAAA,IAAI,iBAAU,KAAK5K,QAAf,CADW;EAEf0L,UAAAA,KAAK,EAAE,KAAK1L;EAFG,SAAb,CAAN;EAIH;;EAEDnH,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,UAAjC,EAA6CqC,WAA7C,CAAtB;EACH,KApSQ;;;EAuST,QAAI,KAAKsE,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,YAA9B,CAAJ,EAAiD;EAC7CpE,MAAAA,SAAS,CAACc,WAAV,CAAsB+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,YAAjC,CAAtB;EACH,KAzSQ;;;EA4ST,QAAI,KAAK2G,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,YAA9B,CAAJ,EAAiD;EAC7C,WAAKrE,QAAL,CAAcC,SAAd,CAAwBc,WAAxB,CAAoC+O,QAAQ,CAAC6C,YAAT,CAAsB9T,IAAtB,CAA2B,IAA3B,EAAiC,YAAjC,CAApC;EACH;;EAED,SAAKmB,QAAL,CAAc8P,QAAd,GAAyB7P,SAAzB,CAhTS;;EAmTT,QAAI,KAAKkI,OAAT,EAAkB;EACd2H,MAAAA,QAAQ,CAACyH,cAAT,CAAwB1Y,IAAxB,CAA6B,IAA7B,EAAmC+J,KAAK,CAACK,iBAAN,CAAwBpK,IAAxB,CAA6B,IAA7B,CAAnC;EACH;;EAEDiR,IAAAA,QAAQ,CAACsI,YAAT,CAAsBvZ,IAAtB,CAA2B,IAA3B;EAEA,WAAOoB,SAAP;EACH,GAjgDY;EAmgDb;EACAga,EAAAA,MApgDa,oBAogDJ;EAAA;;EACL;EACA,QAAI,KAAKzU,MAAL,CAAY6I,UAAhB,EAA4B;EACxB,UAAM2D,IAAI,GAAGlC,QAAQ,CAACC,UAAT,CAAoBlR,IAApB,CAAyB,IAAzB,CAAb,CADwB;;EAIxB,UAAImT,IAAI,CAAC9B,IAAT,EAAe;EACX7B,QAAAA,UAAU,CAAC2D,IAAI,CAACzU,GAAN,EAAW,aAAX,CAAV;EACH;EACJ,KATI;;;EAYL,SAAK+F,EAAL,GAAUiH,IAAI,CAACY,KAAL,CAAWZ,IAAI,CAACa,MAAL,KAAgB,KAA3B,CAAV,CAZK;;EAeL,QAAInL,SAAS,GAAG,IAAhB;EACA,SAAKD,QAAL,CAAc8P,QAAd,GAAyB,IAAzB,CAhBK;;EAmBL,QAAM+C,KAAK,GAAG;EACVvP,MAAAA,EAAE,EAAE,KAAKA,EADC;EAEV4W,MAAAA,QAAQ,EAAE,KAAK1U,MAAL,CAAYuH,QAFZ;EAGVC,MAAAA,KAAK,EAAE,KAAKxH,MAAL,CAAYwH;EAHT,KAAd;EAKA,QAAI0B,MAAM,GAAG,IAAb,CAxBK;;EA2BL,QAAIrQ,EAAE,CAACxB,QAAH,CAAY,KAAK2I,MAAL,CAAYsK,QAAxB,CAAJ,EAAuC;EACnC,WAAKtK,MAAL,CAAYsK,QAAZ,GAAuB,KAAKtK,MAAL,CAAYsK,QAAZ,CAAqBjR,IAArB,CAA0B,IAA1B,EAAgCgU,KAAhC,CAAvB;EACH,KA7BI;;;EAgCL,QAAI,CAAC,KAAKrN,MAAL,CAAYsK,QAAjB,EAA2B;EACvB,WAAKtK,MAAL,CAAYsK,QAAZ,GAAuB,EAAvB;EACH;;EAED,QAAIzR,EAAE,CAACpB,OAAH,CAAW,KAAKuI,MAAL,CAAYsK,QAAvB,KAAoCzR,EAAE,CAAChC,MAAH,CAAU,KAAKmJ,MAAL,CAAYsK,QAAtB,CAAxC,EAAyE;EACrE;EACA7P,MAAAA,SAAS,GAAG,KAAKuF,MAAL,CAAYsK,QAAxB;EACH,KAHD,MAGO;EACH;EACA7P,MAAAA,SAAS,GAAG6P,QAAQ,CAAC4J,MAAT,CAAgB7a,IAAhB,CAAqB,IAArB,EAA2B;EACnCyE,QAAAA,EAAE,EAAE,KAAKA,EAD0B;EAEnC4W,QAAAA,QAAQ,EAAE,KAAK1U,MAAL,CAAYuH,QAFa;EAGnCmI,QAAAA,KAAK,EAAE,KAAKA,KAHuB;EAInCtL,QAAAA,OAAO,EAAE,KAAKA,OAJqB;EAKnCkH,QAAAA,QAAQ,EAAEA,QAAQ,CAACwG,QAAT,CAAkBzY,IAAlB,CAAuB,IAAvB,CALyB;EAOnC;;EAPmC,OAA3B,CAAZ;EASA6P,MAAAA,MAAM,GAAG,KAAT;EACH,KAnDI;;;EAsDL,QAAM1L,OAAO,GAAG,SAAVA,OAAU,CAAApJ,KAAK,EAAI;EACrB,UAAIqV,MAAM,GAAGrV,KAAb;EAEAM,MAAAA,MAAM,CAACiH,OAAP,CAAe0R,KAAf,EAAsBrU,OAAtB,CAA8B,iBAAkB;EAAA;EAAA,YAAhB8C,GAAgB;EAAA,YAAXD,KAAW;;EAC5C4N,QAAAA,MAAM,GAAGrD,UAAU,CAACqD,MAAD,aAAa3N,GAAb,QAAqBD,KAArB,CAAnB;EACH,OAFD;EAIA,aAAO4N,MAAP;EACH,KARD,CAtDK;;;EAiEL,QAAIP,MAAJ,EAAY;EACR,UAAIrQ,EAAE,CAAChC,MAAH,CAAU,KAAKmJ,MAAL,CAAYsK,QAAtB,CAAJ,EAAqC;EACjC7P,QAAAA,SAAS,GAAG+C,OAAO,CAAC/C,SAAD,CAAnB;EACH,OAFD,MAEO,IAAI5B,EAAE,CAACpB,OAAH,CAAWgD,SAAX,CAAJ,EAA2B;EAC9BA,QAAAA,SAAS,CAACuM,SAAV,GAAsBxJ,OAAO,CAAC/C,SAAS,CAACuM,SAAX,CAA7B;EACH;EACJ,KAvEI;;;EA0EL,QAAI3K,MAAJ,CA1EK;;EA6EL,QAAIxD,EAAE,CAAChC,MAAH,CAAU,KAAKmJ,MAAL,CAAY8K,SAAZ,CAAsBR,QAAtB,CAA+B7P,SAAzC,CAAJ,EAAyD;EACrD4B,MAAAA,MAAM,GAAGH,QAAQ,CAAC+C,aAAT,CAAuB,KAAKe,MAAL,CAAY8K,SAAZ,CAAsBR,QAAtB,CAA+B7P,SAAtD,CAAT;EACH,KA/EI;;;EAkFL,QAAI,CAAC5B,EAAE,CAACpB,OAAH,CAAW4E,MAAX,CAAL,EAAyB;EACrBA,MAAAA,MAAM,GAAG,KAAK7B,QAAL,CAAcC,SAAvB;EACH,KApFI;;;EAuFL,QAAMka,YAAY,GAAG9b,EAAE,CAACpB,OAAH,CAAWgD,SAAX,IAAwB,uBAAxB,GAAkD,oBAAvE;EACA4B,IAAAA,MAAM,CAACsY,YAAD,CAAN,CAAqB,YAArB,EAAmCla,SAAnC,EAxFK;;EA2FL,QAAI,CAAC5B,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc8P,QAAzB,CAAL,EAAyC;EACrCA,MAAAA,QAAQ,CAACO,YAAT,CAAsBxR,IAAtB,CAA2B,IAA3B;EACH,KA7FI;;;EAgGL,QAAI,CAACR,EAAE,CAACb,KAAH,CAAS,KAAKwC,QAAL,CAAcuQ,OAAvB,CAAL,EAAsC;EAClC,UAAM6J,WAAW,GAAG,SAAdA,WAAc,CAAAlH,MAAM,EAAI;EAC1B,YAAMnQ,SAAS,GAAG,OAAI,CAACyC,MAAL,CAAYC,UAAZ,CAAuB4U,cAAzC;EACAngB,QAAAA,MAAM,CAAC0D,cAAP,CAAsBsV,MAAtB,EAA8B,SAA9B,EAAyC;EACrC0B,UAAAA,UAAU,EAAE,IADyB;EAErC/W,UAAAA,GAFqC,iBAE/B;EACF,mBAAOoG,QAAQ,CAACiP,MAAD,EAASnQ,SAAT,CAAf;EACH,WAJoC;EAKrCqG,UAAAA,GALqC,iBAKhB;EAAA,gBAAjBqM,OAAiB,uEAAP,KAAO;EACjB9R,YAAAA,WAAW,CAACuP,MAAD,EAASnQ,SAAT,EAAoB0S,OAApB,CAAX;EACH;EAPoC,SAAzC;EASH,OAXD,CADkC;;;EAelCvb,MAAAA,MAAM,CAACoe,MAAP,CAAc,KAAKtY,QAAL,CAAcuQ,OAA5B,EACKnP,MADL,CACYrH,OADZ,EAEKyE,OAFL,CAEa,UAAA0U,MAAM,EAAI;EACf,YAAI7U,EAAE,CAACvB,KAAH,CAASoW,MAAT,KAAoB7U,EAAE,CAACrB,QAAH,CAAYkW,MAAZ,CAAxB,EAA6C;EACzCtY,UAAAA,KAAK,CAAC0F,IAAN,CAAW4S,MAAX,EAAmB9R,MAAnB,CAA0BrH,OAA1B,EAAmCyE,OAAnC,CAA2C4b,WAA3C;EACH,SAFD,MAEO;EACHA,UAAAA,WAAW,CAAClH,MAAD,CAAX;EACH;EACJ,OARL;EASH,KAxHI;;;EA2HL,QAAIxX,MAAM,CAACgL,SAAP,CAAiBC,SAAjB,CAA2BtC,QAA3B,CAAoC,MAApC,CAAJ,EAAiD;EAC7C6B,MAAAA,OAAO,CAACrE,MAAD,CAAP;EACH,KA7HI;;;EAgIL,QAAI,KAAK2D,MAAL,CAAY0Q,QAAZ,CAAqBpG,QAAzB,EAAmC;EAAA,yBACG,KAAKtK,MADR;EAAA,UACvBC,UADuB,gBACvBA,UADuB;EAAA,UACX6K,SADW,gBACXA,SADW;EAE/B,UAAMzN,QAAQ,aAAMyN,SAAS,CAACR,QAAV,CAAmB1P,OAAzB,cAAoCkQ,SAAS,CAACgK,MAA9C,eAAyD7U,UAAU,CAACjC,MAApE,CAAd;EACA,UAAM8W,MAAM,GAAG/V,WAAW,CAAC1F,IAAZ,CAAiB,IAAjB,EAAuBgE,QAAvB,CAAf;EAEAjI,MAAAA,KAAK,CAAC0F,IAAN,CAAWga,MAAX,EAAmB9b,OAAnB,CAA2B,UAAAsU,KAAK,EAAI;EAChCnP,QAAAA,WAAW,CAACmP,KAAD,EAAQ,OAAI,CAACtN,MAAL,CAAYC,UAAZ,CAAuBjC,MAA/B,EAAuC,KAAvC,CAAX;EACAG,QAAAA,WAAW,CAACmP,KAAD,EAAQ,OAAI,CAACtN,MAAL,CAAYC,UAAZ,CAAuB+L,OAA/B,EAAwC,IAAxC,CAAX;EACH,OAHD;EAIH;EACJ;EA9oDY,CAAjB;;ECfA;;;;;;AAKA,EAAO,SAAS+I,QAAT,CAAkB3gB,KAAlB,EAAsC;EAAA,MAAb4gB,IAAa,uEAAN,IAAM;EACzC,MAAIjd,GAAG,GAAG3D,KAAV;;EAEA,MAAI4gB,IAAJ,EAAU;EACN,QAAMC,MAAM,GAAG/Y,QAAQ,CAACF,aAAT,CAAuB,GAAvB,CAAf;EACAiZ,IAAAA,MAAM,CAACX,IAAP,GAAcvc,GAAd;EACAA,IAAAA,GAAG,GAAGkd,MAAM,CAACX,IAAb;EACH;;EAED,MAAI;EACA,WAAO,IAAI1d,GAAJ,CAAQmB,GAAR,CAAP;EACH,GAFD,CAEE,OAAOf,CAAP,EAAU;EACR,WAAO,IAAP;EACH;EACJ;;AAGD,EAAO,SAASke,cAAT,CAAwB9gB,KAAxB,EAA+B;EAClC,MAAM+gB,MAAM,GAAG,IAAIC,eAAJ,EAAf;;EAEA,MAAIvc,EAAE,CAAC3B,MAAH,CAAU9C,KAAV,CAAJ,EAAsB;EAClBM,IAAAA,MAAM,CAACiH,OAAP,CAAevH,KAAf,EAAsB4E,OAAtB,CAA8B,gBAAkB;EAAA;EAAA,UAAhB8C,GAAgB;EAAA,UAAXD,KAAW;;EAC5CsZ,MAAAA,MAAM,CAACvR,GAAP,CAAW9H,GAAX,EAAgBD,KAAhB;EACH,KAFD;EAGH;;EAED,SAAOsZ,MAAP;EACH;;ECdD,IAAM7J,QAAQ,GAAG;EACb;EACA+J,EAAAA,KAFa,mBAEL;EACJ;EACA,QAAI,CAAC,KAAKnd,SAAL,CAAe8J,EAApB,EAAwB;EACpB;EACH,KAJG;;;EAOJ,QAAI,CAAC,KAAKsT,OAAN,IAAiB,KAAKC,SAAtB,IAAoC,KAAK5S,OAAL,IAAgB,CAACnB,OAAO,CAACsB,UAAjE,EAA8E;EAC1E;EACA,UACIjK,EAAE,CAACvB,KAAH,CAAS,KAAK0I,MAAL,CAAYsK,QAArB,KACA,KAAKtK,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CADA,IAEA,KAAKmB,MAAL,CAAYqL,QAAZ,CAAqBxM,QAArB,CAA8B,UAA9B,CAHJ,EAIE;EACEyL,QAAAA,QAAQ,CAACgI,eAAT,CAAyBjZ,IAAzB,CAA8B,IAA9B;EACH;;EAED;EACH,KAlBG;;;EAqBJ,QAAI,CAACR,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc8Q,QAAzB,CAAL,EAAyC;EACrC,WAAK9Q,QAAL,CAAc8Q,QAAd,GAAyBtP,aAAa,CAAC,KAAD,EAAQgB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBQ,QAAvB,CAAjC,CAAtC;EAEAlP,MAAAA,WAAW,CAAC,KAAK5B,QAAL,CAAc8Q,QAAf,EAAyB,KAAK9Q,QAAL,CAAcI,OAAvC,CAAX;EACH,KAzBG;EA4BJ;;;EACA,QAAIgG,OAAO,CAACC,IAAR,IAAgB3K,MAAM,CAACU,GAA3B,EAAgC;EAC5B,UAAM4D,QAAQ,GAAG,KAAKoI,KAAL,CAAWhE,gBAAX,CAA4B,OAA5B,CAAjB;EAEAxJ,MAAAA,KAAK,CAAC0F,IAAN,CAAWN,QAAX,EAAqBxB,OAArB,CAA6B,UAAAlB,KAAK,EAAI;EAClC,YAAMmM,GAAG,GAAGnM,KAAK,CAAC0L,YAAN,CAAmB,KAAnB,CAAZ;EACA,YAAMzL,GAAG,GAAGgd,QAAQ,CAAC9Q,GAAD,CAApB;;EAEA,YACIlM,GAAG,KAAK,IAAR,IACAA,GAAG,CAAChB,QAAJ,KAAiBb,MAAM,CAACuU,QAAP,CAAgB6J,IAAhB,CAAqBvd,QADtC,IAEA,CAAC,OAAD,EAAU,QAAV,EAAoB8H,QAApB,CAA6B9G,GAAG,CAACyd,QAAjC,CAHJ,EAIE;EACEtN,UAAAA,KAAK,CAACjE,GAAD,EAAM,MAAN,CAAL,CACKvJ,IADL,CACU,UAAA+a,IAAI,EAAI;EACV3d,YAAAA,KAAK,CAACiE,YAAN,CAAmB,KAAnB,EAA0B7F,MAAM,CAACU,GAAP,CAAW8e,eAAX,CAA2BD,IAA3B,CAA1B;EACH,WAHL,EAIK/L,KAJL,CAIW,YAAM;EACTnN,YAAAA,aAAa,CAACzE,KAAD,CAAb;EACH,WANL;EAOH;EACJ,OAjBD;EAkBH,KAlDG;EAqDJ;EACA;EACA;EACA;EACA;;;EAEA,QAAM6d,gBAAgB,GAAGzU,SAAS,CAAC0U,SAAV,IAAuB,CAAC1U,SAAS,CAACwR,QAAV,IAAsBxR,SAAS,CAAC2U,YAAhC,IAAgD,IAAjD,CAAhD;EACA,QAAMD,SAAS,GAAGnR,MAAM,CAACkR,gBAAgB,CAACtX,GAAjB,CAAqB,UAAAqU,QAAQ;EAAA,aAAIA,QAAQ,CAAC3Z,KAAT,CAAe,GAAf,EAAoB,CAApB,CAAJ;EAAA,KAA7B,CAAD,CAAxB;EAEA,QAAI2Z,QAAQ,GAAG,CAAC,KAAK/K,OAAL,CAAatP,GAAb,CAAiB,UAAjB,KAAgC,KAAK2H,MAAL,CAAYsL,QAAZ,CAAqBoH,QAArD,IAAiE,MAAlE,EAA0EjM,WAA1E,EAAf,CA9DI;;EAiEJ,QAAIiM,QAAQ,KAAK,MAAjB,EAAyB;EAAA,sCACRkD,SADQ;;EACpBlD,MAAAA,QADoB;EAExB;;EAED,QAAIoD,MAAM,GAAG,KAAKnO,OAAL,CAAatP,GAAb,CAAiB,UAAjB,CAAb;;EACA,QAAI,CAACQ,EAAE,CAACzB,OAAH,CAAW0e,MAAX,CAAL,EAAyB;EAClBA,MAAAA,MADkB,GACP,KAAK9V,MAAL,CAAYsL,QADL,CAClBwK,MADkB;EAExB;;EAEDphB,IAAAA,MAAM,CAACqF,MAAP,CAAc,KAAKuR,QAAnB,EAA6B;EACzBmH,MAAAA,OAAO,EAAE,KADgB;EAEzBqD,MAAAA,MAAM,EAANA,MAFyB;EAGzBpD,MAAAA,QAAQ,EAARA,QAHyB;EAIzBkD,MAAAA,SAAS,EAATA;EAJyB,KAA7B,EA1EI;;EAkFJ,QAAI,KAAKjT,OAAT,EAAkB;EACd,UAAMoT,WAAW,GAAG,KAAK/V,MAAL,CAAYsL,QAAZ,CAAqBpC,MAArB,GAA8B,sBAA9B,GAAuD,aAA3E;EACA9P,MAAAA,EAAE,CAACC,IAAH,CAAQ,IAAR,EAAc,KAAKuJ,KAAL,CAAWE,UAAzB,EAAqCiT,WAArC,EAAkDzK,QAAQ,CAACpC,MAAT,CAAgBsG,IAAhB,CAAqB,IAArB,CAAlD;EACH,KArFG;;;EAwFJjV,IAAAA,UAAU,CAAC+Q,QAAQ,CAACpC,MAAT,CAAgBsG,IAAhB,CAAqB,IAArB,CAAD,EAA6B,CAA7B,CAAV;EACH,GA3FY;EA6Fb;EACAtG,EAAAA,MA9Fa,oBA8FJ;EAAA;;EACL,QAAMqJ,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,EAA8B,IAA9B,CAAf,CADK;;EAAA,yBAGgD,KAAKiS,QAHrD;EAAA,QAGGwK,MAHH,kBAGGA,MAHH;EAAA,QAGWpD,QAHX,kBAGWA,QAHX;EAAA,QAGqBsD,IAHrB,kBAGqBA,IAHrB;EAAA,QAG2BC,gBAH3B,kBAG2BA,gBAH3B;EAIL,QAAMC,cAAc,GAAG3hB,OAAO,CAACge,MAAM,CAAChS,IAAP,CAAY,UAAAzI,KAAK;EAAA,aAAIA,KAAK,CAAC4a,QAAN,KAAmBA,QAAvB;EAAA,KAAjB,CAAD,CAA9B,CAJK;;EAOL,QAAI,KAAK/P,OAAL,IAAgB,KAAK2S,OAAzB,EAAkC;EAC9B/C,MAAAA,MAAM,CAAC3W,MAAP,CAAc,UAAA9D,KAAK;EAAA,eAAI,CAACke,IAAI,CAAC3d,GAAL,CAASP,KAAT,CAAL;EAAA,OAAnB,EAAyCkB,OAAzC,CAAiD,UAAAlB,KAAK,EAAI;EACtD,QAAA,KAAI,CAACyM,KAAL,CAAWC,GAAX,CAAe,aAAf,EAA8B1M,KAA9B,EADsD;;;EAGtDke,QAAAA,IAAI,CAACpS,GAAL,CAAS9L,KAAT,EAAgB;EACZ+Z,UAAAA,OAAO,EAAE/Z,KAAK,CAACqe,IAAN,KAAe;EADZ,SAAhB,EAHsD;;EAQtDre,QAAAA,KAAK,CAACqe,IAAN,GAAa,QAAb,CARsD;;EAWtD/c,QAAAA,EAAE,CAACC,IAAH,CAAQ,KAAR,EAAcvB,KAAd,EAAqB,WAArB,EAAkC;EAAA,iBAAMwT,QAAQ,CAAC8K,UAAT,CAAoB/c,IAApB,CAAyB,KAAzB,CAAN;EAAA,SAAlC;EACH,OAZD;EAaH,KArBI;;;EAwBL,QAAK6c,cAAc,IAAI,KAAKxD,QAAL,KAAkBA,QAArC,IAAkD,CAACH,MAAM,CAAC1T,QAAP,CAAgBoX,gBAAhB,CAAvD,EAA0F;EACtF3K,MAAAA,QAAQ,CAAC+K,WAAT,CAAqBhd,IAArB,CAA0B,IAA1B,EAAgCqZ,QAAhC;EACApH,MAAAA,QAAQ,CAAC5S,MAAT,CAAgBW,IAAhB,CAAqB,IAArB,EAA2Byc,MAAM,IAAII,cAArC;EACH,KA3BI;;;EA8BL/X,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBqL,QAAvB,CAAgC5D,OAA1D,EAAmE,CAAC7O,EAAE,CAACb,KAAH,CAASua,MAAT,CAApE,CAAX,CA9BK;;EAiCL,QAAI,CAAC,KAAKvS,MAAL,CAAYsK,QAAZ,IAAwB,EAAzB,EAA6BzL,QAA7B,CAAsC,UAAtC,KAAqD,KAAKmB,MAAL,CAAYqL,QAAZ,CAAqBxM,QAArB,CAA8B,UAA9B,CAAzD,EAAoG;EAChGyL,MAAAA,QAAQ,CAACgI,eAAT,CAAyBjZ,IAAzB,CAA8B,IAA9B;EACH;EACJ,GAlIY;EAoIb;EACA;EACAX,EAAAA,MAtIa,kBAsINtE,KAtIM,EAsIiB;EAAA,QAAhBuE,OAAgB,uEAAN,IAAM;;EAC1B;EACA,QAAI,CAAC,KAAKT,SAAL,CAAe8J,EAApB,EAAwB;EACpB;EACH;;EAJyB,QAMlByQ,OANkB,GAMN,KAAKnH,QANC,CAMlBmH,OANkB;;EAO1B,QAAM6D,WAAW,GAAG,KAAKtW,MAAL,CAAYC,UAAZ,CAAuBqL,QAAvB,CAAgCwK,MAApD,CAP0B;EAU1B;;EACA,QAAMA,MAAM,GAAGjd,EAAE,CAAC5B,eAAH,CAAmB7C,KAAnB,IAA4B,CAACqe,OAA7B,GAAuCre,KAAtD,CAX0B;;EAc1B,QAAI0hB,MAAM,KAAKrD,OAAf,EAAwB;EACpB;EACA,UAAI,CAAC9Z,OAAL,EAAc;EACV,aAAK2S,QAAL,CAAcwK,MAAd,GAAuBA,MAAvB;EACA,aAAKnO,OAAL,CAAa/D,GAAb,CAAiB;EAAE0H,UAAAA,QAAQ,EAAEwK;EAAZ,SAAjB;EACH,OALmB;;;EAQpB,UAAI,CAAC,KAAKpD,QAAN,IAAkBoD,MAAlB,IAA4B,CAACnd,OAAjC,EAA0C;EACtC,YAAM4Z,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,CAAf;EACA,YAAMvB,KAAK,GAAGwT,QAAQ,CAACiL,SAAT,CAAmBld,IAAnB,CAAwB,IAAxB,GAA+B,KAAKiS,QAAL,CAAcoH,QAA7C,4BAA0D,KAAKpH,QAAL,CAAcsK,SAAxE,IAAoF,IAApF,CAAd,CAFsC;;EAKtC,aAAKtK,QAAL,CAAcoH,QAAd,GAAyB5a,KAAK,CAAC4a,QAA/B,CALsC;;EAQtCpH,QAAAA,QAAQ,CAAC1H,GAAT,CAAavK,IAAb,CAAkB,IAAlB,EAAwBkZ,MAAM,CAAC7N,OAAP,CAAe5M,KAAf,CAAxB;EACA;EACH,OAlBmB;;;EAqBpB,UAAI,KAAK0C,QAAL,CAAcuQ,OAAd,CAAsBO,QAA1B,EAAoC;EAChC,aAAK9Q,QAAL,CAAcuQ,OAAd,CAAsBO,QAAtB,CAA+B2E,OAA/B,GAAyC6F,MAAzC;EACH,OAvBmB;;;EA0BpB3X,MAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B6b,WAA1B,EAAuCR,MAAvC,CAAX;EAEA,WAAKxK,QAAL,CAAcmH,OAAd,GAAwBqD,MAAxB,CA5BoB;;EA+BpBxL,MAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4B,IAA5B,EAAkC,UAAlC,EA/BoB;;EAkCpBM,MAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoCkT,MAAM,GAAG,iBAAH,GAAuB,kBAAjE;EACH;EACJ,GAxLY;EA0Lb;EACA;EACAlS,EAAAA,GA5La,eA4LT5I,KA5LS,EA4Lc;EAAA,QAAhBrC,OAAgB,uEAAN,IAAM;EACvB,QAAM4Z,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,CAAf,CADuB;;EAIvB,QAAI2B,KAAK,KAAK,CAAC,CAAf,EAAkB;EACdsQ,MAAAA,QAAQ,CAAC5S,MAAT,CAAgBW,IAAhB,CAAqB,IAArB,EAA2B,KAA3B,EAAkCV,OAAlC;EACA;EACH;;EAED,QAAI,CAACE,EAAE,CAAC1B,MAAH,CAAU6D,KAAV,CAAL,EAAuB;EACnB,WAAKuJ,KAAL,CAAW2H,IAAX,CAAgB,0BAAhB,EAA4ClR,KAA5C;EACA;EACH;;EAED,QAAI,EAAEA,KAAK,IAAIuX,MAAX,CAAJ,EAAwB;EACpB,WAAKhO,KAAL,CAAW2H,IAAX,CAAgB,iBAAhB,EAAmClR,KAAnC;EACA;EACH;;EAED,QAAI,KAAKsQ,QAAL,CAAcmE,YAAd,KAA+BzU,KAAnC,EAA0C;EACtC,WAAKsQ,QAAL,CAAcmE,YAAd,GAA6BzU,KAA7B;EACA,UAAMlD,KAAK,GAAGya,MAAM,CAACvX,KAAD,CAApB;;EAFsC,iBAGjBlD,KAAK,IAAI,EAHQ;EAAA,UAG9B4a,QAH8B,QAG9BA,QAH8B;;;EAMtC,WAAKpH,QAAL,CAAc2K,gBAAd,GAAiCne,KAAjC,CANsC;;EAStCwS,MAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4B,IAA5B,EAAkC,UAAlC,EATsC;;EAYtC,UAAI,CAACV,OAAL,EAAc;EACV,aAAK2S,QAAL,CAAcoH,QAAd,GAAyBA,QAAzB;EACA,aAAK/K,OAAL,CAAa/D,GAAb,CAAiB;EAAE8O,UAAAA,QAAQ,EAARA;EAAF,SAAjB;EACH,OAfqC;;;EAkBtC,UAAI,KAAKG,OAAT,EAAkB;EACd,aAAK2D,KAAL,CAAWC,eAAX,CAA2B/D,QAA3B;EACH,OApBqC;;;EAuBtC/Y,MAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoC,gBAApC;EACH,KA3CsB;;;EA8CvB0I,IAAAA,QAAQ,CAAC5S,MAAT,CAAgBW,IAAhB,CAAqB,IAArB,EAA2B,IAA3B,EAAiCV,OAAjC;;EAEA,QAAI,KAAKgK,OAAL,IAAgB,KAAK2S,OAAzB,EAAkC;EAC9B;EACAhK,MAAAA,QAAQ,CAAC8K,UAAT,CAAoB/c,IAApB,CAAyB,IAAzB;EACH;EACJ,GAhPY;EAkPb;EACA;EACAgd,EAAAA,WApPa,uBAoPDjiB,KApPC,EAoPsB;EAAA,QAAhBuE,OAAgB,uEAAN,IAAM;;EAC/B,QAAI,CAACE,EAAE,CAAChC,MAAH,CAAUzC,KAAV,CAAL,EAAuB;EACnB,WAAKmQ,KAAL,CAAW2H,IAAX,CAAgB,2BAAhB,EAA6C9X,KAA7C;EACA;EACH,KAJ8B;;;EAM/B,QAAMse,QAAQ,GAAGte,KAAK,CAACqS,WAAN,EAAjB;EACA,SAAK6E,QAAL,CAAcoH,QAAd,GAAyBA,QAAzB,CAP+B;;EAU/B,QAAMH,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,CAAf;EACA,QAAMvB,KAAK,GAAGwT,QAAQ,CAACiL,SAAT,CAAmBld,IAAnB,CAAwB,IAAxB,EAA8B,CAACqZ,QAAD,CAA9B,CAAd;EACApH,IAAAA,QAAQ,CAAC1H,GAAT,CAAavK,IAAb,CAAkB,IAAlB,EAAwBkZ,MAAM,CAAC7N,OAAP,CAAe5M,KAAf,CAAxB,EAA+Ca,OAA/C;EACH,GAjQY;EAmQb;EACA;EACA;EACA6Z,EAAAA,SAtQa,uBAsQa;EAAA;;EAAA,QAAhBtJ,MAAgB,uEAAP,KAAO;EACtB;EACA,QAAMqJ,MAAM,GAAGnd,KAAK,CAAC0F,IAAN,CAAW,CAAC,KAAK8H,KAAL,IAAc,EAAf,EAAmBE,UAAnB,IAAiC,EAA5C,CAAf,CAFsB;EAItB;;EACA,WAAOyP,MAAM,CACR3W,MADE,CACK,UAAA9D,KAAK;EAAA,aAAI,CAAC,MAAI,CAAC6K,OAAN,IAAiBuG,MAAjB,IAA2B,MAAI,CAACoC,QAAL,CAAc0K,IAAd,CAAmBU,GAAnB,CAAuB5e,KAAvB,CAA/B;EAAA,KADV,EAEF8D,MAFE,CAEK,UAAA9D,KAAK;EAAA,aAAI,CAAC,UAAD,EAAa,WAAb,EAA0B+G,QAA1B,CAAmC/G,KAAK,CAACvB,IAAzC,CAAJ;EAAA,KAFV,CAAP;EAGH,GA9QY;EAgRb;EACAggB,EAAAA,SAjRa,qBAiRHX,SAjRG,EAiRuB;EAAA;;EAAA,QAAfxX,KAAe,uEAAP,KAAO;EAChC,QAAMmU,MAAM,GAAGjH,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,CAAf;;EACA,QAAMsd,aAAa,GAAG,SAAhBA,aAAgB,CAAA7e,KAAK;EAAA,aAAIlD,MAAM,CAAC,CAAC,MAAI,CAAC0W,QAAL,CAAc0K,IAAd,CAAmB3d,GAAnB,CAAuBP,KAAvB,KAAiC,EAAlC,EAAsC+Z,OAAvC,CAAV;EAAA,KAA3B;;EACA,QAAM+E,MAAM,GAAGxhB,KAAK,CAAC0F,IAAN,CAAWyX,MAAX,EAAmBL,IAAnB,CAAwB,UAACC,CAAD,EAAIC,CAAJ;EAAA,aAAUuE,aAAa,CAACvE,CAAD,CAAb,GAAmBuE,aAAa,CAACxE,CAAD,CAA1C;EAAA,KAAxB,CAAf;EACA,QAAIra,KAAJ;EACA8d,IAAAA,SAAS,CAACiB,KAAV,CAAgB,UAAAnE,QAAQ,EAAI;EACxB5a,MAAAA,KAAK,GAAG8e,MAAM,CAACrW,IAAP,CAAY,UAAAzI,KAAK;EAAA,eAAIA,KAAK,CAAC4a,QAAN,KAAmBA,QAAvB;EAAA,OAAjB,CAAR;EACA,aAAO,CAAC5a,KAAR,CAFwB;EAG3B,KAHD,EALgC;;EAUhC,WAAOA,KAAK,KAAKsG,KAAK,GAAGwY,MAAM,CAAC,CAAD,CAAT,GAAenW,SAAzB,CAAZ;EACH,GA5RY;EA8Rb;EACAqW,EAAAA,eA/Ra,6BA+RK;EACd,WAAOxL,QAAQ,CAACkH,SAAT,CAAmBnZ,IAAnB,CAAwB,IAAxB,EAA8B,KAAKoW,YAAnC,CAAP;EACH,GAjSY;EAmSb;EACAqC,EAAAA,QApSa,oBAoSJha,KApSI,EAoSG;EACZ,QAAI2X,YAAY,GAAG3X,KAAnB;;EAEA,QAAI,CAACe,EAAE,CAACf,KAAH,CAAS2X,YAAT,CAAD,IAA2BjO,OAAO,CAACsB,UAAnC,IAAiD,KAAKwI,QAAL,CAAcmH,OAAnE,EAA4E;EACxEhD,MAAAA,YAAY,GAAGnE,QAAQ,CAACwL,eAAT,CAAyBzd,IAAzB,CAA8B,IAA9B,CAAf;EACH;;EAED,QAAIR,EAAE,CAACf,KAAH,CAAS2X,YAAT,CAAJ,EAA4B;EACxB,UAAI,CAAC5W,EAAE,CAACb,KAAH,CAASyX,YAAY,CAACnC,KAAtB,CAAL,EAAmC;EAC/B,eAAOmC,YAAY,CAACnC,KAApB;EACH;;EAED,UAAI,CAACzU,EAAE,CAACb,KAAH,CAASyX,YAAY,CAACiD,QAAtB,CAAL,EAAsC;EAClC,eAAO5a,KAAK,CAAC4a,QAAN,CAAenM,WAAf,EAAP;EACH;;EAED,aAAOe,IAAI,CAACjP,GAAL,CAAS,SAAT,EAAoB,KAAK2H,MAAzB,CAAP;EACH;;EAED,WAAOsH,IAAI,CAACjP,GAAL,CAAS,UAAT,EAAqB,KAAK2H,MAA1B,CAAP;EACH,GAxTY;EA0Tb;EACA;EACAoW,EAAAA,UA5Ta,sBA4TFhiB,KA5TE,EA4TK;EACd;EACA,QAAI,CAAC,KAAK8D,SAAL,CAAe8J,EAApB,EAAwB;EACpB;EACH;;EAED,QAAI,CAACnJ,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc8Q,QAAzB,CAAL,EAAyC;EACrC,WAAK/G,KAAL,CAAW2H,IAAX,CAAgB,kCAAhB;EACA;EACH,KATa;;;EAYd,QAAI,CAACrT,EAAE,CAAC5B,eAAH,CAAmB7C,KAAnB,CAAD,IAA8B,CAACgB,KAAK,CAACD,OAAN,CAAcf,KAAd,CAAnC,EAAyD;EACrD,WAAKmQ,KAAL,CAAW2H,IAAX,CAAgB,2BAAhB,EAA6C9X,KAA7C;EACA;EACH;;EAED,QAAI2iB,IAAI,GAAG3iB,KAAX,CAjBc;;EAoBd,QAAI,CAAC2iB,IAAL,EAAW;EACP,UAAMjf,KAAK,GAAGwT,QAAQ,CAACwL,eAAT,CAAyBzd,IAAzB,CAA8B,IAA9B,CAAd;EACA0d,MAAAA,IAAI,GAAG3hB,KAAK,CAAC0F,IAAN,CAAW,CAAChD,KAAK,IAAI,EAAV,EAAckf,UAAd,IAA4B,EAAvC,EACF3Y,GADE,CACE,UAAAxG,GAAG;EAAA,eAAIA,GAAG,CAACof,YAAJ,EAAJ;EAAA,OADL,EAEF5Y,GAFE,CAEE6I,OAFF,CAAP;EAGH,KAzBa;;;EA4Bd,QAAMsC,OAAO,GAAGuN,IAAI,CAAC1Y,GAAL,CAAS,UAAA6Y,OAAO;EAAA,aAAIA,OAAO,CAAC5Z,IAAR,EAAJ;EAAA,KAAhB,EAAoCyP,IAApC,CAAyC,IAAzC,CAAhB;EACA,QAAMoK,OAAO,GAAG3N,OAAO,KAAK,KAAKhP,QAAL,CAAc8Q,QAAd,CAAuBtE,SAAnD;;EAEA,QAAImQ,OAAJ,EAAa;EACT;EACA1a,MAAAA,YAAY,CAAC,KAAKjC,QAAL,CAAc8Q,QAAf,CAAZ;EACA,UAAM8L,OAAO,GAAGpb,aAAa,CAAC,MAAD,EAASgB,yBAAyB,CAAC,KAAKgD,MAAL,CAAY8K,SAAZ,CAAsBsM,OAAvB,CAAlC,CAA7B;EACAA,MAAAA,OAAO,CAACpQ,SAAR,GAAoBwC,OAApB;EACA,WAAKhP,QAAL,CAAc8Q,QAAd,CAAuB/P,WAAvB,CAAmC6b,OAAnC,EALS;;EAQTzd,MAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoC,WAApC;EACH;EACJ;EArWY,CAAjB;;ECxBA;EACA;EACA;EAEA,IAAMyU,QAAQ,GAAG;EACb;EACA3P,EAAAA,OAAO,EAAE,IAFI;EAIb;EACAF,EAAAA,KAAK,EAAE,EALM;EAOb;EACAjD,EAAAA,KAAK,EAAE,KARM;EAUb;EACA+S,EAAAA,QAAQ,EAAE,KAXG;EAab;EACAC,EAAAA,SAAS,EAAE,IAdE;EAgBb;EACA;EACA1V,EAAAA,WAAW,EAAE,IAlBA;EAoBb;EACA0F,EAAAA,QAAQ,EAAE,EArBG;EAuBb;EACAoE,EAAAA,MAAM,EAAE,CAxBK;EAyBbqE,EAAAA,KAAK,EAAE,KAzBM;EA2Bb;EACAlE,EAAAA,QAAQ,EAAE,IA5BG;EA8Bb;EACA;EACAyF,EAAAA,eAAe,EAAE,IAhCJ;EAkCb;EACAJ,EAAAA,UAAU,EAAE,IAnCC;EAqCb;EACAqG,EAAAA,YAAY,EAAE,IAtCD;EAwCb;EACAC,EAAAA,KAAK,EAAE,MAzCM;EA2Cb;EACAC,EAAAA,WAAW,EAAE,IA5CA;EA8Cb;EACAC,EAAAA,YAAY,EAAE,IA/CD;EAiDb;EACAC,EAAAA,UAAU,EAAE,KAlDC;EAoDb;EACAC,EAAAA,kBAAkB,EAAE,IArDP;EAuDb;EACAhP,EAAAA,UAAU,EAAE,IAxDC;EAyDb0D,EAAAA,UAAU,EAAE,MAzDC;EA0Db/B,EAAAA,OAAO,EAAE,oCA1DI;EA4Db;EACAlG,EAAAA,UAAU,EAAE,sCA7DC;EA+Db;EACAF,EAAAA,OAAO,EAAE;EACLyN,IAAAA,OAAO,EAAE,GADJ;EAEL1Z,IAAAA,OAAO,EAAE,CAAC,IAAD,EAAO,IAAP,EAAa,IAAb,EAAmB,IAAnB,EAAyB,IAAzB,EAA+B,GAA/B,EAAoC,GAApC,EAAyC,GAAzC,EAA8C,GAA9C,EAAmD,GAAnD;EAFJ,GAhEI;EAqEb;EACA2f,EAAAA,IAAI,EAAE;EACFhC,IAAAA,MAAM,EAAE,KADN;EAGF;;EAHE,GAtEO;EA4Eb;EACApG,EAAAA,KAAK,EAAE;EACHqI,IAAAA,QAAQ,EAAE,CADP;EAEH5f,IAAAA,OAAO,EAAE,CAAC,GAAD,EAAM,IAAN,EAAY,CAAZ,EAAe,IAAf,EAAqB,GAArB,EAA0B,IAA1B,EAAgC,CAAhC;EAFN,GA7EM;EAkFb;EACA6f,EAAAA,QAAQ,EAAE;EACNxY,IAAAA,OAAO,EAAE,IADH;EAENyY,IAAAA,MAAM,EAAE;EAFF,GAnFG;EAwFb;EACAvH,EAAAA,QAAQ,EAAE;EACNpG,IAAAA,QAAQ,EAAE,KADJ;EAENoB,IAAAA,IAAI,EAAE;EAFA,GAzFG;EA8Fb;EACAJ,EAAAA,QAAQ,EAAE;EACNwK,IAAAA,MAAM,EAAE,KADF;EAENpD,IAAAA,QAAQ,EAAE,MAFJ;EAGN;EACA;EACAxJ,IAAAA,MAAM,EAAE;EALF,GA/FG;EAuGb;EACAqC,EAAAA,UAAU,EAAE;EACR7D,IAAAA,OAAO,EAAE,IADD;EACO;EACfwQ,IAAAA,QAAQ,EAAE,IAFF;EAEQ;EAChBC,IAAAA,SAAS,EAAE,KAHH;;EAAA,GAxGC;EA8Gb;EACAxQ,EAAAA,OAAO,EAAE;EACLD,IAAAA,OAAO,EAAE,IADJ;EAEL5L,IAAAA,GAAG,EAAE;EAFA,GA/GI;EAoHb;EACAwO,EAAAA,QAAQ,EAAE,CACN,YADM;EAGN;EACA,QAJM;EAMN,YANM,EAON,cAPM,EAQN,MARM,EASN,QATM,EAUN,UAVM,EAWN,UAXM,EAYN,KAZM,EAaN,SAbM;EAeN,cAfM,CArHG;EAsIbe,EAAAA,QAAQ,EAAE,CAAC,UAAD,EAAa,SAAb,EAAwB,OAAxB,CAtIG;EAwIb;EACA/D,EAAAA,IAAI,EAAE;EACF2D,IAAAA,OAAO,EAAE,SADP;EAEFC,IAAAA,MAAM,EAAE,oBAFN;EAGFhH,IAAAA,IAAI,EAAE,MAHJ;EAIF8G,IAAAA,KAAK,EAAE,OAJL;EAKFG,IAAAA,WAAW,EAAE,qBALX;EAMFO,IAAAA,IAAI,EAAE,MANJ;EAOF0M,IAAAA,SAAS,EAAE,6BAPT;EAQFlK,IAAAA,MAAM,EAAE,QARN;EASFoC,IAAAA,QAAQ,EAAE,UATR;EAUFzM,IAAAA,WAAW,EAAE,cAVX;EAWFiI,IAAAA,QAAQ,EAAE,UAXR;EAYFH,IAAAA,MAAM,EAAE,QAZN;EAaFP,IAAAA,IAAI,EAAE,MAbJ;EAcFiN,IAAAA,MAAM,EAAE,QAdN;EAeFC,IAAAA,cAAc,EAAE,iBAfd;EAgBFC,IAAAA,eAAe,EAAE,kBAhBf;EAiBFtE,IAAAA,QAAQ,EAAE,UAjBR;EAkBFuE,IAAAA,eAAe,EAAE,kBAlBf;EAmBFC,IAAAA,cAAc,EAAE,iBAnBd;EAoBFC,IAAAA,UAAU,EAAE,oBApBV;EAqBFpN,IAAAA,QAAQ,EAAE,UArBR;EAsBFD,IAAAA,QAAQ,EAAE,UAtBR;EAuBFsN,IAAAA,QAAQ,EAAE,0BAvBR;EAwBFjJ,IAAAA,KAAK,EAAE,OAxBL;EAyBFkJ,IAAAA,MAAM,EAAE,QAzBN;EA0BFxU,IAAAA,OAAO,EAAE,SA1BP;EA2BF0T,IAAAA,IAAI,EAAE,MA3BJ;EA4BFna,IAAAA,KAAK,EAAE,OA5BL;EA6BFkb,IAAAA,GAAG,EAAE,KA7BH;EA8BFC,IAAAA,GAAG,EAAE,KA9BH;EA+BFC,IAAAA,KAAK,EAAE,OA/BL;EAgCFC,IAAAA,QAAQ,EAAE,UAhCR;EAiCFtR,IAAAA,OAAO,EAAE,SAjCP;EAkCFuR,IAAAA,aAAa,EAAE,IAlCb;EAmCFC,IAAAA,YAAY,EAAE;EACV,YAAM,IADI;EAEV,YAAM,IAFI;EAGV,YAAM,IAHI;EAIV,WAAK,IAJK;EAKV,WAAK,IALK;EAMV,WAAK;EANK;EAnCZ,GAzIO;EAsLb;EACA3E,EAAAA,IAAI,EAAE;EACFN,IAAAA,QAAQ,EAAE,IADR;EAEF7M,IAAAA,KAAK,EAAE;EACH+R,MAAAA,GAAG,EAAE,wCADF;EAEHC,MAAAA,MAAM,EAAE,wCAFL;EAGHrX,MAAAA,GAAG,EAAE;EAHF,KAFL;EAOFsF,IAAAA,OAAO,EAAE;EACL8R,MAAAA,GAAG,EAAE,oCADA;EAELpX,MAAAA,GAAG,EACC;EAHC,KAPP;EAYFsX,IAAAA,SAAS,EAAE;EACPF,MAAAA,GAAG,EAAE;EADE;EAZT,GAvLO;EAwMb;EACA5J,EAAAA,SAAS,EAAE;EACP7D,IAAAA,IAAI,EAAE,IADC;EAEPxH,IAAAA,IAAI,EAAE,IAFC;EAGP8G,IAAAA,KAAK,EAAE,IAHA;EAIPC,IAAAA,OAAO,EAAE,IAJF;EAKPC,IAAAA,MAAM,EAAE,IALD;EAMPC,IAAAA,WAAW,EAAE,IANN;EAOPC,IAAAA,IAAI,EAAE,IAPC;EAQPO,IAAAA,MAAM,EAAE,IARD;EASPL,IAAAA,QAAQ,EAAE,IATH;EAUP2I,IAAAA,QAAQ,EAAE,IAVH;EAWP1I,IAAAA,UAAU,EAAE,IAXL;EAYPrJ,IAAAA,GAAG,EAAE,IAZE;EAaPI,IAAAA,OAAO,EAAE,IAbF;EAcPoN,IAAAA,KAAK,EAAE,IAdA;EAePtL,IAAAA,OAAO,EAAE,IAfF;EAgBP0T,IAAAA,IAAI,EAAE,IAhBC;EAiBPpF,IAAAA,QAAQ,EAAE;EAjBH,GAzME;EA6Nb;EACA5Z,EAAAA,MAAM,EAAE;EAEJ;EACA,SAHI,EAIJ,UAJI,EAKJ,SALI,EAMJ,SANI,EAOJ,SAPI,EAQJ,SARI,EASJ,gBATI,EAUJ,WAVI,EAWJ,YAXI,EAYJ,gBAZI,EAaJ,YAbI,EAcJ,cAdI,EAeJ,MAfI,EAgBJ,OAhBI,EAiBJ,OAjBI,EAkBJ,SAlBI,EAmBJ,QAnBI,EAoBJ,SApBI,EAqBJ,YArBI,EAsBJ,WAtBI;EAyBJ,YAzBI,EA0BJ,iBA1BI,EA2BJ,gBA3BI,EA4BJ,iBA5BI,EA6BJ,kBA7BI,EA8BJ,gBA9BI,EA+BJ,gBA/BI,EAgCJ,eAhCI,EAiCJ,OAjCI;EAoCJ,eApCI;EAuCJ,iBAvCI;EA0CJ,aA1CI,EA2CJ,iBA3CI,EA4CJ,kBA5CI,EA6CJ,WA7CI,EA8CJ,aA9CI,EA+CJ,aA/CI,EAgDJ,gBAhDI,EAiDJ,eAjDI,EAkDJ,UAlDI,CA9NK;EAmRb;EACA;EACAgS,EAAAA,SAAS,EAAE;EACPwO,IAAAA,QAAQ,EAAE,4CADH;EAEP7e,IAAAA,SAAS,EAAE,OAFJ;EAGP6P,IAAAA,QAAQ,EAAE;EACN7P,MAAAA,SAAS,EAAE,IADL;EAENG,MAAAA,OAAO,EAAE;EAFH,KAHH;EAOPka,IAAAA,MAAM,EAAE,aAPD;EAQP/J,IAAAA,OAAO,EAAE;EACL7G,MAAAA,IAAI,EAAE,oBADD;EAEL8G,MAAAA,KAAK,EAAE,qBAFF;EAGLC,MAAAA,OAAO,EAAE,uBAHJ;EAILC,MAAAA,MAAM,EAAE,sBAJH;EAKLC,MAAAA,WAAW,EAAE,4BALR;EAMLC,MAAAA,IAAI,EAAE,oBAND;EAOLE,MAAAA,QAAQ,EAAE,wBAPL;EAQL2I,MAAAA,QAAQ,EAAE,wBARL;EASL1I,MAAAA,UAAU,EAAE,0BATP;EAULrJ,MAAAA,GAAG,EAAE,mBAVA;EAWLI,MAAAA,OAAO,EAAE,uBAXJ;EAYL+I,MAAAA,QAAQ,EAAE,wBAZL;EAaLyM,MAAAA,IAAI,EAAE;EAbD,KARF;EAuBPrM,IAAAA,MAAM,EAAE;EACJC,MAAAA,IAAI,EAAE,oBADF;EAEJC,MAAAA,MAAM,EAAE,sBAFJ;EAGJ+D,MAAAA,KAAK,EAAE,qBAHH;EAIJgD,MAAAA,QAAQ,EAAE,wBAJN;EAKJtO,MAAAA,OAAO,EAAE;EALL,KAvBD;EA8BPwH,IAAAA,OAAO,EAAE;EACL/H,MAAAA,WAAW,EAAE,sBADR;EAELiI,MAAAA,QAAQ,EAAE,uBAFL;EAGLD,MAAAA,MAAM,EAAE,yBAHH;EAILiM,MAAAA,IAAI,EAAE,uBAJD;EAI0B;EAC/BnM,MAAAA,MAAM,EAAE;EALH,KA9BF;EAqCPH,IAAAA,QAAQ,EAAE,iBArCH;EAsCPF,IAAAA,QAAQ,EAAE,iBAtCH;EAuCP8L,IAAAA,OAAO,EAAE,gBAvCF;EAwCPlK,IAAAA,IAAI,EAAE;EACF9I,MAAAA,OAAO,EAAE;EADP;EAxCC,GArRE;EAkUb;EACAnE,EAAAA,UAAU,EAAE;EACRhH,IAAAA,IAAI,EAAE,WADE;EAER2I,IAAAA,QAAQ,EAAE,WAFF;EAGRF,IAAAA,KAAK,EAAE,qBAHC;EAIR8U,IAAAA,KAAK,EAAE,mBAJC;EAKR+C,IAAAA,cAAc,EAAE,8BALR;EAMRC,IAAAA,MAAM,EAAE,cANA;EAORC,IAAAA,aAAa,EAAE,sBAPP;EAQRC,IAAAA,GAAG,EAAE,WARG;EASRjM,IAAAA,OAAO,EAAE,eATD;EAURoH,IAAAA,cAAc,EAAE,wBAVR;EAWR8E,IAAAA,OAAO,EAAE,eAXD;EAYR7V,IAAAA,MAAM,EAAE,cAZA;EAaR8V,IAAAA,OAAO,EAAE,eAbD;EAcRC,IAAAA,OAAO,EAAE,eAdD;EAeRC,IAAAA,KAAK,EAAE,aAfC;EAgBR9N,IAAAA,OAAO,EAAE,eAhBD;EAiBR+K,IAAAA,IAAI,EAAE,YAjBE;EAkBR/Y,IAAAA,MAAM,EAAE,eAlBA;EAmBR2Z,IAAAA,YAAY,EAAE,qBAnBN;EAoBRrW,IAAAA,KAAK,EAAE,cApBC;EAqBRyY,IAAAA,OAAO,EAAE,gBArBD;EAsBRC,IAAAA,WAAW,EAAE,eAtBL;EAuBRC,IAAAA,YAAY,EAAE,qBAvBN;EAwBRrO,IAAAA,OAAO,EAAE;EACL5B,MAAAA,IAAI,EAAE;EADD,KAxBD;EA2BRkD,IAAAA,IAAI,EAAE;EACFrR,MAAAA,KAAK,EAAE,mBADL;EAEFoR,MAAAA,KAAK,EAAE,aAFL;EAGFtE,MAAAA,IAAI,EAAE;EAHJ,KA3BE;EAgCR2C,IAAAA,QAAQ,EAAE;EACN5D,MAAAA,OAAO,EAAE,wBADH;EAENoO,MAAAA,MAAM,EAAE;EAFF,KAhCF;EAoCRvK,IAAAA,UAAU,EAAE;EACR7D,MAAAA,OAAO,EAAE,0BADD;EAERwQ,MAAAA,QAAQ,EAAE;EAFF,KApCJ;EAwCRhW,IAAAA,GAAG,EAAE;EACDhK,MAAAA,SAAS,EAAE,qBADV;EAED4d,MAAAA,MAAM,EAAE;EAFP,KAxCG;EA4CRxT,IAAAA,OAAO,EAAE;EACLpK,MAAAA,SAAS,EAAE,yBADN;EAEL4d,MAAAA,MAAM,EAAE;EAFH,KA5CD;EAgDRhW,IAAAA,QAAQ,EAAE;EAhDF,GAnUC;EAsXb;EACApE,EAAAA,UAAU,EAAE;EACR8a,IAAAA,KAAK,EAAE;EACH5U,MAAAA,QAAQ,EAAE,oBADP;EAEH9D,MAAAA,EAAE,EAAE;EAFD;EADC,GAvXC;EA8Xb;EACApH,EAAAA,IAAI,EAAE;EACFwjB,IAAAA,MAAM,EAAE;EADN,GA/XO;EAmYb;EACA;EACAR,EAAAA,GAAG,EAAE;EACDhS,IAAAA,OAAO,EAAE,KADR;EAEDyS,IAAAA,WAAW,EAAE;EAFZ;EArYQ,CAAjB;;ECJA;EACA;EACA;AAEA,EAAO,IAAMjY,GAAG,GAAG;EACf4T,EAAAA,MAAM,EAAE,oBADO;EAEfsE,EAAAA,QAAQ,EAAE;EAFK,CAAZ;;ECJP;EACA;EACA;AAEA,EAAO,IAAMC,SAAS,GAAG;EACrBjX,EAAAA,KAAK,EAAE,OADc;EAErBiE,EAAAA,OAAO,EAAE,SAFY;EAGrBD,EAAAA,KAAK,EAAE;EAHc,CAAlB;AAMP,EAAO,IAAMkT,KAAK,GAAG;EACjB7Y,EAAAA,KAAK,EAAE,OADU;EAEjBC,EAAAA,KAAK,EAAE;EAFU,CAAd;EAKP;;;;;AAIA,EAAO,SAAS6Y,gBAAT,CAA0BxiB,GAA1B,EAA+B;EAClC;EACA,MAAI,wDAAwDkJ,IAAxD,CAA6DlJ,GAA7D,CAAJ,EAAuE;EACnE,WAAOsiB,SAAS,CAAChT,OAAjB;EACH,GAJiC;;;EAOlC,MAAI,wDAAwDpG,IAAxD,CAA6DlJ,GAA7D,CAAJ,EAAuE;EACnE,WAAOsiB,SAAS,CAACjT,KAAjB;EACH;;EAED,SAAO,IAAP;EACH;;EC/BD;EACA;EACA;EAEA,IAAMoT,IAAI,GAAG,SAAPA,IAAO,GAAM,EAAnB;;MAEqBC;;;EACjB,qBAA6B;EAAA,QAAjB/S,OAAiB,uEAAP,KAAO;;EAAA;;EACzB,SAAKA,OAAL,GAAexR,MAAM,CAACwkB,OAAP,IAAkBhT,OAAjC;;EAEA,QAAI,KAAKA,OAAT,EAAkB;EACd,WAAKlD,GAAL,CAAS,mBAAT;EACH;EACJ;;;;0BAES;EACN;EACA,aAAO,KAAKkD,OAAL,GAAexS,QAAQ,CAAC4J,SAAT,CAAmB0Q,IAAnB,CAAwBnW,IAAxB,CAA6BqhB,OAAO,CAAClW,GAArC,EAA0CkW,OAA1C,CAAf,GAAoEF,IAA3E;EACH;;;0BAEU;EACP;EACA,aAAO,KAAK9S,OAAL,GAAexS,QAAQ,CAAC4J,SAAT,CAAmB0Q,IAAnB,CAAwBnW,IAAxB,CAA6BqhB,OAAO,CAACxO,IAArC,EAA2CwO,OAA3C,CAAf,GAAqEF,IAA5E;EACH;;;0BAEW;EACR;EACA,aAAO,KAAK9S,OAAL,GAAexS,QAAQ,CAAC4J,SAAT,CAAmB0Q,IAAnB,CAAwBnW,IAAxB,CAA6BqhB,OAAO,CAACzO,KAArC,EAA4CyO,OAA5C,CAAf,GAAsEF,IAA7E;EACH;;;;;;EChBL,SAASG,QAAT,GAAoB;EAChB,MAAI,CAAC,KAAKjT,OAAV,EAAmB;EACf;EACH,GAHe;;;EAMhB,MAAMgG,MAAM,GAAG,KAAK/J,MAAL,CAAYnJ,QAAZ,CAAqBuQ,OAArB,CAA6BQ,UAA5C;;EACA,MAAI1S,EAAE,CAACpB,OAAH,CAAWiW,MAAX,CAAJ,EAAwB;EACpBA,IAAAA,MAAM,CAACuC,OAAP,GAAiB,KAAK6F,MAAtB;EACH,GATe;;;EAYhBnc,EAAAA,YAAY,CAACN,IAAb,CAAkB,KAAKsK,MAAvB,EAA+B,KAAKtH,MAApC,EAA4C,KAAKyZ,MAAL,GAAc,iBAAd,GAAkC,gBAA9E,EAAgG,IAAhG,EAZgB;;EAehB,MAAI,CAAClV,OAAO,CAACU,KAAb,EAAoB;EAChBpC,IAAAA,SAAS,CAAC7F,IAAV,CAAe,KAAKsK,MAApB,EAA4B,KAAKtH,MAAjC,EAAyC,KAAKyZ,MAA9C;EACH;EACJ;;EAED,SAAS8E,cAAT,GAAwC;EAAA;;EAAA,MAAhBliB,MAAgB,uEAAP,KAAO;;EACpC;EACA,MAAIA,MAAJ,EAAY;EACR,SAAKmiB,cAAL,GAAsB;EAClBC,MAAAA,CAAC,EAAE5kB,MAAM,CAAC6kB,OAAP,IAAkB,CADH;EAElBC,MAAAA,CAAC,EAAE9kB,MAAM,CAAC+kB,OAAP,IAAkB;EAFH,KAAtB;EAIH,GALD,MAKO;EACH/kB,IAAAA,MAAM,CAACglB,QAAP,CAAgB,KAAKL,cAAL,CAAoBC,CAApC,EAAuC,KAAKD,cAAL,CAAoBG,CAA3D;EACH,GATmC;;;EAYpC9e,EAAAA,QAAQ,CAACkN,IAAT,CAAc5I,KAAd,CAAoB2a,QAApB,GAA+BziB,MAAM,GAAG,QAAH,GAAc,EAAnD,CAZoC;;EAepCyF,EAAAA,WAAW,CAAC,KAAK9B,MAAN,EAAc,KAAKsH,MAAL,CAAY3D,MAAZ,CAAmBC,UAAnB,CAA8BsL,UAA9B,CAAyC2M,QAAvD,EAAiExf,MAAjE,CAAX,CAfoC;;EAkBpC,MAAIkI,OAAO,CAACU,KAAZ,EAAmB;EACf,QAAI8Z,QAAQ,GAAGlf,QAAQ,CAACmf,IAAT,CAAcpc,aAAd,CAA4B,uBAA5B,CAAf;EACA,QAAMqc,QAAQ,GAAG,oBAAjB,CAFe;;EAKf,QAAI,CAACF,QAAL,EAAe;EACXA,MAAAA,QAAQ,GAAGlf,QAAQ,CAACF,aAAT,CAAuB,MAAvB,CAAX;EACAof,MAAAA,QAAQ,CAACrf,YAAT,CAAsB,MAAtB,EAA8B,UAA9B;EACH,KARc;;;EAWf,QAAMwf,WAAW,GAAG1iB,EAAE,CAAChC,MAAH,CAAUukB,QAAQ,CAAC5R,OAAnB,KAA+B4R,QAAQ,CAAC5R,OAAT,CAAiB3K,QAAjB,CAA0Byc,QAA1B,CAAnD;;EAEA,QAAI5iB,MAAJ,EAAY;EACR,WAAK8iB,eAAL,GAAuB,CAACD,WAAxB;;EAEA,UAAI,CAACA,WAAL,EAAkB;EACdH,QAAAA,QAAQ,CAAC5R,OAAT,eAAwB8R,QAAxB;EACH;EACJ,KAND,MAMO,IAAI,KAAKE,eAAT,EAA0B;EAC7BJ,MAAAA,QAAQ,CAAC5R,OAAT,GAAmB4R,QAAQ,CAAC5R,OAAT,CACdzQ,KADc,CACR,GADQ,EAEd6C,MAFc,CAEP,UAAA6f,IAAI;EAAA,eAAIA,IAAI,CAACne,IAAL,OAAgBge,QAApB;EAAA,OAFG,EAGdvO,IAHc,CAGT,GAHS,CAAnB;EAIH,KAxBc;;;EA2BfxS,IAAAA,UAAU,CAAC;EAAA,aAAMmG,OAAO,CAAC,KAAI,CAACrE,MAAN,CAAb;EAAA,KAAD,EAA6B,GAA7B,CAAV;EACH,GA9CmC;;;EAiDpCse,EAAAA,QAAQ,CAACthB,IAAT,CAAc,IAAd;EACH;;MAEKqiB;;;EACF,sBAAY/X,MAAZ,EAAoB;EAAA;;EAAA;;EAChB;EACA,SAAKA,MAAL,GAAcA,MAAd,CAFgB;;EAKhB,SAAK+B,MAAL,GAAcgW,UAAU,CAAChW,MAAzB;EACA,SAAK4V,QAAL,GAAgBI,UAAU,CAACJ,QAA3B,CANgB;;EAShB,SAAKT,cAAL,GAAsB;EAAEC,MAAAA,CAAC,EAAE,CAAL;EAAQE,MAAAA,CAAC,EAAE;EAAX,KAAtB,CATgB;EAYhB;;EACA5hB,IAAAA,EAAE,CAACC,IAAH,CACI,KAAKsK,MADT,EAEIzH,QAFJ,EAGI,KAAKwJ,MAAL,KAAgB,IAAhB,GAAuB,oBAAvB,aAAiD,KAAKA,MAAtD,qBAHJ,EAII,YAAM;EACF;EACAiV,MAAAA,QAAQ,CAACthB,IAAT,CAAc,MAAd;EACH,KAPL,EAbgB;;EAwBhBD,IAAAA,EAAE,CAACC,IAAH,CAAQ,KAAKsK,MAAb,EAAqB,KAAKA,MAAL,CAAYnJ,QAAZ,CAAqBC,SAA1C,EAAqD,UAArD,EAAiE,UAAA9C,KAAK,EAAI;EACtE;EACA,UAAIkB,EAAE,CAACpB,OAAH,CAAW,MAAI,CAACkM,MAAL,CAAYnJ,QAAZ,CAAqB8P,QAAhC,KAA6C,MAAI,CAAC3G,MAAL,CAAYnJ,QAAZ,CAAqB8P,QAArB,CAA8B9L,QAA9B,CAAuC7G,KAAK,CAAC0E,MAA7C,CAAjD,EAAuG;EACnG;EACH;;EAED,MAAA,MAAI,CAAC3D,MAAL;EACH,KAPD,EAxBgB;;EAkChB,SAAKwQ,MAAL;EACH;;;;;EAwED;+BACS;EACL,UAAI,KAAKxB,OAAT,EAAkB;EACd,aAAK/D,MAAL,CAAYY,KAAZ,CAAkBC,GAAlB,WAAyBkX,UAAU,CAACC,MAAX,GAAoB,QAApB,GAA+B,UAAxD;EACH,OAFD,MAEO;EACH,aAAKhY,MAAL,CAAYY,KAAZ,CAAkBC,GAAlB,CAAsB,gDAAtB;EACH,OALI;;;EAQLrG,MAAAA,WAAW,CAAC,KAAKwF,MAAL,CAAYnJ,QAAZ,CAAqBC,SAAtB,EAAiC,KAAKkJ,MAAL,CAAY3D,MAAZ,CAAmBC,UAAnB,CAA8BsL,UAA9B,CAAyC7D,OAA1E,EAAmF,KAAKA,OAAxF,CAAX;EACH;;;;8BAGO;EACJ,UAAI,CAAC,KAAKA,OAAV,EAAmB;EACf;EACH,OAHG;;;EAMJ,UAAI9G,OAAO,CAACU,KAAR,IAAiB,KAAKqC,MAAL,CAAY3D,MAAZ,CAAmBuL,UAAnB,CAA8B4M,SAAnD,EAA8D;EAC1D,aAAK9b,MAAL,CAAYuf,qBAAZ;EACH,OAFD,MAEO,IAAI,CAACF,UAAU,CAACC,MAAhB,EAAwB;EAC3Bf,QAAAA,cAAc,CAACvhB,IAAf,CAAoB,IAApB,EAA0B,IAA1B;EACH,OAFM,MAEA,IAAI,CAAC,KAAKqM,MAAV,EAAkB;EACrB,aAAKrJ,MAAL,CAAYwf,iBAAZ;EACH,OAFM,MAEA,IAAI,CAAChjB,EAAE,CAACb,KAAH,CAAS,KAAK0N,MAAd,CAAL,EAA4B;EAC/B,aAAKrJ,MAAL,WAAe,KAAKqJ,MAApB,oBAAoC,KAAK4V,QAAzC;EACH;EACJ;;;;6BAGM;EACH,UAAI,CAAC,KAAK5T,OAAV,EAAmB;EACf;EACH,OAHE;;;EAMH,UAAI9G,OAAO,CAACU,KAAR,IAAiB,KAAKqC,MAAL,CAAY3D,MAAZ,CAAmBuL,UAAnB,CAA8B4M,SAAnD,EAA8D;EAC1D,aAAK9b,MAAL,CAAYyf,oBAAZ;EACA,aAAKnY,MAAL,CAAYO,IAAZ;EACH,OAHD,MAGO,IAAI,CAACwX,UAAU,CAACC,MAAhB,EAAwB;EAC3Bf,QAAAA,cAAc,CAACvhB,IAAf,CAAoB,IAApB,EAA0B,KAA1B;EACH,OAFM,MAEA,IAAI,CAAC,KAAKqM,MAAV,EAAkB;EACrB,SAACxJ,QAAQ,CAAC6f,gBAAT,IAA6B7f,QAAQ,CAACuc,cAAvC,EAAuDpf,IAAvD,CAA4D6C,QAA5D;EACH,OAFM,MAEA,IAAI,CAACrD,EAAE,CAACb,KAAH,CAAS,KAAK0N,MAAd,CAAL,EAA4B;EAC/B,YAAMsW,MAAM,GAAG,KAAKtW,MAAL,KAAgB,KAAhB,GAAwB,QAAxB,GAAmC,MAAlD;EACAxJ,QAAAA,QAAQ,WAAI,KAAKwJ,MAAT,SAAkBsW,MAAlB,SAA2B,KAAKV,QAAhC,EAAR;EACH;EACJ;;;;+BAGQ;EACL,UAAI,CAAC,KAAKxF,MAAV,EAAkB;EACd,aAAKmG,KAAL;EACH,OAFD,MAEO;EACH,aAAKC,IAAL;EACH;EACJ;;;EA1FD;0BACc;EACV,aACI,CAACR,UAAU,CAACC,MAAX,IAAqB,KAAKhY,MAAL,CAAY3D,MAAZ,CAAmBuL,UAAnB,CAA8B2M,QAApD,KACA,KAAKvU,MAAL,CAAY3D,MAAZ,CAAmBuL,UAAnB,CAA8B7D,OAD9B,IAEA,KAAK/D,MAAL,CAAYzL,SAAZ,CAAsB8J,EAFtB,IAGA,KAAK2B,MAAL,CAAY2R,OAJhB;EAMH;;;;0BAGY;EACT,UAAI,CAAC,KAAK5N,OAAV,EAAmB;EACf,eAAO,KAAP;EACH,OAHQ;;;EAMT,UAAI,CAACgU,UAAU,CAACC,MAAhB,EAAwB;EACpB,eAAOld,QAAQ,CAAC,KAAKpC,MAAN,EAAc,KAAKsH,MAAL,CAAY3D,MAAZ,CAAmBC,UAAnB,CAA8BsL,UAA9B,CAAyC2M,QAAvD,CAAf;EACH;;EAED,UAAMzgB,OAAO,GAAG,CAAC,KAAKiO,MAAN,GAAexJ,QAAQ,CAACigB,iBAAxB,GAA4CjgB,QAAQ,WAAI,KAAKwJ,MAAT,SAAkB,KAAK4V,QAAvB,aAApE;EAEA,aAAO7jB,OAAO,KAAK,KAAK4E,MAAxB;EACH;;;;0BAGY;EACT,aAAOuE,OAAO,CAACU,KAAR,IAAiB,KAAKqC,MAAL,CAAY3D,MAAZ,CAAmBuL,UAAnB,CAA8B4M,SAA/C,GACD,KAAKxU,MAAL,CAAYf,KADX,GAED,KAAKe,MAAL,CAAYnJ,QAAZ,CAAqBC,SAF3B;EAGH;;;0BAnEmB;EAChB,aAAO,CAAC,EACJyB,QAAQ,CAACkgB,iBAAT,IACAlgB,QAAQ,CAACmgB,uBADT,IAEAngB,QAAQ,CAACogB,oBAFT,IAGApgB,QAAQ,CAACqgB,mBAJL,CAAR;EAMH;;;;0BAGmB;EAChB;EACA,UAAI1jB,EAAE,CAACxB,QAAH,CAAY6E,QAAQ,CAACuc,cAArB,CAAJ,EAA0C;EACtC,eAAO,EAAP;EACH,OAJe;;;EAOhB,UAAI5c,KAAK,GAAG,EAAZ;EACA,UAAM2gB,QAAQ,GAAG,CAAC,QAAD,EAAW,KAAX,EAAkB,IAAlB,CAAjB;EAEAA,MAAAA,QAAQ,CAACzJ,IAAT,CAAc,UAAA0J,GAAG,EAAI;EACjB,YAAI5jB,EAAE,CAACxB,QAAH,CAAY6E,QAAQ,WAAIugB,GAAJ,oBAApB,KAAiD5jB,EAAE,CAACxB,QAAH,CAAY6E,QAAQ,WAAIugB,GAAJ,sBAApB,CAArD,EAAsG;EAClG5gB,UAAAA,KAAK,GAAG4gB,GAAR;EACA,iBAAO,IAAP;EACH;;EAED,eAAO,KAAP;EACH,OAPD;EASA,aAAO5gB,KAAP;EACH;;;0BAEqB;EAClB,aAAO,KAAK6J,MAAL,KAAgB,KAAhB,GAAwB,YAAxB,GAAuC,YAA9C;EACH;;;;;;EC7JL;EACA;EACA;EACA;EACA;AAEA,EAAe,SAASgX,SAAT,CAAmBzY,GAAnB,EAAsC;EAAA,MAAd0Y,QAAc,uEAAH,CAAG;EACjD,SAAO,IAAItiB,OAAJ,CAAY,UAACC,OAAD,EAAU8N,MAAV,EAAqB;EACpC,QAAMwU,KAAK,GAAG,IAAIC,KAAJ,EAAd;;EAEA,QAAMC,OAAO,GAAG,SAAVA,OAAU,GAAM;EAClB,aAAOF,KAAK,CAACG,MAAb;EACA,aAAOH,KAAK,CAACI,OAAb;EACA,OAACJ,KAAK,CAACK,YAAN,IAAsBN,QAAtB,GAAiCriB,OAAjC,GAA2C8N,MAA5C,EAAoDwU,KAApD;EACH,KAJD;;EAMAloB,IAAAA,MAAM,CAACqF,MAAP,CAAc6iB,KAAd,EAAqB;EAAEG,MAAAA,MAAM,EAAED,OAAV;EAAmBE,MAAAA,OAAO,EAAEF,OAA5B;EAAqC7Y,MAAAA,GAAG,EAAHA;EAArC,KAArB;EACH,GAVM,CAAP;EAWH;;EClBD;AACA,EAaA,IAAMjC,EAAE,GAAG;EACPkb,EAAAA,YADO,0BACQ;EACX/e,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAY8K,SAAZ,CAAsBrQ,SAAtB,CAAgC+C,OAAhC,CAAwC,GAAxC,EAA6C,EAA7C,CAA1B,EAA4E,IAA5E,CAAX;EACAW,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB+Z,WAAjD,EAA8D,KAAK9hB,SAAL,CAAe8J,EAA7E,CAAX;EACH,GAJM;EAMP;EACAmK,EAAAA,oBAPO,kCAO8B;EAAA,QAAhBzT,MAAgB,uEAAP,KAAO;;EACjC,QAAIA,MAAM,IAAI,KAAKiK,OAAnB,EAA4B;EACxB,WAAKC,KAAL,CAAW7G,YAAX,CAAwB,UAAxB,EAAoC,EAApC;EACH,KAFD,MAEO;EACH,WAAK6G,KAAL,CAAW1E,eAAX,CAA2B,UAA3B;EACH;EACJ,GAbM;EAeP;EACAif,EAAAA,KAhBO,mBAgBC;EAAA;;EACJ;EACA;EACA,SAAK5N,SAAL,CAAe3M,KAAf,GAHI;;EAMJ,QAAI,CAAC,KAAK1K,SAAL,CAAe8J,EAApB,EAAwB;EACpB,WAAKuC,KAAL,CAAW2H,IAAX,kCAA0C,KAAKtK,QAA/C,cAA2D,KAAK3I,IAAhE,GADoB;;EAIpB+I,MAAAA,EAAE,CAACmK,oBAAH,CAAwB9S,IAAxB,CAA6B,IAA7B,EAAmC,IAAnC,EAJoB;;EAOpB;EACH,KAdG;;;EAiBJ,QAAI,CAACR,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAc8P,QAAzB,CAAL,EAAyC;EACrC;EACAA,MAAAA,QAAQ,CAACmK,MAAT,CAAgBpb,IAAhB,CAAqB,IAArB,EAFqC;;EAKrC,WAAKkW,SAAL,CAAejF,QAAf;EACH,KAvBG;;;EA0BJtI,IAAAA,EAAE,CAACmK,oBAAH,CAAwB9S,IAAxB,CAA6B,IAA7B,EA1BI;;EA6BJ,QAAI,KAAKsJ,OAAT,EAAkB;EACd2I,MAAAA,QAAQ,CAAC+J,KAAT,CAAehc,IAAf,CAAoB,IAApB;EACH,KA/BG;;;EAkCJ,SAAKsS,MAAL,GAAc,IAAd,CAlCI;;EAqCJ,SAAKqE,KAAL,GAAa,IAAb,CArCI;;EAwCJ,SAAKN,KAAL,GAAa,IAAb,CAxCI;;EA2CJ,SAAKoI,IAAL,GAAY,IAAZ,CA3CI;;EA8CJ,SAAK1T,OAAL,GAAe,IAAf,CA9CI;;EAiDJkG,IAAAA,QAAQ,CAACwF,YAAT,CAAsBzW,IAAtB,CAA2B,IAA3B,EAjDI;;EAoDJiR,IAAAA,QAAQ,CAAC2G,UAAT,CAAoB5X,IAApB,CAAyB,IAAzB,EApDI;;EAuDJ2I,IAAAA,EAAE,CAACob,YAAH,CAAgB/jB,IAAhB,CAAqB,IAArB,EAvDI;;EA0DJ8E,IAAAA,WAAW,CACP,KAAK3D,QAAL,CAAcC,SADP,EAEP,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBiC,GAAvB,CAA2BhK,SAFpB,EAGPsJ,OAAO,CAACU,GAAR,IAAe,KAAKS,OAApB,IAA+B,KAAK2S,OAH7B,CAAX,CA1DI;;EAiEJnX,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBqC,OAAvB,CAA+BpK,SAAzD,EAAoEsJ,OAAO,CAACc,OAAR,IAAmB,KAAKK,OAA5F,CAAX,CAjEI;;EAoEJxE,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBqB,KAAjD,EAAwDV,OAAO,CAACU,KAAhE,CAAX,CApEI;;EAuEJnD,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB8Z,OAAjD,EAA0D,KAAK/W,KAA/D,CAAX,CAvEI;;EA0EJ,SAAK5I,KAAL,GAAa,IAAb,CA1EI;;EA6EJG,IAAAA,UAAU,CAAC,YAAM;EACbZ,MAAAA,YAAY,CAACN,IAAb,CAAkB,KAAlB,EAAwB,KAAI,CAACuJ,KAA7B,EAAoC,OAApC;EACH,KAFS,EAEP,CAFO,CAAV,CA7EI;;EAkFJZ,IAAAA,EAAE,CAACqb,QAAH,CAAYhkB,IAAZ,CAAiB,IAAjB,EAlFI;;EAqFJ,QAAI,KAAKmgB,MAAT,EAAiB;EACbxX,MAAAA,EAAE,CAACsb,SAAH,CAAajkB,IAAb,CAAkB,IAAlB,EAAwB,KAAKmgB,MAA7B,EAAqC,KAArC,EAA4C9P,KAA5C,CAAkD,YAAM,EAAxD;EACH,KAvFG;EA0FJ;;;EACA,QAAI,KAAK1J,MAAL,CAAY8L,QAAhB,EAA0B;EACtBxB,MAAAA,QAAQ,CAAC+G,cAAT,CAAwBhY,IAAxB,CAA6B,IAA7B;EACH;EACJ,GA9GM;EAgHP;EACAgkB,EAAAA,QAjHO,sBAiHI;EACP;EACA,QAAI/P,KAAK,GAAGhG,IAAI,CAACjP,GAAL,CAAS,MAAT,EAAiB,KAAK2H,MAAtB,CAAZ,CAFO;;EAKP,QAAInH,EAAE,CAAChC,MAAH,CAAU,KAAKmJ,MAAL,CAAYwH,KAAtB,KAAgC,CAAC3O,EAAE,CAACb,KAAH,CAAS,KAAKgI,MAAL,CAAYwH,KAArB,CAArC,EAAkE;EAC9D8F,MAAAA,KAAK,gBAAS,KAAKtN,MAAL,CAAYwH,KAArB,CAAL;EACH,KAPM;;;EAUPpS,IAAAA,KAAK,CAAC0F,IAAN,CAAW,KAAKN,QAAL,CAAcuQ,OAAd,CAAsB7G,IAAtB,IAA8B,EAAzC,EAA6ClL,OAA7C,CAAqD,UAAA0U,MAAM,EAAI;EAC3DA,MAAAA,MAAM,CAAC3R,YAAP,CAAoB,YAApB,EAAkCuR,KAAlC;EACH,KAFD,EAVO;EAeP;;EACA,QAAI,KAAKkH,OAAT,EAAkB;EACd,UAAM4E,MAAM,GAAGpa,UAAU,CAAC3F,IAAX,CAAgB,IAAhB,EAAsB,QAAtB,CAAf;;EAEA,UAAI,CAACR,EAAE,CAACpB,OAAH,CAAW2hB,MAAX,CAAL,EAAyB;EACrB;EACH,OALa;;;EAQd,UAAM5R,KAAK,GAAG,CAAC3O,EAAE,CAACb,KAAH,CAAS,KAAKgI,MAAL,CAAYwH,KAArB,CAAD,GAA+B,KAAKxH,MAAL,CAAYwH,KAA3C,GAAmD,OAAjE;EACA,UAAM3B,MAAM,GAAGyB,IAAI,CAACjP,GAAL,CAAS,YAAT,EAAuB,KAAK2H,MAA5B,CAAf;EAEAoZ,MAAAA,MAAM,CAACrd,YAAP,CAAoB,OAApB,EAA6B8J,MAAM,CAACrI,OAAP,CAAe,SAAf,EAA0BgK,KAA1B,CAA7B;EACH;EACJ,GA9IM;EAgJP;EACA+V,EAAAA,YAjJO,wBAiJMC,MAjJN,EAiJc;EACjBrf,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBwZ,aAAjD,EAAgE+D,MAAhE,CAAX;EACH,GAnJM;EAqJP;EACA;EACAF,EAAAA,SAvJO,qBAuJG9D,MAvJH,EAuJ2B;EAAA;;EAAA,QAAhB7gB,OAAgB,uEAAN,IAAM;;EAC9B;EACA,QAAIA,OAAO,IAAI,KAAK6gB,MAApB,EAA4B;EACxB,aAAOnf,OAAO,CAAC+N,MAAR,CAAe,IAAIK,KAAJ,CAAU,oBAAV,CAAf,CAAP;EACH,KAJ6B;;;EAO9B,SAAK7F,KAAL,CAAW7G,YAAX,CAAwB,QAAxB,EAAkCyd,MAAlC,EAP8B;;EAU9B,WACIpf,KAAK,CACAf,IADL,CACU,IADV;EAAA,KAGKqB,IAHL,CAGU;EAAA,aAAMgiB,SAAS,CAAClD,MAAD,CAAf;EAAA,KAHV,EAIK9P,KAJL,CAIW,UAAA+T,GAAG,EAAI;EACV;EACA,UAAIjE,MAAM,KAAK,MAAI,CAACA,MAApB,EAA4B;EACxBxX,QAAAA,EAAE,CAACub,YAAH,CAAgBlkB,IAAhB,CAAqB,MAArB,EAA2B,KAA3B;EACH,OAJS;;;EAMV,YAAMokB,GAAN;EACH,KAXL,EAYK/iB,IAZL,CAYU,YAAM;EACR;EACA,UAAI8e,MAAM,KAAK,MAAI,CAACA,MAApB,EAA4B;EACxB,cAAM,IAAI/Q,KAAJ,CAAU,gDAAV,CAAN;EACH;EACJ,KAjBL,EAkBK/N,IAlBL,CAkBU,YAAM;EACRhG,MAAAA,MAAM,CAACqF,MAAP,CAAc,MAAI,CAACS,QAAL,CAAcgf,MAAd,CAAqBhZ,KAAnC,EAA0C;EACtCkd,QAAAA,eAAe,iBAAUlE,MAAV,OADuB;EAEtC;EACAmE,QAAAA,cAAc,EAAE;EAHsB,OAA1C;EAKA3b,MAAAA,EAAE,CAACub,YAAH,CAAgBlkB,IAAhB,CAAqB,MAArB,EAA2B,IAA3B;EACA,aAAOmgB,MAAP;EACH,KA1BL,CADJ;EA6BH,GA9LM;EAgMP;EACA4D,EAAAA,YAjMO,wBAiMMzlB,KAjMN,EAiMa;EAAA;;EAChB;EACAwG,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB0Z,OAAjD,EAA0D,KAAKA,OAA/D,CAAX;EACAxb,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB6D,MAAjD,EAAyD,KAAKA,MAA9D,CAAX;EACA3F,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB2Z,OAAjD,EAA0D,KAAKA,OAA/D,CAAX,CAJgB;;EAOhBxkB,IAAAA,KAAK,CAAC0F,IAAN,CAAW,KAAKN,QAAL,CAAcuQ,OAAd,CAAsB7G,IAAtB,IAA8B,EAAzC,EAA6ClL,OAA7C,CAAqD,UAAAqD,MAAM,EAAI;EAC3DA,MAAAA,MAAM,CAAC4T,OAAP,GAAiB,MAAI,CAAC0J,OAAtB;EACH,KAFD,EAPgB;;EAYhB,QAAI9gB,EAAE,CAAClB,KAAH,CAASA,KAAT,KAAmBA,KAAK,CAACsB,IAAN,KAAe,YAAtC,EAAoD;EAChD;EACH,KAde;;;EAiBhB+I,IAAAA,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuB,IAAvB;EACH,GAnNM;EAqNP;EACAwkB,EAAAA,YAtNO,wBAsNMlmB,KAtNN,EAsNa;EAAA;;EAChB,SAAKkiB,OAAL,GAAe,CAAC,SAAD,EAAY,SAAZ,EAAuBhb,QAAvB,CAAgClH,KAAK,CAACsB,IAAtC,CAAf,CADgB;;EAIhB6kB,IAAAA,YAAY,CAAC,KAAKC,MAAL,CAAYlE,OAAb,CAAZ,CAJgB;;EAOhB,SAAKkE,MAAL,CAAYlE,OAAZ,GAAsBtf,UAAU,CAAC,YAAM;EACnC;EACA4D,MAAAA,WAAW,CAAC,MAAI,CAAC3D,QAAL,CAAcC,SAAf,EAA0B,MAAI,CAACuF,MAAL,CAAYC,UAAZ,CAAuB4Z,OAAjD,EAA0D,MAAI,CAACA,OAA/D,CAAX,CAFmC;;EAKnC7X,MAAAA,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuB,MAAvB;EACH,KAN+B,EAM7B,KAAKwgB,OAAL,GAAe,GAAf,GAAqB,CANQ,CAAhC;EAOH,GApOM;EAsOP;EACA+D,EAAAA,cAvOO,0BAuOQxf,KAvOR,EAuOe;EAAA,QACVkM,WADU,GACG,KAAK9P,QADR,CACV8P,QADU;;EAGlB,QAAIA,WAAQ,IAAI,KAAKtK,MAAL,CAAY2X,YAA5B,EAA0C;EACtC;EACA,UAAMqG,eAAe,GAAI,KAAKhb,KAAL,IAAc,KAAKib,YAAL,GAAoB,IAApB,GAA2BC,IAAI,CAACC,GAAL,EAAlE,CAFsC;;EAKtC,WAAKP,cAAL,CAAoBrpB,OAAO,CAAC6J,KAAK,IAAI,KAAKyb,OAAd,IAAyB,KAAK/V,MAA9B,IAAwCwG,WAAQ,CAAC2F,OAAjD,IAA4D3F,WAAQ,CAACwP,KAArE,IAA8EkE,eAA/E,CAA3B;EACH;EACJ;EAjPM,CAAX;;MCFMI;;;EACF,qBAAYza,MAAZ,EAAoB;EAAA;;EAChB,SAAKA,MAAL,GAAcA,MAAd;EACA,SAAK0a,OAAL,GAAe,IAAf;EACA,SAAKC,UAAL,GAAkB,IAAlB;EACA,SAAKC,WAAL,GAAmB,IAAnB;EAEA,SAAKC,SAAL,GAAiB,KAAKA,SAAL,CAAehP,IAAf,CAAoB,IAApB,CAAjB;EACA,SAAK0D,UAAL,GAAkB,KAAKA,UAAL,CAAgB1D,IAAhB,CAAqB,IAArB,CAAlB;EACA,SAAKiP,WAAL,GAAmB,KAAKA,WAAL,CAAiBjP,IAAjB,CAAsB,IAAtB,CAAnB;EACA,SAAKkP,UAAL,GAAkB,KAAKA,UAAL,CAAgBlP,IAAhB,CAAqB,IAArB,CAAlB;EACH;;;;;gCAGS7X,OAAO;EAAA,UACLgM,MADK,GACM,IADN,CACLA,MADK;EAAA,UAELnJ,QAFK,GAEQmJ,MAFR,CAELnJ,QAFK;EAGb,UAAMmkB,IAAI,GAAGhnB,KAAK,CAAC4H,OAAN,GAAgB5H,KAAK,CAAC4H,OAAtB,GAAgC5H,KAAK,CAAC4W,KAAnD;EACA,UAAM0B,OAAO,GAAGtY,KAAK,CAACsB,IAAN,KAAe,SAA/B;EACA,UAAM2lB,MAAM,GAAG3O,OAAO,IAAI0O,IAAI,KAAK,KAAKN,OAAxC,CALa;;EAQb,UAAI1mB,KAAK,CAACknB,MAAN,IAAgBlnB,KAAK,CAACmnB,OAAtB,IAAiCnnB,KAAK,CAAConB,OAAvC,IAAkDpnB,KAAK,CAAC+H,QAA5D,EAAsE;EAClE;EACH,OAVY;EAab;;;EACA,UAAI,CAAC7G,EAAE,CAAC1B,MAAH,CAAUwnB,IAAV,CAAL,EAAsB;EAClB;EACH,OAhBY;;;EAmBb,UAAMK,SAAS,GAAG,SAAZA,SAAY,GAAM;EACpB;EACArb,QAAAA,MAAM,CAACE,WAAP,GAAsBF,MAAM,CAACmI,QAAP,GAAkB,EAAnB,IAA0B6S,IAAI,GAAG,EAAjC,CAArB;EACH,OAHD,CAnBa;EAyBb;;;EACA,UAAI1O,OAAJ,EAAa;EACT;EACA;EACA;EACA,YAAMzQ,OAAO,GAAGtD,QAAQ,CAACuD,aAAzB;;EACA,YAAI5G,EAAE,CAACpB,OAAH,CAAW+H,OAAX,CAAJ,EAAyB;EAAA,cACb8Z,QADa,GACA3V,MAAM,CAAC3D,MAAP,CAAc8K,SADd,CACbwO,QADa;EAAA,cAEb5N,IAFa,GAEJlR,QAAQ,CAACiR,MAFL,CAEbC,IAFa;;EAIrB,cAAIlM,OAAO,KAAKkM,IAAZ,IAAoBhN,OAAO,CAACc,OAAD,EAAU8Z,QAAV,CAA/B,EAAoD;EAChD;EACH;;EAED,cAAI3hB,KAAK,CAAC4W,KAAN,KAAgB,EAAhB,IAAsB7P,OAAO,CAACc,OAAD,EAAU,4BAAV,CAAjC,EAA0E;EACtE;EACH;EACJ,SAhBQ;;;EAmBT,YAAMI,cAAc,GAAG,CAAC,EAAD,EAAK,EAAL,EAAS,EAAT,EAAa,EAAb,EAAiB,EAAjB,EAAqB,EAArB,EAAyB,EAAzB,EAA6B,EAA7B,EAAiC,EAAjC,EAAqC,EAArC,EAAyC,EAAzC,EAA6C,EAA7C,EAAiD,EAAjD,EAAqD,EAArD,EAAyD,EAAzD,EAA6D,EAA7D,EAAiE,EAAjE,EAAqE,EAArE,EAAyE,EAAzE,EAA6E,EAA7E,EAAiF,EAAjF,CAAvB,CAnBS;;EAsBT,YAAIA,cAAc,CAACf,QAAf,CAAwB8f,IAAxB,CAAJ,EAAmC;EAC/BhnB,UAAAA,KAAK,CAACiI,cAAN;EACAjI,UAAAA,KAAK,CAAC6W,eAAN;EACH;;EAED,gBAAQmQ,IAAR;EACI,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACA,eAAK,EAAL;EACI;EACA,gBAAI,CAACC,MAAL,EAAa;EACTI,cAAAA,SAAS;EACZ;;EACD;;EAEJ,eAAK,EAAL;EACA,eAAK,EAAL;EACI;EACA,gBAAI,CAACJ,MAAL,EAAa;EACTjb,cAAAA,MAAM,CAACsb,UAAP;EACH;;EACD;;EAEJ,eAAK,EAAL;EACI;EACAtb,YAAAA,MAAM,CAACub,cAAP,CAAsB,GAAtB;EACA;;EAEJ,eAAK,EAAL;EACI;EACAvb,YAAAA,MAAM,CAACwb,cAAP,CAAsB,GAAtB;EACA;;EAEJ,eAAK,EAAL;EACI;EACA,gBAAI,CAACP,MAAL,EAAa;EACTjb,cAAAA,MAAM,CAACqM,KAAP,GAAe,CAACrM,MAAM,CAACqM,KAAvB;EACH;;EACD;;EAEJ,eAAK,EAAL;EACI;EACArM,YAAAA,MAAM,CAACyb,OAAP;EACA;;EAEJ,eAAK,EAAL;EACI;EACAzb,YAAAA,MAAM,CAACuH,MAAP;EACA;;EAEJ,eAAK,EAAL;EACI;EACAvH,YAAAA,MAAM,CAAC4H,UAAP,CAAkB7S,MAAlB;EACA;;EAEJ,eAAK,EAAL;EACI;EACA,gBAAI,CAACkmB,MAAL,EAAa;EACTjb,cAAAA,MAAM,CAAC0b,cAAP;EACH;;EACD;;EAEJ,eAAK,EAAL;EACI;EACA1b,YAAAA,MAAM,CAACmU,IAAP,GAAc,CAACnU,MAAM,CAACmU,IAAtB;EACA;;EAEA;;;;;;;;;;EAYJ;EACI;EAlFR,SA3BS;EAiHT;;;EACA,YAAI,CAACnU,MAAM,CAAC4H,UAAP,CAAkB7D,OAAnB,IAA8B/D,MAAM,CAAC4H,UAAP,CAAkBuK,MAAhD,IAA0D6I,IAAI,KAAK,EAAvE,EAA2E;EACvEhb,UAAAA,MAAM,CAAC4H,UAAP,CAAkB7S,MAAlB;EACH,SApHQ;;;EAuHT,aAAK2lB,OAAL,GAAeM,IAAf;EACH,OAxHD,MAwHO;EACH,aAAKN,OAAL,GAAe,IAAf;EACH;EACJ;;;;iCAGU1mB,OAAO;EACd2S,MAAAA,QAAQ,CAAC4I,UAAT,CAAoB7Z,IAApB,CAAyB,KAAKsK,MAA9B,EAAsChM,KAAtC;EACH;;;;mCAGY;EAAA,UACDgM,MADC,GACU,IADV,CACDA,MADC;EAAA,UAEDnJ,QAFC,GAEYmJ,MAFZ,CAEDnJ,QAFC;EAITmJ,MAAAA,MAAM,CAACX,KAAP,GAAe,IAAf,CAJS;;EAOT7E,MAAAA,WAAW,CAAC3D,QAAQ,CAACC,SAAV,EAAqBkJ,MAAM,CAAC3D,MAAP,CAAcC,UAAd,CAAyB8Z,OAA9C,EAAuD,IAAvD,CAAX;EACH;;;kCAEWpiB,OAAO;EAAA,UACPgM,MADO,GACI,IADJ,CACPA,MADO;EAAA,UAEPnJ,QAFO,GAEMmJ,MAFN,CAEPnJ,QAFO;EAIfsjB,MAAAA,YAAY,CAAC,KAAKQ,UAAN,CAAZ,CAJe;;EAOf,UAAI3mB,KAAK,CAACsB,IAAN,KAAe,SAAf,IAA4BtB,KAAK,CAAC4W,KAAN,KAAgB,CAAhD,EAAmD;EAC/C;EACH,OATc;;;EAYf,UAAI5W,KAAK,CAACsB,IAAN,KAAe,SAAnB,EAA8B;EAC1B,aAAKslB,WAAL,GAAmB5mB,KAAK,CAAC2nB,SAAzB;EACH,OAdc;;;EAiBf,UAAMC,aAAa,GAAG,SAAhBA,aAAgB,GAAM;EACxB,YAAMhiB,SAAS,GAAGoG,MAAM,CAAC3D,MAAP,CAAcC,UAAd,CAAyBH,QAA3C;EACA,YAAMmG,OAAO,GAAGlH,WAAW,CAAC1F,IAAZ,CAAiBsK,MAAjB,aAA6BpG,SAA7B,EAAhB;EACAY,QAAAA,WAAW,CAAC8H,OAAD,EAAU1I,SAAV,EAAqB,KAArB,CAAX;EACH,OAJD,CAjBe;;;EAwBf,UAAMiiB,UAAU,GAAG7nB,KAAK,CAAC2nB,SAAN,GAAkB,KAAKf,WAAvB,IAAsC,EAAzD,CAxBe;;EA2Bf,UAAI5mB,KAAK,CAACsB,IAAN,KAAe,OAAf,IAA0B,CAACumB,UAA/B,EAA2C;EACvC;EACH,OA7Bc;;;EAgCfD,MAAAA,aAAa,GAhCE;EAmCf;;EACA,WAAKjB,UAAL,GAAkB/jB,UAAU,CAAC,YAAM;EAC/B,YAAMiF,OAAO,GAAGtD,QAAQ,CAACuD,aAAzB,CAD+B;;EAI/B,YAAI,CAACjF,QAAQ,CAACC,SAAT,CAAmB+D,QAAnB,CAA4BgB,OAA5B,CAAL,EAA2C;EACvC;EACH;;EAEDrB,QAAAA,WAAW,CAACjC,QAAQ,CAACuD,aAAV,EAAyBkE,MAAM,CAAC3D,MAAP,CAAcC,UAAd,CAAyBH,QAAlD,EAA4D,IAA5D,CAAX;EACH,OAT2B,EASzB,EATyB,CAA5B;EAUH;;;;+BAGqB;EAAA,UAAfpH,MAAe,uEAAN,IAAM;EAAA,UACViL,MADU,GACC,IADD,CACVA,MADU;;EAIlB,UAAIA,MAAM,CAAC3D,MAAP,CAAcgY,QAAd,CAAuBC,MAA3B,EAAmC;EAC/Bzf,QAAAA,cAAc,CAACa,IAAf,CAAoBsK,MAApB,EAA4BzN,MAA5B,EAAoC,eAApC,EAAqD,KAAKsoB,SAA1D,EAAqE9lB,MAArE,EAA6E,KAA7E;EACH,OANiB;;;EASlBF,MAAAA,cAAc,CAACa,IAAf,CAAoBsK,MAApB,EAA4BzH,QAAQ,CAACkN,IAArC,EAA2C,OAA3C,EAAoD,KAAK8J,UAAzD,EAAqExa,MAArE,EATkB;;EAYlBa,MAAAA,IAAI,CAACF,IAAL,CAAUsK,MAAV,EAAkBzH,QAAQ,CAACkN,IAA3B,EAAiC,YAAjC,EAA+C,KAAKsV,UAApD,EAZkB;;EAelBlmB,MAAAA,cAAc,CAACa,IAAf,CAAoBsK,MAApB,EAA4BzH,QAAQ,CAACkN,IAArC,EAA2C,oBAA3C,EAAiE,KAAKqV,WAAtE,EAAmF/lB,MAAnF,EAA2F,KAA3F,EAAkG,IAAlG;EACH;;;;kCAGW;EAAA,UACAiL,MADA,GACW,IADX,CACAA,MADA;EAAA,UAEAnJ,QAFA,GAEamJ,MAFb,CAEAnJ,QAFA;;EAKR,UAAI,CAACmJ,MAAM,CAAC3D,MAAP,CAAcgY,QAAd,CAAuBC,MAAxB,IAAkCtU,MAAM,CAAC3D,MAAP,CAAcgY,QAAd,CAAuBxY,OAA7D,EAAsE;EAClEpG,QAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBnJ,QAAQ,CAACC,SAAzB,EAAoC,eAApC,EAAqD,KAAK+jB,SAA1D,EAAqE,KAArE;EACH,OAPO;;;EAURplB,MAAAA,EAAE,CAACC,IAAH,CACIsK,MADJ,EAEInJ,QAAQ,CAACC,SAFb,EAGI,0EAHJ,EAII,UAAA9C,KAAK,EAAI;EAAA,YACG2S,WADH,GACgB9P,QADhB,CACG8P,QADH;;EAIL,YAAIA,WAAQ,IAAI3S,KAAK,CAACsB,IAAN,KAAe,iBAA/B,EAAkD;EAC9CqR,UAAAA,WAAQ,CAAC2F,OAAT,GAAmB,KAAnB;EACA3F,UAAAA,WAAQ,CAACwP,KAAT,GAAiB,KAAjB;EACH,SAPI;;;EAUL,YAAM3G,IAAI,GAAG,CAAC,YAAD,EAAe,WAAf,EAA4B,WAA5B,EAAyCtU,QAAzC,CAAkDlH,KAAK,CAACsB,IAAxD,CAAb;EAEA,YAAIwmB,KAAK,GAAG,CAAZ;;EAEA,YAAItM,IAAJ,EAAU;EACNnR,UAAAA,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuBsK,MAAvB,EAA+B,IAA/B,EADM;;EAGN8b,UAAAA,KAAK,GAAG9b,MAAM,CAACX,KAAP,GAAe,IAAf,GAAsB,IAA9B;EACH,SAlBI;;;EAqBL8a,QAAAA,YAAY,CAACna,MAAM,CAACoa,MAAP,CAAczT,QAAf,CAAZ,CArBK;;EAwBL3G,QAAAA,MAAM,CAACoa,MAAP,CAAczT,QAAd,GAAyB/P,UAAU,CAAC;EAAA,iBAAMyH,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuBsK,MAAvB,EAA+B,KAA/B,CAAN;EAAA,SAAD,EAA8C8b,KAA9C,CAAnC;EACH,OA7BL;EA+BH;;;;8BAGO;EAAA,UACI9b,MADJ,GACe,IADf,CACIA,MADJ;EAAA,UAEInJ,QAFJ,GAEiBmJ,MAFjB,CAEInJ,QAFJ;;EAKJpB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,2BAA9B,EAA2D,UAAAjL,KAAK;EAAA,eAAI2S,QAAQ,CAAC2G,UAAT,CAAoB5X,IAApB,CAAyBsK,MAAzB,EAAiChM,KAAjC,CAAJ;EAAA,OAAhE,EALI;;EAQJyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,0CAA9B,EAA0E,UAAAjL,KAAK;EAAA,eAC3E2S,QAAQ,CAAC+G,cAAT,CAAwBhY,IAAxB,CAA6BsK,MAA7B,EAAqChM,KAArC,CAD2E;EAAA,OAA/E,EARI;EAaJ;;EACAyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,oBAA9B,EAAoD,YAAM;EACtD7E,QAAAA,YAAY,CAACvD,QAAQ,CAACmR,MAAV,EAAkB,CAAChI,MAAM,CAAC+b,QAA1B,CAAZ;EACA3hB,QAAAA,YAAY,CAACvD,QAAQ,CAACuQ,OAAT,CAAiBK,IAAlB,EAAwB,CAACzH,MAAM,CAAC+b,QAAhC,CAAZ;EACH,OAHD,EAdI;;EAoBJtmB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,OAA9B,EAAuC,YAAM;EACzC;EACA,YAAIe,MAAM,CAAChB,OAAP,IAAkBgB,MAAM,CAAC2R,OAAzB,IAAoC3R,MAAM,CAAC3D,MAAP,CAAc4X,UAAtD,EAAkE;EAC9D;EACAjU,UAAAA,MAAM,CAACsH,OAAP;EACH;EACJ,OAND,EApBI;;EA6BJ7R,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,iCAA9B,EAAiE,UAAAjL,KAAK;EAAA,eAClE2S,QAAQ,CAAC4F,cAAT,CAAwB7W,IAAxB,CAA6BsK,MAA7B,EAAqChM,KAArC,CADkE;EAAA,OAAtE,EA7BI;;EAkCJyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,cAA9B,EAA8C,UAAAjL,KAAK;EAAA,eAAI2S,QAAQ,CAACwF,YAAT,CAAsBzW,IAAtB,CAA2BsK,MAA3B,EAAmChM,KAAnC,CAAJ;EAAA,OAAnD,EAlCI;;EAqCJyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,6CAA9B,EAA6E,UAAAjL,KAAK;EAAA,eAC9EqK,EAAE,CAACob,YAAH,CAAgB/jB,IAAhB,CAAqBsK,MAArB,EAA6BhM,KAA7B,CAD8E;EAAA,OAAlF,EArCI;;EA0CJyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,gCAA9B,EAAgE,UAAAjL,KAAK;EAAA,eAAIqK,EAAE,CAAC6b,YAAH,CAAgBxkB,IAAhB,CAAqBsK,MAArB,EAA6BhM,KAA7B,CAAJ;EAAA,OAArE,EA1CI;EA6CJ;;EACAyB,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,SAA9B,EAAyC,YAAM;EAC3C,YAAI,CAACe,MAAM,CAAC+V,GAAZ,EAAiB;EACb;EACH,SAH0C;;;EAM3C,YAAI/V,MAAM,CAAC+V,GAAP,CAAWhS,OAAX,IAAsB,CAAC/D,MAAM,CAAC+V,GAAP,CAAWiG,WAAtC,EAAmD;EAC/C;EACAhc,UAAAA,MAAM,CAAC+V,GAAP,CAAWkG,cAAX,CAA0BllB,IAA1B,CAA+B;EAAA,mBAAMiJ,MAAM,CAAC+V,GAAP,CAAWxV,IAAX,EAAN;EAAA,WAA/B,EAAwDwF,KAAxD,CAA8D;EAAA,mBAAM/F,MAAM,CAACO,IAAP,EAAN;EAAA,WAA9D;EACH;EACJ,OAVD,EA9CI;;EA2DJ,UAAIP,MAAM,CAACzL,SAAP,CAAiB8J,EAAjB,IAAuB2B,MAAM,CAAC3D,MAAP,CAAc0X,WAArC,IAAoD,CAAC/T,MAAM,CAACkc,OAAhE,EAAyE;EACrE;EACA,YAAMjlB,OAAO,GAAGoE,UAAU,CAAC3F,IAAX,CAAgBsK,MAAhB,aAA4BA,MAAM,CAAC3D,MAAP,CAAcC,UAAd,CAAyByB,KAArD,EAAhB,CAFqE;;EAKrE,YAAI,CAAC7I,EAAE,CAACpB,OAAH,CAAWmD,OAAX,CAAL,EAA0B;EACtB;EACH,SAPoE;;;EAUrExB,QAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBnJ,QAAQ,CAACC,SAAzB,EAAoC,OAApC,EAA6C,UAAA9C,KAAK,EAAI;EAClD,cAAMkD,OAAO,GAAG,CAACL,QAAQ,CAACC,SAAV,EAAqBG,OAArB,CAAhB,CADkD;;EAIlD,cAAI,CAACC,OAAO,CAACgE,QAAR,CAAiBlH,KAAK,CAAC0E,MAAvB,CAAD,IAAmC,CAACzB,OAAO,CAAC4D,QAAR,CAAiB7G,KAAK,CAAC0E,MAAvB,CAAxC,EAAwE;EACpE;EACH,WANiD;;;EASlD,cAAIsH,MAAM,CAACX,KAAP,IAAgBW,MAAM,CAAC3D,MAAP,CAAc2X,YAAlC,EAAgD;EAC5C;EACH;;EAED,cAAIhU,MAAM,CAACmc,KAAX,EAAkB;EACdnc,YAAAA,MAAM,CAACsH,OAAP;EACAtH,YAAAA,MAAM,CAACO,IAAP;EACH,WAHD,MAGO;EACHP,YAAAA,MAAM,CAACsb,UAAP;EACH;EACJ,SAnBD;EAoBH,OAzFG;;;EA4FJ,UAAItb,MAAM,CAACzL,SAAP,CAAiB8J,EAAjB,IAAuB2B,MAAM,CAAC3D,MAAP,CAAc6X,kBAAzC,EAA6D;EACzDze,QAAAA,EAAE,CAACC,IAAH,CACIsK,MADJ,EAEInJ,QAAQ,CAACI,OAFb,EAGI,aAHJ,EAII,UAAAjD,KAAK,EAAI;EACLA,UAAAA,KAAK,CAACiI,cAAN;EACH,SANL,EAOI,KAPJ;EASH,OAtGG;;;EAyGJxG,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,cAA9B,EAA8C,YAAM;EAChD;EACAe,QAAAA,MAAM,CAACgE,OAAP,CAAe/D,GAAf,CAAmB;EACf+H,UAAAA,MAAM,EAAEhI,MAAM,CAACgI,MADA;EAEfqE,UAAAA,KAAK,EAAErM,MAAM,CAACqM;EAFC,SAAnB;EAIH,OAND,EAzGI;;EAkHJ5W,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,YAA9B,EAA4C,YAAM;EAC9C;EACA0H,QAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4BsK,MAA5B,EAAoC,OAApC,EAF8C;;;EAK9CA,QAAAA,MAAM,CAACgE,OAAP,CAAe/D,GAAf,CAAmB;EAAE8L,UAAAA,KAAK,EAAE/L,MAAM,CAAC+L;EAAhB,SAAnB;EACH,OAND,EAlHI;;EA2HJtW,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,eAA9B,EAA+C,UAAAjL,KAAK,EAAI;EACpD;EACA2S,QAAAA,QAAQ,CAACoH,aAAT,CAAuBrY,IAAvB,CAA4BsK,MAA5B,EAAoC,SAApC,EAA+C,IAA/C,EAAqDhM,KAAK,CAACkC,MAAN,CAAauK,OAAlE;EACH,OAHD,EA3HI;;EAiIJhL,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8B,qBAA9B,EAAqD,YAAM;EACvD0H,QAAAA,QAAQ,CAAC0J,eAAT,CAAyB3a,IAAzB,CAA8BsK,MAA9B;EACH,OAFD,EAjII;EAsIJ;;EACA,UAAMoc,WAAW,GAAGpc,MAAM,CAAC3D,MAAP,CAAclH,MAAd,CAAqBknB,MAArB,CAA4B,CAAC,OAAD,EAAU,SAAV,CAA5B,EAAkDjT,IAAlD,CAAuD,GAAvD,CAApB;EAEA3T,MAAAA,EAAE,CAACC,IAAH,CAAQsK,MAAR,EAAgBA,MAAM,CAACf,KAAvB,EAA8Bmd,WAA9B,EAA2C,UAAApoB,KAAK,EAAI;EAAA,4BAC1BA,KAD0B,CAC1CkC,MAD0C;EAAA,YAC1CA,MAD0C,8BACjC,EADiC;;EAIhD,YAAIlC,KAAK,CAACsB,IAAN,KAAe,OAAnB,EAA4B;EACxBY,UAAAA,MAAM,GAAG8J,MAAM,CAACf,KAAP,CAAaqJ,KAAtB;EACH;;EAEDtS,QAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BnJ,QAAQ,CAACC,SAAnC,EAA8C9C,KAAK,CAACsB,IAApD,EAA0D,IAA1D,EAAgEY,MAAhE;EACH,OATD;EAUH;;;;4BAGKlC,OAAOsoB,gBAAgBC,kBAAkB;EAAA,UACnCvc,MADmC,GACxB,IADwB,CACnCA,MADmC;EAE3C,UAAMwc,aAAa,GAAGxc,MAAM,CAAC3D,MAAP,CAAcuP,SAAd,CAAwB2Q,gBAAxB,CAAtB;EACA,UAAME,gBAAgB,GAAGvnB,EAAE,CAACxB,QAAH,CAAY8oB,aAAZ,CAAzB;EACA,UAAIE,QAAQ,GAAG,IAAf,CAJ2C;;EAO3C,UAAID,gBAAJ,EAAsB;EAClBC,QAAAA,QAAQ,GAAGF,aAAa,CAAC9mB,IAAd,CAAmBsK,MAAnB,EAA2BhM,KAA3B,CAAX;EACH,OAT0C;;;EAY3C,UAAI0oB,QAAQ,IAAIxnB,EAAE,CAACxB,QAAH,CAAY4oB,cAAZ,CAAhB,EAA6C;EACzCA,QAAAA,cAAc,CAAC5mB,IAAf,CAAoBsK,MAApB,EAA4BhM,KAA5B;EACH;EACJ;;;;2BAGIF,SAASwB,MAAMgnB,gBAAgBC,kBAAkC;EAAA;;EAAA,UAAhBvnB,OAAgB,uEAAN,IAAM;EAAA,UAC1DgL,MAD0D,GAC/C,IAD+C,CAC1DA,MAD0D;EAElE,UAAMwc,aAAa,GAAGxc,MAAM,CAAC3D,MAAP,CAAcuP,SAAd,CAAwB2Q,gBAAxB,CAAtB;EACA,UAAME,gBAAgB,GAAGvnB,EAAE,CAACxB,QAAH,CAAY8oB,aAAZ,CAAzB;EAEA/mB,MAAAA,EAAE,CAACC,IAAH,CACIsK,MADJ,EAEIlM,OAFJ,EAGIwB,IAHJ,EAII,UAAAtB,KAAK;EAAA,eAAI,KAAI,CAAC2oB,KAAL,CAAW3oB,KAAX,EAAkBsoB,cAAlB,EAAkCC,gBAAlC,CAAJ;EAAA,OAJT,EAKIvnB,OAAO,IAAI,CAACynB,gBALhB;EAOH;;;;oCAGU;EAAA;;EAAA,UACCzc,MADD,GACY,IADZ,CACCA,MADD;EAAA,UAECnJ,QAFD,GAEcmJ,MAFd,CAECnJ,QAFD;;EAKP,UAAM+lB,UAAU,GAAG3f,OAAO,CAACC,IAAR,GAAe,QAAf,GAA0B,OAA7C,CALO;;EAQP,UAAIrG,QAAQ,CAACuQ,OAAT,CAAiB7G,IAArB,EAA2B;EACvB9O,QAAAA,KAAK,CAAC0F,IAAN,CAAWN,QAAQ,CAACuQ,OAAT,CAAiB7G,IAA5B,EAAkClL,OAAlC,CAA0C,UAAA0U,MAAM,EAAI;EAChD,UAAA,MAAI,CAAC8B,IAAL,CAAU9B,MAAV,EAAkB,OAAlB,EAA2B/J,MAAM,CAACsb,UAAlC,EAA8C,MAA9C;EACH,SAFD;EAGH,OAZM;;;EAeP,WAAKzP,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBE,OAA3B,EAAoC,OAApC,EAA6CtH,MAAM,CAACsH,OAApD,EAA6D,SAA7D,EAfO;;EAkBP,WAAKuE,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBG,MAA3B,EAAmC,OAAnC,EAA4CvH,MAAM,CAACuH,MAAnD,EAA2D,QAA3D,EAlBO;;EAqBP,WAAKsE,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBI,WAA3B,EAAwC,OAAxC,EAAiDxH,MAAM,CAACyb,OAAxD,EAAiE,aAAjE,EArBO;;EAwBP,WAAK5P,IAAL,CACIhV,QAAQ,CAACuQ,OAAT,CAAiBK,IADrB,EAEI,OAFJ,EAGI,YAAM;EACFzH,QAAAA,MAAM,CAACqM,KAAP,GAAe,CAACrM,MAAM,CAACqM,KAAvB;EACH,OALL,EAMI,MANJ,EAxBO;;EAkCP,WAAKR,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBO,QAA3B,EAAqC,OAArC,EAA8C;EAAA,eAAM3H,MAAM,CAAC0b,cAAP,EAAN;EAAA,OAA9C,EAlCO;;EAqCP,WAAK7P,IAAL,CACIhV,QAAQ,CAACuQ,OAAT,CAAiBkJ,QADrB,EAEI,OAFJ,EAGI,YAAM;EACFta,QAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,UAAxC;EACH,OALL,EAMI,UANJ,EArCO;;EA+CP,WAAK4M,IAAL,CACIhV,QAAQ,CAACuQ,OAAT,CAAiBQ,UADrB,EAEI,OAFJ,EAGI,YAAM;EACF5H,QAAAA,MAAM,CAAC4H,UAAP,CAAkB7S,MAAlB;EACH,OALL,EAMI,YANJ,EA/CO;;EAyDP,WAAK8W,IAAL,CACIhV,QAAQ,CAACuQ,OAAT,CAAiB7I,GADrB,EAEI,OAFJ,EAGI,YAAM;EACFyB,QAAAA,MAAM,CAACzB,GAAP,GAAa,QAAb;EACH,OALL,EAMI,KANJ,EAzDO;;EAmEP,WAAKsN,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBzI,OAA3B,EAAoC,OAApC,EAA6CqB,MAAM,CAACrB,OAApD,EAA6D,SAA7D,EAnEO;;EAsEP,WAAKkN,IAAL,CAAUhV,QAAQ,CAACuQ,OAAT,CAAiBM,QAA3B,EAAqC,OAArC,EAA8C,UAAA1T,KAAK,EAAI;EACnD;EACAA,QAAAA,KAAK,CAAC6W,eAAN;;EAEAlE,QAAAA,QAAQ,CAAC4I,UAAT,CAAoB7Z,IAApB,CAAyBsK,MAAzB,EAAiChM,KAAjC;EACH,OALD,EAtEO;EA8EP;EACA;;EACA,WAAK6X,IAAL,CACIhV,QAAQ,CAACuQ,OAAT,CAAiBM,QADrB,EAEI,OAFJ,EAGI,UAAA1T,KAAK,EAAI;EACL,YAAMgnB,IAAI,GAAGhnB,KAAK,CAAC4W,KAAnB,CADK;;EAIL,YAAI,CAAC,CAAC,EAAD,EAAK,EAAL,EAAS1P,QAAT,CAAkB8f,IAAlB,CAAL,EAA8B;EAC1B;EACH,SANI;;;EASL,YAAIA,IAAI,KAAK,EAAb,EAAiB;EACbrU,UAAAA,QAAQ,CAACyE,kBAAT,CAA4B1V,IAA5B,CAAiCsK,MAAjC,EAAyC,IAAzC,EAA+C,IAA/C;;EACA;EACH,SAZI;;;EAeLhM,QAAAA,KAAK,CAACiI,cAAN,GAfK;;EAkBLjI,QAAAA,KAAK,CAAC6W,eAAN,GAlBK;;EAqBLlE,QAAAA,QAAQ,CAAC4I,UAAT,CAAoB7Z,IAApB,CAAyBsK,MAAzB,EAAiChM,KAAjC;EACH,OAzBL,EA0BI,IA1BJ,EA2BI,KA3BJ;EAAA,QAhFO;;EA+GP,WAAK6X,IAAL,CAAUhV,QAAQ,CAAC6Q,QAAT,CAAkB6B,IAA5B,EAAkC,SAAlC,EAA6C,UAAAvV,KAAK,EAAI;EAClD,YAAIA,KAAK,CAAC4W,KAAN,KAAgB,EAApB,EAAwB;EACpBjE,UAAAA,QAAQ,CAAC4I,UAAT,CAAoB7Z,IAApB,CAAyBsK,MAAzB,EAAiChM,KAAjC;EACH;EACJ,OAJD,EA/GO;;EAsHP,WAAK6X,IAAL,CAAUhV,QAAQ,CAACiR,MAAT,CAAgBC,IAA1B,EAAgC,qBAAhC,EAAuD,UAAA/T,KAAK,EAAI;EAC5D,YAAM6oB,IAAI,GAAGhmB,QAAQ,CAACgR,QAAT,CAAkBoF,qBAAlB,EAAb;EACA,YAAML,OAAO,GAAI,MAAMiQ,IAAI,CAAC1P,KAAZ,IAAsBnZ,KAAK,CAACoZ,KAAN,GAAcyP,IAAI,CAACxP,IAAzC,CAAhB;EACArZ,QAAAA,KAAK,CAAC8oB,aAAN,CAAoB1kB,YAApB,CAAiC,YAAjC,EAA+CwU,OAA/C;EACH,OAJD,EAtHO;;EA6HP,WAAKf,IAAL,CAAUhV,QAAQ,CAACiR,MAAT,CAAgBC,IAA1B,EAAgC,qDAAhC,EAAuF,UAAA/T,KAAK,EAAI;EAC5F,YAAM+T,IAAI,GAAG/T,KAAK,CAAC8oB,aAAnB;EACA,YAAM9B,IAAI,GAAGhnB,KAAK,CAAC4H,OAAN,GAAgB5H,KAAK,CAAC4H,OAAtB,GAAgC5H,KAAK,CAAC4W,KAAnD;EACA,YAAMmS,SAAS,GAAG,gBAAlB;;EAEA,YAAI7nB,EAAE,CAACjB,aAAH,CAAiBD,KAAjB,KAA4BgnB,IAAI,KAAK,EAAT,IAAeA,IAAI,KAAK,EAAxD,EAA6D;EACzD;EACH,SAP2F;;;EAU5Fhb,QAAAA,MAAM,CAACsa,YAAP,GAAsBC,IAAI,CAACC,GAAL,EAAtB,CAV4F;;EAa5F,YAAMja,IAAI,GAAGwH,IAAI,CAACiV,YAAL,CAAkBD,SAAlB,CAAb,CAb4F;;EAgB5F,YAAME,IAAI,GAAG,CAAC,SAAD,EAAY,UAAZ,EAAwB,OAAxB,EAAiC/hB,QAAjC,CAA0ClH,KAAK,CAACsB,IAAhD,CAAb,CAhB4F;;EAmB5F,YAAIiL,IAAI,IAAI0c,IAAZ,EAAkB;EACdlV,UAAAA,IAAI,CAACxN,eAAL,CAAqBwiB,SAArB;EACA/c,UAAAA,MAAM,CAACO,IAAP;EACH,SAHD,MAGO,IAAI,CAAC0c,IAAD,IAASjd,MAAM,CAACgW,OAApB,EAA6B;EAChCjO,UAAAA,IAAI,CAAC3P,YAAL,CAAkB2kB,SAAlB,EAA6B,EAA7B;EACA/c,UAAAA,MAAM,CAACqH,KAAP;EACH;EACJ,OA1BD,EA7HO;EA0JP;EACA;;EACA,UAAIpK,OAAO,CAACU,KAAZ,EAAmB;EACf,YAAMmK,MAAM,GAAG1M,WAAW,CAAC1F,IAAZ,CAAiBsK,MAAjB,EAAyB,qBAAzB,CAAf;EACAvO,QAAAA,KAAK,CAAC0F,IAAN,CAAW2Q,MAAX,EAAmBzS,OAAnB,CAA2B,UAAA5E,KAAK;EAAA,iBAAI,MAAI,CAACob,IAAL,CAAUpb,KAAV,EAAiBmsB,UAAjB,EAA6B,UAAA5oB,KAAK;EAAA,mBAAI+I,OAAO,CAAC/I,KAAK,CAAC0E,MAAP,CAAX;EAAA,WAAlC,CAAJ;EAAA,SAAhC;EACH,OA/JM;;;EAkKP,WAAKmT,IAAL,CACIhV,QAAQ,CAACiR,MAAT,CAAgBC,IADpB,EAEI6U,UAFJ,EAGI,UAAA5oB,KAAK,EAAI;EACL,YAAM+T,IAAI,GAAG/T,KAAK,CAAC8oB,aAAnB,CADK;;EAIL,YAAII,MAAM,GAAGnV,IAAI,CAAClI,YAAL,CAAkB,YAAlB,CAAb;;EAEA,YAAI3K,EAAE,CAACb,KAAH,CAAS6oB,MAAT,CAAJ,EAAsB;EAClBA,UAAAA,MAAM,GAAGnV,IAAI,CAAC7P,KAAd;EACH;;EAED6P,QAAAA,IAAI,CAACxN,eAAL,CAAqB,YAArB;EAEAyF,QAAAA,MAAM,CAACE,WAAP,GAAsBgd,MAAM,GAAGnV,IAAI,CAACxF,GAAf,GAAsBvC,MAAM,CAACmI,QAAlD;EACH,OAhBL,EAiBI,MAjBJ,EAlKO;;EAuLP,WAAK0D,IAAL,CAAUhV,QAAQ,CAACgR,QAAnB,EAA6B,iCAA7B,EAAgE,UAAA7T,KAAK;EAAA,eACjE2S,QAAQ,CAACmG,iBAAT,CAA2BpX,IAA3B,CAAgCsK,MAAhC,EAAwChM,KAAxC,CADiE;EAAA,OAArE,EAvLO;;EA4LP,UAAIiJ,OAAO,CAACG,QAAZ,EAAsB;EAClB3L,QAAAA,KAAK,CAAC0F,IAAN,CAAWiE,WAAW,CAAC1F,IAAZ,CAAiBsK,MAAjB,EAAyB,qBAAzB,CAAX,EAA4D3K,OAA5D,CAAoE,UAAAvB,OAAO,EAAI;EAC3E,UAAA,MAAI,CAAC+X,IAAL,CAAU/X,OAAV,EAAmB,OAAnB,EAA4B,UAAAE,KAAK;EAAA,mBAAI2S,QAAQ,CAACyD,eAAT,CAAyB1U,IAAzB,CAA8BsK,MAA9B,EAAsChM,KAAK,CAAC0E,MAA5C,CAAJ;EAAA,WAAjC;EACH,SAFD;EAGH,OAhMM;EAmMP;;;EACA,UAAIsH,MAAM,CAAC3D,MAAP,CAAcwX,YAAd,IAA8B,CAAC3e,EAAE,CAACpB,OAAH,CAAW+C,QAAQ,CAACoR,OAAT,CAAiBE,QAA5B,CAAnC,EAA0E;EACtE,aAAK0D,IAAL,CAAUhV,QAAQ,CAACoR,OAAT,CAAiB/H,WAA3B,EAAwC,OAAxC,EAAiD,YAAM;EACnD;EACA,cAAIF,MAAM,CAACE,WAAP,KAAuB,CAA3B,EAA8B;EAC1B;EACH;;EAEDF,UAAAA,MAAM,CAAC3D,MAAP,CAAcmR,UAAd,GAA2B,CAACxN,MAAM,CAAC3D,MAAP,CAAcmR,UAA1C;;EAEA7G,UAAAA,QAAQ,CAAC2G,UAAT,CAAoB5X,IAApB,CAAyBsK,MAAzB;EACH,SATD;EAUH,OA/MM;;;EAkNP,WAAK6L,IAAL,CACIhV,QAAQ,CAACiR,MAAT,CAAgBE,MADpB,EAEI4U,UAFJ,EAGI,UAAA5oB,KAAK,EAAI;EACLgM,QAAAA,MAAM,CAACgI,MAAP,GAAgBhU,KAAK,CAAC0E,MAAN,CAAaR,KAA7B;EACH,OALL,EAMI,QANJ,EAlNO;;EA4NP,WAAK2T,IAAL,CAAUhV,QAAQ,CAAC8P,QAAnB,EAA6B,uBAA7B,EAAsD,UAAA3S,KAAK,EAAI;EAC3D6C,QAAAA,QAAQ,CAAC8P,QAAT,CAAkBwP,KAAlB,GAA0B,CAACnW,MAAM,CAACX,KAAR,IAAiBrL,KAAK,CAACsB,IAAN,KAAe,YAA1D;EACH,OAFD,EA5NO;;EAiOP,WAAKuW,IAAL,CAAUhV,QAAQ,CAAC8P,QAAnB,EAA6B,mDAA7B,EAAkF,UAAA3S,KAAK,EAAI;EACvF6C,QAAAA,QAAQ,CAAC8P,QAAT,CAAkB2F,OAAlB,GAA4B,CAAC,WAAD,EAAc,YAAd,EAA4BpR,QAA5B,CAAqClH,KAAK,CAACsB,IAA3C,CAA5B;EACH,OAFD,EAjOO;;EAsOP,WAAKuW,IAAL,CAAUhV,QAAQ,CAAC8P,QAAnB,EAA6B,SAA7B,EAAwC,YAAM;EAAA,YAClCtK,MADkC,GACL2D,MADK,CAClC3D,MADkC;EAAA,YAC1BxF,QAD0B,GACLmJ,MADK,CAC1BnJ,QAD0B;EAAA,YAChBujB,MADgB,GACLpa,MADK,CAChBoa,MADgB;;EAI1C5f,QAAAA,WAAW,CAAC3D,QAAQ,CAAC8P,QAAV,EAAoBtK,MAAM,CAACC,UAAP,CAAkBga,YAAtC,EAAoD,IAApD,CAAX,CAJ0C;;EAO1CjY,QAAAA,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuBsK,MAAvB,EAA+B,IAA/B,EAP0C;;EAU1CpJ,QAAAA,UAAU,CAAC,YAAM;EACb4D,UAAAA,WAAW,CAAC3D,QAAQ,CAAC8P,QAAV,EAAoBtK,MAAM,CAACC,UAAP,CAAkBga,YAAtC,EAAoD,KAApD,CAAX;EACH,SAFS,EAEP,CAFO,CAAV,CAV0C;;EAe1C,YAAMwF,KAAK,GAAG,MAAI,CAACzc,KAAL,GAAa,IAAb,GAAoB,IAAlC,CAf0C;;EAkB1C8a,QAAAA,YAAY,CAACC,MAAM,CAACzT,QAAR,CAAZ,CAlB0C;;EAqB1CyT,QAAAA,MAAM,CAACzT,QAAP,GAAkB/P,UAAU,CAAC;EAAA,iBAAMyH,EAAE,CAAC4b,cAAH,CAAkBvkB,IAAlB,CAAuBsK,MAAvB,EAA+B,KAA/B,CAAN;EAAA,SAAD,EAA8C8b,KAA9C,CAA5B;EACH,OAtBD,EAtOO;;EA+PP,WAAKjQ,IAAL,CACIhV,QAAQ,CAACiR,MAAT,CAAgBE,MADpB,EAEI,OAFJ,EAGI,UAAAhU,KAAK,EAAI;EACL;EACA;EACA,YAAMuS,QAAQ,GAAGvS,KAAK,CAACmpB,iCAAvB,CAHK;;EAAA,mBAMU,CAACnpB,KAAK,CAACopB,MAAP,EAAe,CAACppB,KAAK,CAACqpB,MAAtB,EAA8B3iB,GAA9B,CAAkC,UAAAxC,KAAK;EAAA,iBAAKqO,QAAQ,GAAG,CAACrO,KAAJ,GAAYA,KAAzB;EAAA,SAAvC,CANV;EAAA;EAAA,YAMEif,CANF;EAAA,YAMKE,CANL;;;EASL,YAAMiG,SAAS,GAAGlc,IAAI,CAACmc,IAAL,CAAUnc,IAAI,CAACC,GAAL,CAAS8V,CAAT,IAAc/V,IAAI,CAACC,GAAL,CAASgW,CAAT,CAAd,GAA4BF,CAA5B,GAAgCE,CAA1C,CAAlB,CATK;;EAYLrX,QAAAA,MAAM,CAACub,cAAP,CAAsB+B,SAAS,GAAG,EAAlC,EAZK;;EAAA,YAeGtV,MAfH,GAechI,MAAM,CAACf,KAfrB,CAeG+I,MAfH;;EAgBL,YAAKsV,SAAS,KAAK,CAAd,IAAmBtV,MAAM,GAAG,CAA7B,IAAoCsV,SAAS,KAAK,CAAC,CAAf,IAAoBtV,MAAM,GAAG,CAArE,EAAyE;EACrEhU,UAAAA,KAAK,CAACiI,cAAN;EACH;EACJ,OAtBL,EAuBI,QAvBJ,EAwBI,KAxBJ;EA0BH;;;;;;;;;;;;;ECjwBL,CAAC,SAAS,IAAI,EAAE,OAAO,EAAE;IACvB,AAEwC;MACtC,cAAc,GAAG,OAAO,EAAE,CAAC;KAC5B,AAEA;GACF,CAACuhB,cAAI,EAAE,WAAW;;;;;;EAMnB,IAAI,OAAO,GAAG,WAAW,EAAE;MACvB,aAAa,GAAG,EAAE;MAClB,iBAAiB,GAAG,EAAE;MACtB,mBAAmB,GAAG,EAAE,CAAC;;;;;;;;EAQ7B,SAAS,SAAS,CAAC,SAAS,EAAE,UAAU,EAAE;;IAExC,SAAS,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;;IAErD,IAAI,YAAY,GAAG,EAAE;QACjB,CAAC,GAAG,SAAS,CAAC,MAAM;QACpB,UAAU,GAAG,CAAC;QACd,EAAE;QACF,QAAQ;QACR,CAAC;QACD,CAAC,CAAC;;;IAGN,EAAE,GAAG,UAAU,QAAQ,EAAE,aAAa,EAAE;MACtC,IAAI,aAAa,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;MAEtD,UAAU,EAAE,CAAC;MACb,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;KAC3C,CAAC;;;IAGF,OAAO,CAAC,EAAE,EAAE;MACV,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;;;MAGxB,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;MAChC,IAAI,CAAC,EAAE;QACL,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChB,SAAS;OACV;;;MAGD,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;MACxE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACZ;GACF;;;;;;;;EAQD,SAAS,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE;;IAExC,IAAI,CAAC,QAAQ,EAAE,OAAO;;IAEtB,IAAI,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;;;IAGtC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;;;IAG5C,IAAI,CAAC,CAAC,EAAE,OAAO;;;IAGf,OAAO,CAAC,CAAC,MAAM,EAAE;MACf,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;MAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAChB;GACF;;;;;;;;EAQD,SAAS,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE;;IAE5C,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;;;IAGtC,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,OAAO,EAAE,YAAY,CAAC,CAAC;SAC1D,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC;GACtC;;;;;;;;EAQD,SAAS,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;IAClD,IAAI,GAAG,GAAG,QAAQ;QACd,KAAK,GAAG,IAAI,CAAC,KAAK;QAClB,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC;QACrC,gBAAgB,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO;QACzC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;QAC9C,KAAK;QACL,CAAC,CAAC;;IAEN,QAAQ,GAAG,QAAQ,IAAI,CAAC,CAAC;;IAEzB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;MAC/B,KAAK,GAAG,IAAI,CAAC;;;MAGb,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;MAC9B,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC;MACrB,CAAC,CAAC,IAAI,GAAG,YAAY,CAAC;KACvB,MAAM,IAAI,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;;MAEpD,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;MAC7B,CAAC,CAAC,GAAG,GAAG,YAAY,CAAC;KACtB,MAAM;;MAEL,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;MAChC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;MACb,CAAC,CAAC,KAAK,GAAG,KAAK,KAAK,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC;KAC9C;;IAED,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,YAAY,GAAG,UAAU,EAAE,EAAE;MACpD,IAAI,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;;MAIxB,IAAI,KAAK,IAAI,WAAW,IAAI,CAAC,EAAE;QAC7B,IAAI;UACF,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;SAC3C,CAAC,OAAO,CAAC,EAAE;;;UAGV,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,MAAM,GAAG,GAAG,CAAC;SAChC;OACF;;;MAGD,IAAI,MAAM,IAAI,GAAG,EAAE;;QAEjB,QAAQ,IAAI,CAAC,CAAC;;;QAGd,IAAI,QAAQ,GAAG,QAAQ,EAAE;UACvB,OAAO,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;SACnD;OACF;;;MAGD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC;KAC/C,CAAC;;;IAGF,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GAClE;;;;;;;;EAQD,SAAS,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE;;IAE1C,KAAK,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;;IAErC,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM;QACzB,CAAC,GAAG,UAAU;QACd,aAAa,GAAG,EAAE;QAClB,EAAE;QACF,CAAC,CAAC;;;IAGN,EAAE,GAAG,SAAS,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE;;MAE5C,IAAI,MAAM,IAAI,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;;;MAI5C,IAAI,MAAM,IAAI,GAAG,EAAE;QACjB,IAAI,gBAAgB,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC1C,OAAO;OACb;;MAED,UAAU,EAAE,CAAC;MACb,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;KAC5C,CAAC;;;IAGF,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;GACpD;;;;;;;;;;EAUD,SAAS,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;IACjC,IAAI,QAAQ;QACR,IAAI,CAAC;;;IAGT,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;;;IAGvC,IAAI,GAAG,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;;;IAGtC,IAAI,QAAQ,EAAE;MACZ,IAAI,QAAQ,IAAI,aAAa,EAAE;QAC7B,MAAM,QAAQ,CAAC;OAChB,MAAM;QACL,aAAa,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;OAChC;KACF;;;IAGD,SAAS,CAAC,KAAK,EAAE,UAAU,aAAa,EAAE;;MAExC,gBAAgB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;;;MAGtC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;KAClC,EAAE,IAAI,CAAC,CAAC;GACV;;;;;;;;EAQD,MAAM,CAAC,KAAK,GAAG,SAAS,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE;;IAExC,SAAS,CAAC,IAAI,EAAE,UAAU,YAAY,EAAE;;MAEtC,gBAAgB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;KACtC,CAAC,CAAC;;IAEH,OAAO,MAAM,CAAC;GACf,CAAC;;;;;;;EAOF,MAAM,CAAC,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE;IACpC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;GACvB,CAAC;;;;;;EAMF,MAAM,CAAC,KAAK,GAAG,SAAS,KAAK,GAAG;IAC9B,aAAa,GAAG,EAAE,CAAC;IACnB,iBAAiB,GAAG,EAAE,CAAC;IACvB,mBAAmB,GAAG,EAAE,CAAC;GAC1B,CAAC;;;;;;;EAOF,MAAM,CAAC,SAAS,GAAG,SAAS,SAAS,CAAC,QAAQ,EAAE;IAC9C,OAAO,QAAQ,IAAI,aAAa,CAAC;GAClC,CAAC;;;;EAIF,OAAO,MAAM,CAAC;;GAEb,CAAC,EAAE;;;ECpSJ;AACA,EAKe,SAASC,UAAT,CAAoBrpB,GAApB,EAAyB;EACpC,SAAO,IAAIsC,OAAJ,CAAY,UAACC,OAAD,EAAU8N,MAAV,EAAqB;EACpCiZ,IAAAA,UAAM,CAACtpB,GAAD,EAAM;EACRupB,MAAAA,OAAO,EAAEhnB,OADD;EAER2R,MAAAA,KAAK,EAAE7D;EAFC,KAAN,CAAN;EAIH,GALM,CAAP;EAMH;;ECGD,SAASmZ,OAAT,CAAiBxpB,GAAjB,EAAsB;EAClB,MAAIc,EAAE,CAACb,KAAH,CAASD,GAAT,CAAJ,EAAmB;EACf,WAAO,IAAP;EACH;;EAED,MAAIc,EAAE,CAAC1B,MAAH,CAAUvC,MAAM,CAACmD,GAAD,CAAhB,CAAJ,EAA4B;EACxB,WAAOA,GAAP;EACH;;EAED,MAAMypB,KAAK,GAAG,iCAAd;EACA,SAAOzpB,GAAG,CAAC4G,KAAJ,CAAU6iB,KAAV,IAAmBnb,MAAM,CAACob,EAA1B,GAA+B1pB,GAAtC;EACH;;;EAGD,SAAS2pB,cAAT,CAAwB5Q,KAAxB,EAA+B6C,MAA/B,EAAuC;EACnC,MAAMgO,QAAQ,GAAG,SAAXA,QAAW,CAACC,CAAD,EAAIC,CAAJ;EAAA,WAAWA,CAAC,KAAK,CAAN,GAAUD,CAAV,GAAcD,QAAQ,CAACE,CAAD,EAAID,CAAC,GAAGC,CAAR,CAAjC;EAAA,GAAjB;;EACA,MAAMpK,KAAK,GAAGkK,QAAQ,CAAC7Q,KAAD,EAAQ6C,MAAR,CAAtB;EACA,mBAAU7C,KAAK,GAAG2G,KAAlB,cAA2B9D,MAAM,GAAG8D,KAApC;EACH;;;EAGD,SAASqK,mBAAT,CAA6B5d,IAA7B,EAAmC;EAC/B,MAAIA,IAAI,IAAI,CAAC,KAAKsS,KAAL,CAAWuL,SAAxB,EAAmC;EAC/B,SAAKvL,KAAL,CAAWuL,SAAX,GAAuB,IAAvB;EACH;;EACD,MAAI,KAAKnf,KAAL,CAAWkB,MAAX,KAAsBI,IAA1B,EAAgC;EAC5B,SAAKtB,KAAL,CAAWkB,MAAX,GAAoB,CAACI,IAArB;EACAvK,IAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoCsB,IAAI,GAAG,MAAH,GAAY,OAApD;EACH;EACJ;;EAED,IAAMkD,KAAK,GAAG;EACViO,EAAAA,KADU,mBACF;EAAA;;EACJ;EACAlX,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcI,OAAf,EAAwB,KAAKoF,MAAL,CAAYC,UAAZ,CAAuBuW,KAA/C,EAAsD,IAAtD,CAAX,CAFI;;EAKJpP,IAAAA,KAAK,CAAC4a,cAAN,CAAqB3oB,IAArB,CAA0B,IAA1B,EALI;;EAQJ,QAAI,CAACR,EAAE,CAAC3B,MAAH,CAAUhB,MAAM,CAAC+rB,KAAjB,CAAL,EAA8B;EAC1Bb,MAAAA,UAAU,CAAC,KAAKphB,MAAL,CAAYuU,IAAZ,CAAiBnN,KAAjB,CAAuB+R,GAAxB,CAAV,CACKze,IADL,CACU,YAAM;EACR0M,QAAAA,KAAK,CAAChN,KAAN,CAAYf,IAAZ,CAAiB,KAAjB;EACH,OAHL,EAIKqQ,KAJL,CAIW,UAAAuC,KAAK,EAAI;EACZ,QAAA,KAAI,CAAC1H,KAAL,CAAW2H,IAAX,CAAgB,0BAAhB,EAA4CD,KAA5C;EACH,OANL;EAOH,KARD,MAQO;EACH7E,MAAAA,KAAK,CAAChN,KAAN,CAAYf,IAAZ,CAAiB,IAAjB;EACH;EACJ,GApBS;EAsBV;EACA;EACA2oB,EAAAA,cAxBU,0BAwBK5tB,KAxBL,EAwBY;EAAA,qBACH,CAACyE,EAAE,CAAChC,MAAH,CAAUzC,KAAV,IAAmBA,KAAnB,GAA2B,KAAK4L,MAAL,CAAYyX,KAAxC,EAA+C1e,KAA/C,CAAqD,GAArD,EAA0DsF,GAA1D,CAA8DzJ,MAA9D,CADG;EAAA;EAAA,QACXkmB,CADW;EAAA,QACRE,CADQ;;EAElB,QAAMkH,OAAO,GAAI,MAAMpH,CAAP,GAAYE,CAA5B;EACA5T,IAAAA,KAAK,CAAC8a,OAAN,GAAgBA,OAAhB;EACA,SAAK1nB,QAAL,CAAcI,OAAd,CAAsB4F,KAAtB,CAA4B2hB,aAA5B,aAA+CD,OAA/C;;EAEA,QAAI,KAAKhqB,SAAL,CAAe8J,EAAnB,EAAuB;EACnB,UAAM2R,MAAM,GAAG,GAAf;EACA,UAAMyO,MAAM,GAAG,CAACzO,MAAM,GAAGuO,OAAV,KAAsBvO,MAAM,GAAG,EAA/B,CAAf;EAEA,WAAK/Q,KAAL,CAAWpC,KAAX,CAAiB6hB,SAAjB,yBAA4CD,MAA5C;EACH;EACJ,GApCS;EAsCV;EACAhoB,EAAAA,KAvCU,sBAuCF;EAAA;;EACJ,QAAMuJ,MAAM,GAAG,IAAf,CADI;;EAIJ,QAAMxL,OAAO,GAAG;EACZ2f,MAAAA,IAAI,EAAEnU,MAAM,CAAC3D,MAAP,CAAc8X,IAAd,CAAmBhC,MADb;EAEZwB,MAAAA,QAAQ,EAAE3T,MAAM,CAAC2T,QAFL;EAGZ;EACAgL,MAAAA,MAAM,EAAE,KAJI;EAKZC,MAAAA,QAAQ,EAAE,KALE;EAMZ/a,MAAAA,KAAK,EAAE,KANK;EAOZkI,MAAAA,KAAK,EAAE,IAPK;EAQZ8S,MAAAA,WAAW,EAAE,CARD;EASZC,MAAAA,OAAO,EAAE,OATG;EAUZ5gB,MAAAA,WAAW,EAAE,CAAC,KAAK7B,MAAL,CAAYuL,UAAZ,CAAuB4M;EAVzB,KAAhB;EAYA,QAAMhD,MAAM,GAAGD,cAAc,CAAC/c,OAAD,CAA7B,CAhBI;;EAmBJ,QAAIoL,MAAM,GAAGI,MAAM,CAACf,KAAP,CAAaY,YAAb,CAA0B,KAA1B,CAAb,CAnBI;;EAsBJ,QAAI3K,EAAE,CAACb,KAAH,CAASuL,MAAT,CAAJ,EAAsB;EAClBA,MAAAA,MAAM,GAAGI,MAAM,CAACf,KAAP,CAAaY,YAAb,CAA0BG,MAAM,CAAC3D,MAAP,CAActE,UAAd,CAAyB8a,KAAzB,CAA+B1Y,EAAzD,CAAT;EACH;;EAED,QAAMA,EAAE,GAAGyjB,OAAO,CAAChe,MAAD,CAAlB,CA1BI;;EA6BJ,QAAM6V,MAAM,GAAGpd,aAAa,CAAC,QAAD,CAA5B;EACA,QAAMiI,GAAG,GAAG4B,MAAM,CAAClC,MAAM,CAAC3D,MAAP,CAAcuU,IAAd,CAAmBnN,KAAnB,CAAyBgS,MAA1B,EAAkCtb,EAAlC,EAAsCqX,MAAtC,CAAlB;EACAiE,IAAAA,MAAM,CAACrd,YAAP,CAAoB,KAApB,EAA2BkI,GAA3B;EACAmV,IAAAA,MAAM,CAACrd,YAAP,CAAoB,iBAApB,EAAuC,EAAvC;EACAqd,IAAAA,MAAM,CAACrd,YAAP,CAAoB,mBAApB,EAAyC,EAAzC;EACAqd,IAAAA,MAAM,CAACrd,YAAP,CAAoB,OAApB,EAA6B,UAA7B,EAlCI;;EAAA,QAqCIyd,MArCJ,GAqCe7V,MArCf,CAqCI6V,MArCJ;;EAwCJ,QAAM5e,OAAO,GAAGoB,aAAa,CAAC,KAAD,EAAQ;EAAEwd,MAAAA,MAAM,EAANA,MAAF;EAAU3b,MAAAA,KAAK,EAAE8F,MAAM,CAAC3D,MAAP,CAAcC,UAAd,CAAyBsZ;EAA1C,KAAR,CAA7B;EACA3e,IAAAA,OAAO,CAACW,WAAR,CAAoB6d,MAApB;EACAzV,IAAAA,MAAM,CAACf,KAAP,GAAehG,cAAc,CAAChC,OAAD,EAAU+I,MAAM,CAACf,KAAjB,CAA7B,CA1CI;;EA6CJsF,IAAAA,KAAK,CAACrC,MAAM,CAAClC,MAAM,CAAC3D,MAAP,CAAcuU,IAAd,CAAmBnN,KAAnB,CAAyBrF,GAA1B,EAA+BjE,EAA/B,CAAP,EAA2C,MAA3C,CAAL,CAAwDpD,IAAxD,CAA6D,UAAA8N,QAAQ,EAAI;EACrE,UAAI3P,EAAE,CAACb,KAAH,CAASwQ,QAAT,CAAJ,EAAwB;EACpB;EACH,OAHoE;;;EAMrE,UAAMzQ,GAAG,GAAG,IAAInB,GAAJ,CAAQ4R,QAAQ,CAAC,CAAD,CAAR,CAAYka,eAApB,CAAZ,CANqE;;EASrE3qB,MAAAA,GAAG,CAAC4qB,QAAJ,aAAkB5qB,GAAG,CAAC4qB,QAAJ,CAAa5pB,KAAb,CAAmB,GAAnB,EAAwB,CAAxB,CAAlB,UATqE;;EAYrEiJ,MAAAA,EAAE,CAACsb,SAAH,CAAajkB,IAAb,CAAkBsK,MAAlB,EAA0B5L,GAAG,CAACuc,IAA9B,EAAoC5K,KAApC,CAA0C,YAAM,EAAhD;EACH,KAbD,EA7CI;EA6DJ;;EACA/F,IAAAA,MAAM,CAAC6S,KAAP,GAAe,IAAItgB,MAAM,CAAC+rB,KAAP,CAAaW,MAAjB,CAAwBxJ,MAAxB,EAAgC;EAC3C7B,MAAAA,SAAS,EAAE5T,MAAM,CAAC3D,MAAP,CAAcuX,SADkB;EAE3CvH,MAAAA,KAAK,EAAErM,MAAM,CAACqM;EAF6B,KAAhC,CAAf;EAKArM,IAAAA,MAAM,CAACf,KAAP,CAAakB,MAAb,GAAsB,IAAtB;EACAH,IAAAA,MAAM,CAACf,KAAP,CAAaiB,WAAb,GAA2B,CAA3B,CApEI;;EAuEJ,QAAIF,MAAM,CAACzL,SAAP,CAAiB8J,EAArB,EAAyB;EACrB2B,MAAAA,MAAM,CAAC6S,KAAP,CAAaqM,gBAAb;EACH,KAzEG;;;EA4EJlf,IAAAA,MAAM,CAACf,KAAP,CAAasB,IAAb,GAAoB,YAAM;EACtB4d,MAAAA,mBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,IAAjC;EACA,aAAOA,MAAM,CAAC6S,KAAP,CAAatS,IAAb,EAAP;EACH,KAHD;;EAKAP,IAAAA,MAAM,CAACf,KAAP,CAAaoI,KAAb,GAAqB,YAAM;EACvB8W,MAAAA,mBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,KAAjC;EACA,aAAOA,MAAM,CAAC6S,KAAP,CAAaxL,KAAb,EAAP;EACH,KAHD;;EAKArH,IAAAA,MAAM,CAACf,KAAP,CAAakgB,IAAb,GAAoB,YAAM;EACtBnf,MAAAA,MAAM,CAACqH,KAAP;EACArH,MAAAA,MAAM,CAACE,WAAP,GAAqB,CAArB;EACH,KAHD,CAtFI;;;EAAA,QA4FEA,WA5FF,GA4FkBF,MAAM,CAACf,KA5FzB,CA4FEiB,WA5FF;EA6FJnP,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,aAApC,EAAmD;EAC/CvK,MAAAA,GAD+C,iBACzC;EACF,eAAOwL,WAAP;EACH,OAH8C;EAI/CD,MAAAA,GAJ+C,eAI3CoG,IAJ2C,EAIrC;EACN;EAEA;EAHM,YAIEwM,KAJF,GAImC7S,MAJnC,CAIE6S,KAJF;EAAA,YAIS5T,KAJT,GAImCe,MAJnC,CAISf,KAJT;EAAA,YAIgBkB,MAJhB,GAImCH,MAJnC,CAIgBG,MAJhB;EAAA,YAIwB6H,MAJxB,GAImChI,MAJnC,CAIwBgI,MAJxB;EAKN,YAAMoX,YAAY,GAAGjf,MAAM,IAAI,CAAC0S,KAAK,CAACuL,SAAtC,CALM;;EAQNnf,QAAAA,KAAK,CAACwO,OAAN,GAAgB,IAAhB;EACAzX,QAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0Bf,KAA1B,EAAiC,SAAjC,EATM;;EAYNvI,QAAAA,OAAO,CAACC,OAAR,CAAgByoB,YAAY,IAAIvM,KAAK,CAACwM,SAAN,CAAgB,CAAhB,CAAhC;EAAA,SAEKtoB,IAFL,CAEU;EAAA,iBAAM8b,KAAK,CAACyM,cAAN,CAAqBjZ,IAArB,CAAN;EAAA,SAFV;EAAA,SAIKtP,IAJL,CAIU;EAAA,iBAAMqoB,YAAY,IAAIvM,KAAK,CAACxL,KAAN,EAAtB;EAAA,SAJV;EAAA,SAMKtQ,IANL,CAMU;EAAA,iBAAMqoB,YAAY,IAAIvM,KAAK,CAACwM,SAAN,CAAgBrX,MAAhB,CAAtB;EAAA,SANV,EAOKjC,KAPL,CAOW,YAAM;EAEZ,SATL;EAUH;EA1B8C,KAAnD,EA7FI;;EA2HJ,QAAIgG,KAAK,GAAG/L,MAAM,CAAC3D,MAAP,CAAc0P,KAAd,CAAoBqI,QAAhC;EACArjB,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,cAApC,EAAoD;EAChDvK,MAAAA,GADgD,iBAC1C;EACF,eAAOqX,KAAP;EACH,OAH+C;EAIhD9L,MAAAA,GAJgD,eAI5CxP,KAJ4C,EAIrC;EACPuP,QAAAA,MAAM,CAAC6S,KAAP,CACK0M,eADL,CACqB9uB,KADrB,EAEKsG,IAFL,CAEU,YAAM;EACRgV,UAAAA,KAAK,GAAGtb,KAAR;EACAuF,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACH,SALL,EAMK8G,KANL,CAMW,UAAAuC,KAAK,EAAI;EACZ;EACA,cAAIA,KAAK,CAACkX,IAAN,KAAe,OAAnB,EAA4B;EACxB7Y,YAAAA,QAAQ,CAACsI,YAAT,CAAsBvZ,IAAtB,CAA2BsK,MAA3B,EAAmC,EAAnC;EACH;EACJ,SAXL;EAYH;EAjB+C,KAApD,EA5HI;;EAAA,QAiJEgI,MAjJF,GAiJahI,MAAM,CAAC3D,MAjJpB,CAiJE2L,MAjJF;EAkJJjX,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,QAApC,EAA8C;EAC1CvK,MAAAA,GAD0C,iBACpC;EACF,eAAOsT,MAAP;EACH,OAHyC;EAI1C/H,MAAAA,GAJ0C,eAItCxP,KAJsC,EAI/B;EACPuP,QAAAA,MAAM,CAAC6S,KAAP,CAAawM,SAAb,CAAuB5uB,KAAvB,EAA8BsG,IAA9B,CAAmC,YAAM;EACrCiR,UAAAA,MAAM,GAAGvX,KAAT;EACAuF,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,cAAxC;EACH,SAHD;EAIH;EATyC,KAA9C,EAlJI;;EAAA,QA+JEoN,KA/JF,GA+JYrM,MAAM,CAAC3D,MA/JnB,CA+JEgQ,KA/JF;EAgKJtb,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,OAApC,EAA6C;EACzCvK,MAAAA,GADyC,iBACnC;EACF,eAAO2X,KAAP;EACH,OAHwC;EAIzCpM,MAAAA,GAJyC,eAIrCxP,KAJqC,EAI9B;EACP,YAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B,KAA3C;EAEAuP,QAAAA,MAAM,CAAC6S,KAAP,CAAawM,SAAb,CAAuBtqB,MAAM,GAAG,CAAH,GAAOiL,MAAM,CAAC3D,MAAP,CAAc2L,MAAlD,EAA0DjR,IAA1D,CAA+D,YAAM;EACjEsV,UAAAA,KAAK,GAAGtX,MAAR;EACAiB,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,cAAxC;EACH,SAHD;EAIH;EAXwC,KAA7C,EAhKI;;EAAA,QA+KEkV,IA/KF,GA+KWnU,MAAM,CAAC3D,MA/KlB,CA+KE8X,IA/KF;EAgLJpjB,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,MAApC,EAA4C;EACxCvK,MAAAA,GADwC,iBAClC;EACF,eAAOyf,IAAP;EACH,OAHuC;EAIxClU,MAAAA,GAJwC,eAIpCxP,KAJoC,EAI7B;EACP,YAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4BuP,MAAM,CAAC3D,MAAP,CAAc8X,IAAd,CAAmBhC,MAA9D;EAEAnS,QAAAA,MAAM,CAAC6S,KAAP,CAAa4M,OAAb,CAAqB1qB,MAArB,EAA6BgC,IAA7B,CAAkC,YAAM;EACpCod,UAAAA,IAAI,GAAGpf,MAAP;EACH,SAFD;EAGH;EAVuC,KAA5C,EAhLI;;EA8LJ,QAAI2qB,UAAJ;EACA1f,IAAAA,MAAM,CAAC6S,KAAP,CACK8M,WADL,GAEK5oB,IAFL,CAEU,UAAAmB,KAAK,EAAI;EACXwnB,MAAAA,UAAU,GAAGxnB,KAAb;EACAyO,MAAAA,QAAQ,CAAC0J,eAAT,CAAyB3a,IAAzB,CAA8BsK,MAA9B;EACH,KALL,EAMK+F,KANL,CAMW,UAAAuC,KAAK,EAAI;EACZ,MAAA,MAAI,CAAC1H,KAAL,CAAW2H,IAAX,CAAgBD,KAAhB;EACH,KARL;EAUAvX,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,YAApC,EAAkD;EAC9CvK,MAAAA,GAD8C,iBACxC;EACF,eAAOgrB,UAAP;EACH;EAH6C,KAAlD,EAzMI;;EAgNJ3uB,IAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,OAApC,EAA6C;EACzCvK,MAAAA,GADyC,iBACnC;EACF,eAAOsL,MAAM,CAACE,WAAP,KAAuBF,MAAM,CAACmI,QAArC;EACH;EAHwC,KAA7C,EAhNI;;EAuNJzR,IAAAA,OAAO,CAACye,GAAR,CAAY,CAACnV,MAAM,CAAC6S,KAAP,CAAa+M,aAAb,EAAD,EAA+B5f,MAAM,CAAC6S,KAAP,CAAagN,cAAb,EAA/B,CAAZ,EAA2E9oB,IAA3E,CAAgF,UAAA+oB,UAAU,EAAI;EAC1Frc,MAAAA,KAAK,CAACqQ,KAAN,GAAciK,cAAc,CAAC+B,UAAU,CAAC,CAAD,CAAX,EAAgBA,UAAU,CAAC,CAAD,CAA1B,CAA5B;EACArc,MAAAA,KAAK,CAAC4a,cAAN,CAAqB3oB,IAArB,CAA0B,MAA1B,EAAgC+N,KAAK,CAACqQ,KAAtC;EACH,KAHD,EAvNI;;EA6NJ9T,IAAAA,MAAM,CAAC6S,KAAP,CAAakN,YAAb,CAA0B/f,MAAM,CAAC3D,MAAP,CAAcuX,SAAxC,EAAmD7c,IAAnD,CAAwD,UAAAipB,KAAK,EAAI;EAC7DhgB,MAAAA,MAAM,CAAC3D,MAAP,CAAcuX,SAAd,GAA0BoM,KAA1B;EACH,KAFD,EA7NI;;EAkOJhgB,IAAAA,MAAM,CAAC6S,KAAP,CAAaoN,aAAb,GAA6BlpB,IAA7B,CAAkC,UAAA8M,KAAK,EAAI;EACvC7D,MAAAA,MAAM,CAAC3D,MAAP,CAAcwH,KAAd,GAAsBA,KAAtB;EACAxF,MAAAA,EAAE,CAACqb,QAAH,CAAYhkB,IAAZ,CAAiB,MAAjB;EACH,KAHD,EAlOI;;EAwOJsK,IAAAA,MAAM,CAAC6S,KAAP,CAAaqN,cAAb,GAA8BnpB,IAA9B,CAAmC,UAAAmB,KAAK,EAAI;EACxCgI,MAAAA,WAAW,GAAGhI,KAAd;EACAlC,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACH,KAHD,EAxOI;;EA8OJe,IAAAA,MAAM,CAAC6S,KAAP,CAAasN,WAAb,GAA2BppB,IAA3B,CAAgC,UAAAmB,KAAK,EAAI;EACrC8H,MAAAA,MAAM,CAACf,KAAP,CAAakJ,QAAb,GAAwBjQ,KAAxB;EACAlC,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC;EACH,KAHD,EA9OI;;EAoPJe,IAAAA,MAAM,CAAC6S,KAAP,CAAauN,aAAb,GAA6BrpB,IAA7B,CAAkC,UAAA6X,MAAM,EAAI;EACxC5O,MAAAA,MAAM,CAACf,KAAP,CAAaE,UAAb,GAA0ByP,MAA1B;EACAjH,MAAAA,QAAQ,CAAC+J,KAAT,CAAehc,IAAf,CAAoBsK,MAApB;EACH,KAHD;EAKAA,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,WAAhB,EAA6B,gBAAmB;EAAA,2BAAhB2d,IAAgB;EAAA,UAAhBA,IAAgB,0BAAT,EAAS;EAC5C,UAAMiN,YAAY,GAAGjN,IAAI,CAAC1Y,GAAL,CAAS,UAAAxG,GAAG;EAAA,eAAIgP,SAAS,CAAChP,GAAG,CAACoE,IAAL,CAAb;EAAA,OAAZ,CAArB;EACAqP,MAAAA,QAAQ,CAAC8K,UAAT,CAAoB/c,IAApB,CAAyBsK,MAAzB,EAAiCqgB,YAAjC;EACH,KAHD;EAKArgB,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,QAAhB,EAA0B,YAAM;EAC5B;EACAuK,MAAAA,MAAM,CAAC6S,KAAP,CAAayN,SAAb,GAAyBvpB,IAAzB,CAA8B,UAAAoJ,MAAM,EAAI;EACpCge,QAAAA,mBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,CAACG,MAAlC;;EACA,YAAI,CAACA,MAAL,EAAa;EACTnK,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,SAAxC;EACH;EACJ,OALD;;EAOA,UAAI/J,EAAE,CAACpB,OAAH,CAAWkM,MAAM,CAAC6S,KAAP,CAAa/e,OAAxB,KAAoCkM,MAAM,CAACzL,SAAP,CAAiB8J,EAAzD,EAA6D;EACzD,YAAMkiB,KAAK,GAAGvgB,MAAM,CAAC6S,KAAP,CAAa/e,OAA3B,CADyD;EAIzD;;EACAysB,QAAAA,KAAK,CAACnoB,YAAN,CAAmB,UAAnB,EAA+B,CAAC,CAAhC;EACH;EACJ,KAhBD;EAkBA4H,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,MAAhB,EAAwB,YAAM;EAC1B0oB,MAAAA,mBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,IAAjC;EACAhK,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,SAAxC;EACH,KAHD;EAKAe,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,OAAhB,EAAyB,YAAM;EAC3B0oB,MAAAA,mBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,KAAjC;EACH,KAFD;EAIAA,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,YAAhB,EAA8B,UAAA+P,IAAI,EAAI;EAClCxF,MAAAA,MAAM,CAACf,KAAP,CAAawO,OAAb,GAAuB,KAAvB;EACAvN,MAAAA,WAAW,GAAGsF,IAAI,CAACgb,OAAnB;EACAxqB,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACH,KAJD;EAMAe,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,UAAhB,EAA4B,UAAA+P,IAAI,EAAI;EAChCxF,MAAAA,MAAM,CAACf,KAAP,CAAa0N,QAAb,GAAwBnH,IAAI,CAACoH,OAA7B;EACA5W,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,UAAxC,EAFgC;;EAKhC,UAAIgH,QAAQ,CAACT,IAAI,CAACoH,OAAN,EAAe,EAAf,CAAR,KAA+B,CAAnC,EAAsC;EAClC5W,QAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC;EACH,OAP+B;EAUhC;;;EACAe,MAAAA,MAAM,CAAC6S,KAAP,CAAasN,WAAb,GAA2BppB,IAA3B,CAAgC,UAAAmB,KAAK,EAAI;EACrC,YAAIA,KAAK,KAAK8H,MAAM,CAACf,KAAP,CAAakJ,QAA3B,EAAqC;EACjCnI,UAAAA,MAAM,CAACf,KAAP,CAAakJ,QAAb,GAAwBjQ,KAAxB;EACAlC,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC;EACH;EACJ,OALD;EAMH,KAjBD;EAmBAe,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,QAAhB,EAA0B,YAAM;EAC5BuK,MAAAA,MAAM,CAACf,KAAP,CAAawO,OAAb,GAAuB,KAAvB;EACAzX,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,QAAxC;EACH,KAHD;EAKAe,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,OAAhB,EAAyB,YAAM;EAC3BuK,MAAAA,MAAM,CAACf,KAAP,CAAakB,MAAb,GAAsB,IAAtB;EACAnK,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,OAAxC;EACH,KAHD;EAKAe,IAAAA,MAAM,CAAC6S,KAAP,CAAapd,EAAb,CAAgB,OAAhB,EAAyB,UAAAS,MAAM,EAAI;EAC/B8J,MAAAA,MAAM,CAACf,KAAP,CAAaqJ,KAAb,GAAqBpS,MAArB;EACAF,MAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,OAAxC;EACH,KAHD,EA5TI;;EAkUJe,IAAAA,MAAM,CAACvK,EAAP,CAAU,gCAAV,EAA4C,UAAAzB,KAAK,EAAI;EAAA,UACzC0E,MADyC,GAC9BsH,MAAM,CAAC4H,UADuB,CACzClP,MADyC;;EAIjD,UAAIA,MAAM,KAAKsH,MAAM,CAACnJ,QAAP,CAAgBC,SAA/B,EAA0C;EACtC;EACH;;EAED,UAAM/B,MAAM,GAAGf,KAAK,CAACsB,IAAN,KAAe,iBAA9B;;EARiD,kCASlCmO,KAAK,CAACqQ,KAAN,CAAY1e,KAAZ,CAAkB,GAAlB,EAAuBsF,GAAvB,CAA2BzJ,MAA3B,CATkC;EAAA;EAAA,UAS1CkmB,CAT0C;EAAA,UASvCE,CATuC;;EAUjD,UAAMoJ,SAAS,GAAGtJ,CAAC,GAAGE,CAAJ,GAAQ,OAAR,GAAkB,QAApC;EAEA3e,MAAAA,MAAM,CAACmE,KAAP,CAAa4jB,SAAb,IAA0B1rB,MAAM,aAAM0O,KAAK,CAAC8a,OAAZ,SAAyB,IAAzD;EACH,KAbD,EAlUI;;EAkVJ3nB,IAAAA,UAAU,CAAC;EAAA,aAAMyH,EAAE,CAACmb,KAAH,CAAS9jB,IAAT,CAAcsK,MAAd,CAAN;EAAA,KAAD,EAA8B,CAA9B,CAAV;EACH;EA1XS,CAAd;;EC/CA;AACA;EAaA,SAAS4d,SAAT,CAAiBxpB,GAAjB,EAAsB;EAClB,MAAIc,EAAE,CAACb,KAAH,CAASD,GAAT,CAAJ,EAAmB;EACf,WAAO,IAAP;EACH;;EAED,MAAMypB,KAAK,GAAG,8DAAd;EACA,SAAOzpB,GAAG,CAAC4G,KAAJ,CAAU6iB,KAAV,IAAmBnb,MAAM,CAACob,EAA1B,GAA+B1pB,GAAtC;EACH;;;EAGD,SAAS+pB,qBAAT,CAA6B5d,IAA7B,EAAmC;EAC/B,MAAIA,IAAI,IAAI,CAAC,KAAKsS,KAAL,CAAWuL,SAAxB,EAAmC;EAC/B,SAAKvL,KAAL,CAAWuL,SAAX,GAAuB,IAAvB;EACH;;EACD,MAAI,KAAKnf,KAAL,CAAWkB,MAAX,KAAsBI,IAA1B,EAAgC;EAC5B,SAAKtB,KAAL,CAAWkB,MAAX,GAAoB,CAACI,IAArB;EACAvK,IAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoCsB,IAAI,GAAG,MAAH,GAAY,OAApD;EACH;EACJ;;EAED,IAAMmD,OAAO,GAAG;EACZgO,EAAAA,KADY,mBACJ;EAAA;;EACJ;EACAlX,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcI,OAAf,EAAwB,KAAKoF,MAAL,CAAYC,UAAZ,CAAuBuW,KAA/C,EAAsD,IAAtD,CAAX,CAFI;;EAKJnP,IAAAA,OAAO,CAAC2a,cAAR,CAAuB3oB,IAAvB,CAA4B,IAA5B,EALI;;EAQJ,QAAIR,EAAE,CAAC3B,MAAH,CAAUhB,MAAM,CAACmuB,EAAjB,KAAwBxrB,EAAE,CAACxB,QAAH,CAAYnB,MAAM,CAACmuB,EAAP,CAAUzB,MAAtB,CAA5B,EAA2D;EACvDvb,MAAAA,OAAO,CAACjN,KAAR,CAAcf,IAAd,CAAmB,IAAnB;EACH,KAFD,MAEO;EACH;EACA+nB,MAAAA,UAAU,CAAC,KAAKphB,MAAL,CAAYuU,IAAZ,CAAiBlN,OAAjB,CAAyB8R,GAA1B,CAAV,CAAyCzP,KAAzC,CAA+C,UAAAuC,KAAK,EAAI;EACpD,QAAA,KAAI,CAAC1H,KAAL,CAAW2H,IAAX,CAAgB,4BAAhB,EAA8CD,KAA9C;EACH,OAFD,EAFG;EAOH;;EACA/V,MAAAA,MAAM,CAACouB,uBAAP,GAAiCpuB,MAAM,CAACouB,uBAAP,IAAkC,EAAnE,CARG;;EAWHpuB,MAAAA,MAAM,CAACouB,uBAAP,CAA+BnrB,IAA/B,CAAoC,YAAM;EACtCkO,QAAAA,OAAO,CAACjN,KAAR,CAAcf,IAAd,CAAmB,KAAnB;EACH,OAFD,EAXG;;EAgBHnD,MAAAA,MAAM,CAACquB,uBAAP,GAAiC,YAAM;EACnCruB,QAAAA,MAAM,CAACouB,uBAAP,CAA+BtrB,OAA/B,CAAuC,UAAAP,QAAQ,EAAI;EAC/CA,UAAAA,QAAQ;EACX,SAFD;EAGH,OAJD;EAKH;EACJ,GAjCW;EAmCZ;EACA+rB,EAAAA,QApCY,oBAoCHC,OApCG,EAoCM;EAAA;;EACd;EACA;EACA;EACA,QAAI5rB,EAAE,CAACxB,QAAH,CAAY,KAAKmf,KAAL,CAAWkO,YAAvB,CAAJ,EAA0C;EAAA,kCACpB,KAAKlO,KAAL,CAAWkO,YAAX,EADoB;EAAA,UAC9Bld,KAD8B,yBAC9BA,KAD8B;;EAGtC,UAAI3O,EAAE,CAACb,KAAH,CAASwP,KAAT,CAAJ,EAAqB;EACjB,aAAKxH,MAAL,CAAYwH,KAAZ,GAAoBA,KAApB;EACAxF,QAAAA,EAAE,CAACqb,QAAH,CAAYhkB,IAAZ,CAAiB,IAAjB;EACA;EACH;EACJ,KAZa;;;EAed,QAAMyC,GAAG,GAAG,KAAKkE,MAAL,CAAYtJ,IAAZ,CAAiBwjB,MAA7B;;EACA,QAAIrhB,EAAE,CAAChC,MAAH,CAAUiF,GAAV,KAAkB,CAACjD,EAAE,CAACb,KAAH,CAAS8D,GAAT,CAAvB,EAAsC;EAClC,UAAM/D,GAAG,GAAG8N,MAAM,CAAC,KAAK7F,MAAL,CAAYuU,IAAZ,CAAiBlN,OAAjB,CAAyBtF,GAA1B,EAA+B0iB,OAA/B,EAAwC3oB,GAAxC,CAAlB;EAEAoM,MAAAA,KAAK,CAACnQ,GAAD,CAAL,CACK2C,IADL,CACU,UAAA+O,MAAM,EAAI;EACZ,YAAI5Q,EAAE,CAAC3B,MAAH,CAAUuS,MAAV,CAAJ,EAAuB;EACnB,UAAA,MAAI,CAACzJ,MAAL,CAAYwH,KAAZ,GAAoBiC,MAAM,CAACkb,KAAP,CAAa,CAAb,EAAgBC,OAAhB,CAAwBpd,KAA5C;EACAxF,UAAAA,EAAE,CAACqb,QAAH,CAAYhkB,IAAZ,CAAiB,MAAjB;EACH;EACJ,OANL,EAOKqQ,KAPL,CAOW,YAAM,EAPjB;EAQH;EACJ,GAhEW;EAkEZ;EACAsY,EAAAA,cAnEY,4BAmEK;EACb,QAAMvK,KAAK,GAAG,KAAKzX,MAAL,CAAYyX,KAAZ,CAAkB1e,KAAlB,CAAwB,GAAxB,CAAd;EACA,SAAKyB,QAAL,CAAcI,OAAd,CAAsB4F,KAAtB,CAA4B2hB,aAA5B,aAA+C,MAAM1K,KAAK,CAAC,CAAD,CAAX,GAAiBA,KAAK,CAAC,CAAD,CAArE;EACH,GAtEW;EAwEZ;EACArd,EAAAA,KAzEY,sBAyEJ;EACJ,QAAMuJ,MAAM,GAAG,IAAf,CADI;;EAIJ,QAAMkhB,SAAS,GAAGlhB,MAAM,CAACf,KAAP,CAAaY,YAAb,CAA0B,IAA1B,CAAlB;;EACA,QAAI,CAAC3K,EAAE,CAACb,KAAH,CAAS6sB,SAAT,CAAD,IAAwBA,SAAS,CAAC/tB,UAAV,CAAqB,UAArB,CAA5B,EAA8D;EAC1D;EACH,KAPG;;;EAUJ,QAAIyM,MAAM,GAAGI,MAAM,CAACf,KAAP,CAAaY,YAAb,CAA0B,KAA1B,CAAb,CAVI;;EAaJ,QAAI3K,EAAE,CAACb,KAAH,CAASuL,MAAT,CAAJ,EAAsB;EAClBA,MAAAA,MAAM,GAAGI,MAAM,CAACf,KAAP,CAAaY,YAAb,CAA0B,KAAKxD,MAAL,CAAYtE,UAAZ,CAAuB8a,KAAvB,CAA6B1Y,EAAvD,CAAT;EACH,KAfG;;;EAkBJ,QAAM2mB,OAAO,GAAGlD,SAAO,CAAChe,MAAD,CAAvB;EACA,QAAMzF,EAAE,GAAG2H,UAAU,CAAC9B,MAAM,CAAC/B,QAAR,CAArB,CAnBI;;EAAA,QAsBI4X,MAtBJ,GAsBe7V,MAtBf,CAsBI6V,MAtBJ;;EAyBJ,QAAM/e,SAAS,GAAGuB,aAAa,CAAC,KAAD,EAAQ;EAAE8B,MAAAA,EAAE,EAAFA,EAAF;EAAM0b,MAAAA,MAAM,EAANA;EAAN,KAAR,CAA/B;EACA7V,IAAAA,MAAM,CAACf,KAAP,GAAehG,cAAc,CAACnC,SAAD,EAAYkJ,MAAM,CAACf,KAAnB,CAA7B,CA1BI;;EA6BJ,QAAMkiB,SAAS,GAAG,SAAZA,SAAY,CAAAjf,SAAM;EAAA,kDAAkC4e,OAAlC,cAA6C5e,SAA7C;EAAA,KAAxB,CA7BI;;;EAgCJ6W,IAAAA,SAAS,CAACoI,SAAS,CAAC,QAAD,CAAV,EAAsB,GAAtB,CAAT;EAAA,KACKpb,KADL,CACW;EAAA,aAAMgT,SAAS,CAACoI,SAAS,CAAC,IAAD,CAAV,EAAkB,GAAlB,CAAf;EAAA,KADX;EAAA,KAEKpb,KAFL,CAEW;EAAA,aAAMgT,SAAS,CAACoI,SAAS,CAAC,IAAD,CAAV,CAAf;EAAA,KAFX;EAAA,KAGKpqB,IAHL,CAGU,UAAAkiB,KAAK;EAAA,aAAI5a,EAAE,CAACsb,SAAH,CAAajkB,IAAb,CAAkBsK,MAAlB,EAA0BiZ,KAAK,CAAC3Y,GAAhC,CAAJ;EAAA,KAHf,EAIKvJ,IAJL,CAIU,UAAAoqB,SAAS,EAAI;EACf;EACA,UAAI,CAACA,SAAS,CAACjmB,QAAV,CAAmB,QAAnB,CAAL,EAAmC;EAC/B8E,QAAAA,MAAM,CAACnJ,QAAP,CAAgBgf,MAAhB,CAAuBhZ,KAAvB,CAA6Bmd,cAA7B,GAA8C,OAA9C;EACH;EACJ,KATL,EAUKjU,KAVL,CAUW,YAAM,EAVjB,EAhCI;EA6CJ;;EACA/F,IAAAA,MAAM,CAAC6S,KAAP,GAAe,IAAItgB,MAAM,CAACmuB,EAAP,CAAUzB,MAAd,CAAqB9kB,EAArB,EAAyB;EACpC2mB,MAAAA,OAAO,EAAPA,OADoC;EAEpCM,MAAAA,UAAU,EAAE;EACRzN,QAAAA,QAAQ,EAAE3T,MAAM,CAAC3D,MAAP,CAAcsX,QAAd,GAAyB,CAAzB,GAA6B,CAD/B;EACkC;EAC1C0N,QAAAA,EAAE,EAAErhB,MAAM,CAAC3D,MAAP,CAAcglB,EAFV;EAEc;EACtB1a,QAAAA,QAAQ,EAAE3G,MAAM,CAACzL,SAAP,CAAiB8J,EAAjB,GAAsB,CAAtB,GAA0B,CAH5B;EAG+B;EACvCijB,QAAAA,GAAG,EAAE,CAJG;EAIA;EACRC,QAAAA,QAAQ,EAAE,CALF;EAKK;EACbC,QAAAA,cAAc,EAAE,CANR;EAMW;EACnBC,QAAAA,cAAc,EAAE,CAPR;EAOW;EACnBC,QAAAA,SAAS,EAAE,CARH;EAQM;EACdxjB,QAAAA,WAAW,EAAE,CATL;EASQ;EAEhB;EACA;EACAyjB,QAAAA,eAAe,EAAEpvB,MAAM,GAAGA,MAAM,CAACuU,QAAP,CAAgB6J,IAAnB,GAA0B,IAbzC;EAeR;EACAiR,QAAAA,cAAc,EAAE5hB,MAAM,CAAC2H,QAAP,CAAgBwK,MAAhB,GAAyB,CAAzB,GAA6B,CAhBrC;EAiBR0P,QAAAA,YAAY,EAAE7hB,MAAM,CAAC3D,MAAP,CAAcsL,QAAd,CAAuBoH;EAjB7B,OAFwB;EAqBpC5Z,MAAAA,MAAM,EAAE;EACJ2sB,QAAAA,OADI,mBACI9tB,KADJ,EACW;EACX;EACA,cAAI,CAACgM,MAAM,CAACf,KAAP,CAAaqJ,KAAlB,EAAyB;EACrB,gBAAM0S,IAAI,GAAGhnB,KAAK,CAACwR,IAAnB,CADqB;;EAGrB,gBAAMuc,OAAO,GACT;EACI,iBAAG,sOADP;EAEI,iBAAG,sHAFP;EAGI,mBAAK,oIAHT;EAII,mBAAK,sFAJT;EAKI,mBAAK;EALT,cAME/G,IANF,KAMW,0BAPf;EASAhb,YAAAA,MAAM,CAACf,KAAP,CAAaqJ,KAAb,GAAqB;EAAE0S,cAAAA,IAAI,EAAJA,IAAF;EAAQ+G,cAAAA,OAAO,EAAPA;EAAR,aAArB;EAEA/rB,YAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,OAAxC;EACH;EACJ,SAnBG;EAoBJ+iB,QAAAA,oBApBI,gCAoBiBhuB,KApBjB,EAoBwB;EACxB;EACA,cAAMiuB,QAAQ,GAAGjuB,KAAK,CAAC0E,MAAvB,CAFwB;;EAKxBsH,UAAAA,MAAM,CAACf,KAAP,CAAaijB,YAAb,GAA4BD,QAAQ,CAACE,eAAT,EAA5B;EAEAnsB,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACH,SA5BG;EA6BJmjB,QAAAA,OA7BI,mBA6BIpuB,KA7BJ,EA6BW;EACX;EACA,cAAIkB,EAAE,CAACxB,QAAH,CAAYsM,MAAM,CAACf,KAAP,CAAasB,IAAzB,CAAJ,EAAoC;EAChC;EACH,WAJU;;;EAMX,cAAM0hB,QAAQ,GAAGjuB,KAAK,CAAC0E,MAAvB,CANW;;EASXgL,UAAAA,OAAO,CAACmd,QAAR,CAAiBnrB,IAAjB,CAAsBsK,MAAtB,EAA8B8gB,OAA9B,EATW;;EAYX9gB,UAAAA,MAAM,CAACf,KAAP,CAAasB,IAAb,GAAoB,YAAM;EACtB4d,YAAAA,qBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,IAAjC;EACAiiB,YAAAA,QAAQ,CAACI,SAAT;EACH,WAHD;;EAKAriB,UAAAA,MAAM,CAACf,KAAP,CAAaoI,KAAb,GAAqB,YAAM;EACvB8W,YAAAA,qBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,KAAjC;EACAiiB,YAAAA,QAAQ,CAACK,UAAT;EACH,WAHD;;EAKAtiB,UAAAA,MAAM,CAACf,KAAP,CAAakgB,IAAb,GAAoB,YAAM;EACtB8C,YAAAA,QAAQ,CAACM,SAAT;EACH,WAFD;;EAIAviB,UAAAA,MAAM,CAACf,KAAP,CAAakJ,QAAb,GAAwB8Z,QAAQ,CAAC9B,WAAT,EAAxB;EACAngB,UAAAA,MAAM,CAACf,KAAP,CAAakB,MAAb,GAAsB,IAAtB,CA3BW;;EA8BXH,UAAAA,MAAM,CAACf,KAAP,CAAaiB,WAAb,GAA2B,CAA3B;EACAnP,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,aAApC,EAAmD;EAC/CvK,YAAAA,GAD+C,iBACzC;EACF,qBAAOzD,MAAM,CAACgxB,QAAQ,CAAC/B,cAAT,EAAD,CAAb;EACH,aAH8C;EAI/CjgB,YAAAA,GAJ+C,eAI3CoG,IAJ2C,EAIrC;EACN;EACA,kBAAIrG,MAAM,CAACG,MAAP,IAAiB,CAACH,MAAM,CAAC6S,KAAP,CAAauL,SAAnC,EAA8C;EAC1Cpe,gBAAAA,MAAM,CAAC6S,KAAP,CAAapL,IAAb;EACH,eAJK;;;EAONzH,cAAAA,MAAM,CAACf,KAAP,CAAawO,OAAb,GAAuB,IAAvB;EACAzX,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,SAAxC,EARM;;EAWNgjB,cAAAA,QAAQ,CAAC/E,MAAT,CAAgB7W,IAAhB;EACH;EAhB8C,WAAnD,EA/BW;;EAmDXtV,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,cAApC,EAAoD;EAChDvK,YAAAA,GADgD,iBAC1C;EACF,qBAAOutB,QAAQ,CAACE,eAAT,EAAP;EACH,aAH+C;EAIhDliB,YAAAA,GAJgD,eAI5CxP,KAJ4C,EAIrC;EACPwxB,cAAAA,QAAQ,CAAC1C,eAAT,CAAyB9uB,KAAzB;EACH;EAN+C,WAApD,EAnDW;;EAAA,cA6DLuX,MA7DK,GA6DMhI,MAAM,CAAC3D,MA7Db,CA6DL2L,MA7DK;EA8DXjX,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,QAApC,EAA8C;EAC1CvK,YAAAA,GAD0C,iBACpC;EACF,qBAAOsT,MAAP;EACH,aAHyC;EAI1C/H,YAAAA,GAJ0C,eAItCxP,KAJsC,EAI/B;EACPuX,cAAAA,MAAM,GAAGvX,KAAT;EACAwxB,cAAAA,QAAQ,CAAC5C,SAAT,CAAmBrX,MAAM,GAAG,GAA5B;EACAhS,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,cAAxC;EACH;EARyC,WAA9C,EA9DW;;EAAA,cA0ELoN,KA1EK,GA0EKrM,MAAM,CAAC3D,MA1EZ,CA0ELgQ,KA1EK;EA2EXtb,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,OAApC,EAA6C;EACzCvK,YAAAA,GADyC,iBACnC;EACF,qBAAO2X,KAAP;EACH,aAHwC;EAIzCpM,YAAAA,GAJyC,eAIrCxP,KAJqC,EAI9B;EACP,kBAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B4b,KAA3C;EACAA,cAAAA,KAAK,GAAGtX,MAAR;EACAktB,cAAAA,QAAQ,CAACltB,MAAM,GAAG,MAAH,GAAY,QAAnB,CAAR;EACAiB,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,cAAxC;EACH;EATwC,WAA7C,EA3EW;;EAwFXlO,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,YAApC,EAAkD;EAC9CvK,YAAAA,GAD8C,iBACxC;EACF,qBAAOutB,QAAQ,CAACtC,WAAT,EAAP;EACH;EAH6C,WAAlD,EAxFW;;EA+FX5uB,UAAAA,MAAM,CAAC0D,cAAP,CAAsBuL,MAAM,CAACf,KAA7B,EAAoC,OAApC,EAA6C;EACzCvK,YAAAA,GADyC,iBACnC;EACF,qBAAOsL,MAAM,CAACE,WAAP,KAAuBF,MAAM,CAACmI,QAArC;EACH;EAHwC,WAA7C,EA/FW;;EAsGXnI,UAAAA,MAAM,CAACxL,OAAP,CAAeuX,KAAf,GAAuBkW,QAAQ,CAACO,yBAAT,EAAvB,CAtGW;;EAyGX,cAAIxiB,MAAM,CAACzL,SAAP,CAAiB8J,EAArB,EAAyB;EACrB2B,YAAAA,MAAM,CAACf,KAAP,CAAa7G,YAAb,CAA0B,UAA1B,EAAsC,CAAC,CAAvC;EACH;;EAEDpC,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACAjJ,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC,EA9GW;;EAiHXwjB,UAAAA,aAAa,CAACziB,MAAM,CAACoa,MAAP,CAAcsI,SAAf,CAAb,CAjHW;;EAoHX1iB,UAAAA,MAAM,CAACoa,MAAP,CAAcsI,SAAd,GAA0BC,WAAW,CAAC,YAAM;EACxC;EACA3iB,YAAAA,MAAM,CAACf,KAAP,CAAa0N,QAAb,GAAwBsV,QAAQ,CAACW,sBAAT,EAAxB,CAFwC;;EAKxC,gBAAI5iB,MAAM,CAACf,KAAP,CAAa4jB,YAAb,KAA8B,IAA9B,IAAsC7iB,MAAM,CAACf,KAAP,CAAa4jB,YAAb,GAA4B7iB,MAAM,CAACf,KAAP,CAAa0N,QAAnF,EAA6F;EACzF3W,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,UAAxC;EACH,aAPuC;;;EAUxCe,YAAAA,MAAM,CAACf,KAAP,CAAa4jB,YAAb,GAA4B7iB,MAAM,CAACf,KAAP,CAAa0N,QAAzC,CAVwC;;EAaxC,gBAAI3M,MAAM,CAACf,KAAP,CAAa0N,QAAb,KAA0B,CAA9B,EAAiC;EAC7B8V,cAAAA,aAAa,CAACziB,MAAM,CAACoa,MAAP,CAAcsI,SAAf,CAAb,CAD6B;;EAI7B1sB,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC;EACH;EACJ,WAnBoC,EAmBlC,GAnBkC,CAArC,CApHW;;EA0IXrI,UAAAA,UAAU,CAAC;EAAA,mBAAMyH,EAAE,CAACmb,KAAH,CAAS9jB,IAAT,CAAcsK,MAAd,CAAN;EAAA,WAAD,EAA8B,EAA9B,CAAV;EACH,SAxKG;EAyKJ8iB,QAAAA,aAzKI,yBAyKU9uB,KAzKV,EAyKiB;EACjB;EACA,cAAMiuB,QAAQ,GAAGjuB,KAAK,CAAC0E,MAAvB,CAFiB;;EAKjB+pB,UAAAA,aAAa,CAACziB,MAAM,CAACoa,MAAP,CAAcpE,OAAf,CAAb;EAEA,cAAM+M,MAAM,GAAG/iB,MAAM,CAACf,KAAP,CAAawO,OAAb,IAAwB,CAAC,CAAD,EAAI,CAAJ,EAAOvS,QAAP,CAAgBlH,KAAK,CAACwR,IAAtB,CAAvC;;EAEA,cAAIud,MAAJ,EAAY;EACR;EACA/iB,YAAAA,MAAM,CAACf,KAAP,CAAawO,OAAb,GAAuB,KAAvB;EACAzX,YAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,QAAxC;EACH,WAbgB;EAgBjB;EACA;EACA;EACA;EACA;EACA;;;EACA,kBAAQjL,KAAK,CAACwR,IAAd;EACI,iBAAK,CAAC,CAAN;EACI;EACAxP,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC,EAFJ;;EAKIe,cAAAA,MAAM,CAACf,KAAP,CAAa0N,QAAb,GAAwBsV,QAAQ,CAACW,sBAAT,EAAxB;EACA5sB,cAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,UAAxC;EAEA;;EAEJ,iBAAK,CAAL;EACIkf,cAAAA,qBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,KAAjC,EADJ;;EAII,kBAAIA,MAAM,CAACf,KAAP,CAAakV,IAAjB,EAAuB;EACnB;EACA8N,gBAAAA,QAAQ,CAACM,SAAT;EACAN,gBAAAA,QAAQ,CAACI,SAAT;EACH,eAJD,MAIO;EACHrsB,gBAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,OAAxC;EACH;;EAED;;EAEJ,iBAAK,CAAL;EACI;EACA,kBAAIe,MAAM,CAACf,KAAP,CAAakB,MAAb,IAAuB,CAACH,MAAM,CAAC6S,KAAP,CAAauL,SAAzC,EAAoD;EAChDpe,gBAAAA,MAAM,CAACf,KAAP,CAAaoI,KAAb;EACH,eAFD,MAEO;EACH8W,gBAAAA,qBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,IAAjC;EAEAhK,gBAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,SAAxC,EAHG;;EAMHe,gBAAAA,MAAM,CAACoa,MAAP,CAAcpE,OAAd,GAAwB2M,WAAW,CAAC,YAAM;EACtC3sB,kBAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,YAAxC;EACH,iBAFkC,EAEhC,EAFgC,CAAnC,CANG;EAWH;EACA;;EACA,oBAAIe,MAAM,CAACf,KAAP,CAAakJ,QAAb,KAA0B8Z,QAAQ,CAAC9B,WAAT,EAA9B,EAAsD;EAClDngB,kBAAAA,MAAM,CAACf,KAAP,CAAakJ,QAAb,GAAwB8Z,QAAQ,CAAC9B,WAAT,EAAxB;EACAnqB,kBAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACf,KAAjC,EAAwC,gBAAxC;EACH;EACJ;;EAED;;EAEJ,iBAAK,CAAL;EACI;EACA,kBAAI,CAACe,MAAM,CAACqM,KAAZ,EAAmB;EACfrM,gBAAAA,MAAM,CAAC6S,KAAP,CAAamQ,MAAb;EACH;;EACD7E,cAAAA,qBAAmB,CAACzoB,IAApB,CAAyBsK,MAAzB,EAAiC,KAAjC;EAEA;;EAEJ;EACI;EA5DR;;EA+DAhK,UAAAA,YAAY,CAACN,IAAb,CAAkBsK,MAAlB,EAA0BA,MAAM,CAACnJ,QAAP,CAAgBC,SAA1C,EAAqD,aAArD,EAAoE,KAApE,EAA2E;EACvEkkB,YAAAA,IAAI,EAAEhnB,KAAK,CAACwR;EAD2D,WAA3E;EAGH;EAjQG;EArB4B,KAAzB,CAAf;EAyRH;EAhZW,CAAhB;;EClCA;AACA,EAQA,IAAMvG,KAAK,GAAG;EACV;EACAyS,EAAAA,KAFU,mBAEF;EACJ;EACA,QAAI,CAAC,KAAKzS,KAAV,EAAiB;EACb,WAAK2B,KAAL,CAAW2H,IAAX,CAAgB,yBAAhB;EACA;EACH,KALG;;;EAQJ/N,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBhH,IAAvB,CAA4BuE,OAA5B,CAAoC,KAApC,EAA2C,KAAKvE,IAAhD,CAA1B,EAAiF,IAAjF,CAAX,CARI;;EAWJkF,IAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB2B,QAAvB,CAAgCpE,OAAhC,CAAwC,KAAxC,EAA+C,KAAKoE,QAApD,CAA1B,EAAyF,IAAzF,CAAX,CAXI;EAcJ;;EACA,QAAI,KAAK4S,OAAT,EAAkB;EACdrW,MAAAA,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuBhH,IAAvB,CAA4BuE,OAA5B,CAAoC,KAApC,EAA2C,OAA3C,CAA1B,EAA+E,IAA/E,CAAX;EACH,KAjBG;;;EAoBJ,QAAI,KAAK8X,OAAT,EAAkB;EACd;EACA,WAAK9a,QAAL,CAAcI,OAAd,GAAwBoB,aAAa,CAAC,KAAD,EAAQ;EACzC6B,QAAAA,KAAK,EAAE,KAAKmC,MAAL,CAAYC,UAAZ,CAAuByB;EADW,OAAR,CAArC,CAFc;;EAOd/G,MAAAA,IAAI,CAAC,KAAKiI,KAAN,EAAa,KAAKpI,QAAL,CAAcI,OAA3B,CAAJ,CAPc;;EAUd,WAAKJ,QAAL,CAAcgf,MAAd,GAAuBxd,aAAa,CAAC,KAAD,EAAQ;EACxC6B,QAAAA,KAAK,EAAE,KAAKmC,MAAL,CAAYC,UAAZ,CAAuBuZ;EADU,OAAR,CAApC;EAIA,WAAKhf,QAAL,CAAcI,OAAd,CAAsBW,WAAtB,CAAkC,KAAKf,QAAL,CAAcgf,MAAhD;EACH;;EAED,QAAI,KAAK7W,OAAT,EAAkB;EACdS,MAAAA,KAAK,CAACM,MAAN,CAAarK,IAAb,CAAkB,IAAlB;EACH,KAFD,MAEO,IAAI,KAAKkc,SAAT,EAAoB;EACvBlO,MAAAA,OAAO,CAACgO,KAAR,CAAchc,IAAd,CAAmB,IAAnB;EACH,KAFM,MAEA,IAAI,KAAKwZ,OAAT,EAAkB;EACrBzL,MAAAA,KAAK,CAACiO,KAAN,CAAYhc,IAAZ,CAAiB,IAAjB;EACH;EACJ;EA9CS,CAAd;;MCOMutB;;;EACF;;;;;EAKA,eAAYjjB,MAAZ,EAAoB;EAAA;;EAAA;;EAChB,SAAKA,MAAL,GAAcA,MAAd;EACA,SAAKwW,WAAL,GAAmBxW,MAAM,CAAC3D,MAAP,CAAc0Z,GAAd,CAAkBS,WAArC;EACA,SAAKR,OAAL,GAAe,KAAf;EACA,SAAKgG,WAAL,GAAmB,KAAnB;EACA,SAAKnlB,QAAL,GAAgB;EACZC,MAAAA,SAAS,EAAE,IADC;EAEZosB,MAAAA,gBAAgB,EAAE;EAFN,KAAhB;EAIA,SAAKC,OAAL,GAAe,IAAf;EACA,SAAKC,MAAL,GAAc,IAAd;EACA,SAAKC,SAAL,GAAiB,IAAjB;EACA,SAAKluB,MAAL,GAAc,EAAd;EACA,SAAKmuB,WAAL,GAAmB,IAAnB;EACA,SAAKC,cAAL,GAAsB,IAAtB,CAdgB;;EAiBhB,SAAKtH,cAAL,GAAsB,IAAIvlB,OAAJ,CAAY,UAACC,OAAD,EAAU8N,MAAV,EAAqB;EACnD;EACA,MAAA,KAAI,CAAChP,EAAL,CAAQ,QAAR,EAAkBkB,OAAlB,EAFmD;;;EAKnD,MAAA,KAAI,CAAClB,EAAL,CAAQ,OAAR,EAAiBgP,MAAjB;EACH,KANqB,CAAtB;EAQA,SAAKjE,IAAL;EACH;;;;;EAQD;;;6BAGO;EAAA;;EACH,UAAI,KAAKuD,OAAT,EAAkB;EACd;EACA,YAAI,CAAC7O,EAAE,CAAC3B,MAAH,CAAUhB,MAAM,CAACgkB,MAAjB,CAAD,IAA6B,CAACrhB,EAAE,CAAC3B,MAAH,CAAUhB,MAAM,CAACgkB,MAAP,CAAciN,GAAxB,CAAlC,EAAgE;EAC5D/F,UAAAA,UAAU,CAAC,KAAKzd,MAAL,CAAY3D,MAAZ,CAAmBuU,IAAnB,CAAwB8E,SAAxB,CAAkCF,GAAnC,CAAV,CACKze,IADL,CACU,YAAM;EACR,YAAA,MAAI,CAACN,KAAL;EACH,WAHL,EAIKsP,KAJL,CAIW,YAAM;EACT;EACA,YAAA,MAAI,CAAC0d,OAAL,CAAa,OAAb,EAAsB,IAAI3e,KAAJ,CAAU,+BAAV,CAAtB;EACH,WAPL;EAQH,SATD,MASO;EACH,eAAKrO,KAAL;EACH;EACJ;EACJ;EAED;;;;;;iCAGQ;EAAA;;EACJ;EACA;EACA,WAAKitB,gBAAL,CAAsB,KAAtB,EAA6B,SAA7B,EAHI;;EAMJ,WAAKzH,cAAL,CAAoBllB,IAApB,CAAyB,YAAM;EAC3B,QAAA,MAAI,CAAC4sB,gBAAL,CAAsB,sBAAtB;EACH,OAFD,EANI;;EAWJ,WAAK/X,SAAL,GAXI;;EAcJ,WAAKgY,QAAL;EACH;;;;;EAmBD;;;;;;;;iCAQW;EACP;EACA,WAAK/sB,QAAL,CAAcC,SAAd,GAA0BuB,aAAa,CAAC,KAAD,EAAQ;EAC3C6B,QAAAA,KAAK,EAAE,KAAK8F,MAAL,CAAY3D,MAAZ,CAAmBC,UAAnB,CAA8ByZ;EADM,OAAR,CAAvC;EAGA,WAAK/V,MAAL,CAAYnJ,QAAZ,CAAqBC,SAArB,CAA+Bc,WAA/B,CAA2C,KAAKf,QAAL,CAAcC,SAAzD,EALO;;EAQPyf,MAAAA,MAAM,CAACiN,GAAP,CAAW9b,QAAX,CAAoBmc,YAApB,CAAiCtN,MAAM,CAACiN,GAAP,CAAWM,cAAX,CAA0BC,SAA1B,CAAoCC,OAArE,EARO;;EAWPzN,MAAAA,MAAM,CAACiN,GAAP,CAAW9b,QAAX,CAAoBuc,SAApB,CAA8B,KAAKjkB,MAAL,CAAY3D,MAAZ,CAAmB0Z,GAAnB,CAAuBhH,QAArD,EAXO;EAcP;;EACA,WAAKlY,QAAL,CAAcqsB,gBAAd,GAAiC,IAAI3M,MAAM,CAACiN,GAAP,CAAWU,kBAAf,CAAkC,KAAKrtB,QAAL,CAAcC,SAAhD,CAAjC,CAfO;;EAkBP,WAAKqtB,UAAL;EACH;EAED;;;;;;mCAGa;EAAA;;EAAA,UACDrtB,SADC,GACa,KAAKkJ,MAAL,CAAYnJ,QADzB,CACDC,SADC;;EAGT,UAAI;EACA;EACA,aAAKssB,MAAL,GAAc,IAAI7M,MAAM,CAACiN,GAAP,CAAWY,SAAf,CAAyB,KAAKvtB,QAAL,CAAcqsB,gBAAvC,CAAd,CAFA;;EAKA,aAAKE,MAAL,CAAYzuB,gBAAZ,CACI4hB,MAAM,CAACiN,GAAP,CAAWa,qBAAX,CAAiCC,IAAjC,CAAsCC,kBAD1C,EAEI,UAAAvwB,KAAK;EAAA,iBAAI,MAAI,CAACwwB,kBAAL,CAAwBxwB,KAAxB,CAAJ;EAAA,SAFT,EAGI,KAHJ;EAKA,aAAKovB,MAAL,CAAYzuB,gBAAZ,CAA6B4hB,MAAM,CAACiN,GAAP,CAAWiB,YAAX,CAAwBH,IAAxB,CAA6BI,QAA1D,EAAoE,UAAApc,KAAK;EAAA,iBAAI,MAAI,CAACqc,SAAL,CAAerc,KAAf,CAAJ;EAAA,SAAzE,EAAoG,KAApG,EAVA;;EAaA,YAAM5D,OAAO,GAAG,IAAI6R,MAAM,CAACiN,GAAP,CAAWoB,UAAf,EAAhB;EACAlgB,QAAAA,OAAO,CAACmgB,QAAR,GAAmB,KAAKC,MAAxB,CAdA;EAiBA;;EACApgB,QAAAA,OAAO,CAACqgB,iBAAR,GAA4BjuB,SAAS,CAACkuB,WAAtC;EACAtgB,QAAAA,OAAO,CAACugB,kBAAR,GAA6BnuB,SAAS,CAACkG,YAAvC;EACA0H,QAAAA,OAAO,CAACwgB,oBAAR,GAA+BpuB,SAAS,CAACkuB,WAAzC;EACAtgB,QAAAA,OAAO,CAACygB,qBAAR,GAAgCruB,SAAS,CAACkG,YAA1C,CArBA;;EAwBA0H,QAAAA,OAAO,CAAC0gB,sBAAR,GAAiC,KAAjC,CAxBA;;EA2BA1gB,QAAAA,OAAO,CAAC2gB,kBAAR,CAA2B,CAAC,KAAKrlB,MAAL,CAAYqM,KAAxC;EAEA,aAAK+W,MAAL,CAAYe,UAAZ,CAAuBzf,OAAvB;EACH,OA9BD,CA8BE,OAAOrR,CAAP,EAAU;EACR,aAAKsxB,SAAL,CAAetxB,CAAf;EACH;EACJ;EAED;;;;;;;sCAI6B;EAAA;;EAAA,UAAf2G,KAAe,uEAAP,KAAO;;EACzB,UAAI,CAACA,KAAL,EAAY;EACRyoB,QAAAA,aAAa,CAAC,KAAKc,cAAN,CAAb;EACA,aAAK1sB,QAAL,CAAcC,SAAd,CAAwByD,eAAxB,CAAwC,iBAAxC;EACA;EACH;;EAED,UAAMgL,MAAM,GAAG,SAATA,MAAS,GAAM;EACjB,YAAMc,IAAI,GAAGD,UAAU,CAAChF,IAAI,CAACmB,GAAL,CAAS,MAAI,CAAC4gB,OAAL,CAAamC,gBAAb,EAAT,EAA0C,CAA1C,CAAD,CAAvB;EACA,YAAM3b,KAAK,aAAMhG,IAAI,CAACjP,GAAL,CAAS,eAAT,EAA0B,MAAI,CAACsL,MAAL,CAAY3D,MAAtC,CAAN,gBAAyDgK,IAAzD,CAAX;;EACA,QAAA,MAAI,CAACxP,QAAL,CAAcC,SAAd,CAAwBsB,YAAxB,CAAqC,iBAArC,EAAwDuR,KAAxD;EACH,OAJD;;EAMA,WAAK4Z,cAAL,GAAsBZ,WAAW,CAACpd,MAAD,EAAS,GAAT,CAAjC;EACH;EAED;;;;;;;yCAImBvR,OAAO;EAAA;;EACtB;EACA,UAAI,CAAC,KAAK+P,OAAV,EAAmB;EACf;EACH,OAJqB;;;EAOtB,UAAM2D,QAAQ,GAAG,IAAI6O,MAAM,CAACiN,GAAP,CAAW+B,oBAAf,EAAjB,CAPsB;;EAUtB7d,MAAAA,QAAQ,CAAC8d,2CAAT,GAAuD,IAAvD;EACA9d,MAAAA,QAAQ,CAAC+d,gBAAT,GAA4B,IAA5B,CAXsB;EActB;;EACA,WAAKtC,OAAL,GAAenvB,KAAK,CAAC0xB,aAAN,CAAoB,KAAK1lB,MAAzB,EAAiC0H,QAAjC,CAAf,CAfsB;;EAkBtB,WAAK2b,SAAL,GAAiB,KAAKF,OAAL,CAAawC,YAAb,EAAjB,CAlBsB;;EAqBtB,UAAI,CAACzwB,EAAE,CAACb,KAAH,CAAS,KAAKgvB,SAAd,CAAL,EAA+B;EAC3B,aAAKA,SAAL,CAAehuB,OAAf,CAAuB,UAAAuwB,QAAQ,EAAI;EAC/B,cAAIA,QAAQ,KAAK,CAAb,IAAkBA,QAAQ,KAAK,CAAC,CAAhC,IAAqCA,QAAQ,GAAG,MAAI,CAAC5lB,MAAL,CAAYmI,QAAhE,EAA0E;EACtE,gBAAM0d,WAAW,GAAG,MAAI,CAAC7lB,MAAL,CAAYnJ,QAAZ,CAAqBgR,QAAzC;;EAEA,gBAAI3S,EAAE,CAACpB,OAAH,CAAW+xB,WAAX,CAAJ,EAA6B;EACzB,kBAAMC,aAAa,GAAG,MAAM,MAAI,CAAC9lB,MAAL,CAAYmI,QAAlB,GAA6Byd,QAAnD;EACA,kBAAM1xB,GAAG,GAAGmE,aAAa,CAAC,MAAD,EAAS;EAC9B6B,gBAAAA,KAAK,EAAE,MAAI,CAAC8F,MAAL,CAAY3D,MAAZ,CAAmBC,UAAnB,CAA8B8W;EADP,eAAT,CAAzB;EAIAlf,cAAAA,GAAG,CAAC2I,KAAJ,CAAUwQ,IAAV,aAAoByY,aAAa,CAAC3jB,QAAd,EAApB;EACA0jB,cAAAA,WAAW,CAACjuB,WAAZ,CAAwB1D,GAAxB;EACH;EACJ;EACJ,SAdD;EAeH,OArCqB;;;EAwCtB,WAAKivB,OAAL,CAAa9D,SAAb,CAAuB,KAAKrf,MAAL,CAAYgI,MAAnC,EAxCsB;EA2CtB;;EACA,WAAKmb,OAAL,CAAaxuB,gBAAb,CAA8B4hB,MAAM,CAACiN,GAAP,CAAWiB,YAAX,CAAwBH,IAAxB,CAA6BI,QAA3D,EAAqE,UAAApc,KAAK;EAAA,eAAI,MAAI,CAACqc,SAAL,CAAerc,KAAf,CAAJ;EAAA,OAA1E,EA5CsB;;EA+CtBvX,MAAAA,MAAM,CAACgC,IAAP,CAAYwjB,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAA/B,EAAqCjvB,OAArC,CAA6C,UAAAC,IAAI,EAAI;EACjD,QAAA,MAAI,CAAC6tB,OAAL,CAAaxuB,gBAAb,CAA8B4hB,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBhvB,IAAxB,CAA9B,EAA6D,UAAAtB,KAAK;EAAA,iBAAI,MAAI,CAACgyB,SAAL,CAAehyB,KAAf,CAAJ;EAAA,SAAlE;EACH,OAFD,EA/CsB;;EAoDtB,WAAKyvB,OAAL,CAAa,QAAb;EACH;EAED;;;;;;;;;gCAMUzvB,OAAO;EAAA;;EAAA,UACL8C,SADK,GACS,KAAKkJ,MAAL,CAAYnJ,QADrB,CACLC,SADK;EAIb;;EACA,UAAMmvB,EAAE,GAAGjyB,KAAK,CAACkyB,KAAN,EAAX,CALa;;EAQb,UAAM5vB,aAAa,GAAG,SAAhBA,aAAgB,CAAAhB,IAAI,EAAI;EAC1B,YAAMtB,KAAK,gBAASsB,IAAI,CAACuE,OAAL,CAAa,IAAb,EAAmB,EAAnB,EAAuBiJ,WAAvB,EAAT,CAAX;EACA9M,QAAAA,YAAY,CAACN,IAAb,CAAkB,MAAI,CAACsK,MAAvB,EAA+B,MAAI,CAACA,MAAL,CAAYf,KAA3C,EAAkDjL,KAAlD;EACH,OAHD;;EAKA,cAAQA,KAAK,CAACsB,IAAd;EACI,aAAKihB,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwB6B,MAA7B;EACI;EACA;EACA,eAAK1C,OAAL,CAAa,QAAb,EAHJ;;EAMIntB,UAAAA,aAAa,CAACtC,KAAK,CAACsB,IAAP,CAAb,CANJ;;EASI,eAAK8wB,aAAL,CAAmB,IAAnB;;EAEA,cAAI,CAACH,EAAE,CAACI,QAAH,EAAL,EAAoB;EAChB;EACAJ,YAAAA,EAAE,CAAC9Y,KAAH,GAAWrW,SAAS,CAACkuB,WAArB;EACAiB,YAAAA,EAAE,CAACjW,MAAH,GAAYlZ,SAAS,CAACkG,YAAtB;EACH,WAfL;EAkBI;;;EACA;;EAEJ,aAAKuZ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBgC,iBAA7B;EACI;EACA;EAEA;EACAhwB,UAAAA,aAAa,CAACtC,KAAK,CAACsB,IAAP,CAAb,CALJ;EAQI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;EAEA,eAAKixB,OAAL;EACA;;EAEJ,aAAKhQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBkC,uBAA7B;EACI;EACA;EACA;EAEAlwB,UAAAA,aAAa,CAACtC,KAAK,CAACsB,IAAP,CAAb;EAEA,eAAKmxB,YAAL;EAEA;;EAEJ,aAAKlQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBoC,wBAA7B;EACI;EACA;EACA;EACA;EAEApwB,UAAAA,aAAa,CAACtC,KAAK,CAACsB,IAAP,CAAb;EAEA,eAAK8wB,aAAL;EAEA,eAAKO,aAAL;EAEA;;EAEJ,aAAKpQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBsC,OAA7B;EACA,aAAKrQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBuC,QAA7B;EACA,aAAKtQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwBwC,QAA7B;EACA,aAAKvQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwByC,UAA7B;EACA,aAAKxQ,MAAM,CAACiN,GAAP,CAAWuC,OAAX,CAAmBzB,IAAnB,CAAwB0C,KAA7B;EACI1wB,UAAAA,aAAa,CAACtC,KAAK,CAACsB,IAAP,CAAb;EACA;;EAEJ;EACI;EAzFR;EA2FH;EAED;;;;;;;gCAIUtB,OAAO;EACb,WAAKizB,MAAL;EACA,WAAKjnB,MAAL,CAAYY,KAAZ,CAAkB2H,IAAlB,CAAuB,WAAvB,EAAoCvU,KAApC;EACH;EAED;;;;;;;;kCAKY;EAAA;;EAAA,UACA8C,SADA,GACc,KAAKkJ,MAAL,CAAYnJ,QAD1B,CACAC,SADA;EAER,UAAIuP,IAAJ,CAFQ;;EAKR,WAAKrG,MAAL,CAAYvK,EAAZ,CAAe,OAAf,EAAwB,YAAM;EAC1B,QAAA,MAAI,CAAC2tB,MAAL,CAAY8D,eAAZ;EACH,OAFD;EAIA,WAAKlnB,MAAL,CAAYvK,EAAZ,CAAe,SAAf,EAA0B,YAAM;EAC5B4Q,QAAAA,IAAI,GAAG,MAAI,CAACrG,MAAL,CAAYE,WAAnB;EACA,eAAOmG,IAAP;EACH,OAHD;EAKA,WAAKrG,MAAL,CAAYvK,EAAZ,CAAe,QAAf,EAAyB,YAAM;EAC3B,YAAM0xB,UAAU,GAAG,MAAI,CAACnnB,MAAL,CAAYE,WAA/B;;EAEA,YAAIhL,EAAE,CAACb,KAAH,CAAS,MAAI,CAACgvB,SAAd,CAAJ,EAA8B;EAC1B;EACH;;EAED,QAAA,MAAI,CAACA,SAAL,CAAehuB,OAAf,CAAuB,UAACuwB,QAAD,EAAWvuB,KAAX,EAAqB;EACxC,cAAIgP,IAAI,GAAGuf,QAAP,IAAmBA,QAAQ,GAAGuB,UAAlC,EAA8C;EAC1C,YAAA,MAAI,CAAChE,OAAL,CAAaiE,cAAb;;EACA,YAAA,MAAI,CAAC/D,SAAL,CAAegE,MAAf,CAAsBhwB,KAAtB,EAA6B,CAA7B;EACH;EACJ,SALD;EAMH,OAbD,EAdQ;EA8BR;;EACA9E,MAAAA,MAAM,CAACoC,gBAAP,CAAwB,QAAxB,EAAkC,YAAM;EACpC,YAAI,MAAI,CAACwuB,OAAT,EAAkB;EACd,UAAA,MAAI,CAACA,OAAL,CAAamE,MAAb,CAAoBxwB,SAAS,CAACkuB,WAA9B,EAA2CluB,SAAS,CAACkG,YAArD,EAAmEuZ,MAAM,CAACiN,GAAP,CAAW+D,QAAX,CAAoBC,MAAvF;EACH;EACJ,OAJD;EAKH;EAED;;;;;;6BAGO;EAAA;;EAAA,UACK1wB,SADL,GACmB,KAAKkJ,MAAL,CAAYnJ,QAD/B,CACKC,SADL;;EAGH,UAAI,CAAC,KAAKmlB,cAAV,EAA0B;EACtB,aAAK0K,aAAL;EACH,OALE;;;EAQH,WAAK1K,cAAL,CACKllB,IADL,CACU,YAAM;EACR;EACA,QAAA,MAAI,CAACF,QAAL,CAAcqsB,gBAAd,CAA+BuE,UAA/B;;EAEA,YAAI;EACA,cAAI,CAAC,MAAI,CAACzL,WAAV,EAAuB;EACnB;EACA,YAAA,MAAI,CAACmH,OAAL,CAAauE,IAAb,CAAkB5wB,SAAS,CAACkuB,WAA5B,EAAyCluB,SAAS,CAACkG,YAAnD,EAAiEuZ,MAAM,CAACiN,GAAP,CAAW+D,QAAX,CAAoBC,MAArF,EAFmB;EAKnB;;;EACA,YAAA,MAAI,CAACrE,OAAL,CAAanpB,KAAb;EACH;;EAED,UAAA,MAAI,CAACgiB,WAAL,GAAmB,IAAnB;EACH,SAXD,CAWE,OAAO2L,OAAP,EAAgB;EACd;EACA;EACA,UAAA,MAAI,CAAChD,SAAL,CAAegD,OAAf;EACH;EACJ,OArBL,EAsBK5hB,KAtBL,CAsBW,YAAM,EAtBjB;EAuBH;EAED;;;;;;sCAGgB;EACZ;EACA,WAAKlP,QAAL,CAAcC,SAAd,CAAwB+F,KAAxB,CAA8B+qB,MAA9B,GAAuC,EAAvC,CAFY;;EAKZ,WAAK5R,OAAL,GAAe,KAAf,CALY;;EAQZ,UAAI,KAAKhW,MAAL,CAAYE,WAAZ,GAA0B,KAAKF,MAAL,CAAYmI,QAA1C,EAAoD;EAChD,aAAKnI,MAAL,CAAYO,IAAZ;EACH;EACJ;EAED;;;;;;qCAGe;EACX;EACA,WAAK1J,QAAL,CAAcC,SAAd,CAAwB+F,KAAxB,CAA8B+qB,MAA9B,GAAuC,CAAvC,CAFW;;EAKX,WAAK5R,OAAL,GAAe,IAAf,CALW;;EAQX,WAAKhW,MAAL,CAAYqH,KAAZ;EACH;EAED;;;;;;;;;+BAMS;EACL;EACA,UAAI,KAAK2U,WAAT,EAAsB;EAClB,aAAK2K,aAAL;EACH,OAJI;;;EAOL,WAAKlD,OAAL,CAAa,OAAb,EAPK;;EAUL,WAAK8C,OAAL;EACH;EAED;;;;;;gCAGU;EAAA;;EACN;EACA,WAAKtK,cAAL,CACKllB,IADL,CACU,YAAM;EACR;EACA,YAAI,OAAI,CAACosB,OAAT,EAAkB;EACd,UAAA,OAAI,CAACA,OAAL,CAAa0E,OAAb;EACH,SAJO;;;EAOR,QAAA,OAAI,CAAC5L,cAAL,GAAsB,IAAIvlB,OAAJ,CAAY,UAAAC,OAAO,EAAI;EACzC,UAAA,OAAI,CAAClB,EAAL,CAAQ,QAAR,EAAkBkB,OAAlB;;EACA,UAAA,OAAI,CAACqJ,MAAL,CAAYY,KAAZ,CAAkBC,GAAlB,CAAsB,OAAI,CAACsiB,OAA3B;EACH,SAHqB,CAAtB,CAPQ;;EAaR,QAAA,OAAI,CAACgB,UAAL;EACH,OAfL,EAgBKpe,KAhBL,CAgBW,YAAM,EAhBjB;EAiBH;EAED;;;;;;;8BAIQ/R,OAAgB;EAAA;;EAAA,wCAAN8B,IAAM;EAANA,QAAAA,IAAM;EAAA;;EACpB,UAAMgyB,QAAQ,GAAG,KAAK3yB,MAAL,CAAYnB,KAAZ,CAAjB;;EAEA,UAAIkB,EAAE,CAACvB,KAAH,CAASm0B,QAAT,CAAJ,EAAwB;EACpBA,QAAAA,QAAQ,CAACzyB,OAAT,CAAiB,UAAA8jB,OAAO,EAAI;EACxB,cAAIjkB,EAAE,CAACxB,QAAH,CAAYylB,OAAZ,CAAJ,EAA0B;EACtBA,YAAAA,OAAO,CAACpjB,KAAR,CAAc,OAAd,EAAoBD,IAApB;EACH;EACJ,SAJD;EAKH;EACJ;EAED;;;;;;;;;4BAMG9B,OAAOc,UAAU;EAChB,UAAI,CAACI,EAAE,CAACvB,KAAH,CAAS,KAAKwB,MAAL,CAAYnB,KAAZ,CAAT,CAAL,EAAmC;EAC/B,aAAKmB,MAAL,CAAYnB,KAAZ,IAAqB,EAArB;EACH;;EAED,WAAKmB,MAAL,CAAYnB,KAAZ,EAAmBwB,IAAnB,CAAwBV,QAAxB;EAEA,aAAO,IAAP;EACH;EAED;;;;;;;;;;;uCAQiBuR,MAAMlP,MAAM;EAAA;;EACzB,WAAK6I,MAAL,CAAYY,KAAZ,CAAkBC,GAAlB,sCAAoD1J,IAApD;EAEA,WAAKmsB,WAAL,GAAmB1sB,UAAU,CAAC,YAAM;EAChC,QAAA,OAAI,CAACqwB,MAAL;;EACA,QAAA,OAAI,CAACtD,gBAAL,CAAsB,oBAAtB;EACH,OAH4B,EAG1Btd,IAH0B,CAA7B;EAIH;EAED;;;;;;;uCAIiBlP,MAAM;EACnB,UAAI,CAACjC,EAAE,CAAC5B,eAAH,CAAmB,KAAKgwB,WAAxB,CAAL,EAA2C;EACvC,aAAKtjB,MAAL,CAAYY,KAAZ,CAAkBC,GAAlB,sCAAoD1J,IAApD;EAEAgjB,QAAAA,YAAY,CAAC,KAAKmJ,WAAN,CAAZ;EACA,aAAKA,WAAL,GAAmB,IAAnB;EACH;EACJ;;;0BAliBa;EACV,aACI,KAAKtjB,MAAL,CAAYhB,OAAZ,IAAuB,KAAKgB,MAAL,CAAY2R,OAAnC,IAA8C,KAAK3R,MAAL,CAAY3D,MAAZ,CAAmB0Z,GAAnB,CAAuBhS,OAArE,IAAgF,CAAC7O,EAAE,CAACb,KAAH,CAAS,KAAKmiB,WAAd,CADrF;EAGH;;;0BA4CY;EACT,UAAMhF,MAAM,GAAG;EACXuW,QAAAA,cAAc,EAAE,0BADL;EAEXC,QAAAA,YAAY,EAAE,0BAFH;EAGXC,QAAAA,MAAM,EAAE11B,MAAM,CAACuU,QAAP,CAAgB1T,QAHb;EAIX80B,QAAAA,EAAE,EAAE3N,IAAI,CAACC,GAAL,EAJO;EAKX2N,QAAAA,QAAQ,EAAE,GALC;EAMXC,QAAAA,SAAS,EAAE,GANA;EAOXC,QAAAA,QAAQ,EAAE,KAAK7R;EAPJ,OAAf;EAUA,UAAM8R,IAAI,GAAG,4CAAb;EAEA,uBAAUA,IAAV,cAAkB/W,cAAc,CAACC,MAAD,CAAhC;EACH;;;;;;ECnGL,IAAM5R,MAAM,GAAG;EACX;EACA2oB,EAAAA,cAFW,0BAEIjzB,IAFJ,EAEUyC,UAFV,EAEsB;EAAA;;EAC7B,QAAI7C,EAAE,CAAChC,MAAH,CAAU6E,UAAV,CAAJ,EAA2B;EACvBY,MAAAA,aAAa,CAACrD,IAAD,EAAO,KAAK2J,KAAZ,EAAmB;EAC5BqB,QAAAA,GAAG,EAAEvI;EADuB,OAAnB,CAAb;EAGH,KAJD,MAIO,IAAI7C,EAAE,CAACvB,KAAH,CAASoE,UAAT,CAAJ,EAA0B;EAC7BA,MAAAA,UAAU,CAAC1C,OAAX,CAAmB,UAAA0nB,SAAS,EAAI;EAC5BpkB,QAAAA,aAAa,CAACrD,IAAD,EAAO,KAAI,CAAC2J,KAAZ,EAAmB8d,SAAnB,CAAb;EACH,OAFD;EAGH;EACJ,GAZU;EAcX;EACA;EACAyL,EAAAA,MAhBW,kBAgBJ/3B,KAhBI,EAgBG;EAAA;;EACV,QAAI,CAACiR,OAAO,CAACjR,KAAD,EAAQ,gBAAR,CAAZ,EAAuC;EACnC,WAAKmQ,KAAL,CAAW2H,IAAX,CAAgB,uBAAhB;EACA;EACH,KAJS;;;EAOV9I,IAAAA,KAAK,CAACiB,cAAN,CAAqBhL,IAArB,CAA0B,IAA1B,EAPU;;EAUV,SAAKmyB,OAAL,CAAanyB,IAAb,CACI,IADJ,EAEI,YAAM;EACF;EACA,MAAA,MAAI,CAAClB,OAAL,CAAaiM,OAAb,GAAuB,EAAvB,CAFE;;EAKF7H,MAAAA,aAAa,CAAC,MAAI,CAACqG,KAAN,CAAb;EACA,MAAA,MAAI,CAACA,KAAL,GAAa,IAAb,CANE;;EASF,UAAI/J,EAAE,CAACpB,OAAH,CAAW,MAAI,CAAC+C,QAAL,CAAcC,SAAzB,CAAJ,EAAyC;EACrC,QAAA,MAAI,CAACD,QAAL,CAAcC,SAAd,CAAwByD,eAAxB,CAAwC,OAAxC;EACH,OAXC;;;EAAA,UAcMoF,OAdN,GAcwBlP,KAdxB,CAcMkP,OAdN;EAAA,UAcerK,IAdf,GAcwB7E,KAdxB,CAce6E,IAdf;;EAAA,oCAe4CqK,OAf5C;EAAA;EAAA,yCAeO1B,QAfP;EAAA,UAeOA,QAfP,mCAekByY,SAAS,CAACjX,KAf5B;EAAA,UAemCa,GAfnC,aAemCA,GAfnC;;EAgBF,UAAMmoB,OAAO,GAAGxqB,QAAQ,KAAK,OAAb,GAAuB3I,IAAvB,GAA8B,KAA9C;EACA,UAAMyC,UAAU,GAAGkG,QAAQ,KAAK,OAAb,GAAuB,EAAvB,GAA4B;EAAEqC,QAAAA,GAAG,EAAHA;EAAF,OAA/C;EAEAvP,MAAAA,MAAM,CAACqF,MAAP,CAAc,MAAd,EAAoB;EAChB6H,QAAAA,QAAQ,EAARA,QADgB;EAEhB3I,QAAAA,IAAI,EAAJA,IAFgB;EAGhB;EACAf,QAAAA,SAAS,EAAEsJ,OAAO,CAACG,KAAR,CAAc1I,IAAd,EAAoB2I,QAApB,EAA8B,MAAI,CAAC5B,MAAL,CAAY6B,WAA1C,CAJK;EAKhB;EACAe,QAAAA,KAAK,EAAE5G,aAAa,CAACowB,OAAD,EAAU1wB,UAAV;EANJ,OAApB,EAnBE;;EA6BF,MAAA,MAAI,CAAClB,QAAL,CAAcC,SAAd,CAAwBc,WAAxB,CAAoC,MAAI,CAACqH,KAAzC,EA7BE;;;EAgCF,UAAI/J,EAAE,CAACzB,OAAH,CAAWhD,KAAK,CAACkjB,QAAjB,CAAJ,EAAgC;EAC5B,QAAA,MAAI,CAACtX,MAAL,CAAYsX,QAAZ,GAAuBljB,KAAK,CAACkjB,QAA7B;EACH,OAlCC;;;EAqCF,UAAI,MAAI,CAAC3U,OAAT,EAAkB;EACd,YAAI,MAAI,CAAC3C,MAAL,CAAYqsB,WAAhB,EAA6B;EACzB,UAAA,MAAI,CAACzpB,KAAL,CAAW7G,YAAX,CAAwB,aAAxB,EAAuC,EAAvC;EACH;;EACD,YAAI,MAAI,CAACiE,MAAL,CAAYsX,QAAhB,EAA0B;EACtB,UAAA,MAAI,CAAC1U,KAAL,CAAW7G,YAAX,CAAwB,UAAxB,EAAoC,EAApC;EACH;;EACD,YAAI,CAAClD,EAAE,CAACb,KAAH,CAAS5D,KAAK,CAAColB,MAAf,CAAL,EAA6B;EACzB,UAAA,MAAI,CAACA,MAAL,GAAcplB,KAAK,CAAColB,MAApB;EACH;;EACD,YAAI,MAAI,CAACxZ,MAAL,CAAY8X,IAAZ,CAAiBhC,MAArB,EAA6B;EACzB,UAAA,MAAI,CAAClT,KAAL,CAAW7G,YAAX,CAAwB,MAAxB,EAAgC,EAAhC;EACH;;EACD,YAAI,MAAI,CAACiE,MAAL,CAAYgQ,KAAhB,EAAuB;EACnB,UAAA,MAAI,CAACpN,KAAL,CAAW7G,YAAX,CAAwB,OAAxB,EAAiC,EAAjC;EACH;;EACD,YAAI,MAAI,CAACiE,MAAL,CAAY6B,WAAhB,EAA6B;EACzB,UAAA,MAAI,CAACe,KAAL,CAAW7G,YAAX,CAAwB,aAAxB,EAAuC,EAAvC;EACH;EACJ,OAxDC;;;EA2DFiG,MAAAA,EAAE,CAACkb,YAAH,CAAgB7jB,IAAhB,CAAqB,MAArB,EA3DE;;EA8DF,UAAI,MAAI,CAACsJ,OAAT,EAAkB;EACdY,QAAAA,MAAM,CAAC2oB,cAAP,CAAsB7yB,IAAtB,CAA2B,MAA3B,EAAiC,QAAjC,EAA2CiK,OAA3C;EACH,OAhEC;;;EAmEF,MAAA,MAAI,CAACtD,MAAL,CAAYwH,KAAZ,GAAoBpT,KAAK,CAACoT,KAA1B,CAnEE;;EAsEF5E,MAAAA,KAAK,CAACyS,KAAN,CAAYhc,IAAZ,CAAiB,MAAjB,EAtEE;;EAyEF,UAAI,MAAI,CAACsJ,OAAT,EAAkB;EACd;EACA,YAAIjO,MAAM,CAACgC,IAAP,CAAYtC,KAAZ,EAAmByK,QAAnB,CAA4B,QAA5B,CAAJ,EAA2C;EACvC0E,UAAAA,MAAM,CAAC2oB,cAAP,CAAsB7yB,IAAtB,CAA2B,MAA3B,EAAiC,OAAjC,EAA0CjF,KAAK,CAACme,MAAhD;EACH;EACJ,OA9EC;;;EAiFF,UAAI,MAAI,CAAC5P,OAAL,IAAiB,MAAI,CAAC6R,OAAL,IAAgB,CAAC,MAAI,CAACtc,SAAL,CAAe8J,EAArD,EAA0D;EACtD;EACAA,QAAAA,EAAE,CAACmb,KAAH,CAAS9jB,IAAT,CAAc,MAAd;EACH;;EAED,UAAI,MAAI,CAACsJ,OAAT,EAAkB;EACd;EACA,QAAA,MAAI,CAACC,KAAL,CAAWuB,IAAX;EACH,OAzFC;;;EA4FF,MAAA,MAAI,CAACoH,UAAL,CAAgBrC,MAAhB;EACH,KA/FL,EAgGI,IAhGJ;EAkGH;EA5HU,CAAf;;ECiBA;EACA;EAEA;;MACMojB;;;EACF,gBAAYjwB,MAAZ,EAAoBlE,OAApB,EAA6B;EAAA;;EAAA;;EACzB,SAAK4lB,MAAL,GAAc,EAAd,CADyB;;EAIzB,SAAK3jB,KAAL,GAAa,KAAb;EACA,SAAKyf,OAAL,GAAe,KAAf;EACA,SAAK0S,MAAL,GAAc,KAAd,CANyB;;EASzB,SAAKvpB,KAAL,GAAaxB,OAAO,CAACwB,KAArB,CATyB;;EAYzB,SAAKJ,KAAL,GAAavG,MAAb,CAZyB;;EAezB,QAAIxD,EAAE,CAAChC,MAAH,CAAU,KAAK+L,KAAf,CAAJ,EAA2B;EACvB,WAAKA,KAAL,GAAa1G,QAAQ,CAAC0C,gBAAT,CAA0B,KAAKgE,KAA/B,CAAb;EACH,KAjBwB;;;EAoBzB,QAAK1M,MAAM,CAACs2B,MAAP,IAAiB,KAAK5pB,KAAL,YAAsB4pB,MAAxC,IAAmD3zB,EAAE,CAACrB,QAAH,CAAY,KAAKoL,KAAjB,CAAnD,IAA8E/J,EAAE,CAACvB,KAAH,CAAS,KAAKsL,KAAd,CAAlF,EAAwG;EACpG;EACA,WAAKA,KAAL,GAAa,KAAKA,KAAL,CAAW,CAAX,CAAb;EACH,KAvBwB;;;EA0BzB,SAAK5C,MAAL,GAAc0D,MAAM,CAChB,EADgB,EAEhB2T,QAFgB,EAGhBiV,IAAI,CAACjV,QAHW,EAIhBlf,OAAO,IAAI,EAJK,EAKf,YAAM;EACH,UAAI;EACA,eAAO+M,IAAI,CAACC,KAAL,CAAW,KAAI,CAACvC,KAAL,CAAWY,YAAX,CAAwB,kBAAxB,CAAX,CAAP;EACH,OAFD,CAEE,OAAOxM,CAAP,EAAU;EACR,eAAO,EAAP;EACH;EACJ,KAND,EALgB,CAApB,CA1ByB;;EAyCzB,SAAKwD,QAAL,GAAgB;EACZC,MAAAA,SAAS,EAAE,IADC;EAEZ6Q,MAAAA,QAAQ,EAAE,IAFE;EAGZP,MAAAA,OAAO,EAAE,EAHG;EAIZa,MAAAA,OAAO,EAAE,EAJG;EAKZJ,MAAAA,QAAQ,EAAE,EALE;EAMZC,MAAAA,MAAM,EAAE,EANI;EAOZJ,MAAAA,QAAQ,EAAE;EACN2H,QAAAA,KAAK,EAAE,IADD;EAEN9F,QAAAA,IAAI,EAAE,IAFA;EAGN0E,QAAAA,MAAM,EAAE,EAHF;EAIN7G,QAAAA,OAAO,EAAE;EAJH;EAPE,KAAhB,CAzCyB;;EAyDzB,SAAKO,QAAL,GAAgB;EACZwK,MAAAA,MAAM,EAAE,IADI;EAEZrG,MAAAA,YAAY,EAAE,CAAC,CAFH;EAGZuG,MAAAA,IAAI,EAAE,IAAI1gB,OAAJ;EAHM,KAAhB,CAzDyB;;EAgEzB,SAAKiW,UAAL,GAAkB;EACduK,MAAAA,MAAM,EAAE;EADM,KAAlB,CAhEyB;;EAqEzB,SAAK3d,OAAL,GAAe;EACXuX,MAAAA,KAAK,EAAE,EADI;EAEXtL,MAAAA,OAAO,EAAE;EAFE,KAAf,CArEyB;EA2EzB;;EACA,SAAKG,KAAL,GAAa,IAAIkW,OAAJ,CAAY,KAAKza,MAAL,CAAYuE,KAAxB,CAAb,CA5EyB;;EA+EzB,SAAKA,KAAL,CAAWC,GAAX,CAAe,QAAf,EAAyB,KAAKxE,MAA9B;EACA,SAAKuE,KAAL,CAAWC,GAAX,CAAe,SAAf,EAA0BhD,OAA1B,EAhFyB;;EAmFzB,QAAI3I,EAAE,CAAC5B,eAAH,CAAmB,KAAK2L,KAAxB,KAAkC,CAAC/J,EAAE,CAACpB,OAAH,CAAW,KAAKmL,KAAhB,CAAvC,EAA+D;EAC3D,WAAK2B,KAAL,CAAW0H,KAAX,CAAiB,0CAAjB;EACA;EACH,KAtFwB;;;EAyFzB,QAAI,KAAKrJ,KAAL,CAAW5I,IAAf,EAAqB;EACjB,WAAKuK,KAAL,CAAW2H,IAAX,CAAgB,sBAAhB;EACA;EACH,KA5FwB;;;EA+FzB,QAAI,CAAC,KAAKlM,MAAL,CAAY0H,OAAjB,EAA0B;EACtB,WAAKnD,KAAL,CAAW0H,KAAX,CAAiB,kCAAjB;EACA;EACH,KAlGwB;EAqGzB;;;EACA,QAAI,CAACzK,OAAO,CAACG,KAAR,GAAgBI,GAArB,EAA0B;EACtB,WAAKwC,KAAL,CAAW0H,KAAX,CAAiB,0BAAjB;EACA;EACH,KAzGwB;;;EA4GzB,QAAMsH,KAAK,GAAG,KAAK3Q,KAAL,CAAW1H,SAAX,CAAqB,IAArB,CAAd;EACAqY,IAAAA,KAAK,CAAC+D,QAAN,GAAiB,KAAjB;EACA,SAAK9c,QAAL,CAAciyB,QAAd,GAAyBlZ,KAAzB,CA9GyB;EAiHzB;;EACA,QAAMta,IAAI,GAAG,KAAK2J,KAAL,CAAWwpB,OAAX,CAAmB3lB,WAAnB,EAAb,CAlHyB;;EAqHzB,QAAI2S,MAAM,GAAG,IAAb;EACA,QAAIrhB,GAAG,GAAG,IAAV,CAtHyB;;EAyHzB,YAAQkB,IAAR;EACI,WAAK,KAAL;EACI;EACAmgB,QAAAA,MAAM,GAAG,KAAKxW,KAAL,CAAW3D,aAAX,CAAyB,QAAzB,CAAT,CAFJ;;EAKI,YAAIpG,EAAE,CAACpB,OAAH,CAAW2hB,MAAX,CAAJ,EAAwB;EACpB;EACArhB,UAAAA,GAAG,GAAGgd,QAAQ,CAACqE,MAAM,CAAC5V,YAAP,CAAoB,KAApB,CAAD,CAAd;EACA,eAAK5B,QAAL,GAAgB2Y,gBAAgB,CAACxiB,GAAG,CAAC+N,QAAJ,EAAD,CAAhC,CAHoB;;EAMpB,eAAKtL,QAAL,CAAcC,SAAd,GAA0B,KAAKmI,KAA/B;EACA,eAAKA,KAAL,GAAawW,MAAb,CAPoB;;EAUpB,eAAK5e,QAAL,CAAcC,SAAd,CAAwB8C,SAAxB,GAAoC,EAApC,CAVoB;;EAapB,cAAIxF,GAAG,CAAC20B,MAAJ,CAAWj2B,MAAf,EAAuB;EACnB,gBAAMk2B,MAAM,GAAG,CAAC,GAAD,EAAM,MAAN,CAAf;;EAEA,gBAAIA,MAAM,CAAC9tB,QAAP,CAAgB9G,GAAG,CAAC60B,YAAJ,CAAiBv0B,GAAjB,CAAqB,UAArB,CAAhB,CAAJ,EAAuD;EACnD,mBAAK2H,MAAL,CAAYsX,QAAZ,GAAuB,IAAvB;EACH;;EACD,gBAAIqV,MAAM,CAAC9tB,QAAP,CAAgB9G,GAAG,CAAC60B,YAAJ,CAAiBv0B,GAAjB,CAAqB,MAArB,CAAhB,CAAJ,EAAmD;EAC/C,mBAAK2H,MAAL,CAAY8X,IAAZ,CAAiBhC,MAAjB,GAA0B,IAA1B;EACH,aARkB;EAWnB;;;EACA,gBAAI,KAAKP,SAAT,EAAoB;EAChB,mBAAKvV,MAAL,CAAY6B,WAAZ,GAA0B8qB,MAAM,CAAC9tB,QAAP,CAAgB9G,GAAG,CAAC60B,YAAJ,CAAiBv0B,GAAjB,CAAqB,aAArB,CAAhB,CAA1B;EACA,mBAAK2H,MAAL,CAAYglB,EAAZ,GAAiBjtB,GAAG,CAAC60B,YAAJ,CAAiBv0B,GAAjB,CAAqB,IAArB,CAAjB,CAFgB;EAGnB,aAHD,MAGO;EACH,mBAAK2H,MAAL,CAAY6B,WAAZ,GAA0B,IAA1B;EACH;EACJ;EACJ,SAhCD,MAgCO;EACH;EACA,eAAKD,QAAL,GAAgB,KAAKgB,KAAL,CAAWY,YAAX,CAAwB,KAAKxD,MAAL,CAAYtE,UAAZ,CAAuB8a,KAAvB,CAA6B5U,QAArD,CAAhB,CAFG;;EAKH,eAAKgB,KAAL,CAAW1E,eAAX,CAA2B,KAAK8B,MAAL,CAAYtE,UAAZ,CAAuB8a,KAAvB,CAA6B5U,QAAxD;EACH,SA3CL;;;EA8CI,YAAI/I,EAAE,CAACb,KAAH,CAAS,KAAK4J,QAAd,KAA2B,CAAClN,MAAM,CAACgC,IAAP,CAAY2jB,SAAZ,EAAuBxb,QAAvB,CAAgC,KAAK+C,QAArC,CAAhC,EAAgF;EAC5E,eAAK2C,KAAL,CAAW0H,KAAX,CAAiB,gCAAjB;EACA;EACH,SAjDL;;;EAoDI,aAAKhT,IAAL,GAAYqhB,KAAK,CAAC5Y,KAAlB;EAEA;;EAEJ,WAAK,OAAL;EACA,WAAK,OAAL;EACI,aAAKzI,IAAL,GAAYA,IAAZ;EACA,aAAK2I,QAAL,GAAgByY,SAAS,CAACjX,KAA1B,CAFJ;;EAKI,YAAI,KAAKR,KAAL,CAAW+d,YAAX,CAAwB,aAAxB,CAAJ,EAA4C;EACxC,eAAK3gB,MAAL,CAAYqsB,WAAZ,GAA0B,IAA1B;EACH;;EACD,YAAI,KAAKzpB,KAAL,CAAW+d,YAAX,CAAwB,UAAxB,CAAJ,EAAyC;EACrC,eAAK3gB,MAAL,CAAYsX,QAAZ,GAAuB,IAAvB;EACH;;EACD,YAAI,KAAK1U,KAAL,CAAW+d,YAAX,CAAwB,aAAxB,KAA0C,KAAK/d,KAAL,CAAW+d,YAAX,CAAwB,oBAAxB,CAA9C,EAA6F;EACzF,eAAK3gB,MAAL,CAAY6B,WAAZ,GAA0B,IAA1B;EACH;;EACD,YAAI,KAAKe,KAAL,CAAW+d,YAAX,CAAwB,OAAxB,CAAJ,EAAsC;EAClC,eAAK3gB,MAAL,CAAYgQ,KAAZ,GAAoB,IAApB;EACH;;EACD,YAAI,KAAKpN,KAAL,CAAW+d,YAAX,CAAwB,MAAxB,CAAJ,EAAqC;EACjC,eAAK3gB,MAAL,CAAY8X,IAAZ,CAAiBhC,MAAjB,GAA0B,IAA1B;EACH;;EAED;;EAEJ;EACI,aAAKvR,KAAL,CAAW0H,KAAX,CAAiB,gCAAjB;EACA;EAnFR,KAzHyB;;;EAgNzB,SAAK/T,SAAL,GAAiBsJ,OAAO,CAACG,KAAR,CAAc,KAAK1I,IAAnB,EAAyB,KAAK2I,QAA9B,EAAwC,KAAK5B,MAAL,CAAY6B,WAApD,CAAjB,CAhNyB;;EAmNzB,QAAI,CAAC,KAAK3J,SAAL,CAAe6J,GAApB,EAAyB;EACrB,WAAKwC,KAAL,CAAW0H,KAAX,CAAiB,0BAAjB;EACA;EACH;;EAED,SAAK/S,cAAL,GAAsB,EAAtB,CAxNyB;;EA2NzB,SAAKqW,SAAL,GAAiB,IAAI6O,SAAJ,CAAc,IAAd,CAAjB,CA3NyB;;EA8NzB,SAAKzW,OAAL,GAAe,IAAIF,OAAJ,CAAY,IAAZ,CAAf,CA9NyB;;EAiOzB,SAAK7E,KAAL,CAAW5I,IAAX,GAAkB,IAAlB,CAjOyB;;EAoOzB,QAAI,CAACnB,EAAE,CAACpB,OAAH,CAAW,KAAK+C,QAAL,CAAcC,SAAzB,CAAL,EAA0C;EACtC,WAAKD,QAAL,CAAcC,SAAd,GAA0BuB,aAAa,CAAC,KAAD,CAAvC;EACArB,MAAAA,IAAI,CAAC,KAAKiI,KAAN,EAAa,KAAKpI,QAAL,CAAcC,SAA3B,CAAJ;EACH,KAvOwB;;;EA0OzBuH,IAAAA,EAAE,CAACkb,YAAH,CAAgB7jB,IAAhB,CAAqB,IAArB,EA1OyB;;EA6OzBuJ,IAAAA,KAAK,CAACyS,KAAN,CAAYhc,IAAZ,CAAiB,IAAjB,EA7OyB;;EAgPzB,QAAI,KAAK2G,MAAL,CAAYuE,KAAhB,EAAuB;EACnBnL,MAAAA,EAAE,CAACC,IAAH,CAAQ,IAAR,EAAc,KAAKmB,QAAL,CAAcC,SAA5B,EAAuC,KAAKuF,MAAL,CAAYlH,MAAZ,CAAmBiU,IAAnB,CAAwB,GAAxB,CAAvC,EAAqE,UAAApV,KAAK,EAAI;EAC1E,QAAA,KAAI,CAAC4M,KAAL,CAAWC,GAAX,kBAAyB7M,KAAK,CAACsB,IAA/B;EACH,OAFD;EAGH,KApPwB;EAuPzB;;;EACA,QAAI,KAAK0J,OAAL,IAAiB,KAAK6R,OAAL,IAAgB,CAAC,KAAKtc,SAAL,CAAe8J,EAArD,EAA0D;EACtDA,MAAAA,EAAE,CAACmb,KAAH,CAAS9jB,IAAT,CAAc,IAAd;EACH,KA1PwB;;;EA6PzB,SAAKkW,SAAL,CAAe9U,SAAf,GA7PyB;;EAgQzB,SAAK8U,SAAL,CAAe0I,MAAf,GAhQyB;;EAmQzB,SAAK1M,UAAL,GAAkB,IAAImQ,UAAJ,CAAe,IAAf,CAAlB,CAnQyB;;EAsQzB,QAAI,KAAK1b,MAAL,CAAY0Z,GAAZ,CAAgBhS,OAApB,EAA6B;EACzB,WAAKgS,GAAL,GAAW,IAAIkN,GAAJ,CAAQ,IAAR,CAAX;EACH,KAxQwB;;;EA2QzB,QAAI,KAAK5mB,MAAL,CAAYsX,QAAhB,EAA0B;EACtB,WAAKpT,IAAL;EACH,KA7QwB;;;EAgRzB,SAAK+Z,YAAL,GAAoB,CAApB;EACH;EAGD;EACA;;EAEA;;;;;;;;EA2BA;;;6BAGO;EACH,UAAI,CAACplB,EAAE,CAACxB,QAAH,CAAY,KAAKuL,KAAL,CAAWsB,IAAvB,CAAL,EAAmC;EAC/B,eAAO,IAAP;EACH,OAHE;;;EAMH,aAAO,KAAKtB,KAAL,CAAWsB,IAAX,EAAP;EACH;EAED;;;;;;8BAGQ;EACJ,UAAI,CAAC,KAAKyV,OAAN,IAAiB,CAAC9gB,EAAE,CAACxB,QAAH,CAAY,KAAKuL,KAAL,CAAWoI,KAAvB,CAAtB,EAAqD;EACjD;EACH;;EAED,WAAKpI,KAAL,CAAWoI,KAAX;EACH;EAED;;;;;;;EA4BA;;;;iCAIW5W,OAAO;EACd;EACA,UAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B,CAAC,KAAKulB,OAAjD;;EAEA,UAAIjhB,MAAJ,EAAY;EACR,aAAKwL,IAAL;EACH,OAFD,MAEO;EACH,aAAK8G,KAAL;EACH;EACJ;EAED;;;;;;6BAGO;EACH,UAAI,KAAKrI,OAAT,EAAkB;EACd,aAAKqI,KAAL;EACA,aAAKC,OAAL;EACH,OAHD,MAGO,IAAIpS,EAAE,CAACxB,QAAH,CAAY,KAAKuL,KAAL,CAAWkgB,IAAvB,CAAJ,EAAkC;EACrC,aAAKlgB,KAAL,CAAWkgB,IAAX;EACH;EACJ;EAED;;;;;;gCAGU;EACN,WAAKjf,WAAL,GAAmB,CAAnB;EACH;EAED;;;;;;;6BAIO0D,UAAU;EACb,WAAK1D,WAAL,GAAmB,KAAKA,WAAL,IAAoBhL,EAAE,CAAC1B,MAAH,CAAUoQ,QAAV,IAAsBA,QAAtB,GAAiC,KAAKvH,MAAL,CAAYuH,QAAjE,CAAnB;EACH;EAED;;;;;;;8BAIQA,UAAU;EACd,WAAK1D,WAAL,GAAmB,KAAKA,WAAL,IAAoBhL,EAAE,CAAC1B,MAAH,CAAUoQ,QAAV,IAAsBA,QAAtB,GAAiC,KAAKvH,MAAL,CAAYuH,QAAjE,CAAnB;EACH;EAED;;;;;;;;EAyHA;;;;qCAIesG,MAAM;EACjB,UAAMlC,MAAM,GAAG,KAAK/I,KAAL,CAAWoN,KAAX,GAAmB,CAAnB,GAAuB,KAAKrE,MAA3C;EACA,WAAKA,MAAL,GAAcA,MAAM,IAAI9S,EAAE,CAAC1B,MAAH,CAAU0W,IAAV,IAAkBA,IAAlB,GAAyB,CAA7B,CAApB;EACH;EAED;;;;;;;qCAIeA,MAAM;EACjB,WAAKqR,cAAL,CAAoB,CAACrR,IAArB;EACH;EAED;;;;;;;;EAiRA;;;;qCAIezZ,OAAO;EAClBkX,MAAAA,QAAQ,CAAC5S,MAAT,CAAgBW,IAAhB,CAAqB,IAArB,EAA2BjF,KAA3B,EAAkC,KAAlC;EACH;EAED;;;;;;;;EA+EA;;;;gCAIU;EACN;EACA,UAAIoN,OAAO,CAACc,OAAZ,EAAqB;EACjB,aAAKM,KAAL,CAAWiqB,8BAAX;EACH;EACJ;EAED;;;;;;;qCAIen0B,QAAQ;EACnB;EACA,UAAI,KAAKR,SAAL,CAAe8J,EAAf,IAAqB,CAAC,KAAK6d,OAA/B,EAAwC;EACpC;EACA,YAAMiN,QAAQ,GAAGruB,QAAQ,CAAC,KAAKjE,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB0X,YAAjD,CAAzB,CAFoC;;EAKpC,YAAMvZ,KAAK,GAAG,OAAO1F,MAAP,KAAkB,WAAlB,GAAgC+H,SAAhC,GAA4C,CAAC/H,MAA3D,CALoC;;EAQpC,YAAMq0B,MAAM,GAAG5uB,WAAW,CAAC,KAAK3D,QAAL,CAAcC,SAAf,EAA0B,KAAKuF,MAAL,CAAYC,UAAZ,CAAuB0X,YAAjD,EAA+DvZ,KAA/D,CAA1B,CARoC;;EAWpC,YAAI2uB,MAAM,IAAI,KAAK/sB,MAAL,CAAYsK,QAAZ,CAAqBzL,QAArB,CAA8B,UAA9B,CAAV,IAAuD,CAAChG,EAAE,CAACb,KAAH,CAAS,KAAKgI,MAAL,CAAYqL,QAArB,CAA5D,EAA4F;EACxFf,UAAAA,QAAQ,CAAC4I,UAAT,CAAoB7Z,IAApB,CAAyB,IAAzB,EAA+B,KAA/B;EACH,SAbmC;;;EAgBpC,YAAI0zB,MAAM,KAAKD,QAAf,EAAyB;EACrB,cAAME,SAAS,GAAGD,MAAM,GAAG,gBAAH,GAAsB,eAA9C;EACApzB,UAAAA,YAAY,CAACN,IAAb,CAAkB,IAAlB,EAAwB,KAAKuJ,KAA7B,EAAoCoqB,SAApC;EACH;;EAED,eAAO,CAACD,MAAR;EACH;;EAED,aAAO,KAAP;EACH;EAED;;;;;;;;4BAKGp1B,OAAOc,UAAU;EAChBW,MAAAA,EAAE,CAACC,IAAH,CAAQ,IAAR,EAAc,KAAKmB,QAAL,CAAcC,SAA5B,EAAuC9C,KAAvC,EAA8Cc,QAA9C;EACH;EAED;;;;;;;;8BAKKd,OAAOc,UAAU;EAClBc,MAAAA,IAAI,CAACF,IAAL,CAAU,IAAV,EAAgB,KAAKmB,QAAL,CAAcC,SAA9B,EAAyC9C,KAAzC,EAAgDc,QAAhD;EACH;EAED;;;;;;;;6BAKId,OAAOc,UAAU;EACjBa,MAAAA,GAAG,CAAC,KAAKkB,QAAL,CAAcC,SAAf,EAA0B9C,KAA1B,EAAiCc,QAAjC,CAAH;EACH;EAED;;;;;;;;;;8BAOQA,UAAwB;EAAA;;EAAA,UAAdw0B,IAAc,uEAAP,KAAO;;EAC5B,UAAI,CAAC,KAAK7yB,KAAV,EAAiB;EACb;EACH;;EAED,UAAMwmB,IAAI,GAAG,SAAPA,IAAO,GAAM;EACf;EACA1kB,QAAAA,QAAQ,CAACkN,IAAT,CAAc5I,KAAd,CAAoB2a,QAApB,GAA+B,EAA/B,CAFe;;EAKf,QAAA,MAAI,CAAC3E,KAAL,GAAa,IAAb,CALe;;EAQf,YAAIyW,IAAJ,EAAU;EACN,cAAIv4B,MAAM,CAACgC,IAAP,CAAY,MAAI,CAAC8D,QAAjB,EAA2B/D,MAA/B,EAAuC;EACnC;EACA8F,YAAAA,aAAa,CAAC,MAAI,CAAC/B,QAAL,CAAcuQ,OAAd,CAAsB7G,IAAvB,CAAb;EACA3H,YAAAA,aAAa,CAAC,MAAI,CAAC/B,QAAL,CAAc8Q,QAAf,CAAb;EACA/O,YAAAA,aAAa,CAAC,MAAI,CAAC/B,QAAL,CAAc8P,QAAf,CAAb;EACA/N,YAAAA,aAAa,CAAC,MAAI,CAAC/B,QAAL,CAAcI,OAAf,CAAb,CALmC;;EAQnC,YAAA,MAAI,CAACJ,QAAL,CAAcuQ,OAAd,CAAsB7G,IAAtB,GAA6B,IAA7B;EACA,YAAA,MAAI,CAAC1J,QAAL,CAAc8Q,QAAd,GAAyB,IAAzB;EACA,YAAA,MAAI,CAAC9Q,QAAL,CAAc8P,QAAd,GAAyB,IAAzB;EACA,YAAA,MAAI,CAAC9P,QAAL,CAAcI,OAAd,GAAwB,IAAxB;EACH,WAbK;;;EAgBN,cAAI/B,EAAE,CAACxB,QAAH,CAAYoB,QAAZ,CAAJ,EAA2B;EACvBA,YAAAA,QAAQ;EACX;EACJ,SAnBD,MAmBO;EACH;EACAyB,UAAAA,eAAe,CAACb,IAAhB,CAAqB,MAArB,EAFG;;EAKHuD,UAAAA,cAAc,CAAC,MAAI,CAACpC,QAAL,CAAciyB,QAAf,EAAyB,MAAI,CAACjyB,QAAL,CAAcC,SAAvC,CAAd,CALG;;EAQHd,UAAAA,YAAY,CAACN,IAAb,CAAkB,MAAlB,EAAwB,MAAI,CAACmB,QAAL,CAAciyB,QAAtC,EAAgD,WAAhD,EAA6D,IAA7D,EARG;;EAWH,cAAI5zB,EAAE,CAACxB,QAAH,CAAYoB,QAAZ,CAAJ,EAA2B;EACvBA,YAAAA,QAAQ,CAACY,IAAT,CAAc,MAAI,CAACmB,QAAL,CAAciyB,QAA5B;EACH,WAbE;;;EAgBH,UAAA,MAAI,CAACryB,KAAL,GAAa,KAAb,CAhBG;;EAmBHG,UAAAA,UAAU,CAAC,YAAM;EACb,YAAA,MAAI,CAACC,QAAL,GAAgB,IAAhB;EACA,YAAA,MAAI,CAACoI,KAAL,GAAa,IAAb;EACH,WAHS,EAGP,GAHO,CAAV;EAIH;EACJ,OAnDD,CAL4B;;;EA2D5B,WAAKkgB,IAAL,GA3D4B;;EA8D5B,UAAI,KAAKngB,OAAT,EAAkB;EACd;EACAmb,QAAAA,YAAY,CAAC,KAAKC,MAAL,CAAYlE,OAAb,CAAZ,CAFc;;EAKd7X,QAAAA,EAAE,CAACmK,oBAAH,CAAwB9S,IAAxB,CAA6B,IAA7B,EAAmC,IAAnC,EALc;;EAQdunB,QAAAA,IAAI;EACP,OATD,MASO,IAAI,KAAKrL,SAAT,EAAoB;EACvB;EACA6Q,QAAAA,aAAa,CAAC,KAAKrI,MAAL,CAAYsI,SAAb,CAAb;EACAD,QAAAA,aAAa,CAAC,KAAKrI,MAAL,CAAYpE,OAAb,CAAb,CAHuB;;EAMvB,YAAI,KAAKnD,KAAL,KAAe,IAAf,IAAuB3d,EAAE,CAACxB,QAAH,CAAY,KAAKmf,KAAL,CAAWgV,OAAvB,CAA3B,EAA4D;EACxD,eAAKhV,KAAL,CAAWgV,OAAX;EACH,SARsB;;;EAWvB5K,QAAAA,IAAI;EACP,OAZM,MAYA,IAAI,KAAK/N,OAAT,EAAkB;EACrB;EACA;EACA,YAAI,KAAK2D,KAAL,KAAe,IAAnB,EAAyB;EACrB,eAAKA,KAAL,CAAW0W,MAAX,GAAoBxyB,IAApB,CAAyBkmB,IAAzB;EACH,SALoB;;;EAQrBrmB,QAAAA,UAAU,CAACqmB,IAAD,EAAO,GAAP,CAAV;EACH;EACJ;EAED;;;;;;;+BAIS3nB,MAAM;EACX,aAAOuI,OAAO,CAACgB,IAAR,CAAanJ,IAAb,CAAkB,IAAlB,EAAwBJ,IAAxB,CAAP;EACH;EAED;;;;;;;;;0BApyBc;EACV,aAAO1E,OAAO,CAAC,KAAKqN,QAAL,KAAkByY,SAAS,CAACjX,KAA7B,CAAd;EACH;;;0BAEa;EACV,aAAO7O,OAAO,CAAC,KAAKghB,SAAL,IAAkB,KAAK1C,OAAxB,CAAd;EACH;;;0BAEe;EACZ,aAAOte,OAAO,CAAC,KAAKqN,QAAL,KAAkByY,SAAS,CAAChT,OAA7B,CAAd;EACH;;;0BAEa;EACV,aAAO9S,OAAO,CAAC,KAAKqN,QAAL,KAAkByY,SAAS,CAACjT,KAA7B,CAAd;EACH;;;0BAEa;EACV,aAAO7S,OAAO,CAAC,KAAK0E,IAAL,KAAcqhB,KAAK,CAAC5Y,KAArB,CAAd;EACH;;;0BAEa;EACV,aAAOnN,OAAO,CAAC,KAAK0E,IAAL,KAAcqhB,KAAK,CAAC7Y,KAArB,CAAd;EACH;;;0BA4Ba;EACV,aAAOlN,OAAO,CAAC,KAAK6F,KAAL,IAAc,CAAC,KAAK0J,MAApB,IAA8B,CAAC,KAAKgc,KAArC,CAAd;EACH;EAED;;;;;;0BAGa;EACT,aAAOvrB,OAAO,CAAC,KAAKqO,KAAL,CAAWkB,MAAZ,CAAd;EACH;EAED;;;;;;0BAGc;EACV,aAAOvP,OAAO,CAAC,KAAKuP,MAAL,IAAe,KAAKD,WAAL,KAAqB,CAArC,CAAd;EACH;EAED;;;;;;0BAGY;EACR,aAAOtP,OAAO,CAAC,KAAKqO,KAAL,CAAWkd,KAAZ,CAAd;EACH;;;wBAwDe1rB,OAAO;EACnB;EACA,UAAI,CAAC,KAAK0X,QAAV,EAAoB;EAChB;EACH,OAJkB;;;EAOnB,UAAMqhB,YAAY,GAAGt0B,EAAE,CAAC1B,MAAH,CAAU/C,KAAV,KAAoBA,KAAK,GAAG,CAAjD,CAPmB;;EAUnB,WAAKwO,KAAL,CAAWiB,WAAX,GAAyBspB,YAAY,GAAGpoB,IAAI,CAAC6I,GAAL,CAASxZ,KAAT,EAAgB,KAAK0X,QAArB,CAAH,GAAoC,CAAzE,CAVmB;;EAanB,WAAKvH,KAAL,CAAWC,GAAX,sBAA6B,KAAKX,WAAlC;EACH;EAED;;;;0BAGkB;EACd,aAAOjP,MAAM,CAAC,KAAKgO,KAAL,CAAWiB,WAAZ,CAAb;EACH;EAED;;;;;;0BAGe;EAAA,UACHyM,QADG,GACU,KAAK1N,KADf,CACH0N,QADG;;EAIX,UAAIzX,EAAE,CAAC1B,MAAH,CAAUmZ,QAAV,CAAJ,EAAyB;EACrB,eAAOA,QAAP;EACH,OANU;EASX;EACA;;;EACA,UAAIA,QAAQ,IAAIA,QAAQ,CAAC7Z,MAArB,IAA+B,KAAKqV,QAAL,GAAgB,CAAnD,EAAsD;EAClD,eAAOwE,QAAQ,CAACuI,GAAT,CAAa,CAAb,IAAkB,KAAK/M,QAA9B;EACH;;EAED,aAAO,CAAP;EACH;EAED;;;;;;0BAGc;EACV,aAAOvX,OAAO,CAAC,KAAKqO,KAAL,CAAWwO,OAAZ,CAAd;EACH;EAED;;;;;;0BAGe;EACX;EACA,UAAMgc,YAAY,GAAGzd,UAAU,CAAC,KAAK3P,MAAL,CAAY8L,QAAb,CAA/B,CAFW;;EAKX,UAAMuhB,YAAY,GAAG,CAAC,KAAKzqB,KAAL,IAAc,EAAf,EAAmBkJ,QAAxC;EACA,UAAMA,QAAQ,GAAG,CAACjT,EAAE,CAAC1B,MAAH,CAAUk2B,YAAV,CAAD,IAA4BA,YAAY,KAAKC,QAA7C,GAAwD,CAAxD,GAA4DD,YAA7E,CANW;;EASX,aAAOD,YAAY,IAAIthB,QAAvB;EACH;EAED;;;;;;;wBAIWjQ,OAAO;EACd,UAAI8P,MAAM,GAAG9P,KAAb;EACA,UAAMqK,GAAG,GAAG,CAAZ;EACA,UAAM0H,GAAG,GAAG,CAAZ;;EAEA,UAAI/U,EAAE,CAAChC,MAAH,CAAU8U,MAAV,CAAJ,EAAuB;EACnBA,QAAAA,MAAM,GAAG/W,MAAM,CAAC+W,MAAD,CAAf;EACH,OAPa;;;EAUd,UAAI,CAAC9S,EAAE,CAAC1B,MAAH,CAAUwU,MAAV,CAAL,EAAwB;EACpBA,QAAAA,MAAM,GAAG,KAAKhE,OAAL,CAAatP,GAAb,CAAiB,QAAjB,CAAT;EACH,OAZa;;;EAed,UAAI,CAACQ,EAAE,CAAC1B,MAAH,CAAUwU,MAAV,CAAL,EAAwB;EACjBA,QAAAA,MADiB,GACN,KAAK3L,MADC,CACjB2L,MADiB;EAEvB,OAjBa;;;EAoBd,UAAIA,MAAM,GAAGzF,GAAb,EAAkB;EACdyF,QAAAA,MAAM,GAAGzF,GAAT;EACH,OAtBa;;;EAwBd,UAAIyF,MAAM,GAAGiC,GAAb,EAAkB;EACdjC,QAAAA,MAAM,GAAGiC,GAAT;EACH,OA1Ba;;;EA6Bd,WAAK5N,MAAL,CAAY2L,MAAZ,GAAqBA,MAArB,CA7Bc;;EAgCd,WAAK/I,KAAL,CAAW+I,MAAX,GAAoBA,MAApB,CAhCc;;EAmCd,UAAI,CAAC9S,EAAE,CAACb,KAAH,CAAS6D,KAAT,CAAD,IAAoB,KAAKmU,KAAzB,IAAkCrE,MAAM,GAAG,CAA/C,EAAkD;EAC9C,aAAKqE,KAAL,GAAa,KAAb;EACH;EACJ;EAED;;;;0BAGa;EACT,aAAOpb,MAAM,CAAC,KAAKgO,KAAL,CAAW+I,MAAZ,CAAb;EACH;;;wBAuBSP,MAAM;EACZ,UAAI1S,MAAM,GAAG0S,IAAb,CADY;;EAIZ,UAAI,CAACvS,EAAE,CAACzB,OAAH,CAAWsB,MAAX,CAAL,EAAyB;EACrBA,QAAAA,MAAM,GAAG,KAAKiP,OAAL,CAAatP,GAAb,CAAiB,OAAjB,CAAT;EACH,OANW;;;EASZ,UAAI,CAACQ,EAAE,CAACzB,OAAH,CAAWsB,MAAX,CAAL,EAAyB;EACrBA,QAAAA,MAAM,GAAG,KAAKsH,MAAL,CAAYgQ,KAArB;EACH,OAXW;;;EAcZ,WAAKhQ,MAAL,CAAYgQ,KAAZ,GAAoBtX,MAApB,CAdY;;EAiBZ,WAAKkK,KAAL,CAAWoN,KAAX,GAAmBtX,MAAnB;EACH;EAED;;;;0BAGY;EACR,aAAOnE,OAAO,CAAC,KAAKqO,KAAL,CAAWoN,KAAZ,CAAd;EACH;EAED;;;;;;0BAGe;EACX;EACA,UAAI,CAAC,KAAKrN,OAAV,EAAmB;EACf,eAAO,IAAP;EACH;;EAED,UAAI,KAAKkd,OAAT,EAAkB;EACd,eAAO,IAAP;EACH,OARU;;;EAWX,aACItrB,OAAO,CAAC,KAAKqO,KAAL,CAAW2qB,WAAZ,CAAP,IACAh5B,OAAO,CAAC,KAAKqO,KAAL,CAAW4qB,2BAAZ,CADP,IAEAj5B,OAAO,CAAC,KAAKqO,KAAL,CAAW6qB,WAAX,IAA0B,KAAK7qB,KAAL,CAAW6qB,WAAX,CAAuBh3B,MAAlD,CAHX;EAKH;EAED;;;;;;;wBAIUrC,OAAO;EACb,UAAIsb,KAAK,GAAG,IAAZ;;EAEA,UAAI7W,EAAE,CAAC1B,MAAH,CAAU/C,KAAV,CAAJ,EAAsB;EAClBsb,QAAAA,KAAK,GAAGtb,KAAR;EACH;;EAED,UAAI,CAACyE,EAAE,CAAC1B,MAAH,CAAUuY,KAAV,CAAL,EAAuB;EACnBA,QAAAA,KAAK,GAAG,KAAK/H,OAAL,CAAatP,GAAb,CAAiB,OAAjB,CAAR;EACH;;EAED,UAAI,CAACQ,EAAE,CAAC1B,MAAH,CAAUuY,KAAV,CAAL,EAAuB;EACnBA,QAAAA,KAAK,GAAG,KAAK1P,MAAL,CAAY0P,KAAZ,CAAkBqI,QAA1B;EACH,OAbY;;;EAgBb,UAAIrI,KAAK,GAAG,GAAZ,EAAiB;EACbA,QAAAA,KAAK,GAAG,GAAR;EACH;;EACD,UAAIA,KAAK,GAAG,GAAZ,EAAiB;EACbA,QAAAA,KAAK,GAAG,GAAR;EACH;;EAED,UAAI,CAAC,KAAK1P,MAAL,CAAY0P,KAAZ,CAAkBvX,OAAlB,CAA0B0G,QAA1B,CAAmC6Q,KAAnC,CAAL,EAAgD;EAC5C,aAAKnL,KAAL,CAAW2H,IAAX,8BAAsCwD,KAAtC;EACA;EACH,OA1BY;;;EA6Bb,WAAK1P,MAAL,CAAY0P,KAAZ,CAAkBqI,QAAlB,GAA6BrI,KAA7B,CA7Ba;;EAgCb,WAAK9M,KAAL,CAAWijB,YAAX,GAA0BnW,KAA1B;EACH;EAED;;;;0BAGY;EACR,aAAO9a,MAAM,CAAC,KAAKgO,KAAL,CAAWijB,YAAZ,CAAb;EACH;EAED;;;;;;;;wBAKYzxB,OAAO;EACf,UAAM4L,MAAM,GAAG,KAAKA,MAAL,CAAYoE,OAA3B;EACA,UAAMjM,OAAO,GAAG,KAAKA,OAAL,CAAaiM,OAA7B;;EAEA,UAAI,CAACjM,OAAO,CAAC1B,MAAb,EAAqB;EACjB;EACH;;EAED,UAAI2N,OAAO,GAAG,CACV,CAACvL,EAAE,CAACb,KAAH,CAAS5D,KAAT,CAAD,IAAoBQ,MAAM,CAACR,KAAD,CADhB,EAEV,KAAKuT,OAAL,CAAatP,GAAb,CAAiB,SAAjB,CAFU,EAGV2H,MAAM,CAAC+X,QAHG,EAIV/X,MAAM,CAAC6R,OAJG,EAKZtR,IALY,CAKP1H,EAAE,CAAC1B,MALI,CAAd;EAOA,UAAIu2B,aAAa,GAAG,IAApB;;EAEA,UAAI,CAACv1B,OAAO,CAAC0G,QAAR,CAAiBuF,OAAjB,CAAL,EAAgC;EAC5B,YAAMvI,KAAK,GAAG8I,OAAO,CAACxM,OAAD,EAAUiM,OAAV,CAArB;EACA,aAAKG,KAAL,CAAW2H,IAAX,uCAA+C9H,OAA/C,qBAAiEvI,KAAjE;EACAuI,QAAAA,OAAO,GAAGvI,KAAV,CAH4B;;EAM5B6xB,QAAAA,aAAa,GAAG,KAAhB;EACH,OAxBc;;;EA2Bf1tB,MAAAA,MAAM,CAAC+X,QAAP,GAAkB3T,OAAlB,CA3Be;;EA8Bf,WAAKxB,KAAL,CAAWwB,OAAX,GAAqBA,OAArB,CA9Be;;EAiCf,UAAIspB,aAAJ,EAAmB;EACf,aAAK/lB,OAAL,CAAa/D,GAAb,CAAiB;EAAEQ,UAAAA,OAAO,EAAPA;EAAF,SAAjB;EACH;EACJ;EAED;;;;0BAGc;EACV,aAAO,KAAKxB,KAAL,CAAWwB,OAAlB;EACH;EAED;;;;;;;;wBAKShQ,OAAO;EACZ,UAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B,KAAK4L,MAAL,CAAY8X,IAAZ,CAAiBhC,MAA5D;EACA,WAAK9V,MAAL,CAAY8X,IAAZ,CAAiBhC,MAAjB,GAA0Bpd,MAA1B;EACA,WAAKkK,KAAL,CAAWkV,IAAX,GAAkBpf,MAAlB,CAHY;;EAMZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyCH;EAED;;;;0BAGW;EACP,aAAOnE,OAAO,CAAC,KAAKqO,KAAL,CAAWkV,IAAZ,CAAd;EACH;EAED;;;;;;;wBAIW1jB,OAAO;EACdmP,MAAAA,MAAM,CAAC4oB,MAAP,CAAc9yB,IAAd,CAAmB,IAAnB,EAAyBjF,KAAzB;EACH;EAED;;;;0BAGa;EACT,aAAO,KAAKwO,KAAL,CAAWygB,UAAlB;EACH;EAED;;;;;;0BAGe;EAAA,UACHpP,QADG,GACU,KAAKjU,MAAL,CAAYuU,IADtB,CACHN,QADG;EAGX,aAAOpb,EAAE,CAACd,GAAH,CAAOkc,QAAP,IAAmBA,QAAnB,GAA8B,KAAK1Q,MAA1C;EACH;EAED;;;;;;;wBAIWnP,OAAO;EACd,UAAI,CAAC,KAAKkhB,OAAV,EAAmB;EACf,aAAK/Q,KAAL,CAAW2H,IAAX,CAAgB,kCAAhB;EACA;EACH;;EAEDlK,MAAAA,EAAE,CAACsb,SAAH,CAAajkB,IAAb,CAAkB,IAAlB,EAAwBjF,KAAxB,EAA+B,KAA/B,EAAsCsV,KAAtC,CAA4C,YAAM,EAAlD;EACH;EAED;;;;0BAGa;EACT,UAAI,CAAC,KAAK4L,OAAV,EAAmB;EACf,eAAO,IAAP;EACH;;EAED,aAAO,KAAK1S,KAAL,CAAWY,YAAX,CAAwB,QAAxB,CAAP;EACH;EAED;;;;;;;wBAIapP,OAAO;EAChB,UAAMsE,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B,KAAK4L,MAAL,CAAYsX,QAAvD;EACA,WAAKtX,MAAL,CAAYsX,QAAZ,GAAuB5e,MAAvB;EACH;EAED;;;;0BAGe;EACX,aAAOnE,OAAO,CAAC,KAAKyL,MAAL,CAAYsX,QAAb,CAAd;EACH;;;wBAcgBljB,OAAO;EACpBkX,MAAAA,QAAQ,CAAC1H,GAAT,CAAavK,IAAb,CAAkB,IAAlB,EAAwBjF,KAAxB,EAA+B,KAA/B;EACH;EAED;;;;0BAGmB;EAAA,2BACmB,KAAKkX,QADxB;EAAA,UACPmH,OADO,kBACPA,OADO;EAAA,UACEhD,YADF,kBACEA,YADF;EAEf,aAAOgD,OAAO,GAAGhD,YAAH,GAAkB,CAAC,CAAjC;EACH;EAED;;;;;;;;wBAKarb,OAAO;EAChBkX,MAAAA,QAAQ,CAAC+K,WAAT,CAAqBhd,IAArB,CAA0B,IAA1B,EAAgCjF,KAAhC,EAAuC,KAAvC;EACH;EAED;;;;0BAGe;EACX,aAAO,CAACkX,QAAQ,CAACwL,eAAT,CAAyBzd,IAAzB,CAA8B,IAA9B,KAAuC,EAAxC,EAA4CqZ,QAAnD;EACH;EAED;;;;;;;;wBAKQte,OAAO;EACX;EACA,UAAI,CAACoN,OAAO,CAACU,GAAb,EAAkB;EACd;EACH,OAJU;;;EAOX,UAAMxJ,MAAM,GAAGG,EAAE,CAACzB,OAAH,CAAWhD,KAAX,IAAoBA,KAApB,GAA4B,CAAC,KAAK8N,GAAjD,CAPW;EAUX;;EACA,UAAIrJ,EAAE,CAACxB,QAAH,CAAY,KAAKuL,KAAL,CAAWT,yBAAvB,CAAJ,EAAuD;EACnD,aAAKS,KAAL,CAAWT,yBAAX,CAAqCzJ,MAAM,GAAGwJ,GAAG,CAAC4T,MAAP,GAAgB5T,GAAG,CAACkY,QAA/D;EACH,OAbU;;;EAgBX,UAAIvhB,EAAE,CAACxB,QAAH,CAAY,KAAKuL,KAAL,CAAW+qB,uBAAvB,CAAJ,EAAqD;EACjD,YAAI,CAAC,KAAKzrB,GAAN,IAAaxJ,MAAjB,EAAyB;EACrB,eAAKkK,KAAL,CAAW+qB,uBAAX;EACH,SAFD,MAEO,IAAI,KAAKzrB,GAAL,IAAY,CAACxJ,MAAjB,EAAyB;EAC5BwD,UAAAA,QAAQ,CAAC0xB,oBAAT;EACH;EACJ;EACJ;EAED;;;;0BAGU;EACN,UAAI,CAACpsB,OAAO,CAACU,GAAb,EAAkB;EACd,eAAO,IAAP;EACH,OAHK;;;EAMN,UAAI,CAACrJ,EAAE,CAACb,KAAH,CAAS,KAAK4K,KAAL,CAAWirB,sBAApB,CAAL,EAAkD;EAC9C,eAAO,KAAKjrB,KAAL,CAAWirB,sBAAX,KAAsC3rB,GAAG,CAAC4T,MAAjD;EACH,OARK;;;EAWN,aAAO,KAAKlT,KAAL,KAAe1G,QAAQ,CAAC4xB,uBAA/B;EACH;;;gCA6LgB70B,MAAM2I,UAAUmsB,QAAQ;EACrC,aAAOvsB,OAAO,CAACG,KAAR,CAAc1I,IAAd,EAAoB2I,QAApB,EAA8BmsB,MAA9B,CAAP;EACH;EAED;;;;;;;;oCAKkBh2B,KAAK+F,IAAI;EACvB,aAAO+K,UAAU,CAAC9Q,GAAD,EAAM+F,EAAN,CAAjB;EACH;EAED;;;;;;;;4BAKaT,UAAwB;EAAA,UAAdlF,OAAc,uEAAJ,EAAI;EACjC,UAAI0C,OAAO,GAAG,IAAd;;EAEA,UAAIhC,EAAE,CAAChC,MAAH,CAAUwG,QAAV,CAAJ,EAAyB;EACrBxC,QAAAA,OAAO,GAAGzF,KAAK,CAAC0F,IAAN,CAAWoB,QAAQ,CAAC0C,gBAAT,CAA0BvB,QAA1B,CAAX,CAAV;EACH,OAFD,MAEO,IAAIxE,EAAE,CAACrB,QAAH,CAAY6F,QAAZ,CAAJ,EAA2B;EAC9BxC,QAAAA,OAAO,GAAGzF,KAAK,CAAC0F,IAAN,CAAWuC,QAAX,CAAV;EACH,OAFM,MAEA,IAAIxE,EAAE,CAACvB,KAAH,CAAS+F,QAAT,CAAJ,EAAwB;EAC3BxC,QAAAA,OAAO,GAAGwC,QAAQ,CAACzB,MAAT,CAAgB/C,EAAE,CAACpB,OAAnB,CAAV;EACH;;EAED,UAAIoB,EAAE,CAACb,KAAH,CAAS6C,OAAT,CAAJ,EAAuB;EACnB,eAAO,IAAP;EACH;;EAED,aAAOA,OAAO,CAACwD,GAAR,CAAY,UAAA2vB,CAAC;EAAA,eAAI,IAAI1B,IAAJ,CAAS0B,CAAT,EAAY71B,OAAZ,CAAJ;EAAA,OAAb,CAAP;EACH;;;;;;EAGLm0B,IAAI,CAACjV,QAAL,GAAgBpS,SAAS,CAACoS,QAAD,CAAzB","file":"plyr.js","sourcesContent":["// ==========================================================================\n// Type checking utils\n// ==========================================================================\n\nconst getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);\nconst instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);\nconst isNullOrUndefined = input => input === null || typeof input === 'undefined';\nconst isObject = input => getConstructor(input) === Object;\nconst isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);\nconst isString = input => getConstructor(input) === String;\nconst isBoolean = input => getConstructor(input) === Boolean;\nconst isFunction = input => getConstructor(input) === Function;\nconst isArray = input => Array.isArray(input);\nconst isWeakMap = input => instanceOf(input, WeakMap);\nconst isNodeList = input => instanceOf(input, NodeList);\nconst isElement = input => instanceOf(input, Element);\nconst isTextNode = input => getConstructor(input) === Text;\nconst isEvent = input => instanceOf(input, Event);\nconst isKeyboardEvent = input => instanceOf(input, KeyboardEvent);\nconst isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);\nconst isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));\n\nconst isEmpty = input =>\n    isNullOrUndefined(input) ||\n    ((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||\n    (isObject(input) && !Object.keys(input).length);\n\nconst isUrl = input => {\n    // Accept a URL object\n    if (instanceOf(input, window.URL)) {\n        return true;\n    }\n\n    // Must be string from here\n    if (!isString(input)) {\n        return false;\n    }\n\n    // Add the protocol if required\n    let string = input;\n    if (!input.startsWith('http://') || !input.startsWith('https://')) {\n        string = `http://${input}`;\n    }\n\n    try {\n        return !isEmpty(new URL(string).hostname);\n    } catch (e) {\n        return false;\n    }\n};\n\nexport default {\n    nullOrUndefined: isNullOrUndefined,\n    object: isObject,\n    number: isNumber,\n    string: isString,\n    boolean: isBoolean,\n    function: isFunction,\n    array: isArray,\n    weakMap: isWeakMap,\n    nodeList: isNodeList,\n    element: isElement,\n    textNode: isTextNode,\n    event: isEvent,\n    keyboardEvent: isKeyboardEvent,\n    cue: isCue,\n    track: isTrack,\n    url: isUrl,\n    empty: isEmpty,\n};\n","// ==========================================================================\n// Event utils\n// ==========================================================================\n\nimport is from './is';\n\n// Check for passive event listener support\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\nconst supportsPassiveListeners = (() => {\n    // Test via a getter in the options object to see if the passive property is accessed\n    let supported = false;\n    try {\n        const options = Object.defineProperty({}, 'passive', {\n            get() {\n                supported = true;\n                return null;\n            },\n        });\n        window.addEventListener('test', null, options);\n        window.removeEventListener('test', null, options);\n    } catch (e) {\n        // Do nothing\n    }\n\n    return supported;\n})();\n\n// Toggle event listener\nexport function toggleListener(element, event, callback, toggle = false, passive = true, capture = false) {\n    // Bail if no element, event, or callback\n    if (!element || !('addEventListener' in element) || is.empty(event) || !is.function(callback)) {\n        return;\n    }\n\n    // Allow multiple events\n    const events = event.split(' ');\n\n    // Build options\n    // Default to just the capture boolean for browsers with no passive listener support\n    let options = capture;\n\n    // If passive events listeners are supported\n    if (supportsPassiveListeners) {\n        options = {\n            // Whether the listener can be passive (i.e. default never prevented)\n            passive,\n            // Whether the listener is a capturing listener or not\n            capture,\n        };\n    }\n\n    // If a single node is passed, bind the event listener\n    events.forEach(type => {\n        if (this && this.eventListeners && toggle) {\n            // Cache event listener\n            this.eventListeners.push({ element, type, callback, options });\n        }\n\n        element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n    });\n}\n\n// Bind event handler\nexport function on(element, events = '', callback, passive = true, capture = false) {\n    toggleListener.call(this, element, events, callback, true, passive, capture);\n}\n\n// Unbind event handler\nexport function off(element, events = '', callback, passive = true, capture = false) {\n    toggleListener.call(this, element, events, callback, false, passive, capture);\n}\n\n// Bind once-only event handler\nexport function once(element, events = '', callback, passive = true, capture = false) {\n    function onceCallback(...args) {\n        off(element, events, onceCallback, passive, capture);\n        callback.apply(this, args);\n    }\n\n    toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n}\n\n// Trigger event\nexport function triggerEvent(element, type = '', bubbles = false, detail = {}) {\n    // Bail if no element\n    if (!is.element(element) || is.empty(type)) {\n        return;\n    }\n\n    // Create and dispatch the event\n    const event = new CustomEvent(type, {\n        bubbles,\n        detail: Object.assign({}, detail, {\n            plyr: this,\n        }),\n    });\n\n    // Dispatch the event\n    element.dispatchEvent(event);\n}\n\n// Unbind all cached event listeners\nexport function unbindListeners() {\n    if (this && this.eventListeners) {\n        this.eventListeners.forEach(item => {\n            const { element, type, callback, options } = item;\n            element.removeEventListener(type, callback, options);\n        });\n\n        this.eventListeners = [];\n    }\n}\n\n// Run method when / if player is ready\nexport function ready() {\n    return new Promise(\n        resolve => (this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve)),\n    ).then(() => {});\n}\n","// ==========================================================================\n// Element utils\n// ==========================================================================\n\nimport { toggleListener } from './events';\nimport is from './is';\n\n// Wrap an element\nexport function wrap(elements, wrapper) {\n    // Convert `elements` to an array, if necessary.\n    const targets = elements.length ? elements : [elements];\n\n    // Loops backwards to prevent having to clone the wrapper on the\n    // first element (see `child` below).\n    Array.from(targets)\n        .reverse()\n        .forEach((element, index) => {\n            const child = index > 0 ? wrapper.cloneNode(true) : wrapper;\n\n            // Cache the current parent and sibling.\n            const parent = element.parentNode;\n            const sibling = element.nextSibling;\n\n            // Wrap the element (is automatically removed from its current\n            // parent).\n            child.appendChild(element);\n\n            // If the element had a sibling, insert the wrapper before\n            // the sibling to maintain the HTML structure; otherwise, just\n            // append it to the parent.\n            if (sibling) {\n                parent.insertBefore(child, sibling);\n            } else {\n                parent.appendChild(child);\n            }\n        });\n}\n\n// Set attributes\nexport function setAttributes(element, attributes) {\n    if (!is.element(element) || is.empty(attributes)) {\n        return;\n    }\n\n    // Assume null and undefined attributes should be left out,\n    // Setting them would otherwise convert them to \"null\" and \"undefined\"\n    Object.entries(attributes)\n        .filter(([, value]) => !is.nullOrUndefined(value))\n        .forEach(([key, value]) => element.setAttribute(key, value));\n}\n\n// Create a DocumentFragment\nexport function createElement(type, attributes, text) {\n    // Create a new <element>\n    const element = document.createElement(type);\n\n    // Set all passed attributes\n    if (is.object(attributes)) {\n        setAttributes(element, attributes);\n    }\n\n    // Add text node\n    if (is.string(text)) {\n        element.innerText = text;\n    }\n\n    // Return built element\n    return element;\n}\n\n// Inaert an element after another\nexport function insertAfter(element, target) {\n    if (!is.element(element) || !is.element(target)) {\n        return;\n    }\n\n    target.parentNode.insertBefore(element, target.nextSibling);\n}\n\n// Insert a DocumentFragment\nexport function insertElement(type, parent, attributes, text) {\n    if (!is.element(parent)) {\n        return;\n    }\n\n    parent.appendChild(createElement(type, attributes, text));\n}\n\n// Remove element(s)\nexport function removeElement(element) {\n    if (is.nodeList(element) || is.array(element)) {\n        Array.from(element).forEach(removeElement);\n        return;\n    }\n\n    if (!is.element(element) || !is.element(element.parentNode)) {\n        return;\n    }\n\n    element.parentNode.removeChild(element);\n}\n\n// Remove all child elements\nexport function emptyElement(element) {\n    if (!is.element(element)) {\n        return;\n    }\n\n    let { length } = element.childNodes;\n\n    while (length > 0) {\n        element.removeChild(element.lastChild);\n        length -= 1;\n    }\n}\n\n// Replace element\nexport function replaceElement(newChild, oldChild) {\n    if (!is.element(oldChild) || !is.element(oldChild.parentNode) || !is.element(newChild)) {\n        return null;\n    }\n\n    oldChild.parentNode.replaceChild(newChild, oldChild);\n\n    return newChild;\n}\n\n// Get an attribute object from a string selector\nexport function getAttributesFromSelector(sel, existingAttributes) {\n    // For example:\n    // '.test' to { class: 'test' }\n    // '#test' to { id: 'test' }\n    // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\n    if (!is.string(sel) || is.empty(sel)) {\n        return {};\n    }\n\n    const attributes = {};\n    const existing = existingAttributes;\n\n    sel.split(',').forEach(s => {\n        // Remove whitespace\n        const selector = s.trim();\n        const className = selector.replace('.', '');\n        const stripped = selector.replace(/[[\\]]/g, '');\n\n        // Get the parts and value\n        const parts = stripped.split('=');\n        const key = parts[0];\n        const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\n\n        // Get the first character\n        const start = selector.charAt(0);\n\n        switch (start) {\n            case '.':\n                // Add to existing classname\n                if (is.object(existing) && is.string(existing.class)) {\n                    existing.class += ` ${className}`;\n                }\n\n                attributes.class = className;\n                break;\n\n            case '#':\n                // ID selector\n                attributes.id = selector.replace('#', '');\n                break;\n\n            case '[':\n                // Attribute selector\n                attributes[key] = value;\n\n                break;\n\n            default:\n                break;\n        }\n    });\n\n    return attributes;\n}\n\n// Toggle hidden\nexport function toggleHidden(element, hidden) {\n    if (!is.element(element)) {\n        return;\n    }\n\n    let hide = hidden;\n\n    if (!is.boolean(hide)) {\n        hide = !element.hidden;\n    }\n\n    if (hide) {\n        element.setAttribute('hidden', '');\n    } else {\n        element.removeAttribute('hidden');\n    }\n}\n\n// Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\nexport function toggleClass(element, className, force) {\n    if (is.nodeList(element)) {\n        return Array.from(element).map(e => toggleClass(e, className, force));\n    }\n\n    if (is.element(element)) {\n        let method = 'toggle';\n        if (typeof force !== 'undefined') {\n            method = force ? 'add' : 'remove';\n        }\n\n        element.classList[method](className);\n        return element.classList.contains(className);\n    }\n\n    return false;\n}\n\n// Has class name\nexport function hasClass(element, className) {\n    return is.element(element) && element.classList.contains(className);\n}\n\n// Element matches selector\nexport function matches(element, selector) {\n    const prototype = { Element };\n\n    function match() {\n        return Array.from(document.querySelectorAll(selector)).includes(this);\n    }\n\n    const matches =\n        prototype.matches ||\n        prototype.webkitMatchesSelector ||\n        prototype.mozMatchesSelector ||\n        prototype.msMatchesSelector ||\n        match;\n\n    return matches.call(element, selector);\n}\n\n// Find all elements\nexport function getElements(selector) {\n    return this.elements.container.querySelectorAll(selector);\n}\n\n// Find a single element\nexport function getElement(selector) {\n    return this.elements.container.querySelector(selector);\n}\n\n// Trap focus inside container\nexport function trapFocus(element = null, toggle = false) {\n    if (!is.element(element)) {\n        return;\n    }\n\n    const focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');\n    const first = focusable[0];\n    const last = focusable[focusable.length - 1];\n\n    const trap = event => {\n        // Bail if not tab key or not fullscreen\n        if (event.key !== 'Tab' || event.keyCode !== 9) {\n            return;\n        }\n\n        // Get the current focused element\n        const focused = document.activeElement;\n\n        if (focused === last && !event.shiftKey) {\n            // Move focus to first element that can be tabbed if Shift isn't used\n            first.focus();\n            event.preventDefault();\n        } else if (focused === first && event.shiftKey) {\n            // Move focus to last element that can be tabbed if Shift is used\n            last.focus();\n            event.preventDefault();\n        }\n    };\n\n    toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);\n}\n\n// Set focus and tab focus class\nexport function setFocus(element = null, tabFocus = false) {\n    if (!is.element(element)) {\n        return;\n    }\n\n    // Set regular focus\n    element.focus({ preventScroll: true });\n\n    // If we want to mimic keyboard focus via tab\n    if (tabFocus) {\n        toggleClass(element, this.config.classNames.tabFocus);\n    }\n}\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\nimport { toggleHidden } from './elements';\nimport is from './is';\n\nexport const transitionEndEvent = (() => {\n    const element = document.createElement('span');\n\n    const events = {\n        WebkitTransition: 'webkitTransitionEnd',\n        MozTransition: 'transitionend',\n        OTransition: 'oTransitionEnd otransitionend',\n        transition: 'transitionend',\n    };\n\n    const type = Object.keys(events).find(event => element.style[event] !== undefined);\n\n    return is.string(type) ? events[type] : false;\n})();\n\n// Force repaint of element\nexport function repaint(element) {\n    setTimeout(() => {\n        try {\n            toggleHidden(element, true);\n            element.offsetHeight; // eslint-disable-line\n            toggleHidden(element, false);\n        } catch (e) {\n            // Do nothing\n        }\n    }, 0);\n}\n","// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\n\nconst browser = {\n    isIE: /* @cc_on!@ */ false || !!document.documentMode,\n    isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n    isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n    isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform),\n};\n\nexport default browser;\n","// ==========================================================================\n// Plyr support checks\n// ==========================================================================\n\nimport { transitionEndEvent } from './utils/animation';\nimport browser from './utils/browser';\nimport { createElement } from './utils/elements';\nimport is from './utils/is';\n\n// Default codecs for checking mimetype support\nconst defaultCodecs = {\n    'audio/ogg': 'vorbis',\n    'audio/wav': '1',\n    'video/webm': 'vp8, vorbis',\n    'video/mp4': 'avc1.42E01E, mp4a.40.2',\n    'video/ogg': 'theora',\n};\n\n// Check for feature support\nconst support = {\n    // Basic support\n    audio: 'canPlayType' in document.createElement('audio'),\n    video: 'canPlayType' in document.createElement('video'),\n\n    // Check for support\n    // Basic functionality vs full UI\n    check(type, provider, playsinline) {\n        const canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n        const api = support[type] || provider !== 'html5';\n        const ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\n        return {\n            api,\n            ui,\n        };\n    },\n\n    // Picture-in-picture support\n    // Safari & Chrome only currently\n    pip: (() => {\n        if (browser.isIPhone) {\n            return false;\n        }\n\n        // Safari\n        // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n        if (is.function(createElement('video').webkitSetPresentationMode)) {\n            return true;\n        }\n\n        // Chrome\n        // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n        if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n            return true;\n        }\n\n        return false;\n    })(),\n\n    // Airplay support\n    // Safari only currently\n    airplay: is.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\n    // Inline playback support\n    // https://webkit.org/blog/6784/new-video-policies-for-ios/\n    playsinline: 'playsInline' in document.createElement('video'),\n\n    // Check for mime type support against a player instance\n    // Credits: http://diveintohtml5.info/everything.html\n    // Related: http://www.leanbackplayer.com/test/h5mt.html\n    mime(inputType) {\n        const [mediaType] = inputType.split('/');\n        let type = inputType;\n\n        // Verify we're using HTML5 and there's no media type mismatch\n        if (!this.isHTML5 || mediaType !== this.type) {\n            return false;\n        }\n\n        // Add codec if required\n        if (Object.keys(defaultCodecs).includes(type)) {\n            type += `; codecs=\"${defaultCodecs[inputType]}\"`;\n        }\n\n        try {\n            return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n        } catch (e) {\n            return false;\n        }\n    },\n\n    // Check for textTracks support\n    textTracks: 'textTracks' in document.createElement('video'),\n\n    // <input type=\"range\"> Sliders\n    rangeInput: (() => {\n        const range = document.createElement('input');\n        range.type = 'range';\n        return range.type === 'range';\n    })(),\n\n    // Touch\n    // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n    touch: 'ontouchstart' in document.documentElement,\n\n    // Detect transitions support\n    transitions: transitionEndEvent !== false,\n\n    // Reduced motion iOS & MacOS setting\n    // https://webkit.org/blog/7551/responsive-design-for-motion/\n    reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches,\n};\n\nexport default support;\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\n\nconst html5 = {\n    getSources() {\n        if (!this.isHTML5) {\n            return [];\n        }\n\n        const sources = Array.from(this.media.querySelectorAll('source'));\n\n        // Filter out unsupported sources\n        return sources.filter(source => support.mime.call(this, source.getAttribute('type')));\n    },\n\n    // Get quality levels\n    getQualityOptions() {\n        // Get sizes from <source> elements\n        return html5.getSources\n            .call(this)\n            .map(source => Number(source.getAttribute('size')))\n            .filter(Boolean);\n    },\n\n    extend() {\n        if (!this.isHTML5) {\n            return;\n        }\n\n        const player = this;\n\n        // Quality\n        Object.defineProperty(player.media, 'quality', {\n            get() {\n                // Get sources\n                const sources = html5.getSources.call(player);\n                const source = sources.find(source => source.getAttribute('src') === player.source);\n\n                // Return size, if match is found\n                return source && Number(source.getAttribute('size'));\n            },\n            set(input) {\n                // Get sources\n                const sources = html5.getSources.call(player);\n\n                // Get first match for requested size\n                const source = sources.find(source => Number(source.getAttribute('size')) === input);\n\n                // No matching source found\n                if (!source) {\n                    return;\n                }\n\n                // Get current state\n                const { currentTime, paused, preload, readyState } = player.media;\n\n                // Set new source\n                player.media.src = source.getAttribute('src');\n\n                // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n                if (preload !== 'none' || readyState) {\n                    // Restore time\n                    player.once('loadedmetadata', () => {\n                        player.currentTime = currentTime;\n\n                        // Resume playing\n                        if (!paused) {\n                            player.play();\n                        }\n                    });\n\n                    // Load new source\n                    player.media.load();\n                }\n\n                // Trigger change event\n                triggerEvent.call(player, player.media, 'qualitychange', false, {\n                    quality: input,\n                });\n            },\n        });\n    },\n\n    // Cancel current network requests\n    // See https://github.com/sampotts/plyr/issues/174\n    cancelRequests() {\n        if (!this.isHTML5) {\n            return;\n        }\n\n        // Remove child sources\n        removeElement(html5.getSources.call(this));\n\n        // Set blank video src attribute\n        // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n        // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n        this.media.setAttribute('src', this.config.blankVideo);\n\n        // Load the new empty source\n        // This will cancel existing requests\n        // See https://github.com/sampotts/plyr/issues/174\n        this.media.load();\n\n        // Debugging\n        this.debug.log('Cancelled network requests');\n    },\n};\n\nexport default html5;\n","// ==========================================================================\n// Array utils\n// ==========================================================================\n\nimport is from './is';\n\n// Remove duplicates in an array\nexport function dedupe(array) {\n    if (!is.array(array)) {\n        return array;\n    }\n\n    return array.filter((item, index) => array.indexOf(item) === index);\n}\n\n// Get the closest value in an array\nexport function closest(array, value) {\n    if (!is.array(array) || !array.length) {\n        return null;\n    }\n\n    return array.reduce((prev, curr) => (Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev));\n}\n","// ==========================================================================\n// Object utils\n// ==========================================================================\n\nimport is from './is';\n\n// Clone nested objects\nexport function cloneDeep(object) {\n    return JSON.parse(JSON.stringify(object));\n}\n\n// Get a nested value in an object\nexport function getDeep(object, path) {\n    return path.split('.').reduce((obj, key) => obj && obj[key], object);\n}\n\n// Deep extend destination object with N more objects\nexport function extend(target = {}, ...sources) {\n    if (!sources.length) {\n        return target;\n    }\n\n    const source = sources.shift();\n\n    if (!is.object(source)) {\n        return target;\n    }\n\n    Object.keys(source).forEach(key => {\n        if (is.object(source[key])) {\n            if (!Object.keys(target).includes(key)) {\n                Object.assign(target, { [key]: {} });\n            }\n\n            extend(target[key], source[key]);\n        } else {\n            Object.assign(target, { [key]: source[key] });\n        }\n    });\n\n    return extend(target, ...sources);\n}\n","// ==========================================================================\n// String utils\n// ==========================================================================\n\nimport is from './is';\n\n// Generate a random ID\nexport function generateId(prefix) {\n    return `${prefix}-${Math.floor(Math.random() * 10000)}`;\n}\n\n// Format string\nexport function format(input, ...args) {\n    if (is.empty(input)) {\n        return input;\n    }\n\n    return input.toString().replace(/{(\\d+)}/g, (match, i) => args[i].toString());\n}\n\n// Get percentage\nexport function getPercentage(current, max) {\n    if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n        return 0;\n    }\n\n    return ((current / max) * 100).toFixed(2);\n}\n\n// Replace all occurances of a string in a string\nexport function replaceAll(input = '', find = '', replace = '') {\n    return input.replace(\n        new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'),\n        replace.toString(),\n    );\n}\n\n// Convert to title case\nexport function toTitleCase(input = '') {\n    return input.toString().replace(/\\w\\S*/g, text => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\n}\n\n// Convert string to pascalCase\nexport function toPascalCase(input = '') {\n    let string = input.toString();\n\n    // Convert kebab case\n    string = replaceAll(string, '-', ' ');\n\n    // Convert snake case\n    string = replaceAll(string, '_', ' ');\n\n    // Convert to title case\n    string = toTitleCase(string);\n\n    // Convert to pascal case\n    return replaceAll(string, ' ', '');\n}\n\n// Convert string to pascalCase\nexport function toCamelCase(input = '') {\n    let string = input.toString();\n\n    // Convert to pascal case\n    string = toPascalCase(string);\n\n    // Convert first character to lowercase\n    return string.charAt(0).toLowerCase() + string.slice(1);\n}\n\n// Remove HTML from a string\nexport function stripHTML(source) {\n    const fragment = document.createDocumentFragment();\n    const element = document.createElement('div');\n    fragment.appendChild(element);\n    element.innerHTML = source;\n    return fragment.firstChild.innerText;\n}\n\n// Like outerHTML, but also works for DocumentFragment\nexport function getHTML(element) {\n    const wrapper = document.createElement('div');\n    wrapper.appendChild(element);\n    return wrapper.innerHTML;\n}\n","// ==========================================================================\n// Plyr internationalization\n// ==========================================================================\n\nimport is from './is';\nimport { getDeep } from './objects';\nimport { replaceAll } from './strings';\n\n// Skip i18n for abbreviations and brand names\nconst resources = {\n    pip: 'PIP',\n    airplay: 'AirPlay',\n    html5: 'HTML5',\n    vimeo: 'Vimeo',\n    youtube: 'YouTube',\n};\n\nconst i18n = {\n    get(key = '', config = {}) {\n        if (is.empty(key) || is.empty(config)) {\n            return '';\n        }\n\n        let string = getDeep(config.i18n, key);\n\n        if (is.empty(string)) {\n            if (Object.keys(resources).includes(key)) {\n                return resources[key];\n            }\n\n            return '';\n        }\n\n        const replace = {\n            '{seektime}': config.seekTime,\n            '{title}': config.title,\n        };\n\n        Object.entries(replace).forEach(([key, value]) => {\n            string = replaceAll(string, key, value);\n        });\n\n        return string;\n    },\n};\n\nexport default i18n;\n","// ==========================================================================\n// Plyr storage\n// ==========================================================================\n\nimport is from './utils/is';\nimport { extend } from './utils/objects';\n\nclass Storage {\n    constructor(player) {\n        this.enabled = player.config.storage.enabled;\n        this.key = player.config.storage.key;\n    }\n\n    // Check for actual support (see if we can use it)\n    static get supported() {\n        try {\n            if (!('localStorage' in window)) {\n                return false;\n            }\n\n            const test = '___test';\n\n            // Try to use it (it might be disabled, e.g. user is in private mode)\n            // see: https://github.com/sampotts/plyr/issues/131\n            window.localStorage.setItem(test, test);\n            window.localStorage.removeItem(test);\n\n            return true;\n        } catch (e) {\n            return false;\n        }\n    }\n\n    get(key) {\n        if (!Storage.supported || !this.enabled) {\n            return null;\n        }\n\n        const store = window.localStorage.getItem(this.key);\n\n        if (is.empty(store)) {\n            return null;\n        }\n\n        const json = JSON.parse(store);\n\n        return is.string(key) && key.length ? json[key] : json;\n    }\n\n    set(object) {\n        // Bail if we don't have localStorage support or it's disabled\n        if (!Storage.supported || !this.enabled) {\n            return;\n        }\n\n        // Can only store objectst\n        if (!is.object(object)) {\n            return;\n        }\n\n        // Get current storage\n        let storage = this.get();\n\n        // Default to empty object\n        if (is.empty(storage)) {\n            storage = {};\n        }\n\n        // Update the working copy of the values\n        extend(storage, object);\n\n        // Update storage\n        window.localStorage.setItem(this.key, JSON.stringify(storage));\n    }\n}\n\nexport default Storage;\n","// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\n\nexport default function fetch(url, responseType = 'text') {\n    return new Promise((resolve, reject) => {\n        try {\n            const request = new XMLHttpRequest();\n\n            // Check for CORS support\n            if (!('withCredentials' in request)) {\n                return;\n            }\n\n            request.addEventListener('load', () => {\n                if (responseType === 'text') {\n                    try {\n                        resolve(JSON.parse(request.responseText));\n                    } catch (e) {\n                        resolve(request.responseText);\n                    }\n                } else {\n                    resolve(request.response);\n                }\n            });\n\n            request.addEventListener('error', () => {\n                throw new Error(request.status);\n            });\n\n            request.open('GET', url, true);\n\n            // Set the required response type\n            request.responseType = responseType;\n\n            request.send();\n        } catch (e) {\n            reject(e);\n        }\n    });\n}\n","// ==========================================================================\n// Sprite loader\n// ==========================================================================\n\nimport Storage from '../storage';\nimport fetch from './fetch';\nimport is from './is';\n\n// Load an external SVG sprite\nexport default function loadSprite(url, id) {\n    if (!is.string(url)) {\n        return;\n    }\n\n    const prefix = 'cache';\n    const hasId = is.string(id);\n    let isCached = false;\n\n    const exists = () => document.getElementById(id) !== null;\n\n    const update = (container, data) => {\n        container.innerHTML = data;\n\n        // Check again incase of race condition\n        if (hasId && exists()) {\n            return;\n        }\n\n        // Inject the SVG to the body\n        document.body.insertAdjacentElement('afterbegin', container);\n    };\n\n    // Only load once if ID set\n    if (!hasId || !exists()) {\n        const useStorage = Storage.supported;\n\n        // Create container\n        const container = document.createElement('div');\n        container.setAttribute('hidden', '');\n\n        if (hasId) {\n            container.setAttribute('id', id);\n        }\n\n        // Check in cache\n        if (useStorage) {\n            const cached = window.localStorage.getItem(`${prefix}-${id}`);\n            isCached = cached !== null;\n\n            if (isCached) {\n                const data = JSON.parse(cached);\n                update(container, data.content);\n            }\n        }\n\n        // Get the sprite\n        fetch(url)\n            .then(result => {\n                if (is.empty(result)) {\n                    return;\n                }\n\n                if (useStorage) {\n                    window.localStorage.setItem(\n                        `${prefix}-${id}`,\n                        JSON.stringify({\n                            content: result,\n                        }),\n                    );\n                }\n\n                update(container, result);\n            })\n            .catch(() => {});\n    }\n}\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = value => parseInt((value / 60 / 60) % 60, 10);\nexport const getMinutes = value => parseInt((value / 60) % 60, 10);\nexport const getSeconds = value => parseInt(value % 60, 10);\n\n// Format time to UI friendly string\nexport function formatTime(time = 0, displayHours = false, inverted = false) {\n    // Bail if the value isn't a number\n    if (!is.number(time)) {\n        return formatTime(null, displayHours, inverted);\n    }\n\n    // Format time component to add leading zero\n    const format = value => `0${value}`.slice(-2);\n\n    // Breakdown to hours, mins, secs\n    let hours = getHours(time);\n    const mins = getMinutes(time);\n    const secs = getSeconds(time);\n\n    // Do we need to display hours?\n    if (displayHours || hours > 0) {\n        hours = `${hours}:`;\n    } else {\n        hours = '';\n    }\n\n    // Render\n    return `${inverted && time > 0 ? '-' : ''}${hours}${format(mins)}:${format(secs)}`;\n}\n","// ==========================================================================\n// Plyr controls\n// TODO: This needs to be split into smaller files and cleaned up\n// ==========================================================================\n\nimport captions from './captions';\nimport html5 from './html5';\nimport support from './support';\nimport { repaint, transitionEndEvent } from './utils/animation';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport { createElement, emptyElement, getAttributesFromSelector, getElement, getElements, hasClass, matches, removeElement, setAttributes, setFocus, toggleClass, toggleHidden } from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { extend } from './utils/objects';\nimport { getPercentage, replaceAll, toCamelCase, toTitleCase } from './utils/strings';\nimport { formatTime, getHours } from './utils/time';\n\n// TODO: Don't export a massive object - break down and create class\nconst controls = {\n    // Get icon URL\n    getIconUrl() {\n        const url = new URL(this.config.iconUrl, window.location);\n        const cors = url.host !== window.location.host || (browser.isIE && !window.svg4everybody);\n\n        return {\n            url: this.config.iconUrl,\n            cors,\n        };\n    },\n\n    // Find the UI controls\n    findElements() {\n        try {\n            this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper);\n\n            // Buttons\n            this.elements.buttons = {\n                play: getElements.call(this, this.config.selectors.buttons.play),\n                pause: getElement.call(this, this.config.selectors.buttons.pause),\n                restart: getElement.call(this, this.config.selectors.buttons.restart),\n                rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n                fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n                mute: getElement.call(this, this.config.selectors.buttons.mute),\n                pip: getElement.call(this, this.config.selectors.buttons.pip),\n                airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n                settings: getElement.call(this, this.config.selectors.buttons.settings),\n                captions: getElement.call(this, this.config.selectors.buttons.captions),\n                fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen),\n            };\n\n            // Progress\n            this.elements.progress = getElement.call(this, this.config.selectors.progress);\n\n            // Inputs\n            this.elements.inputs = {\n                seek: getElement.call(this, this.config.selectors.inputs.seek),\n                volume: getElement.call(this, this.config.selectors.inputs.volume),\n            };\n\n            // Display\n            this.elements.display = {\n                buffer: getElement.call(this, this.config.selectors.display.buffer),\n                currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n                duration: getElement.call(this, this.config.selectors.display.duration),\n            };\n\n            // Seek tooltip\n            if (is.element(this.elements.progress)) {\n                this.elements.display.seekTooltip = this.elements.progress.querySelector(\n                    `.${this.config.classNames.tooltip}`,\n                );\n            }\n\n            return true;\n        } catch (error) {\n            // Log it\n            this.debug.warn('It looks like there is a problem with your custom controls HTML', error);\n\n            // Restore native video controls\n            this.toggleNativeControls(true);\n\n            return false;\n        }\n    },\n\n    // Create <svg> icon\n    createIcon(type, attributes) {\n        const namespace = 'http://www.w3.org/2000/svg';\n        const iconUrl = controls.getIconUrl.call(this);\n        const iconPath = `${!iconUrl.cors ? iconUrl.url : ''}#${this.config.iconPrefix}`;\n\n        // Create <svg>\n        const icon = document.createElementNS(namespace, 'svg');\n        setAttributes(\n            icon,\n            extend(attributes, {\n                role: 'presentation',\n                focusable: 'false',\n            }),\n        );\n\n        // Create the <use> to reference sprite\n        const use = document.createElementNS(namespace, 'use');\n        const path = `${iconPath}-${type}`;\n\n        // Set `href` attributes\n        // https://github.com/sampotts/plyr/issues/460\n        // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n        if ('href' in use) {\n            use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n        }\n\n        // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n        use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n        // Add <use> to <svg>\n        icon.appendChild(use);\n\n        return icon;\n    },\n\n    // Create hidden text label\n    createLabel(key, attr = {}) {\n        const text = i18n.get(key, this.config);\n\n        const attributes = Object.assign({}, attr, {\n            class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' '),\n        });\n\n        return createElement('span', attributes, text);\n    },\n\n    // Create a badge\n    createBadge(text) {\n        if (is.empty(text)) {\n            return null;\n        }\n\n        const badge = createElement('span', {\n            class: this.config.classNames.menu.value,\n        });\n\n        badge.appendChild(\n            createElement(\n                'span',\n                {\n                    class: this.config.classNames.menu.badge,\n                },\n                text,\n            ),\n        );\n\n        return badge;\n    },\n\n    // Create a <button>\n    createButton(buttonType, attr) {\n        const attributes = Object.assign({}, attr);\n        let type = toCamelCase(buttonType);\n\n        const props = {\n            element: 'button',\n            toggle: false,\n            label: null,\n            icon: null,\n            labelPressed: null,\n            iconPressed: null,\n        };\n\n        ['element', 'icon', 'label'].forEach(key => {\n            if (Object.keys(attributes).includes(key)) {\n                props[key] = attributes[key];\n                delete attributes[key];\n            }\n        });\n\n        // Default to 'button' type to prevent form submission\n        if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n            attributes.type = 'button';\n        }\n\n        // Set class name\n        if (Object.keys(attributes).includes('class')) {\n            if (!attributes.class.includes(this.config.classNames.control)) {\n                attributes.class += ` ${this.config.classNames.control}`;\n            }\n        } else {\n            attributes.class = this.config.classNames.control;\n        }\n\n        // Large play button\n        switch (buttonType) {\n            case 'play':\n                props.toggle = true;\n                props.label = 'play';\n                props.labelPressed = 'pause';\n                props.icon = 'play';\n                props.iconPressed = 'pause';\n                break;\n\n            case 'mute':\n                props.toggle = true;\n                props.label = 'mute';\n                props.labelPressed = 'unmute';\n                props.icon = 'volume';\n                props.iconPressed = 'muted';\n                break;\n\n            case 'captions':\n                props.toggle = true;\n                props.label = 'enableCaptions';\n                props.labelPressed = 'disableCaptions';\n                props.icon = 'captions-off';\n                props.iconPressed = 'captions-on';\n                break;\n\n            case 'fullscreen':\n                props.toggle = true;\n                props.label = 'enterFullscreen';\n                props.labelPressed = 'exitFullscreen';\n                props.icon = 'enter-fullscreen';\n                props.iconPressed = 'exit-fullscreen';\n                break;\n\n            case 'play-large':\n                attributes.class += ` ${this.config.classNames.control}--overlaid`;\n                type = 'play';\n                props.label = 'play';\n                props.icon = 'play';\n                break;\n\n            default:\n                if (is.empty(props.label)) {\n                    props.label = type;\n                }\n                if (is.empty(props.icon)) {\n                    props.icon = buttonType;\n                }\n        }\n\n        const button = createElement(props.element);\n\n        // Setup toggle icon and labels\n        if (props.toggle) {\n            // Icon\n            button.appendChild(\n                controls.createIcon.call(this, props.iconPressed, {\n                    class: 'icon--pressed',\n                }),\n            );\n            button.appendChild(\n                controls.createIcon.call(this, props.icon, {\n                    class: 'icon--not-pressed',\n                }),\n            );\n\n            // Label/Tooltip\n            button.appendChild(\n                controls.createLabel.call(this, props.labelPressed, {\n                    class: 'label--pressed',\n                }),\n            );\n            button.appendChild(\n                controls.createLabel.call(this, props.label, {\n                    class: 'label--not-pressed',\n                }),\n            );\n        } else {\n            button.appendChild(controls.createIcon.call(this, props.icon));\n            button.appendChild(controls.createLabel.call(this, props.label));\n        }\n\n        // Merge and set attributes\n        extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n        setAttributes(button, attributes);\n\n        // We have multiple play buttons\n        if (type === 'play') {\n            if (!is.array(this.elements.buttons[type])) {\n                this.elements.buttons[type] = [];\n            }\n\n            this.elements.buttons[type].push(button);\n        } else {\n            this.elements.buttons[type] = button;\n        }\n\n        return button;\n    },\n\n    // Create an <input type='range'>\n    createRange(type, attributes) {\n        // Seek input\n        const input = createElement(\n            'input',\n            extend(\n                getAttributesFromSelector(this.config.selectors.inputs[type]),\n                {\n                    type: 'range',\n                    min: 0,\n                    max: 100,\n                    step: 0.01,\n                    value: 0,\n                    autocomplete: 'off',\n                    // A11y fixes for https://github.com/sampotts/plyr/issues/905\n                    role: 'slider',\n                    'aria-label': i18n.get(type, this.config),\n                    'aria-valuemin': 0,\n                    'aria-valuemax': 100,\n                    'aria-valuenow': 0,\n                },\n                attributes,\n            ),\n        );\n\n        this.elements.inputs[type] = input;\n\n        // Set the fill for webkit now\n        controls.updateRangeFill.call(this, input);\n\n        return input;\n    },\n\n    // Create a <progress>\n    createProgress(type, attributes) {\n        const progress = createElement(\n            'progress',\n            extend(\n                getAttributesFromSelector(this.config.selectors.display[type]),\n                {\n                    min: 0,\n                    max: 100,\n                    value: 0,\n                    role: 'presentation',\n                    'aria-hidden': true,\n                },\n                attributes,\n            ),\n        );\n\n        // Create the label inside\n        if (type !== 'volume') {\n            progress.appendChild(createElement('span', null, '0'));\n\n            const suffixKey = {\n                played: 'played',\n                buffer: 'buffered',\n            }[type];\n            const suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\n            progress.innerText = `% ${suffix.toLowerCase()}`;\n        }\n\n        this.elements.display[type] = progress;\n\n        return progress;\n    },\n\n    // Create time display\n    createTime(type) {\n        const attributes = getAttributesFromSelector(this.config.selectors.display[type]);\n\n        const container = createElement(\n            'div',\n            extend(attributes, {\n                class: `${this.config.classNames.display.time} ${attributes.class ? attributes.class : ''}`.trim(),\n                'aria-label': i18n.get(type, this.config),\n            }),\n            '00:00',\n        );\n\n        // Reference for updates\n        this.elements.display[type] = container;\n\n        return container;\n    },\n\n    // Bind keyboard shortcuts for a menu item\n    // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n    bindMenuItemShortcuts(menuItem, type) {\n        // Navigate through menus via arrow keys and space\n        on(\n            menuItem,\n            'keydown keyup',\n            event => {\n                // We only care about space and ⬆️ ⬇️️ ➡️\n                if (![32, 38, 39, 40].includes(event.which)) {\n                    return;\n                }\n\n                // Prevent play / seek\n                event.preventDefault();\n                event.stopPropagation();\n\n                // We're just here to prevent the keydown bubbling\n                if (event.type === 'keydown') {\n                    return;\n                }\n\n                const isRadioButton = matches(menuItem, '[role=\"menuitemradio\"]');\n\n                // Show the respective menu\n                if (!isRadioButton && [32, 39].includes(event.which)) {\n                    controls.showMenuPanel.call(this, type, true);\n                } else {\n                    let target;\n\n                    if (event.which !== 32) {\n                        if (event.which === 40 || (isRadioButton && event.which === 39)) {\n                            target = menuItem.nextElementSibling;\n\n                            if (!is.element(target)) {\n                                target = menuItem.parentNode.firstElementChild;\n                            }\n                        } else {\n                            target = menuItem.previousElementSibling;\n\n                            if (!is.element(target)) {\n                                target = menuItem.parentNode.lastElementChild;\n                            }\n                        }\n\n                        setFocus.call(this, target, true);\n                    }\n                }\n            },\n            false,\n        );\n\n        // Enter will fire a `click` event but we still need to manage focus\n        // So we bind to keyup which fires after and set focus here\n        on(menuItem, 'keyup', event => {\n            if (event.which !== 13) {\n                return;\n            }\n\n            controls.focusFirstMenuItem.call(this, null, true);\n        });\n    },\n\n    // Create a settings menu item\n    createMenuItem({ value, list, type, title, badge = null, checked = false }) {\n        const attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\n        const menuItem = createElement(\n            'button',\n            extend(attributes, {\n                type: 'button',\n                role: 'menuitemradio',\n                class: `${this.config.classNames.control} ${attributes.class ? attributes.class : ''}`.trim(),\n                'aria-checked': checked,\n                value,\n            }),\n        );\n\n        const flex = createElement('span');\n\n        // We have to set as HTML incase of special characters\n        flex.innerHTML = title;\n\n        if (is.element(badge)) {\n            flex.appendChild(badge);\n        }\n\n        menuItem.appendChild(flex);\n\n        // Replicate radio button behaviour\n        Object.defineProperty(menuItem, 'checked', {\n            enumerable: true,\n            get() {\n                return menuItem.getAttribute('aria-checked') === 'true';\n            },\n            set(checked) {\n                // Ensure exclusivity\n                if (checked) {\n                    Array.from(menuItem.parentNode.children)\n                        .filter(node => matches(node, '[role=\"menuitemradio\"]'))\n                        .forEach(node => node.setAttribute('aria-checked', 'false'));\n                }\n\n                menuItem.setAttribute('aria-checked', checked ? 'true' : 'false');\n            },\n        });\n\n        this.listeners.bind(\n            menuItem,\n            'click keyup',\n            event => {\n                if (is.keyboardEvent(event) && event.which !== 32) {\n                    return;\n                }\n\n                event.preventDefault();\n                event.stopPropagation();\n\n                menuItem.checked = true;\n\n                switch (type) {\n                    case 'language':\n                        this.currentTrack = Number(value);\n                        break;\n\n                    case 'quality':\n                        this.quality = value;\n                        break;\n\n                    case 'speed':\n                        this.speed = parseFloat(value);\n                        break;\n\n                    default:\n                        break;\n                }\n\n                controls.showMenuPanel.call(this, 'home', is.keyboardEvent(event));\n            },\n            type,\n            false,\n        );\n\n        controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n        list.appendChild(menuItem);\n    },\n\n    // Format a time for display\n    formatTime(time = 0, inverted = false) {\n        // Bail if the value isn't a number\n        if (!is.number(time)) {\n            return time;\n        }\n\n        // Always display hours if duration is over an hour\n        const forceHours = getHours(this.duration) > 0;\n\n        return formatTime(time, forceHours, inverted);\n    },\n\n    // Update the displayed time\n    updateTimeDisplay(target = null, time = 0, inverted = false) {\n        // Bail if there's no element to display or the value isn't a number\n        if (!is.element(target) || !is.number(time)) {\n            return;\n        }\n\n        // eslint-disable-next-line no-param-reassign\n        target.innerText = controls.formatTime(time, inverted);\n    },\n\n    // Update volume UI and storage\n    updateVolume() {\n        if (!this.supported.ui) {\n            return;\n        }\n\n        // Update range\n        if (is.element(this.elements.inputs.volume)) {\n            controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n        }\n\n        // Update mute state\n        if (is.element(this.elements.buttons.mute)) {\n            this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n        }\n    },\n\n    // Update seek value and lower fill\n    setRange(target, value = 0) {\n        if (!is.element(target)) {\n            return;\n        }\n\n        // eslint-disable-next-line\n        target.value = value;\n\n        // Webkit range fill\n        controls.updateRangeFill.call(this, target);\n    },\n\n    // Update <progress> elements\n    updateProgress(event) {\n        if (!this.supported.ui || !is.event(event)) {\n            return;\n        }\n\n        let value = 0;\n\n        const setProgress = (target, input) => {\n            const value = is.number(input) ? input : 0;\n            const progress = is.element(target) ? target : this.elements.display.buffer;\n\n            // Update value and label\n            if (is.element(progress)) {\n                progress.value = value;\n\n                // Update text label inside\n                const label = progress.getElementsByTagName('span')[0];\n                if (is.element(label)) {\n                    label.childNodes[0].nodeValue = value;\n                }\n            }\n        };\n\n        if (event) {\n            switch (event.type) {\n                // Video playing\n                case 'timeupdate':\n                case 'seeking':\n                case 'seeked':\n                    value = getPercentage(this.currentTime, this.duration);\n\n                    // Set seek range value only if it's a 'natural' time event\n                    if (event.type === 'timeupdate') {\n                        controls.setRange.call(this, this.elements.inputs.seek, value);\n                    }\n\n                    break;\n\n                // Check buffer status\n                case 'playing':\n                case 'progress':\n                    setProgress(this.elements.display.buffer, this.buffered * 100);\n\n                    break;\n\n                default:\n                    break;\n            }\n        }\n    },\n\n    // Webkit polyfill for lower fill range\n    updateRangeFill(target) {\n        // Get range from event if event passed\n        const range = is.event(target) ? target.target : target;\n\n        // Needs to be a valid <input type='range'>\n        if (!is.element(range) || range.getAttribute('type') !== 'range') {\n            return;\n        }\n\n        // Set aria values for https://github.com/sampotts/plyr/issues/905\n        if (matches(range, this.config.selectors.inputs.seek)) {\n            range.setAttribute('aria-valuenow', this.currentTime);\n            const currentTime = controls.formatTime(this.currentTime);\n            const duration = controls.formatTime(this.duration);\n            const format = i18n.get('seekLabel', this.config);\n            range.setAttribute(\n                'aria-valuetext',\n                format.replace('{currentTime}', currentTime).replace('{duration}', duration),\n            );\n        } else if (matches(range, this.config.selectors.inputs.volume)) {\n            const percent = range.value * 100;\n            range.setAttribute('aria-valuenow', percent);\n            range.setAttribute('aria-valuetext', `${percent.toFixed(1)}%`);\n        } else {\n            range.setAttribute('aria-valuenow', range.value);\n        }\n\n        // WebKit only\n        if (!browser.isWebkit) {\n            return;\n        }\n\n        // Set CSS custom property\n        range.style.setProperty('--value', `${range.value / range.max * 100}%`);\n    },\n\n    // Update hover tooltip for seeking\n    updateSeekTooltip(event) {\n        // Bail if setting not true\n        if (\n            !this.config.tooltips.seek ||\n            !is.element(this.elements.inputs.seek) ||\n            !is.element(this.elements.display.seekTooltip) ||\n            this.duration === 0\n        ) {\n            return;\n        }\n\n        // Calculate percentage\n        let percent = 0;\n        const clientRect = this.elements.progress.getBoundingClientRect();\n        const visible = `${this.config.classNames.tooltip}--visible`;\n\n        const toggle = toggle => {\n            toggleClass(this.elements.display.seekTooltip, visible, toggle);\n        };\n\n        // Hide on touch\n        if (this.touch) {\n            toggle(false);\n            return;\n        }\n\n        // Determine percentage, if already visible\n        if (is.event(event)) {\n            percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n        } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n            percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n        } else {\n            return;\n        }\n\n        // Set bounds\n        if (percent < 0) {\n            percent = 0;\n        } else if (percent > 100) {\n            percent = 100;\n        }\n\n        // Display the time a click would seek to\n        controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent);\n\n        // Set position\n        this.elements.display.seekTooltip.style.left = `${percent}%`;\n\n        // Show/hide the tooltip\n        // If the event is a moues in/out and percentage is inside bounds\n        if (is.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n            toggle(event.type === 'mouseenter');\n        }\n    },\n\n    // Handle time change event\n    timeUpdate(event) {\n        // Only invert if only one time element is displayed and used for both duration and currentTime\n        const invert = !is.element(this.elements.display.duration) && this.config.invertTime;\n\n        // Duration\n        controls.updateTimeDisplay.call(\n            this,\n            this.elements.display.currentTime,\n            invert ? this.duration - this.currentTime : this.currentTime,\n            invert,\n        );\n\n        // Ignore updates while seeking\n        if (event && event.type === 'timeupdate' && this.media.seeking) {\n            return;\n        }\n\n        // Playing progress\n        controls.updateProgress.call(this, event);\n    },\n\n    // Show the duration on metadataloaded or durationchange events\n    durationUpdate() {\n        // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n        if (!this.supported.ui || (!this.config.invertTime && this.currentTime)) {\n            return;\n        }\n\n        // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.\n        // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n        // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n        // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n        if (this.duration >= 2 ** 32) {\n            toggleHidden(this.elements.display.currentTime, true);\n            toggleHidden(this.elements.progress, true);\n            return;\n        }\n\n        // Update ARIA values\n        if (is.element(this.elements.inputs.seek)) {\n            this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n        }\n\n        // If there's a spot to display duration\n        const hasDuration = is.element(this.elements.display.duration);\n\n        // If there's only one time display, display duration there\n        if (!hasDuration && this.config.displayDuration && this.paused) {\n            controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n        }\n\n        // If there's a duration element, update content\n        if (hasDuration) {\n            controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n        }\n\n        // Update the tooltip (if visible)\n        controls.updateSeekTooltip.call(this);\n    },\n\n    // Hide/show a tab\n    toggleMenuButton(setting, toggle) {\n        toggleHidden(this.elements.settings.buttons[setting], !toggle);\n    },\n\n    // Update the selected setting\n    updateSetting(setting, container, input) {\n        const pane = this.elements.settings.panels[setting];\n        let value = null;\n        let list = container;\n\n        if (setting === 'captions') {\n            value = this.currentTrack;\n        } else {\n            value = !is.empty(input) ? input : this[setting];\n\n            // Get default\n            if (is.empty(value)) {\n                value = this.config[setting].default;\n            }\n\n            // Unsupported value\n            if (!is.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n                this.debug.warn(`Unsupported value of '${value}' for ${setting}`);\n                return;\n            }\n\n            // Disabled value\n            if (!this.config[setting].options.includes(value)) {\n                this.debug.warn(`Disabled value of '${value}' for ${setting}`);\n                return;\n            }\n        }\n\n        // Get the list if we need to\n        if (!is.element(list)) {\n            list = pane && pane.querySelector('[role=\"menu\"]');\n        }\n\n        // If there's no list it means it's not been rendered...\n        if (!is.element(list)) {\n            return;\n        }\n\n        // Update the label\n        const label = this.elements.settings.buttons[setting].querySelector(`.${this.config.classNames.menu.value}`);\n        label.innerHTML = controls.getLabel.call(this, setting, value);\n\n        // Find the radio option and check it\n        const target = list && list.querySelector(`[value=\"${value}\"]`);\n\n        if (is.element(target)) {\n            target.checked = true;\n        }\n    },\n\n    // Translate a value into a nice label\n    getLabel(setting, value) {\n        switch (setting) {\n            case 'speed':\n                return value === 1 ? i18n.get('normal', this.config) : `${value}&times;`;\n\n            case 'quality':\n                if (is.number(value)) {\n                    const label = i18n.get(`qualityLabel.${value}`, this.config);\n\n                    if (!label.length) {\n                        return `${value}p`;\n                    }\n\n                    return label;\n                }\n\n                return toTitleCase(value);\n\n            case 'captions':\n                return captions.getLabel.call(this);\n\n            default:\n                return null;\n        }\n    },\n\n    // Set the quality menu\n    setQualityMenu(options) {\n        // Menu required\n        if (!is.element(this.elements.settings.panels.quality)) {\n            return;\n        }\n\n        const type = 'quality';\n        const list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]');\n\n        // Set options if passed and filter based on uniqueness and config\n        if (is.array(options)) {\n            this.options.quality = dedupe(options).filter(quality => this.config.quality.options.includes(quality));\n        }\n\n        // Toggle the pane and tab\n        const toggle = !is.empty(this.options.quality) && this.options.quality.length > 1;\n        controls.toggleMenuButton.call(this, type, toggle);\n\n        // Empty the menu\n        emptyElement(list);\n\n        // Check if we need to toggle the parent\n        controls.checkMenu.call(this);\n\n        // If we're hiding, nothing more to do\n        if (!toggle) {\n            return;\n        }\n\n        // Get the badge HTML for HD, 4K etc\n        const getBadge = quality => {\n            const label = i18n.get(`qualityBadge.${quality}`, this.config);\n\n            if (!label.length) {\n                return null;\n            }\n\n            return controls.createBadge.call(this, label);\n        };\n\n        // Sort options by the config and then render options\n        this.options.quality\n            .sort((a, b) => {\n                const sorting = this.config.quality.options;\n                return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n            })\n            .forEach(quality => {\n                controls.createMenuItem.call(this, {\n                    value: quality,\n                    list,\n                    type,\n                    title: controls.getLabel.call(this, 'quality', quality),\n                    badge: getBadge(quality),\n                });\n            });\n\n        controls.updateSetting.call(this, type, list);\n    },\n\n    // Set the looping options\n    /* setLoopMenu() {\n        // Menu required\n        if (!is.element(this.elements.settings.panels.loop)) {\n            return;\n        }\n\n        const options = ['start', 'end', 'all', 'reset'];\n        const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\n        // Show the pane and tab\n        toggleHidden(this.elements.settings.buttons.loop, false);\n        toggleHidden(this.elements.settings.panels.loop, false);\n\n        // Toggle the pane and tab\n        const toggle = !is.empty(this.loop.options);\n        controls.toggleMenuButton.call(this, 'loop', toggle);\n\n        // Empty the menu\n        emptyElement(list);\n\n        options.forEach(option => {\n            const item = createElement('li');\n\n            const button = createElement(\n                'button',\n                extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n                    type: 'button',\n                    class: this.config.classNames.control,\n                    'data-plyr-loop-action': option,\n                }),\n                i18n.get(option, this.config)\n            );\n\n            if (['start', 'end'].includes(option)) {\n                const badge = controls.createBadge.call(this, '00:00');\n                button.appendChild(badge);\n            }\n\n            item.appendChild(button);\n            list.appendChild(item);\n        });\n    }, */\n\n    // Get current selected caption language\n    // TODO: rework this to user the getter in the API?\n\n    // Set a list of available captions languages\n    setCaptionsMenu() {\n        // Menu required\n        if (!is.element(this.elements.settings.panels.captions)) {\n            return;\n        }\n\n        // TODO: Captions or language? Currently it's mixed\n        const type = 'captions';\n        const list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n        const tracks = captions.getTracks.call(this);\n        const toggle = Boolean(tracks.length);\n\n        // Toggle the pane and tab\n        controls.toggleMenuButton.call(this, type, toggle);\n\n        // Empty the menu\n        emptyElement(list);\n\n        // Check if we need to toggle the parent\n        controls.checkMenu.call(this);\n\n        // If there's no captions, bail\n        if (!toggle) {\n            return;\n        }\n\n        // Generate options data\n        const options = tracks.map((track, value) => ({\n            value,\n            checked: this.captions.toggled && this.currentTrack === value,\n            title: captions.getLabel.call(this, track),\n            badge: track.language && controls.createBadge.call(this, track.language.toUpperCase()),\n            list,\n            type: 'language',\n        }));\n\n        // Add the \"Disabled\" option to turn off captions\n        options.unshift({\n            value: -1,\n            checked: !this.captions.toggled,\n            title: i18n.get('disabled', this.config),\n            list,\n            type: 'language',\n        });\n\n        // Generate options\n        options.forEach(controls.createMenuItem.bind(this));\n\n        controls.updateSetting.call(this, type, list);\n    },\n\n    // Set a list of available captions languages\n    setSpeedMenu(options) {\n        // Menu required\n        if (!is.element(this.elements.settings.panels.speed)) {\n            return;\n        }\n\n        const type = 'speed';\n        const list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]');\n\n        // Set the speed options\n        if (is.array(options)) {\n            this.options.speed = options;\n        } else if (this.isHTML5 || this.isVimeo) {\n            this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];\n        }\n\n        // Set options if passed and filter based on config\n        this.options.speed = this.options.speed.filter(speed => this.config.speed.options.includes(speed));\n\n        // Toggle the pane and tab\n        const toggle = !is.empty(this.options.speed) && this.options.speed.length > 1;\n        controls.toggleMenuButton.call(this, type, toggle);\n\n        // Empty the menu\n        emptyElement(list);\n\n        // Check if we need to toggle the parent\n        controls.checkMenu.call(this);\n\n        // If we're hiding, nothing more to do\n        if (!toggle) {\n            return;\n        }\n\n        // Create items\n        this.options.speed.forEach(speed => {\n            controls.createMenuItem.call(this, {\n                value: speed,\n                list,\n                type,\n                title: controls.getLabel.call(this, 'speed', speed),\n            });\n        });\n\n        controls.updateSetting.call(this, type, list);\n    },\n\n    // Check if we need to hide/show the settings menu\n    checkMenu() {\n        const { buttons } = this.elements.settings;\n        const visible = !is.empty(buttons) && Object.values(buttons).some(button => !button.hidden);\n\n        toggleHidden(this.elements.settings.menu, !visible);\n    },\n\n    // Focus the first menu item in a given (or visible) menu\n    focusFirstMenuItem(pane, tabFocus = false) {\n        if (this.elements.settings.popup.hidden) {\n            return;\n        }\n\n        let target = pane;\n\n        if (!is.element(target)) {\n            target = Object.values(this.elements.settings.panels).find(pane => !pane.hidden);\n        }\n\n        const firstItem = target.querySelector('[role^=\"menuitem\"]');\n\n        setFocus.call(this, firstItem, tabFocus);\n    },\n\n    // Show/hide menu\n    toggleMenu(input) {\n        const { popup } = this.elements.settings;\n        const button = this.elements.buttons.settings;\n\n        // Menu and button are required\n        if (!is.element(popup) || !is.element(button)) {\n            return;\n        }\n\n        // True toggle by default\n        const { hidden } = popup;\n        let show = hidden;\n\n        if (is.boolean(input)) {\n            show = input;\n        } else if (is.keyboardEvent(input) && input.which === 27) {\n            show = false;\n        } else if (is.event(input)) {\n            const isMenuItem = popup.contains(input.target);\n\n            // If the click was inside the menu or if the click\n            // wasn't the button or menu item and we're trying to\n            // show the menu (a doc click shouldn't show the menu)\n            if (isMenuItem || (!isMenuItem && input.target !== button && show)) {\n                return;\n            }\n        }\n\n        // Set button attributes\n        button.setAttribute('aria-expanded', show);\n\n        // Show the actual popup\n        toggleHidden(popup, !show);\n\n        // Add class hook\n        toggleClass(this.elements.container, this.config.classNames.menu.open, show);\n\n        // Focus the first item if key interaction\n        if (show && is.keyboardEvent(input)) {\n            controls.focusFirstMenuItem.call(this, null, true);\n        } else if (!show && !hidden) {\n            // If closing, re-focus the button\n            setFocus.call(this, button, is.keyboardEvent(input));\n        }\n    },\n\n    // Get the natural size of a menu panel\n    getMenuSize(tab) {\n        const clone = tab.cloneNode(true);\n        clone.style.position = 'absolute';\n        clone.style.opacity = 0;\n        clone.removeAttribute('hidden');\n\n        // Append to parent so we get the \"real\" size\n        tab.parentNode.appendChild(clone);\n\n        // Get the sizes before we remove\n        const width = clone.scrollWidth;\n        const height = clone.scrollHeight;\n\n        // Remove from the DOM\n        removeElement(clone);\n\n        return {\n            width,\n            height,\n        };\n    },\n\n    // Show a panel in the menu\n    showMenuPanel(type = '', tabFocus = false) {\n        const target = document.getElementById(`plyr-settings-${this.id}-${type}`);\n\n        // Nothing to show, bail\n        if (!is.element(target)) {\n            return;\n        }\n\n        // Hide all other panels\n        const container = target.parentNode;\n        const current = Array.from(container.children).find(node => !node.hidden);\n\n        // If we can do fancy animations, we'll animate the height/width\n        if (support.transitions && !support.reducedMotion) {\n            // Set the current width as a base\n            container.style.width = `${current.scrollWidth}px`;\n            container.style.height = `${current.scrollHeight}px`;\n\n            // Get potential sizes\n            const size = controls.getMenuSize.call(this, target);\n\n            // Restore auto height/width\n            const restore = event => {\n                // We're only bothered about height and width on the container\n                if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n                    return;\n                }\n\n                // Revert back to auto\n                container.style.width = '';\n                container.style.height = '';\n\n                // Only listen once\n                off.call(this, container, transitionEndEvent, restore);\n            };\n\n            // Listen for the transition finishing and restore auto height/width\n            on.call(this, container, transitionEndEvent, restore);\n\n            // Set dimensions to target\n            container.style.width = `${size.width}px`;\n            container.style.height = `${size.height}px`;\n        }\n\n        // Set attributes on current tab\n        toggleHidden(current, true);\n\n        // Set attributes on target\n        toggleHidden(target, false);\n\n        // Focus the first item\n        controls.focusFirstMenuItem.call(this, target, tabFocus);\n    },\n\n    // Set the download link\n    setDownloadLink() {\n        const button = this.elements.buttons.download;\n\n        // Bail if no button\n        if (!is.element(button)) {\n            return;\n        }\n\n        // Set download link\n        button.setAttribute('href', this.download);\n    },\n\n    // Build the default HTML\n    // TODO: Set order based on order in the config.controls array?\n    create(data) {\n        // Create the container\n        const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\n        // Restart button\n        if (this.config.controls.includes('restart')) {\n            container.appendChild(controls.createButton.call(this, 'restart'));\n        }\n\n        // Rewind button\n        if (this.config.controls.includes('rewind')) {\n            container.appendChild(controls.createButton.call(this, 'rewind'));\n        }\n\n        // Play/Pause button\n        if (this.config.controls.includes('play')) {\n            container.appendChild(controls.createButton.call(this, 'play'));\n        }\n\n        // Fast forward button\n        if (this.config.controls.includes('fast-forward')) {\n            container.appendChild(controls.createButton.call(this, 'fast-forward'));\n        }\n\n        // Progress\n        if (this.config.controls.includes('progress')) {\n            const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n            // Seek range slider\n            progress.appendChild(\n                controls.createRange.call(this, 'seek', {\n                    id: `plyr-seek-${data.id}`,\n                }),\n            );\n\n            // Buffer progress\n            progress.appendChild(controls.createProgress.call(this, 'buffer'));\n\n            // TODO: Add loop display indicator\n\n            // Seek tooltip\n            if (this.config.tooltips.seek) {\n                const tooltip = createElement(\n                    'span',\n                    {\n                        class: this.config.classNames.tooltip,\n                    },\n                    '00:00',\n                );\n\n                progress.appendChild(tooltip);\n                this.elements.display.seekTooltip = tooltip;\n            }\n\n            this.elements.progress = progress;\n            container.appendChild(this.elements.progress);\n        }\n\n        // Media current time display\n        if (this.config.controls.includes('current-time')) {\n            container.appendChild(controls.createTime.call(this, 'currentTime'));\n        }\n\n        // Media duration display\n        if (this.config.controls.includes('duration')) {\n            container.appendChild(controls.createTime.call(this, 'duration'));\n        }\n\n        // Volume controls\n        if (this.config.controls.includes('mute') || this.config.controls.includes('volume')) {\n            const volume = createElement('div', {\n                class: 'plyr__volume',\n            });\n\n            // Toggle mute button\n            if (this.config.controls.includes('mute')) {\n                volume.appendChild(controls.createButton.call(this, 'mute'));\n            }\n\n            // Volume range control\n            if (this.config.controls.includes('volume')) {\n                // Set the attributes\n                const attributes = {\n                    max: 1,\n                    step: 0.05,\n                    value: this.config.volume,\n                };\n\n                // Create the volume range slider\n                volume.appendChild(\n                    controls.createRange.call(\n                        this,\n                        'volume',\n                        extend(attributes, {\n                            id: `plyr-volume-${data.id}`,\n                        }),\n                    ),\n                );\n\n                this.elements.volume = volume;\n            }\n\n            container.appendChild(volume);\n        }\n\n        // Toggle captions button\n        if (this.config.controls.includes('captions')) {\n            container.appendChild(controls.createButton.call(this, 'captions'));\n        }\n\n        // Settings button / menu\n        if (this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n            const control = createElement('div', {\n                class: 'plyr__menu',\n                hidden: '',\n            });\n\n            control.appendChild(\n                controls.createButton.call(this, 'settings', {\n                    'aria-haspopup': true,\n                    'aria-controls': `plyr-settings-${data.id}`,\n                    'aria-expanded': false,\n                }),\n            );\n\n            const popup = createElement('div', {\n                class: 'plyr__menu__container',\n                id: `plyr-settings-${data.id}`,\n                hidden: '',\n            });\n\n            const inner = createElement('div');\n\n            const home = createElement('div', {\n                id: `plyr-settings-${data.id}-home`,\n            });\n\n            // Create the menu\n            const menu = createElement('div', {\n                role: 'menu',\n            });\n\n            home.appendChild(menu);\n            inner.appendChild(home);\n            this.elements.settings.panels.home = home;\n\n            // Build the menu items\n            this.config.settings.forEach(type => {\n                // TODO: bundle this with the createMenuItem helper and bindings\n                const menuItem = createElement(\n                    'button',\n                    extend(getAttributesFromSelector(this.config.selectors.buttons.settings), {\n                        type: 'button',\n                        class: `${this.config.classNames.control} ${this.config.classNames.control}--forward`,\n                        role: 'menuitem',\n                        'aria-haspopup': true,\n                        hidden: '',\n                    }),\n                );\n\n                // Bind menu shortcuts for keyboard users\n                controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\n                // Show menu on click\n                on(menuItem, 'click', () => {\n                    controls.showMenuPanel.call(this, type, false);\n                });\n\n                const flex = createElement('span', null, i18n.get(type, this.config));\n\n                const value = createElement('span', {\n                    class: this.config.classNames.menu.value,\n                });\n\n                // Speed contains HTML entities\n                value.innerHTML = data[type];\n\n                flex.appendChild(value);\n                menuItem.appendChild(flex);\n                menu.appendChild(menuItem);\n\n                // Build the panes\n                const pane = createElement('div', {\n                    id: `plyr-settings-${data.id}-${type}`,\n                    hidden: '',\n                });\n\n                // Back button\n                const backButton = createElement('button', {\n                    type: 'button',\n                    class: `${this.config.classNames.control} ${this.config.classNames.control}--back`,\n                });\n\n                // Visible label\n                backButton.appendChild(\n                    createElement(\n                        'span',\n                        {\n                            'aria-hidden': true,\n                        },\n                        i18n.get(type, this.config),\n                    ),\n                );\n\n                // Screen reader label\n                backButton.appendChild(\n                    createElement(\n                        'span',\n                        {\n                            class: this.config.classNames.hidden,\n                        },\n                        i18n.get('menuBack', this.config),\n                    ),\n                );\n\n                // Go back via keyboard\n                on(\n                    pane,\n                    'keydown',\n                    event => {\n                        // We only care about <-\n                        if (event.which !== 37) {\n                            return;\n                        }\n\n                        // Prevent seek\n                        event.preventDefault();\n                        event.stopPropagation();\n\n                        // Show the respective menu\n                        controls.showMenuPanel.call(this, 'home', true);\n                    },\n                    false,\n                );\n\n                // Go back via button click\n                on(backButton, 'click', () => {\n                    controls.showMenuPanel.call(this, 'home', false);\n                });\n\n                // Add to pane\n                pane.appendChild(backButton);\n\n                // Menu\n                pane.appendChild(\n                    createElement('div', {\n                        role: 'menu',\n                    }),\n                );\n\n                inner.appendChild(pane);\n\n                this.elements.settings.buttons[type] = menuItem;\n                this.elements.settings.panels[type] = pane;\n            });\n\n            popup.appendChild(inner);\n            control.appendChild(popup);\n            container.appendChild(control);\n\n            this.elements.settings.popup = popup;\n            this.elements.settings.menu = control;\n        }\n\n        // Picture in picture button\n        if (this.config.controls.includes('pip') && support.pip) {\n            container.appendChild(controls.createButton.call(this, 'pip'));\n        }\n\n        // Airplay button\n        if (this.config.controls.includes('airplay') && support.airplay) {\n            container.appendChild(controls.createButton.call(this, 'airplay'));\n        }\n\n        // Download button\n        if (this.config.controls.includes('download')) {\n            const attributes = {\n                element: 'a',\n                href: this.download,\n                target: '_blank',\n            };\n\n            const { download } = this.config.urls;\n\n            if (!is.url(download) && this.isEmbed) {\n                extend(attributes, {\n                    icon: `logo-${this.provider}`,\n                    label: this.provider,\n                });\n            }\n\n            container.appendChild(controls.createButton.call(this, 'download', attributes));\n        }\n\n        // Toggle fullscreen button\n        if (this.config.controls.includes('fullscreen')) {\n            container.appendChild(controls.createButton.call(this, 'fullscreen'));\n        }\n\n        // Larger overlaid play button\n        if (this.config.controls.includes('play-large')) {\n            this.elements.container.appendChild(controls.createButton.call(this, 'play-large'));\n        }\n\n        this.elements.controls = container;\n\n        // Set available quality levels\n        if (this.isHTML5) {\n            controls.setQualityMenu.call(this, html5.getQualityOptions.call(this));\n        }\n\n        controls.setSpeedMenu.call(this);\n\n        return container;\n    },\n\n    // Insert controls\n    inject() {\n        // Sprite\n        if (this.config.loadSprite) {\n            const icon = controls.getIconUrl.call(this);\n\n            // Only load external sprite using AJAX\n            if (icon.cors) {\n                loadSprite(icon.url, 'sprite-plyr');\n            }\n        }\n\n        // Create a unique ID\n        this.id = Math.floor(Math.random() * 10000);\n\n        // Null by default\n        let container = null;\n        this.elements.controls = null;\n\n        // Set template properties\n        const props = {\n            id: this.id,\n            seektime: this.config.seekTime,\n            title: this.config.title,\n        };\n        let update = true;\n\n        // If function, run it and use output\n        if (is.function(this.config.controls)) {\n            this.config.controls = this.config.controls.call(this, props);\n        }\n\n        // Convert falsy controls to empty array (primarily for empty strings)\n        if (!this.config.controls) {\n            this.config.controls = [];\n        }\n\n        if (is.element(this.config.controls) || is.string(this.config.controls)) {\n            // HTMLElement or Non-empty string passed as the option\n            container = this.config.controls;\n        } else {\n            // Create controls\n            container = controls.create.call(this, {\n                id: this.id,\n                seektime: this.config.seekTime,\n                speed: this.speed,\n                quality: this.quality,\n                captions: captions.getLabel.call(this),\n                // TODO: Looping\n                // loop: 'None',\n            });\n            update = false;\n        }\n\n        // Replace props with their value\n        const replace = input => {\n            let result = input;\n\n            Object.entries(props).forEach(([key, value]) => {\n                result = replaceAll(result, `{${key}}`, value);\n            });\n\n            return result;\n        };\n\n        // Update markup\n        if (update) {\n            if (is.string(this.config.controls)) {\n                container = replace(container);\n            } else if (is.element(container)) {\n                container.innerHTML = replace(container.innerHTML);\n            }\n        }\n\n        // Controls container\n        let target;\n\n        // Inject to custom location\n        if (is.string(this.config.selectors.controls.container)) {\n            target = document.querySelector(this.config.selectors.controls.container);\n        }\n\n        // Inject into the container by default\n        if (!is.element(target)) {\n            target = this.elements.container;\n        }\n\n        // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n        const insertMethod = is.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n        target[insertMethod]('afterbegin', container);\n\n        // Find the elements if need be\n        if (!is.element(this.elements.controls)) {\n            controls.findElements.call(this);\n        }\n\n        // Add pressed property to buttons\n        if (!is.empty(this.elements.buttons)) {\n            const addProperty = button => {\n                const className = this.config.classNames.controlPressed;\n                Object.defineProperty(button, 'pressed', {\n                    enumerable: true,\n                    get() {\n                        return hasClass(button, className);\n                    },\n                    set(pressed = false) {\n                        toggleClass(button, className, pressed);\n                    },\n                });\n            };\n\n            // Toggle classname when pressed property is set\n            Object.values(this.elements.buttons)\n                .filter(Boolean)\n                .forEach(button => {\n                    if (is.array(button) || is.nodeList(button)) {\n                        Array.from(button).filter(Boolean).forEach(addProperty);\n                    } else {\n                        addProperty(button);\n                    }\n                });\n        }\n\n        // Edge sometimes doesn't finish the paint so force a redraw\n        if (window.navigator.userAgent.includes('Edge')) {\n            repaint(target);\n        }\n\n        // Setup tooltips\n        if (this.config.tooltips.controls) {\n            const { classNames, selectors } = this.config;\n            const selector = `${selectors.controls.wrapper} ${selectors.labels} .${classNames.hidden}`;\n            const labels = getElements.call(this, selector);\n\n            Array.from(labels).forEach(label => {\n                toggleClass(label, this.config.classNames.hidden, false);\n                toggleClass(label, this.config.classNames.tooltip, true);\n            });\n        }\n    },\n};\n\nexport default controls;\n","// ==========================================================================\n// URL utils\n// ==========================================================================\n\nimport is from './is';\n\n/**\n * Parse a string to a URL object\n * @param {string} input - the URL to be parsed\n * @param {boolean} safe - failsafe parsing\n */\nexport function parseUrl(input, safe = true) {\n    let url = input;\n\n    if (safe) {\n        const parser = document.createElement('a');\n        parser.href = url;\n        url = parser.href;\n    }\n\n    try {\n        return new URL(url);\n    } catch (e) {\n        return null;\n    }\n}\n\n// Convert object to URLSearchParams\nexport function buildUrlParams(input) {\n    const params = new URLSearchParams();\n\n    if (is.object(input)) {\n        Object.entries(input).forEach(([key, value]) => {\n            params.set(key, value);\n        });\n    }\n\n    return params;\n}\n","// ==========================================================================\n// Plyr Captions\n// TODO: Create as class\n// ==========================================================================\n\nimport controls from './controls';\nimport support from './support';\nimport { dedupe } from './utils/arrays';\nimport browser from './utils/browser';\nimport {\n    createElement,\n    emptyElement,\n    getAttributesFromSelector,\n    insertAfter,\n    removeElement,\n    toggleClass,\n} from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport fetch from './utils/fetch';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport { getHTML } from './utils/strings';\nimport { parseUrl } from './utils/urls';\n\nconst captions = {\n    // Setup captions\n    setup() {\n        // Requires UI support\n        if (!this.supported.ui) {\n            return;\n        }\n\n        // Only Vimeo and HTML5 video supported at this point\n        if (!this.isVideo || this.isYouTube || (this.isHTML5 && !support.textTracks)) {\n            // Clear menu and hide\n            if (\n                is.array(this.config.controls) &&\n                this.config.controls.includes('settings') &&\n                this.config.settings.includes('captions')\n            ) {\n                controls.setCaptionsMenu.call(this);\n            }\n\n            return;\n        }\n\n        // Inject the container\n        if (!is.element(this.elements.captions)) {\n            this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n\n            insertAfter(this.elements.captions, this.elements.wrapper);\n        }\n\n        // Fix IE captions if CORS is used\n        // Fetch captions and inject as blobs instead (data URIs not supported!)\n        if (browser.isIE && window.URL) {\n            const elements = this.media.querySelectorAll('track');\n\n            Array.from(elements).forEach(track => {\n                const src = track.getAttribute('src');\n                const url = parseUrl(src);\n\n                if (\n                    url !== null &&\n                    url.hostname !== window.location.href.hostname &&\n                    ['http:', 'https:'].includes(url.protocol)\n                ) {\n                    fetch(src, 'blob')\n                        .then(blob => {\n                            track.setAttribute('src', window.URL.createObjectURL(blob));\n                        })\n                        .catch(() => {\n                            removeElement(track);\n                        });\n                }\n            });\n        }\n\n        // Get and set initial data\n        // The \"preferred\" options are not realized unless / until the wanted language has a match\n        // * languages: Array of user's browser languages.\n        // * language:  The language preferred by user settings or config\n        // * active:    The state preferred by user settings or config\n        // * toggled:   The real captions state\n\n        const browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n        const languages = dedupe(browserLanguages.map(language => language.split('-')[0]));\n\n        let language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase();\n\n        // Use first browser language when language is 'auto'\n        if (language === 'auto') {\n            [language] = languages;\n        }\n\n        let active = this.storage.get('captions');\n        if (!is.boolean(active)) {\n            ({ active } = this.config.captions);\n        }\n\n        Object.assign(this.captions, {\n            toggled: false,\n            active,\n            language,\n            languages,\n        });\n\n        // Watch changes to textTracks and update captions menu\n        if (this.isHTML5) {\n            const trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n            on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n        }\n\n        // Update available languages in list next tick (the event must not be triggered before the listeners)\n        setTimeout(captions.update.bind(this), 0);\n    },\n\n    // Update available language options in settings based on tracks\n    update() {\n        const tracks = captions.getTracks.call(this, true);\n        // Get the wanted language\n        const { active, language, meta, currentTrackNode } = this.captions;\n        const languageExists = Boolean(tracks.find(track => track.language === language));\n\n        // Handle tracks (add event listener and \"pseudo\"-default)\n        if (this.isHTML5 && this.isVideo) {\n            tracks.filter(track => !meta.get(track)).forEach(track => {\n                this.debug.log('Track added', track);\n                // Attempt to store if the original dom element was \"default\"\n                meta.set(track, {\n                    default: track.mode === 'showing',\n                });\n\n                // Turn off native caption rendering to avoid double captions\n                track.mode = 'hidden';\n\n                // Add event listener for cue changes\n                on.call(this, track, 'cuechange', () => captions.updateCues.call(this));\n            });\n        }\n\n        // Update language first time it matches, or if the previous matching track was removed\n        if ((languageExists && this.language !== language) || !tracks.includes(currentTrackNode)) {\n            captions.setLanguage.call(this, language);\n            captions.toggle.call(this, active && languageExists);\n        }\n\n        // Enable or disable captions based on track length\n        toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is.empty(tracks));\n\n        // Update available languages in list\n        if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {\n            controls.setCaptionsMenu.call(this);\n        }\n    },\n\n    // Toggle captions display\n    // Used internally for the toggleCaptions method, with the passive option forced to false\n    toggle(input, passive = true) {\n        // If there's no full support\n        if (!this.supported.ui) {\n            return;\n        }\n\n        const { toggled } = this.captions; // Current state\n        const activeClass = this.config.classNames.captions.active;\n\n        // Get the next state\n        // If the method is called without parameter, toggle based on current value\n        const active = is.nullOrUndefined(input) ? !toggled : input;\n\n        // Update state and trigger event\n        if (active !== toggled) {\n            // When passive, don't override user preferences\n            if (!passive) {\n                this.captions.active = active;\n                this.storage.set({ captions: active });\n            }\n\n            // Force language if the call isn't passive and there is no matching language to toggle to\n            if (!this.language && active && !passive) {\n                const tracks = captions.getTracks.call(this);\n                const track = captions.findTrack.call(this, [this.captions.language, ...this.captions.languages], true);\n\n                // Override user preferences to avoid switching languages if a matching track is added\n                this.captions.language = track.language;\n\n                // Set caption, but don't store in localStorage as user preference\n                captions.set.call(this, tracks.indexOf(track));\n                return;\n            }\n\n            // Toggle button if it's enabled\n            if (this.elements.buttons.captions) {\n                this.elements.buttons.captions.pressed = active;\n            }\n\n            // Add class hook\n            toggleClass(this.elements.container, activeClass, active);\n\n            this.captions.toggled = active;\n\n            // Update settings menu\n            controls.updateSetting.call(this, 'captions');\n\n            // Trigger event (not used internally)\n            triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n        }\n    },\n\n    // Set captions by track index\n    // Used internally for the currentTrack setter with the passive option forced to false\n    set(index, passive = true) {\n        const tracks = captions.getTracks.call(this);\n\n        // Disable captions if setting to -1\n        if (index === -1) {\n            captions.toggle.call(this, false, passive);\n            return;\n        }\n\n        if (!is.number(index)) {\n            this.debug.warn('Invalid caption argument', index);\n            return;\n        }\n\n        if (!(index in tracks)) {\n            this.debug.warn('Track not found', index);\n            return;\n        }\n\n        if (this.captions.currentTrack !== index) {\n            this.captions.currentTrack = index;\n            const track = tracks[index];\n            const { language } = track || {};\n\n            // Store reference to node for invalidation on remove\n            this.captions.currentTrackNode = track;\n\n            // Update settings menu\n            controls.updateSetting.call(this, 'captions');\n\n            // When passive, don't override user preferences\n            if (!passive) {\n                this.captions.language = language;\n                this.storage.set({ language });\n            }\n\n            // Handle Vimeo captions\n            if (this.isVimeo) {\n                this.embed.enableTextTrack(language);\n            }\n\n            // Trigger event\n            triggerEvent.call(this, this.media, 'languagechange');\n        }\n\n        // Show captions\n        captions.toggle.call(this, true, passive);\n\n        if (this.isHTML5 && this.isVideo) {\n            // If we change the active track while a cue is already displayed we need to update it\n            captions.updateCues.call(this);\n        }\n    },\n\n    // Set captions by language\n    // Used internally for the language setter with the passive option forced to false\n    setLanguage(input, passive = true) {\n        if (!is.string(input)) {\n            this.debug.warn('Invalid language argument', input);\n            return;\n        }\n        // Normalize\n        const language = input.toLowerCase();\n        this.captions.language = language;\n\n        // Set currentTrack\n        const tracks = captions.getTracks.call(this);\n        const track = captions.findTrack.call(this, [language]);\n        captions.set.call(this, tracks.indexOf(track), passive);\n    },\n\n    // Get current valid caption tracks\n    // If update is false it will also ignore tracks without metadata\n    // This is used to \"freeze\" the language options when captions.update is false\n    getTracks(update = false) {\n        // Handle media or textTracks missing or null\n        const tracks = Array.from((this.media || {}).textTracks || []);\n        // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n        // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n        return tracks\n            .filter(track => !this.isHTML5 || update || this.captions.meta.has(track))\n            .filter(track => ['captions', 'subtitles'].includes(track.kind));\n    },\n\n    // Match tracks based on languages and get the first\n    findTrack(languages, force = false) {\n        const tracks = captions.getTracks.call(this);\n        const sortIsDefault = track => Number((this.captions.meta.get(track) || {}).default);\n        const sorted = Array.from(tracks).sort((a, b) => sortIsDefault(b) - sortIsDefault(a));\n        let track;\n        languages.every(language => {\n            track = sorted.find(track => track.language === language);\n            return !track; // Break iteration if there is a match\n        });\n        // If no match is found but is required, get first\n        return track || (force ? sorted[0] : undefined);\n    },\n\n    // Get the current track\n    getCurrentTrack() {\n        return captions.getTracks.call(this)[this.currentTrack];\n    },\n\n    // Get UI label for track\n    getLabel(track) {\n        let currentTrack = track;\n\n        if (!is.track(currentTrack) && support.textTracks && this.captions.toggled) {\n            currentTrack = captions.getCurrentTrack.call(this);\n        }\n\n        if (is.track(currentTrack)) {\n            if (!is.empty(currentTrack.label)) {\n                return currentTrack.label;\n            }\n\n            if (!is.empty(currentTrack.language)) {\n                return track.language.toUpperCase();\n            }\n\n            return i18n.get('enabled', this.config);\n        }\n\n        return i18n.get('disabled', this.config);\n    },\n\n    // Update captions using current track's active cues\n    // Also optional array argument in case there isn't any track (ex: vimeo)\n    updateCues(input) {\n        // Requires UI\n        if (!this.supported.ui) {\n            return;\n        }\n\n        if (!is.element(this.elements.captions)) {\n            this.debug.warn('No captions element to render to');\n            return;\n        }\n\n        // Only accept array or empty input\n        if (!is.nullOrUndefined(input) && !Array.isArray(input)) {\n            this.debug.warn('updateCues: Invalid input', input);\n            return;\n        }\n\n        let cues = input;\n\n        // Get cues from track\n        if (!cues) {\n            const track = captions.getCurrentTrack.call(this);\n            cues = Array.from((track || {}).activeCues || [])\n                .map(cue => cue.getCueAsHTML())\n                .map(getHTML);\n        }\n\n        // Set new caption text\n        const content = cues.map(cueText => cueText.trim()).join('\\n');\n        const changed = content !== this.elements.captions.innerHTML;\n\n        if (changed) {\n            // Empty the container and create a new child element\n            emptyElement(this.elements.captions);\n            const caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n            caption.innerHTML = content;\n            this.elements.captions.appendChild(caption);\n\n            // Trigger event\n            triggerEvent.call(this, this.media, 'cuechange');\n        }\n    },\n};\n\nexport default captions;\n","// ==========================================================================\n// Plyr default config\n// ==========================================================================\n\nconst defaults = {\n    // Disable\n    enabled: true,\n\n    // Custom media title\n    title: '',\n\n    // Logging to console\n    debug: false,\n\n    // Auto play (if supported)\n    autoplay: false,\n\n    // Only allow one media playing at once (vimeo only)\n    autopause: true,\n\n    // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n    // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n    playsinline: true,\n\n    // Default time to skip when rewind/fast forward\n    seekTime: 10,\n\n    // Default volume\n    volume: 1,\n    muted: false,\n\n    // Pass a custom duration\n    duration: null,\n\n    // Display the media duration on load in the current time position\n    // If you have opted to display both duration and currentTime, this is ignored\n    displayDuration: true,\n\n    // Invert the current time to be a countdown\n    invertTime: true,\n\n    // Clicking the currentTime inverts it's value to show time left rather than elapsed\n    toggleInvert: true,\n\n    // Aspect ratio (for embeds)\n    ratio: '16:9',\n\n    // Click video container to play/pause\n    clickToPlay: true,\n\n    // Auto hide the controls\n    hideControls: true,\n\n    // Reset to start when playback ended\n    resetOnEnd: false,\n\n    // Disable the standard context menu\n    disableContextMenu: true,\n\n    // Sprite (for icons)\n    loadSprite: true,\n    iconPrefix: 'plyr',\n    iconUrl: 'https://cdn.plyr.io/3.4.8/plyr.svg',\n\n    // Blank video (used to prevent errors on source change)\n    blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\n    // Quality default\n    quality: {\n        default: 576,\n        options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n    },\n\n    // Set loops\n    loop: {\n        active: false,\n        // start: null,\n        // end: null,\n    },\n\n    // Speed default and options to display\n    speed: {\n        selected: 1,\n        options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2],\n    },\n\n    // Keyboard shortcut settings\n    keyboard: {\n        focused: true,\n        global: false,\n    },\n\n    // Display tooltips\n    tooltips: {\n        controls: false,\n        seek: true,\n    },\n\n    // Captions settings\n    captions: {\n        active: false,\n        language: 'auto',\n        // Listen to new tracks added after Plyr is initialized.\n        // This is needed for streaming captions, but may result in unselectable options\n        update: false,\n    },\n\n    // Fullscreen settings\n    fullscreen: {\n        enabled: true, // Allow fullscreen?\n        fallback: true, // Fallback for vintage browsers\n        iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n    },\n\n    // Local storage\n    storage: {\n        enabled: true,\n        key: 'plyr',\n    },\n\n    // Default controls\n    controls: [\n        'play-large',\n        // 'restart',\n        // 'rewind',\n        'play',\n        // 'fast-forward',\n        'progress',\n        'current-time',\n        'mute',\n        'volume',\n        'captions',\n        'settings',\n        'pip',\n        'airplay',\n        // 'download',\n        'fullscreen',\n    ],\n    settings: ['captions', 'quality', 'speed'],\n\n    // Localisation\n    i18n: {\n        restart: 'Restart',\n        rewind: 'Rewind {seektime}s',\n        play: 'Play',\n        pause: 'Pause',\n        fastForward: 'Forward {seektime}s',\n        seek: 'Seek',\n        seekLabel: '{currentTime} of {duration}',\n        played: 'Played',\n        buffered: 'Buffered',\n        currentTime: 'Current time',\n        duration: 'Duration',\n        volume: 'Volume',\n        mute: 'Mute',\n        unmute: 'Unmute',\n        enableCaptions: 'Enable captions',\n        disableCaptions: 'Disable captions',\n        download: 'Download',\n        enterFullscreen: 'Enter fullscreen',\n        exitFullscreen: 'Exit fullscreen',\n        frameTitle: 'Player for {title}',\n        captions: 'Captions',\n        settings: 'Settings',\n        menuBack: 'Go back to previous menu',\n        speed: 'Speed',\n        normal: 'Normal',\n        quality: 'Quality',\n        loop: 'Loop',\n        start: 'Start',\n        end: 'End',\n        all: 'All',\n        reset: 'Reset',\n        disabled: 'Disabled',\n        enabled: 'Enabled',\n        advertisement: 'Ad',\n        qualityBadge: {\n            2160: '4K',\n            1440: 'HD',\n            1080: 'HD',\n            720: 'HD',\n            576: 'SD',\n            480: 'SD',\n        },\n    },\n\n    // URLs\n    urls: {\n        download: null,\n        vimeo: {\n            sdk: 'https://player.vimeo.com/api/player.js',\n            iframe: 'https://player.vimeo.com/video/{0}?{1}',\n            api: 'https://vimeo.com/api/v2/video/{0}.json',\n        },\n        youtube: {\n            sdk: 'https://www.youtube.com/iframe_api',\n            api:\n                'https://www.googleapis.com/youtube/v3/videos?id={0}&key={1}&fields=items(snippet(title))&part=snippet',\n        },\n        googleIMA: {\n            sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js',\n        },\n    },\n\n    // Custom control listeners\n    listeners: {\n        seek: null,\n        play: null,\n        pause: null,\n        restart: null,\n        rewind: null,\n        fastForward: null,\n        mute: null,\n        volume: null,\n        captions: null,\n        download: null,\n        fullscreen: null,\n        pip: null,\n        airplay: null,\n        speed: null,\n        quality: null,\n        loop: null,\n        language: null,\n    },\n\n    // Events to watch and bubble\n    events: [\n        // Events to watch on HTML5 media elements and bubble\n        // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n        'ended',\n        'progress',\n        'stalled',\n        'playing',\n        'waiting',\n        'canplay',\n        'canplaythrough',\n        'loadstart',\n        'loadeddata',\n        'loadedmetadata',\n        'timeupdate',\n        'volumechange',\n        'play',\n        'pause',\n        'error',\n        'seeking',\n        'seeked',\n        'emptied',\n        'ratechange',\n        'cuechange',\n\n        // Custom events\n        'download',\n        'enterfullscreen',\n        'exitfullscreen',\n        'captionsenabled',\n        'captionsdisabled',\n        'languagechange',\n        'controlshidden',\n        'controlsshown',\n        'ready',\n\n        // YouTube\n        'statechange',\n\n        // Quality\n        'qualitychange',\n\n        // Ads\n        'adsloaded',\n        'adscontentpause',\n        'adscontentresume',\n        'adstarted',\n        'adsmidpoint',\n        'adscomplete',\n        'adsallcomplete',\n        'adsimpression',\n        'adsclick',\n    ],\n\n    // Selectors\n    // Change these to match your template if using custom HTML\n    selectors: {\n        editable: 'input, textarea, select, [contenteditable]',\n        container: '.plyr',\n        controls: {\n            container: null,\n            wrapper: '.plyr__controls',\n        },\n        labels: '[data-plyr]',\n        buttons: {\n            play: '[data-plyr=\"play\"]',\n            pause: '[data-plyr=\"pause\"]',\n            restart: '[data-plyr=\"restart\"]',\n            rewind: '[data-plyr=\"rewind\"]',\n            fastForward: '[data-plyr=\"fast-forward\"]',\n            mute: '[data-plyr=\"mute\"]',\n            captions: '[data-plyr=\"captions\"]',\n            download: '[data-plyr=\"download\"]',\n            fullscreen: '[data-plyr=\"fullscreen\"]',\n            pip: '[data-plyr=\"pip\"]',\n            airplay: '[data-plyr=\"airplay\"]',\n            settings: '[data-plyr=\"settings\"]',\n            loop: '[data-plyr=\"loop\"]',\n        },\n        inputs: {\n            seek: '[data-plyr=\"seek\"]',\n            volume: '[data-plyr=\"volume\"]',\n            speed: '[data-plyr=\"speed\"]',\n            language: '[data-plyr=\"language\"]',\n            quality: '[data-plyr=\"quality\"]',\n        },\n        display: {\n            currentTime: '.plyr__time--current',\n            duration: '.plyr__time--duration',\n            buffer: '.plyr__progress__buffer',\n            loop: '.plyr__progress__loop', // Used later\n            volume: '.plyr__volume--display',\n        },\n        progress: '.plyr__progress',\n        captions: '.plyr__captions',\n        caption: '.plyr__caption',\n        menu: {\n            quality: '.js-plyr__menu__list--quality',\n        },\n    },\n\n    // Class hooks added to the player in different states\n    classNames: {\n        type: 'plyr--{0}',\n        provider: 'plyr--{0}',\n        video: 'plyr__video-wrapper',\n        embed: 'plyr__video-embed',\n        embedContainer: 'plyr__video-embed__container',\n        poster: 'plyr__poster',\n        posterEnabled: 'plyr__poster-enabled',\n        ads: 'plyr__ads',\n        control: 'plyr__control',\n        controlPressed: 'plyr__control--pressed',\n        playing: 'plyr--playing',\n        paused: 'plyr--paused',\n        stopped: 'plyr--stopped',\n        loading: 'plyr--loading',\n        hover: 'plyr--hover',\n        tooltip: 'plyr__tooltip',\n        cues: 'plyr__cues',\n        hidden: 'plyr__sr-only',\n        hideControls: 'plyr--hide-controls',\n        isIos: 'plyr--is-ios',\n        isTouch: 'plyr--is-touch',\n        uiSupported: 'plyr--full-ui',\n        noTransition: 'plyr--no-transition',\n        display: {\n            time: 'plyr__time',\n        },\n        menu: {\n            value: 'plyr__menu__value',\n            badge: 'plyr__badge',\n            open: 'plyr--menu-open',\n        },\n        captions: {\n            enabled: 'plyr--captions-enabled',\n            active: 'plyr--captions-active',\n        },\n        fullscreen: {\n            enabled: 'plyr--fullscreen-enabled',\n            fallback: 'plyr--fullscreen-fallback',\n        },\n        pip: {\n            supported: 'plyr--pip-supported',\n            active: 'plyr--pip-active',\n        },\n        airplay: {\n            supported: 'plyr--airplay-supported',\n            active: 'plyr--airplay-active',\n        },\n        tabFocus: 'plyr__tab-focus',\n    },\n\n    // Embed attributes\n    attributes: {\n        embed: {\n            provider: 'data-plyr-provider',\n            id: 'data-plyr-embed-id',\n        },\n    },\n\n    // API keys\n    keys: {\n        google: null,\n    },\n\n    // Advertisements plugin\n    // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n    ads: {\n        enabled: false,\n        publisherId: '',\n    },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n    active: 'picture-in-picture',\n    inactive: 'inline',\n};\n\nexport default { pip };\n","// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\n\nexport const providers = {\n    html5: 'html5',\n    youtube: 'youtube',\n    vimeo: 'vimeo',\n};\n\nexport const types = {\n    audio: 'audio',\n    video: 'video',\n};\n\n/**\n * Get provider by URL\n * @param {String} url\n */\nexport function getProviderByUrl(url) {\n    // YouTube\n    if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n        return providers.youtube;\n    }\n\n    // Vimeo\n    if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n        return providers.vimeo;\n    }\n\n    return null;\n}\n\nexport default { providers, types };\n","// ==========================================================================\n// Console wrapper\n// ==========================================================================\n\nconst noop = () => {};\n\nexport default class Console {\n    constructor(enabled = false) {\n        this.enabled = window.console && enabled;\n\n        if (this.enabled) {\n            this.log('Debugging enabled');\n        }\n    }\n\n    get log() {\n        // eslint-disable-next-line no-console\n        return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n    }\n\n    get warn() {\n        // eslint-disable-next-line no-console\n        return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n    }\n\n    get error() {\n        // eslint-disable-next-line no-console\n        return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n    }\n}\n","// ==========================================================================\n// Fullscreen wrapper\n// https://developer.mozilla.org/en-US/docs/Web/API/Fullscreen_API#prefixing\n// https://webkit.org/blog/7929/designing-websites-for-iphone-x/\n// ==========================================================================\n\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { hasClass, toggleClass, trapFocus } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nfunction onChange() {\n    if (!this.enabled) {\n        return;\n    }\n\n    // Update toggle button\n    const button = this.player.elements.buttons.fullscreen;\n    if (is.element(button)) {\n        button.pressed = this.active;\n    }\n\n    // Trigger an event\n    triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\n    // Trap focus in container\n    if (!browser.isIos) {\n        trapFocus.call(this.player, this.target, this.active);\n    }\n}\n\nfunction toggleFallback(toggle = false) {\n    // Store or restore scroll position\n    if (toggle) {\n        this.scrollPosition = {\n            x: window.scrollX || 0,\n            y: window.scrollY || 0,\n        };\n    } else {\n        window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n    }\n\n    // Toggle scroll\n    document.body.style.overflow = toggle ? 'hidden' : '';\n\n    // Toggle class hook\n    toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle);\n\n    // Force full viewport on iPhone X+\n    if (browser.isIos) {\n        let viewport = document.head.querySelector('meta[name=\"viewport\"]');\n        const property = 'viewport-fit=cover';\n\n        // Inject the viewport meta if required\n        if (!viewport) {\n            viewport = document.createElement('meta');\n            viewport.setAttribute('name', 'viewport');\n        }\n\n        // Check if the property already exists\n        const hasProperty = is.string(viewport.content) && viewport.content.includes(property);\n\n        if (toggle) {\n            this.cleanupViewport = !hasProperty;\n\n            if (!hasProperty) {\n                viewport.content += `,${property}`;\n            }\n        } else if (this.cleanupViewport) {\n            viewport.content = viewport.content\n                .split(',')\n                .filter(part => part.trim() !== property)\n                .join(',');\n        }\n\n        // Force a repaint as sometimes Safari doesn't want to fill the screen\n        setTimeout(() => repaint(this.target), 100);\n    }\n\n    // Toggle button and fire events\n    onChange.call(this);\n}\n\nclass Fullscreen {\n    constructor(player) {\n        // Keep reference to parent\n        this.player = player;\n\n        // Get prefix\n        this.prefix = Fullscreen.prefix;\n        this.property = Fullscreen.property;\n\n        // Scroll position\n        this.scrollPosition = { x: 0, y: 0 };\n\n        // Register event listeners\n        // Handle event (incase user presses escape etc)\n        on.call(\n            this.player,\n            document,\n            this.prefix === 'ms' ? 'MSFullscreenChange' : `${this.prefix}fullscreenchange`,\n            () => {\n                // TODO: Filter for target??\n                onChange.call(this);\n            },\n        );\n\n        // Fullscreen toggle on double click\n        on.call(this.player, this.player.elements.container, 'dblclick', event => {\n            // Ignore double click in controls\n            if (is.element(this.player.elements.controls) && this.player.elements.controls.contains(event.target)) {\n                return;\n            }\n\n            this.toggle();\n        });\n\n        // Update the UI\n        this.update();\n    }\n\n    // Determine if native supported\n    static get native() {\n        return !!(\n            document.fullscreenEnabled ||\n            document.webkitFullscreenEnabled ||\n            document.mozFullScreenEnabled ||\n            document.msFullscreenEnabled\n        );\n    }\n\n    // Get the prefix for handlers\n    static get prefix() {\n        // No prefix\n        if (is.function(document.exitFullscreen)) {\n            return '';\n        }\n\n        // Check for fullscreen support by vendor prefix\n        let value = '';\n        const prefixes = ['webkit', 'moz', 'ms'];\n\n        prefixes.some(pre => {\n            if (is.function(document[`${pre}ExitFullscreen`]) || is.function(document[`${pre}CancelFullScreen`])) {\n                value = pre;\n                return true;\n            }\n\n            return false;\n        });\n\n        return value;\n    }\n\n    static get property() {\n        return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n    }\n\n    // Determine if fullscreen is enabled\n    get enabled() {\n        return (\n            (Fullscreen.native || this.player.config.fullscreen.fallback) &&\n            this.player.config.fullscreen.enabled &&\n            this.player.supported.ui &&\n            this.player.isVideo\n        );\n    }\n\n    // Get active state\n    get active() {\n        if (!this.enabled) {\n            return false;\n        }\n\n        // Fallback using classname\n        if (!Fullscreen.native) {\n            return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n        }\n\n        const element = !this.prefix ? document.fullscreenElement : document[`${this.prefix}${this.property}Element`];\n\n        return element === this.target;\n    }\n\n    // Get target element\n    get target() {\n        return browser.isIos && this.player.config.fullscreen.iosNative\n            ? this.player.media\n            : this.player.elements.container;\n    }\n\n    // Update UI\n    update() {\n        if (this.enabled) {\n            this.player.debug.log(`${Fullscreen.native ? 'Native' : 'Fallback'} fullscreen enabled`);\n        } else {\n            this.player.debug.log('Fullscreen not supported and fallback disabled');\n        }\n\n        // Add styling hook to show button\n        toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n    }\n\n    // Make an element fullscreen\n    enter() {\n        if (!this.enabled) {\n            return;\n        }\n\n        // iOS native fullscreen doesn't need the request step\n        if (browser.isIos && this.player.config.fullscreen.iosNative) {\n            this.target.webkitEnterFullscreen();\n        } else if (!Fullscreen.native) {\n            toggleFallback.call(this, true);\n        } else if (!this.prefix) {\n            this.target.requestFullscreen();\n        } else if (!is.empty(this.prefix)) {\n            this.target[`${this.prefix}Request${this.property}`]();\n        }\n    }\n\n    // Bail from fullscreen\n    exit() {\n        if (!this.enabled) {\n            return;\n        }\n\n        // iOS native fullscreen\n        if (browser.isIos && this.player.config.fullscreen.iosNative) {\n            this.target.webkitExitFullscreen();\n            this.player.play();\n        } else if (!Fullscreen.native) {\n            toggleFallback.call(this, false);\n        } else if (!this.prefix) {\n            (document.cancelFullScreen || document.exitFullscreen).call(document);\n        } else if (!is.empty(this.prefix)) {\n            const action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n            document[`${this.prefix}${action}${this.property}`]();\n        }\n    }\n\n    // Toggle state\n    toggle() {\n        if (!this.active) {\n            this.enter();\n        } else {\n            this.exit();\n        }\n    }\n}\n\nexport default Fullscreen;\n","// ==========================================================================\n// Load image avoiding xhr/fetch CORS issues\n// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n// By default it checks if it is at least 1px, but you can add a second argument to change this\n// ==========================================================================\n\nexport default function loadImage(src, minWidth = 1) {\n    return new Promise((resolve, reject) => {\n        const image = new Image();\n\n        const handler = () => {\n            delete image.onload;\n            delete image.onerror;\n            (image.naturalWidth >= minWidth ? resolve : reject)(image);\n        };\n\n        Object.assign(image, { onload: handler, onerror: handler, src });\n    });\n}\n","// ==========================================================================\n// Plyr UI\n// ==========================================================================\n\nimport captions from './captions';\nimport controls from './controls';\nimport support from './support';\nimport browser from './utils/browser';\nimport { getElement, toggleClass } from './utils/elements';\nimport { ready, triggerEvent } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadImage from './utils/loadImage';\n\nconst ui = {\n    addStyleHook() {\n        toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n        toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n    },\n\n    // Toggle native HTML5 media controls\n    toggleNativeControls(toggle = false) {\n        if (toggle && this.isHTML5) {\n            this.media.setAttribute('controls', '');\n        } else {\n            this.media.removeAttribute('controls');\n        }\n    },\n\n    // Setup the UI\n    build() {\n        // Re-attach media element listeners\n        // TODO: Use event bubbling?\n        this.listeners.media();\n\n        // Don't setup interface if no support\n        if (!this.supported.ui) {\n            this.debug.warn(`Basic support only for ${this.provider} ${this.type}`);\n\n            // Restore native controls\n            ui.toggleNativeControls.call(this, true);\n\n            // Bail\n            return;\n        }\n\n        // Inject custom controls if not present\n        if (!is.element(this.elements.controls)) {\n            // Inject custom controls\n            controls.inject.call(this);\n\n            // Re-attach control listeners\n            this.listeners.controls();\n        }\n\n        // Remove native controls\n        ui.toggleNativeControls.call(this);\n\n        // Setup captions for HTML5\n        if (this.isHTML5) {\n            captions.setup.call(this);\n        }\n\n        // Reset volume\n        this.volume = null;\n\n        // Reset mute state\n        this.muted = null;\n\n        // Reset speed\n        this.speed = null;\n\n        // Reset loop state\n        this.loop = null;\n\n        // Reset quality setting\n        this.quality = null;\n\n        // Reset volume display\n        controls.updateVolume.call(this);\n\n        // Reset time display\n        controls.timeUpdate.call(this);\n\n        // Update the UI\n        ui.checkPlaying.call(this);\n\n        // Check for picture-in-picture support\n        toggleClass(\n            this.elements.container,\n            this.config.classNames.pip.supported,\n            support.pip && this.isHTML5 && this.isVideo,\n        );\n\n        // Check for airplay support\n        toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5);\n\n        // Add iOS class\n        toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos);\n\n        // Add touch class\n        toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch);\n\n        // Ready for API calls\n        this.ready = true;\n\n        // Ready event at end of execution stack\n        setTimeout(() => {\n            triggerEvent.call(this, this.media, 'ready');\n        }, 0);\n\n        // Set the title\n        ui.setTitle.call(this);\n\n        // Assure the poster image is set, if the property was added before the element was created\n        if (this.poster) {\n            ui.setPoster.call(this, this.poster, false).catch(() => {});\n        }\n\n        // Manually set the duration if user has overridden it.\n        // The event listeners for it doesn't get called if preload is disabled (#701)\n        if (this.config.duration) {\n            controls.durationUpdate.call(this);\n        }\n    },\n\n    // Setup aria attribute for play and iframe title\n    setTitle() {\n        // Find the current text\n        let label = i18n.get('play', this.config);\n\n        // If there's a media title set, use that for the label\n        if (is.string(this.config.title) && !is.empty(this.config.title)) {\n            label += `, ${this.config.title}`;\n        }\n\n        // If there's a play button, set label\n        Array.from(this.elements.buttons.play || []).forEach(button => {\n            button.setAttribute('aria-label', label);\n        });\n\n        // Set iframe title\n        // https://github.com/sampotts/plyr/issues/124\n        if (this.isEmbed) {\n            const iframe = getElement.call(this, 'iframe');\n\n            if (!is.element(iframe)) {\n                return;\n            }\n\n            // Default to media type\n            const title = !is.empty(this.config.title) ? this.config.title : 'video';\n            const format = i18n.get('frameTitle', this.config);\n\n            iframe.setAttribute('title', format.replace('{title}', title));\n        }\n    },\n\n    // Toggle poster\n    togglePoster(enable) {\n        toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n    },\n\n    // Set the poster image (async)\n    // Used internally for the poster setter, with the passive option forced to false\n    setPoster(poster, passive = true) {\n        // Don't override if call is passive\n        if (passive && this.poster) {\n            return Promise.reject(new Error('Poster already set'));\n        }\n\n        // Set property synchronously to respect the call order\n        this.media.setAttribute('poster', poster);\n\n        // Wait until ui is ready\n        return (\n            ready\n                .call(this)\n                // Load image\n                .then(() => loadImage(poster))\n                .catch(err => {\n                    // Hide poster on error unless it's been set by another call\n                    if (poster === this.poster) {\n                        ui.togglePoster.call(this, false);\n                    }\n                    // Rethrow\n                    throw err;\n                })\n                .then(() => {\n                    // Prevent race conditions\n                    if (poster !== this.poster) {\n                        throw new Error('setPoster cancelled by later call to setPoster');\n                    }\n                })\n                .then(() => {\n                    Object.assign(this.elements.poster.style, {\n                        backgroundImage: `url('${poster}')`,\n                        // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n                        backgroundSize: '',\n                    });\n                    ui.togglePoster.call(this, true);\n                    return poster;\n                })\n        );\n    },\n\n    // Check playing state\n    checkPlaying(event) {\n        // Class hooks\n        toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n        toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n        toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped);\n\n        // Set state\n        Array.from(this.elements.buttons.play || []).forEach(target => {\n            target.pressed = this.playing;\n        });\n\n        // Only update controls on non timeupdate events\n        if (is.event(event) && event.type === 'timeupdate') {\n            return;\n        }\n\n        // Toggle controls\n        ui.toggleControls.call(this);\n    },\n\n    // Check if media is loading\n    checkLoading(event) {\n        this.loading = ['stalled', 'waiting'].includes(event.type);\n\n        // Clear timer\n        clearTimeout(this.timers.loading);\n\n        // Timer to prevent flicker when seeking\n        this.timers.loading = setTimeout(() => {\n            // Update progress bar loading class state\n            toggleClass(this.elements.container, this.config.classNames.loading, this.loading);\n\n            // Update controls visibility\n            ui.toggleControls.call(this);\n        }, this.loading ? 250 : 0);\n    },\n\n    // Toggle controls based on state and `force` argument\n    toggleControls(force) {\n        const { controls } = this.elements;\n\n        if (controls && this.config.hideControls) {\n            // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n            const recentTouchSeek = (this.touch && this.lastSeekTime + 2000 > Date.now());\n\n            // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n            this.toggleControls(Boolean(force || this.loading || this.paused || controls.pressed || controls.hover || recentTouchSeek));\n        }\n    },\n};\n\nexport default ui;\n","// ==========================================================================\n// Plyr Event Listeners\n// ==========================================================================\n\nimport controls from './controls';\nimport ui from './ui';\nimport { repaint } from './utils/animation';\nimport browser from './utils/browser';\nimport { getElement, getElements, matches, toggleClass, toggleHidden } from './utils/elements';\nimport { on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\n\nclass Listeners {\n    constructor(player) {\n        this.player = player;\n        this.lastKey = null;\n        this.focusTimer = null;\n        this.lastKeyDown = null;\n\n        this.handleKey = this.handleKey.bind(this);\n        this.toggleMenu = this.toggleMenu.bind(this);\n        this.setTabFocus = this.setTabFocus.bind(this);\n        this.firstTouch = this.firstTouch.bind(this);\n    }\n\n    // Handle key presses\n    handleKey(event) {\n        const { player } = this;\n        const { elements } = player;\n        const code = event.keyCode ? event.keyCode : event.which;\n        const pressed = event.type === 'keydown';\n        const repeat = pressed && code === this.lastKey;\n\n        // Bail if a modifier key is set\n        if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n            return;\n        }\n\n        // If the event is bubbled from the media element\n        // Firefox doesn't get the keycode for whatever reason\n        if (!is.number(code)) {\n            return;\n        }\n\n        // Seek by the number keys\n        const seekByKey = () => {\n            // Divide the max duration into 10th's and times by the number value\n            player.currentTime = (player.duration / 10) * (code - 48);\n        };\n\n        // Handle the key on keydown\n        // Reset on keyup\n        if (pressed) {\n            // Check focused element\n            // and if the focused element is not editable (e.g. text input)\n            // and any that accept key input http://webaim.org/techniques/keyboard/\n            const focused = document.activeElement;\n            if (is.element(focused)) {\n                const { editable } = player.config.selectors;\n                const { seek } = elements.inputs;\n\n                if (focused !== seek && matches(focused, editable)) {\n                    return;\n                }\n\n                if (event.which === 32 && matches(focused, 'button, [role^=\"menuitem\"]')) {\n                    return;\n                }\n            }\n\n            // Which keycodes should we prevent default\n            const preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79];\n\n            // If the code is found prevent default (e.g. prevent scrolling for arrows)\n            if (preventDefault.includes(code)) {\n                event.preventDefault();\n                event.stopPropagation();\n            }\n\n            switch (code) {\n                case 48:\n                case 49:\n                case 50:\n                case 51:\n                case 52:\n                case 53:\n                case 54:\n                case 55:\n                case 56:\n                case 57:\n                    // 0-9\n                    if (!repeat) {\n                        seekByKey();\n                    }\n                    break;\n\n                case 32:\n                case 75:\n                    // Space and K key\n                    if (!repeat) {\n                        player.togglePlay();\n                    }\n                    break;\n\n                case 38:\n                    // Arrow up\n                    player.increaseVolume(0.1);\n                    break;\n\n                case 40:\n                    // Arrow down\n                    player.decreaseVolume(0.1);\n                    break;\n\n                case 77:\n                    // M key\n                    if (!repeat) {\n                        player.muted = !player.muted;\n                    }\n                    break;\n\n                case 39:\n                    // Arrow forward\n                    player.forward();\n                    break;\n\n                case 37:\n                    // Arrow back\n                    player.rewind();\n                    break;\n\n                case 70:\n                    // F key\n                    player.fullscreen.toggle();\n                    break;\n\n                case 67:\n                    // C key\n                    if (!repeat) {\n                        player.toggleCaptions();\n                    }\n                    break;\n\n                case 76:\n                    // L key\n                    player.loop = !player.loop;\n                    break;\n\n                    /* case 73:\n                    this.setLoop('start');\n                    break;\n\n                case 76:\n                    this.setLoop();\n                    break;\n\n                case 79:\n                    this.setLoop('end');\n                    break; */\n\n                default:\n                    break;\n            }\n\n            // Escape is handle natively when in full screen\n            // So we only need to worry about non native\n            if (!player.fullscreen.enabled && player.fullscreen.active && code === 27) {\n                player.fullscreen.toggle();\n            }\n\n            // Store last code for next cycle\n            this.lastKey = code;\n        } else {\n            this.lastKey = null;\n        }\n    }\n\n    // Toggle menu\n    toggleMenu(event) {\n        controls.toggleMenu.call(this.player, event);\n    }\n\n    // Device is touch enabled\n    firstTouch() {\n        const { player } = this;\n        const { elements } = player;\n\n        player.touch = true;\n\n        // Add touch class\n        toggleClass(elements.container, player.config.classNames.isTouch, true);\n    }\n\n    setTabFocus(event) {\n        const { player } = this;\n        const { elements } = player;\n\n        clearTimeout(this.focusTimer);\n\n        // Ignore any key other than tab\n        if (event.type === 'keydown' && event.which !== 9) {\n            return;\n        }\n\n        // Store reference to event timeStamp\n        if (event.type === 'keydown') {\n            this.lastKeyDown = event.timeStamp;\n        }\n\n        // Remove current classes\n        const removeCurrent = () => {\n            const className = player.config.classNames.tabFocus;\n            const current = getElements.call(player, `.${className}`);\n            toggleClass(current, className, false);\n        };\n\n        // Determine if a key was pressed to trigger this event\n        const wasKeyDown = event.timeStamp - this.lastKeyDown <= 20;\n\n        // Ignore focus events if a key was pressed prior\n        if (event.type === 'focus' && !wasKeyDown) {\n            return;\n        }\n\n        // Remove all current\n        removeCurrent();\n\n        // Delay the adding of classname until the focus has changed\n        // This event fires before the focusin event\n        this.focusTimer = setTimeout(() => {\n            const focused = document.activeElement;\n\n            // Ignore if current focus element isn't inside the player\n            if (!elements.container.contains(focused)) {\n                return;\n            }\n\n            toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n        }, 10);\n    }\n\n    // Global window & document listeners\n    global(toggle = true) {\n        const { player } = this;\n\n        // Keyboard shortcuts\n        if (player.config.keyboard.global) {\n            toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n        }\n\n        // Click anywhere closes menu\n        toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle);\n\n        // Detect touch by events\n        once.call(player, document.body, 'touchstart', this.firstTouch);\n\n        // Tab focus detection\n        toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);\n    }\n\n    // Container listeners\n    container() {\n        const { player } = this;\n        const { elements } = player;\n\n        // Keyboard shortcuts\n        if (!player.config.keyboard.global && player.config.keyboard.focused) {\n            on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n        }\n\n        // Toggle controls on mouse events and entering fullscreen\n        on.call(\n            player,\n            elements.container,\n            'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen',\n            event => {\n                const { controls } = elements;\n\n                // Remove button states for fullscreen\n                if (controls && event.type === 'enterfullscreen') {\n                    controls.pressed = false;\n                    controls.hover = false;\n                }\n\n                // Show, then hide after a timeout unless another control event occurs\n                const show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\n                let delay = 0;\n\n                if (show) {\n                    ui.toggleControls.call(player, true);\n                    // Use longer timeout for touch devices\n                    delay = player.touch ? 3000 : 2000;\n                }\n\n                // Clear timer\n                clearTimeout(player.timers.controls);\n\n                // Set new timer to prevent flicker when seeking\n                player.timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n            },\n        );\n    }\n\n    // Listen for media events\n    media() {\n        const { player } = this;\n        const { elements } = player;\n\n        // Time change on media\n        on.call(player, player.media, 'timeupdate seeking seeked', event => controls.timeUpdate.call(player, event));\n\n        // Display duration\n        on.call(player, player.media, 'durationchange loadeddata loadedmetadata', event =>\n            controls.durationUpdate.call(player, event),\n        );\n\n        // Check for audio tracks on load\n        // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point\n        on.call(player, player.media, 'canplay loadeddata', () => {\n            toggleHidden(elements.volume, !player.hasAudio);\n            toggleHidden(elements.buttons.mute, !player.hasAudio);\n        });\n\n        // Handle the media finishing\n        on.call(player, player.media, 'ended', () => {\n            // Show poster on end\n            if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n                // Restart\n                player.restart();\n            }\n        });\n\n        // Check for buffer progress\n        on.call(player, player.media, 'progress playing seeking seeked', event =>\n            controls.updateProgress.call(player, event),\n        );\n\n        // Handle volume changes\n        on.call(player, player.media, 'volumechange', event => controls.updateVolume.call(player, event));\n\n        // Handle play/pause\n        on.call(player, player.media, 'playing play pause ended emptied timeupdate', event =>\n            ui.checkPlaying.call(player, event),\n        );\n\n        // Loading state\n        on.call(player, player.media, 'waiting canplay seeked playing', event => ui.checkLoading.call(player, event));\n\n        // If autoplay, then load advertisement if required\n        // TODO: Show some sort of loading state while the ad manager loads else there's a delay before ad shows\n        on.call(player, player.media, 'playing', () => {\n            if (!player.ads) {\n                return;\n            }\n\n            // If ads are enabled, wait for them first\n            if (player.ads.enabled && !player.ads.initialized) {\n                // Wait for manager response\n                player.ads.managerPromise.then(() => player.ads.play()).catch(() => player.play());\n            }\n        });\n\n        // Click video\n        if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n            // Re-fetch the wrapper\n            const wrapper = getElement.call(player, `.${player.config.classNames.video}`);\n\n            // Bail if there's no wrapper (this should never happen)\n            if (!is.element(wrapper)) {\n                return;\n            }\n\n            // On click play, pause or restart\n            on.call(player, elements.container, 'click', event => {\n                const targets = [elements.container, wrapper];\n\n                // Ignore if click if not container or in video wrapper\n                if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n                    return;\n                }\n\n                // Touch devices will just show controls (if hidden)\n                if (player.touch && player.config.hideControls) {\n                    return;\n                }\n\n                if (player.ended) {\n                    player.restart();\n                    player.play();\n                } else {\n                    player.togglePlay();\n                }\n            });\n        }\n\n        // Disable right click\n        if (player.supported.ui && player.config.disableContextMenu) {\n            on.call(\n                player,\n                elements.wrapper,\n                'contextmenu',\n                event => {\n                    event.preventDefault();\n                },\n                false,\n            );\n        }\n\n        // Volume change\n        on.call(player, player.media, 'volumechange', () => {\n            // Save to storage\n            player.storage.set({\n                volume: player.volume,\n                muted: player.muted,\n            });\n        });\n\n        // Speed change\n        on.call(player, player.media, 'ratechange', () => {\n            // Update UI\n            controls.updateSetting.call(player, 'speed');\n\n            // Save to storage\n            player.storage.set({ speed: player.speed });\n        });\n\n        // Quality change\n        on.call(player, player.media, 'qualitychange', event => {\n            // Update UI\n            controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n        });\n\n        // Update download link when ready and if quality changes\n        on.call(player, player.media, 'ready qualitychange', () => {\n            controls.setDownloadLink.call(player);\n        });\n\n        // Proxy events to container\n        // Bubble up key events for Edge\n        const proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\n        on.call(player, player.media, proxyEvents, event => {\n            let { detail = {} } = event;\n\n            // Get error details from media\n            if (event.type === 'error') {\n                detail = player.media.error;\n            }\n\n            triggerEvent.call(player, elements.container, event.type, true, detail);\n        });\n    }\n\n    // Run default and custom handlers\n    proxy(event, defaultHandler, customHandlerKey) {\n        const { player } = this;\n        const customHandler = player.config.listeners[customHandlerKey];\n        const hasCustomHandler = is.function(customHandler);\n        let returned = true;\n\n        // Execute custom handler\n        if (hasCustomHandler) {\n            returned = customHandler.call(player, event);\n        }\n\n        // Only call default handler if not prevented in custom handler\n        if (returned && is.function(defaultHandler)) {\n            defaultHandler.call(player, event);\n        }\n    }\n\n    // Trigger custom and default handlers\n    bind(element, type, defaultHandler, customHandlerKey, passive = true) {\n        const { player } = this;\n        const customHandler = player.config.listeners[customHandlerKey];\n        const hasCustomHandler = is.function(customHandler);\n\n        on.call(\n            player,\n            element,\n            type,\n            event => this.proxy(event, defaultHandler, customHandlerKey),\n            passive && !hasCustomHandler,\n        );\n    }\n\n    // Listen for control events\n    controls() {\n        const { player } = this;\n        const { elements } = player;\n\n        // IE doesn't support input event, so we fallback to change\n        const inputEvent = browser.isIE ? 'change' : 'input';\n\n        // Play/pause toggle\n        if (elements.buttons.play) {\n            Array.from(elements.buttons.play).forEach(button => {\n                this.bind(button, 'click', player.togglePlay, 'play');\n            });\n        }\n\n        // Pause\n        this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n        // Rewind\n        this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind');\n\n        // Rewind\n        this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward');\n\n        // Mute toggle\n        this.bind(\n            elements.buttons.mute,\n            'click',\n            () => {\n                player.muted = !player.muted;\n            },\n            'mute',\n        );\n\n        // Captions toggle\n        this.bind(elements.buttons.captions, 'click', () => player.toggleCaptions());\n\n        // Download\n        this.bind(\n            elements.buttons.download,\n            'click',\n            () => {\n                triggerEvent.call(player, player.media, 'download');\n            },\n            'download',\n        );\n\n        // Fullscreen toggle\n        this.bind(\n            elements.buttons.fullscreen,\n            'click',\n            () => {\n                player.fullscreen.toggle();\n            },\n            'fullscreen',\n        );\n\n        // Picture-in-Picture\n        this.bind(\n            elements.buttons.pip,\n            'click',\n            () => {\n                player.pip = 'toggle';\n            },\n            'pip',\n        );\n\n        // Airplay\n        this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay');\n\n        // Settings menu - click toggle\n        this.bind(elements.buttons.settings, 'click', event => {\n            // Prevent the document click listener closing the menu\n            event.stopPropagation();\n\n            controls.toggleMenu.call(player, event);\n        });\n\n        // Settings menu - keyboard toggle\n        // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n        // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n        this.bind(\n            elements.buttons.settings,\n            'keyup',\n            event => {\n                const code = event.which;\n\n                // We only care about space and return\n                if (![13, 32].includes(code)) {\n                    return;\n                }\n\n                // Because return triggers a click anyway, all we need to do is set focus\n                if (code === 13) {\n                    controls.focusFirstMenuItem.call(player, null, true);\n                    return;\n                }\n\n                // Prevent scroll\n                event.preventDefault();\n\n                // Prevent playing video (Firefox)\n                event.stopPropagation();\n\n                // Toggle menu\n                controls.toggleMenu.call(player, event);\n            },\n            null,\n            false, // Can't be passive as we're preventing default\n        );\n\n        // Escape closes menu\n        this.bind(elements.settings.menu, 'keydown', event => {\n            if (event.which === 27) {\n                controls.toggleMenu.call(player, event);\n            }\n        });\n\n        // Set range input alternative \"value\", which matches the tooltip time (#954)\n        this.bind(elements.inputs.seek, 'mousedown mousemove', event => {\n            const rect = elements.progress.getBoundingClientRect();\n            const percent = (100 / rect.width) * (event.pageX - rect.left);\n            event.currentTarget.setAttribute('seek-value', percent);\n        });\n\n        // Pause while seeking\n        this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', event => {\n            const seek = event.currentTarget;\n            const code = event.keyCode ? event.keyCode : event.which;\n            const attribute = 'play-on-seeked';\n\n            if (is.keyboardEvent(event) && (code !== 39 && code !== 37)) {\n                return;\n            }\n\n            // Record seek time so we can prevent hiding controls for a few seconds after seek\n            player.lastSeekTime = Date.now();\n\n            // Was playing before?\n            const play = seek.hasAttribute(attribute);\n\n            // Done seeking\n            const done = ['mouseup', 'touchend', 'keyup'].includes(event.type);\n\n            // If we're done seeking and it was playing, resume playback\n            if (play && done) {\n                seek.removeAttribute(attribute);\n                player.play();\n            } else if (!done && player.playing) {\n                seek.setAttribute(attribute, '');\n                player.pause();\n            }\n        });\n\n        // Fix range inputs on iOS\n        // Super weird iOS bug where after you interact with an <input type=\"range\">,\n        // it takes over further interactions on the page. This is a hack\n        if (browser.isIos) {\n            const inputs = getElements.call(player, 'input[type=\"range\"]');\n            Array.from(inputs).forEach(input => this.bind(input, inputEvent, event => repaint(event.target)));\n        }\n\n        // Seek\n        this.bind(\n            elements.inputs.seek,\n            inputEvent,\n            event => {\n                const seek = event.currentTarget;\n\n                // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n                let seekTo = seek.getAttribute('seek-value');\n\n                if (is.empty(seekTo)) {\n                    seekTo = seek.value;\n                }\n\n                seek.removeAttribute('seek-value');\n\n                player.currentTime = (seekTo / seek.max) * player.duration;\n            },\n            'seek',\n        );\n\n        // Seek tooltip\n        this.bind(elements.progress, 'mouseenter mouseleave mousemove', event =>\n            controls.updateSeekTooltip.call(player, event),\n        );\n\n        // Polyfill for lower fill in <input type=\"range\"> for webkit\n        if (browser.isWebkit) {\n            Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(element => {\n                this.bind(element, 'input', event => controls.updateRangeFill.call(player, event.target));\n            });\n        }\n\n        // Current time invert\n        // Only if one time element is used for both currentTime and duration\n        if (player.config.toggleInvert && !is.element(elements.display.duration)) {\n            this.bind(elements.display.currentTime, 'click', () => {\n                // Do nothing if we're at the start\n                if (player.currentTime === 0) {\n                    return;\n                }\n\n                player.config.invertTime = !player.config.invertTime;\n\n                controls.timeUpdate.call(player);\n            });\n        }\n\n        // Volume\n        this.bind(\n            elements.inputs.volume,\n            inputEvent,\n            event => {\n                player.volume = event.target.value;\n            },\n            'volume',\n        );\n\n        // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n        this.bind(elements.controls, 'mouseenter mouseleave', event => {\n            elements.controls.hover = !player.touch && event.type === 'mouseenter';\n        });\n\n        // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n        this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', event => {\n            elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n        });\n\n        // Show controls when they receive focus (e.g., when using keyboard tab key)\n        this.bind(elements.controls, 'focusin', () => {\n            const { config, elements, timers } = player;\n\n            // Skip transition to prevent focus from scrolling the parent element\n            toggleClass(elements.controls, config.classNames.noTransition, true);\n\n            // Toggle\n            ui.toggleControls.call(player, true);\n\n            // Restore transition\n            setTimeout(() => {\n                toggleClass(elements.controls, config.classNames.noTransition, false);\n            }, 0);\n\n            // Delay a little more for mouse users\n            const delay = this.touch ? 3000 : 4000;\n\n            // Clear timer\n            clearTimeout(timers.controls);\n\n            // Hide again after delay\n            timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n        });\n\n        // Mouse wheel for volume\n        this.bind(\n            elements.inputs.volume,\n            'wheel',\n            event => {\n                // Detect \"natural\" scroll - suppored on OS X Safari only\n                // Other browsers on OS X will be inverted until support improves\n                const inverted = event.webkitDirectionInvertedFromDevice;\n\n                // Get delta from event. Invert if `inverted` is true\n                const [x, y] = [event.deltaX, -event.deltaY].map(value => (inverted ? -value : value));\n\n                // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n                const direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y);\n\n                // Change the volume by 2%\n                player.increaseVolume(direction / 50);\n\n                // Don't break page scrolling at max and min\n                const { volume } = player.media;\n                if ((direction === 1 && volume < 1) || (direction === -1 && volume > 0)) {\n                    event.preventDefault();\n                }\n            },\n            'volume',\n            false,\n        );\n    }\n}\n\nexport default Listeners;\n","(function(root, factory) {\n  if (typeof define === 'function' && define.amd) {\n    define([], factory);\n  } else if (typeof exports === 'object') {\n    module.exports = factory();\n  } else {\n    root.loadjs = factory();\n  }\n}(this, function() {\n/**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n\nvar devnull = function() {},\n    bundleIdCache = {},\n    bundleResultCache = {},\n    bundleCallbackQueue = {};\n\n\n/**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\nfunction subscribe(bundleIds, callbackFn) {\n  // listify\n  bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\n  var depsNotFound = [],\n      i = bundleIds.length,\n      numWaiting = i,\n      fn,\n      bundleId,\n      r,\n      q;\n\n  // define callback function\n  fn = function (bundleId, pathsNotFound) {\n    if (pathsNotFound.length) depsNotFound.push(bundleId);\n\n    numWaiting--;\n    if (!numWaiting) callbackFn(depsNotFound);\n  };\n\n  // register callback\n  while (i--) {\n    bundleId = bundleIds[i];\n\n    // execute callback if in result cache\n    r = bundleResultCache[bundleId];\n    if (r) {\n      fn(bundleId, r);\n      continue;\n    }\n\n    // add to callback queue\n    q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n    q.push(fn);\n  }\n}\n\n\n/**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\nfunction publish(bundleId, pathsNotFound) {\n  // exit if id isn't defined\n  if (!bundleId) return;\n\n  var q = bundleCallbackQueue[bundleId];\n\n  // cache result\n  bundleResultCache[bundleId] = pathsNotFound;\n\n  // exit if queue is empty\n  if (!q) return;\n\n  // empty callback queue\n  while (q.length) {\n    q[0](bundleId, pathsNotFound);\n    q.splice(0, 1);\n  }\n}\n\n\n/**\n * Execute callbacks.\n * @param {Object or Function} args - The callback args\n * @param {string[]} depsNotFound - List of dependencies not found\n */\nfunction executeCallbacks(args, depsNotFound) {\n  // accept function as argument\n  if (args.call) args = {success: args};\n\n  // success and error callbacks\n  if (depsNotFound.length) (args.error || devnull)(depsNotFound);\n  else (args.success || devnull)(args);\n}\n\n\n/**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFile(path, callbackFn, args, numTries) {\n  var doc = document,\n      async = args.async,\n      maxTries = (args.numRetries || 0) + 1,\n      beforeCallbackFn = args.before || devnull,\n      pathStripped = path.replace(/^(css|img)!/, ''),\n      isCss,\n      e;\n\n  numTries = numTries || 0;\n\n  if (/(^css!|\\.css$)/.test(path)) {\n    isCss = true;\n\n    // css\n    e = doc.createElement('link');\n    e.rel = 'stylesheet';\n    e.href = pathStripped; //.replace(/^css!/, '');  // remove \"css!\" prefix\n  } else if (/(^img!|\\.(png|gif|jpg|svg)$)/.test(path)) {\n    // image\n    e = doc.createElement('img');\n    e.src = pathStripped;    \n  } else {\n    // javascript\n    e = doc.createElement('script');\n    e.src = path;\n    e.async = async === undefined ? true : async;\n  }\n\n  e.onload = e.onerror = e.onbeforeload = function (ev) {\n    var result = ev.type[0];\n\n    // Note: The following code isolates IE using `hideFocus` and treats empty\n    // stylesheets as failures to get around lack of onerror support\n    if (isCss && 'hideFocus' in e) {\n      try {\n        if (!e.sheet.cssText.length) result = 'e';\n      } catch (x) {\n        // sheets objects created from load errors don't allow access to\n        // `cssText` (unless error is Code:18 SecurityError)\n        if (x.code != 18) result = 'e';\n      }\n    }\n\n    // handle retries in case of load failure\n    if (result == 'e') {\n      // increment counter\n      numTries += 1;\n\n      // exit function and try again\n      if (numTries < maxTries) {\n        return loadFile(path, callbackFn, args, numTries);\n      }\n    }\n\n    // execute callback\n    callbackFn(path, result, ev.defaultPrevented);\n  };\n\n  // add to document (unless callback returns `false`)\n  if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n}\n\n\n/**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\nfunction loadFiles(paths, callbackFn, args) {\n  // listify paths\n  paths = paths.push ? paths : [paths];\n\n  var numWaiting = paths.length,\n      x = numWaiting,\n      pathsNotFound = [],\n      fn,\n      i;\n\n  // define callback function\n  fn = function(path, result, defaultPrevented) {\n    // handle error\n    if (result == 'e') pathsNotFound.push(path);\n\n    // handle beforeload event. If defaultPrevented then that means the load\n    // will be blocked (ex. Ghostery/ABP on Safari)\n    if (result == 'b') {\n      if (defaultPrevented) pathsNotFound.push(path);\n      else return;\n    }\n\n    numWaiting--;\n    if (!numWaiting) callbackFn(pathsNotFound);\n  };\n\n  // load scripts\n  for (i=0; i < x; i++) loadFile(paths[i], fn, args);\n}\n\n\n/**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function)} [arg1] - The bundleId or success callback\n * @param {Function} [arg2] - The success or error callback\n * @param {Function} [arg3] - The error callback\n */\nfunction loadjs(paths, arg1, arg2) {\n  var bundleId,\n      args;\n\n  // bundleId (if string)\n  if (arg1 && arg1.trim) bundleId = arg1;\n\n  // args (default is {})\n  args = (bundleId ? arg2 : arg1) || {};\n\n  // throw error if bundle is already defined\n  if (bundleId) {\n    if (bundleId in bundleIdCache) {\n      throw \"LoadJS\";\n    } else {\n      bundleIdCache[bundleId] = true;\n    }\n  }\n\n  // load scripts\n  loadFiles(paths, function (pathsNotFound) {\n    // execute callbacks\n    executeCallbacks(args, pathsNotFound);\n\n    // publish bundle load event\n    publish(bundleId, pathsNotFound);\n  }, args);\n}\n\n\n/**\n * Execute callbacks when dependencies have been satisfied.\n * @param {(string|string[])} deps - List of bundle ids\n * @param {Object} args - success/error arguments\n */\nloadjs.ready = function ready(deps, args) {\n  // subscribe to bundle load event\n  subscribe(deps, function (depsNotFound) {\n    // execute callbacks\n    executeCallbacks(args, depsNotFound);\n  });\n\n  return loadjs;\n};\n\n\n/**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\nloadjs.done = function done(bundleId) {\n  publish(bundleId, []);\n};\n\n\n/**\n * Reset loadjs dependencies statuses\n */\nloadjs.reset = function reset() {\n  bundleIdCache = {};\n  bundleResultCache = {};\n  bundleCallbackQueue = {};\n};\n\n\n/**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\nloadjs.isDefined = function isDefined(bundleId) {\n  return bundleId in bundleIdCache;\n};\n\n\n// export\nreturn loadjs;\n\n}));\n","// ==========================================================================\n// Load an external script\n// ==========================================================================\n\nimport loadjs from 'loadjs';\n\nexport default function loadScript(url) {\n    return new Promise((resolve, reject) => {\n        loadjs(url, {\n            success: resolve,\n            error: reject,\n        });\n    });\n}\n","// ==========================================================================\n// Vimeo plugin\n// ==========================================================================\n\nimport captions from '../captions';\nimport controls from '../controls';\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { format, stripHTML } from '../utils/strings';\nimport { buildUrlParams } from '../utils/urls';\n\n// Parse Vimeo ID from URL\nfunction parseId(url) {\n    if (is.empty(url)) {\n        return null;\n    }\n\n    if (is.number(Number(url))) {\n        return url;\n    }\n\n    const regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n    return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Get aspect ratio for dimensions\nfunction getAspectRatio(width, height) {\n    const getRatio = (w, h) => (h === 0 ? w : getRatio(h, w % h));\n    const ratio = getRatio(width, height);\n    return `${width / ratio}:${height / ratio}`;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n    if (play && !this.embed.hasPlayed) {\n        this.embed.hasPlayed = true;\n    }\n    if (this.media.paused === play) {\n        this.media.paused = !play;\n        triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n    }\n}\n\nconst vimeo = {\n    setup() {\n        // Add embed class for responsive\n        toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n        // Set intial ratio\n        vimeo.setAspectRatio.call(this);\n\n        // Load the API if not already\n        if (!is.object(window.Vimeo)) {\n            loadScript(this.config.urls.vimeo.sdk)\n                .then(() => {\n                    vimeo.ready.call(this);\n                })\n                .catch(error => {\n                    this.debug.warn('Vimeo API failed to load', error);\n                });\n        } else {\n            vimeo.ready.call(this);\n        }\n    },\n\n    // Set aspect ratio\n    // For Vimeo we have an extra 300% height <div> to hide the standard controls and UI\n    setAspectRatio(input) {\n        const [x, y] = (is.string(input) ? input : this.config.ratio).split(':').map(Number);\n        const padding = (100 / x) * y;\n        vimeo.padding = padding;\n        this.elements.wrapper.style.paddingBottom = `${padding}%`;\n\n        if (this.supported.ui) {\n            const height = 240;\n            const offset = (height - padding) / (height / 50);\n\n            this.media.style.transform = `translateY(-${offset}%)`;\n        }\n    },\n\n    // API Ready\n    ready() {\n        const player = this;\n\n        // Get Vimeo params for the iframe\n        const options = {\n            loop: player.config.loop.active,\n            autoplay: player.autoplay,\n            // muted: player.muted,\n            byline: false,\n            portrait: false,\n            title: false,\n            speed: true,\n            transparent: 0,\n            gesture: 'media',\n            playsinline: !this.config.fullscreen.iosNative,\n        };\n        const params = buildUrlParams(options);\n\n        // Get the source URL or ID\n        let source = player.media.getAttribute('src');\n\n        // Get from <div> if needed\n        if (is.empty(source)) {\n            source = player.media.getAttribute(player.config.attributes.embed.id);\n        }\n\n        const id = parseId(source);\n\n        // Build an iframe\n        const iframe = createElement('iframe');\n        const src = format(player.config.urls.vimeo.iframe, id, params);\n        iframe.setAttribute('src', src);\n        iframe.setAttribute('allowfullscreen', '');\n        iframe.setAttribute('allowtransparency', '');\n        iframe.setAttribute('allow', 'autoplay');\n\n        // Get poster, if already set\n        const { poster } = player;\n\n        // Inject the package\n        const wrapper = createElement('div', { poster, class: player.config.classNames.embedContainer });\n        wrapper.appendChild(iframe);\n        player.media = replaceElement(wrapper, player.media);\n\n        // Get poster image\n        fetch(format(player.config.urls.vimeo.api, id), 'json').then(response => {\n            if (is.empty(response)) {\n                return;\n            }\n\n            // Get the URL for thumbnail\n            const url = new URL(response[0].thumbnail_large);\n\n            // Get original image\n            url.pathname = `${url.pathname.split('_')[0]}.jpg`;\n\n            // Set and show poster\n            ui.setPoster.call(player, url.href).catch(() => {});\n        });\n\n        // Setup instance\n        // https://github.com/vimeo/player.js\n        player.embed = new window.Vimeo.Player(iframe, {\n            autopause: player.config.autopause,\n            muted: player.muted,\n        });\n\n        player.media.paused = true;\n        player.media.currentTime = 0;\n\n        // Disable native text track rendering\n        if (player.supported.ui) {\n            player.embed.disableTextTrack();\n        }\n\n        // Create a faux HTML5 API using the Vimeo API\n        player.media.play = () => {\n            assurePlaybackState.call(player, true);\n            return player.embed.play();\n        };\n\n        player.media.pause = () => {\n            assurePlaybackState.call(player, false);\n            return player.embed.pause();\n        };\n\n        player.media.stop = () => {\n            player.pause();\n            player.currentTime = 0;\n        };\n\n        // Seeking\n        let { currentTime } = player.media;\n        Object.defineProperty(player.media, 'currentTime', {\n            get() {\n                return currentTime;\n            },\n            set(time) {\n                // Vimeo will automatically play on seek if the video hasn't been played before\n\n                // Get current paused state and volume etc\n                const { embed, media, paused, volume } = player;\n                const restorePause = paused && !embed.hasPlayed;\n\n                // Set seeking state and trigger event\n                media.seeking = true;\n                triggerEvent.call(player, media, 'seeking');\n\n                // If paused, mute until seek is complete\n                Promise.resolve(restorePause && embed.setVolume(0))\n                    // Seek\n                    .then(() => embed.setCurrentTime(time))\n                    // Restore paused\n                    .then(() => restorePause && embed.pause())\n                    // Restore volume\n                    .then(() => restorePause && embed.setVolume(volume))\n                    .catch(() => {\n                        // Do nothing\n                    });\n            },\n        });\n\n        // Playback speed\n        let speed = player.config.speed.selected;\n        Object.defineProperty(player.media, 'playbackRate', {\n            get() {\n                return speed;\n            },\n            set(input) {\n                player.embed\n                    .setPlaybackRate(input)\n                    .then(() => {\n                        speed = input;\n                        triggerEvent.call(player, player.media, 'ratechange');\n                    })\n                    .catch(error => {\n                        // Hide menu item (and menu if empty)\n                        if (error.name === 'Error') {\n                            controls.setSpeedMenu.call(player, []);\n                        }\n                    });\n            },\n        });\n\n        // Volume\n        let { volume } = player.config;\n        Object.defineProperty(player.media, 'volume', {\n            get() {\n                return volume;\n            },\n            set(input) {\n                player.embed.setVolume(input).then(() => {\n                    volume = input;\n                    triggerEvent.call(player, player.media, 'volumechange');\n                });\n            },\n        });\n\n        // Muted\n        let { muted } = player.config;\n        Object.defineProperty(player.media, 'muted', {\n            get() {\n                return muted;\n            },\n            set(input) {\n                const toggle = is.boolean(input) ? input : false;\n\n                player.embed.setVolume(toggle ? 0 : player.config.volume).then(() => {\n                    muted = toggle;\n                    triggerEvent.call(player, player.media, 'volumechange');\n                });\n            },\n        });\n\n        // Loop\n        let { loop } = player.config;\n        Object.defineProperty(player.media, 'loop', {\n            get() {\n                return loop;\n            },\n            set(input) {\n                const toggle = is.boolean(input) ? input : player.config.loop.active;\n\n                player.embed.setLoop(toggle).then(() => {\n                    loop = toggle;\n                });\n            },\n        });\n\n        // Source\n        let currentSrc;\n        player.embed\n            .getVideoUrl()\n            .then(value => {\n                currentSrc = value;\n                controls.setDownloadLink.call(player);\n            })\n            .catch(error => {\n                this.debug.warn(error);\n            });\n\n        Object.defineProperty(player.media, 'currentSrc', {\n            get() {\n                return currentSrc;\n            },\n        });\n\n        // Ended\n        Object.defineProperty(player.media, 'ended', {\n            get() {\n                return player.currentTime === player.duration;\n            },\n        });\n\n        // Set aspect ratio based on video size\n        Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(dimensions => {\n            vimeo.ratio = getAspectRatio(dimensions[0], dimensions[1]);\n            vimeo.setAspectRatio.call(this, vimeo.ratio);\n        });\n\n        // Set autopause\n        player.embed.setAutopause(player.config.autopause).then(state => {\n            player.config.autopause = state;\n        });\n\n        // Get title\n        player.embed.getVideoTitle().then(title => {\n            player.config.title = title;\n            ui.setTitle.call(this);\n        });\n\n        // Get current time\n        player.embed.getCurrentTime().then(value => {\n            currentTime = value;\n            triggerEvent.call(player, player.media, 'timeupdate');\n        });\n\n        // Get duration\n        player.embed.getDuration().then(value => {\n            player.media.duration = value;\n            triggerEvent.call(player, player.media, 'durationchange');\n        });\n\n        // Get captions\n        player.embed.getTextTracks().then(tracks => {\n            player.media.textTracks = tracks;\n            captions.setup.call(player);\n        });\n\n        player.embed.on('cuechange', ({ cues = [] }) => {\n            const strippedCues = cues.map(cue => stripHTML(cue.text));\n            captions.updateCues.call(player, strippedCues);\n        });\n\n        player.embed.on('loaded', () => {\n            // Assure state and events are updated on autoplay\n            player.embed.getPaused().then(paused => {\n                assurePlaybackState.call(player, !paused);\n                if (!paused) {\n                    triggerEvent.call(player, player.media, 'playing');\n                }\n            });\n\n            if (is.element(player.embed.element) && player.supported.ui) {\n                const frame = player.embed.element;\n\n                // Fix keyboard focus issues\n                // https://github.com/sampotts/plyr/issues/317\n                frame.setAttribute('tabindex', -1);\n            }\n        });\n\n        player.embed.on('play', () => {\n            assurePlaybackState.call(player, true);\n            triggerEvent.call(player, player.media, 'playing');\n        });\n\n        player.embed.on('pause', () => {\n            assurePlaybackState.call(player, false);\n        });\n\n        player.embed.on('timeupdate', data => {\n            player.media.seeking = false;\n            currentTime = data.seconds;\n            triggerEvent.call(player, player.media, 'timeupdate');\n        });\n\n        player.embed.on('progress', data => {\n            player.media.buffered = data.percent;\n            triggerEvent.call(player, player.media, 'progress');\n\n            // Check all loaded\n            if (parseInt(data.percent, 10) === 1) {\n                triggerEvent.call(player, player.media, 'canplaythrough');\n            }\n\n            // Get duration as if we do it before load, it gives an incorrect value\n            // https://github.com/sampotts/plyr/issues/891\n            player.embed.getDuration().then(value => {\n                if (value !== player.media.duration) {\n                    player.media.duration = value;\n                    triggerEvent.call(player, player.media, 'durationchange');\n                }\n            });\n        });\n\n        player.embed.on('seeked', () => {\n            player.media.seeking = false;\n            triggerEvent.call(player, player.media, 'seeked');\n        });\n\n        player.embed.on('ended', () => {\n            player.media.paused = true;\n            triggerEvent.call(player, player.media, 'ended');\n        });\n\n        player.embed.on('error', detail => {\n            player.media.error = detail;\n            triggerEvent.call(player, player.media, 'error');\n        });\n\n        // Set height/width on fullscreen\n        player.on('enterfullscreen exitfullscreen', event => {\n            const { target } = player.fullscreen;\n\n            // Ignore for iOS native\n            if (target !== player.elements.container) {\n                return;\n            }\n\n            const toggle = event.type === 'enterfullscreen';\n            const [x, y] = vimeo.ratio.split(':').map(Number);\n            const dimension = x > y ? 'width' : 'height';\n\n            target.style[dimension] = toggle ? `${vimeo.padding}%` : null;\n        });\n\n        // Rebuild UI\n        setTimeout(() => ui.build.call(player), 0);\n    },\n};\n\nexport default vimeo;\n","// ==========================================================================\n// YouTube plugin\n// ==========================================================================\n\nimport ui from '../ui';\nimport { createElement, replaceElement, toggleClass } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport loadImage from '../utils/loadImage';\nimport loadScript from '../utils/loadScript';\nimport { format, generateId } from '../utils/strings';\n\n// Parse YouTube ID from URL\nfunction parseId(url) {\n    if (is.empty(url)) {\n        return null;\n    }\n\n    const regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n    return url.match(regex) ? RegExp.$2 : url;\n}\n\n// Set playback state and trigger change (only on actual change)\nfunction assurePlaybackState(play) {\n    if (play && !this.embed.hasPlayed) {\n        this.embed.hasPlayed = true;\n    }\n    if (this.media.paused === play) {\n        this.media.paused = !play;\n        triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n    }\n}\n\nconst youtube = {\n    setup() {\n        // Add embed class for responsive\n        toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n        // Set aspect ratio\n        youtube.setAspectRatio.call(this);\n\n        // Setup API\n        if (is.object(window.YT) && is.function(window.YT.Player)) {\n            youtube.ready.call(this);\n        } else {\n            // Load the API\n            loadScript(this.config.urls.youtube.sdk).catch(error => {\n                this.debug.warn('YouTube API failed to load', error);\n            });\n\n            // Setup callback for the API\n            // YouTube has it's own system of course...\n            window.onYouTubeReadyCallbacks = window.onYouTubeReadyCallbacks || [];\n\n            // Add to queue\n            window.onYouTubeReadyCallbacks.push(() => {\n                youtube.ready.call(this);\n            });\n\n            // Set callback to process queue\n            window.onYouTubeIframeAPIReady = () => {\n                window.onYouTubeReadyCallbacks.forEach(callback => {\n                    callback();\n                });\n            };\n        }\n    },\n\n    // Get the media title\n    getTitle(videoId) {\n        // Try via undocumented API method first\n        // This method disappears now and then though...\n        // https://github.com/sampotts/plyr/issues/709\n        if (is.function(this.embed.getVideoData)) {\n            const { title } = this.embed.getVideoData();\n\n            if (is.empty(title)) {\n                this.config.title = title;\n                ui.setTitle.call(this);\n                return;\n            }\n        }\n\n        // Or via Google API\n        const key = this.config.keys.google;\n        if (is.string(key) && !is.empty(key)) {\n            const url = format(this.config.urls.youtube.api, videoId, key);\n\n            fetch(url)\n                .then(result => {\n                    if (is.object(result)) {\n                        this.config.title = result.items[0].snippet.title;\n                        ui.setTitle.call(this);\n                    }\n                })\n                .catch(() => {});\n        }\n    },\n\n    // Set aspect ratio\n    setAspectRatio() {\n        const ratio = this.config.ratio.split(':');\n        this.elements.wrapper.style.paddingBottom = `${100 / ratio[0] * ratio[1]}%`;\n    },\n\n    // API ready\n    ready() {\n        const player = this;\n\n        // Ignore already setup (race condition)\n        const currentId = player.media.getAttribute('id');\n        if (!is.empty(currentId) && currentId.startsWith('youtube-')) {\n            return;\n        }\n\n        // Get the source URL or ID\n        let source = player.media.getAttribute('src');\n\n        // Get from <div> if needed\n        if (is.empty(source)) {\n            source = player.media.getAttribute(this.config.attributes.embed.id);\n        }\n\n        // Replace the <iframe> with a <div> due to YouTube API issues\n        const videoId = parseId(source);\n        const id = generateId(player.provider);\n\n        // Get poster, if already set\n        const { poster } = player;\n\n        // Replace media element\n        const container = createElement('div', { id, poster });\n        player.media = replaceElement(container, player.media);\n\n        // Id to poster wrapper\n        const posterSrc = format => `https://img.youtube.com/vi/${videoId}/${format}default.jpg`;\n\n        // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n        loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n            .catch(() => loadImage(posterSrc('sd'), 121)) // 480p padded 4:3\n            .catch(() => loadImage(posterSrc('hq'))) // 360p padded 4:3. Always exists\n            .then(image => ui.setPoster.call(player, image.src))\n            .then(posterSrc => {\n                // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n                if (!posterSrc.includes('maxres')) {\n                    player.elements.poster.style.backgroundSize = 'cover';\n                }\n            })\n            .catch(() => {});\n\n        // Setup instance\n        // https://developers.google.com/youtube/iframe_api_reference\n        player.embed = new window.YT.Player(id, {\n            videoId,\n            playerVars: {\n                autoplay: player.config.autoplay ? 1 : 0, // Autoplay\n                hl: player.config.hl, // iframe interface language\n                controls: player.supported.ui ? 0 : 1, // Only show controls if not fully supported\n                rel: 0, // No related vids\n                showinfo: 0, // Hide info\n                iv_load_policy: 3, // Hide annotations\n                modestbranding: 1, // Hide logos as much as possible (they still show one in the corner when paused)\n                disablekb: 1, // Disable keyboard as we handle it\n                playsinline: 1, // Allow iOS inline playback\n\n                // Tracking for stats\n                // origin: window ? `${window.location.protocol}//${window.location.host}` : null,\n                widget_referrer: window ? window.location.href : null,\n\n                // Captions are flaky on YouTube\n                cc_load_policy: player.captions.active ? 1 : 0,\n                cc_lang_pref: player.config.captions.language,\n            },\n            events: {\n                onError(event) {\n                    // YouTube may fire onError twice, so only handle it once\n                    if (!player.media.error) {\n                        const code = event.data;\n                        // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n                        const message =\n                            {\n                                2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',\n                                5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n                                100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',\n                                101: 'The owner of the requested video does not allow it to be played in embedded players.',\n                                150: 'The owner of the requested video does not allow it to be played in embedded players.',\n                            }[code] || 'An unknown error occured';\n\n                        player.media.error = { code, message };\n\n                        triggerEvent.call(player, player.media, 'error');\n                    }\n                },\n                onPlaybackRateChange(event) {\n                    // Get the instance\n                    const instance = event.target;\n\n                    // Get current speed\n                    player.media.playbackRate = instance.getPlaybackRate();\n\n                    triggerEvent.call(player, player.media, 'ratechange');\n                },\n                onReady(event) {\n                    // Bail if onReady has already been called. See issue #1108\n                    if (is.function(player.media.play)) {\n                        return;\n                    }\n                    // Get the instance\n                    const instance = event.target;\n\n                    // Get the title\n                    youtube.getTitle.call(player, videoId);\n\n                    // Create a faux HTML5 API using the YouTube API\n                    player.media.play = () => {\n                        assurePlaybackState.call(player, true);\n                        instance.playVideo();\n                    };\n\n                    player.media.pause = () => {\n                        assurePlaybackState.call(player, false);\n                        instance.pauseVideo();\n                    };\n\n                    player.media.stop = () => {\n                        instance.stopVideo();\n                    };\n\n                    player.media.duration = instance.getDuration();\n                    player.media.paused = true;\n\n                    // Seeking\n                    player.media.currentTime = 0;\n                    Object.defineProperty(player.media, 'currentTime', {\n                        get() {\n                            return Number(instance.getCurrentTime());\n                        },\n                        set(time) {\n                            // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n                            if (player.paused && !player.embed.hasPlayed) {\n                                player.embed.mute();\n                            }\n\n                            // Set seeking state and trigger event\n                            player.media.seeking = true;\n                            triggerEvent.call(player, player.media, 'seeking');\n\n                            // Seek after events sent\n                            instance.seekTo(time);\n                        },\n                    });\n\n                    // Playback speed\n                    Object.defineProperty(player.media, 'playbackRate', {\n                        get() {\n                            return instance.getPlaybackRate();\n                        },\n                        set(input) {\n                            instance.setPlaybackRate(input);\n                        },\n                    });\n\n                    // Volume\n                    let { volume } = player.config;\n                    Object.defineProperty(player.media, 'volume', {\n                        get() {\n                            return volume;\n                        },\n                        set(input) {\n                            volume = input;\n                            instance.setVolume(volume * 100);\n                            triggerEvent.call(player, player.media, 'volumechange');\n                        },\n                    });\n\n                    // Muted\n                    let { muted } = player.config;\n                    Object.defineProperty(player.media, 'muted', {\n                        get() {\n                            return muted;\n                        },\n                        set(input) {\n                            const toggle = is.boolean(input) ? input : muted;\n                            muted = toggle;\n                            instance[toggle ? 'mute' : 'unMute']();\n                            triggerEvent.call(player, player.media, 'volumechange');\n                        },\n                    });\n\n                    // Source\n                    Object.defineProperty(player.media, 'currentSrc', {\n                        get() {\n                            return instance.getVideoUrl();\n                        },\n                    });\n\n                    // Ended\n                    Object.defineProperty(player.media, 'ended', {\n                        get() {\n                            return player.currentTime === player.duration;\n                        },\n                    });\n\n                    // Get available speeds\n                    player.options.speed = instance.getAvailablePlaybackRates();\n\n                    // Set the tabindex to avoid focus entering iframe\n                    if (player.supported.ui) {\n                        player.media.setAttribute('tabindex', -1);\n                    }\n\n                    triggerEvent.call(player, player.media, 'timeupdate');\n                    triggerEvent.call(player, player.media, 'durationchange');\n\n                    // Reset timer\n                    clearInterval(player.timers.buffering);\n\n                    // Setup buffering\n                    player.timers.buffering = setInterval(() => {\n                        // Get loaded % from YouTube\n                        player.media.buffered = instance.getVideoLoadedFraction();\n\n                        // Trigger progress only when we actually buffer something\n                        if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n                            triggerEvent.call(player, player.media, 'progress');\n                        }\n\n                        // Set last buffer point\n                        player.media.lastBuffered = player.media.buffered;\n\n                        // Bail if we're at 100%\n                        if (player.media.buffered === 1) {\n                            clearInterval(player.timers.buffering);\n\n                            // Trigger event\n                            triggerEvent.call(player, player.media, 'canplaythrough');\n                        }\n                    }, 200);\n\n                    // Rebuild UI\n                    setTimeout(() => ui.build.call(player), 50);\n                },\n                onStateChange(event) {\n                    // Get the instance\n                    const instance = event.target;\n\n                    // Reset timer\n                    clearInterval(player.timers.playing);\n\n                    const seeked = player.media.seeking && [1, 2].includes(event.data);\n\n                    if (seeked) {\n                        // Unset seeking and fire seeked event\n                        player.media.seeking = false;\n                        triggerEvent.call(player, player.media, 'seeked');\n                    }\n\n                    // Handle events\n                    // -1   Unstarted\n                    // 0    Ended\n                    // 1    Playing\n                    // 2    Paused\n                    // 3    Buffering\n                    // 5    Video cued\n                    switch (event.data) {\n                        case -1:\n                            // Update scrubber\n                            triggerEvent.call(player, player.media, 'timeupdate');\n\n                            // Get loaded % from YouTube\n                            player.media.buffered = instance.getVideoLoadedFraction();\n                            triggerEvent.call(player, player.media, 'progress');\n\n                            break;\n\n                        case 0:\n                            assurePlaybackState.call(player, false);\n\n                            // YouTube doesn't support loop for a single video, so mimick it.\n                            if (player.media.loop) {\n                                // YouTube needs a call to `stopVideo` before playing again\n                                instance.stopVideo();\n                                instance.playVideo();\n                            } else {\n                                triggerEvent.call(player, player.media, 'ended');\n                            }\n\n                            break;\n\n                        case 1:\n                            // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n                            if (player.media.paused && !player.embed.hasPlayed) {\n                                player.media.pause();\n                            } else {\n                                assurePlaybackState.call(player, true);\n\n                                triggerEvent.call(player, player.media, 'playing');\n\n                                // Poll to get playback progress\n                                player.timers.playing = setInterval(() => {\n                                    triggerEvent.call(player, player.media, 'timeupdate');\n                                }, 50);\n\n                                // Check duration again due to YouTube bug\n                                // https://github.com/sampotts/plyr/issues/374\n                                // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n                                if (player.media.duration !== instance.getDuration()) {\n                                    player.media.duration = instance.getDuration();\n                                    triggerEvent.call(player, player.media, 'durationchange');\n                                }\n                            }\n\n                            break;\n\n                        case 2:\n                            // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n                            if (!player.muted) {\n                                player.embed.unMute();\n                            }\n                            assurePlaybackState.call(player, false);\n\n                            break;\n\n                        default:\n                            break;\n                    }\n\n                    triggerEvent.call(player, player.elements.container, 'statechange', false, {\n                        code: event.data,\n                    });\n                },\n            },\n        });\n    },\n};\n\nexport default youtube;\n","// ==========================================================================\n// Plyr Media\n// ==========================================================================\n\nimport html5 from './html5';\nimport vimeo from './plugins/vimeo';\nimport youtube from './plugins/youtube';\nimport { createElement, toggleClass, wrap } from './utils/elements';\n\nconst media = {\n    // Setup media\n    setup() {\n        // If there's no media, bail\n        if (!this.media) {\n            this.debug.warn('No media element found!');\n            return;\n        }\n\n        // Add type class\n        toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true);\n\n        // Add provider class\n        toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true);\n\n        // Add video class for embeds\n        // This will require changes if audio embeds are added\n        if (this.isEmbed) {\n            toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n        }\n\n        // Inject the player wrapper\n        if (this.isVideo) {\n            // Create the wrapper div\n            this.elements.wrapper = createElement('div', {\n                class: this.config.classNames.video,\n            });\n\n            // Wrap the video in a container\n            wrap(this.media, this.elements.wrapper);\n\n            // Faux poster container\n            this.elements.poster = createElement('div', {\n                class: this.config.classNames.poster,\n            });\n\n            this.elements.wrapper.appendChild(this.elements.poster);\n        }\n\n        if (this.isHTML5) {\n            html5.extend.call(this);\n        } else if (this.isYouTube) {\n            youtube.setup.call(this);\n        } else if (this.isVimeo) {\n            vimeo.setup.call(this);\n        }\n    },\n};\n\nexport default media;\n","// ==========================================================================\n// Advertisement plugin using Google IMA HTML5 SDK\n// Create an account with our ad partner, vi here:\n// https://www.vi.ai/publisher-video-monetization/\n// ==========================================================================\n\n/* global google */\n\nimport { createElement } from '../utils/elements';\nimport { triggerEvent } from '../utils/events';\nimport i18n from '../utils/i18n';\nimport is from '../utils/is';\nimport loadScript from '../utils/loadScript';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nclass Ads {\n    /**\n     * Ads constructor.\n     * @param {object} player\n     * @return {Ads}\n     */\n    constructor(player) {\n        this.player = player;\n        this.publisherId = player.config.ads.publisherId;\n        this.playing = false;\n        this.initialized = false;\n        this.elements = {\n            container: null,\n            displayContainer: null,\n        };\n        this.manager = null;\n        this.loader = null;\n        this.cuePoints = null;\n        this.events = {};\n        this.safetyTimer = null;\n        this.countdownTimer = null;\n\n        // Setup a promise to resolve when the IMA manager is ready\n        this.managerPromise = new Promise((resolve, reject) => {\n            // The ad is loaded and ready\n            this.on('loaded', resolve);\n\n            // Ads failed\n            this.on('error', reject);\n        });\n\n        this.load();\n    }\n\n    get enabled() {\n        return (\n            this.player.isHTML5 && this.player.isVideo && this.player.config.ads.enabled && !is.empty(this.publisherId)\n        );\n    }\n\n    /**\n     * Load the IMA SDK\n     */\n    load() {\n        if (this.enabled) {\n            // Check if the Google IMA3 SDK is loaded or load it ourselves\n            if (!is.object(window.google) || !is.object(window.google.ima)) {\n                loadScript(this.player.config.urls.googleIMA.sdk)\n                    .then(() => {\n                        this.ready();\n                    })\n                    .catch(() => {\n                        // Script failed to load or is blocked\n                        this.trigger('error', new Error('Google IMA SDK failed to load'));\n                    });\n            } else {\n                this.ready();\n            }\n        }\n    }\n\n    /**\n     * Get the ads instance ready\n     */\n    ready() {\n        // Start ticking our safety timer. If the whole advertisement\n        // thing doesn't resolve within our set time; we bail\n        this.startSafetyTimer(12000, 'ready()');\n\n        // Clear the safety timer\n        this.managerPromise.then(() => {\n            this.clearSafetyTimer('onAdsManagerLoaded()');\n        });\n\n        // Set listeners on the Plyr instance\n        this.listeners();\n\n        // Setup the IMA SDK\n        this.setupIMA();\n    }\n\n    // Build the default tag URL\n    get tagUrl() {\n        const params = {\n            AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n            AV_CHANNELID: '5a0458dc28a06145e4519d21',\n            AV_URL: window.location.hostname,\n            cb: Date.now(),\n            AV_WIDTH: 640,\n            AV_HEIGHT: 480,\n            AV_CDIM2: this.publisherId,\n        };\n\n        const base = 'https://go.aniview.com/api/adserver6/vast/';\n\n        return `${base}?${buildUrlParams(params)}`;\n    }\n\n    /**\n     * In order for the SDK to display ads for our video, we need to tell it where to put them,\n     * so here we define our ad container. This div is set up to render on top of the video player.\n     * Using the code below, we tell the SDK to render ads within that div. We also provide a\n     * handle to the content video player - the SDK will poll the current time of our player to\n     * properly place mid-rolls. After we create the ad display container, we initialize it. On\n     * mobile devices, this initialization is done as the result of a user action.\n     */\n    setupIMA() {\n        // Create the container for our advertisements\n        this.elements.container = createElement('div', {\n            class: this.player.config.classNames.ads,\n        });\n        this.player.elements.container.appendChild(this.elements.container);\n\n        // So we can run VPAID2\n        google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED);\n\n        // Set language\n        google.ima.settings.setLocale(this.player.config.ads.language);\n\n        // We assume the adContainer is the video container of the plyr element\n        // that will house the ads\n        this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container);\n\n        // Request video ads to be pre-loaded\n        this.requestAds();\n    }\n\n    /**\n     * Request advertisements\n     */\n    requestAds() {\n        const { container } = this.player.elements;\n\n        try {\n            // Create ads loader\n            this.loader = new google.ima.AdsLoader(this.elements.displayContainer);\n\n            // Listen and respond to ads loaded and error events\n            this.loader.addEventListener(\n                google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n                event => this.onAdsManagerLoaded(event),\n                false,\n            );\n            this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error), false);\n\n            // Request video ads\n            const request = new google.ima.AdsRequest();\n            request.adTagUrl = this.tagUrl;\n\n            // Specify the linear and nonlinear slot sizes. This helps the SDK\n            // to select the correct creative if multiple are returned\n            request.linearAdSlotWidth = container.offsetWidth;\n            request.linearAdSlotHeight = container.offsetHeight;\n            request.nonLinearAdSlotWidth = container.offsetWidth;\n            request.nonLinearAdSlotHeight = container.offsetHeight;\n\n            // We only overlay ads as we only support video.\n            request.forceNonLinearFullSlot = false;\n\n            // Mute based on current state\n            request.setAdWillPlayMuted(!this.player.muted);\n\n            this.loader.requestAds(request);\n        } catch (e) {\n            this.onAdError(e);\n        }\n    }\n\n    /**\n     * Update the ad countdown\n     * @param {boolean} start\n     */\n    pollCountdown(start = false) {\n        if (!start) {\n            clearInterval(this.countdownTimer);\n            this.elements.container.removeAttribute('data-badge-text');\n            return;\n        }\n\n        const update = () => {\n            const time = formatTime(Math.max(this.manager.getRemainingTime(), 0));\n            const label = `${i18n.get('advertisement', this.player.config)} - ${time}`;\n            this.elements.container.setAttribute('data-badge-text', label);\n        };\n\n        this.countdownTimer = setInterval(update, 100);\n    }\n\n    /**\n     * This method is called whenever the ads are ready inside the AdDisplayContainer\n     * @param {Event} adsManagerLoadedEvent\n     */\n    onAdsManagerLoaded(event) {\n        // Load could occur after a source change (race condition)\n        if (!this.enabled) {\n            return;\n        }\n\n        // Get the ads manager\n        const settings = new google.ima.AdsRenderingSettings();\n\n        // Tell the SDK to save and restore content video state on our behalf\n        settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n        settings.enablePreloading = true;\n\n        // The SDK is polling currentTime on the contentPlayback. And needs a duration\n        // so it can determine when to start the mid- and post-roll\n        this.manager = event.getAdsManager(this.player, settings);\n\n        // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n        this.cuePoints = this.manager.getCuePoints();\n\n        // Add advertisement cue's within the time line if available\n        if (!is.empty(this.cuePoints)) {\n            this.cuePoints.forEach(cuePoint => {\n                if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < this.player.duration) {\n                    const seekElement = this.player.elements.progress;\n\n                    if (is.element(seekElement)) {\n                        const cuePercentage = 100 / this.player.duration * cuePoint;\n                        const cue = createElement('span', {\n                            class: this.player.config.classNames.cues,\n                        });\n\n                        cue.style.left = `${cuePercentage.toString()}%`;\n                        seekElement.appendChild(cue);\n                    }\n                }\n            });\n        }\n\n        // Set volume to match player\n        this.manager.setVolume(this.player.volume);\n\n        // Add listeners to the required events\n        // Advertisement error events\n        this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, error => this.onAdError(error));\n\n        // Advertisement regular events\n        Object.keys(google.ima.AdEvent.Type).forEach(type => {\n            this.manager.addEventListener(google.ima.AdEvent.Type[type], event => this.onAdEvent(event));\n        });\n\n        // Resolve our adsManager\n        this.trigger('loaded');\n    }\n\n    /**\n     * This is where all the event handling takes place. Retrieve the ad from the event. Some\n     * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n     * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n     * @param {Event} event\n     */\n    onAdEvent(event) {\n        const { container } = this.player.elements;\n\n        // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n        // don't have ad object associated\n        const ad = event.getAd();\n\n        // Proxy event\n        const dispatchEvent = type => {\n            const event = `ads${type.replace(/_/g, '').toLowerCase()}`;\n            triggerEvent.call(this.player, this.player.media, event);\n        };\n\n        switch (event.type) {\n            case google.ima.AdEvent.Type.LOADED:\n                // This is the first event sent for an ad - it is possible to determine whether the\n                // ad is a video ad or an overlay\n                this.trigger('loaded');\n\n                // Bubble event\n                dispatchEvent(event.type);\n\n                // Start countdown\n                this.pollCountdown(true);\n\n                if (!ad.isLinear()) {\n                    // Position AdDisplayContainer correctly for overlay\n                    ad.width = container.offsetWidth;\n                    ad.height = container.offsetHeight;\n                }\n\n                // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n                // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n                break;\n\n            case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n                // All ads for the current videos are done. We can now request new advertisements\n                // in case the video is re-played\n\n                // Fire event\n                dispatchEvent(event.type);\n\n                // TODO: Example for what happens when a next video in a playlist would be loaded.\n                // So here we load a new video when all ads are done.\n                // Then we load new ads within a new adsManager. When the video\n                // Is started - after - the ads are loaded, then we get ads.\n                // You can also easily test cancelling and reloading by running\n                // player.ads.cancel() and player.ads.play from the console I guess.\n                // this.player.source = {\n                //     type: 'video',\n                //     title: 'View From A Blue Moon',\n                //     sources: [{\n                //         src:\n                // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n                // 'video/mp4', }], poster:\n                // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n                // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n                // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n                // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n                // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n                // };\n\n                // TODO: So there is still this thing where a video should only be allowed to start\n                // playing when the IMA SDK is ready or has failed\n\n                this.loadAds();\n                break;\n\n            case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n                // This event indicates the ad has started - the video player can adjust the UI,\n                // for example display a pause button and remaining time. Fired when content should\n                // be paused. This usually happens right before an ad is about to cover the content\n\n                dispatchEvent(event.type);\n\n                this.pauseContent();\n\n                break;\n\n            case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n                // This event indicates the ad has finished - the video player can perform\n                // appropriate UI actions, such as removing the timer for remaining time detection.\n                // Fired when content should be resumed. This usually happens when an ad finishes\n                // or collapses\n\n                dispatchEvent(event.type);\n\n                this.pollCountdown();\n\n                this.resumeContent();\n\n                break;\n\n            case google.ima.AdEvent.Type.STARTED:\n            case google.ima.AdEvent.Type.MIDPOINT:\n            case google.ima.AdEvent.Type.COMPLETE:\n            case google.ima.AdEvent.Type.IMPRESSION:\n            case google.ima.AdEvent.Type.CLICK:\n                dispatchEvent(event.type);\n                break;\n\n            default:\n                break;\n        }\n    }\n\n    /**\n     * Any ad error handling comes through here\n     * @param {Event} event\n     */\n    onAdError(event) {\n        this.cancel();\n        this.player.debug.warn('Ads error', event);\n    }\n\n    /**\n     * Setup hooks for Plyr and window events. This ensures\n     * the mid- and post-roll launch at the correct time. And\n     * resize the advertisement when the player resizes\n     */\n    listeners() {\n        const { container } = this.player.elements;\n        let time;\n\n        // Add listeners to the required events\n        this.player.on('ended', () => {\n            this.loader.contentComplete();\n        });\n\n        this.player.on('seeking', () => {\n            time = this.player.currentTime;\n            return time;\n        });\n\n        this.player.on('seeked', () => {\n            const seekedTime = this.player.currentTime;\n\n            if (is.empty(this.cuePoints)) {\n                return;\n            }\n\n            this.cuePoints.forEach((cuePoint, index) => {\n                if (time < cuePoint && cuePoint < seekedTime) {\n                    this.manager.discardAdBreak();\n                    this.cuePoints.splice(index, 1);\n                }\n            });\n        });\n\n        // Listen to the resizing of the window. And resize ad accordingly\n        // TODO: eventually implement ResizeObserver\n        window.addEventListener('resize', () => {\n            if (this.manager) {\n                this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n            }\n        });\n    }\n\n    /**\n     * Initialize the adsManager and start playing advertisements\n     */\n    play() {\n        const { container } = this.player.elements;\n\n        if (!this.managerPromise) {\n            this.resumeContent();\n        }\n\n        // Play the requested advertisement whenever the adsManager is ready\n        this.managerPromise\n            .then(() => {\n                // Initialize the container. Must be done via a user action on mobile devices\n                this.elements.displayContainer.initialize();\n\n                try {\n                    if (!this.initialized) {\n                        // Initialize the ads manager. Ad rules playlist will start at this time\n                        this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\n                        // Call play to start showing the ad. Single video and overlay ads will\n                        // start at this time; the call will be ignored for ad rules\n                        this.manager.start();\n                    }\n\n                    this.initialized = true;\n                } catch (adError) {\n                    // An error may be thrown if there was a problem with the\n                    // VAST response\n                    this.onAdError(adError);\n                }\n            })\n            .catch(() => {});\n    }\n\n    /**\n     * Resume our video\n     */\n    resumeContent() {\n        // Hide the advertisement container\n        this.elements.container.style.zIndex = '';\n\n        // Ad is stopped\n        this.playing = false;\n\n        // Play our video\n        if (this.player.currentTime < this.player.duration) {\n            this.player.play();\n        }\n    }\n\n    /**\n     * Pause our video\n     */\n    pauseContent() {\n        // Show the advertisement container\n        this.elements.container.style.zIndex = 3;\n\n        // Ad is playing.\n        this.playing = true;\n\n        // Pause our video.\n        this.player.pause();\n    }\n\n    /**\n     * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n     * allowed to call new ads based on google policies, as they interpret this as an accidental\n     * video requests. https://developers.google.com/interactive-\n     * media-ads/docs/sdks/android/faq#8\n     */\n    cancel() {\n        // Pause our video\n        if (this.initialized) {\n            this.resumeContent();\n        }\n\n        // Tell our instance that we're done for now\n        this.trigger('error');\n\n        // Re-create our adsManager\n        this.loadAds();\n    }\n\n    /**\n     * Re-create our adsManager\n     */\n    loadAds() {\n        // Tell our adsManager to go bye bye\n        this.managerPromise\n            .then(() => {\n                // Destroy our adsManager\n                if (this.manager) {\n                    this.manager.destroy();\n                }\n\n                // Re-set our adsManager promises\n                this.managerPromise = new Promise(resolve => {\n                    this.on('loaded', resolve);\n                    this.player.debug.log(this.manager);\n                });\n\n                // Now request some new advertisements\n                this.requestAds();\n            })\n            .catch(() => {});\n    }\n\n    /**\n     * Handles callbacks after an ad event was invoked\n     * @param {string} event - Event type\n     */\n    trigger(event, ...args) {\n        const handlers = this.events[event];\n\n        if (is.array(handlers)) {\n            handlers.forEach(handler => {\n                if (is.function(handler)) {\n                    handler.apply(this, args);\n                }\n            });\n        }\n    }\n\n    /**\n     * Add event listeners\n     * @param {string} event - Event type\n     * @param {function} callback - Callback for when event occurs\n     * @return {Ads}\n     */\n    on(event, callback) {\n        if (!is.array(this.events[event])) {\n            this.events[event] = [];\n        }\n\n        this.events[event].push(callback);\n\n        return this;\n    }\n\n    /**\n     * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n     * The advertisement has 12 seconds to get its things together. We stop this timer when the\n     * advertisement is playing, or when a user action is required to start, then we clear the\n     * timer on ad ready\n     * @param {number} time\n     * @param {string} from\n     */\n    startSafetyTimer(time, from) {\n        this.player.debug.log(`Safety timer invoked from: ${from}`);\n\n        this.safetyTimer = setTimeout(() => {\n            this.cancel();\n            this.clearSafetyTimer('startSafetyTimer()');\n        }, time);\n    }\n\n    /**\n     * Clear our safety timer(s)\n     * @param {string} from\n     */\n    clearSafetyTimer(from) {\n        if (!is.nullOrUndefined(this.safetyTimer)) {\n            this.player.debug.log(`Safety timer cleared from: ${from}`);\n\n            clearTimeout(this.safetyTimer);\n            this.safetyTimer = null;\n        }\n    }\n}\n\nexport default Ads;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport support from './support';\nimport ui from './ui';\nimport { createElement, insertElement, removeElement } from './utils/elements';\nimport is from './utils/is';\nimport { getDeep } from './utils/objects';\n\nconst source = {\n    // Add elements to HTML5 media (source, tracks, etc)\n    insertElements(type, attributes) {\n        if (is.string(attributes)) {\n            insertElement(type, this.media, {\n                src: attributes,\n            });\n        } else if (is.array(attributes)) {\n            attributes.forEach(attribute => {\n                insertElement(type, this.media, attribute);\n            });\n        }\n    },\n\n    // Update source\n    // Sources are not checked for support so be careful\n    change(input) {\n        if (!getDeep(input, 'sources.length')) {\n            this.debug.warn('Invalid source format');\n            return;\n        }\n\n        // Cancel current network requests\n        html5.cancelRequests.call(this);\n\n        // Destroy instance and re-setup\n        this.destroy.call(\n            this,\n            () => {\n                // Reset quality options\n                this.options.quality = [];\n\n                // Remove elements\n                removeElement(this.media);\n                this.media = null;\n\n                // Reset class name\n                if (is.element(this.elements.container)) {\n                    this.elements.container.removeAttribute('class');\n                }\n\n                // Set the type and provider\n                const { sources, type } = input;\n                const [{ provider = providers.html5, src }] = sources;\n                const tagName = provider === 'html5' ? type : 'div';\n                const attributes = provider === 'html5' ? {} : { src };\n\n                Object.assign(this, {\n                    provider,\n                    type,\n                    // Check for support\n                    supported: support.check(type, provider, this.config.playsinline),\n                    // Create new element\n                    media: createElement(tagName, attributes),\n                });\n\n                // Inject the new element\n                this.elements.container.appendChild(this.media);\n\n                // Autoplay the new source?\n                if (is.boolean(input.autoplay)) {\n                    this.config.autoplay = input.autoplay;\n                }\n\n                // Set attributes for audio and video\n                if (this.isHTML5) {\n                    if (this.config.crossorigin) {\n                        this.media.setAttribute('crossorigin', '');\n                    }\n                    if (this.config.autoplay) {\n                        this.media.setAttribute('autoplay', '');\n                    }\n                    if (!is.empty(input.poster)) {\n                        this.poster = input.poster;\n                    }\n                    if (this.config.loop.active) {\n                        this.media.setAttribute('loop', '');\n                    }\n                    if (this.config.muted) {\n                        this.media.setAttribute('muted', '');\n                    }\n                    if (this.config.playsinline) {\n                        this.media.setAttribute('playsinline', '');\n                    }\n                }\n\n                // Restore class hook\n                ui.addStyleHook.call(this);\n\n                // Set new sources for html5\n                if (this.isHTML5) {\n                    source.insertElements.call(this, 'source', sources);\n                }\n\n                // Set video title\n                this.config.title = input.title;\n\n                // Set up from scratch\n                media.setup.call(this);\n\n                // HTML5 stuff\n                if (this.isHTML5) {\n                    // Setup captions\n                    if (Object.keys(input).includes('tracks')) {\n                        source.insertElements.call(this, 'track', input.tracks);\n                    }\n                }\n\n                // If HTML5 or embed but not fully supported, setupInterface and call ready now\n                if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n                    // Setup interface\n                    ui.build.call(this);\n                }\n\n                if (this.isHTML5) {\n                    // Load HTML5 sources\n                    this.media.load();\n                }\n\n                // Update the fullscreen support\n                this.fullscreen.update();\n            },\n            true,\n        );\n    },\n};\n\nexport default source;\n","// ==========================================================================\n// Plyr\n// plyr.js v3.4.8\n// https://github.com/sampotts/plyr\n// License: The MIT License (MIT)\n// ==========================================================================\n\nimport captions from './captions';\nimport defaults from './config/defaults';\nimport { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport source from './source';\nimport Storage from './storage';\nimport support from './support';\nimport ui from './ui';\nimport { closest } from './utils/arrays';\nimport { createElement, hasClass, removeElement, replaceElement, toggleClass, wrap } from './utils/elements';\nimport { off, on, once, triggerEvent, unbindListeners } from './utils/events';\nimport is from './utils/is';\nimport loadSprite from './utils/loadSprite';\nimport { cloneDeep, extend } from './utils/objects';\nimport { parseUrl } from './utils/urls';\n\n// Private properties\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n\n// Plyr instance\nclass Plyr {\n    constructor(target, options) {\n        this.timers = {};\n\n        // State\n        this.ready = false;\n        this.loading = false;\n        this.failed = false;\n\n        // Touch device\n        this.touch = support.touch;\n\n        // Set the media element\n        this.media = target;\n\n        // String selector passed\n        if (is.string(this.media)) {\n            this.media = document.querySelectorAll(this.media);\n        }\n\n        // jQuery, NodeList or Array passed, use first element\n        if ((window.jQuery && this.media instanceof jQuery) || is.nodeList(this.media) || is.array(this.media)) {\n            // eslint-disable-next-line\n            this.media = this.media[0];\n        }\n\n        // Set config\n        this.config = extend(\n            {},\n            defaults,\n            Plyr.defaults,\n            options || {},\n            (() => {\n                try {\n                    return JSON.parse(this.media.getAttribute('data-plyr-config'));\n                } catch (e) {\n                    return {};\n                }\n            })(),\n        );\n\n        // Elements cache\n        this.elements = {\n            container: null,\n            captions: null,\n            buttons: {},\n            display: {},\n            progress: {},\n            inputs: {},\n            settings: {\n                popup: null,\n                menu: null,\n                panels: {},\n                buttons: {},\n            },\n        };\n\n        // Captions\n        this.captions = {\n            active: null,\n            currentTrack: -1,\n            meta: new WeakMap(),\n        };\n\n        // Fullscreen\n        this.fullscreen = {\n            active: false,\n        };\n\n        // Options\n        this.options = {\n            speed: [],\n            quality: [],\n        };\n\n        // Debugging\n        // TODO: move to globals\n        this.debug = new Console(this.config.debug);\n\n        // Log config options and support\n        this.debug.log('Config', this.config);\n        this.debug.log('Support', support);\n\n        // We need an element to setup\n        if (is.nullOrUndefined(this.media) || !is.element(this.media)) {\n            this.debug.error('Setup failed: no suitable element passed');\n            return;\n        }\n\n        // Bail if the element is initialized\n        if (this.media.plyr) {\n            this.debug.warn('Target already setup');\n            return;\n        }\n\n        // Bail if not enabled\n        if (!this.config.enabled) {\n            this.debug.error('Setup failed: disabled by config');\n            return;\n        }\n\n        // Bail if disabled or no basic support\n        // You may want to disable certain UAs etc\n        if (!support.check().api) {\n            this.debug.error('Setup failed: no support');\n            return;\n        }\n\n        // Cache original element state for .destroy()\n        const clone = this.media.cloneNode(true);\n        clone.autoplay = false;\n        this.elements.original = clone;\n\n        // Set media type based on tag or data attribute\n        // Supported: video, audio, vimeo, youtube\n        const type = this.media.tagName.toLowerCase();\n\n        // Embed properties\n        let iframe = null;\n        let url = null;\n\n        // Different setup based on type\n        switch (type) {\n            case 'div':\n                // Find the frame\n                iframe = this.media.querySelector('iframe');\n\n                // <iframe> type\n                if (is.element(iframe)) {\n                    // Detect provider\n                    url = parseUrl(iframe.getAttribute('src'));\n                    this.provider = getProviderByUrl(url.toString());\n\n                    // Rework elements\n                    this.elements.container = this.media;\n                    this.media = iframe;\n\n                    // Reset classname\n                    this.elements.container.className = '';\n\n                    // Get attributes from URL and set config\n                    if (url.search.length) {\n                        const truthy = ['1', 'true'];\n\n                        if (truthy.includes(url.searchParams.get('autoplay'))) {\n                            this.config.autoplay = true;\n                        }\n                        if (truthy.includes(url.searchParams.get('loop'))) {\n                            this.config.loop.active = true;\n                        }\n\n                        // TODO: replace fullscreen.iosNative with this playsinline config option\n                        // YouTube requires the playsinline in the URL\n                        if (this.isYouTube) {\n                            this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n                            this.config.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n                        } else {\n                            this.config.playsinline = true;\n                        }\n                    }\n                } else {\n                    // <div> with attributes\n                    this.provider = this.media.getAttribute(this.config.attributes.embed.provider);\n\n                    // Remove attribute\n                    this.media.removeAttribute(this.config.attributes.embed.provider);\n                }\n\n                // Unsupported or missing provider\n                if (is.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n                    this.debug.error('Setup failed: Invalid provider');\n                    return;\n                }\n\n                // Audio will come later for external providers\n                this.type = types.video;\n\n                break;\n\n            case 'video':\n            case 'audio':\n                this.type = type;\n                this.provider = providers.html5;\n\n                // Get config from attributes\n                if (this.media.hasAttribute('crossorigin')) {\n                    this.config.crossorigin = true;\n                }\n                if (this.media.hasAttribute('autoplay')) {\n                    this.config.autoplay = true;\n                }\n                if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n                    this.config.playsinline = true;\n                }\n                if (this.media.hasAttribute('muted')) {\n                    this.config.muted = true;\n                }\n                if (this.media.hasAttribute('loop')) {\n                    this.config.loop.active = true;\n                }\n\n                break;\n\n            default:\n                this.debug.error('Setup failed: unsupported type');\n                return;\n        }\n\n        // Check for support again but with type\n        this.supported = support.check(this.type, this.provider, this.config.playsinline);\n\n        // If no support for even API, bail\n        if (!this.supported.api) {\n            this.debug.error('Setup failed: no support');\n            return;\n        }\n\n        this.eventListeners = [];\n\n        // Create listeners\n        this.listeners = new Listeners(this);\n\n        // Setup local storage for user settings\n        this.storage = new Storage(this);\n\n        // Store reference\n        this.media.plyr = this;\n\n        // Wrap media\n        if (!is.element(this.elements.container)) {\n            this.elements.container = createElement('div');\n            wrap(this.media, this.elements.container);\n        }\n\n        // Add style hook\n        ui.addStyleHook.call(this);\n\n        // Setup media\n        media.setup.call(this);\n\n        // Listen for events if debugging\n        if (this.config.debug) {\n            on.call(this, this.elements.container, this.config.events.join(' '), event => {\n                this.debug.log(`event: ${event.type}`);\n            });\n        }\n\n        // Setup interface\n        // If embed but not fully supported, build interface now to avoid flash of controls\n        if (this.isHTML5 || (this.isEmbed && !this.supported.ui)) {\n            ui.build.call(this);\n        }\n\n        // Container listeners\n        this.listeners.container();\n\n        // Global listeners\n        this.listeners.global();\n\n        // Setup fullscreen\n        this.fullscreen = new Fullscreen(this);\n\n        // Setup ads if provided\n        if (this.config.ads.enabled) {\n            this.ads = new Ads(this);\n        }\n\n        // Autoplay if required\n        if (this.config.autoplay) {\n            this.play();\n        }\n\n        // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n        this.lastSeekTime = 0;\n    }\n\n    // ---------------------------------------\n    // API\n    // ---------------------------------------\n\n    /**\n     * Types and provider helpers\n     */\n    get isHTML5() {\n        return Boolean(this.provider === providers.html5);\n    }\n\n    get isEmbed() {\n        return Boolean(this.isYouTube || this.isVimeo);\n    }\n\n    get isYouTube() {\n        return Boolean(this.provider === providers.youtube);\n    }\n\n    get isVimeo() {\n        return Boolean(this.provider === providers.vimeo);\n    }\n\n    get isVideo() {\n        return Boolean(this.type === types.video);\n    }\n\n    get isAudio() {\n        return Boolean(this.type === types.audio);\n    }\n\n    /**\n     * Play the media, or play the advertisement (if they are not blocked)\n     */\n    play() {\n        if (!is.function(this.media.play)) {\n            return null;\n        }\n\n        // Return the promise (for HTML5)\n        return this.media.play();\n    }\n\n    /**\n     * Pause the media\n     */\n    pause() {\n        if (!this.playing || !is.function(this.media.pause)) {\n            return;\n        }\n\n        this.media.pause();\n    }\n\n    /**\n     * Get playing state\n     */\n    get playing() {\n        return Boolean(this.ready && !this.paused && !this.ended);\n    }\n\n    /**\n     * Get paused state\n     */\n    get paused() {\n        return Boolean(this.media.paused);\n    }\n\n    /**\n     * Get stopped state\n     */\n    get stopped() {\n        return Boolean(this.paused && this.currentTime === 0);\n    }\n\n    /**\n     * Get ended state\n     */\n    get ended() {\n        return Boolean(this.media.ended);\n    }\n\n    /**\n     * Toggle playback based on current status\n     * @param {boolean} input\n     */\n    togglePlay(input) {\n        // Toggle based on current state if nothing passed\n        const toggle = is.boolean(input) ? input : !this.playing;\n\n        if (toggle) {\n            this.play();\n        } else {\n            this.pause();\n        }\n    }\n\n    /**\n     * Stop playback\n     */\n    stop() {\n        if (this.isHTML5) {\n            this.pause();\n            this.restart();\n        } else if (is.function(this.media.stop)) {\n            this.media.stop();\n        }\n    }\n\n    /**\n     * Restart playback\n     */\n    restart() {\n        this.currentTime = 0;\n    }\n\n    /**\n     * Rewind\n     * @param {number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n     */\n    rewind(seekTime) {\n        this.currentTime = this.currentTime - (is.number(seekTime) ? seekTime : this.config.seekTime);\n    }\n\n    /**\n     * Fast forward\n     * @param {number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n     */\n    forward(seekTime) {\n        this.currentTime = this.currentTime + (is.number(seekTime) ? seekTime : this.config.seekTime);\n    }\n\n    /**\n     * Seek to a time\n     * @param {number} input - where to seek to in seconds. Defaults to 0 (the start)\n     */\n    set currentTime(input) {\n        // Bail if media duration isn't available yet\n        if (!this.duration) {\n            return;\n        }\n\n        // Validate input\n        const inputIsValid = is.number(input) && input > 0;\n\n        // Set\n        this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0;\n\n        // Logging\n        this.debug.log(`Seeking to ${this.currentTime} seconds`);\n    }\n\n    /**\n     * Get current time\n     */\n    get currentTime() {\n        return Number(this.media.currentTime);\n    }\n\n    /**\n     * Get buffered\n     */\n    get buffered() {\n        const { buffered } = this.media;\n\n        // YouTube / Vimeo return a float between 0-1\n        if (is.number(buffered)) {\n            return buffered;\n        }\n\n        // HTML5\n        // TODO: Handle buffered chunks of the media\n        // (i.e. seek to another section buffers only that section)\n        if (buffered && buffered.length && this.duration > 0) {\n            return buffered.end(0) / this.duration;\n        }\n\n        return 0;\n    }\n\n    /**\n     * Get seeking status\n     */\n    get seeking() {\n        return Boolean(this.media.seeking);\n    }\n\n    /**\n     * Get the duration of the current media\n     */\n    get duration() {\n        // Faux duration set via config\n        const fauxDuration = parseFloat(this.config.duration);\n\n        // Media duration can be NaN or Infinity before the media has loaded\n        const realDuration = (this.media || {}).duration;\n        const duration = !is.number(realDuration) || realDuration === Infinity ? 0 : realDuration;\n\n        // If config duration is funky, use regular duration\n        return fauxDuration || duration;\n    }\n\n    /**\n     * Set the player volume\n     * @param {number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage\n     */\n    set volume(value) {\n        let volume = value;\n        const max = 1;\n        const min = 0;\n\n        if (is.string(volume)) {\n            volume = Number(volume);\n        }\n\n        // Load volume from storage if no value specified\n        if (!is.number(volume)) {\n            volume = this.storage.get('volume');\n        }\n\n        // Use config if all else fails\n        if (!is.number(volume)) {\n            ({ volume } = this.config);\n        }\n\n        // Maximum is volumeMax\n        if (volume > max) {\n            volume = max;\n        }\n        // Minimum is volumeMin\n        if (volume < min) {\n            volume = min;\n        }\n\n        // Update config\n        this.config.volume = volume;\n\n        // Set the player volume\n        this.media.volume = volume;\n\n        // If muted, and we're increasing volume manually, reset muted state\n        if (!is.empty(value) && this.muted && volume > 0) {\n            this.muted = false;\n        }\n    }\n\n    /**\n     * Get the current player volume\n     */\n    get volume() {\n        return Number(this.media.volume);\n    }\n\n    /**\n     * Increase volume\n     * @param {boolean} step - How much to decrease by (between 0 and 1)\n     */\n    increaseVolume(step) {\n        const volume = this.media.muted ? 0 : this.volume;\n        this.volume = volume + (is.number(step) ? step : 0);\n    }\n\n    /**\n     * Decrease volume\n     * @param {boolean} step - How much to decrease by (between 0 and 1)\n     */\n    decreaseVolume(step) {\n        this.increaseVolume(-step);\n    }\n\n    /**\n     * Set muted state\n     * @param {boolean} mute\n     */\n    set muted(mute) {\n        let toggle = mute;\n\n        // Load muted state from storage\n        if (!is.boolean(toggle)) {\n            toggle = this.storage.get('muted');\n        }\n\n        // Use config if all else fails\n        if (!is.boolean(toggle)) {\n            toggle = this.config.muted;\n        }\n\n        // Update config\n        this.config.muted = toggle;\n\n        // Set mute on the player\n        this.media.muted = toggle;\n    }\n\n    /**\n     * Get current muted state\n     */\n    get muted() {\n        return Boolean(this.media.muted);\n    }\n\n    /**\n     * Check if the media has audio\n     */\n    get hasAudio() {\n        // Assume yes for all non HTML5 (as we can't tell...)\n        if (!this.isHTML5) {\n            return true;\n        }\n\n        if (this.isAudio) {\n            return true;\n        }\n\n        // Get audio tracks\n        return (\n            Boolean(this.media.mozHasAudio) ||\n            Boolean(this.media.webkitAudioDecodedByteCount) ||\n            Boolean(this.media.audioTracks && this.media.audioTracks.length)\n        );\n    }\n\n    /**\n     * Set playback speed\n     * @param {number} speed - the speed of playback (0.5-2.0)\n     */\n    set speed(input) {\n        let speed = null;\n\n        if (is.number(input)) {\n            speed = input;\n        }\n\n        if (!is.number(speed)) {\n            speed = this.storage.get('speed');\n        }\n\n        if (!is.number(speed)) {\n            speed = this.config.speed.selected;\n        }\n\n        // Set min/max\n        if (speed < 0.1) {\n            speed = 0.1;\n        }\n        if (speed > 2.0) {\n            speed = 2.0;\n        }\n\n        if (!this.config.speed.options.includes(speed)) {\n            this.debug.warn(`Unsupported speed (${speed})`);\n            return;\n        }\n\n        // Update config\n        this.config.speed.selected = speed;\n\n        // Set media speed\n        this.media.playbackRate = speed;\n    }\n\n    /**\n     * Get current playback speed\n     */\n    get speed() {\n        return Number(this.media.playbackRate);\n    }\n\n    /**\n     * Set playback quality\n     * Currently HTML5 & YouTube only\n     * @param {number} input - Quality level\n     */\n    set quality(input) {\n        const config = this.config.quality;\n        const options = this.options.quality;\n\n        if (!options.length) {\n            return;\n        }\n\n        let quality = [\n            !is.empty(input) && Number(input),\n            this.storage.get('quality'),\n            config.selected,\n            config.default,\n        ].find(is.number);\n\n        let updateStorage = true;\n\n        if (!options.includes(quality)) {\n            const value = closest(options, quality);\n            this.debug.warn(`Unsupported quality option: ${quality}, using ${value} instead`);\n            quality = value;\n\n            // Don't update storage if quality is not supported\n            updateStorage = false;\n        }\n\n        // Update config\n        config.selected = quality;\n\n        // Set quality\n        this.media.quality = quality;\n\n        // Save to storage\n        if (updateStorage) {\n            this.storage.set({ quality });\n        }\n    }\n\n    /**\n     * Get current quality level\n     */\n    get quality() {\n        return this.media.quality;\n    }\n\n    /**\n     * Toggle loop\n     * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n     * @param {boolean} input - Whether to loop or not\n     */\n    set loop(input) {\n        const toggle = is.boolean(input) ? input : this.config.loop.active;\n        this.config.loop.active = toggle;\n        this.media.loop = toggle;\n\n        // Set default to be a true toggle\n        /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\n        switch (type) {\n            case 'start':\n                if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n                    this.config.loop.end = null;\n                }\n                this.config.loop.start = this.currentTime;\n                // this.config.loop.indicator.start = this.elements.display.played.value;\n                break;\n\n            case 'end':\n                if (this.config.loop.start >= this.currentTime) {\n                    return this;\n                }\n                this.config.loop.end = this.currentTime;\n                // this.config.loop.indicator.end = this.elements.display.played.value;\n                break;\n\n            case 'all':\n                this.config.loop.start = 0;\n                this.config.loop.end = this.duration - 2;\n                this.config.loop.indicator.start = 0;\n                this.config.loop.indicator.end = 100;\n                break;\n\n            case 'toggle':\n                if (this.config.loop.active) {\n                    this.config.loop.start = 0;\n                    this.config.loop.end = null;\n                } else {\n                    this.config.loop.start = 0;\n                    this.config.loop.end = this.duration - 2;\n                }\n                break;\n\n            default:\n                this.config.loop.start = 0;\n                this.config.loop.end = null;\n                break;\n        } */\n    }\n\n    /**\n     * Get current loop state\n     */\n    get loop() {\n        return Boolean(this.media.loop);\n    }\n\n    /**\n     * Set new media source\n     * @param {object} input - The new source object (see docs)\n     */\n    set source(input) {\n        source.change.call(this, input);\n    }\n\n    /**\n     * Get current source\n     */\n    get source() {\n        return this.media.currentSrc;\n    }\n\n    /**\n     * Get a download URL (either source or custom)\n     */\n    get download() {\n        const { download } = this.config.urls;\n\n        return is.url(download) ? download : this.source;\n    }\n\n    /**\n     * Set the poster image for a video\n     * @param {input} - the URL for the new poster image\n     */\n    set poster(input) {\n        if (!this.isVideo) {\n            this.debug.warn('Poster can only be set for video');\n            return;\n        }\n\n        ui.setPoster.call(this, input, false).catch(() => {});\n    }\n\n    /**\n     * Get the current poster image\n     */\n    get poster() {\n        if (!this.isVideo) {\n            return null;\n        }\n\n        return this.media.getAttribute('poster');\n    }\n\n    /**\n     * Set the autoplay state\n     * @param {boolean} input - Whether to autoplay or not\n     */\n    set autoplay(input) {\n        const toggle = is.boolean(input) ? input : this.config.autoplay;\n        this.config.autoplay = toggle;\n    }\n\n    /**\n     * Get the current autoplay state\n     */\n    get autoplay() {\n        return Boolean(this.config.autoplay);\n    }\n\n    /**\n     * Toggle captions\n     * @param {boolean} input - Whether to enable captions\n     */\n    toggleCaptions(input) {\n        captions.toggle.call(this, input, false);\n    }\n\n    /**\n     * Set the caption track by index\n     * @param {number} - Caption index\n     */\n    set currentTrack(input) {\n        captions.set.call(this, input, false);\n    }\n\n    /**\n     * Get the current caption track index (-1 if disabled)\n     */\n    get currentTrack() {\n        const { toggled, currentTrack } = this.captions;\n        return toggled ? currentTrack : -1;\n    }\n\n    /**\n     * Set the wanted language for captions\n     * Since tracks can be added later it won't update the actual caption track until there is a matching track\n     * @param {string} - Two character ISO language code (e.g. EN, FR, PT, etc)\n     */\n    set language(input) {\n        captions.setLanguage.call(this, input, false);\n    }\n\n    /**\n     * Get the current track's language\n     */\n    get language() {\n        return (captions.getCurrentTrack.call(this) || {}).language;\n    }\n\n    /**\n     * Toggle picture-in-picture playback on WebKit/MacOS\n     * TODO: update player with state, support, enabled\n     * TODO: detect outside changes\n     */\n    set pip(input) {\n        // Bail if no support\n        if (!support.pip) {\n            return;\n        }\n\n        // Toggle based on current state if not passed\n        const toggle = is.boolean(input) ? input : !this.pip;\n\n        // Toggle based on current state\n        // Safari\n        if (is.function(this.media.webkitSetPresentationMode)) {\n            this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n        }\n\n        // Chrome\n        if (is.function(this.media.requestPictureInPicture)) {\n            if (!this.pip && toggle) {\n                this.media.requestPictureInPicture();\n            } else if (this.pip && !toggle) {\n                document.exitPictureInPicture();\n            }\n        }\n    }\n\n    /**\n     * Get the current picture-in-picture state\n     */\n    get pip() {\n        if (!support.pip) {\n            return null;\n        }\n\n        // Safari\n        if (!is.empty(this.media.webkitPresentationMode)) {\n            return this.media.webkitPresentationMode === pip.active;\n        }\n\n        // Chrome\n        return this.media === document.pictureInPictureElement;\n    }\n\n    /**\n     * Trigger the airplay dialog\n     * TODO: update player with state, support, enabled\n     */\n    airplay() {\n        // Show dialog if supported\n        if (support.airplay) {\n            this.media.webkitShowPlaybackTargetPicker();\n        }\n    }\n\n    /**\n     * Toggle the player controls\n     * @param {boolean} [toggle] - Whether to show the controls\n     */\n    toggleControls(toggle) {\n        // Don't toggle if missing UI support or if it's audio\n        if (this.supported.ui && !this.isAudio) {\n            // Get state before change\n            const isHidden = hasClass(this.elements.container, this.config.classNames.hideControls);\n\n            // Negate the argument if not undefined since adding the class to hides the controls\n            const force = typeof toggle === 'undefined' ? undefined : !toggle;\n\n            // Apply and get updated state\n            const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n            // Close menu\n            if (hiding && this.config.controls.includes('settings') && !is.empty(this.config.settings)) {\n                controls.toggleMenu.call(this, false);\n            }\n\n            // Trigger event on change\n            if (hiding !== isHidden) {\n                const eventName = hiding ? 'controlshidden' : 'controlsshown';\n                triggerEvent.call(this, this.media, eventName);\n            }\n\n            return !hiding;\n        }\n\n        return false;\n    }\n\n    /**\n     * Add event listeners\n     * @param {string} event - Event type\n     * @param {function} callback - Callback for when event occurs\n     */\n    on(event, callback) {\n        on.call(this, this.elements.container, event, callback);\n    }\n\n    /**\n     * Add event listeners once\n     * @param {string} event - Event type\n     * @param {function} callback - Callback for when event occurs\n     */\n    once(event, callback) {\n        once.call(this, this.elements.container, event, callback);\n    }\n\n    /**\n     * Remove event listeners\n     * @param {string} event - Event type\n     * @param {function} callback - Callback for when event occurs\n     */\n    off(event, callback) {\n        off(this.elements.container, event, callback);\n    }\n\n    /**\n     * Destroy an instance\n     * Event listeners are removed when elements are removed\n     * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n     * @param {function} callback - Callback for when destroy is complete\n     * @param {boolean} soft - Whether it's a soft destroy (for source changes etc)\n     */\n    destroy(callback, soft = false) {\n        if (!this.ready) {\n            return;\n        }\n\n        const done = () => {\n            // Reset overflow (incase destroyed while in fullscreen)\n            document.body.style.overflow = '';\n\n            // GC for embed\n            this.embed = null;\n\n            // If it's a soft destroy, make minimal changes\n            if (soft) {\n                if (Object.keys(this.elements).length) {\n                    // Remove elements\n                    removeElement(this.elements.buttons.play);\n                    removeElement(this.elements.captions);\n                    removeElement(this.elements.controls);\n                    removeElement(this.elements.wrapper);\n\n                    // Clear for GC\n                    this.elements.buttons.play = null;\n                    this.elements.captions = null;\n                    this.elements.controls = null;\n                    this.elements.wrapper = null;\n                }\n\n                // Callback\n                if (is.function(callback)) {\n                    callback();\n                }\n            } else {\n                // Unbind listeners\n                unbindListeners.call(this);\n\n                // Replace the container with the original element provided\n                replaceElement(this.elements.original, this.elements.container);\n\n                // Event\n                triggerEvent.call(this, this.elements.original, 'destroyed', true);\n\n                // Callback\n                if (is.function(callback)) {\n                    callback.call(this.elements.original);\n                }\n\n                // Reset state\n                this.ready = false;\n\n                // Clear for garbage collection\n                setTimeout(() => {\n                    this.elements = null;\n                    this.media = null;\n                }, 200);\n            }\n        };\n\n        // Stop playback\n        this.stop();\n\n        // Provider specific stuff\n        if (this.isHTML5) {\n            // Clear timeout\n            clearTimeout(this.timers.loading);\n\n            // Restore native video controls\n            ui.toggleNativeControls.call(this, true);\n\n            // Clean up\n            done();\n        } else if (this.isYouTube) {\n            // Clear timers\n            clearInterval(this.timers.buffering);\n            clearInterval(this.timers.playing);\n\n            // Destroy YouTube API\n            if (this.embed !== null && is.function(this.embed.destroy)) {\n                this.embed.destroy();\n            }\n\n            // Clean up\n            done();\n        } else if (this.isVimeo) {\n            // Destroy Vimeo API\n            // then clean up (wait, to prevent postmessage errors)\n            if (this.embed !== null) {\n                this.embed.unload().then(done);\n            }\n\n            // Vimeo does not always return\n            setTimeout(done, 200);\n        }\n    }\n\n    /**\n     * Check for support for a mime type (HTML5 only)\n     * @param {string} type - Mime type\n     */\n    supports(type) {\n        return support.mime.call(this, type);\n    }\n\n    /**\n     * Check for support\n     * @param {string} type - Player type (audio/video)\n     * @param {string} provider - Provider (html5/youtube/vimeo)\n     * @param {bool} inline - Where player has `playsinline` sttribute\n     */\n    static supported(type, provider, inline) {\n        return support.check(type, provider, inline);\n    }\n\n    /**\n     * Load an SVG sprite into the page\n     * @param {string} url - URL for the SVG sprite\n     * @param {string} [id] - Unique ID\n     */\n    static loadSprite(url, id) {\n        return loadSprite(url, id);\n    }\n\n    /**\n     * Setup multiple instances\n     * @param {*} selector\n     * @param {object} options\n     */\n    static setup(selector, options = {}) {\n        let targets = null;\n\n        if (is.string(selector)) {\n            targets = Array.from(document.querySelectorAll(selector));\n        } else if (is.nodeList(selector)) {\n            targets = Array.from(selector);\n        } else if (is.array(selector)) {\n            targets = selector.filter(is.element);\n        }\n\n        if (is.empty(targets)) {\n            return null;\n        }\n\n        return targets.map(t => new Plyr(t, options));\n    }\n}\n\nPlyr.defaults = cloneDeep(defaults);\n\nexport default Plyr;\n"]}