{"version":3,"sources":["transitions/utils/Interpolation.es6","transitions/utils/Easing.es6","io/devices/Touch.es6","io/devices/Pointer.es6","io/devices/Mouse.es6","io/devices/Keyboard.es6","io/devices/Joystick.es6","api/interfaces/IHandler.es6","api/interfaces/IEngineComponent.es6","utils/Vector2dInteger.es6","utils/Vector2d.es6","utils/MathUtil.es6","transitions/Tween.es6","nodes/RectNode.es6","nodes/CollectionNode.es6","nodes/CameraNode.es6","nodes/BaseNode.es6","nodes/AnimatedNode.es6","states/DefaultGameState.es6","states/BaseGameState.es6","media/Video.es6","media/Sound.es6","media/Audio.es6","loaders/AssetsLoader.es6","utils/Events.es6","utils/ArrayMap.es6","utils/ObjectUtil.es6","io/MediaManager.es6","io/InputManager.es6","io/InputHandlerCodes.es6","io/InputHandler.es6","exceptions/UnexpectedValueException.es6","exceptions/RuntimeException.es6","exceptions/RangeException.es6","exceptions/OutOfRangeException.es6","exceptions/OutOfBoundsException.es6","exceptions/LogicException.es6","exceptions/LengthException.es6","exceptions/InvalidArgumentException.es6","exceptions/Exception.es6","exceptions/BadMethodCallException.es6","exceptions/BadFunctionCallException.es6","events/EventHandler.es6","core/ViewportManager.es6","core/LayersManager.es6","core/GameStatesManager.es6","core/FrameManager.es6","core/FrameHandler.es6","api/PrototypeObject.es6","api/PrototypeInterface.es6","api/Handler.es6","api/Device.es6","utils/SystemConsole.es6","core/SceneManager.es6","utils/DeviceUtil.es6","utils/UUID.es6","api/EngineComponent.es6","api/interfaces/IEngine.es6","j2d.es6"],"names":["InterpolationEnum","Interpolation","Linear","v","k","m","length","f","i","Math","floor","fn","Utils","Bezier","b","n","pw","pow","bn","Bernstein","CatmullRom","p0","p1","t","fc","Factorial","a","s","p2","p3","v0","v1","t2","t3","get","interpolation","undefined","register","interpolationFunction","linear","bezier","catmull-rom","EasingEnum","Easing","None","Quadratic","In","Out","InOut","Cubic","Quartic","Quintic","Sinusoidal","cos","PI","sin","Exponential","Circular","sqrt","Elastic","p","asin","Back","Bounce","_Tween2","default","easing","easingFunction","quadratic-in","quadratic-out","quadratic-in-out","cubic-in","cubic-out","cubic-in-out","quartic-in","quartic-out","quartic-in-out","quintic-in","quintic-out","quintic-in-out","sinusoidal-in","sinusoidal-out","sinusoidal-in-out","exponential-in","exponential-out","exponential-in-out","circular-in","circular-out","circular-in-out","elastic-in","elastic-out","elastic-in-out","back-in","back-out","back-in-out","bounce-in","bounce-out","bounce-in-out","Touch","input","_classCallCheck","this","_possibleConstructorReturn","__proto__","Object","getPrototypeOf","call","Error","IO","_Pointer3","prototype","constructor","name","Pointer","_this","image","data","pointer","store","options","cursor","window","document","body","style","toggle","x","y","distance","Mouse","defineProperty","enumerable","writable","value","id","e","isEnabled","preventDefault","keyCode","KEYS_HELPER","getKeyById","__fixMouseButtonId","button","keys","keysDown","includes","push","recordMouseDragDistance","tracker","pageX","pageY","recordMouseClickTime","pressedTime","delta","startTime","timeStamp","events","trigger","keysUp","splice","toFixed","wheelDelta","keyMouseDownEventHandler","bind","keyMouseUpEventHandler","keyMouseMoveEventHandler","scrollMouseEventHandler","setPointerImage","addEventListener","removeEventListener","Keyboard","recordKeyPressTime","keyDownEventHandler","keyUpEventHandler","Joystick","IHandler","IEngineComponent","Vector2dInteger","array","Vector2d","vector1","vector2","getVector","atan2","MathUtil","number","isFinite","min","max","opacity","random","omitZero","degree","radian","tweens","Tween","tweenNode","_ObjectUtil2","extend","defaults","node","_Events2","state","_typeof","stateDefaults","properties","tween","isStarted","stateData","_tweenStateData","duration","tweenStateStack","time","nextState","currentStateAnimation","currentState","previousStatesTime","getStateTimeDuration","elapsed","import","util","animateTween","_Easing2","chainedTweensStack","start","result","forEach","position","withPrevious","tweenStateTimings","startState","index","parsedTweenStateStack","nextStateDelay","nextAllStateDelay","Array","concat","reverseProperties","stateStack","slice","stackLength","j","sIndex","delay","shift","calculateProperties","global","performance","now","isAnimated","cleanProperties","_calculateStackState","_calculateStackStateTimings","delayTime","add","stopChainedTweens","remove","stop","to","count","event","callback","on","off","once","flush","indexOf","update","defaultDuration","property","temp","hasOwnProperty","isNaN","Number","parseFloat","toString","startProperties","endProperties","RectNode","color","context","viewport","collection","visible","inViewport","tempOpacity","globalAlpha","angle","save","translate","getPosition","offset","rotate","_MathUtil2","degree2Radian","fillStyle","lineWidth","fillRect","size","scale","restore","draw","type","CollectionNode","_ArrayMap2","key","collectionNode","each","_BaseNode2","render","zIndex","CameraNode","screen","calculate","BaseNode","_UUID2","generate","_Vector2d2","getSize","getOffset","enabledCache","cache","AnimatedNode","durationAsSpeed","getDistance","getAngle","velocity","DefaultGameState","gsm","timestamp","setTimeout","setNextState","BaseGameState","loader","STATE_NOT_LOADED","STATE_INIT","STATE_LOAD","STATE_UPDATE","STATE_RENDER","STATE_UNLOAD","Video","createMasterGain","audioContext","masterGain","createGain","createGainNode","gain","connect","destination","Sound","manager","audioNode","getAudioContext","AudioContext","webkitAudioContext","getMasterGain","buffer","_setupAudioNode","iOSAutoEnable","iOSEnable","media","load","sound","loadBuffer","src","soundNode","disconnect","sprite","loaded","_inactiveNode","pos","timerId","loop","soundId","round","Date","_nodeById","paused","_clearEndTimer","rate","onEndTimer","timer","loopStart","loopEnd","refreshBuffer","playStart","currentTime","volume","bufferSource","noteGrainOn","play","activeNode","noteOff","vol","z","pos3d","panner","setPosition","panningModel","model","readyState","createPanner","_drainPool","newNode","inactive","format","autoPlay","muted","url","loadSound","test","atob","split","dataView","Uint8Array","charCodeAt","decodeAudioData","xhr","XMLHttpRequest","open","responseType","onload","response","onerror","gainNode","send","arraybuffer","error","getOwnPropertyNames","createBufferSource","playbackRate","AudioNode","Audio","audio","console","code","preload","listener","ceil","extension","isSupportAudio","warn","extractFormat","source","exec","toLowerCase","isSupportCodec","_load","nodes","_unload","clearTimeout","audios","navigator","isCocoonJS","playSprite","pause","_activeNode","_pause","_stop","mute","_mute","unMute","_unMute","_volume","_position","zsaz","_pos3d","listenerEvent","AssetsLoader","progress","Events","eventName","onces","stack","ArrayMap","args","l","equals","object","contains","ObjectUtil","arguments","deepness","out","create","html5Audio","MediaManager","j2d","iOSEnabled","codecs","mp3","canPlayType","replace","opus","ogg","wav","aac","m4a","mp4","weba","fileExtension","sounds","webAudio","userAgent","unlock","createBuffer","noteOn","playbackState","PLAYING_STATE","FINISHED_STATE","getKey","filter","checkKeyMap","enableCallback","which","keyMap","$","isArray","eval","keysPressed","onMouseClick","enabled","isPlay","element","hasClass","DEPRECATED_InputManager","mouse","inArray","enableAdditionalData","startPosition","timePressed","preventAll","previousDistance","onMouseWheel","originalEvent","fixMouseWheel","mouseWheelCancel","onMouseMove","currentPosition","onKeyboardPress","writeMode","char","String","fromCharCode","focus","onTouchTap","touch","touches","changedTouches","onTouchMove","bindEvents","selector","unbindEvents","getPressData","keyList","FULLSCREEN","KEY_CTRL","KEY_F11","j2dPlugin","pluginInit","dX","scene","canvas","offsetWidth","width","dY","offsetHeight","height","left","top","keyPressed","SCROLL_MOUSE_UP","SCROLL_MOUSE_DOWN","newKeyMap","oldKeyMap","JSON","stringify","parse","mapObject","current","previous","checkPressedKeyList","mode","css","enable","KEY_MOUSE_LEFT","KEY_MOUSE_MIDDLE","KEY_MOUSE_RIGHT","KEY_BACKSPACE","KEY_TAB","KEY_ENTER","KEY_SHIFT","KEY_ALT","KEY_PAUSE","KEY_BREAK","KEY_CAPS_LOCK","KEY_ESCAPE","KEY_SPACE_BAR","KEY_PAGE_UP","KEY_PAGE_DOWN","KEY_END","KEY_HOME","KEY_LEFT_ARROW","KEY_UP_ARROW","KEY_RIGHT_ARROW","KEY_DOWN_ARROW","KEY_INSERT","KEY_DELETE","KEY_0","KEY_1","KEY_2","KEY_3","KEY_4","KEY_5","KEY_6","KEY_7","KEY_8","KEY_9","KEY_A","KEY_B","KEY_C","KEY_D","KEY_E","KEY_F","KEY_G","KEY_H","KEY_I","KEY_J","KEY_K","KEY_L","KEY_M","KEY_N","KEY_O","KEY_P","KEY_Q","KEY_R","KEY_S","KEY_T","KEY_U","KEY_V","KEY_W","KEY_X","KEY_Y","KEY_Z","KEY_LEFT_WINDOW_KEY","KEY_RIGHT_WINDOW_KEY","KEY_SELECT_KEY","KEY_NUMPAD_0","KEY_NUMPAD_1","KEY_NUMPAD_2","KEY_NUMPAD_3","KEY_NUMPAD_4","KEY_NUMPAD_5","KEY_NUMPAD_6","KEY_NUMPAD_7","KEY_NUMPAD_8","KEY_NUMPAD_9","KEY_MULTIPLY","KEY_ADD","KEY_SUBTRACT","KEY_DECIMAL_POINT","KEY_DIVIDE","KEY_F1","KEY_F2","KEY_F3","KEY_F4","KEY_F5","KEY_F6","KEY_F7","KEY_F8","KEY_F9","KEY_F10","KEY_F12","KEY_NUM_LOCK","KEY_SCROLL_LOCK","KEY_SEMI_COLON","KEY_EQUAL_SIGN","KEY_COMMA","KEY_DASH","KEY_PERIOD","KEY_FORWARD_SLASH","KEY_GRAVE_ACCENT","KEY_OPEN_BRACKET","KEY_BACK_SLASH","KEY_CLOSE_BRACKET","KEY_SINGLE_QUOTE","KEY_LEFT_COMMAND","KEY_RIGHT_COMMAND","KEY_MOUSE_3","KEY_MOUSE_4","KEY_MOUSE_5","KEY_MOUSE_6","KEY_MOUSE_7","KEY_MOUSE_8","KEY_MOUSE_9","KEY_MOUSE_10","InputHandler","KEYBOARD","JOYSTICK","MOUSE","TOUCH","KEY","keyCodeMap","disable","clear","newKeyCodeMap","oldKeyCodeMap","_getPressData","eventHandler","io","_Handler3","init","map","device","toUpperCase","defaultIO","bindListeners","unBindListeners","status","getKeyByCode","UnexpectedValueException","message","RuntimeException","RangeException","OutOfRangeException","OutOfBoundsException","LogicException","LengthException","InvalidArgumentException","Exception","BadMethodCallException","BadFunctionCallException","EventHandler","calculateScale","offsetX","offsetY","ViewportManager","cameras","camera","_CameraNode2","getCameraViewport","LayersManager","globalCollection","_CollectionNode2","layers","has","GameStatesManager","sceneCallback","_DefaultGameState2","getCurrent","states","previousState","instance","engineStack","dataStack","frameLimit","frameRun","breakAnimationFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","MAX_SAFE_INTEGER","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","oCancelAnimationFrame","msCancelAnimationFrame","FrameManager","engine","params","deltaTime","lastTime","sceneStartTime","sceneSkipTime","asyncUpdate","asyncRender","interval","pulse","runMainLoop","frameManager","instanceFrameManager","FrameHandler","started","engineHandler","guid","renderEngine","PrototypeObject","interfaces","scope","implement","_PrototypeInterface2","PrototypeInterface","Handler","_IHandler2","Device","DeviceName","SystemConsole","link","log","level","SceneManager","setGameCallback","_FrameManager2","Init","layersManager","_LayersManager2","viewportManager","_ViewportManager2","gameStatesManager","_GameStatesManager2","initLayers","sceneManager","fillBackground","originalWidth","originalHeight","originalMargin","getComputedStyle","initCanvas","setScreen","setDefaultViewport","getLayer","addLayer","querySelectorAll","createElement","webGL","getContext","smoothing","disableSmoothing","shadowColor","backgroundColor","appendChild","clearRect","gameState","gameConstructor","patchGameStateRender","getState","newGameState","getPreviousState","unload","fullscreen","getElementById","attr","requestFullscreen","webkitRequestFullscreen","webkitRequestFullScreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","webkitCancelFullScreen","mozCancelFullScreen","msExitFullscreen","resize","enableFullscreen","margin","setOffset","fullScreen","getViewport","addCamera","setViewport","_updateNoCamerasViewport","updateViewport","display","enableFullScreen","DeviceUtil","documentWidth","parseInt","documentElement","documentHeight","innerWidth","innerHeight","_Vector2dInteger2","UUID","c","r","EngineComponent","_IEngineComponent2","IEngine","EngineJ2D","initEngine","_DeviceUtil2","_SceneManager2","Log","_SystemConsole2","classList","selected","resumeEventListener","getAttribute","resume","resumeBind","jQuery","inactiveNodes","hasAttribute","setAttribute","tabIndex","click","activeNodes","_IEngine2","ready","chrome","match","version","initPlugin","fullScreenEventListener","isFullScreen","querySelector","resizeToFullPage","logSystem","VERSION","firefox","webkitFullscreenElement","webkitCurrentFullScreenElement","mozFullScreenElement","fullscreenElement","msFullscreenElement","html","onResize"],"mappings":";;;;;;;ocAAA,IAAIA,GAAAA,OAQAC,GAIAC,OAAQ,SAAUC,EAAGC,GACjB,GAAIC,GAAIF,EAAEG,OAAS,EACfC,EAAIF,EAAID,EACRI,EAAIC,KAAKC,MAAMH,GACfI,EAAKV,EAAcW,MAAMV,MAE7B,OAAIE,GAAI,EAAUO,EAAGR,EAAE,GAAIA,EAAE,GAAII,GAC7BH,EAAI,EAAUO,EAAGR,EAAEE,GAAIF,EAAEE,EAAI,GAAIA,EAAIE,GAElCI,EAAGR,EAAEK,GAAIL,EAAEK,EAAI,EAAIH,EAAIA,EAAIG,EAAI,GAAID,EAAIC,IAMlDK,OAAQ,SAAUV,EAAGC,GAMjB,IAAK,GALDU,GAAI,EACJC,EAAIZ,EAAEG,OAAS,EACfU,EAAKP,KAAKQ,IACVC,EAAKjB,EAAcW,MAAMO,UAEpBX,EAAI,EAAGA,GAAKO,EAAGP,IACpBM,GAAKE,EAAG,EAAIZ,EAAGW,EAAIP,GAAKQ,EAAGZ,EAAGI,GAAKL,EAAEK,GAAKU,EAAGH,EAAGP,EAGpD,OAAOM,IAMXM,WAAY,SAAUjB,EAAGC,GACrB,GAAIC,GAAIF,EAAEG,OAAS,EACfC,EAAIF,EAAID,EACRI,EAAIC,KAAKC,MAAMH,GACfI,EAAKV,EAAcW,MAAMQ,UAE7B,OAAIjB,GAAE,KAAOA,EAAEE,IACPD,EAAI,IAAGI,EAAIC,KAAKC,MAAMH,EAAIF,GAAK,EAAID,KAEhCO,EAAGR,GAAGK,EAAI,EAAIH,GAAKA,GAAIF,EAAEK,GAAIL,GAAGK,EAAI,GAAKH,GAAIF,GAAGK,EAAI,GAAKH,GAAIE,EAAIC,IAEpEJ,EAAI,EAAUD,EAAE,IAAMQ,EAAGR,EAAE,GAAIA,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAAKI,GAAKJ,EAAE,IACzDC,EAAI,EAAUD,EAAEE,IAAMM,EAAGR,EAAEE,GAAIF,EAAEE,GAAIF,EAAEE,EAAI,GAAIF,EAAEE,EAAI,GAAIE,EAAIF,GAAKF,EAAEE,IAEjEM,EAAGR,EAAEK,EAAIA,EAAI,EAAI,GAAIL,EAAEK,GAAIL,EAAEE,EAAIG,EAAI,EAAIH,EAAIG,EAAI,GAAIL,EAAEE,EAAIG,EAAI,EAAIH,EAAIG,EAAI,GAAID,EAAIC,IAIlGI,OAIIV,OAAQ,SAAUmB,EAAIC,EAAIC,GACtB,OAAQD,EAAKD,GAAME,EAAIF,GAM3BF,UAAW,SAAUJ,EAAGP,GACpB,GAAIgB,GAAKvB,EAAcW,MAAMa,SAC7B,OAAOD,GAAGT,GAAKS,EAAGhB,GAAKgB,EAAGT,EAAIP,IAGlCiB,UAAY,WACR,GAAIC,IAAK,EACT,OAAO,UAAUX,GACb,GAAIY,GAAI,CACR,IAAID,EAAEX,GAAI,MAAOW,GAAEX,EAEnB,KAAK,GAAIP,GAAIO,EAAGP,EAAI,EAAGA,IACnBmB,GAAKnB,CAIT,OAFAkB,GAAEX,GAAKY,EAEAA,MAOfP,WAAY,SAAUC,EAAIC,EAAIM,EAAIC,EAAIN,GAClC,GAAIO,GAAiB,IAAXF,EAAKP,GACXU,EAAiB,IAAXF,EAAKP,GACXU,EAAKT,EAAIA,EACTU,EAAKV,EAAIS,CAEb,QAAQ,EAAIV,EAAK,EAAIM,EAAKE,EAAKC,GAAME,IAAM,EAAKX,EAAK,EAAIM,EAAK,EAAIE,EAAKC,GAAMC,EAAKF,EAAKP,EAAID,IAInGY,IAAK,SAACC,GACF,GAAyCC,SAArCpC,EAAkBmC,GAClB,MAAOnC,GAAkBmC,IAOjCE,SAAU,SAACF,EAAeG,GACtBtC,EAAkBmC,GAAiBG,GAI3CtC,IACIuC,OAAUtC,EAAcC,OACxBsC,OAAUvC,EAAcY,OACxB4B,cAAexC,EAAcmB,sBAGlBnB,ulBC3HXyC,EAAAA,OAQAC,GACAzC,QAII0C,KAAM,SAAUxC,GACZ,MAAOA,KAGfyC,WAIIC,GAAI,SAAU1C,GACV,MAAOA,GAAIA,GAMf2C,IAAK,SAAU3C,GACX,MAAOA,IAAK,EAAIA,IAMpB4C,MAAO,SAAU5C,GACb,OAAKA,GAAK,GAAK,EAAU,GAAMA,EAAIA,GAC5B,MAAUA,GAAKA,EAAI,GAAK,KAIvC6C,OAIIH,GAAI,SAAU1C,GACV,MAAOA,GAAIA,EAAIA,GAMnB2C,IAAK,SAAU3C,GACX,QAASA,EAAIA,EAAIA,EAAI,GAMzB4C,MAAO,SAAU5C,GACb,OAAKA,GAAK,GAAK,EAAU,GAAMA,EAAIA,EAAIA,EAChC,KAAQA,GAAK,GAAKA,EAAIA,EAAI,KAIzC8C,SAIIJ,GAAI,SAAU1C,GACV,MAAOA,GAAIA,EAAIA,EAAIA,GAMvB2C,IAAK,SAAU3C,GACX,MAAO,MAAOA,EAAIA,EAAIA,EAAIA,GAM9B4C,MAAO,SAAU5C,GACb,OAAKA,GAAK,GAAK,EAAW,GAAMA,EAAIA,EAAIA,EAAIA,GACrC,KAASA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,KAI9C+C,SAIIL,GAAI,SAAU1C,GACV,MAAOA,GAAIA,EAAIA,EAAIA,EAAIA,GAM3B2C,IAAK,SAAU3C,GACX,QAASA,EAAIA,EAAIA,EAAIA,EAAIA,EAAI,GAMjC4C,MAAO,SAAU5C,GACb,OAAKA,GAAK,GAAK,EAAU,GAAMA,EAAIA,EAAIA,EAAIA,EAAIA,EACxC,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,KAKjDgD,YAIIN,GAAI,SAAU1C,GACV,MAAO,GAAIK,KAAK4C,IAAIjD,EAAIK,KAAK6C,GAAK,IAMtCP,IAAK,SAAU3C,GACX,MAAOK,MAAK8C,IAAInD,EAAIK,KAAK6C,GAAK,IAMlCN,MAAO,SAAU5C,GACb,MAAO,IAAO,EAAIK,KAAK4C,IAAI5C,KAAK6C,GAAKlD,MAI7CoD,aAIIV,GAAI,SAAU1C,GACV,MAAa,KAANA,EAAU,EAAIK,KAAKQ,IAAI,KAAMb,EAAI,IAM5C2C,IAAK,SAAU3C,GACX,MAAa,KAANA,EAAU,EAAI,EAAIK,KAAKQ,IAAI,GAAG,GAAMb,IAM/C4C,MAAO,SAAU5C,GACb,MAAU,KAANA,EAAgB,EACV,IAANA,EAAgB,GACfA,GAAK,GAAK,EAAU,GAAMK,KAAKQ,IAAI,KAAMb,EAAI,GAE3C,KAAQK,KAAKQ,IAAI,GAAG,IAAOb,EAAI,IAAM,KAIpDqD,UAIIX,GAAI,SAAU1C,GACV,MAAO,GAAIK,KAAKiD,KAAK,EAAItD,EAAIA,IAMjC2C,IAAK,SAAU3C,GACX,MAAOK,MAAKiD,KAAK,KAAOtD,EAAIA,IAMhC4C,MAAO,SAAU5C,GACb,OAAKA,GAAK,GAAK,GAAU,IAAQK,KAAKiD,KAAK,EAAItD,EAAIA,GAAK,GACjD,IAAOK,KAAKiD,KAAK,GAAKtD,GAAK,GAAKA,GAAK,KAIpDuD,SAIIb,GAAI,SAAU1C,GACV,GAAIuB,GACAD,EAAI,GACJkC,EAAI,EAER,OAAU,KAANxD,EAAgB,EACV,IAANA,EAAgB,IAEfsB,GAAKA,EAAI,GACVA,EAAI,EACJC,EAAIiC,EAAI,GAERjC,EAAIiC,EAAInD,KAAKoD,KAAK,EAAInC,IAAM,EAAIjB,KAAK6C,MAGhC5B,EAAIjB,KAAKQ,IAAI,EAAG,IAAMb,GAAK,IAAMK,KAAK8C,KAAKnD,EAAIuB,IAAM,EAAIlB,KAAK6C,IAAMM,MAMjFb,IAAK,SAAU3C,GACX,GAAIuB,GACAD,EAAI,GACJkC,EAAI,EAER,OAAU,KAANxD,EAAgB,EACV,IAANA,EAAgB,IAEfsB,GAAKA,EAAI,GACVA,EAAI,EACJC,EAAIiC,EAAI,GAERjC,EAAIiC,EAAInD,KAAKoD,KAAK,EAAInC,IAAM,EAAIjB,KAAK6C,IAGjC5B,EAAIjB,KAAKQ,IAAI,GAAG,GAAMb,GAAKK,KAAK8C,KAAKnD,EAAIuB,IAAM,EAAIlB,KAAK6C,IAAMM,GAAK,IAM/EZ,MAAO,SAAU5C,GAEb,GAAIuB,GACAD,EAAI,GACJkC,EAAI,EAER,OAAU,KAANxD,EAAgB,EACV,IAANA,EAAgB,IAEfsB,GAAKA,EAAI,GACVA,EAAI,EACJC,EAAIiC,EAAI,GAERjC,EAAIiC,EAAInD,KAAKoD,KAAK,EAAInC,IAAM,EAAIjB,KAAK6C,KAGpClD,GAAK,GAAK,GACJ,IAAQsB,EAAIjB,KAAKQ,IAAI,EAAG,IAAMb,GAAK,IAAMK,KAAK8C,KAAKnD,EAAIuB,IAAM,EAAIlB,KAAK6C,IAAMM,IAGhFlC,EAAIjB,KAAKQ,IAAI,GAAG,IAAOb,GAAK,IAAMK,KAAK8C,KAAKnD,EAAIuB,IAAM,EAAIlB,KAAK6C,IAAMM,GAAK,GAAM,KAM/FE,MAIIhB,GAAI,SAAU1C,GACV,GAAIuB,GAAI,OAER,OAAOvB,GAAIA,IAAMuB,EAAI,GAAKvB,EAAIuB,IAMlCoB,IAAK,SAAU3C,GACX,GAAIuB,GAAI,OAER,SAASvB,EAAIA,IAAMuB,EAAI,GAAKvB,EAAIuB,GAAK,GAMzCqB,MAAO,SAAU5C,GACb,GAAIuB,GAAI,SACR,QAAKvB,GAAK,GAAK,EAAU,IAAOA,EAAIA,IAAMuB,EAAI,GAAKvB,EAAIuB,IAEhD,KAAQvB,GAAK,GAAKA,IAAMuB,EAAI,GAAKvB,EAAIuB,GAAK,KAIzDoC,QAIIjB,GAAI,SAAU1C,GACV,MAAO,GAAI4D,EAAAC,QAAMtB,OAAOoB,OAAOhB,IAAI,EAAI3C,IAM3C2C,IAAK,SAAU3C,GACX,MAAIA,GAAK,EAAI,KACF,OAASA,EAAIA,EACbA,EAAK,EAAI,KACT,QAAUA,GAAM,IAAM,MAASA,EAAI,IACnCA,EAAK,IAAM,KACX,QAAUA,GAAM,KAAO,MAASA,EAAI,MAEpC,QAAUA,GAAM,MAAQ,MAASA,EAAI,SAOpD4C,MAAO,SAAU5C,GACb,MAAIA,GAAI,GAA4C,GAAhC4D,EAAAC,QAAMtB,OAAOoB,OAAOjB,GAAO,EAAJ1C,GACC,GAArC4D,EAAAC,QAAMtB,OAAOoB,OAAOhB,IAAQ,EAAJ3C,EAAQ,GAAW,KAI1D8B,IAAK,SAACgC,GACF,GAA2B9B,SAAvBM,EAAWwB,GACX,MAAOxB,GAAWwB,IAM1B7B,SAAU,SAAC6B,EAAQC,GACfzB,EAAWwB,GAAUC,GAI7BzB,IACIH,OAAUI,EAAOzC,OAAO0C,KAExBwB,eAAgBzB,EAAOE,UAAUC,GACjCuB,gBAAiB1B,EAAOE,UAAUE,IAClCuB,mBAAoB3B,EAAOE,UAAUG,MAErCuB,WAAY5B,EAAOM,MAAMH,GACzB0B,YAAa7B,EAAOM,MAAMF,IAC1B0B,eAAgB9B,EAAOM,MAAMD,MAE7B0B,aAAc/B,EAAOO,QAAQJ,GAC7B6B,cAAehC,EAAOO,QAAQH,IAC9B6B,iBAAkBjC,EAAOO,QAAQF,MAEjC6B,aAAclC,EAAOQ,QAAQL,GAC7BgC,cAAenC,EAAOQ,QAAQJ,IAC9BgC,iBAAkBpC,EAAOQ,QAAQH,MAEjCgC,gBAAiBrC,EAAOS,WAAWN,GACnCmC,iBAAkBtC,EAAOS,WAAWL,IACpCmC,oBAAqBvC,EAAOS,WAAWJ,MAEvCmC,iBAAkBxC,EAAOa,YAAYV,GACrCsC,kBAAmBzC,EAAOa,YAAYT,IACtCsC,qBAAsB1C,EAAOa,YAAYR,MAEzCsC,cAAe3C,EAAOc,SAASX,GAC/ByC,eAAgB5C,EAAOc,SAASV,IAChCyC,kBAAmB7C,EAAOc,SAAST,MAEnCyC,aAAc9C,EAAOgB,QAAQb,GAC7B4C,cAAe/C,EAAOgB,QAAQZ,IAC9B4C,iBAAkBhD,EAAOgB,QAAQX,MAEjC4C,UAAWjD,EAAOmB,KAAKhB,GACvB+C,WAAYlD,EAAOmB,KAAKf,IACxB+C,cAAenD,EAAOmB,KAAKd,MAE3B+C,YAAapD,EAAOoB,OAAOjB,GAC3BkD,aAAcrD,EAAOoB,OAAOhB,IAC5BkD,gBAAiBtD,EAAOoB,OAAOf,iBAGpBL,21CC3XMuD,EAAAA,SAAAA,GAGjB,QAAAA,GAAYC,GAAO,MAAAC,GAAAC,KAAAH,GAAAI,EAAAD,MAAAH,EAAAK,WAAAC,OAAAC,eAAAP,IAAAQ,KAAAL,KACTF,kDAGLA,GAED,MADc/D,UAAV+D,GAAsC/D,SAAfiE,KAAKF,QAAqBE,KAAKF,MAAQA,IAC3D,mCAIP,OAAO,kCAIP,OAAO,mCAIP,KAAM,IAAIQ,OAAM,wBAA0BT,EAAMU,GAAK,qEAKrD,KAAM,IAAID,OAAM,wBAA0BT,EAAMU,GAAK,2EA1BxCV,EAAAA,8CACGW,EAAA5C,QAAQ6C,UAAUC,YAAYC,iBADjCd,u0CCAAe,EAAAA,SAAAA,GACjB,QAAAA,GAAYd,GAAOC,EAAAC,KAAAY,EAAA,IAAAC,GAAAZ,EAAAD,MAAAY,EAAAV,WAAAC,OAAAC,eAAAQ,IAAAP,KAAAL,KACTF,GACN,IAA8B,YAA1Be,EAAKH,YAAYC,KACjB,KAAM,IAAIL,OAAM,oCAHL,OAAAO,4DAOHC,GACZ,GAAIA,EACA,OAAQA,GACJ,IAAK,OACL,IAAK,UACL,IAAK,OACL,IAAK,YACL,IAAK,WACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,YACL,IAAK,YACL,IAAK,UACL,IAAK,WACL,IAAK,WACL,IAAK,YACL,IAAK,YACL,IAAK,OACL,IAAK,WACL,IAAK,OACL,IAAK,UACD,KACJ,SACIA,EAAQ,QAAUA,EAAQ,WAKtC,MAFAd,MAAKF,MAAMiB,KAAKC,QAAQF,MAAQd,KAAKF,MAAMmB,MAAMD,QAAQF,MAAQd,KAAKF,MAAMoB,QAAQC,OAASL,EAC7FM,OAAOC,SAASC,KAAKC,MAAMJ,OAASnB,KAAKF,MAAMiB,KAAKC,QAAQF,MACrDd,0CAGEwB,GAOT,MAN8B,SAA1BxB,KAAKF,MAAMiB,KAAKD,OAAgC/E,SAAXyF,GAAwBA,KAAW,EAIxEJ,OAAOC,SAASC,KAAKC,MAAMJ,OAASnB,KAAKF,MAAMmB,MAAMD,QAAQF,OAH7Dd,KAAKF,MAAMmB,MAAMD,QAAQF,MAAQM,OAAOC,SAASC,KAAKC,MAAMJ,OAC5DC,OAAOC,SAASC,KAAKC,MAAMJ,OAAS,QAIjCnB,gDAIP,MAAyC,SAAlCA,KAAKF,MAAMiB,KAAKC,QAAQF,mDAI/B,MAA0B/E,UAAtBiE,KAAKe,KAAKC,SAA+B,EAAG,IACxChB,KAAKe,KAAKC,QAAQS,EAAGzB,KAAKe,KAAKC,QAAQU,oDAI/C,MAA0B3F,UAAtBiE,KAAKe,KAAKC,QAA8B,EACrChB,KAAKe,KAAKC,QAAQW,qCA7DZf,21CCAAgB,EAAAA,SAAAA,GAoGjB,QAAAA,GAAY9B,GAAOC,EAAAC,KAAA4B,EAAA,IAAAf,GAAAZ,EAAAD,MAAA4B,EAAA1B,WAAAC,OAAAC,eAAAwB,IAAAvB,KAAAL,KACTF,GADS,OAAAK,QAAA0B,eAAAhB,EAAA,sBAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAjGE,SAACC,GAClB,MAAIA,GAAK,EACEA,EACO,IAAPA,EACA,OACO,IAAPA,EACA,SACO,IAAPA,EACA,QADJ,UA0FQ9B,OAAA0B,eAAAhB,EAAA,4BAAAiB,YAAA,EAAAC,UAAA,EAAAC,MArFQ,SAACE,GACpBrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,gBAEzD,IAAIC,GAAUxB,EAAKf,MAAMwC,YAAYC,WAAW,aAAe1B,EAAK2B,mBAAmBN,EAAEO,QACpF5B,GAAKf,MAAMiB,KAAK2B,KAAKC,SAASC,SAASP,IACxCxB,EAAKf,MAAMiB,KAAK2B,KAAKC,SAASE,KAAKR,GAGvCxB,EAAKf,MAAMmB,MAAM6B,yBAA0B,EAC3CjC,EAAKf,MAAMmB,MAAMD,SACb+B,SACItB,EAAGS,EAAEc,MACLtB,EAAGQ,EAAEe,QAIbpC,EAAKf,MAAMmB,MAAMiC,sBAAuB,EACWnH,SAA/C8E,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYd,GAClCxB,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYd,GAASe,MAAQvC,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYd,GAASgB,UAAYnB,EAAEoB,UAE5GzC,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYd,IAC9BgB,UAAWnB,EAAEoB,UACbF,MAAO,GAIfvC,EAAKf,MAAMyD,OAAOC,QAAQ,kBAAmBtB,MA2D9B/B,OAAA0B,eAAAhB,EAAA,0BAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAxDM,SAACE,GAClBrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,gBAEzD,IAAIC,GAAUxB,EAAKf,MAAMwC,YAAYC,WAAW,aAAe1B,EAAK2B,mBAAmBN,EAAEO,QACpF5B,GAAKf,MAAMiB,KAAK2B,KAAKe,OAAOb,SAASP,IACtCxB,EAAKf,MAAMiB,KAAK2B,KAAKe,OAAOZ,KAAKR,GAGrCxB,EAAKf,MAAMmB,MAAM6B,yBAA0B,EAC3CjC,EAAKf,MAAMiB,KAAKC,QAAQW,SAAW,EACnCd,EAAKf,MAAMmB,MAAMD,SACb+B,SACItB,EAAG,EACHC,EAAG,IAIXb,EAAKf,MAAMmB,MAAMiC,sBAAuB,EACWnH,SAA/C8E,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYd,IAClCxB,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYO,OAAOrB,EAAS,GAGtDxB,EAAKf,MAAMyD,OAAOC,QAAQ,gBAAiBtB,MAkC5B/B,OAAA0B,eAAAhB,EAAA,4BAAAiB,YAAA,EAAAC,UAAA,EAAAC,MA/BQ,SAACE,GACpBrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,iBAEzDvB,EAAKf,MAAMiB,KAAKC,SACZS,EAAGS,EAAEc,MACLtB,EAAGQ,EAAEe,MACLtB,SAAWd,EAAKf,MAAMmB,MAAM6B,wBAA2B1I,KAAKiD,KACxDjD,KAAKQ,IAAKsH,EAAEc,MAAQnC,EAAKf,MAAMmB,MAAMD,QAAQ+B,QAAQtB,EAAI,GACvDrH,KAAKQ,IAAKsH,EAAEe,MAAQpC,EAAKf,MAAMmB,MAAMD,QAAQ+B,QAAQrB,EAAI,IAC7DiC,QAAQ,GAAK,EACf7C,MAAOD,EAAKf,MAAMiB,KAAKC,QAAQF,OAGnCD,EAAKf,MAAMyD,OAAOC,QAAQ,eAAgBtB,MAkB3B/B,OAAA0B,eAAAhB,EAAA,2BAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAfO,SAACE,GACnBrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,gBAEzD,IAAIC,GAAWH,EAAE0B,WAAa,IAAM,EAC9B/C,EAAKf,MAAMwC,YAAYC,WAAW,mBAClC1B,EAAKf,MAAMwC,YAAYC,WAAW,oBAEnC1B,GAAKf,MAAMiB,KAAK2B,KAAKe,OAAOb,SAASP,KACtCxB,EAAKf,MAAMiB,KAAK2B,KAAKe,OAAOZ,KAAKR,GACjCxB,EAAKf,MAAMiB,KAAK2B,KAAKC,SAASE,KAAKR,IAGvCxB,EAAKf,MAAMyD,OAAOC,QAAQ,iBAAkBtB,MAM5CrB,EAAKgD,yBAA2BhD,EAAKgD,yBAAyBC,KAA9BjD,GAChCA,EAAKkD,uBAAyBlD,EAAKkD,uBAAuBD,KAA5BjD,GAC9BA,EAAKmD,yBAA2BnD,EAAKmD,yBAAyBF,KAA9BjD,GAChCA,EAAKoD,wBAA0BpD,EAAKoD,wBAAwBH,KAA7BjD,GANhBA,gDASdf,GACa/D,SAAV+D,GAAsC/D,SAAfiE,KAAKF,QAAqBE,KAAKF,MAAQA,GAClEE,KAAKF,MAAMiB,KAAK2B,MACZe,UACAd,aAEJ3C,KAAKF,MAAMmB,MAAMyB,MACbS,gBAEJnD,KAAKF,MAAMiB,KAAKC,SACZF,MAAOd,KAAKF,MAAMoB,QAAQC,QAAU,OACpCM,EAAG,EACHC,EAAG,EACHC,SAAU,GAEd3B,KAAKF,MAAMmB,MAAMD,SACb+B,SACItB,EAAG,EACHC,EAAG,GAEPZ,MAAOd,KAAKF,MAAMoB,QAAQC,QAAU,QAExCnB,KAAKF,MAAMmB,MAAM6B,yBAA0B,EAC3C9C,KAAKF,MAAMmB,MAAMiC,sBAAuB,EACxClD,KAAKkE,gBAAgBlE,KAAKF,MAAMoB,QAAQC,QAAU,yCAKlD,OAAO,kCAkBP,MAd6BpF,UAAzBiE,KAAKF,MAAMiB,KAAK2B,OAChB1C,KAAKF,MAAMiB,KAAK2B,MACZe,UACAd,cAGwB5G,SAA5BiE,KAAKF,MAAMiB,KAAKC,UAChBhB,KAAKF,MAAMiB,KAAKC,SACZF,MAAOd,KAAKF,MAAMoB,QAAQF,SAAW,OACrCS,EAAG,EACHC,EAAG,EACHC,SAAU,KAGX,mCAQP,MAJAP,QAAO+C,iBAAiB,YAAanE,KAAK6D,0BAA0B,GACpEzC,OAAO+C,iBAAiB,UAAWnE,KAAK+D,wBAAwB,GAChE3C,OAAO+C,iBAAiB,YAAanE,KAAKgE,0BAA0B,GACpE5C,OAAO+C,iBAAiB,QAASnE,KAAKiE,yBAAyB,IACxD,oCAQP,MAJA7C,QAAOgD,oBAAoB,YAAapE,KAAK6D,0BAA0B,GACvEzC,OAAOgD,oBAAoB,UAAWpE,KAAK+D,wBAAwB,GACnE3C,OAAOgD,oBAAoB,YAAapE,KAAKgE,0BAA0B,GACvE5C,OAAOgD,oBAAoB,QAASpE,KAAKiE,yBAAyB,IAC3D,0CA5KMrC,EAAAA,8CACGpB,EAAA5C,QAAQ6C,UAAUC,YAAYC,iBADjCiB,y0CCAAyC,EAAAA,SAAAA,GAkCjB,QAAAA,GAAYvE,GAAOC,EAAAC,KAAAqE,EAAA,IAAAxD,GAAAZ,EAAAD,MAAAqE,EAAAnE,WAAAC,OAAAC,eAAAiE,IAAAhE,KAAAL,KACTF,GADS,OAAAK,QAAA0B,eAAAhB,EAAA,uBAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAjCG,SAACE,GACfrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,iBACpDvB,EAAKf,MAAMiB,KAAK2B,KAAKC,SAASC,SAASV,EAAEG,UAC1CxB,EAAKf,MAAMiB,KAAK2B,KAAKC,SAASE,KAAKX,EAAEG,SAGzCxB,EAAKf,MAAMmB,MAAMqD,oBAAqB,EACevI,SAAjD8E,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYjB,EAAEG,SACpCxB,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYjB,EAAEG,SAASe,MAAQvC,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYjB,EAAEG,SAASgB,UAAYnB,EAAEoB,UAEhHzC,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYjB,EAAEG,UAChCgB,UAAWnB,EAAEoB,UACbF,MAAO,GAIfvC,EAAKf,MAAMyD,OAAOC,QAAQ,qBAAsBtB,MAiBjC/B,OAAA0B,eAAAhB,EAAA,qBAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAdC,SAACE,GACbrB,EAAKf,MAAMqC,WAAatB,EAAKf,MAAMsC,gBAAgBF,EAAEE,iBACpDvB,EAAKf,MAAMiB,KAAK2B,KAAKe,OAAOb,SAASV,EAAEG,UACxCxB,EAAKf,MAAMiB,KAAK2B,KAAKe,OAAOZ,KAAKX,EAAEG,SAGvCxB,EAAKf,MAAMmB,MAAMqD,oBAAqB,EACevI,SAAjD8E,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYjB,EAAEG,UACpCxB,EAAKf,MAAMmB,MAAMyB,KAAKS,YAAYO,OAAOxB,EAAEG,QAAS,GAGxDxB,EAAKf,MAAMyD,OAAOC,QAAQ,mBAAoBtB,MAM9CrB,EAAK0D,oBAAsB1D,EAAK0D,oBAAoBT,KAAzBjD,GAC3BA,EAAK2D,kBAAoB3D,EAAK2D,kBAAkBV,KAAvBjD,GAJVA,gDAOdf,GACa/D,SAAV+D,GAAsC/D,SAAfiE,KAAKF,QAAqBE,KAAKF,MAAQA,GAClEE,KAAKF,MAAMiB,KAAK2B,MACZe,UACAd,aAEJ3C,KAAKF,MAAMmB,MAAMyB,MACbS,gBAEJnD,KAAKF,MAAMmB,MAAMqD,oBAAqB,mCAItC,OAAO,kCAUP,MAN6BvI,UAAzBiE,KAAKF,MAAMiB,KAAK2B,OAChB1C,KAAKF,MAAMiB,KAAK2B,MACZe,UACAd,eAGD,mCAMP,MAFAvB,QAAO+C,iBAAiB,UAAWnE,KAAKuE,qBAAqB,GAC7DnD,OAAO+C,iBAAiB,QAASnE,KAAKwE,mBAAmB,IAClD,oCAMP,MAFApD,QAAOgD,oBAAoB,UAAWpE,KAAKuE,qBAAqB,GAChEnD,OAAOgD,oBAAoB,QAASpE,KAAKwE,mBAAmB,IACrD,8BA5EMH,y0CCAAI,EAAAA,SAAAA,GACjB,QAAAA,GAAY3E,GAAO,MAAAC,GAAAC,KAAAyE,GAAAxE,EAAAD,MAAAyE,EAAAvE,WAAAC,OAAAC,eAAAqE,IAAApE,KAAAL,KACTF,kDAGLA,GAED,MADc/D,UAAV+D,GAAsC/D,SAAfiE,KAAKF,QAAqBE,KAAKF,MAAQA,IAC3D,mCAIP,OAAO,kCAIP,OAAO,mCAIP,KAAM,IAAIQ,OAAM,wBAA0BmE,EAASlE,GAAK,qEAKxD,KAAM,IAAID,OAAM,wBAA0BmE,EAASlE,GAAK,+DAxB3CkE,0oCCIAC,EAAAA,SAAAA,6IAAAA,0pCCAAC,EAAAA,SAAAA,6IAAAA,yzCCKAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYnD,EAAGC,GAAG,MAAA3B,GAAAC,KAAA4E,GAAA3E,EAAAD,MAAA4E,EAAA1E,WAAAC,OAAAC,eAAAwE,IAAAvE,KAAAL,KACRyB,GAAK,EAAGC,GAAK,uDAObmD,GAIN,MAHA7E,MAAKyB,EAAIoD,EAAM,IAAM,EACrB7E,KAAK0B,EAAImD,EAAM,IAAM,EAEd7E,iCAbM4E,itBCHAE,EAAAA,WACjB,QAAAA,GAAYrD,EAAGC,GAAG3B,EAAAC,KAAA8E,GACd9E,KAAKyB,EAAIA,EACTzB,KAAK0B,EAAIA,2CAOT,MAAO1B,MAAKyB,iCAOZ,MAAOzB,MAAK0B,sCAOZ,OAAQD,EAAGzB,KAAKyB,EAAGC,EAAG1B,KAAK0B,qCAO3B,OAAQ1B,KAAKyB,EAAGzB,KAAK0B,qCAOfmD,GAIN,MAHA7E,MAAKyB,EAAIoD,EAAM,GACf7E,KAAK0B,EAAImD,EAAM,GAER7E,wCAOP,MAAO,IAAMA,KAAKyB,EAAI,IAAMzB,KAAK0B,EAAI,0CAQtBqD,EAASC,GACxB,MAAO5K,MAAKiD,KACRjD,KAAKQ,IAAIoK,EAAQC,YAAYxD,EAAIsD,EAAQE,YAAYxD,EAAG,GACxDrH,KAAKQ,IAAIoK,EAAQC,YAAYvD,EAAIqD,EAAQE,YAAYvD,EAAG,qCAShDqD,EAASC,GACrB,MAAO5K,MAAK8K,MACJF,EAAQC,YAAYvD,EAAIqD,EAAQE,YAAYvD,EAC5CsD,EAAQC,YAAYxD,EAAIsD,EAAQE,YAAYxD,IAC3C,IAAMrH,KAAK6C,uBAzEP6H,itBCFAK,EAAAA,wFAKKC,GAClB,MAAOA,IAAU,oCAOJA,GACb,MAAyB,gBAAXA,IAAuBC,SAASD,IACvCA,GAAS,kBAAqBA,EAAS,kBACvChL,KAAKC,MAAM+K,KAAYA,sCASfE,EAAKC,EAAKC,GACzB,MAAO,QACDL,EAASM,OAAOH,EAAKC,GAAO,KAC5BJ,EAASM,OAAOH,EAAKC,GAAO,KAC5BJ,EAASM,OAAOH,EAAKC,GAAO,KAC5BC,EAAU,qCASNF,EAAKC,EAAKG,GACpB,GAAID,GAAUrL,KAAKC,MAAMD,KAAKqL,UAAYF,EAAMD,EAAM,GAAKA,EAC3D,OAAQI,IAAsB,GAAVD,EACdN,EAASM,OAAOH,EAAKC,EAAKG,GAC1BD,wCAOWE,GACjB,MAAOA,IAAUvL,KAAK6C,GAAK,2CAOV2I,GACjB,MAAOA,IAAU,IAAMxL,KAAK6C,uBA3DfkI,2tCCHjBU,KAWiBC,EAAAA,WA0BjB,QAAAA,GAAYC,EAAWhF,GAAMhB,EAAAC,KAAA8F,GACzB9F,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUH,EAAMI,SAAUnF,GACxDf,KAAKmG,KAAOJ,EACZ/F,KAAKuD,OAAS,GAAA6C,GAAAxI,QAEdoC,KAAKqG,2DAaOtF,GACZ,MAAiBhF,UAATgF,GAAsC,YAAhB,mBAAOA,GAAP,YAAAuF,EAAOvF,IAC/BiF,EAAApI,QAAWqI,QAAO,KAAUH,EAAMS,cAAexF,GACjD+E,EAAMS,yCAQbC,EAAYzF,GACX,GAAI0F,GAAQzG,IAEZ,KAAKyG,EAAM1F,KAAK2F,UAAW,CAEH,gBAAT3F,KAAmBA,GAAQA,KAAMA,GAC5C,IAAI4F,GAA6B,gBAAT5F,GAAqBf,KAAK4G,gBAAgB7F,GAAQA,CAK1E,OAJahF,UAATgF,GAAsC,gBAATA,KAAmB4F,EAAUE,SAAW9F,GAEzE0F,EAAM1F,KAAK+F,gBAAgBjE,MAAM2D,EAAYG,IAEtCF,kCAWRM,GACH,GAAIN,GAAQzG,KAERgH,EAAYP,EAAM1F,KAAK+F,gBAAgBL,EAAM1F,KAAKkG,sBAAwB,EAE9E,IAAIF,EAAON,EAAM1F,KAAKsC,WAA2BtH,SAAdiL,EAAyB,OAAO,CAE9DP,GAAM1F,KAAK2F,YACZD,EAAMlD,OAAOC,QAAQ,SAAUiD,EAAMN,OACrCM,EAAM1F,KAAK2F,WAAY,EAG3B,IAAIQ,GAAeT,EAAM1F,KAAK+F,gBAAgBL,EAAM1F,KAAKkG,uBAErDE,EAAqBV,EAAMW,qBAAqBX,EAAM1F,KAAKkG,uBAAuB,GAElFI,GAAWN,GAAQN,EAAM1F,KAAKsC,UAAY8D,IAAuBH,EAAU,GAAGH,QASlF,IARAQ,EAAUA,EAAU,EAAI,EAAIA,EAE5BZ,EAAMN,KAAKmB,OACPxB,EAAMyB,KAAKC,aAAaN,EAAa,GAAIF,EAAU,GAAIS,EAAA7J,QAAO/B,IAAImL,EAAU,GAAGnJ,QAAQwJ,KAG3FZ,EAAMlD,OAAOC,QAAQ,UAAWiD,EAAMN,OAEtB,IAAZkB,EAAe,CACf,KAAIZ,EAAM1F,KAAKkG,sBAAwBR,EAAM1F,KAAK+F,gBAAgB7M,QAE3D,CACHwM,EAAMlD,OAAOC,QAAQ,YAAaiD,EAAMN,MAExC,KAAK,GAAIhM,GAAI,EAAGA,EAAIsM,EAAM1F,KAAK2G,mBAAmBzN,OAAQE,IACtDsM,EAAM1F,KAAK2G,mBAAmBvN,GAAGwN,MAC7BlB,EAAM1F,KAAKsC,UAAYoD,EAAMW,qBAAqBX,EAAM1F,KAAKkG,sBAAwB,GAAG,GAGhG,QAAO,EATPR,EAAM1F,KAAKkG,wBAYnB,OAAO,sDAIiBH,GACxB,GAAIc,KAMJ,OAJAd,GAAgBe,QAAQ,SAAU7F,GAC9B4F,EAAO/E,KAAKb,EAAM,GAAG6E,YAGlBe,+CASUE,EAAUC,GAI3B,GAHiBhM,SAAb+L,GAAuC,OAAbA,IAAmBA,EAAW9H,KAAKe,KAAKkG,uBACjDlL,SAAjBgM,IAA4BA,GAAe,GAEDhM,SAA1CiE,KAAKe,KAAKiH,kBAAkBF,GAAyB,MAAO,EAEhE,IAAIC,EAAc,CAEd,IAAK,GADDH,GAAS,EACJzN,EAAI,EAAGA,GAAK2N,EAAU3N,IAC3ByN,GAAU5H,KAAKe,KAAKiH,kBAAkB7N,EAE1C,OAAOyN,GAEP,MAAO5H,MAAKe,KAAKiH,kBAAkBF,gDAQtBG,EAAYnB,GAC7B,GAAIc,IAAUK,GACVC,EAAQ,EAERC,GAAyBF,GACzBG,EAAiB,EACjBC,EAAoB,CAgFxB,OA9EAvB,GAAgBe,QAAQ,SAAU7F,GAC9B,GAAwB,WAApBsE,EAAOtE,EAAM,KAAqBA,EAAM,YAAcsG,QASnD,GAAwB,gBAAbtG,GAAM,GAAiB,CACrC,GAAI7H,GAAI,CACR,QAAQ6H,EAAM,IACV,IAAK,QACDoG,EAAiBpG,EAAM,GAAGjB,IAC1B,MACJ,KAAK,WACDsH,EAAoBrG,EAAM,GAAGjB,IAC7B,MACJ,KAAK,SACD,IAAK5G,EAAI,EAAGA,EAAI6H,EAAM,GAAGjB,KAAM5G,IAC3BgO,EAAsBtF,KAAKsF,EAAsBD,IACjDA,GAEJ,MACJ,KAAK,YACD,IAAK/N,EAAI,EAAGA,EAAI6H,EAAM,GAAGjB,KAAM5G,IAC3BgO,EAAsBI,OAAOJ,GAC7BD,GAEJ,MACJ,KAAK,OACL,IAAK,UACD,IAAK/N,EAAI,EAAGA,EAAI6H,EAAM,GAAGjB,KAAM5G,IACc4B,SAArCoM,EAAsBD,EAAQ,KAC9BC,EAAsBtF,MAClBiD,EAAMyB,KAAKiB,kBAAkBL,EAAsBD,EAAQ,GAAG,IAC9DC,EAAsBD,EAAQ,GAAG,KAErCA,IAGR,MACJ,KAAK,UACL,IAAK,aACD,IAAK/N,EAAI,EAAGA,EAAI6H,EAAM,GAAGjB,KAAM5G,IAI3B,IAAK,GAHDsO,GAAaN,EAAsBO,MAAM,GAEzCC,EAAcF,EAAWxO,OACpB2O,EAAI,EAAGA,EAAID,EAAaC,IAAK,CAClC,GAAIC,GAASF,EAAcC,EAAI,CACJ7M,UAAvB0M,EAAWI,KACXV,EAAsBtF,MAClBiD,EAAMyB,KAAKiB,kBAAkBC,EAAWI,GAAQ,IAChDJ,EAAWI,GAAQ,KAEvBX,YAtDG,KAAnBE,GACApG,EAAM,GAAG8G,MAAQV,EACjBA,EAAiB,GACY,IAAtBC,IACPrG,EAAM,GAAG8G,MAAQT,GAErBF,EAAsBtF,MAAMb,EAAM,GAAIA,EAAM,KAC5CkG,MA4DRA,EAAQ,EACRC,EAAsBY,QACtBZ,EAAsBN,QAAQ,SAAU7F,GACZ,WAApBsE,EAAOtE,EAAM,KAAqBA,EAAM,YAAcsG,SACtDV,EAAO/E,MAAMiD,EAAMyB,KAAKyB,oBAAoBpB,EAAOM,GAAO,GAAIlC,EAAApI,QAAWqI,QAAO,KAAU2B,EAAOM,GAAO,GAAIlG,EAAM,KAAMA,EAAM;AAC9HkG,OAIDN,gCAOLb,GACF,GAAIN,GAAQzG,IAaZ,OAZajE,UAATgL,IAAoBA,EAAOkC,OAAOC,YAAYC,OAClD1C,EAAM1F,KAAKqI,YAAa,EAEnB3C,EAAM1F,KAAK2F,YACZD,EAAM1F,KAAK2F,WAAY,EACvBD,EAAMJ,OAASP,EAAMyB,KAAK8B,gBAAgB5C,EAAMN,KAAKpF,MAAO+E,EAAMS,eAClEE,EAAM1F,KAAK+F,gBAAkB9G,KAAKsJ,qBAAqB7C,EAAMJ,MAAOI,EAAM1F,KAAK+F,iBAC/EL,EAAM1F,KAAKiH,kBAAoBhI,KAAKuJ,4BAA4B9C,EAAM1F,KAAK+F,kBAG/EL,EAAM1F,KAAKsC,UAAY0D,EAAON,EAAM1F,KAAKyI,UAElC1D,EAAM2D,IAAIhD,kCAOjB,GAAIA,GAAQzG,IACZ,OAAKyG,GAAM1F,KAAKqI,YAEhB3C,EAAM1F,KAAKqI,YAAa,EACxB3C,EAAMlD,OAAOC,QAAQ,QAASiD,EAAMN,OACpCM,EAAMiD,oBAEC5D,EAAM6D,OAAOlD,IANezG,iDAcnC,IAAK,GADDyG,GAAQzG,KACH7F,EAAI,EAAGA,EAAIsM,EAAM1F,KAAK2G,mBAAmBzN,OAAQE,IACtDsM,EAAM1F,KAAK2G,mBAAmBvN,GAAGyP,MAGrC,OAAOnD,iCASLqC,GAGF,MAFc/M,UAAV+M,IAAqBA,EAAQ,KACjC9I,KAAK6J,GAAG,QAASf,GACV9I,sCAOF8I,GAGL,MAFc/M,UAAV+M,IAAqBA,EAAQ,KACjC9I,KAAK6J,GAAG,WAAYf,GACb9I,oCAOJ8J,GAGH,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,SAAUC,GACX9J,uCAOD8J,GAGN,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,YAAaC,GACd9J,kCAON8J,GAGD,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,OAAQC,GACT9J,qCAOH8J,GAGJ,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,UAAWC,GACZ9J,qCAOH8J,GAGJ,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,UAAWC,GACZ9J,wCAOA8J,GAGP,MAFc/N,UAAV+N,IAAqBA,EAAQ,GACjC9J,KAAK6J,GAAG,aAAcC,GACf9J,gCAUR+J,EAAOC,GACN,MAAOhK,MAAKuD,OAAO0G,GAAGF,EAAOC,+BAQ7BD,EAAOC,GACP,MAAOhK,MAAKuD,OAAO2G,IAAIH,EAAOC,gCAQ7BD,EAAOC,GACR,MAAOhK,MAAKuD,OAAO4G,KAAKJ,EAAOC,iCAO7BD,GACF,MAAO/J,MAAKuD,OAAO6G,MAAML,mCAQrBA,EAAOhJ,GACX,MAAOf,MAAKuD,OAAOC,QAAQuG,EAAOhJ,iCAQ3BmH,GACP,MAAkBnM,UAAVmM,EAAuBrC,EAASA,EAAOqC,+BAOxCzB,GAEP,MADAZ,GAAOhD,KAAK4D,GACLA,iCAOGA,GACV,GAAItM,GAAI0L,EAAOwE,QAAQ5D,EAEvB,OADItM,MAAM,GAAI0L,EAAOnC,OAAOvJ,EAAG,GACxBsM,kCAOPZ,oCAOUkB,GACV,GAAsB,IAAlBlB,EAAO5L,OAAc,OAAO,CAIhC,KAFA,GAAIE,GAAI,EAEDA,EAAI0L,EAAO5L,QACV4L,EAAO1L,GAAGmQ,OAAOvD,GACjB5M,IAEA0L,EAAOnC,OAAOvJ,EAAG,EAGzB,QAAO,iCAxdM2L,EAAAA,6CAEbmB,sBAAuB,EACvBH,mBACAkB,qBACAN,sBAEA0B,YAAY,EACZ1C,WAAW,EACXrD,UAAW,KAEXmG,UAAW,EAEXe,gBAAiB,6BAbJzE,EAAAA,kDAiBb/E,KAAM,KACN8F,SAAU,IACViC,MAAO,EACPjL,OAAQ,SACR/B,cAAe,kCArBFgK,EAAAA,4EAAAA,EAAAA,yCA4db0B,aAAc,SAAUN,EAAcF,EAAWhF,GAC7C,GACIwI,GACAC,EAFA7C,IAIJ,KAAK4C,IAAYxD,GACTA,EAAU0D,eAAeF,IAAatD,EAAawD,eAAeF,KAClEC,EAAO,KAE4B,gBAAxBzD,GAAUwD,GAEbC,EADAvD,EAAasD,KAAcxD,EAAUwD,GAC9BtD,EAAasD,GAEbtD,EAAasD,IAAaxD,EAAUwD,GAAYtD,EAAasD,IAAaxI,EAE/C,WAA/BsE,EAAOU,EAAUwD,MACxBC,EAAOzK,KAAKwH,aAAaN,EAAasD,GAAWxD,EAAUwD,GAAWxI,IAE7D,OAATyI,IAAe7C,EAAO4C,GAAYC,GAI9C,OAAOtK,QAAOuC,KAAKkF,GAAQ3N,OAAS,EAAI2N,EAAS,MAGrDyB,gBAAiB,SAAU7C,GACvB,GACIgE,GACAC,EAFA7C,IAIJ,KAAK4C,IAAYhE,GACTA,EAAWkE,eAAeF,IAA0B,OAAbA,IACvCC,EAAO,KAC8B,gBAAzBjE,GAAWgE,KAA2BG,MAAMnE,EAAWgE,KAC5B,gBAAzBhE,GAAWgE,GAErBC,EAAOjE,EAAWgE,GACqB,WAAhClE,EAAOE,EAAWgE,MACzBC,EAAOzK,KAAKqJ,gBAAgB7C,EAAWgE,KAE9B,OAATC,IAAe7C,EAAO4C,GAAYC,GAI9C,OAAOtK,QAAOuC,KAAKkF,GAAQ3N,OAAS,EAAI2N,EAAS,MAGrDY,kBAAmB,SAAUhC,GACzB,GACIgE,GACAC,EAFA7C,IAIJ,KAAK4C,IAAYhE,GACTA,EAAWkE,eAAeF,IAA0B,OAAbA,IACvCC,EAAO,KAC6B,gBAAzBjE,GAAWgE,IAA2BG,MAAMnE,EAAWgE,IAEvB,gBAAzBhE,GAAWgE,GACzBC,EAAOjE,EAAWgE,GACqB,WAAhClE,EAAOE,EAAWgE,MACzBC,EAAOzK,KAAKwI,kBAAkBhC,EAAWgE,KAJzCC,EAAOG,OAAOC,WAAWrE,EAAWgE,KAAa,GAAIM,WAM5C,OAATL,IAAe7C,EAAO4C,GAAYC,GAI9C,OAAOtK,QAAOuC,KAAKkF,GAAQ3N,OAAS,EAAI2N,EAAS,MAGrDoB,oBAAqB,SAAU+B,EAAiBC,GAC5C,GACIR,GACAC,EAFA7C,IAIJ,KAAK4C,IAAYQ,GACTA,EAAcN,eAAeF,IAAaO,EAAgBL,eAAeF,IAA0B,OAAbA,IACtFC,EAAO,KAEgC,gBAA5BO,GAAcR,IAA2BG,MAAMK,EAAcR,KAAmD,gBAA9BO,GAAgBP,GAE/D,gBAA5BQ,GAAcR,IAA+D,gBAA9BO,GAAgBP,IAA2BG,MAAMI,EAAgBP,IAEpF,gBAA5BQ,GAAcR,IAA+D,gBAA9BO,GAAgBP,GAC7EC,EAAOO,EAAcR,GACqB,WAAnClE,EAAO0E,EAAcR,MAC5BC,EAAOzK,KAAKgJ,oBAAoB+B,EAAgBP,GAAWQ,EAAcR,KAJzEC,EAAOO,EAAcR,GAAYK,WAAWE,EAAgBP,IAF5DC,EAAOM,EAAgBP,GAAYK,WAAWG,EAAcR,IASnD,OAATC,IAAe7C,EAAO4C,GAAYC,GAG9C,OAAOtK,QAAOuC,KAAKkF,GAAQ3N,OAAS,EAAI2N,EAAS,mBAvjBxC9B,+8CCDAmF,EAAAA,SAAAA,GAMjB,QAAAA,GAAYlK,GAAM,MAAAhB,GAAAC,KAAAiL,GAAAhL,EAAAD,MAAAiL,EAAA/K,WAAAC,OAAAC,eAAA6K,IAAA5K,KAAAL,KACRgG,EAAApI,QAAWqI,QAAO,KAAUgF,EAAS/E,SAAUnF,yDAOrD,MAAOf,MAAKe,KAAKmK,uCAOZA,GAEL,MADAlL,MAAKe,KAAKmK,MAAQA,EACXlL,kCAYNmL,EAASC,EAAUC,EAAYtK,GAChC,GAAIf,KAAKe,KAAKuK,SAAWtL,KAAKuL,WAAWH,GAAW,CAEhD,GAA0B,IAAtBpL,KAAKe,KAAKyE,QAAiB,CAC3B,GAAIgG,GAAcL,EAAQM,WAC1BN,GAAQM,YAAczL,KAAKe,KAAKyE,SAGhCxF,KAAKe,KAAK2K,OAA4B,IAAnBN,EAASM,SAC5BP,EAAQQ,OAERR,EAAQS,UACJ5L,KAAK6L,cAAcpK,EAAI2J,EAASU,OAAOrK,EACvCzB,KAAK6L,cAAcnK,EAAI0J,EAASU,OAAOpK,GAC3CyJ,EAAQY,OAAOC,EAAApO,QAASqO,cAAcjM,KAAKe,KAAK2K,MAAQN,EAASM,QACjEP,EAAQS,YACF5L,KAAK6L,cAAcpK,EAAI2J,EAASU,OAAOrK,KACvCzB,KAAK6L,cAAcnK,EAAI0J,EAASU,OAAOpK,KAGjDyJ,EAAQe,UAAYlM,KAAKe,KAAKmK,MAC9BC,EAAQgB,UAAY,EAEpBhB,EAAQiB,SACJpM,KAAKe,KAAK+G,SAASrG,EAAI2J,EAASU,OAAOrK,EACvCzB,KAAKe,KAAK+G,SAASpG,EAAI0J,EAASU,OAAOpK,EACvC1B,KAAKe,KAAKsL,KAAK5K,EAAIzB,KAAKe,KAAKuL,MAAQlB,EAASkB,MAC9CtM,KAAKe,KAAKsL,KAAK3K,EAAI1B,KAAKe,KAAKuL,MAAQlB,EAASkB,QAG9CtM,KAAKe,KAAK2K,OAA4B,IAAnBN,EAASM,QAC5BP,EAAQoB,UAGc,IAAtBvM,KAAKe,KAAKyE,UACV2F,EAAQM,YAAcD,GAG9B,MAAO,qCAcJL,EAASC,EAAUC,EAAYtK,GAElC,MADAf,MAAKwM,KAAKrB,EAASC,EAAUC,EAAYtK,GAClCf,6CAzFMiL,EAAAA,6CAEbwB,KAAM,WACNvB,MAAO,uBAHMD,oiDCCAyB,EAAAA,SAAAA,GAQjB,QAAAA,GAAY3L,GAAMhB,EAAAC,KAAA0M,EAAA,IAAA7L,GAAAZ,EAAAD,MAAA0M,EAAAxM,WAAAC,OAAAC,eAAAsM,IAAArM,KAAAL,KACRgG,EAAApI,QAAWqI,QAAO,KAAUyG,EAAexG,SAAUnF,IAD7C,OAGe,QAAzBF,EAAKE,KAAKsK,aACVxK,EAAKE,KAAKsK,WAAa,GAAAsB,GAAA/O,SAJbiD,+CAqBdsF,EAAMyG,GAKN,MAJIzG,aAAAA,GAAAA,UACAyG,EAAMA,GAAOzG,EAAKpF,KAAKkB,GACvBjC,KAAKe,KAAKsK,WAAW5B,IAAImD,EAAKzG,IAE3BnG,oCAQJmG,EAAMyG,GAQT,MAPIzG,aAAAA,GAAAA,SACAnG,KAAKe,KAAKsK,WAAW1B,OAAO3J,KAAKe,KAAKsK,WAAWlF,EAAKpF,KAAKkB,KAE5C,gBAAR2K,IAA6B,OAATzG,GAC3BnG,KAAKe,KAAKsK,WAAW1B,OAAOiD,GAGzB5M,iCAOP4M,GACA,MAAqC7Q,UAA9BiE,KAAKe,KAAKsK,WAAWuB,+BAO5BA,GACA,MAAkC7Q,UAA9BiE,KAAKe,KAAKsK,WAAWuB,IACd5M,KAAKe,KAAKsK,WAAWuB,mCAUhC,MADA5M,MAAKe,KAAKsK,WAAWpR,OAAS,EACvB+F,oCAcJmL,EAASC,EAAUC,EAAYtK,GAClC,GAAI8L,GAAiB7M,IAUrB,OARoC,KAAhCA,KAAKe,KAAKsK,WAAWpR,QACrB+F,KAAKe,KAAKsK,WAAWyB,KAAK,SAAU5E,GAC5B2E,EAAe9L,KAAKsK,WAAWX,eAAexC,IAC3C2E,EAAe9L,KAAKsK,WAAWnD,YAA/B6E,GAAAnP,SACHiP,EAAe9L,KAAKsK,WAAWnD,GAAO8E,OAAO7B,EAASC,EAAUC,EAAYtK,KAIjFf,oCArFP,MAAO,KAAOA,KAAKe,KAAKkM,qBAGjBjL,GACPhC,KAAKe,KAAKkM,OAAS,IAAOjL,0CArBb0K,EAAAA,6CAEbD,KAAM,iBAENpB,WAAY,KACZ4B,OAAQ,iBALKP,04CCFAQ,EAAAA,SAAAA,GAKjB,QAAAA,GAAYnM,GAAM,MAAAhB,GAAAC,KAAAkN,GAAAjN,EAAAD,MAAAkN,EAAAhN,WAAAC,OAAAC,eAAA8M,IAAA7M,KAAAL,KACRgG,EAAApI,QAAWqI,QAAO,KAAUiH,EAAWhH,SAAUnF,gEAQzCoM,EAAQC,GACtB,MAAOA,GAAUD,GACbrB,OAAQ9L,KAAKe,KAAK+G,SAClBuE,KAAMrM,KAAKe,KAAKsL,KAChBX,MAAO1L,KAAKe,KAAK2K,MACjBY,MAAOtM,KAAKe,KAAKuL,uCAelBnB,EAASC,EAAUC,EAAYtK,GAClC,MAAOf,8CAnCMkN,EAAAA,6CAEbT,KAAM,0BAFOS,y9BCEAG,EAAAA,WA4BjB,QAAAA,GAAYtM,GAAMhB,EAAAC,KAAAqN,GACdrN,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUoH,EAASnH,SAAUnF,GAEtC,OAAjBf,KAAKe,KAAKkB,KACVjC,KAAKe,KAAKkB,GAAKqL,EAAA1P,QAAK2P,mDA+CvBxM,GACDf,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUjG,KAAKe,KAAMA,kCAOnD,MAAOf,MAAKe,2CAOZ,MAAO,IAAAyM,GAAA5P,QAAaoC,KAAKe,KAAK+G,SAASrG,EAAGzB,KAAKe,KAAK+G,SAASpG,uCAOrDoG,GAQR,MAPiB/L,UAAb+L,IACIA,YAAAA,GAAAA,QACA9H,KAAKe,KAAK+G,SAAWA,EAAS7C,YACvB6C,YAAoBuF,KAC3BrN,KAAKe,KAAK+G,SAAWA,EAAS+D,cAAc5G,cAG7CjF,uCAOP,MAAO,IAAAwN,GAAA5P,QAAaoC,KAAKe,KAAKsL,KAAK5K,EAAGzB,KAAKe,KAAKsL,KAAK3K,mCAOjD2K,GAQJ,MAPatQ,UAATsQ,IACIA,YAAAA,GAAAA,QACArM,KAAKe,KAAKsL,KAAOA,EAAKpH,YACfoH,YAAgBgB,KACvBrN,KAAKe,KAAKsL,KAAOA,EAAKoB,UAAUxI,cAGjCjF,yCAOP,MAAO,IAAAwN,GAAA5P,QAAaoC,KAAKe,KAAK+K,OAAOrK,EAAGzB,KAAKe,KAAK+K,OAAOpK,qCAOnDoK,GAQN,MAPe/P,UAAX+P,IACIA,YAAAA,GAAAA,QACA9L,KAAKe,KAAK+K,OAASA,EAAO7G,YACnB6G,YAAkBuB,KACzBrN,KAAKe,KAAK+K,OAASA,EAAO4B,YAAYzI,cAGvCjF,oCAiBJmL,EAASC,EAAUC,EAAYtK,GAElC,MAAOf,yCAQAoL,GACP,QAAUpL,KAAKe,KAAK+G,SAASrG,EAAI2J,EAASU,OAAOrK,EAAI2J,EAASiB,KAAK5K,GAChEzB,KAAKe,KAAK+G,SAASrG,EAAI2J,EAASiB,KAAK5K,EAAI2J,EAASU,OAAOrK,GACxDzB,KAAKe,KAAK+G,SAASpG,EAAI0J,EAASU,OAAOpK,EAAI0J,EAASiB,KAAK3K,GAC1D1B,KAAKe,KAAK+G,SAASpG,EAAI0J,EAASiB,KAAK3K,EAAI0J,EAASU,OAAOpK,mCAnJ5D,MAAO1B,MAAKe,KAAKyE,sBAGTxD,GACRhC,KAAKe,KAAKyE,QAAUxD,kCAIpB,MAAOhC,MAAKe,KAAKuK,sBAGTtJ,GACRhC,KAAKe,KAAKuK,UAAYtJ,gCAItB,MAAOhC,MAAKe,KAAK2K,oBAGX1J,GACNhC,KAAKe,KAAK2K,MAAQ1J,EAAQ,kCAI1B,MAAOhC,MAAKe,KAAKuL,oBAGXtK,GACNhC,KAAKe,KAAKuL,MAAQtK,gCAIlB,MAAOhC,MAAKe,KAAK4M,2BAGX3L,GACNhC,KAAKe,KAAK4M,eAAiB3L,iCAzEdqL,EAAAA,6CAGbpL,GAAI,KACJwK,KAAM,WAEN3E,UACIrG,EAAG,EACHC,EAAG,GAEP2K,MACI5K,EAAG,EACHC,EAAG,GAEPoK,QACIrK,EAAG,EACHC,EAAG,GAGP4J,SAAS,EACTI,MAAO,EACPY,MAAO,EACP9G,QAAS,EAEToI,MAAO,KACPD,cAAc,eAzBDN,yuDCGAQ,EAAAA,SAAAA,GAKjB,QAAAA,GAAY9M,GAAM,MAAAhB,GAAAC,KAAA6N,GAAA5N,EAAAD,MAAA6N,EAAA3N,WAAAC,OAAAC,eAAAyN,IAAAxN,KAAAL,KACRgG,EAAApI,QAAWqI,QAAO,KAAU4H,EAAa3H,SAAUnF,qDAQtD+G,EAAUjB,EAAUiH,GAGvB,GAFiB/R,SAAb8K,GAA8C,gBAAbA,KAAuBA,EAAW,KAE/C,YAApB,mBAAOiB,GAAP,YAAAxB,EAAOwB,IAAuB,CAC9B,GAAIrB,GAAQ,GAAA9I,GAAAC,QAAUoC,KAElB8H,aAAAA,GAAAA,SACIgG,IAAiBjH,EAAW2G,EAAA5P,QAASmQ,YAAY/N,KAAK6L,cAAe/D,GAAYjB,GACrFJ,EAAMoD,IACF/B,UACIrG,EAAGqG,EAAS7C,YAAYxD,EACxBC,EAAGoG,EAAS7C,YAAYvD,IAE7BmF,IACIiB,YAAAA,GAAAA,UACHgG,IAAiBjH,EAAW2G,EAAA5P,QAASmQ,YAAY/N,KAAK6L,cAAe/D,EAAS+D,eAAiBhF,GACnGJ,EAAMoD,IACF/B,UACIrG,EAAGqG,EAAS+D,cAAc5G,YAAYxD,EACtCC,EAAGoG,EAAS+D,cAAc5G,YAAYvD,IAE3CmF,IAGPJ,EAAMkB,0CASL0E,EAAMxF,EAAUiH,GAErB,GADiB/R,SAAb8K,GAA8C,gBAAbA,KAAuBA,EAAW,KAC/C,YAApB,mBAAOiB,UAAP,YAAAxB,EAAOwB,WAAuB,CAC9B,GAAIrB,GAAQ,GAAA9I,GAAAC,QAAUoC,KAElBqM,aAAAA,GAAAA,SACIyB,IAAiBjH,EAAW2G,EAAA5P,QAASmQ,YAAY/N,KAAKyN,UAAWpB,GAAQxF,GAC7EJ,EAAMoD,IACFwC,MACI5K,EAAG4K,EAAKpH,YAAYxD,EACpBC,EAAG2K,EAAKpH,YAAYvD,IAEzBmF,IACIwF,YAAAA,GAAAA,UACHyB,IAAiBjH,EAAW2G,EAAA5P,QAASmQ,YAAY/N,KAAKyN,UAAWpB,EAAKoB,WAAa5G,GACvFJ,EAAMoD,IACFwC,MACI5K,EAAG4K,EAAKoB,UAAUxI,YAAYxD,EAC9BC,EAAG2K,EAAKoB,UAAUxI,YAAYvD,IAEnCmF,IAGPJ,EAAMkB,0CAQL+D,EAAO7E,GACK9K,SAAb8K,GAA8C,gBAAbA,KAAuBA,EAAW,IACvE,IAAIJ,GAAQ,GAAA9I,GAAAC,QAAUoC,KAED,iBAAV0L,GACPjF,EAAMoD,IAAI6B,MAAOA,EAAQ,KAAM7E,GACP,YAAjB,mBAAO6E,GAAP,YAAApF,EAAOoF,KAAsBA,YAAAA,GAAAA,SACpCjF,EAAMoD,IACF6B,MAAO8B,EAAA5P,QAASoQ,SAAStC,EAAMG,cAAe7L,KAAK6L,gBACpDhF,GAGPJ,EAAMkB,qCAMLsG,GACgBlS,SAAbkS,GAA8C,gBAAbA,KAAuBA,EAAW,GACvEjO,KAAK0L,OAASuC,0CAlGDJ,EAAAA,6CAEbpB,KAAM,4BAFOoB,i1CCJAK,EAAAA,SAAAA,GACjB,QAAAA,GAAYC,EAAKpN,GAAM,MAAAhB,GAAAC,KAAAkO,GACNnS,SAATgF,IAAoBA,MACxBA,EAAKkB,GAAK,WAFShC,EAAAD,MAAAkO,EAAAhO,WAAAC,OAAAC,eAAA8N,IAAA7N,KAAAL,KAGbmO,EAAKpN,oDAWRqN,EAAWrN,GAId,MAHAsN,YAAW,WACPrO,KAAKmO,IAAIG,gBACXxK,KAAK9D,MAAO,MACP,8BAnBMkO,6qCCEAK,EAAAA,WAejB,QAAAA,GAAYJ,EAAKpN,GAAMhB,EAAAC,KAAAuO,GACNxS,SAATgF,IAAoBA,MACXhF,SAATgF,IAAoBA,MACxBA,EAAKmG,aAAe,EACJnL,SAAZgF,EAAKkB,IAAgC,OAAZlB,EAAKkB,KAC9BlB,EAAKkB,GAAKqL,EAAA1P,QAAK2P,YAEnBvN,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUsI,EAAcrI,SAAUnF,GAEhEf,KAAKmO,IAAMA,EACXnO,KAAKwO,OAAS,KACdxO,KAAKuD,OAAS,GAAA6C,GAAAxI,+CAWbmD,GAID,MAHoB,YAAhB,mBAAOA,GAAP,YAAAuF,EAAOvF,KAAuChF,SAAlBgF,EAAKiJ,UACjCjJ,EAAKiJ,YAEF,+BAGNjJ,GAED,MADoB,YAAhB,mBAAOA,GAAP,YAAAuF,EAAOvF,KAAuChF,SAAlBgF,EAAKiJ,UAAwBjJ,EAAKiJ,YAC3D,iCAGJoE,EAAWrN,GACd,OAAO,iCAGJqN,EAAWrN,GACd,OAAO,iCAGJA,GAEH,MADoB,YAAhB,mBAAOA,GAAP,YAAAuF,EAAOvF,KAAuChF,SAAlBgF,EAAKiJ,UAAwBjJ,EAAKiJ,YAC3D,6BASRD,EAAOC,GACN,MAAOhK,MAAKuD,OAAO0G,GAAGF,EAAOC,+BAQ7BD,EAAOC,GACP,MAAOhK,MAAKuD,OAAO2G,IAAIH,EAAOC,gCAQ7BD,EAAOC,GACR,MAAOhK,MAAKuD,OAAO4G,KAAKJ,EAAOC,iCAO7BD,GACF,MAAO/J,MAAKuD,OAAO6G,MAAML,mCAQrBA,EAAOhJ,GACX,MAAOf,MAAKuD,OAAOC,QAAQuG,EAAOhJ,8BA1ElC,MAAOf,MAAKe,KAAKkB,iBAGdD,GACHhC,KAAKe,KAAKkB,GAAKD,iCAlCFuM,EAAAA,6CAEbtM,GAAI,YACJiF,aAAc,2BAHDqH,EAAAA,0CAObE,iBAAkB,EAClBC,WAAY,EACZC,WAAY,EACZC,aAAc,EACdC,aAAc,EACdC,aAAc,eAZDP,qdCTAQ,GAAAA,QAAAA,0BAAAA,qqCCGrB,QAASC,KACL,MAAIC,IACAC,EAA0CnT,SAA5BkT,EAAaE,WACrBF,EAAaG,iBACbH,EAAaE,aACnBD,EAAWG,KAAKrN,MAAQ,EACxBkN,EAAWI,QAAQL,EAAaM,aACzBL,GAEJ,yDAZPD,GACAC,mRAFAtB,KAyBiB4B,EAAAA,SAAAA,GAqBjB,QAAAA,GAAYzO,EAAM0O,GAAS1P,EAAAC,KAAAwP,EAAA,IAAA3O,GAAAZ,EAAAD,MAAAwP,EAAAtP,WAAAC,OAAAC,eAAAoP,IAAAnP,KAAAL,KACjBe,EAAM0O,GADW,OAGvB5O,GAAK4O,QAAUA,EACf5O,EAAK0C,OAAW1C,EAAK4O,QAAU5O,EAAK4O,QAAQlM,OAAS,GAAA6C,GAAAxI,QACrDiD,EAAKE,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUuJ,EAAMtJ,SAAUnF,GACxDF,EAAK6O,aACLT,EAAeQ,EACTA,EAAQE,kBACR,IAAKvO,OAAOwO,cAAgBxO,OAAOyO,oBAEzCX,EAAaO,EACPA,EAAQK,gBACRd,IAEe,OAAjBnO,EAAKE,KAAKkB,KACVpB,EAAKE,KAAKkB,GAAKqL,EAAA1P,QAAK2P,YAGpB0B,GAAgBpO,EAAKE,KAAKgP,QAC1BlP,EAAKmP,gBAALnP,GAGAA,EAAK4O,SAAWR,GAAgBpO,EAAK4O,QAAQ1O,KAAKkP,gBAClDpP,EAAK4O,QAAQS,WAAY,GAGzBrP,EAAK4O,SAAS5O,EAAK4O,QAAQU,MAAMtU,IAAI,UAAU4N,IAAI5I,EAAKE,KAAKkB,GAA/CpB,GAElBA,EAAKuP,OA7BkBvP,iDAgCrBwP,GAEF,MADAC,GAAWD,EAAOA,EAAMtP,KAAKwP,KACtBF,kCAGHG,GACJA,EAAUC,WAAW,gCAGpBC,EAAQ1G,GACT,GAAIqG,GAAQrQ,IAMZ,OAJsB,kBAAX0Q,KAAwB1G,EAAW0G,GAEzCA,GAA4B,kBAAXA,KAAuBA,EAAS,WAEjDL,EAAMtP,KAAK4P,OAQXN,EAAMtP,KAAK2P,OAAOA,IAKvBL,EAAMO,cAAcP,EAAO,SAAUlK,GACjCA,EAAKuK,OAASA,CAEd,IAAIG,GAAO1K,EAAK0K,IAAM,EAAK1K,EAAK0K,IAAMR,EAAMtP,KAAK2P,OAAOA,GAAQ,GAAK,IACjE7J,EAAWwJ,EAAMtP,KAAK2P,OAAOA,GAAQ,GAAK,IAAOvK,EAAK0K,GACtD1K,GAAK0K,IAAM,IAAGA,EAAMR,EAAMtP,KAAK2P,OAAOA,GAAQ,GAAK,IAAOG,EAC9D,IAImDC,GAJ/CC,KAAUV,EAAMtP,KAAKgQ,OAAQV,EAAMtP,KAAK2P,OAAOA,GAAQ,IAEvDM,EAA+B,gBAAbhH,GAChBA,EACA5P,KAAK6W,MAAMC,KAAK/H,MAAQ/O,KAAKqL,UAAY,IAE/C,WACI,GAAI1E,IACAkB,GAAI+O,EACJN,OAAQA,EACRK,KAAMA,EAGVD,GAAUzC,WAAW,WACbY,IAAiB8B,IACjBV,EAAMc,UAAUd,EAAOtP,EAAKkB,IAAImP,QAAS,EACzCf,EAAMc,UAAUd,EAAOtP,EAAKkB,IAAI4O,IAAM,EACtCR,EAAMgB,eAAehB,EAAOtP,EAAKkB,KAErCoO,EAAM9M,OAAOC,QAAQ,SAAUwN,IAC/BnK,EAAWwJ,EAAMtP,KAAKuQ,KAAQ,KAElCjB,EAAMtP,KAAKwQ,WAAW1O,MAAM2O,MAAOV,EAAS7O,GAAIlB,EAAKkB,OAGzD,IAAIwP,GAAYpB,EAAMtP,KAAK2P,OAAOA,GAAQ,GAAK,IAC3CgB,EAAUrB,EAAMtP,KAAK2P,OAAOA,GAAQ,GAAK,GAiB7C,OAfAvK,GAAKlE,GAAK+O,EACV7K,EAAKiL,QAAS,EACdO,EAActB,GAAQU,EAAMU,EAAWC,GAAUV,GACjDX,EAAMtP,KAAK6Q,UAAY3C,EAAa4C,YACpC1L,EAAKkJ,KAAKrN,MAAQqO,EAAMtP,KAAK+Q,OAEU,mBAA5B3L,GAAK4L,aAAapK,MACzBoJ,EAAO5K,EAAK4L,aAAaC,YAAY,EAAGnB,EAAK,OAAS1K,EAAK4L,aAAaC,YAAY,EAAGnB,EAAKhK,GAE5FkK,EAAO5K,EAAK4L,aAAapK,MAAM,EAAGkJ,EAAK,OAAS1K,EAAK4L,aAAapK,MAAM,EAAGkJ,EAAKhK,GAGpFwJ,EAAM9M,OAAOC,QAAQ,QACG,kBAAbwG,IAAyBA,EAASgH,GAEtCX,IAGJA,IAxDqB,kBAAbrG,IAAyBA,IAC7BqG,IATPA,EAAM9M,OAAO0G,GAAG,OAAQ,WACpBoG,EAAM4B,KAAKvB,EAAQ1G,KAGhBqG,kCA+DR6B,GACH,QAAKA,EAAWH,eAAgBG,EAAWd,UAI3Cc,EAAWd,QAAS,EACgBrV,QAAhCmW,EAAWH,aAAanI,KACxBsI,EAAWH,aAAaI,QAAQ,GAEhCD,EAAWH,aAAanI,KAAK,IAE1B,iCAGLsI,GACF,QAAKA,EAAWH,eAAgBG,EAAWd,UAI3Cc,EAAWd,QAAS,EAEwB,mBAAjCc,GAAWH,aAAanI,KAC/BsI,EAAWH,aAAaI,QAAQ,GAEhCD,EAAWH,aAAanI,KAAK,IAE1B,iCAGLsI,GACFA,EAAW7C,KAAKrN,MAAQ,kCAGpBkQ,GACJA,EAAW7C,KAAKrN,MAAQhC,KAAKe,KAAK+Q,uCAG9BI,EAAYE,GAChBF,EAAW7C,KAAKrN,MAAQoQ,oCAGlBF,EAAYpY,GAClB,MAAUiC,UAANjC,GAAwB,GAALA,EAAkBoY,EAAWrB,IAC7CqB,EAAWrB,KAAO5B,EAAa4C,YAAc7R,KAAKe,KAAK6Q,0CAG3DM,EAAYzQ,EAAGC,EAAG2Q,GACjBH,IACAlS,KAAKe,KAAKuR,OAAS7Q,EAAGC,EAAG2Q,GACzBH,EAAWK,OAAOC,YAAY/Q,EAAGC,EAAG2Q,GACpCH,EAAWK,OAAOE,aAAezS,KAAKe,KAAK2R,OAAS,kDAKxD,GAAIrC,GAAQrQ,KACRmG,EAAOkK,EAAMX,UACbxH,EAAQmI,EAAMX,UAAUzV,MAiB5B,OAfAkM,GAAK+B,GAAsCnM,SAA5BkT,EAAaE,WACtBF,EAAaG,iBACbH,EAAaE,aAEnBhJ,EAAK+B,GAAOmH,KAAKrN,MAAQqO,EAAMtP,KAAK+Q,OACpC3L,EAAK+B,GAAOkJ,QAAS,EACrBjL,EAAK+B,GAAO2I,IAAM,EAClB1K,EAAK+B,GAAOyK,WAAa,EACzBxM,EAAK+B,GAAOoH,QAAQJ,GAEpB/I,EAAK+B,GAAOqK,OAAStD,EAAa2D,eAClCzM,EAAK+B,GAAOqK,OAAOE,aAAepC,EAAMtP,KAAK2R,OAAS,aACtDvM,EAAK+B,GAAOqK,OAAOC,YAAYnC,EAAMtP,KAAKuR,MAAM,GAAIjC,EAAMtP,KAAKuR,MAAM,GAAIjC,EAAMtP,KAAKuR,MAAM,IAC1FnM,EAAK+B,GAAOqK,OAAOjD,QAAQnJ,EAAK+B,IAEzB/B,EAAK+B,yCAIFmI,EAAOrG,GAGjB,IAAK,GAFD7D,GAAO,KAEFhM,EAAI,EAAGA,EAAIkW,EAAMX,UAAUzV,OAAQE,IACxC,GAAIkW,EAAMX,UAAUvV,GAAGiX,QAA4C,IAAlCf,EAAMX,UAAUvV,GAAGwY,WAAkB,CAClE3I,EAASqG,EAAMX,UAAUvV,IACzBgM,GAAO,CACP,OAMR,GAFAkK,EAAMwC,WAAWxC,IAEblK,EAAJ,CAEA,GAAI2M,GAAUzC,EAAML,iBACpBhG,GAAS8I,uCAGFzC,GAGP,IAAK,GAFD0C,GAAW,EAEN5Y,EAAI,EAAGA,EAAIkW,EAAMX,UAAUzV,OAAQE,IACpCkW,EAAMX,UAAUvV,GAAGiX,QAAQ2B,GAGnC,KAAK5Y,EAAIkW,EAAMX,UAAUzV,OAAS,EAAGE,GAAK,KAClC4Y,GAAY,GADyB5Y,IAGrCkW,EAAMX,UAAUvV,GAAGiX,SACfnC,GAAcoB,EAAMX,UAAUvV,GAAGsW,WAAW,GAChDJ,EAAMX,UAAUhM,OAAOvJ,EAAG,GAC1B4Y,6CAvPKvD,EAAAA,6CAEbvN,GAAI,KACJsO,OACAyC,OAAQ,KACRC,UAAU,EAEVpM,SAAU,EACVkK,MAAM,EACNL,UACAoB,OAAQ,EACRoB,OAAO,EACPZ,OAAQ,EAAG,GAAG,IACdhB,KAAM,EAENX,QAAQ,EACRZ,QAAQ,EACR2C,MAAO,KACPnB,2BAlBa/B,CAoQrB,IAAIc,GAAa,SAAUD,EAAO8C,GAC9B,GAAIA,IAAOvF,GAIP,MAHAyC,GAAMtP,KAAK8F,SAAW+G,EAAMuF,GAAKtM,aAEjCuM,GAAU/C,EAId,IAAI,sBAAsBgD,KAAKF,GAAM,CAGjC,IAAK,GAFDpS,GAAOuS,KAAKH,EAAII,MAAM,KAAK,IAC3BC,EAAW,GAAIC,YAAW1S,EAAK9G,QAC1BE,EAAI,EAAGA,EAAI4G,EAAK9G,SAAUE,EAC/BqZ,EAASrZ,GAAK4G,EAAK2S,WAAWvZ,EAGlCwZ,GAAgBH,EAASzD,OAAQM,EAAO8C,OACrC,CACH,GAAIS,GAAM,GAAIC,eACdD,GAAIE,KAAK,MAAOX,GAAK,GACrBS,EAAIG,aAAe,cACnBH,EAAII,OAAS,WACTL,EAAgBC,EAAIK,SAAU5D,EAAO8C,IAEzCS,EAAIM,QAAU,WACNjF,IACAoB,EAAMtP,KAAKgP,QAAS,EACpBM,EAAMX,mBACCW,GAAM8D,eACNvG,GAAMuF,GACb9C,EAAMD,QAGd,KACIwD,EAAIQ,OACN,MAAOlS,GACL0R,EAAIM,aAWZP,EAAkB,SAAUU,EAAahE,EAAO8C,GAChDlE,EAAa0E,gBACTU,EACA,SAAUtE,GACFA,IACAnC,EAAMuF,GAAOpD,EACbqD,EAAU/C,EAAON,KAGzB,SAAUuE,GACNjE,EAAM9M,OAAOC,QAAQ,YAAa8Q,MAU1ClB,EAAY,SAAU/C,EAAON,GAC7BM,EAAMtP,KAAK8F,SAAYkJ,EAAUA,EAAOlJ,SAAWwJ,EAAMtP,KAAK8F,SAED,IAAzD1G,OAAOoU,oBAAoBlE,EAAMtP,KAAK2P,QAAQzW,SAC9CoW,EAAMtP,KAAK2P,QAAU9S,SAAU,EAAyB,IAAtByS,EAAMtP,KAAK8F,YAG5CwJ,EAAMtP,KAAK4P,SACZN,EAAMtP,KAAK4P,QAAS,EACpBN,EAAM9M,OAAOC,QAAQ,SAGrB6M,EAAMtP,KAAKkS,UACX5C,EAAM4B,QAUVN,EAAgB,SAAUtB,EAAOU,EAAM9O,GACvC,GAAIkE,GAAOkK,EAAMc,UAAUd,EAAOpO,EAElCkE,GAAK4L,aAAe9C,EAAauF,qBACjCrO,EAAK4L,aAAahC,OAASnC,EAAMyC,EAAMtP,KAAKwP,KAC5CpK,EAAK4L,aAAazC,QAAQnJ,EAAKoM,QAC/BpM,EAAK4L,aAAahB,KAAOA,EAAK,GAC1BA,EAAK,KACL5K,EAAK4L,aAAaN,UAAYV,EAAK,GACnC5K,EAAK4L,aAAaL,QAAUX,EAAK,GAAKA,EAAK,IAG/C5K,EAAK4L,aAAa0C,aAAazS,MAAQqO,EAAMtP,KAAKuQ,6pCCnYlD1D,KACA8G,EAAYtT,OAAOuT,MAUFA,EAAAA,WAkBjB,QAAAA,GAAY5T,EAAM0O,GAAS1P,EAAAC,KAAA2U,EACvB,IAAIC,GAAQ5U,IACZ4U,GAAMnF,QAAsB1T,SAAZ0T,EAAwBA,EAAU,KAClDmF,EAAMrR,OAAWqR,EAAMnF,QAAUmF,EAAMnF,QAAQlM,OAAS,GAAA6C,GAAAxI,QACxDgX,EAAM7T,KAAOiF,EAAApI,QAAWqI,QAAO,KAAU0O,EAAMzO,SAAUnF,GAEzD6T,EAAMlF,aAEgB,OAAlBkF,EAAM7T,KAAKkB,KACX2S,EAAM7T,KAAKkB,GAAKqL,EAAA1P,QAAK2P,YAGrBqH,EAAMnF,SAASmF,EAAMnF,QAAQU,MAAMtU,IAAI,UAAU4N,IAAImL,EAAM7T,KAAKkB,GAAI2S,GAExEA,EAAMxE,+CAIJwE,GACF,GAAIlF,GAAY,GAAIgF,EAEpBhF,GAAUvL,iBAAiB,QAAS,WAChC0Q,QAAQP,OAAO7H,KAAMiD,EAAU4E,MAAQ5E,EAAU4E,MAAMQ,KAAO,MAC/D,GAEHF,EAAMlF,UAAU7M,KAAK6M,GAErBA,EAAUa,IAAMqE,EAAM7T,KAAKwP,IAC3Bb,EAAUmB,IAAM,EAChBnB,EAAUqF,QAAU,OACpBrF,EAAUoC,OAAY8C,EAAMnF,QACrBmF,EAAMnF,QAAQyD,MAAS,EAAI0B,EAAM7T,KAAK+Q,QAAU8C,EAAMnF,QAAQqC,OAAS,KACvE8C,EAAM7T,KAAKmS,MAAS,EAAI0B,EAAM7T,KAAK+Q,MAE1C,IAAIkD,GAAW,QAAXA,KACAJ,EAAM7T,KAAK8F,SAAWzM,KAAK6a,KAA0B,GAArBvF,EAAU7I,UAAiB,GAEE,IAAzD1G,OAAOoU,oBAAoBK,EAAM7T,KAAK2P,QAAQzW,SAC9C2a,EAAM7T,KAAK2P,QAAU9S,SAAU,EAAyB,IAAtBgX,EAAM7T,KAAK8F,YAG5C+N,EAAM7T,KAAK4P,SACZiE,EAAM7T,KAAK4P,QAAS,EACpBiE,EAAMrR,OAAOC,QAAQ,SAGrBoR,EAAM7T,KAAKkS,UACX2B,EAAM3C,OAGVvC,EAAUtL,oBAAoB,iBAAkB4Q,GAAU,GAK9D,OAHAtF,GAAUvL,iBAAiB,iBAAkB6Q,GAAU,GACvDtF,EAAUU,OAEHwE,iCAIP,GAAIA,GAAQ5U,KACRmT,EAAM,GAAI+B,EAAY,EAE1B,IAAIN,EAAMnF,SAAcmF,EAAMnF,QAAQ0F,eAElC,MADAN,SAAQO,KAAK,sBACN,CAGX,IAAIC,GAAgB,SAAUC,EAAQtC,GAClC,GAAIA,EAAQ,MAAOA,EAEnB,IAAIkC,GAAY,0BAA0BK,KAAKD,EAK/C,OAJKJ,KACDA,EAAY,aAAaK,KAAKD,EAAO/B,MAAM,IAAK,GAAG,KAGnD2B,EACOA,EAAU,GAAGM,eAEpBX,QAAQO,KAAK,gEAEV,MAGX,IAAIR,EAAM7T,KAAKwP,cAAejI,OAAO,CACjC,IAAK,GAAInO,GAAI,EAAGA,EAAIya,EAAM7T,KAAKwP,IAAItW,SAC/BkZ,EAAMyB,EAAM7T,KAAKwP,IAAIpW,GACrB+a,EAAYG,EAAcT,EAAM7T,KAAKwP,IAAIpW,GAAIya,EAAM7T,KAAKiS,QACpD,OAASkC,GAH0B/a,KAK3Cya,EAAM7T,KAAKwP,IAAM4C,MACd,CAAA,GAA8B,gBAAnByB,GAAM7T,KAAKwP,IAIzB,MADAsE,SAAQO,KAAK,yBACN,CAHPF,GAAYG,EAAcT,EAAM7T,KAAKwP,IAAKqE,EAAM7T,KAAKiS,QAMzD,MAAI4B,GAAMnF,SAAWmF,EAAMnF,QAAQgG,eAAeP,IAC9CL,QAAQO,KAAK,sBACN,GAGJR,EAAMc,MAAMd;iCAGflF,GACJA,EAAUa,IAAM,oCAOhB,IAAK,GAHDqE,GAAQ5U,KAER2V,EAAQf,EAAMlF,UACTvV,EAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACnCwb,EAAMxb,GAAGiX,SACVwD,EAAMhL,KAAK+L,EAAMxb,GAAG8H,IACpB2S,EAAMrR,OAAOC,QAAQ,SAAUmS,EAAMxb,GAAG8H,KAE5C2S,EAAMgB,QAAQD,EAAMxb,GAGxB,KAAKA,EAAI,EAAGA,EAAIya,EAAM7T,KAAKwQ,WAAWtX,OAAQE,IAC1C0b,aAAajB,EAAM7T,KAAKwQ,WAAWpX,GAAGqX,MAG1C,IAAIoD,EAAMnF,QAAS,CACf,GAAIqG,GAAS9V,KAAKyP,QAAQ5T,IAAI,UAC1BqM,EAAQ4N,EAAOzL,QAAQuK,EACb,QAAV1M,GAAkBA,GAAS,GAC3B4N,EAAOpS,OAAOwE,EAAO,SAItB0F,GAAMgH,EAAM7T,KAAKwP,KACxBqE,EAAQ,iCAGRU,GACA,GAAIV,GAAQ5U,IASZ,OAPIsV,KACAV,EAAMhL,OACNgL,EAAM7T,KAAKwP,IAAM+E,EACjBV,EAAM7T,KAAK4P,QAAS,EACpBiE,EAAMxE,QAGH,kCAGNM,EAAQ1G,GACT,GAAI4K,GAAQ5U,IAKZ,OAHsB,kBAAX0Q,KAAuB1G,EAAW0G,GACxCA,GAA4B,kBAAXA,KAAuBA,EAAS,WAEjDkE,EAAM7T,KAAK4P,OAQXiE,EAAM7T,KAAK2P,OAAOA,IAKvBkE,EAAMhE,cAAcgE,EAAO,SAAUzO,GACjCA,EAAKuK,OAASA,CAEd,IAMmDI,GAN/CD,EAAO1K,EAAK0K,IAAM,EAAK1K,EAAK0K,IAAM+D,EAAM7T,KAAK2P,OAAOA,GAAQ,GAAK,IACjE7J,EAAW+N,EAAM7T,KAAK2P,OAAOA,GAAQ,GAAK,KAAQG,EAAM+D,EAAM7T,KAAK2P,OAAOA,GAAQ,GAAK,KACvFK,KAAU6D,EAAM7T,KAAKgQ,OAAQ6D,EAAM7T,KAAK2P,OAAOA,GAAQ,IAEvDM,EAA+B,gBAAbhH,GAChBA,EACA5P,KAAK6W,MAAMC,KAAK/H,MAAQ/O,KAAKqL,UAAY,EAuB/C,OArBA,YACI,GAAI1E,IACAkB,GAAI+O,EACJN,OAAQA,EACRK,KAAMA,EAGVD,GAAUzC,WAAW,WACb0C,EACA6D,EAAMhL,KAAK7I,EAAKkB,IAAIgQ,KAAKvB,EAAQ3P,EAAKkB,IAEtC2S,EAAMhL,KAAK7I,EAAKkB,IAGpB2S,EAAMrR,OAAOC,QAAQ,SAAUwN,IAC/BnK,EAAW+N,EAAM7T,KAAKuQ,KAAQ,KAElCsD,EAAM7T,KAAKwQ,WAAW1O,MAAM2O,MAAOV,EAAS7O,GAAIlB,EAAKkB,QAIjC,IAApBkE,EAAKwM,aAAqBxM,EAAKwM,YAAcoD,UAAUC,YACvD7P,EAAKlE,GAAK+O,EACV7K,EAAK0L,YAAchB,EAEnB1K,EAAK+M,MAAQ0B,EAAMnF,QACZmF,EAAMnF,QAAQyD,OAAS/M,EAAK+M,MAC5B0B,EAAM7T,KAAKmS,OAAS/M,EAAK+M,MAEhC/M,EAAK2L,OAAS8C,EAAMnF,QACdmF,EAAM7T,KAAK+Q,QAAU8C,EAAMnF,QAAQqC,OAAS,KAC5C8C,EAAM7T,KAAK+Q,OAEjBzD,WAAW,WACPlI,EAAK8L,QACN,GAqBP2C,EAAMrR,OAAOC,QAAQ,QACG,kBAAbwG,IAAyBA,EAASgH,GAEtC4D,IAtBHA,EAAMvD,eAAeL,GAErB,WACI,GAAI4D,GAAQA,EACRqB,EAAavF,EACbpW,EAAK0P,EACL8I,EAAU3M,EAEV6O,EAAW,QAAXA,KACAJ,EAAM3C,KAAKgE,EAAY3b,GACvBwY,EAAQ1O,oBAAoB,iBAAkB4Q,GAAU,GAG5DlC,GAAQ3O,iBAAiB,iBAAkB6Q,GAAU,MAGlDJ,KASRA,IA7EqB,kBAAb5K,IAAyBA,IAC7B4K,IATPA,EAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAM3C,KAAKvB,EAAQ1G,KAGhB4K,kCAoFR1C,GAEH,MADAA,GAAWgE,SACJ,gCAGLjU,GACF,GAAI2S,GAAQ5U,IAEZ,KAAK4U,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAMsB,MAAMjU,KAET2S,CAGXA,GAAMvD,eAAeuD,EAAO3S,EAE5B,IAAIiQ,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAChE,IAAI1C,EAAY,CACZA,EAAWrB,IAAM+D,EAAM/D,IAAI,KAAM5O,EACjC,IAAI2F,GAASgN,EAAMwB,OAAOlE,EAC1B,IAAItK,EAAQ,MAAOgN,GAKvB,MAFAA,GAAMrR,OAAOC,QAAQ,SAEdoR,gCAGL1C,GAKF,MAJKvH,OAAMuH,EAAWrL,YAClBqL,EAAWgE,QACXhE,EAAWL,YAAc,IAEtB,+BAGN5P,GACD,GAAI2S,GAAQ5U,IAEZ,KAAK4U,EAAM7T,KAAK4P,OAKZ,MAJAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAMhL,KAAK3H,KAGR2S,CAGXA,GAAMvD,eAAeuD,EAAO3S,EAE5B,IAAIiQ,GAAcjQ,EAAM2S,EAAMzD,UAAUyD,EAAO3S,GAAM2S,EAAMuB,YAAYvB,EACvE,IAAI1C,EAAY,CACZA,EAAWrB,IAAM,CACjB,IAAIjJ,GAASgN,EAAMyB,MAAMnE,EACzB,IAAItK,EAAQ,MAAOgN,GAGvB,MAAOA,iCAGL1C,GACFA,EAAWgB,OAAQ,+BAGlBjR,GACD,GAAI2S,GAAQ5U,IAEZ,KAAK4U,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAM0B,KAAKrU,KAER2S,CAGX,IAAI1C,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAGhE,OAFI1C,IAAY0C,EAAM2B,QAEf3B,kCAGH1C,GACJA,EAAWgB,OAAQ,iCAGhBjR,GACH,GAAI2S,GAAQ5U,IAEZ,KAAK4U,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAM4B,OAAOvU,KAEV2S,CAGX,IAAI1C,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAGhE,OAFI1C,IAAY0C,EAAM6B,UAEf7B,kCAGH1C,EAAYE,GAChBF,EAAWJ,OAASM,iCAGjBA,EAAKnQ,GACR,GAAI2S,GAAQ5U,IAIZ,IAFAoS,EAAMvH,WAAWuH,GAEbA,GAAO,GAAKA,GAAO,EAAG,CAGtB,GAFAwC,EAAM7T,KAAK+Q,OAASM,GAEfwC,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAM9C,OAAOM,EAAKnQ,KAEf2S,CAGX,IAAI1C,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAQhE,OAPI1C,KACAE,EAAMwC,EAAMnF,QACN2C,GAAOwC,EAAMnF,QAAQqC,OAAS,KAC9B8C,EAAM7T,KAAK+Q,OACjB8C,EAAM8B,QAAQtE,IAGXwC,EAEX,MAAOA,GAAM7T,KAAK+Q,oCAGjBf,GACD,GAAI6D,GAAQ5U,IAEZ,OAAoB,iBAAT+Q,IACP6D,EAAM7T,KAAKgQ,KAAOA,EACX6D,GAEJA,EAAM7T,KAAKgQ,oCAGfL,GACH,GAAIkE,GAAQ5U,IAEZ,OAAsB,YAAlB,mBAAO0Q,GAAP,YAAApK,EAAOoK,KACPkE,EAAM7T,KAAK2P,OAASA,EACbkE,GAEJA,EAAM7T,KAAK2P,yCAGZwB,EAAYpY,GAClB,MAAOoY,GAAWL,wCAGlBhB,EAAK5O,GACL,GAAI2S,GAAQ5U,IAEZ,KAAK4U,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAM/D,IAAIA,KAEQ,gBAARA,GAAmB+D,EAAQA,EAAM7T,KAAK8P,KAAO,CAG/DA,GAAMhG,WAAWgG,EAEjB,IAAIqB,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAChE,IAAI1C,EACA,MAAIrB,IAAO,GACP+D,EAAMsB,MAAMjU,GACZiQ,EAAWrB,IAAMA,EACjB+D,EAAM3C,KAAKC,EAAWxB,OAAQzO,GACvB2S,GAEAA,EAAM+B,UAAUzE,GAAY,EAEpC,IAAIrB,GAAO,EACd,MAAO+D,EAEP,KAAK,GAAIza,GAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACxC,GAAIya,EAAMlF,UAAUvV,GAAGiX,QAA4C,IAAlCwD,EAAMlF,UAAUvV,GAAGwY,WAChD,MAAOiC,GAAM+B,UAAU/B,EAAMlF,UAAUvV,IAAI,kCAMpD+X,EAAYzQ,EAAGC,EAAGkV,GACrB,MAAO,oCAGLnV,EAAGC,EAAG2Q,EAAGpQ,GACX,GAAI2S,GAAQ5U,IAKZ,IAHA0B,EAAkB,mBAANA,IAAsBA,EAASA,EAAJ,EACvC2Q,EAAkB,mBAANA,IAAsBA,EAAYA,GAAP,IAElCuC,EAAM7T,KAAK4P,OAIZ,MAHAiE,GAAMrR,OAAO0G,GAAG,OAAQ,WACpB2K,EAAMtC,MAAM7Q,EAAGC,EAAG2Q,EAAGpQ,KAElB2S,CAGX,MAAInT,GAAK,GAAKA,EAAI,GAId,MAAOmT,GAAM7T,KAAKuR,KAHlB,IAAIJ,GAAcjQ,EAAM2S,EAAMzD,UAAUlP,GAAM2S,EAAMuB,YAAYvB,EAMpE,OALIA,GAAMiC,OAAO3E,EAAYzQ,EAAGC,EAAG2Q,GAK5BuC,oCAIDA,EAAO3S,GAGb,IAAK,GAFDkE,GAAOyO,EAAMlF,UAAU,GAElBvV,EAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACxC,GAAIya,EAAMlF,UAAUvV,GAAG8H,KAAOA,EAAI,CAC9BkE,EAAOyO,EAAMlF,UAAUvV,EACvB,OAIR,MAAOgM,0CAGIyO,EAAO3S,GAGlB,IAAK,GAFDiG,IAAQ,EAEH/N,EAAI,EAAGA,EAAIya,EAAM7T,KAAKwQ,WAAWtX,OAAQE,IAC9C,GAAIya,EAAM7T,KAAKwQ,WAAWpX,GAAG8H,KAAOA,EAAI,CACpCiG,EAAQ/N,CACR,OAIR,GAAIqX,GAAQoD,EAAM7T,KAAKwQ,WAAWrJ,EAC9BsJ,KACAqE,aAAarE,EAAMA,OACnBoD,EAAM7T,KAAKwQ,WAAW7N,OAAOwE,EAAO,wCAIhC0M,GAGR,IAAK,GAFDzO,GAAO,KAEFhM,EAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACxC,IAAKya,EAAMlF,UAAUvV,GAAGiX,OAAQ,CAC5BjL,EAAOyO,EAAMlF,UAAUvV,EACvB,OAMR,MAFAya,GAAM/B,WAAW+B,GAEVzO,wCAGGyO,EAAO5K,GAGjB,IAAK,GAFD7D,GAAO,KAEFhM,EAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACxC,GAAIya,EAAMlF,UAAUvV,GAAGiX,QAA4C,IAAlCwD,EAAMlF,UAAUvV,GAAGwY,WAAkB,CAClE3I,EAAS4K,EAAMlF,UAAUvV,IACzBgM,GAAO,CACP,OAMR,GAFAyO,EAAM/B,WAAW+B,IAEbzO,EAAJ,CAEAyO,EAAMxE,MACN,IAAI0C,GAAU8B,EAAMlF,UAAUkF,EAAMlF,UAAUzV,OAAS,GACnD6c,EAAgBf,UAAUC,WAAa,iBAAmB,iBAC1DhB,EAAW,QAAXA,KACAlC,EAAQ1O,oBAAoB0S,EAAe9B,GAAU,GACrDhL,EAAS8I,GAEbA,GAAQ3O,iBAAiB2S,EAAe9B,GAAU,uCAG3CJ,GAGP,IAAK,GAFD7B,GAAW,EAEN5Y,EAAI,EAAGA,EAAIya,EAAMlF,UAAUzV,OAAQE,IACpCya,EAAMlF,UAAUvV,GAAGiX,QAAQ2B,GAGnC,KAAK5Y,EAAIya,EAAMlF,UAAUzV,OAAS,EAAGE,GAAK,KAClC4Y,GAAY,GADyB5Y,IAGrCya,EAAMlF,UAAUvV,GAAGiX,SACnBwD,EAAMlF,UAAUhM,OAAOvJ,EAAG,GAC1B4Y,oCAljBK4B,EAAAA,6CAEb1S,GAAI,KACJsO,OACAyC,OAAQ,KACRC,UAAU,EAEVpM,SAAU,EACVkK,MAAM,EACNL,UACAoB,OAAQ,EACRoB,OAAO,EACPZ,OAAQ,EAAG,GAAG,IAEd3B,QAAQ,EACRY,2BAfaoD,4qBCPAoC,EAAAA,yGACN,oDAGP,MAAO/W,MAAKgX,0EAMP9O,oCAGDA,uBAbS6O,6sBCFAE,EAAAA,WAIjB,QAAAA,KAAclX,EAAAC,KAAAiX,GAAA9W,OAAA0B,eAAA7B,KAAA,UAAA8B,YAAA,EAAAC,UAAA,EAAAC,WAAA7B,OAAA0B,eAAA7B,KAAA,SAAA8B,YAAA,EAAAC,UAAA,EAAAC,WACVhC,KAAKoK,gDAMH8M,GACgBnb,SAAdmb,GAC+Bnb,SAA3BiE,KAAKuD,OAAO2T,KACZlX,KAAKuD,OAAO2T,OAEcnb,SAA1BiE,KAAKmX,MAAMD,KACXlX,KAAKmX,MAAMD,SAGflX,KAAKmX,SACLnX,KAAKuD,sCASV2T,EAAWlN,GACV,GAA+BjO,SAA3BiE,KAAKuD,OAAO2T,GAA0B,CACtC,GAAIE,GAAQpX,KAAKuD,OAAO2T,EACpBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAMvU,KAAKmH,OAGfhK,MAAKuD,OAAO2T,MACZlX,KAAKuD,OAAO2T,GAAWrU,KAAKmH,gCAQ/BkN,EAAWlN,GACZ,GAA8BjO,SAA1BiE,KAAKmX,MAAMD,GAA0B,CACrC,GAAIE,GAAQpX,KAAKmX,MAAMD,EACnBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAMvU,KAAKmH,OAGfhK,MAAKmX,MAAMD,MACXlX,KAAKmX,MAAMD,GAAWrU,KAAKmH,+BAQ/BkN,EAAWlN,GACX,GAA8BjO,SAA1BiE,KAAKmX,MAAMD,GAA0B,CACrC,GAAIE,GAAQpX,KAAKuD,OAAO2T,EACpBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAM1T,OAAO0T,EAAM/M,QAAQL,qCAS/BkN,EAAWnW,GACf,GAAIqW,GAAOjd,CAEX,IAA+B4B,SAA3BiE,KAAKuD,OAAO2T,GAEZ,IADAE,EAAQpX,KAAKuD,OAAO2T,GACf/c,EAAI,EAAGA,EAAIid,EAAMnd,OAAQE,IAC1Bid,EAAMjd,GAAGkG,KAAK+W,EAAMjd,GAAI4G,EAIhC,IAA8BhF,SAA1BiE,KAAKmX,MAAMD,GAA0B,CAErC,IADAE,EAAQpX,KAAKmX,MAAMD,GACd/c,EAAI,EAAGA,EAAIid,EAAMnd,OAAQE,IAC1Bid,EAAMjd,GAAGkG,KAAK+W,EAAMjd,GAAI4G,EAE5Bf,MAAKoK,MAAM8M,uBA1FFD,0+CCEAI,EAAAA,SAAAA,GAKjB,QAAAA,GAAYC,GAAMvX,EAAAC,KAAAqX,EAAA,IAAAxW,GAAAZ,EAAAD,MAAAqX,EAAAnX,WAAAC,OAAAC,eAAAiX,IAAAhX,KAAAL,KACRsX,GADQ,OAAAnX,QAAA0B,eAAAhB,EAAA,QAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAJX,WACH,MAAOnB,GAAKA,EAAK5G,OAAS,MAGZ4G,kDAQXgE,GACH,IAAKA,EACD,OAAO,CAEX,IAAI7E,KAAK/F,QAAU4K,EAAM5K,OACrB,OAAO,CAEX,KAAK,GAAIE,GAAI,EAAGod,EAAIvX,KAAK/F,OAAQE,EAAIod,EAAGpd,IACpC,GAAI6F,KAAK7F,YAAcmO,QAASzD,EAAM1K,YAAcmO,QAChD,IAAKtI,KAAK7F,GAAGqd,OAAO3S,EAAM1K,IACtB,OAAO,MAEV,IAAI6F,KAAK7F,IAAM0K,EAAM1K,GACtB,OAAO,CAGf,QAAO,mCAOFsd,GAEL,IADA,GAAItd,GAAI6F,KAAK/F,OACNE,KACH,GAAI6F,KAAK7F,KAAOsd,EACZ,OAAO,CAGf,QAAO,+BAONzN,GACD,IAAKA,EAAU,OAAO,CAEtB,KAAK,GADDpC,IAAS,EACJzN,EAAI,EAAGA,EAAI6F,KAAK/F,OAAQE,IAC7B,GAAuC,IAAlCyN,EAASoC,EAAShK,KAAK7F,GAAIA,IAC5B,MAAOyN,EAGf,OAAOA,+BAQPgF,EAAK5K,GAOL,MANIhC,MAAK0X,SAAS9K,GACd5M,KAAK4M,GAAO5K,GAEZhC,KAAK6C,KAAK+J,GACV5M,KAAK4M,GAAO5K,GAEThC,iCAOP4M,GACA,MAAO5M,MAAK0X,SAAS9K,GAAO5M,KAAK4M,GAAO,oCAOrCA,GACH,IAAK,GAAIzS,GAAI,EAAGA,EAAI6F,KAAK/F,SAAUE,EAC/B,GAAI6F,KAAK7F,IAAMyS,EAGX,MAFA5M,MAAK0D,OAAOvJ,EAAG,SACR6F,MAAK4M,GACL5M,IAGf,OAAOA,eAhGuBsI,kBAAjB+O,i6BCFAM,EAAAA,kFAEb,GAAIL,GAAOhP,MAAM7H,UAAUiI,MAAMrI,KAAKuX,WAClCC,GAAW,CACQ,kBAAZP,GAAK,KACZO,EAAWP,EAAK,GAChBA,EAAK5T,OAAO,EAAG,GAUnB,KAAK,GAPDoU,GAAMR,EAAK,IAAM,WACb,MAAgBvb,UAAZub,EAAK,IAAgC,OAAZA,EAAK,IAAkC,WAAnBhR,EAAOgR,EAAK,IAClDnX,OAAO4X,OAAOT,EAAK,UAK7Bnd,EAAI,EAAGA,EAAImd,EAAKrd,OAAQE,IAAK,CAClC,GAAIsd,GAASH,EAAKnd,EAElB,IAAKsd,EAEL,IAAK,GAAI7K,KAAO6K,GAERA,EAAO/M,eAAekC,KACK,WAAvBtG,EAAOmR,EAAO7K,KAAqC,OAAhB6K,EAAO7K,GAC1CkL,EAAIlL,GAAOiL,EAAWF,EAAW1R,OAAO4R,EAAUC,EAAIlL,GAAM6K,EAAO7K,IAAQ6K,EAAO7K,GAElFkL,EAAIlL,GAAO6K,EAAO7K,IAMlC,MAAOkL,sBAjCMH,89BCMjBjD,EAAYtT,OAAOuT,MACnB1F,GAAe,EACf+I,GAAa,CAEjB,KAEI,GAAIpI,GAAexO,OAAOwO,cAAgBxO,OAAOyO,kBACjDZ,GAAe,GAAIW,GACrB,MAAO1N,GACL2S,QAAQO,KAAK,kDAGjB,IAEI4C,IAAe,GAAItD,GACrB,MAAOxS,GACL2S,QAAQO,KAAK,gDAGjB,GAAInG,EAAc,CACd,GAAIC,GAA0CnT,SAA5BkT,EAAaE,WACzBF,EAAaG,iBACbH,EAAaE,YACnBD,GAAWG,KAAKrN,MAAQ,EACxBkN,EAAWI,QAAQL,EAAaM,gBAaf0I,GAAAA,WAQjB,QAAAA,GAAYC,EAAKnX,GAcb,GAdmBhB,EAAAC,KAAAiY,GACNlc,SAATgF,IAAoBA,MACxBf,KAAKkY,IAAMA,EACXlY,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUgS,EAAa/R,SAAUnF,GAC/Df,KAAKuD,OAAS,GAAA6C,GAAAxI,QACdoC,KAAKmQ,MAAQ,GAAAxD,GAAA/O,QAEboC,KAAKmQ,MAAM1G,IAAI,SAAU,GAAAkD,GAAA/O,SACzBoC,KAAKmQ,MAAM1G,IAAI,SAAU,GAAAkD,GAAA/O,SACzBoC,KAAKmQ,MAAM1G,IAAI,SAAU,GAAAkD,GAAA/O,SAEzBoC,KAAK8R,OAA4B,IAAnB9R,KAAKe,KAAK+Q,OACxB9R,KAAKmY,YAAa,EAEdlJ,GAAgB+I,EAAY,CAC5B,GAAI3E,GAAO,GAAIqB,EACf1U,MAAKe,KAAKqX,QACNC,MAAOhF,EAAKiF,YAAY,eAAeC,QAAQ,OAAQ,IACvDC,OAAQnF,EAAKiF,YAAY,4BAA4BC,QAAQ,OAAQ,IACrEE,MAAOpF,EAAKiF,YAAY,8BAA8BC,QAAQ,OAAQ,IACtEG,MAAOrF,EAAKiF,YAAY,yBAAyBC,QAAQ,OAAQ,IACjEI,MAAOtF,EAAKiF,YAAY,cAAcC,QAAQ,OAAQ,IACtDK,OAAQvF,EAAKiF,YAAY,iBAAmBjF,EAAKiF,YAAY,eAAiBjF,EAAKiF,YAAY,eAAeC,QAAQ,OAAQ,IAC9HM,OAAQxF,EAAKiF,YAAY,iBAAmBjF,EAAKiF,YAAY,eAAiBjF,EAAKiF,YAAY,eAAeC,QAAQ,OAAQ,IAC9HO,OAAQzF,EAAKiF,YAAY,+BAA+BC,QAAQ,OAAQ,KAE5ElF,EAAO,0DA2FX,MAAOpE,2CAIP,MAAOC,kCAKP,MADAlP,MAAKkT,OAAQ,EACNlT,sCAKP,MADAA,MAAKkT,OAAQ,EACNlT,4CAGI+Y,GACX,QAAS/Y,KAAKe,KAAKqX,OAAOW,oCAGrBhY,GAEL,MADA,IAAIyO,OAAMzO,EAAMf,MACTA,sCAGFe,GAEL,MADA,IAAI4T,OAAM5T,EAAMf,MACTA,sCAGFe,GAEL,MAAOf,oCAOLiC,GACF,MAAOjC,MAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,iCAGlCA,GACF,MAAOjC,MAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,iCAGlCA,GACF,MAAOjC,MAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,uCAG5BA,GAKR,MAJIjC,MAAKmQ,MAAMtU,IAAI,UAAU6b,SAASzV,KAClCjC,KAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,GAAI2H,OACjC5J,KAAKmQ,MAAMtU,IAAI,UAAU8N,OAAO1H,IAE7BjC,yCAGCiC,GAKR,MAJIjC,MAAKmQ,MAAMtU,IAAI,UAAU6b,SAASzV,KAClCjC,KAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,GAAI2H,OACjC5J,KAAKmQ,MAAMtU,IAAI,UAAU8N,OAAO1H,IAE7BjC,yCAGCiC,GAKR,MAJIjC,MAAKmQ,MAAMtU,IAAI,UAAU6b,SAASzV,KAClCjC,KAAKmQ,MAAMtU,IAAI,UAAUA,IAAIoG,GAAI2H,OACjC5J,KAAKmQ,MAAMtU,IAAI,UAAU8N,OAAO1H,IAE7BjC,oCA/JP,MAA0B,KAAnBA,KAAKe,KAAK+Q,qBAGV9P,GAGP,GAFAhC,KAAKe,KAAK+Q,OAASjH,WAAW7I,EAAQ,KAElCA,GAAS,GAAKA,GAAS,EACvB,GAAIiN,EACAC,EAAWG,KAAKrN,MAAQhC,KAAKe,KAAK+Q,WAC/B,CACH,GAAIkH,GAAShZ,KAAKmQ,MAAMtU,IAAI,SAC5B,KAAK,GAAI+Q,KAAOoM,GACZ,GAAIA,EAAOtO,eAAekC,KAASoM,EAAOpM,GAAKqM,SAC3C,IAAK,GAAI9e,GAAI,EAAGA,EAAI6e,EAAOpM,GAAK8C,UAAUzV,OAAQE,IAC9C6e,EAAOpM,GAAK8C,UAAUvV,GAAG2X,OAASkH,EAAOpM,GAAKkF,OAAS9R,KAAKe,KAAK+Q,MAI7EkH,GAAS,oCAMjB,QAAShZ,KAAKe,KAAKmS,oBAGblR,GAGN,GAFAhC,KAAKe,KAAKmS,QAAUlR,EAEhBiN,EACAC,EAAWG,KAAKrN,MAAQhC,KAAKe,KAAKmS,MAAQ,EAAIlT,KAAKe,KAAK+Q,WACrD,CACH,GAAIkH,GAAShZ,KAAKmQ,MAAMtU,IAAI,SAC5B,KAAK,GAAI+Q,KAAOoM,GACZ,GAAIA,EAAOtO,eAAekC,IAAQoM,EAAOpM,GAAKqM,YAAa,EACvD,IAAK,GAAI9e,GAAI,EAAGA,EAAI6e,EAAOpM,GAAK8C,UAAUzV,OAAQE,IAC9C6e,EAAOpM,GAAK8C,UAAUvV,GAAG+Y,MAAQlT,KAAKe,KAAKmS,KAIvD8F,GAAS,wCAKb,QAAShZ,KAAKe,KAAKkP,4BAGTjO,GACV,GAAIiN,IAAiBjP,KAAKmY,aAAe,oBAAoB9E,KAAK0C,UAAUmD,YACxE,MAAOlX,EAEXhC,MAAKmY,YAAa,CAElB,IAAIgB,GAAS,QAATA,KACA,GAAIpJ,GAASd,EAAamK,aAAa,EAAG,EAAG,OACzC9D,EAASrG,EAAauF,oBAC1Bc,GAAOvF,OAASA,EAChBuF,EAAOhG,QAAQL,EAAaM,aAEPxT,SAAjBuZ,EAAO3N,MACP2N,EAAO+D,OAAO,GAEd/D,EAAO3N,MAAM,GAGjB0G,WAAW,WACFiH,EAAOgE,gBAAkBhE,EAAOiE,eAC9BjE,EAAOgE,gBAAkBhE,EAAOkE,iBACnCxZ,KAAKmY,YAAa,EAClBnY,KAAKe,KAAKkP,eAAgB,EAE1B7O,OAAOgD,oBAAoB,WAAY+U,GAAQ,KAEpD,GAEP/X,QAAO+C,iBAAiB,WAAYgV,GAAQ,0CAI5C,OAAQlK,IAAiB+I,iCAxHZC,EAAAA,6CAEbnG,OAAQ,EACRoB,OAAO,EACPkF,UACAnI,eAAe,eALFgI,6mBC0PrB,QAASwB,QAAOhC,EAAQzV,GACpB,MAAO7B,QAAOuC,KAAK+U,GAAQiC,OAAO,SAAU9M,GACxC,MAAO6K,GAAO7K,KAAS5K,IACxB,wZAtSH2X,YAAc,QAAdA,aAAwBzX,EAAG0X,gBACJ7d,SAAnB6d,iBAA8BA,gBAAiB,EAEnD,IAAI1B,KAAMhW,EAAEnB,KAAK0O,QAAQyI,IACrBzI,QAAUvN,EAAEnB,KAAK0O,QACjBpN,QAAUH,EAAE2X,MACZC,OAAS5X,EAAEnB,KAAK0O,QAAQqK,MAE5B,KAAK,GAAI5R,SAAS4R,QACd,GAAIA,OAAOpP,eAAexC,OAAQ,CAC9B,GAAIlG,OAAQ8X,OAAO5R,MACnB,KAAK6R,EAAEC,QAAQhY,MAAM,KAAOA,MAAM,KAAOK,SAAaL,MAAM,GAOxD,MANwB,gBAAbA,OAAM,KACbA,MAAM,GAAKiY,KAAK,IAAMjY,MAAM,GAAK,MAEZ,kBAAbA,OAAM,IAAsB4X,gBACpC5X,MAAM,GAAGkW,IAAKlW,MAAM,KAEjB,CACJ,IAAI+X,EAAEC,QAAQhY,MAAM,KACpByN,QAAQ1O,KAAKmZ,YAAY1C,OAAOxV,MAAM,KAASA,MAAM,GAQxD,MANwB,gBAAbA,OAAM,KACbA,MAAM,GAAKiY,KAAK,IAAMjY,MAAM,GAAK,MAEb,kBAAbA,OAAM,IAAqB4X,gBAClC5X,MAAM,GAAGkW,IAAKlW,MAAM,KAEjB,EAInB,OAAO,GAEPuB,QACA4W,aAAc,SAAUjY,GACpB,GAAIuN,GAAUvN,EAAEnB,KAAK0O,OACrB,KAAKA,EAAQ1O,KAAKqZ,UAAY3K,EAAQyI,IAAImC,SAAW5K,EAAQyI,IAAIoC,QAAQC,SAAS,UAAW,OAAO,CACpG,IAAIL,GAAczK,EAAQ1O,KAAKmZ,YAC3B7X,EAAUoX,OAAOe,wBAAwB5N,IAAK1K,EAAE2X,QAAU,eAAiB3X,EAAE2X,MAC7EY,EAAQhL,EAAQ1O,KAAK0Z,KAEJ,KAAjBvY,EAAEnB,KAAKgJ,OACc,IAAjB7H,EAAEnB,KAAKgJ,QACH,IAAOgQ,EAAEW,QAAQF,wBAAwB5N,IAAIvK,GAAU6X,KACvDA,EAAYrX,KAAK2X,wBAAwB5N,IAAIvK,IAEzCoN,EAAQ1O,KAAK4Z,uBACbF,EAAMG,cAAcnZ,EAAIS,EAAEc,MAC1ByX,EAAMG,cAAclZ,EAAIQ,EAAEe,MAC1BwX,EAAM9Y,SAAW,EAEjB8N,EAAQ1O,KAAK8Z,YAAc3Y,EAAEoB,aAGjCqW,YAAYzX,GAAG,IAAUuN,EAAQ1O,KAAK+Z,aACtC5Y,EAAEE,oBAGFuX,YAAYzX,IAAMuN,EAAQ1O,KAAK+Z,aAC/B5Y,EAAEE,iBAEFqN,EAAQ1O,KAAK4Z,uBACbF,EAAMM,iBAAmBN,EAAM9Y,SAC/B8Y,EAAMG,cAAcnZ,EAAI,EACxBgZ,EAAMG,cAAclZ,EAAI,GAG5BwY,EAAYxW,OACRwW,EAAY7P,QAAQmQ,wBAAwB5N,IAAIvK,IAAW,IAGnEoN,EAAQ6K,QAAQ9W,QAAyB,IAAjBtB,EAAEnB,KAAKgJ,MAC3B,eAAiB,cAAe1H,QAASA,KAGzCsX,YAAYzX,GAAG,IACfA,EAAEE,kBAKd4Y,aAAc,SAAU9Y,GACpB,GAAIuN,GAAUvN,EAAEnB,KAAK0O,OACrB,KAAKA,EAAQ1O,KAAKqZ,UAAY3K,EAAQyI,IAAImC,SAAW5K,EAAQyI,IAAIoC,QAAQC,SAAS,UAAW,OAAO,CACpG,IAAIL,GAAczK,EAAQ1O,KAAKmZ,YAC3B7X,EAAWH,EAAE+Y,cAAcrX,WAAa,IAAM,EAC9C6V,OAAOe,wBAAwB5N,IAAK,GAAK6M,OAAOe,wBAAwB5N,IAAK,EAEjF1K,GAAE2X,MAAS3X,EAAE+Y,cAAcrX,WAAa,IAAM,EAAK,EAAI,GAEnD,IAAOmW,EAAEW,QAAQF,wBAAwB5N,IAAIvK,GAAU6X,IACvDA,EAAYrX,KAAK2X,wBAAwB5N,IAAIvK,KAG7CsX,YAAYzX,IAAMuN,EAAQ1O,KAAK+Z,cAC/B5Y,EAAEE,iBACFqN,EAAQyL,iBAGZzL,EAAQ6K,QAAQ9W,QAAQ,cAAenB,QAASA,KAGpD8Y,iBAAkB,SAAUjB,EAAa7X,GACrC6X,EAAYxW,OACRwW,EAAY7P,QAAQmQ,wBAAwB5N,IAAIvK,IAAW,IAInE+Y,YAAa,SAAUlZ,GACnB,GAAIuN,GAAUvN,EAAEnB,KAAK0O,QACjBgL,EAAQvY,EAAEnB,KAAK0O,QAAQ1O,KAAK0Z,KAEhChL,GAAQ1O,KAAK0Z,MAAMY,gBAAgB5Z,EAAIS,EAAEc,MACzCyM,EAAQ1O,KAAK0Z,MAAMY,gBAAgB3Z,EAAIQ,EAAEe,MAErCf,EAAEnB,KAAK0O,QAAQ1O,KAAK4Z,uBACpBF,EAAM9Y,SAAWvH,KAAKiD,KAClBjD,KAAKQ,IAAK6f,EAAMY,gBAAgB5Z,EAAIgZ,EAAMG,cAAcnZ,EAAI,GAC1DrH,KAAKQ,IAAK6f,EAAMY,gBAAgB3Z,EAAI+Y,EAAMG,cAAclZ,EAAI,IAChEiC,QAAQ,KAIlB2X,gBAAiB,SAAUpZ,GACvB,GAAIuN,GAAUvN,EAAEnB,KAAK0O,OACrB,KAAKA,EAAQ1O,KAAKqZ,UAAY3K,EAAQyI,IAAImC,SAAW5K,EAAQ6K,QAAQC,SAAS,UAAW,OAAO,CAChG,IAAIL,GAAczK,EAAQ1O,KAAKmZ,YAC3B7X,EAAUoX,OAAOe,wBAAwB5N,IAAK1K,EAAE2X,QAAU,eAAiB3X,EAAE2X,KACjF,IAAqB,IAAjB3X,EAAEnB,KAAKgJ,QAAe,IAAS0F,EAAQ1O,KAAKwa,UAAW,CACvD,GAAIC,GAAOC,OAAOC,aAAaxZ,EAAE2X,OAAS3X,EAAEG,QAC5CH,GAAEE,iBACFqN,EAAQ6K,QAAQqB,QAAQnY,QAAQ,qBAC5BoJ,IAAK1K,EAAE2X,OAAS3X,EAAEG,QAClBA,QAASA,EACTmZ,KAAMA,IAIO,IAAjBtZ,EAAEnB,KAAKgJ,QAAe,IAAU0F,EAAQ1O,KAAKwa,YACxB,IAAjBrZ,EAAEnB,KAAKgJ,QACH,IAAOgQ,EAAEW,QAAQF,wBAAwB5N,IAAIvK,GAAU6X,KACvDA,EAAYrX,KAAK2X,wBAAwB5N,IAAIvK,IACzCoN,EAAQ1O,KAAK4Z,uBACblL,EAAQ1O,KAAK8Z,YAAc3Y,EAAEoB,aAGjCqW,YAAYzX,GAAG,IAAUuN,EAAQ1O,KAAK+Z,aACtC5Y,EAAEE,oBAGFuX,YAAYzX,IAAMuN,EAAQ1O,KAAK+Z,aAC/B5Y,EAAEE,iBAGN8X,EAAYxW,OACRwW,EAAY7P,QAAQmQ,wBAAwB5N,IAAIvK,IAAW,IAInEoN,EAAQ6K,QAAQ9W,QAAyB,IAAjBtB,EAAEnB,KAAKgJ,MAC3B,kBAAoB,iBAAkB1H,QAASA,EAASuK,IAAK1K,EAAE2X,OAAS3X,EAAEG,WAI7D,IAAjBH,EAAEnB,KAAKgJ,QAAe,IAAS0F,EAAQ1O,KAAKwa,WAC5C9L,EAAQ6K,QAAQ9W,QAAyB,IAAjBtB,EAAEnB,KAAKgJ,MAC3B,kBAAoB,iBAAkB1H,QAASA,EAASuK,IAAK1K,EAAE2X,OAAS3X,EAAEG,WAKtFuZ,WAAY,SAAU1Z,GAClB,GAAIuN,GAAUvN,EAAEnB,KAAK0O,OACrB,KAAKA,EAAQ1O,KAAKqZ,UAAY3K,EAAQyI,IAAImC,SAAW5K,EAAQyI,IAAIoC,QAAQC,SAAS,UAAW,OAAO,CACpG,IAAIL,GAAczK,EAAQ1O,KAAKmZ,YAC3B7X,EAAUoX,OAAOe,wBAAwB5N,IAAK1K,EAAE2X,MAAQ,IAAM,eAAiB3X,EAAE2X,MACjFgC,EAAQ3Z,EAAE+Y,cAAca,QAAQ,IAAM5Z,EAAE+Y,cAAcc,eAAe,GACrEtB,EAAQhL,EAAQ1O,KAAK0Z,KAEJ,KAAjBvY,EAAEnB,KAAKgJ,QACH,IAAOgQ,EAAEW,QAAQF,wBAAwB5N,IAAIvK,GAAU6X,KACvDA,EAAYrX,KAAK2X,wBAAwB5N,IAAIvK,IACzCoN,EAAQ1O,KAAK4Z,uBACbF,EAAMG,cAAcnZ,EAAIoa,EAAM7Y,MAC9ByX,EAAMG,cAAclZ,EAAIma,EAAM5Y,MAC9BwX,EAAM9Y,SAAW,EAEjB8N,EAAQ1O,KAAK8Z,YAAc3Y,EAAEoB,aAGjCqW,YAAYzX,GAAG,IAAUuN,EAAQ1O,KAAK+Z,aACtC5Y,EAAEE,oBAGFuX,YAAYzX,IAAMuN,EAAQ1O,KAAK+Z,aAC/B5Y,EAAEE,iBAGFqN,EAAQ1O,KAAK4Z,uBACbF,EAAMM,iBAAmBN,EAAM9Y,SAC/B8Y,EAAMG,cAAcnZ,EAAI,EACxBgZ,EAAMG,cAAclZ,EAAI,GAG5BwY,EAAYxW,OACRwW,EAAY7P,QAAQmQ,wBAAwB5N,IAAIvK,IAAW,IAInEoN,EAAQ6K,QAAQ9W,QAAyB,IAAjBtB,EAAEnB,KAAKgJ,MAC3B,eAAiB,cAAe1H,QAASA,KAIjD2Z,YAAa,SAAU9Z,GACnB,GAAI2Z,GAAQ3Z,EAAE+Y,cAAca,QAAQ,IAAM5Z,EAAE+Y,cAAcc,eAAe,GACrEtB,EAAQvY,EAAEnB,KAAK0O,QAAQ1O,KAAK0Z,KAEhCA,GAAMY,gBAAgB5Z,EAAIoa,EAAM7Y,MAAMW,QAAQ,GAC9C8W,EAAMY,gBAAgB3Z,EAAIma,EAAM5Y,MAAMU,QAAQ,GAE1CzB,EAAEnB,KAAK0O,QAAQ1O,KAAK4Z,uBACpBF,EAAM9Y,SAAWvH,KAAKiD,KAClBjD,KAAKQ,IAAK6f,EAAMY,gBAAgB5Z,EAAIgZ,EAAMG,cAAcnZ,EAAI,GAC1DrH,KAAKQ,IAAK6f,EAAMY,gBAAgB3Z,EAAI+Y,EAAMG,cAAclZ,EAAI,IAChEiC,QAAQ,MAQlBsY,WAAa,SAAUxM,GACvB,GAAIyM,GAAW,SAAWzM,EAAQxN,GAAK,GAEvC8X,GAAE1Y,UAAU4I,GAAG,cAAeiS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cAC7EJ,EAAE1Y,UAAU4I,GAAG,YAAaiS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cAC3EJ,EAAE1Y,UAAU4I,GAAG,UAAWiS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cACzEJ,EAAE1Y,UAAU4I,GAAG,aAAciS,GAAWzM,QAASA,GAAUlM,OAAOyX,cAClEjB,EAAE1Y,UAAU4I,GAAG,YAAaiS,GAAWzM,QAASA,GAAUlM,OAAO6X,aAEjErB,EAAE1Y,UAAU4I,GAAG,UAAW,MAAOwF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBACrEvB,EAAE1Y,UAAU4I,GAAG,QAAS,MAAOwF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBACnEvB,EAAE1Y,UAAU4I,GAAG,WAAY,MAAOwF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBAEtEvB,EAAE1Y,UAAU4I,GAAG,aAAciS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAOqY,YAC5E7B,EAAE1Y,UAAU4I,GAAG,WAAYiS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAOqY,YAC1E7B,EAAE1Y,UAAU4I,GAAG,aAAciS,GAAWzM,QAASA,GAAUlM,OAAOyY,cAMlEG,aAAe,SAAU1M,GACzB,GAAIyM,GAAW,SAAWzM,EAAQxN,GAAK,GAEvC8X,GAAE1Y,UAAU6I,IAAI,cAAegS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cAC9EJ,EAAE1Y,UAAU6I,IAAI,YAAagS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cAC5EJ,EAAE1Y,UAAU6I,IAAI,UAAWgS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAO4W,cAC1EJ,EAAE1Y,UAAU6I,IAAI,aAAcgS,GAAWzM,QAASA,GAAUlM,OAAOyX,cACnEjB,EAAE1Y,UAAU6I,IAAI,YAAagS,GAAWzM,QAASA,GAAUlM,OAAO6X,aAElErB,EAAE1Y,UAAU6I,IAAI,UAAW,MAAOuF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBACtEvB,EAAE1Y,UAAU6I,IAAI,QAAS,MAAOuF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBACpEvB,EAAE1Y,UAAU6I,IAAI,WAAY,MAAOuF,QAASA,EAAS1F,MAAO,GAAIxG,OAAO+X,iBAEvEvB,EAAE1Y,UAAU6I,IAAI,aAAcgS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAOqY,YAC7E7B,EAAE1Y,UAAU6I,IAAI,WAAYgS,GAAWzM,QAASA,EAAS1F,MAAO,GAAIxG,OAAOqY,YAC3E7B,EAAE1Y,UAAU6I,IAAI,aAAcgS,GAAWzM,QAASA,GAAUlM,OAAOyY,cAQnEI,aAAe,SAAU3M,EAAS4M,GAClC,OAAK5M,EAAQ1O,KAAK4Z,uBAEd0B,QAASA,EACTtV,KAAMmK,KAAK/H,MAAQsG,EAAQ1O,KAAK8Z,cAwBnBL,wBAAAA,WACjB,QAAAA,GAAYtC,GAAKnY,gBAAAC,KAAAwa,GACbxa,KAAKkY,IAAMA,EAGXlY,KAAKiC,GAAKiW,EAAInX,KAAKkB,GAGnBjC,KAAKsa,QAAUpC,EAAIoC,QAEnBta,KAAKe,MACD0Z,OACIG,eACInZ,EAAG,EACHC,EAAG,GAEP2Z,iBACI5Z,EAAG,EACHC,EAAG,GAEPqZ,iBAAkB,EAClBpZ,SAAU,GAEdyJ,UACItD,UACIrG,EAAG,EACHC,EAAG,IAGX0Y,SAAS,EACTO,sBAAsB,EACtBT,YAAa,GAAAvN,YAAA/O,QACb2d,WAAW,EACXV,YAAa,EACbC,YAAY,EAEZ3Z,QACIiZ,SAAS,EACTtZ,MAAO,SAIfd,KAAK8Z,QAEDwC,aAAc9B,EAAwB5N,IAAI2P,SAAU/B,EAAwB5N,IAAI4P,SAAU,sFAa9F,OALKxc,KAAKe,KAAKqZ,SAAWhZ,OAAOqb,UAAUC,aACvCT,WAAWjc,MAEXA,KAAKe,KAAKqZ,SAAU,GAEjBpa,sCAOP,IAAKA,KAAKe,KAAKqZ,QAAS,OAAO,CAE/B,IAAIuC,GAAK3c,KAAKkY,IAAI0E,MAAMC,OAAOC,YAAc9c,KAAKkY,IAAI0E,MAAM7b,KAAKgc,MAC7DC,EAAKhd,KAAKkY,IAAI0E,MAAMC,OAAOI,aAAejd,KAAKkY,IAAI0E,MAAM7b,KAAKmc,OAC9Dzb,EAAIzB,KAAKe,KAAK0Z,MAAMY,gBAAgB5Z,EAAIkb,EACxCjb,EAAI1B,KAAKe,KAAK0Z,MAAMY,gBAAgB3Z,EAAIsb,EAExClR,EAAS9L,KAAKsa,QAAQxO,QAI1B,OAFA9L,MAAKe,KAAKqK,SAAS3J,EAAIzB,KAAKkY,IAAI0E,MAAMxR,SAAS3J,EAAIA,EAAIqK,EAAOqR,KAC9Dnd,KAAKe,KAAKqK,SAAS1J,EAAI1B,KAAKkY,IAAI0E,MAAMxR,SAAS1J,EAAIA,EAAIoK,EAAOsR,KACvD,kCAQP,MADApd,MAAKe,KAAKmZ,YAAYjgB,OAAS,EACxB+F,qCAOP,MAAOA,8CAOP,GAAIqd,GAAard,KAAKe,KAAKmZ,WAM3B,QALI,IAAOH,EAAEW,QAAQF,EAAwB5N,IAAI0Q,gBAAiBD,GAC9D9Z,OAAO4X,iBAAiBkC,EAAY7C,EAAwB5N,IAAI0Q,kBACzD,IAAOvD,EAAEW,QAAQF,EAAwB5N,IAAI2Q,kBAAmBF,IACvE9Z,OAAO4X,iBAAiBkC,EAAY7C,EAAwB5N,IAAI2Q,mBAE7Dvd,sCAWP,MAJKA,MAAKe,KAAKqZ,UAEXpa,KAAKe,KAAKqZ,SAAU,GAEjBpa,uCAWP,MAJIA,MAAKe,KAAKqZ,UAEVpa,KAAKe,KAAKqZ,SAAU,GAEjBpa,kCAONwd,GACD,GAAIC,GAAYC,KAAKC,UAAU3d,KAAK8Z,OAEpC,OADA9Z,MAAK8Z,OAAS4D,KAAKE,MAAMJ,GAClBC,iCAOP,MAAOC,MAAKC,UAAU3d,KAAK8Z,wCASvB+D,GAEJ,MADA7d,MAAK8Z,OAASC,EAAE9T,QAAO,KAAUjG,KAAK8Z,OAAQ+D,GACvC7d,oDAOP,MAAKA,MAAKe,KAAK4Z,sBACPmD,QAAS9d,KAAKe,KAAK0Z,MAAM9Y,SAAUoc,SAAU/d,KAAKe,KAAK0Z,MAAMM,kBADzB,8CAS5BsB,GAChB,MAAItC,GAAEC,QAAQqC,GACNA,EAAQpiB,SAAW+F,KAAKe,KAAKmZ,YAAYjgB,SAElC+F,KAAKe,KAAKmZ,YAAY1C,OAAO6E,IACpCrc,KAAKkb,gBACEkB,aAAapc,KAAMqc,KAE9Brc,KAAKkb,iBACE,KAGPvQ,MAAM0R,MACN,IAAOrc,KAAKe,KAAKmZ,YAAY7P,QAAQgS,IACrCrc,KAAKkb,gBACEkB,aAAapc,KAAMqc,KAE9Brc,KAAKkb,iBACE,+CAOQtO,GACf,GAAyB7Q,SAArBiE,KAAK8Z,OAAOlN,GAAoB,OAAO,CAC3C,IAAIyP,GAAUrc,KAAK8Z,OAAOlN,GAAK,EAE/B,OAAO5M,MAAKge,oBAAoB3B,yCAIhC,MAAO,IAAA7O,YAAA5P,QAAaoC,KAAKe,KAAKqK,SAAS3J,EAAI,GAAKzB,KAAKe,KAAKqK,SAAS1J,EAAI,yCAe9Duc,GAET,MADAje,MAAKe,KAAKwa,YAAc0C,EACjBje,2CAOP,QAASA,KAAKe,KAAKwa,iDASRza,GAGX,MAFAd,MAAKe,KAAKI,OAAOL,MAAQ,QAAUA,EAAQ,WAC3CiZ,EAAE/Z,KAAKsa,SAAS4D,IAAI,SAAUle,KAAKe,KAAKI,OAAOL,OACxCd,0CAOEme,GAaT,MAZepiB,UAAXoiB,EACAne,KAAKe,KAAKI,OAAOgd,SAAWA,EAE5Bne,KAAKe,KAAKI,OAAOgd,QAAUne,KAAKe,KAAKI,OAAOgd,OAG3Cne,KAAKe,KAAKI,OAAOgd,OAIlBpE,EAAE/Z,KAAKsa,SAAS4D,IAAI,SAAUle,KAAKe,KAAKI,OAAOL,QAH/Cd,KAAKe,KAAKI,OAAOL,MAAQiZ,EAAE/Z,KAAKkY,IAAIoC,SAAS4D,IAAI,UACjDnE,EAAE/Z,KAAKsa,SAAS4D,IAAI,SAAU,SAI3Ble,+CAOP,QAASA,KAAKe,KAAKI,OAAOgd,sCAzQb3D,wBAAAA,wCAqRb4D,eAAgB,EAChBC,iBAAkB,EAClBC,gBAAiB,EAEjBhB,gBAAiB,EACjBC,kBAAmB,EAEnBgB,cAAe,EACfC,QAAS,EACTC,UAAW,GACXC,UAAW,GACXnC,SAAU,GACVoC,QAAS,GACTC,UAAW,GACXC,UAAW,GACXC,cAAe,GACfC,WAAY,GACZC,cAAe,GACfC,YAAa,GACbC,cAAe,GACfC,QAAS,GACTC,SAAU,GACVC,eAAgB,GAChBC,aAAc,GACdC,gBAAiB,GACjBC,eAAgB,GAChBC,WAAY,GACZC,WAAY,GACZC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,oBAAqB,GACrBC,qBAAsB,GACtBC,eAAgB,GAChBC,aAAc,GACdC,aAAc,GACdC,aAAc,GACdC,aAAc,GACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,QAAS,IACTC,aAAc,IACdC,kBAAmB,IACnBC,WAAY,IACZC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,QAAS,IACTlH,QAAS,IACTmH,QAAS,IACTC,aAAc,IACdC,gBAAiB,IACjBC,eAAgB,IAChBC,eAAgB,IAChBC,UAAW,IACXC,SAAU,IACVC,WAAY,IACZC,kBAAmB,IACnBC,iBAAkB,IAClBC,iBAAkB,IAClBC,eAAgB,IAChBC,kBAAmB,IACnBC,iBAAkB,IAClBC,iBAAkB,IAClBC,kBAAmB,uBAjYNlK,4aCzTjB4D,eAAgB,EAChBC,iBAAkB,EAClBC,gBAAiB,EAEjBhB,gBAAiB,EACjBC,kBAAmB,EAEnBgB,cAAe,EACfC,QAAS,EACTC,UAAW,GACXC,UAAW,GACXnC,SAAU,GACVoC,QAAS,GACTC,UAAW,GACXC,UAAW,GACXC,cAAe,GACfC,WAAY,GACZC,cAAe,GACfC,YAAa,GACbC,cAAe,GACfC,QAAS,GACTC,SAAU,GACVC,eAAgB,GAChBC,aAAc,GACdC,gBAAiB,GACjBC,eAAgB,GAChBC,WAAY,GACZC,WAAY,GACZC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,MAAO,GACPC,oBAAqB,GACrBC,qBAAsB,GACtBC,eAAgB,GAChBC,aAAc,GACdC,aAAc,GACdC,aAAc,GACdC,aAAc,GACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,aAAc,IACdC,QAAS,IACTC,aAAc,IACdC,kBAAmB,IACnBC,WAAY,IACZC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,OAAQ,IACRC,QAAS,IACTlH,QAAS,IACTmH,QAAS,IACTC,aAAc,IACdC,gBAAiB,IACjBC,eAAgB,IAChBC,eAAgB,IAChBC,UAAW,IACXC,SAAU,IACVC,WAAY,IACZC,kBAAmB,IACnBC,iBAAkB,IAClBC,iBAAkB,IAClBC,eAAgB,IAChBC,kBAAmB,IACnBC,iBAAkB,IAClBC,iBAAkB,IAClBC,kBAAmB,IAGnBC,YAAa,IACbC,YAAa,IACbC,YAAa,IACbC,YAAa,IACbC,YAAa,IACbC,YAAa,IACbC,YAAa,IACbC,aAAc;88CC1GGC,EAAAA,SAAAA,GA4BjB,QAAAA,KAAcplB,EAAAC,KAAAmlB,EAAA,IAAAtkB,GAAAZ,EAAAD,MAAAmlB,EAAAjlB,WAAAC,OAAAC,eAAA+kB,IAAA9kB,KAAAL,MAAA,OAAAG,QAAA0B,eAAAhB,EAAA,aAAAiB,YAAA,EAAAC,UAAA,EAAAC,OAjBVojB,SAAAA,EAAAA,QACAC,SAAAA,EAAAA,QACAC,MAAAA,EAAAA,QACAC,MAAAA,EAAAA,WAcUplB,OAAA0B,eAAAhB,EAAA,OAAAiB,YAAA,EAAAC,UAAA,EAAAC,MA0IRmjB,EAAaK,MAvIf3kB,EAAKuB,gBAAiB,EACtBvB,EAAKN,MACLM,EAAKK,SACDC,OAAQ,QAGZN,EAAKI,SAELJ,EAAKE,QAELF,EAAK4kB,YAEDnJ,aAAc6I,EAAaK,IAAIjJ,SAAU4I,EAAaK,IAAIhJ,SAAU,kCAf9D3b,2DAoBV,IAAK,GAAI1G,GAAI,EAAGA,EAAI6F,KAAKO,GAAGtG,OAAQE,IAChC,GAAI6F,KAAKO,GAAGpG,GAAGgkB,YAAa,EAAO,OAAO,4CAK9C,IAAK,GAAIhkB,GAAI,EAAGA,EAAI6F,KAAKO,GAAGtG,OAAQE,IAChC,GAAI6F,KAAKO,GAAGpG,GAAGurB,aAAc,EAAO,OAAO,mCAK/C,IAAK1lB,KAAKmC,UAAW,OAAO,CAC5B,KAAK,GAAIhI,GAAI,EAAGA,EAAI6F,KAAKO,GAAGtG,OAAQE,IAChC,GAAI6F,KAAKO,GAAGpG,GAAGmQ,YAAa,EAAO,OAAO,CAE9C,QAAO,kCAIP,IAAKtK,KAAKmC,UAAW,OAAO,CAC5B,KAAK,GAAIhI,GAAI,EAAGA,EAAI6F,KAAKO,GAAGtG,OAAQE,IAChC,GAAI6F,KAAKO,GAAGpG,GAAGwrB,WAAY,EAAO,OAAO,CAE7C,QAAO,+BAGNC,GACD,GAAIC,GAAgBnI,KAAKC,UAAU3d,KAAKylB,WAExC,OADAzlB,MAAKylB,WAAa/H,KAAKE,MAAMgI,GACtBC,iCAIP,MAAOnI,MAAKC,UAAU3d,KAAKylB,wDAYXpJ,GAChB,MAAuB,YAAnB,mBAAOA,GAAP,YAAA/V,EAAO+V,KAAwBA,YAAmB/T,QAC9C+T,EAAQpiB,SAAW+F,KAAKe,KAAK2B,KAAKC,SAAS1I,QAA/C,IAOA0Q,MAAM0R,MACN,IAAOrc,KAAKe,KAAK2B,KAAKC,SAAS0H,QAAQgS,IAChC8I,EAAaW,cAAc9lB,KAAMqc,+CAK7BzP,GACf,MAA6B7Q,UAAzBiE,KAAKylB,WAAW7Y,IACb5M,KAAKge,oBAAoBhe,KAAKylB,WAAW7Y,GAAK,oCAGjDiR,GAEJ,MAAO7d,mCAGN+lB,EAAcC,EAAI9kB,GA0BnB,MAzBA+kB,GAAAroB,QAAQ6C,UAAUylB,KAAK7lB,KAAKL,KAAM+lB,GAClBhqB,SAAZmF,GAAqC,OAAZA,GAAuC,YAAnB,mBAAOA,GAAP,YAAAoF,EAAOpF,MACpDlB,KAAKkB,QAAUA,GAERnF,SAAPiqB,GAA2B,OAAPA,GAA6B,YAAd,mBAAOA,GAAP,YAAA1f,EAAO0f,KAAmBA,YAAc1d,SAC3EtI,KAAKO,MACLylB,EAAGG,IAAI,SAAUC,GACb,GAAsB,gBAAXA,IAAiErqB,SAA1CopB,EAAa5kB,GAAG6lB,EAAOC,gBAIrD,GAHAD,EAAS,IAAKpmB,KAAKsmB,UAAUF,EAAOC,gBACpCrmB,KAAKO,GAAG6lB,EAAOtb,YAAcsb,EAC7BpmB,KAAKO,GAAGsC,KAAKujB,GACTpmB,KAAKO,GAAG6lB,GAAQF,KAAKlmB,SAAU,EAC/B,KAAM,IAAIM,OAAM,kBAAoB8lB,EAAS,yBAE9C,CAAA,KAAsB,YAAlB,mBAAOA,GAAP,YAAA9f,EAAO8f,KAAuBA,YAAAA,GAAAA,SAOrC,KAAM,IAAI9lB,OAAM,6BAA+B8lB,EAAOtb,WAAa,0BAJnE,IAFA9K,KAAKO,GAAG6lB,EAAOtb,YAAcsb,EAC7BpmB,KAAKO,GAAGsC,KAAKujB,GACTpmB,KAAKO,GAAG6lB,EAAOtb,YAAYob,KAAKlmB,SAAU,EAC1C,KAAM,IAAIM,OAAM,kBAAoB8lB,EAAS,uBAKvDtiB,KAAK9D,QAEJA,sCAMP,MAFAimB,GAAAroB,QAAQ6C,UAAU0d,OAAO9d,KAAKL,MAC9BA,KAAKumB,gBACEvmB,uCAMP,MAFAimB,GAAAroB,QAAQ6C,UAAUilB,QAAQrlB,KAAKL,MAC/BA,KAAKwmB,kBACExmB,oCAGJymB,GAEH,MADAR,GAAAroB,QAAQ6C,UAAUe,OAAOnB,KAAKL,KAAMymB,GAC7BzmB,6CA5EUyP,EAAS4M,GAC1B,OACIA,QAASA,EACTtV,KAAM0I,EAAQxO,MAAMyB,KAAKS,YAAYkZ,EAAQ,6CA1FpC8I,EAAAA,yEAAAA,EAAAA,uCAIbC,SAAU,WACVC,SAAU,WACVC,MAAO,QACPC,MAAO,iCAPMJ,EAAAA,yEAAAA,EAAAA,+CAmBIA,EAAa1kB,UAAU6B,aACxCC,WAAY,SAAU2F,GAClB,MAAOid,GAAaK,IAAItd,IAAU,eAAiBA,GAEvDwe,aAAc,SAAUrkB,GACpB,MAAO8iB,GAAaK,IAAInjB,IAAY,gBAxB3B8iB,4jCCCAwB,EAAAA,SAAAA,GACjB,QAAAA,GAAYC,GAAS7mB,EAAAC,KAAA2mB,EAAA,IAAA9lB,GAAAZ,EAAAD,MAAA2mB,EAAAzmB,WAAAC,OAAAC,eAAAumB,IAAAtmB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJ8lB,4iCCAAE,EAAAA,SAAAA,GACjB,QAAAA,GAAYD,GAAS7mB,EAAAC,KAAA6mB,EAAA,IAAAhmB,GAAAZ,EAAAD,MAAA6mB,EAAA3mB,WAAAC,OAAAC,eAAAymB,IAAAxmB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJgmB,wiCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYF,GAAS7mB,EAAAC,KAAA8mB,EAAA,IAAAjmB,GAAAZ,EAAAD,MAAA8mB,EAAA5mB,WAAAC,OAAAC,eAAA0mB,IAAAzmB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJimB,kjCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYH,GAAS7mB,EAAAC,KAAA+mB,EAAA,IAAAlmB,GAAAZ,EAAAD,MAAA+mB,EAAA7mB,WAAAC,OAAAC,eAAA2mB,IAAA1mB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJkmB,ojCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYJ,GAAS7mB,EAAAC,KAAAgnB,EAAA,IAAAnmB,GAAAZ,EAAAD,MAAAgnB,EAAA9mB,WAAAC,OAAAC,eAAA4mB,IAAA3mB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJmmB,wiCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYL,GAAS7mB,EAAAC,KAAAinB,EAAA,IAAApmB,GAAAZ,EAAAD,MAAAinB,EAAA/mB,WAAAC,OAAAC,eAAA6mB,IAAA5mB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJomB,0iCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYN,GAAS7mB,EAAAC,KAAAknB,EAAA,IAAArmB,GAAAZ,EAAAD,MAAAknB,EAAAhnB,WAAAC,OAAAC,eAAA8mB,IAAA7mB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJqmB,4jCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYP,GAAS7mB,EAAAC,KAAAmnB,EAAA,IAAAtmB,GAAAZ,EAAAD,MAAAmnB,EAAAjnB,WAAAC,OAAAC,eAAA+mB,IAAA9mB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJsmB,+sCCFAC,GAAAA,SAAAA,GACjB,QAAAA,GAAYR,GAAS7mB,EAAAC,KAAAonB,EAAA,IAAAvmB,GAAAZ,EAAAD,MAAAonB,EAAAlnB,WAAAC,OAAAC,eAAAgnB,IAAA/mB,KAAAL,KACX4mB,GADW,OAEjB/lB,GAAK+lB,QAAUA,EAMf/lB,EAAKiK,SAAW,WACZ,MAAO9K,MAAK4mB,SATC/lB,qBADcP,kBAAlB8mB,wjCCEAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYT,GAAS7mB,EAAAC,KAAAqnB,EAAA,IAAAxmB,GAAAZ,EAAAD,MAAAqnB,EAAAnnB,WAAAC,OAAAC,eAAAinB,IAAAhnB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJwmB,4jCCAAC,EAAAA,SAAAA,GACjB,QAAAA,GAAYV,GAAS7mB,EAAAC,KAAAsnB,EAAA,IAAAzmB,GAAAZ,EAAAD,MAAAsnB,EAAApnB,WAAAC,OAAAC,eAAAknB,IAAAjnB,KAAAL,KACX4mB,GADW,OAAAzmB,QAAA0B,eAAAhB,EAAA,YAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAQV,WACP,MAAOhC,MAAK4mB,WATK/lB,wCADJymB,8yCCRAC,EAAAA,SAAAA,GAIjB,QAAAA,KAAcxnB,EAAAC,KAAAunB,EAAA,IAAA1mB,GAAAZ,EAAAD,MAAAunB,EAAArnB,WAAAC,OAAAC,eAAAmnB,IAAAlnB,KAAAL,MAAA,OAAAG,QAAA0B,eAAAhB,EAAA,UAAAiB,YAAA,EAAAC,UAAA,EAAAC,WAAA7B,OAAA0B,eAAAhB,EAAA,SAAAiB,YAAA,EAAAC,UAAA,EAAAC,WAEVnB,EAAKuJ,QAFKvJ,8CASXqW,EAAWlN,GACV,GAA+BjO,SAA3BiE,KAAKuD,OAAO2T,GAA0B,CACtC,GAAIE,GAAQpX,KAAKuD,OAAO2T,EACpBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAMvU,KAAKmH,OAGfhK,MAAKuD,OAAO2T,MACZlX,KAAKuD,OAAO2T,GAAWrU,KAAKmH,EAEhC,OAAOhK,mCAONkX,EAAWlN,GACZ,GAA8BjO,SAA1BiE,KAAKmX,MAAMD,GAA0B,CACrC,GAAIE,GAAQpX,KAAKmX,MAAMD,EACnBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAMvU,KAAKmH,OAGfhK,MAAKmX,MAAMD,MACXlX,KAAKmX,MAAMD,GAAWrU,KAAKmH,EAE/B,OAAOhK,kCAOPkX,EAAWlN,GACX,GAA8BjO,SAA1BiE,KAAKmX,MAAMD,GAA0B,CACrC,GAAIE,GAAQpX,KAAKuD,OAAO2T,EACpBE,GAAM/M,QAAQL,MAAc,GAC5BoN,EAAM1T,OAAO0T,EAAM/M,QAAQL,IAGnC,MAAOhK,sCAOHkX,EAAWnW,GACf,GAAIqW,GAAOjd,EAAGyN,CAEd,IAA8B7L,SAA1BiE,KAAKmX,MAAMD,GAA0B,CAErC,IADAE,EAAQpX,KAAKmX,MAAMD,GACd/c,EAAI,EAAGA,EAAIid,EAAMnd,OAAQE,IAE1B,GADAyN,EAASwP,EAAMjd,GAAGkG,KAAK+W,EAAMjd,GAAI4G,GACX,iBAAX6G,KAAyBA,EAAQ,MAAO5H,KAEvDA,MAAKoK,MAAM8M,GAGf,GAA+Bnb,SAA3BiE,KAAKuD,OAAO2T,GAEZ,IADAE,EAAQpX,KAAKuD,OAAO2T,GACf/c,EAAI,EAAGA,EAAIid,EAAMnd,OAAQE,IAE1B,GADAyN,EAASwP,EAAMjd,GAAGkG,KAAK+W,EAAMjd,GAAI4G,GACX,iBAAX6G,KAAyBA,EAAQ,MAAO5H,KAG3D,OAAOA,oCAMLkX,GAYF,MAXkBnb,UAAdmb,GAC+Bnb,SAA3BiE,KAAKuD,OAAO2T,KACZlX,KAAKuD,OAAO2T,OAEcnb,SAA1BiE,KAAKmX,MAAMD,KACXlX,KAAKmX,MAAMD,SAGflX,KAAKmX,SACLnX,KAAKuD,WAEFvD,kCAGN+lB,GAED,MADAE,GAAAroB,QAAQ6C,UAAUylB,KAAK7lB,KAAKL,KAAM+lB,GAC3B/lB,sCAKP,MADAimB,GAAAroB,QAAQ6C,UAAU0d,OAAO9d,KAAKL,MACvBA,uCAKP,MADAimB,GAAAroB,QAAQ6C,UAAUilB,QAAQrlB,KAAKL,MACxBA,oCAGJymB,GAEH,MADAR,GAAAroB,QAAQ6C,UAAUe,OAAOnB,KAAKL,KAAMymB,GAC7BzmB,iCAtHMunB,2rCCGjBC,EAAiB,SAAUra,EAAQ/B,GACnC,GAAIrK,IACA+K,QAASrK,EAAG,EAAGC,EAAG,GAClB2K,MAAO5K,EAAG,EAAGC,EAAG,GAChB4K,MAAO,EACPZ,MAAON,EAASM,MAUpB,OAPA3K,GAAK+K,OAAOrK,EAAI0L,EAAOsa,QAAUrc,EAASU,OAAOrK,EACjDV,EAAK+K,OAAOpK,EAAIyL,EAAOua,QAAUtc,EAASU,OAAOpK,EAEjDX,EAAKsL,KAAK5K,EAAK0L,EAAO1L,EAAI2J,EAASiB,KAAK5K,EAAK0L,EAAO1L,EAAI2J,EAASiB,KAAK5K,EACtEV,EAAKsL,KAAK3K,EAAKyL,EAAOzL,EAAI0J,EAASiB,KAAK3K,EAAKyL,EAAOzL,EAAI0J,EAASiB,KAAK3K,EAEtEX,EAAKuL,MAAQlB,EAASkB,QAAWa,EAAO1L,EAAI2J,EAASiB,KAAK5K,EAAM0L,EAAOzL,EAAI0J,EAASiB,KAAK3K,GAAM,GACxFX,GAeU4mB,EAAAA,WACjB,QAAAA,KAAc5nB,EAAAC,KAAA2nB,GAEV3nB,KAAK4nB,QAAU,GAAAjb,GAAA/O,QAGfoC,KAAK6nB,OAAS,oBAGd7nB,KAAKmN,QACD1L,EAAG,EACHC,EAAG,EACH+lB,QAAS,EACTC,QAAS,GAGb1nB,KAAKkmB,MAAO,EAEZlmB,KAAKe,MACD+K,QAASrK,EAAG,EAAKC,EAAG,GACpB2K,MAAO5K,EAAG,EAAKC,EAAG,GAClB4K,MAAO,EACPZ,MAAO,+CAQL3K,GACN,GAAmB,WAAf,mBAAOA,GAAP,YAAAuF,EAAOvF,IAAkB,CACzB,GAAIA,YAAgBuH,QAAwB,GAAfvH,EAAK9G,OAO9B,MANA+F,MAAKmN,QACD1L,EAAGV,EAAK,GACRW,EAAGX,EAAK,GACR0mB,QAASznB,KAAKmN,OAAOsa,QACrBC,QAAS1nB,KAAKmN,OAAOua,SAElB1nB,IAEIjE,UAAXgF,EAAKU,GAA8B1F,SAAXgF,EAAKW,IAC7B1B,KAAKmN,QACD1L,EAAGV,EAAKU,EACRC,EAAGX,EAAKW,EACR+lB,QAASznB,KAAKmN,OAAOsa,QACrBC,QAAS1nB,KAAKmN,OAAOua,UAIjC,MAAO1nB,wCAODe,GACN,GAAmB,WAAf,mBAAOA,GAAP,YAAAuF,EAAOvF,IAAkB,CACzB,GAAIA,YAAgBuH,QAAwB,GAAfvH,EAAK9G,OAO9B,MANA+F,MAAKmN,QACD1L,EAAGzB,KAAKmN,OAAO1L,EACfC,EAAG1B,KAAKmN,OAAOzL,EACf+lB,QAAS1mB,EAAK,GACd2mB,QAAS3mB,EAAK,IAEXf,IAEIjE,UAAXgF,EAAKU,GAA8B1F,SAAXgF,EAAKW,IAC7B1B,KAAKmN,QACD1L,EAAGzB,KAAKmN,OAAO1L,EACfC,EAAG1B,KAAKmN,OAAOzL,EACf+lB,QAAS1mB,EAAKU,EACdimB,QAAS3mB,EAAKW,IAI1B,MAAO1B,wCAQD4M,EAAKzG,GACX,GAAIA,YAAAA,GAAAA,QAEA,MADAnG,MAAK4nB,QAAQne,IAAImD,EAAKzG,GACfnG,0CASF4M,GAWT,MAVA5M,MAAK4nB,QAAQje,OAAOiD,GAChB5M,KAAK6nB,QAAUjb,IACf5M,KAAK6nB,OAAS,oBACd7nB,KAAKe,MACD+K,QAASrK,EAAG,EAAKC,EAAG,GACpB2K,MAAO5K,EAAG,EAAKC,EAAG,GAClB4K,MAAO,EACPZ,MAAO,IAGR1L,4CAOI4M,GAIX,MAH0B7Q,UAAtBiE,KAAK4nB,QAAQhb,IAAsB5M,KAAK4nB,QAAQhb,YAAbkb,GAAAlqB,UACnCoC,KAAKe,KAAOf,KAAK4nB,QAAQhb,GAAKmb,kBAAkB/nB,KAAKmN,OAAQqa,IAE1DxnB,yCAUC8L,EAAQO,GAchB,MAbetQ,UAAX+P,GAAyC,WAAjB,mBAAOA,GAAP,YAAAxF,EAAOwF,KAC3BA,YAAAA,GAAAA,UACA9L,KAAKe,KAAK+K,OAASA,EAAO7G,aAIrBlJ,SAATsQ,GAAqC,WAAf,mBAAOA,GAAP,YAAA/F,EAAO+F,KACzBA,YAAAA,GAAAA,UACArM,KAAKe,KAAKsL,KAAOA,EAAKpH,aAI9BjF,KAAKe,KAAOymB,EAAexnB,KAAKmN,OAAQnN,KAAKe,MACtCf,gDAOQoL,GAKf,MAJKpL,MAAKkmB,OACNlmB,KAAKe,KAAOqK,EACZpL,KAAKkmB,MAAO,GAETlmB,2CAOP,MAAOA,MAAKe,wBAlKC4mB,k6BC9BAK,EAAAA,WACjB,QAAAA,KAAcjoB,EAAAC,KAAAgoB,GAEVhoB,KAAKioB,iBAAmB,GAAAC,GAAAtqB,SAAoBqE,GAAI,gBAGhDjC,KAAKmoB,UAGLnoB,KAAKkI,MAAQ,+CASRvH,EAAMsM,EAAQ9G,GAGnB,GAFAxF,EAAOA,GAAQ2M,EAAA1P,QAAK2P,WAEPxR,SAAToK,GAAsBA,YAAAA,GAAAA,QAatB,MAZepK,UAAXkR,GACAA,EAASjN,KAAKkI,MACdlI,KAAKkI,SAEL+E,GAAU,IAGd9G,EAAOA,GAAQ,GAAA+hB,GAAAtqB,SAAoBqE,GAAItB,EAAMsM,OAAQA,IAErDjN,KAAKioB,iBAAiBxe,IAAItD,EAAMxF,GAChCX,KAAKmoB,OAAOlb,GAAU9G,EAEfnG,yCASHW,GAGR,aAFOX,MAAKmoB,OAAOnoB,KAAKioB,iBAAiBpsB,IAAI8E,GAAMsM,QACnDjN,KAAKioB,iBAAiBte,OAAO,KAAMhJ,GAC5BX,sCAOFW,GACL,MAAIX,MAAKioB,iBAAiBG,IAAIznB,GACnBX,KAAKioB,iBAAiBpsB,IAAI8E,GAE9B,uCAQDA,EAAMsM,GAMZ,MALIjN,MAAKioB,iBAAiBG,IAAIznB,WACnBX,MAAKmoB,OAAOnoB,KAAKioB,iBAAiBpsB,IAAI8E,GAAMsM,QACnDjN,KAAKioB,iBAAiBpsB,IAAI8E,GAAMsM,OAASA,EACzCjN,KAAKmoB,OAAOlb,GAAUjN,KAAKioB,iBAAiBpsB,IAAI8E,IAE7CX,wBAvEMgoB,ymCCQAK,EAAAA,WAUjB,QAAAA,GAAYtnB,EAAMunB,GAAevoB,EAAAC,KAAAqoB,GAC7BroB,KAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAUoiB,EAAkBniB,SAAUnF,GACpEf,KAAKyJ,IAAI,GAAA8e,GAAA3qB,SACToC,KAAKsoB,cAAgBA,6CAehBrmB,GACL,MAAWlG,UAAPkG,EAAyBjC,KAAKwoB,aAC9BxoB,KAAKe,KAAK0nB,OAAO/Q,SAASzV,GACnBjC,KAAKe,KAAK0nB,OAAOxmB,GAErB,gDAIP,MAAOjC,MAAKe,KAAK0nB,OAAO5sB,IAAImE,KAAKe,KAAK0nB,OAAOzoB,KAAKe,KAAK2nB,uDAIvD,MAAyC3sB,UAArCiE,KAAKe,KAAK0nB,OAAOzoB,KAAKqG,MAAQ,GACvBrG,KAAKe,KAAK0nB,OAAO5sB,IAAImE,KAAKe,KAAK0nB,OAAOzoB,KAAKqG,MAAQ,IAEvD,0CAIP,MAAOrG,MAAKe,KAAK0nB,OAAO5sB,IAAImE,KAAKe,KAAK0nB,OAAOzoB,KAAKe,KAAKmG,gDAMlDjF,GAOL,MANIjC,MAAKe,KAAK0nB,OAAO/Q,SAASzV,KAC1BjC,KAAKe,KAAK2nB,cAAgB1oB,KAAKe,KAAKmG,aACpClH,KAAKe,KAAKmG,aAAelH,KAAKe,KAAK0nB,OAAOpe,QAAQpI,GAClDjC,KAAKsoB,cAAcrmB,IAGhBjC,4CAUP,MANyCjE,UAArCiE,KAAKe,KAAK0nB,OAAOzoB,KAAKqG,MAAQ,KAC9BrG,KAAKe,KAAK2nB,cAAgB1oB,KAAKe,KAAKmG,aACpClH,KAAKe,KAAKmG,aAAelH,KAAKqG,MAAQ,EACtCrG,KAAKsoB,cAActoB,KAAKe,KAAK0nB,OAAOzoB,KAAKqG,SAGtCrG,gDAIP,GAAkDjE,SAA9CiE,KAAKe,KAAK0nB,OAAOzoB,KAAKe,KAAK2nB,eAA8B,CACzD,GAAIriB,GAAQrG,KAAKe,KAAK2nB,aACtB1oB,MAAKe,KAAK2nB,cAAgB1oB,KAAKe,KAAKmG,aACpClH,KAAKe,KAAKmG,aAAeb,EACzBrG,KAAKsoB,cAActoB,KAAKe,KAAK0nB,OAAOpiB,IAGxC,MAAOrG,kCAOPqG,EAAOpE,GAKP,MAJWlG,UAAPkG,IAAkBA,EAAKoE,EAAMtF,KAAKkB,KACjCjC,KAAKe,KAAK0nB,OAAO/Q,SAASzV,IAAOoE,YAAAA,GAAAA,SAClCrG,KAAKe,KAAK0nB,OAAOhf,IAAIxH,EAAIoE,GAEtBrG,oCAMJiC,GAIH,MAHIjC,MAAKe,KAAK0nB,OAAO/Q,SAASzV,IAC1BjC,KAAKe,KAAK0nB,OAAO9e,OAAO1H,GAErBjC,mCAvFP,MAAOA,MAAKe,KAAKmG,2BAGXlF,GACNhC,KAAKe,KAAKmG,aAAelF,iCArBZqmB,EAAAA,6CAKbK,cAAe,KACfxhB,aAAc,EACduhB,OAAQ,GAAA9b,GAAA/O,qBAPKyqB,+pBCbjBM,kdACAC,EAAc,GAAAjc,GAAA/O,QAAgBirB,EAAY,GAAAlc,GAAA/O,QAC1CwQ,EAAY,EAEZlN,GACA4nB,WAAY,GACZC,UAAU,EACVC,qBAAqB,GAGrBC,EAAyB,WACzB,MAAO7nB,QAAO6nB,uBACV7nB,OAAO8nB,6BACP9nB,OAAO+nB,0BACP/nB,OAAOgoB,wBACPhoB,OAAOioB,yBACN,SAAUrf;AACF9I,EAAQ8nB,oBAUT9nB,EAAQ8nB,qBAAsB,GAT1B5a,GAAaxD,OAAO0e,iBAAmB,IAAGlb,EAAY,GACxC,IAAdA,IAAiBA,EAAmCrS,SAAvBqF,OAAO8H,YAClCgI,KAAK/H,MACL/H,OAAO8H,YAAYC,OACzB/H,OAAOiN,WAAWrE,EAASlG,KAAK9D,KAA6BjE,SAAvBqF,OAAO8H,YACvCgI,KAAK/H,MAAQiF,EACbhN,OAAO8H,YAAYC,MAAQiF,GAC9B,IAASlN,EAAQ4nB,iBAOhCS,EAAwB,WAExB,MADAnb,GAAY,EACLhN,OAAOmoB,sBACVnoB,OAAOooB,4BACPpoB,OAAOqoB,yBACProB,OAAOsoB,uBACPtoB,OAAOuoB,0BAUMC,EAAAA,0EAOXjpB,EAAMkpB,EAAQC,GAChB,GAAI/oB,IACAmX,IAAK,KACL4Q,WAAY5nB,EAAQ4nB,WACpB3f,IAAK,EACL4gB,UAAW,EACXC,SAAU,EACVC,eAAgB,EAChBC,cAAe,EAEfC,aAAa,EACbC,aAAa,EAKjB,IAF0BruB,SAAtB+tB,EAAOhB,YAA4BgB,EAAOhB,YAAc5nB,EAAQ4nB,aAAY/nB,EAAK+nB,WAAagB,EAAOhB,YAEtF/sB,SAAf+tB,EAAO5R,IAGP,KAAM,4EAUV,OAZInX,GAAKmX,IAAM4R,EAAO5R,IAKtBnX,EAAKspB,SAAW,IAAStpB,EAAK+nB,WAC9B/nB,EAAKipB,SAAW9Y,KAAK/H,MAErByf,EAAYnf,IAAI9I,EAAMkpB,GACtBhB,EAAUpf,IAAI9I,EAAMI,GACfG,EAAQ6nB,UAAU/oB,KAAKsqB,QAErBtqB,kCAONW,GAGD,MAFAioB,GAAYjf,OAAOhJ,GACnBkoB,EAAUlf,OAAOhJ,GACVX,qCAQP,MADAA,MAAKuqB,YAAYrZ,KAAK/H,OACfnJ,yCAOCoO,EAAWoc,GAGnB,MAFqBzuB,UAAjByuB,IAA4BA,EAAexqB,MAE3C4oB,EAAY3uB,QAAU,GAAKiH,EAAQ6nB,UACnC7nB,EAAQ8nB,qBAAsB,EAC9B9nB,EAAQ6nB,UAAW,EACZQ,EAAqBvpB,KAAKuqB,eAErCrpB,EAAQ6nB,UAAW,EAEnBE,EAAsB,SAAU7a,GAC5Boc,EAAaD,YAAYnc,EAAWoc,SAGxC5B,GAAY9b,KAAK,SAAU5E,GACvB,GAAI0gB,EAAYle,eAAexC,IAAU,WAAA5B,EAAoBsiB,EAAY1gB,IAAQ,CAC7E,GAAI2hB,GAASjB,EAAY1gB,GACrBnH,EAAO8nB,EAAU3gB,EAErBnH,GAAKoI,IAAM+H,KAAK/H,MAChBpI,EAAKgpB,WAAahpB,EAAKoI,IAAMpI,EAAKipB,UAAY,IAE1CjpB,EAAKmX,IAAInX,KAAKilB,KAAOjlB,EAAKmX,IAAInX,KAAKmV,OAAOnV,EAAKmX,IAAInX,KAAKilB,GAAG1b,SAE1DvJ,EAAKmX,IAAInX,KAAKmV,QACOna,SAAlB8tB,EAAOvf,QAAwB,kBAAsBuf,GAAOvf,SACxDvJ,EAAKopB,aACL9b,WAAWwb,EAAOvf,OAAOxG,KAAK+lB,EAAQzb,EAAWrN,GAAO,GACxDsN,WAAW1Q,EAAAC,QAAM0M,OAAOxG,KAAK9D,KAAMoO,GAAY,KAE/Cyb,EAAOvf,OAAO8D,EAAWrN,GACzBpD,EAAAC,QAAM0M,OAAO8D,KAIC,IAAjBrN,EAAKgpB,UAAqBhpB,EAAKspB,WAChCtpB,EAAKipB,SAAWjpB,EAAKoI,IAAyB,IAAjBpI,EAAKgpB,UAAqBhpB,EAAKspB,SAEtCtuB,SAAlB8tB,EAAO7c,QAAwB,kBAAsB6c,GAAO7c,SACxDjM,EAAKqpB,YACL/b,WAAWwb,EAAO7c,OAAOlJ,KAAK+lB,EAAQzb,EAAWrN,GAAO,GAExD8oB,EAAO7c,OAAOoB,EAAWrN,MAKrCA,EAAKmX,IAAInX,KAAKilB,KAAOjlB,EAAKmX,IAAInX,KAAKmV,OAAOnV,EAAKmX,IAAInX,KAAKilB,GAAGL,yDAStDmD,GAIjB,MAHIA,IAAc,IAAMA,EAAa,IACjC5nB,EAAQ4nB,WAAaA,GAElB9oB,sCAQP,MAAmBjE,UAAfqF,OAAO8W,IACA9W,OAAOqpB,uBAAyBrpB,OAAOqpB,qBAAuB,GAAIb,IAElEjB,IAAaA,EAAW,GAAIiB,uBApI1BA,uyCC9CRc,GAAAA,aAAAA,SAAAA,GAkBT,QAAAA,KAAc3qB,EAAAC,KAAA0qB,EAAA,IAAA7pB,GAAAZ,EAAAD,MAAA0qB,EAAAxqB,WAAAC,OAAAC,eAAAsqB,IAAArqB,KAAAL,MAAA,OAAAG,QAAA0B,eAAAhB,EAAA,aAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAjBF,IAiBE7B,OAAA0B,eAAAhB,EAAA,WAAAiB,YAAA,EAAAC,UAAA,EAAAC,OAhBJ,IAgBI7B,OAAA0B,eAAAhB,EAAA,gBAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAdC,OAcD7B,OAAA0B,eAAAhB,EAAA,gBAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAbC,OAaD7B,OAAA0B,eAAAhB,EAAA,eAAAiB,YAAA,EAAAC,UAAA,EAAAC,WAAA7B,OAAA0B,eAAAhB,EAAA,WAAAiB,YAAA,EAAAC,UAAA,EAAAC,OARV8mB,WAAY,GACZ5S,OAAO,KAOG/V,OAAA0B,eAAAhB,EAAA,SAAAiB,YAAA,EAAAC,UAAA,EAAAC,OAHVgnB,qBAAqB,KAMrBnoB,EAAKooB,sBAAyB,WAC1B,MAAO7nB,QAAO6nB,uBACV7nB,OAAO8nB,6BACP9nB,OAAO+nB,0BACP/nB,OAAOgoB,wBACPhoB,OAAOioB,yBACN,SAAUrf,GACFhK,KAAKiB,MAAM+nB,oBAUZhpB,KAAKiB,MAAM+nB,qBAAsB,GAT7BhpB,KAAKoO,WAAaxD,OAAO0e,iBAAmB,IAAGtpB,KAAKoO,UAAY,GAC7C,IAAnBpO,KAAKoO,YAAiBpO,KAAKoO,UAAmCrS,SAAvBqF,OAAO8H,YAC5CgI,KAAK/H,MACL/H,OAAO8H,YAAYC,OACzB/H,OAAOiN,WAAWrE,EAASlG,KAAK9D,KAA6BjE,SAAvBqF,OAAO8H,YACvCgI,KAAK/H,MAAQnJ,KAAKoO,UAClBhN,OAAO8H,YAAYC,MAAQnJ,KAAKoO,WACnC,IAASpO,KAAKkB,QAAQ4nB,cAI/BhlB,KAAK9D,OACb8D,KApB4BjD,KAsB9BA,EAAK0oB,qBAAwB,WAEzB,MADAvpB,MAAKoO,UAAY,EACVhN,OAAOmoB,sBACVnoB,OAAOooB,4BACPpoB,OAAOqoB,yBACProB,OAAOsoB,uBACPtoB,OAAOuoB,wBACb7lB,KAP2BjD,KAS7BA,EAAKkQ,KAAOlQ,EAAKkQ,KAAKjN,KAAVjD,GAlCFA,gDAqCTuN,GACD,GAAIpO,KAAK4oB,YAAY3uB,QAAU,GAAK+F,KAAK2qB,SAAW3qB,KAAKkB,QAAQgV,MAG7D,MAFAlW,MAAKiB,MAAM+nB,qBAAsB,EACjChpB,KAAK2qB,SAAU,EACR3qB,KAAKupB,qBAAqBvpB,KAAK+Q,KAE1C/Q,MAAK2qB,SAAU,EACf3qB,KAAKipB,sBAAsB,SAAU7a,GACjCpO,KAAK+Q,KAAK3C,IACZtK,KAAK9D,MAEP,KAAK,GAAI7F,GAAI,EAAGA,EAAI6F,KAAK4oB,YAAazuB,IAClC,GAAK6F,KAAK4oB,YAAYzuB,GAAG4G,KAAKoB,UAA9B,CACA,GAAI0nB,GAAS7pB,KAAK4oB,YAAYzuB,EAE9B,KAAK0vB,EAAO9oB,KAAKmV,MAAO,CAChB2T,EAAOtpB,IAAIspB,EAAOtpB,GAAG+J,QACzB,IAAIvJ,GAAO8oB,EAAO9oB,KAAKiM,MAEvBjM,GAAKoI,IAAM+H,KAAK/H,MAChBpI,EAAKgpB,WAAahpB,EAAKoI,IAAMpI,EAAKipB,UAAY,IAExBjuB,SAAlB8tB,EAAOvf,QAAwB,kBAAsBuf,GAAOvf,SACxDuf,EAAO9oB,KAAKopB,aACZ9b,WAAWwb,EAAOvf,OAAOxG,KAAK+lB,EAAQzb,EAAWrN,GAAO,GACxDsN,WAAWwb,EAAOhkB,OAAOyE,OAAOxG,KAAK+lB,EAAQzb,GAAY,KAEzDyb,EAAOvf,OAAO8D,EAAWrN,GACzB8oB,EAAOhkB,OAAOyE,OAAO8D,KAIP,IAAjBrN,EAAKgpB,UAAqBhpB,EAAKspB,WAChCtpB,EAAKipB,SAAWjpB,EAAKoI,IAAyB,IAAjBpI,EAAKgpB,UAAqBhpB,EAAKspB,SAEtCtuB,SAAlB8tB,EAAO7c,QAAwB,kBAAsB6c,GAAO7c,SACxDjM,EAAKqpB,YACL/b,WAAWwb,EAAO7c,OAAOlJ,KAAK+lB,EAAQzb,EAAWrN,GAAO,GAExD8oB,EAAO7c,OAAOoB,EAAWrN,KAKjC8oB,EAAOtpB,IAAIspB,EAAOtpB,GAAGolB,wCAK/BiF,GAMF,MAL6C7uB,UAAzCiE,KAAK4oB,YAAYgC,EAAcC,QAC/B7qB,KAAK4oB,YAAYgC,EAAcC,MAAQD,EACvC5qB,KAAK4oB,YAAY/lB,KAAK+nB,IAErB5qB,KAAK2qB,SAAS3qB,KAAK+Q,KAAKG,KAAK/H,OAC3BnJ,kCAGN4qB,GAKD,MAJ6C7uB,UAAzCiE,KAAK4oB,YAAYgC,EAAcC,cACxB7qB,MAAK4oB,YAAYgC,EAAcC,MACtC7qB,KAAK4oB,YAAYllB,OAAO1D,KAAK4oB,YAAYve,QAAQugB,EAAcC,MAAO,IAEnE7qB,kDAGU8oB,GAIjB,MAHIA,IAAc,IAAMA,EAAa,IACjC9oB,KAAKkB,QAAQ4nB,WAAaA,GAEvB9oB,kCAGN+lB,EAAc+E,GAGf,MAFA9qB,MAAK8qB,aAAeA,EACpB7E,EAAAroB,QAAQ6C,UAAUylB,KAAK7lB,KAAKL,KAAM+lB,GAC3B/lB,sCAOP,MAHAimB,GAAAroB,QAAQ6C,UAAU0d,OAAO9d,KAAKL,MAC9BA,KAAKkB,QAAQgV,OAAQ,EACrBlW,KAAK+Q,KAAKG,KAAK/H,OACRnJ,uCAMP,MAFAimB,GAAAroB,QAAQ6C,UAAUilB,QAAQrlB,KAAKL,MAC/BA,KAAKkB,QAAQgV,OAAQ,EACdlW,wjCChJM+qB,EAAAA,WAGjB,QAAAA,KAAchrB,EAAAC,KAAA+qB,GAC0BhvB,SAAhCiE,KAAKU,YAAYsqB,aAA0BhrB,KAAKU,YAAYsqB,cAEhE,IAAIC,MAMAC,EAAY,SAAUzT,GACtB,KAA0C,WAAtCA,EAAOvX,UAAUQ,YAAYC,MACO5E,SAAjC0b,EAAOvX,UAAUQ,aACjB+W,EAAOvX,UAAUQ,YAAYsqB,WAAW/wB,OAAS,GAFxD,CAKA,IAAK,GAAIE,GAAI,EAAGA,EAAIsd,EAAOvX,UAAUQ,YAAYsqB,WAAW/wB,OAAQE,IAC3D8wB,EAAMroB,SAAS6U,EAAOvX,UAAUQ,YAAYsqB,WAAW7wB,GAAGwG,QAC3DsqB,EAAMpoB,KAAK4U,EAAOvX,UAAUQ,YAAYsqB,WAAW7wB,GAAGwG,MACtDX,KAAKU,YAAYsqB,WAAWnoB,KAAK4U,EAAOvX,UAAUQ,YAAYsqB,WAAW7wB,IAIjF+wB,GAAUzT,EAAOvX,aACnB4D,KAAK9D,KAEPkrB,GAAUlrB,KAAKE,wDAGR8qB,GACP,GAAI7wB,GAAI,EAAGyO,EAAI,CACf,IAA0B,YAAtB,mBAAOoiB,GAAP,YAAA1kB,EAAO0kB,KAA2BA,YAAsB1iB,OACxD,IAAKnO,EAAI,EAAGA,EAAI6wB,EAAW/wB,OAAQE,IAM/B,GAA6B,kBAAlB6wB,GAAW7wB,IAAqB,GAAK6wB,GAAW7wB,YAAhBgxB,GAAAvtB,SACvC,IAAKgL,EAAI,EAAGA,EAAI5I,KAAKU,YAAYsqB,WAAW/wB,OAAQ2O,IAChD,KAAM,GAAK5I,MAAKU,YAAYsqB,WAAWpiB,YAAeoiB,GAAW7wB,IAAK,OAAO,MAI9E,CAAA,GAA6B,kBAAlB6wB,GAAW7wB,GAEtB,KAAM,IAAImG,OAAM,WAAa0qB,EAAW7wB,GAAGuG,YAAYC,KAAO,sBADjE,MAAMX,eAAgBgrB,GAAW7wB,IAAK,OAAO,MAGlD,IAEoB,kBAAf6wB,IAA6B,GAAKA,aAALG,GAAAvtB,SAGrC,IAAKzD,EAAI,EAAGA,EAAI6F,KAAKU,YAAYsqB,WAAW/wB,OAAQE,IAChD,KAAM,GAAK6F,MAAKU,YAAYsqB,WAAW7wB,YAAe6wB,IAAa,OAAO,MAI3E,CAAA,GAA0B,kBAAfA,GAGd,KAAM,IAAI1qB,OAAM,WAAa0qB,EAAWtqB,YAAYC,KAAO,sBAF3D,MAAMX,eAAgBgrB,IAAa,OAAO,EAI9C,OAAO,qCAIP,MAAOhrB,MAAKE,UAAUQ,YAAYC,oCArErBoqB,EAAAA,6DAAAA,y6BCFAK,EAAAA,+EAGNJ,GACP,GAAI7wB,GAAI,EAAGyO,EAAI,CACf,IAA0B,YAAtB,mBAAOoiB,GAAP,YAAA1kB,EAAO0kB,KAA2BA,YAAsB1iB,OACxD,IAAKnO,EAAI,EAAGA,EAAI6wB,EAAW/wB,OAAQE,IAAK,CAMpC,KAA6B,kBAAlB6wB,GAAW7wB,IAAqB,GAAK6wB,GAAW7wB,YAAeixB,IAInE,KAAM,IAAI9qB,OAAM,WAAa0qB,EAAW7wB,GAAGuG,YAAYC,KAAO,sBAHjE,KAAKiI,EAAI,EAAGA,EAAI5I,KAAKU,YAAYsqB,WAAW/wB,OAAQ2O,IAChD,KAAM,GAAK5I,MAAKU,YAAYsqB,WAAWpiB,YAAeoiB,GAAW7wB,IAAK,OAAO,MAItF,CAAA,KAEoB,kBAAf6wB,IAA6B,GAAKA,aAAuBI,IAOjE,KAAM,IAAI9qB,OAAM,WAAa0qB,EAAWtqB,YAAYC,KAAO,sBAJ3D,KAAKxG,EAAI,EAAGA,EAAI6F,KAAKU,YAAYsqB,WAAW/wB,OAAQE,IAChD,KAAM,GAAK6F,MAAKU,YAAYsqB,WAAW7wB,YAAe6wB,IAAa,OAAO,EAKlF,OAAO,iCA7BMI,EAAAA,+CACIA,eADJA,o5CCGAC,EAAAA,SAAAA,GAGjB,QAAAA,KAActrB,EAAAC,KAAAqrB,EAAA,IAAAxqB,GAAAZ,EAAAD,MAAAqrB,EAAAnrB,WAAAC,OAAAC,eAAAirB,IAAAhrB,KAAAL,MAAA,OAGVa,GAAK0C,OAAS,KACd1C,EAAKsB,WAAY,EAJPtB,gDAOTklB,GAID,MAHqBhqB,UAAjBgqB,IACA/lB,KAAKuD,OAASwiB,GAEX/lB,sCAKP,MADAA,MAAKmC,WAAY,EACVnC,uCAKP,MADAA,MAAKmC,WAAY,EACVnC,oCAGJymB,GAOH,MANe1qB,UAAX0qB,IAAsBA,GAAUzmB,KAAKmC,WACrCskB,EACAzmB,KAAKme,SAELne,KAAK0lB,UAEF1lB,6CAlCMqrB,EAAAA,+CACGC,EAAA1tB,qBADHytB,qsBCHAE,EAAAA,WAGjB,QAAAA,GAAYzrB,GAAOC,EAAAC,KAAAurB,GAAAprB,OAAA0B,eAAA7B,KAAA,SAAA8B,YAAA,EAAAC,UAAA,EAAAC,MAFXjG,SAGUA,SAAV+D,IAAqBE,KAAKF,MAAQA,8CAItC,OAAO,oCAIP,OAAO,+BAGNA,GAED,MADc/D,UAAV+D,GAAsC/D,SAAfiE,KAAKF,QAAqBE,KAAKF,MAAQA,IAC3D,mCAIP,OAAO,kCAIP,OAAO,qCAIP,MAAO,UAAUsmB,GACb,MAAQA,GAAO,GAAG5Q,cAAgB4Q,EAAO1d,MAAM,IACjD1I,KAAKU,YAAY8qB,YAAcxrB,KAAKU,YAAYC,yBA/BrC4qB,2tBCJAE,EAAAA,oGACX,SAACvgB,GACH,MAAO,eAAiBA,EAAQ,qJAO7B,SAACA,GACJ,MAAO,eAAiBA,EAAQ,gIAO1B0b,EAAS8E,GACf,MAAO7W,SAAQ8W,IAAI,4BACf3rB,KAAKke,IAAI,WAAYle,KAAKke,IAAI,WAC9Ble,KAAKke,IAAI,WAAY0I,EACrB5mB,KAAKke,IAAI,WAAYle,KAAKke,IAAI,WAC9Ble,KAAK0rB,KAAK,QAAS1rB,KAAK0rB,KAAK,QAASA,+BAI1C9E,EAASgF,GACT,GAAI1N,GAAM,EAEV,QADqB,gBAAV0N,KAAoBA,EAAQA,EAAMpW,eACrCoW,GACJ,IAAK,OACDA,EAAQ,OACR1N,EAAM,oDACN,MACJ,KAAK,OACL,IAAK,UACD0N,EAAQ,UACR1N,EAAM,oDACN,MACJ,KAAK,QACD0N,EAAQ,QACR1N,EAAM,oDACN,MACJ,KAAK,UACD0N,EAAQ,UACR1N,EAAM,oDACN,MACJ,KAAK,QACL,IAAKniB,QACL,QACI6vB,EAAQ,QACR1N,EAAM,qDAEd,MAAOrJ,SAAQ8W,IAAI,OAAQzN,EAAK0N,EAAOhF,sBArD1B6E,mwCCsBAI,EAAAA,WAwBjB,QAAAA,GAAY3T,GAAKnY,EAAAC,KAAA6rB,GACb7rB,KAAK8rB,gBAAkB9rB,KAAK8rB,gBAAgBhoB,KAAK9D,MACjDA,KAAK2H,MAAQ3H,KAAK2H,MAAM7D,KAAK9D,MAG7BA,KAAKkY,IAAMA,EAGXlY,KAAK6c,OAAS,KAGd7c,KAAKmL,QAAU,KAGfnL,KAAKwqB,aAAeuB,EAAAnuB,QAAaouB,OAGjChsB,KAAKisB,cAAgB,GAAAC,GAAAtuB,QAGrBoC,KAAKmsB,gBAAkB,GAAAC,GAAAxuB,QAGvBoC,KAAKqsB,kBAAoB,GAAAC,GAAA1uB,WAA0BoC,KAAK8rB,iBAExD9rB,KAAKusB,oEAgDYlmB,GACjB,GAAImmB,GAAexsB,KACfU,EAAc2F,EAAM3F,WAOxB,OAN2B,kBAAhBA,IAA+D3E,SAAjC2E,EAAYD,UAAUuM,SAC3DtM,EAAYD,UAAUuM,OAAS,SAAUoB,EAAWrN,GAEhD,MADAyrB,GAAa7G,QAAQ8G,iBAAiBzf,OAAOjM,IACtC,IAGRL,+BAONQ,GAgCD,MA/BAlB,MAAKe,KAAOiF,EAAApI,QAAWqI,QAAO,KAAU4lB,EAAa3lB,SAAUhF,GAE/DlB,KAAKkY,IAAI1U,QAAQ,cAEjBxD,KAAKe,KAAK2rB,cAAgB1sB,KAAKe,KAAKgc,MACpC/c,KAAKe,KAAK4rB,eAAiB3sB,KAAKe,KAAKmc,OACrCld,KAAKe,KAAK6rB,eAAiBC,iBAAiB7sB,KAAKkY,IAAIoC,SAA1B,OAE3Bta,KAAKkY,IAAIoC,QAAQ/Y,MAAMwb,MAAQ/c,KAAKe,KAAKgc,MAAQ,KACjD/c,KAAKkY,IAAIoC,QAAQ/Y,MAAM2b,OAASld,KAAKe,KAAKmc,OAAS,KAEnDld,KAAK8sB,aAEL9sB,KAAKmsB,gBAAgBY,WACjBtrB,EAAGzB,KAAKe,KAAKgc,MACbrb,EAAG1B,KAAKe,KAAKmc,SACd8P,oBACClhB,QACIrK,EAAG,EACHC,EAAG,GAEP2K,MACI5K,EAAGzB,KAAKe,KAAKgc,MACbrb,EAAG1B,KAAKe,KAAKmc,QAEjB5Q,MAAO,EACPZ,MAAO,IAGX1L,KAAKkY,IAAI1U,QAAQ,aAEVxD,0CAUP,MAHKA,MAAKisB,cAAcgB,SAAS,UAC7BjtB,KAAKisB,cAAciB,SAAS,QAAS,GAElCltB,0CAqCP,MA9ByF,KAArFqB,SAAS8rB,iBAAiB,cAAgBntB,KAAKkY,IAAInX,KAAKkB,GAAK,aAAahI,SAC1E+F,KAAK6c,OAASxb,SAAS+rB,cAAc,UAErCptB,KAAK6c,OAAOE,MAAQ/c,KAAKe,KAAKgc,MAC9B/c,KAAK6c,OAAOK,OAASld,KAAKe,KAAKmc,OAC/Bld,KAAK6c,OAAOtb,MAAM0L,OAASjN,KAAKe,KAAKkM,OACrCjN,KAAK6c,OAAOtb,MAAMuG,SAAW9H,KAAKe,KAAK+G,SAEvC9H,KAAK6c,OAAOtb,MAAM4b,KAAOnd,KAAKe,KAAKoc,KACnCnd,KAAK6c,OAAOtb,MAAM6b,IAAMpd,KAAKe,KAAKqc,IAE9Bpd,KAAKkY,IAAInX,KAAKssB,MAEdrtB,KAAKmL,QAAUnL,KAAK6c,OAAOyQ,WAAW,YAEtCttB,KAAKmL,QAAUnL,KAAK6c,OAAOyQ,WAAW,MAGrCttB,KAAKkY,IAAInX,KAAKwsB,WACfvtB,KAAKkY,IAAI3Q,KAAKimB,iBAAiBxtB,KAAKmL,SAGxCnL,KAAKmL,QAAQsiB,YAAc,gBACvBztB,KAAKe,KAAK2sB,kBAAiB1tB,KAAK0tB,gBAAkB1tB,KAAKe,KAAK2sB,iBAC5D1tB,KAAKe,KAAKyE,UAASxF,KAAKwF,QAAUxF,KAAKe,KAAKyE,SAC5CxF,KAAKe,KAAKuK,UAAStL,KAAKsL,QAAUtL,KAAKe,KAAKuK,SAC5CtL,KAAKe,KAAKkM,SAAQjN,KAAKiN,OAAS,IAAOjN,KAAKe,KAAKkM,QAErDjN,KAAKkY,IAAIoC,QAAQqT,YAAY3tB,KAAK6c,SAE/B7c,mCAQL6Q,EAAKxE,GAMP,MALYtQ,UAAR8U,GAA8B9U,SAATsQ,EACrBrM,KAAKmL,QAAQyiB,UAAU/c,EAAIpP,EAAIzB,KAAKoL,SAAS3J,EAAGoP,EAAInP,EAAI1B,KAAKoL,SAAS1J,EAAG2K,EAAK5K,EAAG4K,EAAK3K,GAEtF1B,KAAKmL,QAAQyiB,UAAU,EAAG,EAAG5tB,KAAKe,KAAKgc,MAAO/c,KAAKe,KAAKmc,QAErDld,oCAQJ+c,EAAOG,GAeV,MAdAld,MAAK6c,OAAOE,MAAQ/c,KAAKe,KAAKgc,MAAQA,EACtC/c,KAAK6c,OAAOK,OAASld,KAAKe,KAAKmc,OAASA,EAEpCld,KAAKe,KAAK2sB,kBACV1tB,KAAKmL,QAAQQ,OAEb3L,KAAK2lB,QACL3lB,KAAK0tB,gBAAkB1tB,KAAKe,KAAK2sB,gBAEjC1tB,KAAKmL,QAAQoB,WAEZvM,KAAKkY,IAAInX,KAAKwsB,WACfvtB,KAAKkY,IAAI3Q,KAAKimB,iBAAiBxtB,KAAKmL,SAEjCnL,6CAQK6tB,GACZ,GAAIrB,GAAexsB,IACnBwsB,GAAazrB,KAAK8sB,UAAYA,GAAa,WAC3CrB,EAAahC,aAAa5gB,KAAK4iB,EAAatU,IAAInX,KAAKkB,GAErD,IAAI6rB,GAAkBtB,EAAauB,qBAC/BvB,EAAaH,kBAAkB2B,SAASH,IAGxCI,EAAe,GAAIH,GAAgBtB,EAAaH,qBAmBpD,OAlBA4B,GAAa/H,MACTlc,SAAU,WACNikB,EAAa7d,MACTpG,SAAU,WACNwiB,EAAahC,aAAa7iB,MAAM6kB,EAAatU,IAAInX,KAAKkB,GAAIgsB,GACtD/V,IAAKsU,EAAatU,IAClB4Q,WAAY0D,EAAazrB,KAAK+nB,aAGlC0D,EAAatU,IAAI1U,QAAQ,oBAGzBgpB,EAAaH,kBAAkB6B,mBAAmBC,eAM3DnuB,mCAQLgK,EAAUjJ,GAEZ,MADAsN,YAAWrE,EAAS3J,KAAK2J,EAAUjJ,GAAO,GACnCf,qCAOP,GAAIwsB,GAAexsB,IACfwsB,GAAatU,IAAInX,KAAKilB,IACtBwG,EAAatU,IAAInX,KAAKilB,GAAGE,OAE7BsG,EAAatU,IAAI1U,QAAQ,eAEzBgpB,EAAahC,aAAa5gB,KAAK4iB,EAAatU,IAAInX,KAAKkB,GAErD,IAAI6rB,GAAkBtB,EAAauB,qBAC/BvB,EAAaH,kBAAkB7D,cAG/ByF,EAAe,GAAIH,GAAgBtB,EAAaH,qBAgBpD,OAfA4B,GAAa/H,MACTlc,SAAU,WACNikB,EAAa7d,MACTpG,SAAU,WACNwiB,EAAahC,aAAa7iB,MAAM6kB,EAAatU,IAAInX,KAAKkB,GAAIgsB,GACtD/V,IAAKsU,EAAatU,IAClB4Q,WAAY0D,EAAazrB,KAAK+nB,aAGlC0D,EAAatU,IAAI1U,QAAQ,oBAMlCgpB,iCAQP,MADAxsB,MAAKwqB,aAAa5gB,KAAK5J,KAAKkY,IAAInX,KAAKkB,IAC9BjC,wCAOAouB,GACP,GAAI9T,GAAUjZ,SAASgtB,eAAeruB,KAAKkY,IAAIoC,QAAQgU,KAAK,MAsB5D,OApBIvyB,UAAcue,EAAQiU,oBAEtBjU,EAAQiU,kBAAoBjU,EAAQkU,yBAC7BlU,EAAQmU,yBACRnU,EAAQoU,sBACRpU,EAAQqU,qBAGf5yB,SAAcsF,SAASutB,iBAEvBvtB,SAASutB,eAAiBvtB,SAASwtB,sBAC5BxtB,SAASytB,wBACTztB,SAAS0tB,qBACT1tB,SAAS2tB,kBAEhBZ,EACA9T,EAAQiU,oBAERltB,SAASutB,iBAEN5uB,8CAOMouB,GACb,GAAIlW,GAAMlY,KAAKkY,IACXsU,EAAexsB,IAoCnB,OAlCIouB,IACA5B,EAAazrB,KAAK2rB,cAAgBF,EAAazrB,KAAKgc,MACpDyP,EAAazrB,KAAK4rB,eAAiBH,EAAazrB,KAAKmc,OAErDsP,EAAayC,OAAO/W,EAAIkO,OAAOrJ,MAAO7E,EAAIkO,OAAOlJ,QACjDsP,EAAazrB,KAAKmuB,kBAAmB,EAErChX,EAAIoC,QAAQ/Y,MAAMwb,MAAQ7E,EAAIkO,OAAOrJ,MAAQ,KAC7C7E,EAAIoC,QAAQ/Y,MAAM2b,OAAShF,EAAIkO,OAAOlJ,OAAS,KAC/ChF,EAAIoC,QAAQ/Y,MAAM4tB,OAAS,EAE3B3C,EAAaL,gBAAgBY,WACzBtrB,EAAGyW,EAAIkO,OAAOrJ,MACdrb,EAAGwW,EAAIkO,OAAOlJ,SACfkS,WACC3tB,IAAKyW,EAAIkO,OAAOrJ,MAAQyP,EAAazrB,KAAK2rB,eAAiB,EAC3DhrB,IAAKwW,EAAIkO,OAAOlJ,OAASsP,EAAazrB,KAAK4rB,gBAAkB,MAGjEH,EAAayC,OAAOzC,EAAazrB,KAAK2rB,cAAeF,EAAazrB,KAAK4rB,gBACvEH,EAAazrB,KAAKmuB,kBAAmB,EAErChX,EAAIoC,QAAQ/Y,MAAMwb,MAAQyP,EAAazrB,KAAK2rB,cAAgB,KAC5DxU,EAAIoC,QAAQ/Y,MAAM2b,OAASsP,EAAazrB,KAAK4rB,eAAiB,KAC9DzU,EAAIoC,QAAQ/Y,MAAM4tB,OAAS3C,EAAazrB,KAAK6rB,eAE7CJ,EAAaL,gBAAgBY,WACzBtrB,EAAG+qB,EAAazrB,KAAK2rB,cACrBhrB,EAAG8qB,EAAazrB,KAAK4rB,iBACtByC,WACC3tB,EAAG,EACHC,EAAG,KAGJ1B,8CAQMkY,EAAKnX,GASlB,MARahF,UAATgF,IACAA,GAAQqtB,YAAY,KAEnBlW,EAAI0E,MAAMsS,kBAAoBnuB,EAAKqtB,WACpClW,EAAI0E,MAAMyS,YAAW,GAErBnX,EAAI0E,MAAMyS,YAAW,GAElBrvB,6CAOP,MAAOA,MAAKisB,cAAcgB,SAAS,kDAUnC,MAHIjtB,MAAKe,KAAK2sB,kBACV1tB,KAAK0tB,gBAAkB1tB,KAAKe,KAAK2sB,iBAE9B1tB,oCAOJe,GACH,GAAIyrB,GAAexsB,IASnB,OARAwsB,GAAaP,cAAc9D,OAAOtgB,QAAQ,SAAU7F,EAAOkG,GACvDskB,EAAaP,cAAc9D,OAAOjgB,GAAO8E,OACrCwf,EAAarhB,QACbqhB,EAAaL,gBAAgBmD,cAC7B9C,EAAaP,cAAchE,iBAC3BlnB,SAGDf,iCAQPmG,EAAMyG,GAIN,MAHI5M,MAAKisB,cAAchE,iBAAiBG,IAAI,UACxCpoB,KAAKisB,cAAchE,iBAAiBpsB,IAAI,SAAS4N,IAAItD,EAAMyG,GAExD5M,oCAQJmG,EAAMyG,GAIT,MAHI5M,MAAKisB,cAAchE,iBAAiBG,IAAI,UACxCpoB,KAAKisB,cAAchE,iBAAiBpsB,IAAI,SAAS8N,OAAOxD,EAAMyG,GAE3D5M,4CAOImG,GAEX,MADAnG,MAAKmsB,gBAAgBoD,UAAUppB,EAAKpF,KAAKkB,GAAIkE,GACtCnG,sDAOc4c,GAOrB,MALAA,GAAMuP,gBAAgBqD,YAClB,GAAAhiB,GAAA5P,QAAa,EAAG,GAChB,GAAA4P,GAAA5P,QAAagf,EAAM7b,KAAKgc,MAAOH,EAAM7b,KAAKmc,SAGvCN,yCAOIzW,GACX,MAAapK,UAAToK,EAA2BnG,KAAKyvB,yBAAyBzvB,OAC7DA,KAAKmsB,gBAAgBuD,eAAevpB,EAAKpF,KAAKkB,IACvCjC,8CAhcP,MAAOA,MAAKe,KAAK2sB,8BAGD1rB,GAChBhC,KAAKe,KAAK2sB,gBAAkB1rB,EAC5BhC,KAAKmL,QAAQe,UAAYlK,EACzBhC,KAAKmL,QAAQiB,SAAS,EAAG,EAAGpM,KAAKe,KAAKgc,MAAO/c,KAAKe,KAAKmc,wCAIvD,MAAOld,MAAKe,KAAKyE,sBAGTxD,GACRhC,KAAKe,KAAKyE,QAAUxD,EACpBhC,KAAK6c,OAAOtb,MAAMiE,QAAUxD,kCAI5B,MAAOhC,MAAKe,KAAKuK,sBAGTtJ,GACRhC,KAAKe,KAAKuK,UAAYtJ,EACtBhC,KAAK6c,OAAOtb,MAAMouB,QAAa3tB,EAAS,QAAU,sCAIlD,MAAO,KAAOhC,KAAKe,KAAKkM,qBAGjBjL,GACPhC,KAAKe,KAAKkM,OAAS,IAAOjL,EAC1BhC,KAAK6c,OAAOtb,MAAM0L,OAAS,IAAOjL,mCAIlC,MAAOhC,MAAKe,KAAKqK,wCA1FJygB,EAAAA,6CAEb9O,MAAO,EACPG,OAAQ,EAERwP,cAAe,EACfC,eAAgB,EAChBC,eAAgB,EAEhBthB,SAAS,EACTxD,SAAU,WACVsV,IAAK,EACLD,KAAM,EACNlQ,OAAQ,IACRzH,QAAS,EACTkoB,iBAAiB,EAEjB5E,WAAY,GAEZ8G,kBAAkB,EAElBxkB,UAAW3J,EAAG,EAAGC,EAAG,gBArBPmqB,s2BCbAgE,EAAAA,WACjB,QAAAA,KAAc9vB,EAAAC,KAAA6vB,EACV,IAAIC,GAAgBC,SAAS31B,KAAKmL,IAC9BlE,SAAS2uB,gBAAT,YACA3uB,SAASC,KAAT,YACAD,SAAS2uB,gBAAT,YACA3uB,SAASC,KAAT,YACAD,SAAS2uB,gBAAT,cAGAC,EAAiBF,SAAS31B,KAAKmL,IAC/BlE,SAAS2uB,gBAAT,aACA3uB,SAASC,KAAT,aACAD,SAAS2uB,gBAAT,aACA3uB,SAASC,KAAT,aACAD,SAAS2uB,gBAAT,cAGJhwB,MAAK+c,MAAQ+S,EAAgBC,SAAS5iB,OAAO4P,OAAS+S,EAAgBC,SAAS5iB,OAAO4P,OACtF/c,KAAKkd,OAAS+S,EAAiBF,SAAS5iB,OAAO+P,QAAU+S,EAAiBF,SAAS5iB,OAAO+P,qDAS1F,MAFAld,MAAK+c,MAAQ3b,OAAO8uB,WACpBlwB,KAAKkd,OAAS9b,OAAO+uB,YACdnwB,wCAOP,MAAOA,MAAK+c,0CAOZ,MAAO/c,MAAKkd,yCAOZ,MAAO,IAAAkT,GAAAxyB,QAAoBoC,KAAK+c,MAAO/c,KAAKkd,2BAjD/B2S,mdCDAQ,GAAAA,QAAAA,sCAAAA,EAAAA,4CACC,WACd,MAAO,uCAAuC9X,QAAQ,QAAS,SAAU+X,GACrE,GAAIC,GAAoB,GAAhBn2B,KAAKqL,SAAgB,EAAG3L,EAAS,KAALw2B,EAAWC,EAAS,EAAJA,EAAU,CAC9D,OAAOz2B,GAAEgR,SAAS,mBAJTulB,usCCDAG,EAAAA,SAAAA,GAGjB,QAAAA,KAAc,MAAAzwB,GAAAC,KAAAwwB,GAAAvwB,EAAAD,MAAAwwB,EAAAtwB,WAAAC,OAAAC,eAAAowB,IAAAnwB,KAAAL,yDAHGwwB,EAAAA,+CACGC,EAAA7yB,qBADH4yB,woCCDAE,EAAAA,SAAAA,6IAAAA;mJCqBAC,EAAAA,SAAAA,GAyBjB,QAAAA,GAAYrW,EAASvZ,GAAMhB,EAAAC,KAAA2wB,EAAA,IAAA9vB,GAAAZ,EAAAD,MAAA2wB,EAAAzwB,WAAAC,OAAAC,eAAAuwB,IAAAtwB,KAAAL,MAAA,OAAAG,QAAA0B,eAAAhB,EAAA,QAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAmPpB2uB,EAAUppB,OAnPUpH,OAAA0B,eAAAhB,EAAA,cAAAiB,YAAA,EAAAC,UAAA,EAAAC,MAoPd2uB,EAAUC,aAhPnB/vB,EAAKyZ,QAAUA,EAGfzZ,EAAKE,KAAOA,EAGZF,EAAKulB,OAAS,GAAAyK,GAAAjzB,QAGdiD,EAAK+b,MAAQ,GAAAkU,GAAAlzB,QAAAiD,GAGbA,EAAKkwB,IAAM,GAAAC,GAAApzB,QAhBYiD,mDA8DvBb,KAAK4c,MAAMjV,QACX3H,KAAKwD,QAAQ,wCAIbxD,KAAK4c,MAAMhT,OACX5J,KAAKwD,QAAQ,wCAKTxD,KAAKe,KAAKilB,IAAIhmB,KAAKe,KAAKilB,GAAG5b,QAC/BpK,KAAKe,KAAKmV,OAAQ,EAClBlW,KAAKsa,QAAQ2W,UAAUxnB,IAAI,SAC3BzJ,KAAKwD,QAAQ,0CAKbxD,KAAKsa,QAAQ2W,UAAUtnB,OAAO,SAC9B3J,KAAKsa,QAAQqB,QACb3b,KAAKe,KAAKmV,OAAQ,EACdlW,KAAKe,KAAKilB,IAAIhmB,KAAKe,KAAKilB,GAAG5b,QAC/BpK,KAAKwD,QAAQ,oDAOb,MAAOxD,MAAK4c,iDAKZ,MAAO5c,MAAK4c,MAAMqP,wDAKlB,MAAOjsB,MAAK4c,MAAM4N,0DAKlB,MAAOxqB,MAAK4c,MAAMuP,+DAKlB,MAAOnsB,MAAK4c,MAAMyP,8KAelBzF,EAASgF,GACT5rB,KAAK+wB,IAAIpF,IAAI/E,EAASgF,iCA5GtB,MAAO5rB,MAAKe,KAAKssB,oBAGXrrB,GACNhC,KAAKe,KAAKssB,QAAUrrB,EACdA,IAAUhC,KAAKe,KAAKssB,MACtBrtB,KAAKsa,QAAQ2W,UAAUxnB,IAAI,UACnBzH,GAAShC,KAAKe,KAAKssB,OAC3BrtB,KAAKsa,QAAQ2W,UAAUtnB,OAAO,2CAKlC,MAAO3J,MAAKe,KAAKwsB,wBAGPvrB,GACVhC,KAAKe,KAAKwsB,YAAcvrB,6BAIxB,MAAOhC,MAAKe,KAAKilB,iBAGdhkB,GACH,MAAOhC,MAAKe,KAAKilB,GAAKhkB,gCAItB,MAAOhC,MAAKe,KAAKoP,oBAGXnO,GACN,MAAOhC,MAAKe,KAAKoP,MAAQnO,iCAIzB,OAAQhC,KAAKe,KAAKmV,2CAmFJgb,EAAUhwB,GAyDxB,QAASiwB,KACL,GAAItH,EAYJ,OAXI7pB,MAAKixB,UAAUvZ,SAAS,UACxBmS,EAAS8G,EAAUvZ,MAAMvb,IAAImE,KAAKoxB,aAAa,SAC3CvH,GAAQA,EAAOwH,SACnBC,EAAWtxB,QACHA,KAAKixB,UAAUvZ,SAAS,oBAAsB1X,KAAKixB,UAAUvZ,SAAS,YAC9E1X,KAAKixB,UAAUxnB,IAAI,UACnBzJ,KAAK2b,QACLkO,EAAS8G,EAAUvZ,MAAMvb,IAAImE,KAAKoxB,aAAa,SAC3CvH,GAAQA,EAAOwH,SACnBC,EAAWtxB,QAER,EArEX,GAAI2V,KACJ,IAAwB,gBAAbub,GACPvb,EAAQvU,OAAOC,SAAS8rB,iBAAiB+D,OACtC,CAAA,KAAwB,YAApB,mBAAOA,GAAP,YAAA5qB,EAAO4qB,KAA2Cn1B,SAAlBqF,OAAOmwB,QAAwBL,YAAoB9vB,QAAOmwB,QAE9F,MAAO,KADV5b,GAAQub,EAASr1B,MAGrB,GAAI21B,KACJlpB,OAAM7H,UAAUoH,QAAQxH,KAAKsV,EAAO,SAACxP,GAC5BA,EAAKsrB,aAAa,SAASD,EAAc3uB,KAAKsD,KAGvDqrB,EAAc3pB,QAAQ,SAACyS,GACnB,GAAIpZ,GAAU8E,EAAApI,QAAWqI,QAAO,KAAU0qB,EAAUzqB,SAAUhF,EAC9DA,GAAQe,GAAKqL,EAAA1P,QAAK2P,WAElB+M,EAAQoX,aAAa,OAAQxwB,EAAQe,GAErC,IAAIA,GAAKqY,EAAQ8W,aAAa,KACnBr1B,UAAPkG,GAA2B,OAAPA,GACpBqY,EAAQoX,aAAa,OAAQxwB,EAAQe,GAGzC,IAAI0vB,GAAWrX,EAAQ8W,aAAa,WACnBr1B,UAAb41B,GAAuC,OAAbA,GAAqBA,KAAa,GAC5DrX,EAAQoX,aAAa,WAAY,MAGhCpX,EAAQ2W,UAAUvZ,SAAS,QAC5B4C,EAAQ2W,UAAUxnB,IAAI,OAG1BknB,EAAUvZ,MAAM3N,IAAIvI,EAAQe,GAAI,GAAI0uB,GAAUrW,EAASpZ,IACvDoZ,EAAQsX,QACRtX,EAAQqB,SAGZ,IAAI2V,GAAa,SAACxT,GACd,GAAInI,GAAOkU,CACXlU,GAAQvU,OAAOC,SAAS8rB,iBAAiB,oDACzC7kB,MAAM7H,UAAUoH,QAAQxH,KAAKsV,EAAO,SAACxP,GAC7B2X,IAAY3X,IACZA,EAAK8qB,UAAUtnB,OAAO,UACtBkgB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,SAC3CvH,GAAQA,EAAO3T,WAI3BP,EAAQvU,OAAOC,SAAS8rB,iBAAiB,qDACzC7kB,MAAM7H,UAAUoH,QAAQxH,KAAKsV,EAAO,SAACxP,GAC7B2X,IAAY3X,GACZA,EAAK8qB,UAAUtnB,OAAO,aAqB9BkoB,IAQJ,OAPAlc,GAAQvU,OAAOC,SAAS8rB,iBAAiB,cACzC7kB,MAAM7H,UAAUoH,QAAQxH,KAAKsV,EAAO,SAACxP,GACjC0rB,EAAYhvB,KAAK8tB,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACvDjrB,EAAKhC,iBAAiB,QAASgtB,GAC/BhrB,EAAKhC,iBAAiB,QAASgtB,GAC/BhrB,EAAKhC,iBAAiB,aAAcgtB,KAEhC,IAAMU,EAAY53B,OAAU43B,EAAY,GAAKA,0CAtPxClB,EAAAA,+CACGmB,EAAAl0B,iCADH+yB,EAAAA,2CAGA,sDAHAA,EAAAA,6CAOb1uB,GAAI,KACJ+jB,GAAI,KACJ7V,MAAO,KACP4Z,UAAW,EACX7T,OAAO,EACP6b,OAAO,EAEPjJ,WAAY,GACZyE,WAAW,EAEXF,OAAO,2BAjBMsD,EAAAA,yCAuBF,GAAAhkB,GAAA/O,gCAvBE+yB,EAAAA,yCA6PbnD,iBAAkB,SAACriB,GACf,GAAI6mB,GAAS5wB,OAAO2U,UAAUmD,UAAU+Y,MAAM,4BAC1CC,IAAUF,GAASjC,SAASiC,EAAO,GAAI,GAE3C7mB,GAAA,uBAAmC,EACnCA,EAAA,0BAAsC,EACtCA,EAAA,wBAAoC,EAChC+mB,GAAWA,GAAW,KACtB/mB,EAAA,6BAAyC,GAE7CA,EAAA,yBAAqC,gBAvQ5BwlB,GAiRpBA,EAAUwB,WAAa,WA8BpB,QAASC,KACL,GAAI/C,GAAagD,GACjB,KAAKhD,EAAY,CACb,GAAIlpB,GAAM0jB,CACV1jB,GAAO/E,OAAOC,SAASixB,cAAc,qBACjCnsB,IAAM0jB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACrDvH,GAAQA,EAAOjN,MAAM2V,iBAAiBlD,GAE1ClpB,EAAO/E,OAAOC,SAASixB,cAAc,2BACjCnsB,IAAM0jB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACrDvH,GAAQA,EAAOroB,QAAQ6tB,IAvCnC,GAAyBtzB,SAArBqF,OAAOqb,UAAyB,MAAO,KAC3Crb,QAAOqb,WAAaC,YAAY,EAAMtF,MAAO,GAAAzK,GAAA/O,UAE5C,GAAAozB,GAAApzB,SAAW40B,UAAU,SAAW7B,EAAU8B,QAAS,gCAE9B12B,SAAlBqF,OAAOmwB,SAKPnwB,OAAOmwB,OAAOj3B,GAAG4d,IAAM,SAAChX,GACpB,MAAOyvB,GAAUC,WAAV70B,OAA2BmF,KAI1CE,OAAOqb,UAAUmU,WAAaD,EAAUC,UAExC,IAAI8B,GAAUtxB,OAAO2U,UAAUmD,UAAU+Y,MAAM,uBAC3CC,IAAUQ,GAAU3C,SAAS2C,EAAQ,GAAI,IAEzCL,EAAe,WAEf,SAAUjxB,OAAOC,SAASsxB,yBACnBvxB,OAAOC,SAASuxB,gCACfV,GAAWA,EAAU,GAAM9wB,OAAOC,SAASwxB,qBAAuBzxB,OAAOC,SAASyxB,mBACnF1xB,OAAOC,SAAS0xB,sBAkBvBC,EAAO5xB,OAAOC,SAASixB,cAAc,OAEpCU,GAAK/B,UAAUvZ,SAAS,SACzBtW,OAAOC,SAAS8C,iBAAiB,mBAAoBiuB,GACrDhxB,OAAOC,SAAS8C,iBAAiB,yBAA0BiuB,GAC3DhxB,OAAOC,SAAS8C,iBAAiB,sBAAuBiuB,GACxDhxB,OAAOC,SAAS8C,iBAAiB,qBAAsBiuB,GAEvDhxB,OAAO+C,iBAAiB,QAAS,WAC7B,GAAIgC,GAAM0jB,CACV1jB,GAAO/E,OAAOC,SAASixB,cAAc,2CACjCnsB,IAAM0jB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACrDvH,GAAQA,EAAOwH,WAGvBjwB,OAAO+C,iBAAiB,OAAQ,WAC5B,GAAIwR,GAAOkU,CACXlU,GAAQvU,OAAOC,SAAS8rB,iBAAiB,kCACzC7kB,MAAM7H,UAAUoH,QAAQxH,KAAKsV,EAAO,SAACxP,GAC7BA,IAAM0jB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACrDvH,GAAQA,EAAO3T,YAI3B9U,OAAO+C,iBAAiB,SAAU,WAC9BwsB,EAAUvZ,MAAMvP,QAAQ,SAACgjB,GACrB8F,EAAUvZ,MAAMyT,GAAMzE,OAAO6M,YAGjC,IAAI5D,GAAagD,GACjB,IAAIhD,EAAY,CACZ,GAAIlpB,GAAM0jB,CACV1jB,GAAO/E,OAAOC,SAASixB,cAAc,qBACjCnsB,IAAM0jB,EAAS8G,EAAUvZ,MAAMvb,IAAIsK,EAAKirB,aAAa,UACrDvH,GAAQA,EAAOjN,MAAM2V,iBAAiBlD,GAE9C,OAAO,IAEX2D,EAAK/B,UAAUxnB,IAAI","file":"j2d.min.js","sourcesContent":["let InterpolationEnum;\r\n\r\n/**\r\n * @class Interpolation\r\n * @exports module:transitions/utils/Interpolation\r\n *\r\n * @type {{Linear: Interpolation.Linear, Bezier: Interpolation.Bezier, CatmullRom: Interpolation.CatmullRom}}\r\n */\r\nlet Interpolation = {\r\n    /**\r\n     * @return {number}\r\n     */\r\n    Linear: function (v, k) {\r\n        var m = v.length - 1;\r\n        var f = m * k;\r\n        var i = Math.floor(f);\r\n        var fn = Interpolation.Utils.Linear;\r\n\r\n        if (k < 0) return fn(v[0], v[1], f);\r\n        if (k > 1) return fn(v[m], v[m - 1], m - f);\r\n\r\n        return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\r\n    },\r\n\r\n    /**\r\n     * @return {number}\r\n     */\r\n    Bezier: function (v, k) {\r\n        var b = 0;\r\n        var n = v.length - 1;\r\n        var pw = Math.pow;\r\n        var bn = Interpolation.Utils.Bernstein;\r\n\r\n        for (var i = 0; i <= n; i++) {\r\n            b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\r\n        }\r\n\r\n        return b;\r\n    },\r\n\r\n    /**\r\n     * @return {number}\r\n     */\r\n    CatmullRom: function (v, k) {\r\n        var m = v.length - 1;\r\n        var f = m * k;\r\n        var i = Math.floor(f);\r\n        var fn = Interpolation.Utils.CatmullRom;\r\n\r\n        if (v[0] === v[m]) {\r\n            if (k < 0) i = Math.floor(f = m * (1 + k));\r\n\r\n            return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);\r\n        } else {\r\n            if (k < 0) return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\r\n            if (k > 1) return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\r\n\r\n            return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);\r\n        }\r\n    },\r\n\r\n    Utils: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Linear: function (p0, p1, t) {\r\n            return (p1 - p0) * t + p0;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Bernstein: function (n, i) {\r\n            var fc = Interpolation.Utils.Factorial;\r\n            return fc(n) / fc(i) / fc(n - i);\r\n        },\r\n\r\n        Factorial: (function () {\r\n            var a = [1];\r\n            return function (n) {\r\n                var s = 1;\r\n                if (a[n]) return a[n];\r\n\r\n                for (var i = n; i > 1; i--) {\r\n                    s *= i;\r\n                }\r\n                a[n] = s;\r\n\r\n                return s;\r\n            };\r\n        })(),\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        CatmullRom: function (p0, p1, p2, p3, t) {\r\n            var v0 = (p2 - p0) * 0.5;\r\n            var v1 = (p3 - p1) * 0.5;\r\n            var t2 = t * t;\r\n            var t3 = t * t2;\r\n\r\n            return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;\r\n        }\r\n    },\r\n\r\n    get: (interpolation) => {\r\n        if (InterpolationEnum[interpolation] !== undefined) {\r\n            return InterpolationEnum[interpolation];\r\n        }\r\n\r\n        // TODO:: Exceptions\r\n        //throw new InvalidArgumentException('Unknown interpolation: ' + interpolation);\r\n    },\r\n\r\n    register: (interpolation, interpolationFunction) => {\r\n        InterpolationEnum[interpolation] = interpolationFunction;\r\n    }\r\n};\r\n\r\nInterpolationEnum = {\r\n    'linear': Interpolation.Linear,\r\n    'bezier': Interpolation.Bezier,\r\n    'catmull-rom': Interpolation.CatmullRom\r\n};\r\n\r\nexport default Interpolation;\r\n","import Tween from \"transitions/Tween\";\r\n\r\nlet EasingEnum;\r\n\r\n/**\r\n * @class Easing\r\n * @exports module:transitions/utils/Easing\r\n *\r\n * @type {{Linear: {None: Easing.Linear.None}, Quadratic: {In: Easing.Quadratic.In, Out: Easing.Quadratic.Out, InOut: Easing.Quadratic.InOut}, Cubic: {In: Easing.Cubic.In, Out: Easing.Cubic.Out, InOut: Easing.Cubic.InOut}, Quartic: {In: Easing.Quartic.In, Out: Easing.Quartic.Out, InOut: Easing.Quartic.InOut}, Quintic: {In: Easing.Quintic.In, Out: Easing.Quintic.Out, InOut: Easing.Quintic.InOut}, Sinusoidal: {In: Easing.Sinusoidal.In, Out: Easing.Sinusoidal.Out, InOut: Easing.Sinusoidal.InOut}, Exponential: {In: Easing.Exponential.In, Out: Easing.Exponential.Out, InOut: Easing.Exponential.InOut}, Circular: {In: Easing.Circular.In, Out: Easing.Circular.Out, InOut: Easing.Circular.InOut}, Elastic: {In: Easing.Elastic.In, Out: Easing.Elastic.Out, InOut: Easing.Elastic.InOut}, Back: {In: Easing.Back.In, Out: Easing.Back.Out, InOut: Easing.Back.InOut}, Bounce: {In: Easing.Bounce.In, Out: Easing.Bounce.Out, InOut: Easing.Bounce.InOut}}}\r\n */\r\nlet Easing = {\r\n    Linear: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        None: function (k) {\r\n            return k;\r\n        }\r\n    },\r\n    Quadratic: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return k * k;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return k * (2 - k);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if ((k *= 2) < 1) return 0.5 * k * k;\r\n            return -0.5 * (--k * (k - 2) - 1);\r\n        }\r\n    },\r\n\r\n    Cubic: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return k * k * k;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return --k * k * k + 1;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if ((k *= 2) < 1) return 0.5 * k * k * k;\r\n            return 0.5 * ((k -= 2) * k * k + 2);\r\n        }\r\n    },\r\n\r\n    Quartic: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return k * k * k * k;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return 1 - (--k * k * k * k);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if ((k *= 2) < 1)  return 0.5 * k * k * k * k;\r\n            return -0.5 * ((k -= 2) * k * k * k - 2);\r\n        }\r\n    },\r\n\r\n    Quintic: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return k * k * k * k * k;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return --k * k * k * k * k + 1;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if ((k *= 2) < 1) return 0.5 * k * k * k * k * k;\r\n            return 0.5 * ((k -= 2) * k * k * k * k + 2);\r\n        }\r\n\r\n    },\r\n\r\n    Sinusoidal: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return 1 - Math.cos(k * Math.PI / 2);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return Math.sin(k * Math.PI / 2);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            return 0.5 * (1 - Math.cos(Math.PI * k));\r\n        }\r\n    },\r\n\r\n    Exponential: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return k === 0 ? 0 : Math.pow(1024, k - 1);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return k === 1 ? 1 : 1 - Math.pow(2, -10 * k);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if (k === 0) return 0;\r\n            if (k === 1) return 1;\r\n            if ((k *= 2) < 1) return 0.5 * Math.pow(1024, k - 1);\r\n\r\n            return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2);\r\n        }\r\n    },\r\n\r\n    Circular: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return 1 - Math.sqrt(1 - k * k);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            return Math.sqrt(1 - (--k * k));\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if ((k *= 2) < 1) return -0.5 * (Math.sqrt(1 - k * k) - 1);\r\n            return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1);\r\n        }\r\n    },\r\n\r\n    Elastic: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            var s;\r\n            var a = 0.1;\r\n            var p = 0.4;\r\n\r\n            if (k === 0) return 0;\r\n            if (k === 1) return 1;\r\n\r\n            if (!a || a < 1) {\r\n                a = 1;\r\n                s = p / 4;\r\n            } else {\r\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\r\n            }\r\n\r\n            return -(a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            var s;\r\n            var a = 0.1;\r\n            var p = 0.4;\r\n\r\n            if (k === 0) return 0;\r\n            if (k === 1) return 1;\r\n\r\n            if (!a || a < 1) {\r\n                a = 1;\r\n                s = p / 4;\r\n            } else {\r\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\r\n            }\r\n\r\n            return (a * Math.pow(2, -10 * k) * Math.sin((k - s) * (2 * Math.PI) / p) + 1);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n\r\n            var s;\r\n            var a = 0.1;\r\n            var p = 0.4;\r\n\r\n            if (k === 0) return 0;\r\n            if (k === 1) return 1;\r\n\r\n            if (!a || a < 1) {\r\n                a = 1;\r\n                s = p / 4;\r\n            } else {\r\n                s = p * Math.asin(1 / a) / (2 * Math.PI);\r\n            }\r\n\r\n            if ((k *= 2) < 1) {\r\n                return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p));\r\n            }\r\n\r\n            return a * Math.pow(2, -10 * (k -= 1)) * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1;\r\n\r\n        }\r\n\r\n    },\r\n\r\n    Back: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            var s = 1.70158;\r\n\r\n            return k * k * ((s + 1) * k - s);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            var s = 1.70158;\r\n\r\n            return --k * k * ((s + 1) * k + s) + 1;\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            var s = 1.70158 * 1.525;\r\n            if ((k *= 2) < 1) return 0.5 * (k * k * ((s + 1) * k - s));\r\n\r\n            return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2);\r\n        }\r\n    },\r\n\r\n    Bounce: {\r\n        /**\r\n         * @return {number}\r\n         */\r\n        In: function (k) {\r\n            return 1 - Tween.Easing.Bounce.Out(1 - k);\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        Out: function (k) {\r\n            if (k < (1 / 2.75)) {\r\n                return 7.5625 * k * k;\r\n            } else if (k < (2 / 2.75)) {\r\n                return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75;\r\n            } else if (k < (2.5 / 2.75)) {\r\n                return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375;\r\n            } else {\r\n                return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375;\r\n            }\r\n        },\r\n\r\n        /**\r\n         * @return {number}\r\n         */\r\n        InOut: function (k) {\r\n            if (k < 0.5) return Tween.Easing.Bounce.In(k * 2) * 0.5;\r\n            return Tween.Easing.Bounce.Out(k * 2 - 1) * 0.5 + 0.5;\r\n        }\r\n    },\r\n\r\n    get: (easing) => {\r\n        if (EasingEnum[easing] !== undefined) {\r\n            return EasingEnum[easing];\r\n        }\r\n\r\n        // TODO:: Exceptions\r\n        //throw new InvalidArgumentException('Unknown easing: ' + easing);\r\n    },\r\n    register: (easing, easingFunction) => {\r\n        EasingEnum[easing] = easingFunction;\r\n    }\r\n};\r\n\r\nEasingEnum = {\r\n    'linear': Easing.Linear.None,\r\n\r\n    'quadratic-in': Easing.Quadratic.In,\r\n    'quadratic-out': Easing.Quadratic.Out,\r\n    'quadratic-in-out': Easing.Quadratic.InOut,\r\n\r\n    'cubic-in': Easing.Cubic.In,\r\n    'cubic-out': Easing.Cubic.Out,\r\n    'cubic-in-out': Easing.Cubic.InOut,\r\n\r\n    'quartic-in': Easing.Quartic.In,\r\n    'quartic-out': Easing.Quartic.Out,\r\n    'quartic-in-out': Easing.Quartic.InOut,\r\n\r\n    'quintic-in': Easing.Quintic.In,\r\n    'quintic-out': Easing.Quintic.Out,\r\n    'quintic-in-out': Easing.Quintic.InOut,\r\n\r\n    'sinusoidal-in': Easing.Sinusoidal.In,\r\n    'sinusoidal-out': Easing.Sinusoidal.Out,\r\n    'sinusoidal-in-out': Easing.Sinusoidal.InOut,\r\n\r\n    'exponential-in': Easing.Exponential.In,\r\n    'exponential-out': Easing.Exponential.Out,\r\n    'exponential-in-out': Easing.Exponential.InOut,\r\n\r\n    'circular-in': Easing.Circular.In,\r\n    'circular-out': Easing.Circular.Out,\r\n    'circular-in-out': Easing.Circular.InOut,\r\n\r\n    'elastic-in': Easing.Elastic.In,\r\n    'elastic-out': Easing.Elastic.Out,\r\n    'elastic-in-out': Easing.Elastic.InOut,\r\n\r\n    'back-in': Easing.Back.In,\r\n    'back-out': Easing.Back.Out,\r\n    'back-in-out': Easing.Back.InOut,\r\n\r\n    'bounce-in': Easing.Bounce.In,\r\n    'bounce-out': Easing.Bounce.Out,\r\n    'bounce-in-out': Easing.Bounce.InOut\r\n};\r\n\r\nexport default Easing;\r\n","import Pointer from \"io/devices/Pointer\";\r\n\r\nexport default class Touch extends Pointer {\r\n    static DeviceName = Pointer.prototype.constructor.name; // this fix device name in InputHandler\r\n\r\n    constructor(input) {\r\n        super(input);\r\n    }\r\n\r\n    init(input) {\r\n        if (input !== undefined && this.input === undefined) this.input = input;\r\n        return true;\r\n    };\r\n\r\n    update() {\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        return true;\r\n    };\r\n\r\n    enable() {\r\n        throw new Error('Error. IO interface \"' + Touch.IO + '\" exist, but not supported yet.');\r\n        //return true;\r\n    };\r\n\r\n    disable() {\r\n        throw new Error('Error. IO interface \"' + Touch.IO + '\" exist, but not supported yet.');\r\n        //return true;\r\n    };\r\n}\r\n","import Device from \"api/Device\";\r\n\r\nexport default class Pointer extends Device {\r\n    constructor(input) {\r\n        super(input);\r\n        if (this.constructor.name === 'Pointer') {\r\n            throw new Error('Error. Pointer is abstract class.');\r\n        }\r\n    }\r\n\r\n    setPointerImage(image) {\r\n        if (image) {\r\n            switch (image) {\r\n                case 'none':\r\n                case 'default':\r\n                case 'auto':\r\n                case 'crosshair':\r\n                case 'e-resize':\r\n                case 'help':\r\n                case 'move':\r\n                case 'n-resize':\r\n                case 'ne-resize':\r\n                case 'nw-resize':\r\n                case 'pointer':\r\n                case 'progress':\r\n                case 's-resize':\r\n                case 'se-resize':\r\n                case 'sw-resize':\r\n                case 'text':\r\n                case 'w-resize':\r\n                case 'wait':\r\n                case 'inherit':\r\n                    break;\r\n                default:\r\n                    image = 'url(\"' + image + '\"), auto'\r\n            }\r\n        }\r\n        this.input.data.pointer.image = this.input.store.pointer.image = this.input.options.cursor = image;\r\n        window.document.body.style.cursor = this.input.data.pointer.image;\r\n        return this;\r\n    };\r\n\r\n    toggleCursor(toggle) {\r\n        if (this.input.data.image !== 'none' && (toggle === undefined || toggle === false)) {\r\n            this.input.store.pointer.image = window.document.body.style.cursor;\r\n            window.document.body.style.cursor = 'none';\r\n        } else {\r\n            window.document.body.style.cursor = this.input.store.pointer.image;\r\n        }\r\n        return this;\r\n    };\r\n\r\n    isPointerVisible() {\r\n        return this.input.data.pointer.image === 'none';\r\n    };\r\n\r\n    getPointerPosition() {\r\n        if (this.data.pointer === undefined) return [0, 0];\r\n        return [this.data.pointer.x, this.data.pointer.y];\r\n    };\r\n\r\n    getPointerMoveDistance() {\r\n        if (this.data.pointer === undefined) return 0;\r\n        return this.data.pointer.distance;\r\n    };\r\n}\r\n","import Pointer from \"io/devices/Pointer\";\r\n\r\nexport default class Mouse extends Pointer {\r\n    static DeviceName = Pointer.prototype.constructor.name; // this fix device name in InputHandler\r\n\r\n    __fixMouseButtonId = (id) => {\r\n        if (id > 2) {\r\n            return id;\r\n        } else if (id === 0) {\r\n            return 'LEFT';\r\n        } else if (id === 1) {\r\n            return 'MIDDLE';\r\n        } else if (id === 2) {\r\n            return 'RIGHT';\r\n        }\r\n    };\r\n\r\n    keyMouseDownEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n\r\n        var keyCode = this.input.KEYS_HELPER.getKeyById('KEY_MOUSE_' + this.__fixMouseButtonId(e.button));\r\n        if (!this.input.data.keys.keysDown.includes(keyCode)) {\r\n            this.input.data.keys.keysDown.push(keyCode);\r\n        }\r\n\r\n        this.input.store.recordMouseDragDistance = true;\r\n        this.input.store.pointer = {\r\n            tracker: {\r\n                x: e.pageX,\r\n                y: e.pageY\r\n            }\r\n        };\r\n\r\n        this.input.store.recordMouseClickTime = true;\r\n        if (this.input.store.keys.pressedTime[keyCode] !== undefined) {\r\n            this.input.store.keys.pressedTime[keyCode].delta = this.input.store.keys.pressedTime[keyCode].startTime - e.timeStamp\r\n        } else {\r\n            this.input.store.keys.pressedTime[keyCode] = {\r\n                startTime: e.timeStamp,\r\n                delta: 0\r\n            };\r\n        }\r\n\r\n        this.input.events.trigger('io.mouseKeyDown', e);\r\n    };\r\n\r\n    keyMouseUpEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n\r\n        var keyCode = this.input.KEYS_HELPER.getKeyById('KEY_MOUSE_' + this.__fixMouseButtonId(e.button));\r\n        if (!this.input.data.keys.keysUp.includes(keyCode)) {\r\n            this.input.data.keys.keysUp.push(keyCode);\r\n        }\r\n\r\n        this.input.store.recordMouseDragDistance = false;\r\n        this.input.data.pointer.distance = 0;\r\n        this.input.store.pointer = {\r\n            tracker: {\r\n                x: 0,\r\n                y: 0\r\n            }\r\n        };\r\n\r\n        this.input.store.recordMouseClickTime = false;\r\n        if (this.input.store.keys.pressedTime[keyCode] !== undefined) {\r\n            this.input.store.keys.pressedTime.splice(keyCode, 1)\r\n        }\r\n\r\n        this.input.events.trigger('io.mouseKeyUp', e);\r\n    };\r\n\r\n    keyMouseMoveEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n\r\n        this.input.data.pointer = {\r\n            x: e.pageX,\r\n            y: e.pageY,\r\n            distance: (this.input.store.recordMouseDragDistance) ? Math.sqrt(\r\n                Math.pow((e.pageX - this.input.store.pointer.tracker.x), 2)\r\n                + Math.pow((e.pageY - this.input.store.pointer.tracker.y), 2)\r\n            ).toFixed(2) : 0.0,\r\n            image: this.input.data.pointer.image\r\n        };\r\n\r\n        this.input.events.trigger('io.mouseMove', e);\r\n    };\r\n\r\n    scrollMouseEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n\r\n        var keyCode = (e.wheelDelta / 120 > 0)\r\n            ? this.input.KEYS_HELPER.getKeyById('SCROLL_MOUSE_UP')\r\n            : this.input.KEYS_HELPER.getKeyById('SCROLL_MOUSE_DOWN');\r\n\r\n        if (!this.input.data.keys.keysUp.includes(keyCode)) {\r\n            this.input.data.keys.keysUp.push(keyCode);\r\n            this.input.data.keys.keysDown.push(keyCode);\r\n        }\r\n\r\n        this.input.events.trigger('io.mouseScroll', e);\r\n    };\r\n\r\n    constructor(input) {\r\n        super(input);\r\n\r\n        this.keyMouseDownEventHandler = this.keyMouseDownEventHandler.bind(this);\r\n        this.keyMouseUpEventHandler = this.keyMouseUpEventHandler.bind(this);\r\n        this.keyMouseMoveEventHandler = this.keyMouseMoveEventHandler.bind(this);\r\n        this.scrollMouseEventHandler = this.scrollMouseEventHandler.bind(this);\r\n    }\r\n\r\n    init(input) {\r\n        if (input !== undefined && this.input === undefined) this.input = input;\r\n        this.input.data.keys = {\r\n            keysUp: [],\r\n            keysDown: []\r\n        };\r\n        this.input.store.keys = {\r\n            pressedTime: []\r\n        };\r\n        this.input.data.pointer = {\r\n            image: this.input.options.cursor || 'none',\r\n            x: 0,\r\n            y: 0,\r\n            distance: 0\r\n        };\r\n        this.input.store.pointer = {\r\n            tracker: {\r\n                x: 0,\r\n                y: 0\r\n            },\r\n            image: this.input.options.cursor || 'none'\r\n        };\r\n        this.input.store.recordMouseDragDistance = false;\r\n        this.input.store.recordMouseClickTime = false;\r\n        this.setPointerImage(this.input.options.cursor || 'none');\r\n    };\r\n\r\n    update() {\r\n        //TODO:: fix pointer by viewport scene\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        if (this.input.data.keys !== undefined) {\r\n            this.input.data.keys = {\r\n                keysUp: [],\r\n                keysDown: []\r\n            };\r\n        }\r\n        if (this.input.data.pointer !== undefined) {\r\n            this.input.data.pointer = {\r\n                image: this.input.options.pointer || 'none',\r\n                x: 0,\r\n                y: 0,\r\n                distance: 0\r\n            };\r\n        }\r\n        return true;\r\n    };\r\n\r\n    enable() {\r\n        window.addEventListener('mousedown', this.keyMouseDownEventHandler, false);\r\n        window.addEventListener('mouseup', this.keyMouseUpEventHandler, false);\r\n        window.addEventListener('mousemove', this.keyMouseMoveEventHandler, false);\r\n        window.addEventListener('wheel', this.scrollMouseEventHandler, false);\r\n        return true;\r\n    };\r\n\r\n    disable() {\r\n        window.removeEventListener('mousedown', this.keyMouseDownEventHandler, false);\r\n        window.removeEventListener('mouseup', this.keyMouseUpEventHandler, false);\r\n        window.removeEventListener('mousemove', this.keyMouseMoveEventHandler, false);\r\n        window.removeEventListener('wheel', this.scrollMouseEventHandler, false);\r\n        return true;\r\n    };\r\n}\r\n","import Device from \"api/Device\";\r\n\r\nexport default class Keyboard extends Device {\r\n    keyDownEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n        if (!this.input.data.keys.keysDown.includes(e.keyCode)) {\r\n            this.input.data.keys.keysDown.push(e.keyCode);\r\n        }\r\n\r\n        this.input.store.recordKeyPressTime = true;\r\n        if (this.input.store.keys.pressedTime[e.keyCode] !== undefined) {\r\n            this.input.store.keys.pressedTime[e.keyCode].delta = this.input.store.keys.pressedTime[e.keyCode].startTime - e.timeStamp\r\n        } else {\r\n            this.input.store.keys.pressedTime[e.keyCode] = {\r\n                startTime: e.timeStamp,\r\n                delta: 0\r\n            };\r\n        }\r\n\r\n        this.input.events.trigger('io.keyboardKeyDown', e);\r\n    };\r\n\r\n    keyUpEventHandler = (e) => {\r\n        if (this.input.isEnabled && this.input.preventDefault) e.preventDefault();\r\n        if (!this.input.data.keys.keysUp.includes(e.keyCode)) {\r\n            this.input.data.keys.keysUp.push(e.keyCode);\r\n        }\r\n\r\n        this.input.store.recordKeyPressTime = false;\r\n        if (this.input.store.keys.pressedTime[e.keyCode] !== undefined) {\r\n            this.input.store.keys.pressedTime.splice(e.keyCode, 1)\r\n        }\r\n\r\n        this.input.events.trigger('io.keyboardKeyUp', e);\r\n    };\r\n\r\n    constructor(input) {\r\n        super(input);\r\n\r\n        this.keyDownEventHandler = this.keyDownEventHandler.bind(this);\r\n        this.keyUpEventHandler = this.keyUpEventHandler.bind(this);\r\n    }\r\n\r\n    init(input) {\r\n        if (input !== undefined && this.input === undefined) this.input = input;\r\n        this.input.data.keys = {\r\n            keysUp: [],\r\n            keysDown: []\r\n        };\r\n        this.input.store.keys = {\r\n            pressedTime: []\r\n        };\r\n        this.input.store.recordKeyPressTime = false;\r\n    };\r\n\r\n    update() {\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        if (this.input.data.keys !== undefined) {\r\n            this.input.data.keys = {\r\n                keysUp: [],\r\n                keysDown: []\r\n            };\r\n        }\r\n        return true;\r\n    };\r\n\r\n    enable() {\r\n        window.addEventListener('keydown', this.keyDownEventHandler, false);\r\n        window.addEventListener('keyup', this.keyUpEventHandler, false);\r\n        return true;\r\n    };\r\n\r\n    disable() {\r\n        window.removeEventListener('keydown', this.keyDownEventHandler, false);\r\n        window.removeEventListener('keyup', this.keyUpEventHandler, false);\r\n        return true;\r\n    };\r\n};\r\n","import Device from \"api/Device\";\r\n\r\nexport default class Joystick extends Device {\r\n    constructor(input) {\r\n        super(input);\r\n    }\r\n\r\n    init(input) {\r\n        if (input !== undefined && this.input === undefined) this.input = input;\r\n        return true;\r\n    };\r\n\r\n    update() {\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        return true;\r\n    };\r\n\r\n    enable() {\r\n        throw new Error('Error. IO interface \"' + Joystick.IO + '\" exist, but not supported yet.');\r\n        //return true;\r\n    };\r\n\r\n    disable() {\r\n        throw new Error('Error. IO interface \"' + Joystick.IO + '\" exist, but not supported yet.');\r\n        //return true;\r\n    };\r\n}\r\n\r\n","import PrototypeInterface from \"api/PrototypeInterface\";\r\n\r\n/**\r\n * IHandler\r\n * @constructor\r\n */\r\nexport default class IHandler extends PrototypeInterface {\r\n}\r\n","import PrototypeInterface from \"api/PrototypeInterface\";\r\n\r\n/**\r\n * IEngineComponent\r\n * @constructor\r\n */\r\nexport default class IEngineComponent extends PrototypeInterface {\r\n};\r\n","import Vector2d from \"utils/Vector2d\";\r\n\r\n/**\r\n * @class Vector2dInteger\r\n * @exports module:utils/Vector2dInteger\r\n *\r\n * @constructor\r\n * @extends utils/Vector2d\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\nexport default class Vector2dInteger extends Vector2d {\r\n    constructor(x, y) {\r\n        super(x >> 0, y >> 0);\r\n    }\r\n\r\n    /**\r\n     * @param {Array.<number>} array\r\n     * @returns {Vector2d|Vector2dInteger}\r\n     */\r\n    fromArray(array) {\r\n        this.x = array[0] >> 0;\r\n        this.y = array[1] >> 0;\r\n\r\n        return this;\r\n    }\r\n}\r\n","/**\r\n * @class Vector2d\r\n * @exports module:utils/Vector2d\r\n *\r\n * @constructor\r\n * @param {number} x\r\n * @param {number} y\r\n */\r\nexport default class Vector2d {\r\n    constructor(x, y) {\r\n        this.x = x;\r\n        this.y = y;\r\n    }\r\n\r\n    /**\r\n     * @returns {number}\r\n     */\r\n    getX() {\r\n        return this.x;\r\n    }\r\n\r\n    /**\r\n     * @returns {number}\r\n     */\r\n    getY() {\r\n        return this.y;\r\n    }\r\n\r\n    /**\r\n     * @returns {{x: number, y: number}}\r\n     */\r\n    getVector() {\r\n        return {x: this.x, y: this.y};\r\n    }\r\n\r\n    /**\r\n     * @returns {Array.<number>}\r\n     */\r\n    toArray() {\r\n        return [this.x, this.y];\r\n    }\r\n\r\n    /**\r\n     * @param {Array.<number>} array\r\n     * @returns {Vector2d}\r\n     */\r\n    fromArray(array) {\r\n        this.x = array[0];\r\n        this.y = array[1];\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {string}\r\n     */\r\n    toString() {\r\n        return \"(\" + this.x + \",\" + this.y + \")\";\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d} vector1\r\n     * @param {Vector2d} vector2\r\n     * @returns {number}\r\n     */\r\n    static getDistance(vector1, vector2) {\r\n        return Math.sqrt(\r\n            Math.pow(vector2.getVector().x - vector1.getVector().x, 2) +\r\n            Math.pow(vector2.getVector().y - vector1.getVector().y, 2)\r\n        );\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d} vector1\r\n     * @param {Vector2d} vector2\r\n     * @returns {number}\r\n     */\r\n    static getAngle(vector1, vector2) {\r\n        return Math.atan2(\r\n                vector2.getVector().y - vector1.getVector().y,\r\n                vector2.getVector().x - vector1.getVector().x\r\n            ) * (180 / Math.PI);\r\n    }\r\n}\r\n","/**\r\n * @class MathUtil\r\n * @exports module:utils/MathUtil\r\n *\r\n * @constructor\r\n */\r\nexport default class MathUtil {\r\n    /**\r\n     * @param {number} number\r\n     * @returns {number}\r\n     */\r\n    static number2Integer(number) {\r\n        return number >> 0;\r\n    }\r\n\r\n    /**\r\n     * @param {number} number\r\n     * @returns {boolean}\r\n     */\r\n    static isInteger(number) {\r\n        return typeof number === \"number\" && isFinite(number)\r\n            && number > -9007199254740992 && number < 9007199254740992\r\n            && Math.floor(number) === number;\r\n    }\r\n\r\n    /**\r\n     * @param {number} min\r\n     * @param {number} max\r\n     * @param {number} opacity\r\n     * @returns {string}\r\n     */\r\n    static randomColor(min, max, opacity) {\r\n        return 'rgba('\r\n            + MathUtil.random(min, max) + ', '\r\n            + MathUtil.random(min, max) + ', '\r\n            + MathUtil.random(min, max) + ', '\r\n            + opacity + ')';\r\n    }\r\n\r\n    /**\r\n     * @param {number} min\r\n     * @param {number} max\r\n     * @param {boolean} [omitZero]\r\n     * @returns {number}\r\n     */\r\n    static random(min, max, omitZero) {\r\n        var random = (Math.floor(Math.random() * (max - min + 1) + min));\r\n        return (omitZero && random == 0)\r\n            ? MathUtil.random(min, max, omitZero)\r\n            : random;\r\n    }\r\n\r\n    /**\r\n     * @param {number} degree\r\n     * @returns {number}\r\n     */\r\n    static degree2Radian(degree) {\r\n        return degree * (Math.PI / 180);\r\n    }\r\n\r\n    /**\r\n     * @param {number} radian\r\n     * @returns {number}\r\n     */\r\n    static radian2Degree(radian) {\r\n        return radian * (180 / Math.PI);\r\n    }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport Events from \"utils/Events\";\r\nimport Easing from \"transitions/utils/Easing\";\r\nvar tweens = [];\r\n\r\n/**\r\n * @class Tween\r\n * @exports module:transitions/Tween\r\n *\r\n * @constructor\r\n * @param {BaseNode|{data: object}} tweenNode\r\n * @param {Tween.defaults|Object} [data]\r\n * @property {Tween.defaults} data\r\n */\r\nexport default class Tween {\r\n    static defaults = {\r\n        currentStateAnimation: 0,\r\n        tweenStateStack: [],\r\n        tweenStateTimings: [],\r\n        chainedTweensStack: [],\r\n\r\n        isAnimated: false,\r\n        isStarted: false,\r\n        startTime: null,\r\n\r\n        delayTime: 0,\r\n\r\n        defaultDuration: 1000\r\n    };\r\n\r\n    static stateDefaults = {\r\n        data: null,\r\n        duration: 1000,\r\n        delay: 0,\r\n        easing: 'linear',\r\n        interpolation: 'linear'\r\n    };\r\n\r\n    static Easing = Easing;\r\n\r\n    constructor(tweenNode, data) {\r\n        this.data = ObjectUtil.extend(true, {}, Tween.defaults, data);\r\n        this.node = tweenNode;\r\n        this.events = new Events();\r\n\r\n        this.state = {};\r\n\r\n        // TODO:: Exceptions\r\n        // if (!(node instanceof BaseNode) || typeof node.data !== 'object') {\r\n        //     throw new InvalidArgumentException('Unknown tween node');\r\n        // }\r\n    }\r\n\r\n    /* Methods */\r\n    /**\r\n     * @param {Tween.defaults|Object} data\r\n     * @returns {{data: null, duration: number, delay: number, easing: string, interpolation: string}}\r\n     */\r\n    _tweenStateData(data) {\r\n        return (data !== undefined && typeof data === 'object')\r\n            ? ObjectUtil.extend(true, {}, Tween.stateDefaults, data)\r\n            : Tween.stateDefaults;\r\n    }\r\n\r\n    /**\r\n     * @param {Object} properties\r\n     * @param {Tween.defaults|Object} [data]\r\n     * @returns {Tween}\r\n     */\r\n    to(properties, data) {\r\n        var tween = this;\r\n\r\n        if (!tween.data.isStarted) {\r\n\r\n            if (typeof data === 'number') data = {data: data};\r\n            var stateData = (typeof data !== 'number') ? this._tweenStateData(data) : data;\r\n            if (data !== undefined && typeof data === 'number') stateData.duration = data;\r\n\r\n            tween.data.tweenStateStack.push([properties, stateData]);\r\n\r\n            return tween;\r\n        }\r\n\r\n        // TODO:: Exceptions\r\n        // throw new RuntimeException('You can not add a state after the start of the tween.');\r\n    }\r\n\r\n    /**\r\n     * @param {number} time\r\n     * @returns {boolean}\r\n     */\r\n    update(time) {\r\n        var tween = this;\r\n\r\n        var nextState = tween.data.tweenStateStack[tween.data.currentStateAnimation + 1];\r\n\r\n        if (time < tween.data.startTime || nextState === undefined) return true;\r\n\r\n        if (!tween.data.isStarted) {\r\n            tween.events.trigger('start', [tween.node]);\r\n            tween.data.isStarted = true;\r\n        }\r\n\r\n        var currentState = tween.data.tweenStateStack[tween.data.currentStateAnimation];\r\n\r\n        var previousStatesTime = tween.getStateTimeDuration(tween.data.currentStateAnimation, true);\r\n\r\n        var elapsed = (time - (tween.data.startTime + previousStatesTime)) / nextState[1].duration;\r\n        elapsed = elapsed > 1 ? 1 : elapsed;\r\n\r\n        tween.node.import(\r\n            Tween.util.animateTween(currentState[0], nextState[0], Easing.get(nextState[1].easing)(elapsed))\r\n        );\r\n\r\n        tween.events.trigger('update', [tween.node]);\r\n\r\n        if (elapsed === 1) {\r\n            if (tween.data.currentStateAnimation < tween.data.tweenStateStack.length) {\r\n                tween.data.currentStateAnimation++;\r\n            } else {\r\n                tween.events.trigger('complete', [tween.node]);\r\n\r\n                for (var i = 0; i < tween.data.chainedTweensStack.length; i++) {\r\n                    tween.data.chainedTweensStack[i].start(\r\n                        tween.data.startTime + tween.getStateTimeDuration(tween.data.currentStateAnimation - 1, true)\r\n                    );\r\n                }\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n\r\n    _calculateStackStateTimings(tweenStateStack) {\r\n        var result = [];\r\n\r\n        tweenStateStack.forEach(function (value) {\r\n            result.push(value[1].duration);\r\n        });\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [position]\r\n     * @param {boolean} [withPrevious]\r\n     *\r\n     * @returns {number}\r\n     */\r\n    getStateTimeDuration(position, withPrevious) {\r\n        if (position === undefined || position === null) position = this.data.currentStateAnimation;\r\n        if (withPrevious === undefined) withPrevious = false;\r\n\r\n        if (this.data.tweenStateTimings[position] === undefined) return 0;\r\n\r\n        if (withPrevious) {\r\n            var result = 0;\r\n            for (var i = 1; i <= position; i++) {\r\n                result += this.data.tweenStateTimings[i];\r\n            }\r\n            return result;\r\n        } else {\r\n            return this.data.tweenStateTimings[position];\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {Array.<Object, Tween.stateDefaults>} startState\r\n     * @param {Array.<Array<Object, Tween.stateDefaults>>} tweenStateStack\r\n     */\r\n    _calculateStackState(startState, tweenStateStack) {\r\n        var result = [startState];\r\n        var index = 1;\r\n\r\n        var parsedTweenStateStack = [startState];\r\n        var nextStateDelay = 0;\r\n        var nextAllStateDelay = 0;\r\n\r\n        tweenStateStack.forEach(function (value) {\r\n            if (typeof value[0] === 'object' && !(value[0] instanceof Array)) {\r\n                if (nextStateDelay !== 0) {\r\n                    value[1].delay = nextStateDelay;\r\n                    nextStateDelay = 0;\r\n                } else if (nextAllStateDelay !== 0) {\r\n                    value[1].delay = nextAllStateDelay;\r\n                }\r\n                parsedTweenStateStack.push([value[0], value[1]]);\r\n                index++;\r\n            } else if (typeof value[0] === 'string') {\r\n                var i = 0;\r\n                switch (value[0]) {\r\n                    case 'delay':\r\n                        nextStateDelay = value[1].data;\r\n                        break;\r\n                    case 'delayAll':\r\n                        nextAllStateDelay = value[1].data;\r\n                        break;\r\n                    case 'repeat':\r\n                        for (i = 0; i < value[1].data; i++) {\r\n                            parsedTweenStateStack.push(parsedTweenStateStack[index]);\r\n                            index++;\r\n                        }\r\n                        break;\r\n                    case 'repeatAll':\r\n                        for (i = 0; i < value[1].data; i++) {\r\n                            parsedTweenStateStack.concat(parsedTweenStateStack);\r\n                            index++;\r\n                        }\r\n                        break;\r\n                    case 'yoyo':\r\n                    case 'reverse':\r\n                        for (i = 0; i < value[1].data; i++) {\r\n                            if (parsedTweenStateStack[index - 1] !== undefined) {\r\n                                parsedTweenStateStack.push([\r\n                                    Tween.util.reverseProperties(parsedTweenStateStack[index - 1][0]),\r\n                                    parsedTweenStateStack[index - 1][1]\r\n                                ]);\r\n                                index++;\r\n                            }\r\n                        }\r\n                        break;\r\n                    case 'yoyoAll':\r\n                    case 'reverseAll':\r\n                        for (i = 0; i < value[1].data; i++) {\r\n                            var stateStack = parsedTweenStateStack.slice(0);\r\n\r\n                            var stackLength = stateStack.length;\r\n                            for (var j = 0; j < stackLength; j++) {\r\n                                var sIndex = stackLength - j - 1;\r\n                                if (stateStack[sIndex] !== undefined) {\r\n                                    parsedTweenStateStack.push([\r\n                                        Tween.util.reverseProperties(stateStack[sIndex][0]),\r\n                                        stateStack[sIndex][1]\r\n                                    ]);\r\n                                    index++;\r\n                                }\r\n                            }\r\n                        }\r\n                        break;\r\n                }\r\n            }\r\n        });\r\n\r\n        // parsedTweenStateStack.forEach(function (value) {\r\n        //     console.info(value[0].position.x);\r\n        // });\r\n\r\n        index = 0;\r\n        parsedTweenStateStack.shift();\r\n        parsedTweenStateStack.forEach(function (value) {\r\n            if (typeof value[0] === 'object' && !(value[0] instanceof Array)) {\r\n                result.push([Tween.util.calculateProperties(result[index][0], ObjectUtil.extend(true, {}, result[index][0], value[0])), value[1]]);\r\n                index++;\r\n            }\r\n        });\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [time]\r\n     * @returns {Tween}\r\n     */\r\n    start(time) {\r\n        var tween = this;\r\n        if (time === undefined) time = global.performance.now();\r\n        tween.data.isAnimated = true;\r\n\r\n        if (!tween.data.isStarted) {\r\n            tween.data.isStarted = true;\r\n            tween.state = [Tween.util.cleanProperties(tween.node.data), Tween.stateDefaults];\r\n            tween.data.tweenStateStack = this._calculateStackState(tween.state, tween.data.tweenStateStack);\r\n            tween.data.tweenStateTimings = this._calculateStackStateTimings(tween.data.tweenStateStack);\r\n        }\r\n\r\n        tween.data.startTime = time + tween.data.delayTime;\r\n\r\n        return Tween.add(tween);\r\n    }\r\n\r\n    /**\r\n     * @returns {Tween}\r\n     */\r\n    stop() {\r\n        var tween = this;\r\n        if (!tween.data.isAnimated) return this;\r\n\r\n        tween.data.isAnimated = false;\r\n        tween.events.trigger('stop', [tween.node]);\r\n        tween.stopChainedTweens();\r\n\r\n        return Tween.remove(tween);\r\n    }\r\n\r\n    /**\r\n     * @returns {Tween}\r\n     */\r\n    stopChainedTweens() {\r\n        var tween = this;\r\n        for (var i = 0; i < tween.data.chainedTweensStack.length; i++) {\r\n            tween.data.chainedTweensStack[i].stop();\r\n        }\r\n\r\n        return tween;\r\n    }\r\n\r\n\r\n    /* Extended animation methods */\r\n    /**\r\n     * @param {number} delay\r\n     * @returns {Tween}\r\n     */\r\n    delay(delay) {\r\n        if (delay === undefined) delay = 1000;\r\n        this.to('delay', delay);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} delay\r\n     * @returns {Tween}\r\n     */\r\n    delayAll(delay) {\r\n        if (delay === undefined) delay = 1000;\r\n        this.to('delayAll', delay);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    repeat(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('repeat', count);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    repeatAll(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('repeatAll', count);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    yoyo(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('yoyo', count);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    reverse(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('reverse', count);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    yoyoAll(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('yoyoAll', count);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} [count]\r\n     * @returns {Tween}\r\n     */\r\n    reverseAll(count) {\r\n        if (count === undefined) count = 1;\r\n        this.to('reverseAll', count);\r\n        return this;\r\n    }\r\n\r\n\r\n    /* Events wrappers */\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    on(event, callback) {\r\n        return this.events.on(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    off(event, callback) {\r\n        return this.events.off(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    once(event, callback) {\r\n        return this.events.once(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @returns {boolean}\r\n     */\r\n    flush(event) {\r\n        return this.events.flush(event);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {Array.<*>} data\r\n     * @returns {boolean}\r\n     */\r\n    trigger(event, data) {\r\n        return this.events.trigger(event, data);\r\n    }\r\n\r\n    /* Static Methods */\r\n    /**\r\n     * @param {number} index\r\n     * @returns {Array.<Tween>|Tween}\r\n     */\r\n    static get(index) {\r\n        return (index === undefined) ? tweens : tweens[index];\r\n    }\r\n\r\n    /**\r\n     * @param {Tween} tween\r\n     * @returns {Tween}\r\n     */\r\n    static add(tween) {\r\n        tweens.push(tween);\r\n        return tween;\r\n    }\r\n\r\n    /**\r\n     * @param {Tween} tween\r\n     * @returns {Tween}\r\n     */\r\n    static remove(tween) {\r\n        var i = tweens.indexOf(tween);\r\n        if (i !== -1) tweens.splice(i, 1);\r\n        return tween;\r\n    }\r\n\r\n    /**\r\n     * @returns {void}\r\n     */\r\n    static flush() {\r\n        tweens = [];\r\n    }\r\n\r\n    /**\r\n     * @param {number} time\r\n     * @returns {boolean}\r\n     */\r\n    static update(time) {\r\n        if (tweens.length === 0) return false;\r\n\r\n        var i = 0;\r\n\r\n        while (i < tweens.length) {\r\n            if (tweens[i].update(time)) {\r\n                i++;\r\n            } else {\r\n                tweens.splice(i, 1);\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    static util = {\r\n        animateTween: function (currentState, nextState, value) {\r\n            var result = {};\r\n            var property;\r\n            var temp;\r\n\r\n            for (property in nextState) {\r\n                if (nextState.hasOwnProperty(property) && currentState.hasOwnProperty(property)) {\r\n                    temp = null;\r\n\r\n                    if (typeof nextState[property] === 'number') {\r\n                        if (currentState[property] === nextState[property]) {\r\n                            temp = currentState[property];\r\n                        } else {\r\n                            temp = currentState[property] + (nextState[property] - currentState[property]) * value;\r\n                        }\r\n                    } else if (typeof nextState[property] === 'object') {\r\n                        temp = this.animateTween(currentState[property], nextState[property], value);\r\n                    }\r\n                    if (temp !== null) result[property] = temp;\r\n                }\r\n            }\r\n\r\n            return Object.keys(result).length > 0 ? result : null;\r\n        },\r\n\r\n        cleanProperties: function (properties) {\r\n            var result = {};\r\n            var property;\r\n            var temp;\r\n\r\n            for (property in properties) {\r\n                if (properties.hasOwnProperty(property) && property !== 'id') {\r\n                    temp = null;\r\n                    if ((typeof properties[property] === 'string' && !isNaN(properties[property]))\r\n                        || typeof properties[property] === 'number'\r\n                    ) {\r\n                        temp = properties[property];\r\n                    } else if (typeof properties[property] === 'object') {\r\n                        temp = this.cleanProperties(properties[property]);\r\n                    }\r\n                    if (temp !== null) result[property] = temp;\r\n                }\r\n            }\r\n\r\n            return Object.keys(result).length > 0 ? result : null;\r\n        },\r\n\r\n        reverseProperties: function (properties) {\r\n            var result = {};\r\n            var property;\r\n            var temp;\r\n\r\n            for (property in properties) {\r\n                if (properties.hasOwnProperty(property) && property !== 'id') {\r\n                    temp = null;\r\n                    if (typeof properties[property] === 'string' && !isNaN(properties[property])) {\r\n                        temp = Number(parseFloat(properties[property]) * -1).toString();\r\n                    } else if (typeof properties[property] === 'number') {\r\n                        temp = properties[property];\r\n                    } else if (typeof properties[property] === 'object') {\r\n                        temp = this.reverseProperties(properties[property]);\r\n                    }\r\n                    if (temp !== null) result[property] = temp;\r\n                }\r\n            }\r\n\r\n            return Object.keys(result).length > 0 ? result : null;\r\n        },\r\n\r\n        calculateProperties: function (startProperties, endProperties) {\r\n            var result = {};\r\n            var property;\r\n            var temp;\r\n\r\n            for (property in endProperties) {\r\n                if (endProperties.hasOwnProperty(property) && startProperties.hasOwnProperty(property) && property !== 'id') {\r\n                    temp = null;\r\n\r\n                    if (typeof endProperties[property] === 'string' && !isNaN(endProperties[property]) && typeof startProperties[property] === 'number') {\r\n                        temp = startProperties[property] + parseFloat(endProperties[property]);\r\n                    } else if (typeof endProperties[property] === 'number' && typeof startProperties[property] === 'string' && !isNaN(startProperties[property])) {\r\n                        temp = endProperties[property] - parseFloat(startProperties[property]);\r\n                    } else if (typeof endProperties[property] === 'number' && typeof startProperties[property] === 'number') {\r\n                        temp = endProperties[property];\r\n                    } else if (typeof endProperties[property] === 'object') {\r\n                        temp = this.calculateProperties(startProperties[property], endProperties[property]);\r\n                    }\r\n\r\n                    if (temp !== null) result[property] = temp;\r\n                }\r\n            }\r\n            return Object.keys(result).length > 0 ? result : null;\r\n        }\r\n    }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport AnimatedNode from \"nodes/AnimatedNode\";\r\nimport MathUtil from \"utils/MathUtil\";\r\n\r\n/**\r\n * @class RectNode\r\n * @exports module:nodes/RectNode\r\n *\r\n * @constructor\r\n * @extends nodes/AnimatedNode\r\n * @param {BaseNode.defaults|AnimatedNode.defaults|RectNode.defaults|Object} [data]\r\n * @property {BaseNode.defaults|AnimatedNode.defaults|RectNode.defaults} data\r\n */\r\nexport default class RectNode extends AnimatedNode {\r\n    static defaults = {\r\n        type: 'RectNode',\r\n        color: '#000000'\r\n    };\r\n\r\n    constructor(data) {\r\n        super(ObjectUtil.extend(true, {}, RectNode.defaults, data));\r\n    }\r\n\r\n    /**\r\n     * @returns {string}\r\n     */\r\n    getColor() {\r\n        return this.data.color;\r\n    }\r\n\r\n    /**\r\n     * @param {string} color\r\n     * @returns {RectNode}\r\n     */\r\n    setColor(color) {\r\n        this.data.color = color;\r\n        return this;\r\n    }\r\n\r\n    /* ------------------------------ Draw ------------------------------ */\r\n\r\n    /**\r\n     * @param {CanvasRenderingContext2D} context\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @param {CollectionNode} collection\r\n     * @param {object} data\r\n     * @returns {null}\r\n     */\r\n    draw(context, viewport, collection, data) {\r\n        if (this.data.visible && this.inViewport(viewport)) {\r\n            //console.log(this.inViewport(viewport));\r\n            if (this.data.opacity !== 1.0) {\r\n                var tempOpacity = context.globalAlpha;\r\n                context.globalAlpha = this.data.opacity;\r\n            }\r\n\r\n            if (this.data.angle || viewport.angle !== 0.0) {\r\n                context.save();\r\n\r\n                context.translate(\r\n                    this.getPosition().x - viewport.offset.x,\r\n                    this.getPosition().y - viewport.offset.y);\r\n                context.rotate(MathUtil.degree2Radian(this.data.angle + viewport.angle));\r\n                context.translate(\r\n                    -(this.getPosition().x - viewport.offset.x),\r\n                    -(this.getPosition().y - viewport.offset.y));\r\n            }\r\n\r\n            context.fillStyle = this.data.color;\r\n            context.lineWidth = 0;\r\n\r\n            context.fillRect(\r\n                this.data.position.x - viewport.offset.x,\r\n                this.data.position.y - viewport.offset.y,\r\n                this.data.size.x * this.data.scale * viewport.scale,\r\n                this.data.size.y * this.data.scale * viewport.scale\r\n            );\r\n\r\n            if (this.data.angle || viewport.angle !== 0.0) {\r\n                context.restore();\r\n            }\r\n\r\n            if (this.data.opacity !== 1.0) {\r\n                context.globalAlpha = tempOpacity;\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n\r\n    /* ------------------------------ Render ------------------------------ */\r\n\r\n    /**\r\n     * @override\r\n     *\r\n     * @param {CanvasRenderingContext2D} context\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @param {CollectionNode} collection\r\n     * @param {object} data\r\n     * @returns {BaseNode|AnimatedNode|RectNode}\r\n     */\r\n    render(context, viewport, collection, data) {\r\n        this.draw(context, viewport, collection, data);\r\n        return this;\r\n    }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport AnimatedNode from \"nodes/AnimatedNode\";\r\nimport ArrayMap from \"utils/ArrayMap\";\r\nimport BaseNode from \"nodes/BaseNode\";\r\n\r\n/**\r\n * @class CollectionNode\r\n * @exports module:nodes/CollectionNode\r\n *\r\n * @constructor\r\n * @extends nodes/AnimatedNode\r\n * @param {BaseNode.defaults|AnimatedNode.defaults|CollectionNode.defaults|Object} [data]\r\n * @property {BaseNode.defaults|AnimatedNode.defaults|CollectionNode.defaults} data\r\n */\r\nexport default class CollectionNode extends AnimatedNode {\r\n    static defaults = {\r\n        type: 'CollectionNode',\r\n        /** @type {ArrayMap|null} */\r\n        collection: null,\r\n        zIndex: 1000\r\n    };\r\n\r\n    constructor(data) {\r\n        super(ObjectUtil.extend(true, {}, CollectionNode.defaults, data));\r\n\r\n        if (this.data.collection === null) {\r\n            this.data.collection = new ArrayMap();\r\n        }\r\n    }\r\n\r\n    get zIndex() {\r\n        return 1000 - this.data.zIndex;\r\n    }\r\n\r\n    set zIndex(value) {\r\n        this.data.zIndex = 1000 + value;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseNode|CollectionNode} node\r\n     * @param {string} key\r\n     * @returns {CollectionNode}\r\n     */\r\n    add(node, key) {\r\n        if (node instanceof BaseNode) {\r\n            key = key || node.data.id;\r\n            this.data.collection.add(key, node);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseNode|CollectionNode|null} node\r\n     * @param {string} key\r\n     * @returns {CollectionNode}\r\n     */\r\n    remove(node, key) {\r\n        if (node instanceof BaseNode) {\r\n            this.data.collection.remove(this.data.collection[node.data.id]);\r\n        }\r\n        if (typeof key === 'string' && node === null) {\r\n            this.data.collection.remove(key);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @returns {boolean}\r\n     */\r\n    has(key) {\r\n        return this.data.collection[key] !== undefined;\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @returns {BaseNode|CollectionNode|boolean}\r\n     */\r\n    get(key) {\r\n        if (this.data.collection[key] !== undefined) {\r\n            return this.data.collection[key];\r\n        }\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * @returns {CollectionNode}\r\n     */\r\n    flush() {\r\n        this.data.collection.length = 0;\r\n        return this;\r\n    }\r\n\r\n    /* ------------------------------ Render ------------------------------ */\r\n\r\n    /**\r\n     * @override\r\n     *\r\n     * @param {CanvasRenderingContext2D} context\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @param {CollectionNode} collection\r\n     * @param {object} data\r\n     * @returns {BaseNode|CollectionNode}\r\n     */\r\n    render(context, viewport, collection, data) {\r\n        var collectionNode = this;\r\n\r\n        if (this.data.collection.length !== 0) {\r\n            this.data.collection.each(function (index) {\r\n                if (collectionNode.data.collection.hasOwnProperty(index)\r\n                    && collectionNode.data.collection[index] instanceof BaseNode) {\r\n                    collectionNode.data.collection[index].render(context, viewport, collection, data);\r\n                }\r\n            });\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport AnimatedNode from \"nodes/AnimatedNode\";\r\n\r\n/**\r\n * @class CameraNode\r\n * @exports module:nodes/CameraNode\r\n *\r\n * @constructor\r\n * @extends nodes/AnimatedNode\r\n * @param {BaseNode.defaults|AnimatedNode.defaults|CameraNode.defaults|Object} [data]\r\n * @property {BaseNode.defaults|AnimatedNode.defaults|CameraNode.defaults} data\r\n */\r\nexport default class CameraNode extends AnimatedNode {\r\n    static defaults = {\r\n        type: 'CameraNode'\r\n    };\r\n\r\n    constructor(data) {\r\n        super(ObjectUtil.extend(true, {}, CameraNode.defaults, data));\r\n    }\r\n\r\n    /**\r\n     * @param {{x: number, y: number, offsetX: number, offsetY: number}} screen\r\n     * @param {Function|callback} calculate\r\n     * @returns {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}}\r\n     */\r\n    getCameraViewport(screen, calculate) {\r\n        return calculate(screen, {\r\n            offset: this.data.position,\r\n            size: this.data.size,\r\n            angle: this.data.angle,\r\n            scale: this.data.scale\r\n        });\r\n    };\r\n\r\n    /* ------------------------------ Render ------------------------------ */\r\n\r\n    /**\r\n     * @override\r\n     *\r\n     * @param {CanvasRenderingContext2D} context\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @param {CollectionNode} collection\r\n     * @param {object} data\r\n     * @returns {BaseNode|AnimatedNode|CameraNode}\r\n     */\r\n    render(context, viewport, collection, data) {\r\n        return this;\r\n    }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport UUID from \"utils/UUID\";\r\nimport Vector2d from \"utils/Vector2d\";\r\n\r\n/**\r\n * @class BaseNode\r\n * @exports module:nodes/BaseNode\r\n *\r\n * @abstract\r\n * @constructor\r\n * @param {BaseNode.defaults|Object} [data]\r\n * @property {BaseNode.defaults} data\r\n */\r\n\r\nexport default class BaseNode {\r\n    static defaults = {\r\n        /** @type {string|null} */\r\n        id: null,\r\n        type: 'BaseNode',\r\n\r\n        position: {\r\n            x: 0.0,\r\n            y: 0.0\r\n        },\r\n        size: {\r\n            x: 0.0,\r\n            y: 0.0\r\n        },\r\n        offset: {\r\n            x: 0.0,\r\n            y: 0.0\r\n        },\r\n\r\n        visible: true,\r\n        angle: 0.0,\r\n        scale: 1.0,\r\n        opacity: 1.0,\r\n\r\n        cache: null,\r\n        enabledCache: false // TODO:: Collections & AnimatedPrimitiveNode\r\n    };\r\n\r\n    constructor(data) {\r\n        this.data = ObjectUtil.extend(true, {}, BaseNode.defaults, data);\r\n\r\n        if (this.data.id === null) {\r\n            this.data.id = UUID.generate();\r\n        }\r\n    }\r\n\r\n    get opacity() {\r\n        return this.data.opacity;\r\n    }\r\n\r\n    set opacity(value) {\r\n        this.data.opacity = value;\r\n    }\r\n\r\n    get visible() {\r\n        return this.data.visible;\r\n    }\r\n\r\n    set visible(value) {\r\n        this.data.visible = !!value;\r\n    }\r\n\r\n    get angle() {\r\n        return this.data.angle;\r\n    }\r\n\r\n    set angle(value) {\r\n        this.data.angle = value % 360;\r\n    }\r\n\r\n    get scale() {\r\n        return this.data.scale;\r\n    }\r\n\r\n    set scale(value) {\r\n        this.data.scale = value;\r\n    }\r\n\r\n    get cache() {\r\n        return this.data.enabledCache;\r\n    }\r\n\r\n    set cache(value) {\r\n        this.data.enabledCache = !!value;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseNode.defaults|Object} data\r\n     */\r\n    load(data) {\r\n        this.data = ObjectUtil.extend(true, {}, this.data, data);\r\n    }\r\n\r\n    /**\r\n     * @returns {BaseNode.defaults}\r\n     */\r\n    save() {\r\n        return this.data;\r\n    }\r\n\r\n    /**\r\n     * @returns {Vector2d}\r\n     */\r\n    getPosition() {\r\n        return new Vector2d(this.data.position.x, this.data.position.y);\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d|BaseNode} position\r\n     * @returns {BaseNode}\r\n     */\r\n    setPosition(position) {\r\n        if (position !== undefined) {\r\n            if (position instanceof Vector2d) {\r\n                this.data.position = position.getVector();\r\n            } else if (position instanceof BaseNode) {\r\n                this.data.position = position.getPosition().getVector();\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {Vector2d}\r\n     */\r\n    getSize() {\r\n        return new Vector2d(this.data.size.x, this.data.size.y);\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d|BaseNode} size\r\n     * @returns {BaseNode}\r\n     */\r\n    setSize(size) {\r\n        if (size !== undefined) {\r\n            if (size instanceof Vector2d) {\r\n                this.data.size = size.getVector();\r\n            } else if (size instanceof BaseNode) {\r\n                this.data.size = size.getSize().getVector();\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {Vector2d}\r\n     */\r\n    getOffset() {\r\n        return new Vector2d(this.data.offset.x, this.data.offset.y);\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d|BaseNode} offset\r\n     * @returns {BaseNode}\r\n     */\r\n    setOffset(offset) {\r\n        if (offset !== undefined) {\r\n            if (offset instanceof Vector2d) {\r\n                this.data.offset = offset.getVector();\r\n            } else if (offset instanceof BaseNode) {\r\n                this.data.offset = offset.getOffset().getVector();\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /* ------------------------------ Render ------------------------------ */\r\n\r\n    /**\r\n     * Must be override this in child!\r\n     *\r\n     * @deprecated\r\n     * @overridable\r\n     *\r\n     * @param {CanvasRenderingContext2D} context\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @param {CollectionNode} collection\r\n     * @param {object} data\r\n     * @returns {BaseNode}\r\n     */\r\n    render(context, viewport, collection, data) {\r\n        // throw new Exception('Trying to render base node.'); // TODO:: exceptions\r\n        return this;\r\n    }\r\n\r\n    //TODO:: Fix on fullscreen\r\n    /**\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @returns {boolean}\r\n     */\r\n    inViewport(viewport) {\r\n        return !((this.data.position.x > viewport.offset.x + viewport.size.x\r\n        || this.data.position.x + viewport.size.x < viewport.offset.x)\r\n        || (this.data.position.y > viewport.offset.y + viewport.size.y\r\n        || this.data.position.y + viewport.size.y < viewport.offset.y));\r\n    }\r\n}\r\n\r\n\r\n\r\n\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport BaseNode from \"nodes/BaseNode\";\r\nimport Vector2d from \"utils/Vector2d\";\r\nimport Tween from \"transitions/Tween\";\r\n\r\n// TODO:: move(+v.x, +v.y)\r\n\r\n/**\r\n * @class AnimatedNode\r\n * @exports module:nodes/AnimatedNode\r\n *\r\n * @abstract\r\n * @constructor\r\n * @extends nodes/BaseNode\r\n * @param {BaseNode.defaults|AnimatedNode.defaults|Object} [data]\r\n * @property {BaseNode.defaults|AnimatedNode.defaults} data\r\n */\r\nexport default class AnimatedNode extends BaseNode {\r\n    static defaults = {\r\n        type: 'AnimatedNode'\r\n    };\r\n\r\n    constructor(data) {\r\n        super(ObjectUtil.extend(true, {}, AnimatedNode.defaults, data));\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d|BaseNode} position\r\n     * @param {number} [duration]\r\n     * @param {boolean} [durationAsSpeed]\r\n     */\r\n    moveTo(position, duration, durationAsSpeed) {\r\n        if (duration === undefined || typeof duration !== 'number') duration = 1000.0;\r\n\r\n        if (typeof position === 'object') {\r\n            var tween = new Tween(this);\r\n\r\n            if (position instanceof Vector2d) {\r\n                if (durationAsSpeed) duration = Vector2d.getDistance(this.getPosition(), position) / duration;\r\n                tween.to({\r\n                    position: {\r\n                        x: position.getVector().x,\r\n                        y: position.getVector().y\r\n                    }\r\n                }, duration);\r\n            } else if (position instanceof BaseNode) {\r\n                if (durationAsSpeed) duration = Vector2d.getDistance(this.getPosition(), position.getPosition()) / duration;\r\n                tween.to({\r\n                    position: {\r\n                        x: position.getPosition().getVector().x,\r\n                        y: position.getPosition().getVector().y\r\n                    }\r\n                }, duration);\r\n            }\r\n\r\n            tween.start();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {Vector2d|BaseNode} size\r\n     * @param {number} [duration]\r\n     * @param {boolean} [durationAsSpeed]\r\n     */\r\n    resizeTo(size, duration, durationAsSpeed) {\r\n        if (duration === undefined || typeof duration !== 'number') duration = 1000.0;\r\n        if (typeof position === 'object') {\r\n            var tween = new Tween(this);\r\n\r\n            if (size instanceof Vector2d) {\r\n                if (durationAsSpeed) duration = Vector2d.getDistance(this.getSize(), size) / duration;\r\n                tween.to({\r\n                    size: {\r\n                        x: size.getVector().x,\r\n                        y: size.getVector().y\r\n                    }\r\n                }, duration);\r\n            } else if (size instanceof BaseNode) {\r\n                if (durationAsSpeed) duration = Vector2d.getDistance(this.getSize(), size.getSize()) / duration;\r\n                tween.to({\r\n                    size: {\r\n                        x: size.getSize().getVector().x,\r\n                        y: size.getSize().getVector().y\r\n                    }\r\n                }, duration);\r\n            }\r\n\r\n            tween.start();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {number|BaseNode} angle\r\n     * @param {number} [duration]\r\n     */\r\n    rotateTo(angle, duration) {\r\n        if (duration === undefined || typeof duration !== 'number') duration = 1000.0;\r\n        var tween = new Tween(this);\r\n\r\n        if (typeof angle === 'number') {\r\n            tween.to({angle: angle % 360}, duration);\r\n        } else if (typeof angle === 'object' && angle instanceof BaseNode) {\r\n            tween.to({\r\n                angle: Vector2d.getAngle(angle.getPosition(), this.getPosition())\r\n            }, duration);\r\n        }\r\n\r\n        tween.start();\r\n    }\r\n\r\n    /**\r\n     * @param {number} [velocity]\r\n     */\r\n    turn(velocity) {\r\n        if (velocity === undefined || typeof velocity !== 'number') velocity = 1.0;\r\n        this.angle += velocity;\r\n    }\r\n}\r\n","import BaseGameState from \"states/BaseGameState\";\r\n\r\n/**\r\n * Default game state\r\n *\r\n * @class DefaultGameState\r\n * @abstract\r\n * @constructor\r\n *\r\n * @param {GameStatesManager} gsm\r\n * @param {DefaultGameState.defaults|BaseGameState.defaults|Object} [data]\r\n * @property {DefaultGameState.defaults|BaseGameState.defaults|Object} data\r\n */\r\nexport default class DefaultGameState extends BaseGameState {\r\n    constructor(gsm, data) {\r\n        if (data === undefined) data = {};\r\n        data.id = 'init_j2d';\r\n        super(gsm, data);\r\n    }\r\n\r\n    // init(data) {\r\n    //     return BaseGameState.prototype.init.call(this, data);\r\n    // }\r\n    //\r\n    // load(data) {\r\n    //     return BaseGameState.prototype.load.call(this, data);\r\n    // }\r\n\r\n    update(timestamp, data) {\r\n        setTimeout(function () {\r\n            this.gsm.setNextState();\r\n        }.bind(this), 1000);\r\n        return true;\r\n    }\r\n\r\n    // render(timestamp, data) {\r\n    //     return true;\r\n    // }\r\n    //\r\n    // unload(data) {\r\n    //     return BaseGameState.prototype.unload.call(this, data);\r\n    // }\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport UUID from \"utils/UUID\";\r\nimport Events from \"utils/Events\";\r\n/**\r\n * Base class of state\r\n *\r\n * @class BaseGameState\r\n * @abstract\r\n * @constructor\r\n *\r\n * @param {GameStatesManager} gsm\r\n * @param {BaseGameState.defaults|Object} [data]\r\n * @property {BaseGameState.defaults|Object} data\r\n * @property {string} id\r\n */\r\nexport default class BaseGameState {\r\n    static defaults = {\r\n        id: 'BaseState',\r\n        currentState: 0\r\n    };\r\n\r\n    static STATE = {\r\n        STATE_NOT_LOADED: 0,\r\n        STATE_INIT: 1,\r\n        STATE_LOAD: 2,\r\n        STATE_UPDATE: 3,\r\n        STATE_RENDER: 4,\r\n        STATE_UNLOAD: 5\r\n    };\r\n\r\n    constructor(gsm, data) {\r\n        if (data === undefined) data = {};\r\n        if (data === undefined) data = {};\r\n        data.currentState = 0;\r\n        if (data.id === undefined || data.id === null) {\r\n            data.id = UUID.generate();\r\n        }\r\n        this.data = ObjectUtil.extend(true, {}, BaseGameState.defaults, data);\r\n\r\n        this.gsm = gsm;\r\n        this.loader = null;\r\n        this.events = new Events();\r\n    }\r\n\r\n    get id() {\r\n        return this.data.id;\r\n    }\r\n\r\n    set id(value) {\r\n        this.data.id = value;\r\n    }\r\n\r\n    init(data) {\r\n        if (typeof data === 'object' && data.callback !== undefined) {\r\n            data.callback();\r\n        }\r\n        return true;\r\n    }\r\n\r\n    load(data) {\r\n        if (typeof data === 'object' && data.callback !== undefined) data.callback();\r\n        return true;\r\n    }\r\n\r\n    update(timestamp, data) {\r\n        return true;\r\n    }\r\n\r\n    render(timestamp, data) {\r\n        return true;\r\n    }\r\n\r\n    unload(data) {\r\n        if (typeof data === 'object' && data.callback !== undefined) data.callback();\r\n        return true;\r\n    }\r\n\r\n    /* Events wrappers */\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    on(event, callback) {\r\n        return this.events.on(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    off(event, callback) {\r\n        return this.events.off(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {function} callback\r\n     * @returns {boolean}\r\n     */\r\n    once(event, callback) {\r\n        return this.events.once(event, callback);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @returns {boolean}\r\n     */\r\n    flush(event) {\r\n        return this.events.flush(event);\r\n    }\r\n\r\n    /**\r\n     * @param {string} event\r\n     * @param {Array.<*>} data\r\n     * @returns {boolean}\r\n     */\r\n    trigger(event, data) {\r\n        return this.events.trigger(event, data);\r\n    }\r\n}\r\n","/**\r\n * @class Video\r\n * @exports module:media/Video\r\n *\r\n * @constructor\r\n */\r\nexport default class Video {\r\n}\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport UUID from \"utils/UUID\";\r\nimport Events from \"utils/Events\";\r\nimport Audio from \"media/Audio\";\r\n\r\nvar cache = {};\r\nvar audioContext;\r\nvar masterGain;\r\n\r\nfunction createMasterGain() {\r\n    if (audioContext) {\r\n        masterGain = (audioContext.createGain === undefined)\r\n            ? audioContext.createGainNode()\r\n            : audioContext.createGain();\r\n        masterGain.gain.value = 1;\r\n        masterGain.connect(audioContext.destination);\r\n        return masterGain;\r\n    }\r\n    return null;\r\n}\r\n\r\n/**\r\n * @class Sound\r\n * @exports module:media/Sound\r\n *\r\n * @constructor\r\n * @extends media/Audio\r\n * @param {Audio.defaults|Object} [data]\r\n * @param {MediaManager} [manager]\r\n */\r\nexport default class Sound extends Audio {\r\n    static defaults = {\r\n        id: null,\r\n        src: [],\r\n        format: null,\r\n        autoPlay: false,\r\n\r\n        duration: 0,\r\n        loop: false,\r\n        sprite: {},\r\n        volume: 1,\r\n        muted: false,\r\n        pos3d: [0, 0, -0.5],\r\n        rate: 1,\r\n\r\n        loaded: false,\r\n        buffer: false,\r\n        model: null,\r\n        onEndTimer: []\r\n    };\r\n\r\n    constructor(data, manager) {\r\n        super(data, manager);\r\n\r\n        this.manager = manager;\r\n        this.events = !!this.manager ? this.manager.events : new Events();\r\n        this.data = ObjectUtil.extend(true, {}, Sound.defaults, data);\r\n        this.audioNode = [];\r\n        audioContext = manager\r\n            ? manager.getAudioContext()\r\n            : new (window.AudioContext || window.webkitAudioContext);\r\n\r\n        masterGain = manager\r\n            ? manager.getMasterGain()\r\n            : createMasterGain();\r\n\r\n        if (this.data.id === null) {\r\n            this.data.id = UUID.generate();\r\n        }\r\n\r\n        if (audioContext && this.data.buffer) {\r\n            this._setupAudioNode(this);\r\n        }\r\n\r\n        if (this.manager && audioContext && this.manager.data.iOSAutoEnable) {\r\n            this.manager.iOSEnable = true;\r\n        }\r\n\r\n        if (this.manager) this.manager.media.get('sounds').add(this.data.id, this);\r\n\r\n        this.load();\r\n    }\r\n\r\n    _load(sound) {\r\n        loadBuffer(sound, sound.data.src);\r\n        return sound;\r\n    }\r\n\r\n    _unload(soundNode) {\r\n        soundNode.disconnect(0);\r\n    }\r\n\r\n    play(sprite, callback) {\r\n        var sound = this;\r\n\r\n        if (typeof sprite === 'function')  callback = sprite;\r\n\r\n        if (!sprite || typeof sprite === 'function') sprite = 'default';\r\n\r\n        if (!sound.data.loaded) {\r\n            sound.events.on('load', function () {\r\n                sound.play(sprite, callback);\r\n            });\r\n\r\n            return sound;\r\n        }\r\n\r\n        if (!sound.data.sprite[sprite]) {\r\n            if (typeof callback === 'function') callback();\r\n            return sound;\r\n        }\r\n\r\n        sound._inactiveNode(sound, function (node) {\r\n            node.sprite = sprite;\r\n\r\n            var pos = (node.pos > 0) ? node.pos : sound.data.sprite[sprite][0] / 1000;\r\n            var duration = sound.data.sprite[sprite][1] / 1000 - node.pos;\r\n            if (node.pos > 0) pos = sound.data.sprite[sprite][0] / 1000 + pos;\r\n            var loop = !!(sound.data.loop || sound.data.sprite[sprite][2]);\r\n\r\n            var soundId = (typeof callback === 'string')\r\n                ? callback\r\n                : Math.round(Date.now() * Math.random()) + '', timerId;\r\n\r\n            (function () {\r\n                var data = {\r\n                    id: soundId,\r\n                    sprite: sprite,\r\n                    loop: loop\r\n                };\r\n\r\n                timerId = setTimeout(function () {\r\n                    if (audioContext && !loop) {\r\n                        sound._nodeById(sound, data.id).paused = true;\r\n                        sound._nodeById(sound, data.id).pos = 0;\r\n                        sound._clearEndTimer(sound, data.id);\r\n                    }\r\n                    sound.events.trigger('unload', soundId);\r\n                }, (duration / sound.data.rate) * 1000);\r\n\r\n                sound.data.onEndTimer.push({timer: timerId, id: data.id});\r\n            })();\r\n\r\n            var loopStart = sound.data.sprite[sprite][0] / 1000,\r\n                loopEnd = sound.data.sprite[sprite][1] / 1000;\r\n\r\n            node.id = soundId;\r\n            node.paused = false;\r\n            refreshBuffer(sound, [loop, loopStart, loopEnd], soundId);\r\n            sound.data.playStart = audioContext.currentTime;\r\n            node.gain.value = sound.data.volume;\r\n\r\n            if (typeof node.bufferSource.start === 'undefined') {\r\n                loop ? node.bufferSource.noteGrainOn(0, pos, 86400) : node.bufferSource.noteGrainOn(0, pos, duration);\r\n            } else {\r\n                loop ? node.bufferSource.start(0, pos, 86400) : node.bufferSource.start(0, pos, duration);\r\n            }\r\n\r\n            sound.events.trigger('play');\r\n            if (typeof callback === 'function') callback(soundId);\r\n\r\n            return sound;\r\n        });\r\n\r\n        return sound;\r\n    }\r\n\r\n    _pause(activeNode) {\r\n        if (!activeNode.bufferSource || activeNode.paused) {\r\n            return true;\r\n        }\r\n\r\n        activeNode.paused = true;\r\n        if (activeNode.bufferSource.stop == undefined) {\r\n            activeNode.bufferSource.noteOff(0);\r\n        } else {\r\n            activeNode.bufferSource.stop(0);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    _stop(activeNode) {\r\n        if (!activeNode.bufferSource || activeNode.paused) {\r\n            return true;\r\n        }\r\n\r\n        activeNode.paused = true;\r\n\r\n        if (typeof activeNode.bufferSource.stop === 'undefined') {\r\n            activeNode.bufferSource.noteOff(0);\r\n        } else {\r\n            activeNode.bufferSource.stop(0);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    _mute(activeNode) {\r\n        activeNode.gain.value = 0;\r\n    }\r\n\r\n    _unMute(activeNode) {\r\n        activeNode.gain.value = this.data.volume;\r\n    }\r\n\r\n    _volume(activeNode, vol) {\r\n        activeNode.gain.value = vol;\r\n    }\r\n\r\n    _position(activeNode, v) {\r\n        if (v !== undefined && v == true) return activeNode.pos;\r\n        return activeNode.pos + (audioContext.currentTime - this.data.playStart);\r\n    }\r\n\r\n    _pos3d(activeNode, x, y, z) {\r\n        if (activeNode) {\r\n            this.data.pos3d = [x, y, z];\r\n            activeNode.panner.setPosition(x, y, z);\r\n            activeNode.panner.panningModel = this.data.model || 'HRTF';\r\n        }\r\n    }\r\n\r\n    _setupAudioNode() {\r\n        var sound = this,\r\n            node = sound.audioNode,\r\n            index = sound.audioNode.length;\r\n\r\n        node[index] = (audioContext.createGain === undefined)\r\n            ? audioContext.createGainNode()\r\n            : audioContext.createGain();\r\n\r\n        node[index].gain.value = sound.data.volume;\r\n        node[index].paused = true;\r\n        node[index].pos = 0;\r\n        node[index].readyState = 4;\r\n        node[index].connect(masterGain);\r\n\r\n        node[index].panner = audioContext.createPanner();\r\n        node[index].panner.panningModel = sound.data.model || 'equalpower';\r\n        node[index].panner.setPosition(sound.data.pos3d[0], sound.data.pos3d[1], sound.data.pos3d[2]);\r\n        node[index].panner.connect(node[index]);\r\n\r\n        return node[index];\r\n    }\r\n\r\n    /* Private */\r\n    _inactiveNode(sound, callback) {\r\n        var node = null;\r\n\r\n        for (var i = 0; i < sound.audioNode.length; i++) {\r\n            if (sound.audioNode[i].paused && sound.audioNode[i].readyState === 4) {\r\n                callback(sound.audioNode[i]);\r\n                node = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        sound._drainPool(sound);\r\n\r\n        if (node) return;\r\n\r\n        var newNode = sound._setupAudioNode();\r\n        callback(newNode);\r\n    }\r\n\r\n    _drainPool(sound) {\r\n        var inactive = 0;\r\n\r\n        for (var i = 0; i < sound.audioNode.length; i++) {\r\n            if (sound.audioNode[i].paused) inactive++;\r\n        }\r\n\r\n        for (i = sound.audioNode.length - 1; i >= 0; i--) {\r\n            if (inactive <= 5) break;\r\n\r\n            if (sound.audioNode[i].paused) {\r\n                if (audioContext) sound.audioNode[i].disconnect(0);\r\n                sound.audioNode.splice(i, 1);\r\n                inactive--;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n\r\n/* WebAudioAPI Helpers */\r\n/**\r\n * Buffer a sound from URL (or from cache) and decode to audio source (Web Audio API).\r\n * @param  {Object} sound The Sound object for the sound to load.\r\n * @param  {String} url The path to the sound file.\r\n */\r\nvar loadBuffer = function (sound, url) {\r\n    if (url in cache) {\r\n        sound.data.duration = cache[url].duration;\r\n\r\n        loadSound(sound);\r\n        return;\r\n    }\r\n\r\n    if (/^data:[^;]+;base64,/.test(url)) {\r\n        var data = atob(url.split(',')[1]);\r\n        var dataView = new Uint8Array(data.length);\r\n        for (var i = 0; i < data.length; ++i) {\r\n            dataView[i] = data.charCodeAt(i);\r\n        }\r\n\r\n        decodeAudioData(dataView.buffer, sound, url);\r\n    } else {\r\n        var xhr = new XMLHttpRequest();\r\n        xhr.open('GET', url, true);\r\n        xhr.responseType = 'arraybuffer';\r\n        xhr.onload = function () {\r\n            decodeAudioData(xhr.response, sound, url);\r\n        };\r\n        xhr.onerror = function () {\r\n            if (audioContext) {\r\n                sound.data.buffer = true;\r\n                sound.audioNode = [];\r\n                delete sound.gainNode;\r\n                delete cache[url];\r\n                sound.load();\r\n            }\r\n        };\r\n        try {\r\n            xhr.send();\r\n        } catch (e) {\r\n            xhr.onerror();\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * Decode audio data from an array buffer.\r\n * @param  {ArrayBuffer} arraybuffer The audio data.\r\n * @param  {Object} sound The Sound object for the sound to load.\r\n * @param  {String} url The path to the sound file.\r\n */\r\nvar decodeAudioData = function (arraybuffer, sound, url) {\r\n    audioContext.decodeAudioData(\r\n        arraybuffer,\r\n        function (buffer) {\r\n            if (buffer) {\r\n                cache[url] = buffer;\r\n                loadSound(sound, buffer);\r\n            }\r\n        },\r\n        function (error) {\r\n            sound.events.trigger('loaderror', error);\r\n        }\r\n    );\r\n};\r\n\r\n/**\r\n * Finishes loading the Web Audio API sound and fires the loaded event\r\n * @param  {Object}  sound    The Sound object for the sound to load.\r\n * @param  {Object} [buffer] The decoded buffer sound source.\r\n */\r\nvar loadSound = function (sound, buffer) {\r\n    sound.data.duration = (buffer) ? buffer.duration : sound.data.duration;\r\n\r\n    if (Object.getOwnPropertyNames(sound.data.sprite).length === 0) {\r\n        sound.data.sprite = {default: [0, sound.data.duration * 1000]};\r\n    }\r\n\r\n    if (!sound.data.loaded) {\r\n        sound.data.loaded = true;\r\n        sound.events.trigger('load');\r\n    }\r\n\r\n    if (sound.data.autoPlay) {\r\n        sound.play();\r\n    }\r\n};\r\n\r\n/**\r\n * Load the sound back into the buffer source.\r\n * @param  {Object} sound   The sound to load.\r\n * @param  {Array}  loop  Loop boolean, pos, and duration.\r\n * @param  {String} id    (optional) The play instance ID.\r\n */\r\nvar refreshBuffer = function (sound, loop, id) {\r\n    var node = sound._nodeById(sound, id);\r\n\r\n    node.bufferSource = audioContext.createBufferSource();\r\n    node.bufferSource.buffer = cache[sound.data.src];\r\n    node.bufferSource.connect(node.panner);\r\n    node.bufferSource.loop = loop[0];\r\n    if (loop[0]) {\r\n        node.bufferSource.loopStart = loop[1];\r\n        node.bufferSource.loopEnd = loop[1] + loop[2];\r\n    }\r\n    //noinspection JSPrimitiveTypeWrapperUsage\r\n    node.bufferSource.playbackRate.value = sound.data.rate;\r\n};\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport UUID from \"utils/UUID\";\r\nimport Events from \"utils/Events\";\r\n\r\nvar cache = {};\r\nvar AudioNode = window.Audio;\r\n\r\n/**\r\n * @class Audio\r\n * @exports module:media/Audio\r\n *\r\n * @constructor\r\n * @param {Audio.defaults|Object} [data]\r\n * @param {MediaManager} [manager]\r\n */\r\nexport default class Audio {\r\n    static defaults = {\r\n        id: null,\r\n        src: [],\r\n        format: null,\r\n        autoPlay: false,\r\n\r\n        duration: 0,\r\n        loop: false,\r\n        sprite: {},\r\n        volume: 1,\r\n        muted: false,\r\n        pos3d: [0, 0, -0.5],\r\n\r\n        loaded: false,\r\n        onEndTimer: []\r\n    };\r\n\r\n    constructor(data, manager) {\r\n        var audio = this;\r\n        audio.manager = manager !== undefined ? manager : null;\r\n        audio.events = !!audio.manager ? audio.manager.events : new Events();\r\n        audio.data = ObjectUtil.extend(true, {}, Audio.defaults, data);\r\n\r\n        audio.audioNode = [];\r\n\r\n        if (audio.data.id === null) {\r\n            audio.data.id = UUID.generate();\r\n        }\r\n\r\n        if (audio.manager) audio.manager.media.get('audios').add(audio.data.id, audio);\r\n\r\n        audio.load();\r\n    }\r\n\r\n\r\n    _load(audio) {\r\n        var audioNode = new AudioNode();\r\n\r\n        audioNode.addEventListener('error', function () {\r\n            console.error({type: audioNode.error ? audioNode.error.code : 0});\r\n        }, false);\r\n\r\n        audio.audioNode.push(audioNode);\r\n\r\n        audioNode.src = audio.data.src;\r\n        audioNode.pos = 0;\r\n        audioNode.preload = 'auto';\r\n        audioNode.volume = (!!audio.manager)\r\n            ? (audio.manager.muted) ? 0 : audio.data.volume * (audio.manager.volume / 100)\r\n            : (audio.data.muted) ? 0 : audio.data.volume;\r\n\r\n        var listener = function () {\r\n            audio.data.duration = Math.ceil(audioNode.duration * 10) / 10;\r\n\r\n            if (Object.getOwnPropertyNames(audio.data.sprite).length === 0) {\r\n                audio.data.sprite = {default: [0, audio.data.duration * 1000]};\r\n            }\r\n\r\n            if (!audio.data.loaded) {\r\n                audio.data.loaded = true;\r\n                audio.events.trigger('load');\r\n            }\r\n\r\n            if (audio.data.autoPlay) {\r\n                audio.play();\r\n            }\r\n\r\n            audioNode.removeEventListener('canplaythrough', listener, false);\r\n        };\r\n        audioNode.addEventListener('canplaythrough', listener, false);\r\n        audioNode.load();\r\n\r\n        return audio;\r\n    }\r\n\r\n    load() {\r\n        var audio = this;\r\n        var url = '', extension = '';\r\n\r\n        if (audio.manager && (!!audio.manager.isSupportAudio)) {\r\n            console.warn('No audio support.');\r\n            return false;\r\n        }\r\n\r\n        var extractFormat = function (source, format) {\r\n            if (format) return format;\r\n\r\n            var extension = /^data:audio\\/([^;,]+);/i.exec(source);\r\n            if (!extension) {\r\n                extension = /\\.([^.]+)$/.exec(source.split('?', 1)[0]);\r\n            }\r\n\r\n            if (extension) {\r\n                return extension[1].toLowerCase();\r\n            } else {\r\n                console.warn('Could not extract format from passed URLs, please add format');\r\n            }\r\n            return null;\r\n        };\r\n\r\n        if (audio.data.src instanceof Array) {\r\n            for (var i = 0; i < audio.data.src.length; i++) {\r\n                url = audio.data.src[i];\r\n                extension = extractFormat(audio.data.src[i], audio.data.format);\r\n                if (null !== extension) break;\r\n            }\r\n            audio.data.src = url;\r\n        } else if (typeof audio.data.src === 'string') {\r\n            extension = extractFormat(audio.data.src, audio.data.format);\r\n        } else {\r\n            console.warn('Unknown audio source');\r\n            return false;\r\n        }\r\n\r\n        if (audio.manager && audio.manager.isSupportCodec[extension]) {\r\n            console.warn('Codec not support');\r\n            return false;\r\n        }\r\n\r\n        return audio._load(audio);\r\n    }\r\n\r\n    _unload(audioNode) {\r\n        audioNode.src = '';\r\n    }\r\n\r\n    unload() {\r\n        var audio = this;\r\n\r\n        var nodes = audio.audioNode;\r\n        for (var i = 0; i < audio.audioNode.length; i++) {\r\n            if (!nodes[i].paused) {\r\n                audio.stop(nodes[i].id);\r\n                audio.events.trigger('unload', nodes[i].id);\r\n            }\r\n            audio._unload(nodes[i]);\r\n        }\r\n\r\n        for (i = 0; i < audio.data.onEndTimer.length; i++) {\r\n            clearTimeout(audio.data.onEndTimer[i].timer);\r\n        }\r\n\r\n        if (audio.manager) {\r\n            var audios = this.manager.get('audios');\r\n            var index = audios.indexOf(audio);\r\n            if (index !== null && index >= 0) {\r\n                audios.splice(index, 1);\r\n            }\r\n        }\r\n\r\n        delete cache[audio.data.src];\r\n        audio = null;\r\n    };\r\n\r\n    src(source) {\r\n        var audio = this;\r\n\r\n        if (source) {\r\n            audio.stop();\r\n            audio.data.src = source;\r\n            audio.data.loaded = false;\r\n            audio.load();\r\n        } //TODO:: else throw\r\n\r\n        return null;\r\n    }\r\n\r\n    play(sprite, callback) {\r\n        var audio = this;\r\n\r\n        if (typeof sprite === 'function') callback = sprite;\r\n        if (!sprite || typeof sprite === 'function') sprite = 'default';\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('load', function () {\r\n                audio.play(sprite, callback);\r\n            });\r\n\r\n            return audio;\r\n        }\r\n\r\n        if (!audio.data.sprite[sprite]) {\r\n            if (typeof callback === 'function') callback();\r\n            return audio;\r\n        }\r\n\r\n        audio._inactiveNode(audio, function (node) {\r\n            node.sprite = sprite;\r\n\r\n            var pos = (node.pos > 0) ? node.pos : audio.data.sprite[sprite][0] / 1000;\r\n            var duration = audio.data.sprite[sprite][1] / 1000 - (pos - audio.data.sprite[sprite][0] / 1000);\r\n            var loop = !!(audio.data.loop || audio.data.sprite[sprite][2]);\r\n\r\n            var soundId = (typeof callback === 'string')\r\n                ? callback\r\n                : Math.round(Date.now() * Math.random()) + '', timerId;\r\n\r\n            (function () {\r\n                var data = {\r\n                    id: soundId,\r\n                    sprite: sprite,\r\n                    loop: loop\r\n                };\r\n\r\n                timerId = setTimeout(function () {\r\n                    if (loop) {\r\n                        audio.stop(data.id).play(sprite, data.id);\r\n                    } else {\r\n                        audio.stop(data.id);\r\n                    }\r\n\r\n                    audio.events.trigger('unload', soundId);\r\n                }, (duration / audio.data.rate) * 1000);\r\n\r\n                audio.data.onEndTimer.push({timer: timerId, id: data.id});\r\n            })();\r\n\r\n\r\n            if (node.readyState === 4 || !node.readyState && navigator.isCocoonJS) {\r\n                node.id = soundId;\r\n                node.currentTime = pos;\r\n\r\n                node.muted = audio.manager\r\n                    ? (audio.manager.muted || node.muted)\r\n                    : (audio.data.muted || node.muted);\r\n\r\n                node.volume = audio.manager\r\n                    ? audio.data.volume * (audio.manager.volume / 100)\r\n                    : audio.data.volume;\r\n\r\n                setTimeout(function () {\r\n                    node.play();\r\n                }, 0);\r\n            } else {\r\n                audio._clearEndTimer(soundId);\r\n\r\n                (function () {\r\n                    var audio = audio,\r\n                        playSprite = sprite,\r\n                        fn = callback,\r\n                        newNode = node;\r\n\r\n                    var listener = function () {\r\n                        audio.play(playSprite, fn);\r\n                        newNode.removeEventListener('canplaythrough', listener, false);\r\n                    };\r\n\r\n                    newNode.addEventListener('canplaythrough', listener, false);\r\n                })();\r\n\r\n                return audio;\r\n            }\r\n\r\n            audio.events.trigger('play');\r\n            if (typeof callback === 'function') callback(soundId);\r\n\r\n            return audio;\r\n        });\r\n\r\n        return audio;\r\n    }\r\n\r\n    _pause(activeNode) {\r\n        activeNode.pause();\r\n        return false;\r\n    }\r\n\r\n    pause(id) {\r\n        var audio = this;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('play', function () {\r\n                audio.pause(id);\r\n            });\r\n            return audio;\r\n        }\r\n\r\n        audio._clearEndTimer(audio, id);\r\n\r\n        var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n        if (activeNode) {\r\n            activeNode.pos = audio.pos(null, id);\r\n            var result = audio._pause(activeNode);\r\n            if (result) return audio;\r\n        }\r\n\r\n        audio.events.trigger('pause');\r\n\r\n        return audio;\r\n    }\r\n\r\n    _stop(activeNode) {\r\n        if (!isNaN(activeNode.duration)) {\r\n            activeNode.pause();\r\n            activeNode.currentTime = 0;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    stop(id) {\r\n        var audio = this;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('play', function () {\r\n                audio.stop(id);\r\n            });\r\n\r\n            return audio;\r\n        }\r\n\r\n        audio._clearEndTimer(audio, id);\r\n\r\n        var activeNode = (id) ? audio._nodeById(audio, id) : audio._activeNode(audio);\r\n        if (activeNode) {\r\n            activeNode.pos = 0;\r\n            var result = audio._stop(activeNode);\r\n            if (result) return audio;\r\n        }\r\n\r\n        return audio;\r\n    }\r\n\r\n    _mute(activeNode) {\r\n        activeNode.muted = true;\r\n    }\r\n\r\n    mute(id) {\r\n        var audio = this;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('play', function () {\r\n                audio.mute(id);\r\n            });\r\n            return audio;\r\n        }\r\n\r\n        var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n        if (activeNode) audio._mute();\r\n\r\n        return audio;\r\n    }\r\n\r\n    _unMute(activeNode) {\r\n        activeNode.muted = false;\r\n    }\r\n\r\n    unMute(id) {\r\n        var audio = this;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('play', function () {\r\n                audio.unMute(id);\r\n            });\r\n            return audio;\r\n        }\r\n\r\n        var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n        if (activeNode) audio._unMute();\r\n\r\n        return audio;\r\n    }\r\n\r\n    _volume(activeNode, vol) {\r\n        activeNode.volume = vol;\r\n    }\r\n\r\n    volume(vol, id) {\r\n        var audio = this;\r\n\r\n        vol = parseFloat(vol);\r\n\r\n        if (vol >= 0 && vol <= 1) {\r\n            audio.data.volume = vol;\r\n\r\n            if (!audio.data.loaded) {\r\n                audio.events.on('play', function () {\r\n                    audio.volume(vol, id);\r\n                });\r\n                return audio;\r\n            }\r\n\r\n            var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n            if (activeNode) {\r\n                vol = audio.manager\r\n                    ? vol * (audio.manager.volume / 100)\r\n                    : audio.data.volume;\r\n                audio._volume(vol);\r\n            }\r\n\r\n            return audio;\r\n        }\r\n        return audio.data.volume;\r\n    }\r\n\r\n    loop(loop) {\r\n        var audio = this;\r\n\r\n        if (typeof loop === 'boolean') {\r\n            audio.data.loop = loop;\r\n            return audio;\r\n        }\r\n        return audio.data.loop;\r\n    }\r\n\r\n    sprite(sprite) {\r\n        var audio = this;\r\n\r\n        if (typeof sprite === 'object') {\r\n            audio.data.sprite = sprite;\r\n            return audio;\r\n        }\r\n        return audio.data.sprite;\r\n    }\r\n\r\n    _position(activeNode, v) {\r\n        return activeNode.currentTime;\r\n    }\r\n\r\n    pos(pos, id) {\r\n        var audio = this;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('load', function () {\r\n                audio.pos(pos);\r\n            });\r\n            return typeof pos === 'number' ? audio : audio.data.pos || 0;\r\n        }\r\n\r\n        pos = parseFloat(pos);\r\n\r\n        var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n        if (activeNode) {\r\n            if (pos >= 0) {\r\n                audio.pause(id);\r\n                activeNode.pos = pos;\r\n                audio.play(activeNode.sprite, id);\r\n                return audio;\r\n            } else {\r\n                return audio._position(activeNode, false);\r\n            }\r\n        } else if (pos >= 0) {\r\n            return audio;\r\n        } else {\r\n            for (var i = 0; i < audio.audioNode.length; i++) {\r\n                if (audio.audioNode[i].paused && audio.audioNode[i].readyState === 4) {\r\n                    return audio._position(audio.audioNode[i], true);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    _pos3d(activeNode, x, y, zsaz) {\r\n        return null;\r\n    }\r\n\r\n    pos3d(x, y, z, id) {\r\n        var audio = this;\r\n\r\n        y = (typeof y === 'undefined' || !y) ? 0 : y;\r\n        z = (typeof z === 'undefined' || !z) ? -0.5 : z;\r\n\r\n        if (!audio.data.loaded) {\r\n            audio.events.on('play', function () {\r\n                audio.pos3d(x, y, z, id);\r\n            });\r\n            return audio;\r\n        }\r\n\r\n        if (x >= 0 || x < 0) {\r\n            var activeNode = (id) ? audio._nodeById(id) : audio._activeNode(audio);\r\n            audio._pos3d(activeNode, x, y, z);\r\n        } else {\r\n            return audio.data.pos3d;\r\n        }\r\n\r\n        return audio;\r\n    }\r\n\r\n    /* Private */\r\n    _nodeById(audio, id) {\r\n        var node = audio.audioNode[0];\r\n\r\n        for (var i = 0; i < audio.audioNode.length; i++) {\r\n            if (audio.audioNode[i].id === id) {\r\n                node = audio.audioNode[i];\r\n                break;\r\n            }\r\n        }\r\n\r\n        return node;\r\n    }\r\n\r\n    _clearEndTimer(audio, id) {\r\n        var index = -1;\r\n\r\n        for (var i = 0; i < audio.data.onEndTimer.length; i++) {\r\n            if (audio.data.onEndTimer[i].id === id) {\r\n                index = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        var timer = audio.data.onEndTimer[index];\r\n        if (timer) {\r\n            clearTimeout(timer.timer);\r\n            audio.data.onEndTimer.splice(index, 1);\r\n        }\r\n    }\r\n\r\n    _activeNode(audio) {\r\n        var node = null;\r\n\r\n        for (var i = 0; i < audio.audioNode.length; i++) {\r\n            if (!audio.audioNode[i].paused) {\r\n                node = audio.audioNode[i];\r\n                break;\r\n            }\r\n        }\r\n\r\n        audio._drainPool(audio);\r\n\r\n        return node;\r\n    }\r\n\r\n    _inactiveNode(audio, callback) {\r\n        var node = null;\r\n\r\n        for (var i = 0; i < audio.audioNode.length; i++) {\r\n            if (audio.audioNode[i].paused && audio.audioNode[i].readyState === 4) {\r\n                callback(audio.audioNode[i]);\r\n                node = true;\r\n                break;\r\n            }\r\n        }\r\n\r\n        audio._drainPool(audio);\r\n\r\n        if (node) return;\r\n\r\n        audio.load();\r\n        var newNode = audio.audioNode[audio.audioNode.length - 1];\r\n        var listenerEvent = navigator.isCocoonJS ? 'canplaythrough' : 'loadedmetadata';\r\n        var listener = function () {\r\n            newNode.removeEventListener(listenerEvent, listener, false);\r\n            callback(newNode);\r\n        };\r\n        newNode.addEventListener(listenerEvent, listener, false);\r\n    }\r\n\r\n    _drainPool(audio) {\r\n        var inactive = 0;\r\n\r\n        for (var i = 0; i < audio.audioNode.length; i++) {\r\n            if (audio.audioNode[i].paused) inactive++;\r\n        }\r\n\r\n        for (i = audio.audioNode.length - 1; i >= 0; i--) {\r\n            if (inactive <= 5) break;\r\n\r\n            if (audio.audioNode[i].paused) {\r\n                audio.audioNode.splice(i, 1);\r\n                inactive--;\r\n            }\r\n        }\r\n    }\r\n}\r\n","/**\r\n * Assets Loader\r\n *\r\n * @class AssetsLoader\r\n * @exports module:loaders/AssetsLoader\r\n *\r\n * @constructor\r\n */\r\nexport default class AssetsLoader {\r\n    progress = 0;\r\n\r\n    getProgress() {\r\n        return this.progress;\r\n    }\r\n\r\n    load() {\r\n    }\r\n\r\n    isLoaded(index) {\r\n    }\r\n\r\n    dispose(index) {\r\n    }\r\n}\r\n","/**\r\n * @class Events\r\n * @exports module:utils/Events\r\n *\r\n * @constructor\r\n */\r\nexport default class Events {\r\n    events = [];\r\n    onces = [];\r\n\r\n    constructor() {\r\n        this.flush();\r\n    }\r\n\r\n    /**\r\n     * @param {string} [eventName]\r\n     */\r\n    flush(eventName) {\r\n        if (eventName !== undefined) {\r\n            if (this.events[eventName] !== undefined) {\r\n                this.events[eventName] = [];\r\n            }\r\n            if (this.onces[eventName] !== undefined) {\r\n                this.onces[eventName] = [];\r\n            }\r\n        } else {\r\n            this.onces = [];\r\n            this.events = [];\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    on(eventName, callback) {\r\n        if (this.events[eventName] !== undefined) {\r\n            var stack = this.events[eventName];\r\n            if (stack.indexOf(callback) === -1) {\r\n                stack.push(callback);\r\n            }\r\n        } else {\r\n            this.events[eventName] = [];\r\n            this.events[eventName].push(callback)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    once(eventName, callback) {\r\n        if (this.onces[eventName] !== undefined) {\r\n            var stack = this.onces[eventName];\r\n            if (stack.indexOf(callback) === -1) {\r\n                stack.push(callback);\r\n            }\r\n        } else {\r\n            this.onces[eventName] = [];\r\n            this.onces[eventName].push(callback)\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    off(eventName, callback) {\r\n        if (this.onces[eventName] !== undefined) {\r\n            var stack = this.events[eventName];\r\n            if (stack.indexOf(callback) !== -1) {\r\n                stack.splice(stack.indexOf(callback));\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {Object} [data]\r\n     */\r\n    trigger(eventName, data) {\r\n        var stack, i;\r\n\r\n        if (this.events[eventName] !== undefined) {\r\n            stack = this.events[eventName];\r\n            for (i = 0; i < stack.length; i++) {\r\n                stack[i].call(stack[i], data);\r\n            }\r\n        }\r\n\r\n        if (this.onces[eventName] !== undefined) {\r\n            stack = this.onces[eventName];\r\n            for (i = 0; i < stack.length; i++) {\r\n                stack[i].call(stack[i], data);\r\n            }\r\n            this.flush(eventName);\r\n        }\r\n    };\r\n}\r\n","/**\r\n * @class ArrayMap\r\n * @exports module:utils/ArrayMap\r\n *\r\n * @constructor\r\n * @extends Array\r\n * @param args\r\n */\r\nexport default class ArrayMap extends Array {\r\n    last = () => {\r\n        return this[this.length - 1];\r\n    };\r\n\r\n    constructor(args) {\r\n        super(args);\r\n    }\r\n\r\n    /**\r\n     * @param {ArrayMap.<T>} array\r\n     * @returns {boolean}\r\n     */\r\n    equals(array) {\r\n        if (!array)\r\n            return false;\r\n\r\n        if (this.length != array.length)\r\n            return false;\r\n\r\n        for (var i = 0, l = this.length; i < l; i++) {\r\n            if (this[i] instanceof Array && array[i] instanceof Array) {\r\n                if (!this[i].equals(array[i]))\r\n                    return false;\r\n            }\r\n            else if (this[i] != array[i]) {\r\n                return false;\r\n            }\r\n        }\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @param {string|Object} object\r\n     * @returns {boolean}\r\n     */\r\n    contains(object) {\r\n        var i = this.length;\r\n        while (i--) {\r\n            if (this[i] === object) {\r\n                return true;\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * @param {Function} callback\r\n     * @returns {boolean}\r\n     */\r\n    each(callback) {\r\n        if (!callback) return false;\r\n        var result = false;\r\n        for (var i = 0; i < this.length; i++) {\r\n            if ((result = callback(this[i], i)) == false) {\r\n                return result;\r\n            }\r\n        }\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * @param {string|Object} key\r\n     * @param {*} value\r\n     * @returns {ArrayMap.<T>}\r\n     */\r\n    add(key, value) {\r\n        if (this.contains(key))\r\n            this[key] = value;\r\n        else {\r\n            this.push(key);\r\n            this[key] = value;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string|Object} key\r\n     * @returns {*}\r\n     */\r\n    get(key) {\r\n        return this.contains(key) ? this[key] : null;\r\n    }\r\n\r\n    /**\r\n     * @param {string|Object} key\r\n     * @returns {ArrayMap.<T>}\r\n     */\r\n    remove(key) {\r\n        for (var i = 0; i < this.length; ++i) {\r\n            if (this[i] == key) {\r\n                this.splice(i, 1);\r\n                delete this[key];\r\n                return this;\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","/**\r\n * @class ObjectUtil\r\n * @exports module:utils/ObjectUtil\r\n *\r\n * @constructor\r\n */\r\nexport default class ObjectUtil {\r\n    static extend() {\r\n        var args = Array.prototype.slice.call(arguments);\r\n        var deepness = false;\r\n        if (typeof args[0] === 'boolean') {\r\n            deepness = args[0];\r\n            args.splice(0, 1);\r\n        }\r\n\r\n        var out = args[0] || function () {\r\n                if (args[1] !== undefined && args[1] !== null && typeof args[1] === 'object') {\r\n                    return Object.create(args[1])\r\n                }\r\n                return {};\r\n            }();\r\n\r\n        for (var i = 1; i < args.length; i++) {\r\n            var object = args[i];\r\n\r\n            if (!object) continue;\r\n\r\n            for (var key in object) {\r\n                //noinspection JSUnresolvedFunction\r\n                if (object.hasOwnProperty(key)) {\r\n                    if (typeof object[key] === 'object' && object[key] !== null) {\r\n                        out[key] = deepness ? ObjectUtil.extend(deepness, out[key], object[key]) : object[key];\r\n                    } else {\r\n                        out[key] = object[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return out;\r\n    }\r\n}\r\n","import ObjectUtil from \"../utils/ObjectUtil\";\r\nimport Events from \"../utils/Events\";\r\nimport ArrayMap from \"../utils/ArrayMap\";\r\n/**\r\n * j2D (JavaScript 2D Engine)\r\n *\r\n * @authors DeVinterX, James Simpson of GoldFire Studios(howler.js)\r\n * @original_source https://github.com/goldfire/howler.js/blob/master/howler.js\r\n * @license BSD, MIT(howler.js)\r\n * @version 0.2.0-dev\r\n */\r\n\r\nvar AudioNode = window.Audio;\r\nvar audioContext = false;\r\nvar html5Audio = false;\r\n\r\ntry {\r\n    //noinspection JSUnresolvedVariable\r\n    var AudioContext = window.AudioContext || window.webkitAudioContext;\r\n    audioContext = new AudioContext();\r\n} catch (e) {\r\n    console.warn('Web Audio API is not supported in your browser');\r\n}\r\n\r\ntry {\r\n    //noinspection JSUnresolvedFunction\r\n    html5Audio = !!new AudioNode();\r\n} catch (e) {\r\n    console.warn('HTML5 Audio is not supported in your browser');\r\n}\r\n\r\nif (audioContext) {\r\n    var masterGain = (audioContext.createGain === undefined)\r\n        ? audioContext.createGainNode()\r\n        : audioContext.createGain();\r\n    masterGain.gain.value = 1;\r\n    masterGain.connect(audioContext.destination);\r\n}\r\n\r\n/* MediaManager */\r\n\r\n/**\r\n * @class MediaManager\r\n * @exports module:io/MediaManager\r\n *\r\n * @param {EngineJ2D} j2d\r\n * @param {MediaManager.defaults|Object|undefined} [data]\r\n * @constructor\r\n */\r\nexport default class MediaManager {\r\n    static defaults = {\r\n        volume: 1,\r\n        muted: false,\r\n        codecs: {},\r\n        iOSAutoEnable: true\r\n    };\r\n\r\n    constructor(j2d, data) {\r\n        if (data === undefined) data = {};\r\n        this.j2d = j2d;\r\n        this.data = ObjectUtil.extend(true, {}, MediaManager.defaults, data);\r\n        this.events = new Events();\r\n        this.media = new ArrayMap();\r\n\r\n        this.media.add('sounds', new ArrayMap());\r\n        this.media.add('audios', new ArrayMap());\r\n        this.media.add('videos', new ArrayMap());\r\n\r\n        this.volume = this.data.volume * 100;\r\n        this.iOSEnabled = false;\r\n\r\n        if (audioContext || html5Audio) {\r\n            var test = new AudioNode();\r\n            this.data.codecs = {\r\n                mp3: !!test.canPlayType('audio/mpeg;').replace(/^no$/, ''),\r\n                opus: !!test.canPlayType('audio/ogg; codecs=\"opus\"').replace(/^no$/, ''),\r\n                ogg: !!test.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, ''),\r\n                wav: !!test.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/, ''),\r\n                aac: !!test.canPlayType('audio/aac;').replace(/^no$/, ''),\r\n                m4a: !!(test.canPlayType('audio/x-m4a;') || test.canPlayType('audio/m4a;') || test.canPlayType('audio/aac;')).replace(/^no$/, ''),\r\n                mp4: !!(test.canPlayType('audio/x-mp4;') || test.canPlayType('audio/mp4;') || test.canPlayType('audio/aac;')).replace(/^no$/, ''),\r\n                weba: !!test.canPlayType('audio/webm; codecs=\"vorbis\"').replace(/^no$/, '')\r\n            };\r\n            test = null;\r\n        }\r\n    }\r\n\r\n    get volume() {\r\n        return this.data.volume * 100;\r\n    }\r\n\r\n    set volume(value) {\r\n        this.data.volume = parseFloat(value / 100);\r\n\r\n        if (value >= 0 && value <= 1) {\r\n            if (audioContext) {\r\n                masterGain.gain.value = this.data.volume;\r\n            } else {\r\n                var sounds = this.media.get('sounds');\r\n                for (var key in sounds) {\r\n                    if (sounds.hasOwnProperty(key) && !sounds[key].webAudio) {\r\n                        for (var i = 0; i < sounds[key].audioNode.length; i++) {\r\n                            sounds[key].audioNode[i].volume = sounds[key].volume * this.data.volume;\r\n                        }\r\n                    }\r\n                }\r\n                sounds = null;\r\n            }\r\n        }\r\n    }\r\n\r\n    get muted() {\r\n        return !!this.data.muted;\r\n    }\r\n\r\n    set muted(value) {\r\n        this.data.muted = !!value;\r\n\r\n        if (audioContext) {\r\n            masterGain.gain.value = this.data.muted ? 0 : this.data.volume;\r\n        } else {\r\n            var sounds = this.media.get('sounds');\r\n            for (var key in sounds) {\r\n                if (sounds.hasOwnProperty(key) && sounds[key].webAudio === false) {\r\n                    for (var i = 0; i < sounds[key].audioNode.length; i++) {\r\n                        sounds[key].audioNode[i].muted = this.data.muted;\r\n                    }\r\n                }\r\n            }\r\n            sounds = null;\r\n        }\r\n    }\r\n\r\n    get iOSEnable() {\r\n        return !!this.data.iOSAutoEnable;\r\n    }\r\n\r\n    set iOSEnable(value) {\r\n        if (audioContext && (this.iOSEnabled || !/iPhone|iPad|iPod/i.test(navigator.userAgent))) {\r\n            return value;\r\n        }\r\n        this.iOSEnabled = false;\r\n\r\n        var unlock = function () {\r\n            var buffer = audioContext.createBuffer(1, 1, 22050);\r\n            var source = audioContext.createBufferSource();\r\n            source.buffer = buffer;\r\n            source.connect(audioContext.destination);\r\n\r\n            if (source.start === undefined) {\r\n                source.noteOn(0);\r\n            } else {\r\n                source.start(0);\r\n            }\r\n\r\n            setTimeout(function () {\r\n                if ((source.playbackState === source.PLAYING_STATE\r\n                    || source.playbackState === source.FINISHED_STATE)) {\r\n                    this.iOSEnabled = true;\r\n                    this.data.iOSAutoEnable = false;\r\n\r\n                    window.removeEventListener('touchend', unlock, false);\r\n                }\r\n            }, 0);\r\n        };\r\n        window.addEventListener('touchend', unlock, false);\r\n    }\r\n\r\n    get isSupportAudio() {\r\n        return !audioContext && !html5Audio;\r\n    }\r\n\r\n\r\n    getAudioContext() {\r\n        return audioContext;\r\n    }\r\n\r\n    getMasterGain() {\r\n        return masterGain;\r\n    }\r\n\r\n    mute() {\r\n        this.muted = true;\r\n        return this;\r\n    }\r\n\r\n    unMute() {\r\n        this.muted = false;\r\n        return this;\r\n    }\r\n\r\n    isSupportCodec(fileExtension) {\r\n        return !!this.data.codecs[fileExtension];\r\n    }\r\n\r\n    addSound(data) {\r\n        new Sound(data, this);\r\n        return this;\r\n    }\r\n\r\n    addAudio(data) {\r\n        new Audio(data, this);\r\n        return this;\r\n    }\r\n\r\n    addVideo(data) {\r\n        //new Video(this, data);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} id\r\n     * @returns {Sound}\r\n     */\r\n    sound(id) {\r\n        return this.media.get('sounds').get(id);\r\n    }\r\n\r\n    audio(id) {\r\n        return this.media.get('audios').get(id);\r\n    }\r\n\r\n    video(id) {\r\n        return this.media.get('videos').get(id);\r\n    }\r\n\r\n    removeSound(id) {\r\n        if (this.media.get('sounds').contains(id)) {\r\n            this.media.get('sounds').get(id).stop();\r\n            this.media.get('sounds').remove(id);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    removeAudio(id) {\r\n        if (this.media.get('audios').contains(id)) {\r\n            this.media.get('audios').get(id).stop();\r\n            this.media.get('audios').remove(id);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    removeVideo(id) {\r\n        if (this.media.get('videos').contains(id)) {\r\n            this.media.get('videos').get(id).stop();\r\n            this.media.get('videos').remove(id);\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","import ArrayMap from \"utils/ArrayMap\";\r\nimport Vector2d from \"utils/Vector2d\";\r\n\r\n/**\r\n * @param e\r\n * @param {boolean} [enableCallback]\r\n * @returns {boolean}\r\n */\r\nvar checkKeyMap = function (e, enableCallback) {\r\n    if (enableCallback === undefined) enableCallback = true;\r\n\r\n    var j2d = e.data.manager.j2d,\r\n        manager = e.data.manager,\r\n        keyCode = e.which,\r\n        keyMap = e.data.manager.keyMap;\r\n\r\n    for (var index in keyMap) {\r\n        if (keyMap.hasOwnProperty(index)) {\r\n            var value = keyMap[index];\r\n            if (!$.isArray(value[0]) && value[0] === keyCode && !!value[1]) {\r\n                if (typeof value[1] === 'string') {\r\n                    value[1] = eval('(' + value[1] + ')');\r\n                }\r\n                if ((typeof value[1] === 'function') && enableCallback) {\r\n                    value[1](j2d, value[2]);\r\n                }\r\n                return true;\r\n            } else if ($.isArray(value[0])\r\n                && manager.data.keysPressed.equals(value[0]) && !!value[1]\r\n            ) {\r\n                if (typeof value[1] === 'string') {\r\n                    value[1] = eval('(' + value[1] + ')');\r\n                }\r\n                if (typeof value[1] === 'function' && enableCallback) {\r\n                    value[1](j2d, value[2]);\r\n                }\r\n                return true\r\n            }\r\n        }\r\n    }\r\n    return false\r\n};\r\nvar events = {\r\n    onMouseClick: function (e) {\r\n        var manager = e.data.manager;\r\n        if (!manager.data.enabled || !manager.j2d.isPlay || !manager.j2d.element.hasClass('active')) return true;\r\n        var keysPressed = manager.data.keysPressed;\r\n        var keyCode = getKey(DEPRECATED_InputManager.key, e.which) || 'KEY_UNKNOWN_' + e.which;\r\n        var mouse = manager.data.mouse;\r\n\r\n        if (e.data.event !== 2) {\r\n            if (e.data.event === 0) {\r\n                if (-1 === $.inArray(DEPRECATED_InputManager.key[keyCode], keysPressed)) {\r\n                    keysPressed.push(DEPRECATED_InputManager.key[keyCode]);\r\n\r\n                    if (manager.data.enableAdditionalData) {\r\n                        mouse.startPosition.x = e.pageX;\r\n                        mouse.startPosition.y = e.pageY;\r\n                        mouse.distance = 0;\r\n\r\n                        manager.data.timePressed = e.timeStamp;\r\n                    }\r\n                }\r\n                if (checkKeyMap(e, false) || manager.data.preventAll) {\r\n                    e.preventDefault();\r\n                }\r\n            } else {\r\n                if (checkKeyMap(e) || manager.data.preventAll) {\r\n                    e.preventDefault();\r\n                }\r\n                if (manager.data.enableAdditionalData) {\r\n                    mouse.previousDistance = mouse.distance;\r\n                    mouse.startPosition.x = 0;\r\n                    mouse.startPosition.y = 0;\r\n                }\r\n\r\n                keysPressed.splice(\r\n                    keysPressed.indexOf(DEPRECATED_InputManager.key[keyCode]), 1\r\n                );\r\n            }\r\n            manager.element.trigger(e.data.event === 0 ?\r\n                'mouseKeyDown' : 'mouseKeyUp', {keyCode: keyCode}\r\n            );\r\n        } else {\r\n            if (checkKeyMap(e, false)) {\r\n                e.preventDefault();\r\n            }\r\n        }\r\n    },\r\n\r\n    onMouseWheel: function (e) {\r\n        var manager = e.data.manager;\r\n        if (!manager.data.enabled || !manager.j2d.isPlay || !manager.j2d.element.hasClass('active')) return true;\r\n        var keysPressed = manager.data.keysPressed;\r\n        var keyCode = (e.originalEvent.wheelDelta / 120 > 0) ?\r\n            getKey(DEPRECATED_InputManager.key, 4) : getKey(DEPRECATED_InputManager.key, 5);\r\n\r\n        e.which = (e.originalEvent.wheelDelta / 120 > 0) ? 4 : 5;\r\n\r\n        if (-1 === $.inArray(DEPRECATED_InputManager.key[keyCode], keysPressed)) {\r\n            keysPressed.push(DEPRECATED_InputManager.key[keyCode]);\r\n        }\r\n\r\n        if (checkKeyMap(e) || manager.data.preventAll) {\r\n            e.preventDefault();\r\n            manager.fixMouseWheel();\r\n        }\r\n\r\n        manager.element.trigger('mouseWheel', {keyCode: keyCode});\r\n    },\r\n\r\n    mouseWheelCancel: function (keysPressed, keyCode) {\r\n        keysPressed.splice(\r\n            keysPressed.indexOf(DEPRECATED_InputManager.key[keyCode]), 1\r\n        );\r\n    },\r\n\r\n    onMouseMove: function (e) {\r\n        var manager = e.data.manager;\r\n        var mouse = e.data.manager.data.mouse;\r\n\r\n        manager.data.mouse.currentPosition.x = e.pageX;\r\n        manager.data.mouse.currentPosition.y = e.pageY;\r\n\r\n        if (e.data.manager.data.enableAdditionalData) {\r\n            mouse.distance = Math.sqrt(\r\n                Math.pow((mouse.currentPosition.x - mouse.startPosition.x), 2)\r\n                + Math.pow((mouse.currentPosition.y - mouse.startPosition.y), 2)\r\n            ).toFixed(1);\r\n        }\r\n    },\r\n\r\n    onKeyboardPress: function (e) {\r\n        var manager = e.data.manager;\r\n        if (!manager.data.enabled || !manager.j2d.isPlay || !manager.element.hasClass('active')) return true;\r\n        var keysPressed = manager.data.keysPressed;\r\n        var keyCode = getKey(DEPRECATED_InputManager.key, e.which) || 'KEY_UNKNOWN_' + e.which;\r\n        if (e.data.event === 2 && true === manager.data.writeMode) {\r\n            var char = String.fromCharCode(e.which || e.keyCode);\r\n            e.preventDefault();\r\n            manager.element.focus().trigger('keyboardCharPress', {\r\n                key: e.which || e.keyCode,\r\n                keyCode: keyCode,\r\n                char: char\r\n            });\r\n        }\r\n\r\n        if (e.data.event !== 2 && false === manager.data.writeMode) {\r\n            if (e.data.event === 0) {\r\n                if (-1 === $.inArray(DEPRECATED_InputManager.key[keyCode], keysPressed)) {\r\n                    keysPressed.push(DEPRECATED_InputManager.key[keyCode]);\r\n                    if (manager.data.enableAdditionalData) {\r\n                        manager.data.timePressed = e.timeStamp;\r\n                    }\r\n                }\r\n                if (checkKeyMap(e, false) || manager.data.preventAll) {\r\n                    e.preventDefault();\r\n                }\r\n            } else {\r\n                if (checkKeyMap(e) || manager.data.preventAll) {\r\n                    e.preventDefault();\r\n                }\r\n\r\n                keysPressed.splice(\r\n                    keysPressed.indexOf(DEPRECATED_InputManager.key[keyCode]), 1\r\n                );\r\n            }\r\n\r\n            manager.element.trigger(e.data.event === 0 ?\r\n                'keyboardKeyDown' : 'keyboardKeyUp', {keyCode: keyCode, key: e.which || e.keyCode}\r\n            );\r\n        }\r\n\r\n        if (e.data.event !== 2 && true === manager.data.writeMode) {\r\n            manager.element.trigger(e.data.event === 0 ?\r\n                'keyboardKeyDown' : 'keyboardKeyUp', {keyCode: keyCode, key: e.which || e.keyCode}\r\n            );\r\n        }\r\n    },\r\n\r\n    onTouchTap: function (e) {\r\n        var manager = e.data.manager;\r\n        if (!manager.data.enabled || !manager.j2d.isPlay || !manager.j2d.element.hasClass('active')) return true;\r\n        var keysPressed = manager.data.keysPressed;\r\n        var keyCode = getKey(DEPRECATED_InputManager.key, e.which + 1) || 'KEY_UNKNOWN_' + e.which;\r\n        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];\r\n        var mouse = manager.data.mouse;\r\n\r\n        if (e.data.event === 0) {\r\n            if (-1 === $.inArray(DEPRECATED_InputManager.key[keyCode], keysPressed)) {\r\n                keysPressed.push(DEPRECATED_InputManager.key[keyCode]);\r\n                if (manager.data.enableAdditionalData) {\r\n                    mouse.startPosition.x = touch.pageX;\r\n                    mouse.startPosition.y = touch.pageY;\r\n                    mouse.distance = 0;\r\n\r\n                    manager.data.timePressed = e.timeStamp;\r\n                }\r\n            }\r\n            if (checkKeyMap(e, false) || manager.data.preventAll) {\r\n                e.preventDefault();\r\n            }\r\n        } else {\r\n            if (checkKeyMap(e) || manager.data.preventAll) {\r\n                e.preventDefault();\r\n            }\r\n\r\n            if (manager.data.enableAdditionalData) {\r\n                mouse.previousDistance = mouse.distance;\r\n                mouse.startPosition.x = 0;\r\n                mouse.startPosition.y = 0;\r\n            }\r\n\r\n            keysPressed.splice(\r\n                keysPressed.indexOf(DEPRECATED_InputManager.key[keyCode]), 1\r\n            );\r\n        }\r\n\r\n        manager.element.trigger(e.data.event === 0 ?\r\n            'mouseKeyDown' : 'mouseKeyUp', {keyCode: keyCode}\r\n        );\r\n    },\r\n\r\n    onTouchMove: function (e) {\r\n        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];\r\n        var mouse = e.data.manager.data.mouse;\r\n\r\n        mouse.currentPosition.x = touch.pageX.toFixed(0);\r\n        mouse.currentPosition.y = touch.pageY.toFixed(0);\r\n\r\n        if (e.data.manager.data.enableAdditionalData) {\r\n            mouse.distance = Math.sqrt(\r\n                Math.pow((mouse.currentPosition.x - mouse.startPosition.x), 2)\r\n                + Math.pow((mouse.currentPosition.y - mouse.startPosition.y), 2)\r\n            ).toFixed(1);\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * @param {DEPRECATED_InputManager} manager\r\n */\r\nvar bindEvents = function (manager) {\r\n    var selector = '[guid=' + manager.id + ']';\r\n\r\n    $(document).on('contextmenu', selector, {manager: manager, event: 2}, events.onMouseClick);\r\n    $(document).on('mousedown', selector, {manager: manager, event: 0}, events.onMouseClick);\r\n    $(document).on('mouseup', selector, {manager: manager, event: 1}, events.onMouseClick);\r\n    $(document).on('mousewheel', selector, {manager: manager}, events.onMouseWheel);\r\n    $(document).on('mousemove', selector, {manager: manager}, events.onMouseMove);\r\n\r\n    $(document).on('keydown', null, {manager: manager, event: 0}, events.onKeyboardPress);\r\n    $(document).on('keyup', null, {manager: manager, event: 1}, events.onKeyboardPress);\r\n    $(document).on('keypress', null, {manager: manager, event: 2}, events.onKeyboardPress);\r\n\r\n    $(document).on('touchstart', selector, {manager: manager, event: 0}, events.onTouchTap);\r\n    $(document).on('touchend', selector, {manager: manager, event: 1}, events.onTouchTap);\r\n    $(document).on('touchmove ', selector, {manager: manager}, events.onTouchMove);\r\n};\r\n\r\n/**\r\n * @param {DEPRECATED_InputManager} manager\r\n */\r\nvar unbindEvents = function (manager) {\r\n    var selector = '[guid=' + manager.id + ']';\r\n\r\n    $(document).off('contextmenu', selector, {manager: manager, event: 1}, events.onMouseClick);\r\n    $(document).off('mousedown', selector, {manager: manager, event: 0}, events.onMouseClick);\r\n    $(document).off('mouseup', selector, {manager: manager, event: 1}, events.onMouseClick);\r\n    $(document).off('mousewheel', selector, {manager: manager}, events.onMouseWheel);\r\n    $(document).off('mousemove', selector, {manager: manager}, events.onMouseMove);\r\n\r\n    $(document).off('keydown', null, {manager: manager, event: 0}, events.onKeyboardPress);\r\n    $(document).off('keyup', null, {manager: manager, event: 1}, events.onKeyboardPress);\r\n    $(document).off('keypress', null, {manager: manager, event: 2}, events.onKeyboardPress);\r\n\r\n    $(document).off('touchstart', selector, {manager: manager, event: 0}, events.onTouchTap);\r\n    $(document).off('touchend', selector, {manager: manager, event: 1}, events.onTouchTap);\r\n    $(document).off('touchmove ', selector, {manager: manager}, events.onTouchMove);\r\n};\r\n\r\n/**\r\n * @param {DEPRECATED_InputManager} manager\r\n * @param {Array.<number>|number[]} keyList\r\n * @returns {{keyList: Array.<number>|number[]|number, time: number}|boolean}\r\n */\r\nvar getPressData = function (manager, keyList) {\r\n    if (!manager.data.enableAdditionalData) return true;\r\n    return {\r\n        keyList: keyList,\r\n        time: Date.now() - manager.data.timePressed\r\n    };\r\n};\r\n\r\n/**\r\n * @param {Object} object\r\n * @param {number} value\r\n * @returns {T}\r\n */\r\nfunction getKey(object, value) {\r\n    return Object.keys(object).filter(function (key) {\r\n        return object[key] === value\r\n    })[0];\r\n}\r\n\r\n/**\r\n * @class DEPRECATED_InputManager\r\n * @exports module:io/DEPRECATED_InputManager\r\n *\r\n * @param {EngineJ2D} j2d\r\n * @constructor\r\n *\r\n * @type {DEPRECATED_InputManager.key} key\r\n */\r\nexport default class DEPRECATED_InputManager {\r\n    constructor(j2d) {\r\n        this.j2d = j2d;\r\n\r\n        /** @type string */\r\n        this.id = j2d.data.id;\r\n\r\n        /** @type Element|jQuery */\r\n        this.element = j2d.element;\r\n\r\n        this.data = {\r\n            mouse: {\r\n                startPosition: {\r\n                    x: 0,\r\n                    y: 0\r\n                },\r\n                currentPosition: {\r\n                    x: 0,\r\n                    y: 0\r\n                },\r\n                previousDistance: 0,\r\n                distance: 0\r\n            },\r\n            viewport: {\r\n                position: {\r\n                    x: 0,\r\n                    y: 0\r\n                }\r\n            },\r\n            enabled: false,\r\n            enableAdditionalData: false,\r\n            keysPressed: new ArrayMap(),\r\n            writeMode: false,\r\n            timePressed: 0,\r\n            preventAll: false,\r\n\r\n            cursor: {\r\n                enabled: false,\r\n                image: 'auto'\r\n            }\r\n        };\r\n\r\n        this.keyMap = {\r\n            //DEBUG_INFO: [[DEPRECATED_InputManager.key.KEY_CTRL, DEPRECATED_InputManager.key.KEY_F1], 'j2d.debug.toggleScreen', {}],\r\n            FULLSCREEN: [[DEPRECATED_InputManager.key.KEY_CTRL, DEPRECATED_InputManager.key.KEY_F11], 'j2d.scene.toggleFullScreen', {}]\r\n        };\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    init() {\r\n        if (!this.data.enabled && window.j2dPlugin.pluginInit) {\r\n            bindEvents(this);\r\n\r\n            this.data.enabled = true;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {boolean}\r\n     */\r\n    update() {\r\n        if (!this.data.enabled) return false;\r\n\r\n        var dX = this.j2d.scene.canvas.offsetWidth / this.j2d.scene.data.width,\r\n            dY = this.j2d.scene.canvas.offsetHeight / this.j2d.scene.data.height,\r\n            x = this.data.mouse.currentPosition.x / dX,\r\n            y = this.data.mouse.currentPosition.y / dY;\r\n\r\n        var offset = this.element.offset();\r\n\r\n        this.data.viewport.x = this.j2d.scene.viewport.x + x - offset.left;\r\n        this.data.viewport.y = this.j2d.scene.viewport.y + y - offset.top;\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    flush() {\r\n        this.data.keysPressed.length = 0;\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    clear() {\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    fixMouseWheel() {\r\n        var keyPressed = this.data.keysPressed;\r\n        if (-1 !== $.inArray(DEPRECATED_InputManager.key.SCROLL_MOUSE_UP, keyPressed)) {\r\n            events.mouseWheelCancel(keyPressed, DEPRECATED_InputManager.key.SCROLL_MOUSE_UP);\r\n        } else if (-1 !== $.inArray(DEPRECATED_InputManager.key.SCROLL_MOUSE_DOWN, keyPressed)) {\r\n            events.mouseWheelCancel(keyPressed, DEPRECATED_InputManager.key.SCROLL_MOUSE_DOWN);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    enable() {\r\n        if (!this.data.enabled) {\r\n            //bindEvents(this);\r\n            this.data.enabled = false;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    disable() {\r\n        if (this.data.enabled) {\r\n            //unbindEvents(this);\r\n            this.data.enabled = false;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} newKeyMap\r\n     * @returns {string}\r\n     */\r\n    load(newKeyMap) {\r\n        var oldKeyMap = JSON.stringify(this.keyMap);\r\n        this.keyMap = JSON.parse(newKeyMap);\r\n        return oldKeyMap;\r\n    }\r\n\r\n    /**\r\n     * @returns {string}\r\n     */\r\n    save() {\r\n        return JSON.stringify(this.keyMap);\r\n    }\r\n\r\n    /**\r\n     * KeyMap Manager\r\n     *\r\n     * @param mapObject\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    setKeys(mapObject) {\r\n        this.keyMap = $.extend(true, {}, this.keyMap, mapObject);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {{current: number, previous: number}}\r\n     */\r\n    getMouseMoveDistance() {\r\n        if (!this.data.enableAdditionalData) return 0;\r\n        return {current: this.data.mouse.distance, previous: this.data.mouse.previousDistance};\r\n    }\r\n\r\n    /* +Input Checkers **/\r\n    /**\r\n     * @param {Array.<number>|number[]|number} keyList\r\n     * @returns {boolean}\r\n     */\r\n    checkPressedKeyList(keyList) {\r\n        if ($.isArray(keyList)) {\r\n            if (keyList.length !== this.data.keysPressed.length) {\r\n                return false;\r\n            } else if (this.data.keysPressed.equals(keyList)) {\r\n                this.fixMouseWheel();\r\n                return getPressData(this, keyList);\r\n            }\r\n            this.fixMouseWheel();\r\n            return false;\r\n        }\r\n        //if (!this.data.keysPressed.equals([])) console.log(this.data.keysPressed);\r\n        if (isNaN(keyList)) return false;\r\n        if (-1 !== this.data.keysPressed.indexOf(keyList)) {\r\n            this.fixMouseWheel();\r\n            return getPressData(this, keyList);\r\n        }\r\n        this.fixMouseWheel();\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @returns {boolean}\r\n     */\r\n    checkPressedKeyMap(key) {\r\n        if (this.keyMap[key] === undefined) return false;\r\n        var keyList = this.keyMap[key][0];\r\n\r\n        return this.checkPressedKeyList(keyList);\r\n    }\r\n\r\n    getPosition() {\r\n        return new Vector2d(this.data.viewport.x + 0.5, this.data.viewport.y + 0.3);\r\n    }\r\n\r\n//onNode (id) {\r\n//    if (!id.layer.visible) return false;\r\n//    return (this.data.viewport.x > id.options.position.x && this.data.viewport.x < id.options.position.x + id.options.size.x) &&\r\n//        (this.data.viewport.y > id.options.position.y && this.data.viewport.y < id.options.position.y + id.options.size.y);\r\n//}\r\n    /* -Input Checkers **/\r\n\r\n    /* +Input Write Mode **/\r\n    /**\r\n     * @param {boolean} mode\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    setWriteMode(mode) {\r\n        this.data.writeMode = !!mode;\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {boolean}\r\n     */\r\n    isWriteMode() {\r\n        return !!this.data.writeMode;\r\n    }\r\n\r\n    /* -Input Write Mode **/\r\n\r\n    /**\r\n     * @param {string} image\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    setCursorImage(image) {\r\n        this.data.cursor.image = 'url(\"' + image + '\"), auto';\r\n        $(this.element).css('cursor', this.data.cursor.image);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {boolean} enable\r\n     * @returns {DEPRECATED_InputManager}\r\n     */\r\n    toggleCursor(enable) {\r\n        if (enable !== undefined) {\r\n            this.data.cursor.enable = !!enable;\r\n        } else {\r\n            this.data.cursor.enable = !this.data.cursor.enable;\r\n        }\r\n\r\n        if (!this.data.cursor.enable) {\r\n            this.data.cursor.image = $(this.j2d.element).css('cursor');\r\n            $(this.element).css('cursor', 'none');\r\n        } else {\r\n            $(this.element).css('cursor', this.data.cursor.image);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {boolean}\r\n     */\r\n    isCursorVisible() {\r\n        return !!this.data.cursor.enable;\r\n    }\r\n\r\n    /** -Cursor **/\r\n\r\n    /**\r\n     * Static keys arrayList\r\n     *\r\n     * @readonly\r\n     * @enum {number}\r\n     */\r\n    static key = {\r\n        KEY_MOUSE_LEFT: 1,\r\n        KEY_MOUSE_MIDDLE: 2,\r\n        KEY_MOUSE_RIGHT: 3,\r\n\r\n        SCROLL_MOUSE_UP: 4,\r\n        SCROLL_MOUSE_DOWN: 5,\r\n\r\n        KEY_BACKSPACE: 8,\r\n        KEY_TAB: 9,\r\n        KEY_ENTER: 13,\r\n        KEY_SHIFT: 16,\r\n        KEY_CTRL: 17,\r\n        KEY_ALT: 18,\r\n        KEY_PAUSE: 19,\r\n        KEY_BREAK: 19,\r\n        KEY_CAPS_LOCK: 20,\r\n        KEY_ESCAPE: 27,\r\n        KEY_SPACE_BAR: 32,\r\n        KEY_PAGE_UP: 33,\r\n        KEY_PAGE_DOWN: 34,\r\n        KEY_END: 35,\r\n        KEY_HOME: 36,\r\n        KEY_LEFT_ARROW: 37,\r\n        KEY_UP_ARROW: 38,\r\n        KEY_RIGHT_ARROW: 39,\r\n        KEY_DOWN_ARROW: 40,\r\n        KEY_INSERT: 45,\r\n        KEY_DELETE: 46,\r\n        KEY_0: 48,\r\n        KEY_1: 49,\r\n        KEY_2: 50,\r\n        KEY_3: 51,\r\n        KEY_4: 52,\r\n        KEY_5: 53,\r\n        KEY_6: 54,\r\n        KEY_7: 55,\r\n        KEY_8: 56,\r\n        KEY_9: 57,\r\n        KEY_A: 65,\r\n        KEY_B: 66,\r\n        KEY_C: 67,\r\n        KEY_D: 68,\r\n        KEY_E: 69,\r\n        KEY_F: 70,\r\n        KEY_G: 71,\r\n        KEY_H: 72,\r\n        KEY_I: 73,\r\n        KEY_J: 74,\r\n        KEY_K: 75,\r\n        KEY_L: 76,\r\n        KEY_M: 77,\r\n        KEY_N: 78,\r\n        KEY_O: 79,\r\n        KEY_P: 80,\r\n        KEY_Q: 81,\r\n        KEY_R: 82,\r\n        KEY_S: 83,\r\n        KEY_T: 84,\r\n        KEY_U: 85,\r\n        KEY_V: 86,\r\n        KEY_W: 87,\r\n        KEY_X: 88,\r\n        KEY_Y: 89,\r\n        KEY_Z: 90,\r\n        KEY_LEFT_WINDOW_KEY: 91,\r\n        KEY_RIGHT_WINDOW_KEY: 92,\r\n        KEY_SELECT_KEY: 93,\r\n        KEY_NUMPAD_0: 96,\r\n        KEY_NUMPAD_1: 97,\r\n        KEY_NUMPAD_2: 98,\r\n        KEY_NUMPAD_3: 99,\r\n        KEY_NUMPAD_4: 100,\r\n        KEY_NUMPAD_5: 101,\r\n        KEY_NUMPAD_6: 102,\r\n        KEY_NUMPAD_7: 103,\r\n        KEY_NUMPAD_8: 104,\r\n        KEY_NUMPAD_9: 105,\r\n        KEY_MULTIPLY: 106,\r\n        KEY_ADD: 107,\r\n        KEY_SUBTRACT: 109,\r\n        KEY_DECIMAL_POINT: 110,\r\n        KEY_DIVIDE: 111,\r\n        KEY_F1: 112,\r\n        KEY_F2: 113,\r\n        KEY_F3: 114,\r\n        KEY_F4: 115,\r\n        KEY_F5: 116,\r\n        KEY_F6: 117,\r\n        KEY_F7: 118,\r\n        KEY_F8: 119,\r\n        KEY_F9: 120,\r\n        KEY_F10: 121,\r\n        KEY_F11: 122,\r\n        KEY_F12: 123,\r\n        KEY_NUM_LOCK: 144,\r\n        KEY_SCROLL_LOCK: 145,\r\n        KEY_SEMI_COLON: 186,\r\n        KEY_EQUAL_SIGN: 187,\r\n        KEY_COMMA: 188,\r\n        KEY_DASH: 189,\r\n        KEY_PERIOD: 190,\r\n        KEY_FORWARD_SLASH: 191,\r\n        KEY_GRAVE_ACCENT: 192,\r\n        KEY_OPEN_BRACKET: 219,\r\n        KEY_BACK_SLASH: 220,\r\n        KEY_CLOSE_BRACKET: 221,\r\n        KEY_SINGLE_QUOTE: 222,\r\n        KEY_LEFT_COMMAND: 224,\r\n        KEY_RIGHT_COMMAND: 224\r\n    };\r\n}\r\n","export default {\r\n    KEY_MOUSE_LEFT: 1,\r\n    KEY_MOUSE_MIDDLE: 2,\r\n    KEY_MOUSE_RIGHT: 3,\r\n\r\n    SCROLL_MOUSE_UP: 4,\r\n    SCROLL_MOUSE_DOWN: 5,\r\n\r\n    KEY_BACKSPACE: 8,\r\n    KEY_TAB: 9,\r\n    KEY_ENTER: 13,\r\n    KEY_SHIFT: 16,\r\n    KEY_CTRL: 17,\r\n    KEY_ALT: 18,\r\n    KEY_PAUSE: 19,\r\n    KEY_BREAK: 19,\r\n    KEY_CAPS_LOCK: 20,\r\n    KEY_ESCAPE: 27,\r\n    KEY_SPACE_BAR: 32,\r\n    KEY_PAGE_UP: 33,\r\n    KEY_PAGE_DOWN: 34,\r\n    KEY_END: 35,\r\n    KEY_HOME: 36,\r\n    KEY_LEFT_ARROW: 37,\r\n    KEY_UP_ARROW: 38,\r\n    KEY_RIGHT_ARROW: 39,\r\n    KEY_DOWN_ARROW: 40,\r\n    KEY_INSERT: 45,\r\n    KEY_DELETE: 46,\r\n    KEY_0: 48,\r\n    KEY_1: 49,\r\n    KEY_2: 50,\r\n    KEY_3: 51,\r\n    KEY_4: 52,\r\n    KEY_5: 53,\r\n    KEY_6: 54,\r\n    KEY_7: 55,\r\n    KEY_8: 56,\r\n    KEY_9: 57,\r\n    KEY_A: 65,\r\n    KEY_B: 66,\r\n    KEY_C: 67,\r\n    KEY_D: 68,\r\n    KEY_E: 69,\r\n    KEY_F: 70,\r\n    KEY_G: 71,\r\n    KEY_H: 72,\r\n    KEY_I: 73,\r\n    KEY_J: 74,\r\n    KEY_K: 75,\r\n    KEY_L: 76,\r\n    KEY_M: 77,\r\n    KEY_N: 78,\r\n    KEY_O: 79,\r\n    KEY_P: 80,\r\n    KEY_Q: 81,\r\n    KEY_R: 82,\r\n    KEY_S: 83,\r\n    KEY_T: 84,\r\n    KEY_U: 85,\r\n    KEY_V: 86,\r\n    KEY_W: 87,\r\n    KEY_X: 88,\r\n    KEY_Y: 89,\r\n    KEY_Z: 90,\r\n    KEY_LEFT_WINDOW_KEY: 91,\r\n    KEY_RIGHT_WINDOW_KEY: 92,\r\n    KEY_SELECT_KEY: 93,\r\n    KEY_NUMPAD_0: 96,\r\n    KEY_NUMPAD_1: 97,\r\n    KEY_NUMPAD_2: 98,\r\n    KEY_NUMPAD_3: 99,\r\n    KEY_NUMPAD_4: 100,\r\n    KEY_NUMPAD_5: 101,\r\n    KEY_NUMPAD_6: 102,\r\n    KEY_NUMPAD_7: 103,\r\n    KEY_NUMPAD_8: 104,\r\n    KEY_NUMPAD_9: 105,\r\n    KEY_MULTIPLY: 106,\r\n    KEY_ADD: 107,\r\n    KEY_SUBTRACT: 109,\r\n    KEY_DECIMAL_POINT: 110,\r\n    KEY_DIVIDE: 111,\r\n    KEY_F1: 112,\r\n    KEY_F2: 113,\r\n    KEY_F3: 114,\r\n    KEY_F4: 115,\r\n    KEY_F5: 116,\r\n    KEY_F6: 117,\r\n    KEY_F7: 118,\r\n    KEY_F8: 119,\r\n    KEY_F9: 120,\r\n    KEY_F10: 121,\r\n    KEY_F11: 122,\r\n    KEY_F12: 123,\r\n    KEY_NUM_LOCK: 144,\r\n    KEY_SCROLL_LOCK: 145,\r\n    KEY_SEMI_COLON: 186,\r\n    KEY_EQUAL_SIGN: 187,\r\n    KEY_COMMA: 188,\r\n    KEY_DASH: 189,\r\n    KEY_PERIOD: 190,\r\n    KEY_FORWARD_SLASH: 191,\r\n    KEY_GRAVE_ACCENT: 192,\r\n    KEY_OPEN_BRACKET: 219,\r\n    KEY_BACK_SLASH: 220,\r\n    KEY_CLOSE_BRACKET: 221,\r\n    KEY_SINGLE_QUOTE: 222,\r\n    KEY_LEFT_COMMAND: 224,\r\n    KEY_RIGHT_COMMAND: 224,\r\n\r\n    //fix mouse with extra buttons\r\n    KEY_MOUSE_3: 403,\r\n    KEY_MOUSE_4: 404,\r\n    KEY_MOUSE_5: 405,\r\n    KEY_MOUSE_6: 406,\r\n    KEY_MOUSE_7: 407,\r\n    KEY_MOUSE_8: 408,\r\n    KEY_MOUSE_9: 409,\r\n    KEY_MOUSE_10: 410\r\n};\r\n","import Handler from \"api/Handler\";\r\nimport InputHandlerCodes from \"io/InputHandlerCodes\";\r\nimport Keyboard from \"io/devices/Keyboard\";\r\nimport Joystick from \"io/devices/Joystick\";\r\nimport Mouse from \"io/devices/Mouse\";\r\nimport Touch from \"io/devices/Touch\";\r\nimport Device from \"api/Device\";\r\n\r\n/**\r\n * InputHandler\r\n * @constructor\r\n * @extends Handler\r\n */\r\nexport default class InputHandler extends Handler {\r\n    static interfaces = [];\r\n\r\n    static IO = {\r\n        KEYBOARD: 'keyboard',\r\n        JOYSTICK: 'joystick',\r\n        MOUSE: 'mouse',\r\n        TOUCH: 'touch'\r\n    };\r\n\r\n    defaultIO = {\r\n        KEYBOARD: Keyboard,\r\n        JOYSTICK: Joystick,\r\n        MOUSE: Mouse,\r\n        TOUCH: Touch\r\n    };\r\n\r\n    static KEY = InputHandlerCodes;\r\n\r\n    static KEYS_HELPER = InputHandler.prototype.KEYS_HELPER = {\r\n        getKeyById: function (index) {\r\n            return InputHandler.KEY[index] || 'KEY_UNKNOWN_' + index;\r\n        },\r\n        getKeyByCode: function (keyCode) {\r\n            return InputHandler.KEY[keyCode] || 0;\r\n        }\r\n    };\r\n\r\n    constructor() {\r\n        super();\r\n\r\n        this.preventDefault = false;\r\n        this.IO = [];\r\n        this.options = {\r\n            cursor: 'none'\r\n        };\r\n\r\n        this.store = {};\r\n\r\n        this.data = {};\r\n\r\n        this.keyCodeMap = {\r\n            //DEBUG_INFO: [[InputHandler.KEY.KEY_CTRL, InputHandler.KEY.KEY_F1], 'j2d.debug.toggleScreen', {}],\r\n            FULLSCREEN: [[InputHandler.KEY.KEY_CTRL, InputHandler.KEY.KEY_F11], 'j2d.scene.toggleFullScreen', {}]\r\n        };\r\n    }\r\n\r\n    bindListeners() {\r\n        for (var i = 0; i < this.IO.length; i++) {\r\n            if (this.IO[i].enable() === false) return false;\r\n        }\r\n    };\r\n\r\n    unBindListeners() {\r\n        for (var i = 0; i < this.IO.length; i++) {\r\n            if (this.IO[i].disable() === false) return false;\r\n        }\r\n    };\r\n\r\n    update() {\r\n        if (!this.isEnabled) return false;\r\n        for (var i = 0; i < this.IO.length; i++) {\r\n            if (this.IO[i].update() === false) return false;\r\n        }\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        if (!this.isEnabled) return false;\r\n        for (var i = 0; i < this.IO.length; i++) {\r\n            if (this.IO[i].clear() === false) return false;\r\n        }\r\n        return true;\r\n    };\r\n\r\n    load(newKeyCodeMap) {\r\n        var oldKeyCodeMap = JSON.stringify(this.keyCodeMap);\r\n        this.keyCodeMap = JSON.parse(newKeyCodeMap);\r\n        return oldKeyCodeMap;\r\n    };\r\n\r\n    save() {\r\n        return JSON.stringify(this.keyCodeMap);\r\n    };\r\n\r\n    // TODO:: to refactoring\r\n\r\n    static _getPressData(manager, keyList) {\r\n        return {\r\n            keyList: keyList,\r\n            time: manager.store.keys.pressedTime[keyList[0]]\r\n        };\r\n    }\r\n\r\n    checkPressedKeyList(keyList) {\r\n        if (typeof keyList === 'object' && keyList instanceof Array) {\r\n            if (keyList.length !== this.data.keys.keysDown.length) {\r\n                return false;\r\n                //} else if (this.data.keys.keysDown.equals(keyList)) {\r\n                //    return getPressData(this, keyList);\r\n            }\r\n            return false;\r\n        }\r\n        if (isNaN(keyList)) return false;\r\n        if (-1 !== this.data.keys.keysDown.indexOf(keyList)) {\r\n            return InputHandler._getPressData(this, keyList);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    checkPressedKeyMap(key) {\r\n        if (this.keyCodeMap[key] === undefined) return false;\r\n        return this.checkPressedKeyList(this.keyCodeMap[key][0]);\r\n    }\r\n\r\n    setKeys(mapObject) {\r\n        //this.keyMap = $.extend(true, {}, this.keyMap, mapObject);\r\n        return this;\r\n    }\r\n\r\n    init(eventHandler, io, options) {\r\n        Handler.prototype.init.call(this, eventHandler);\r\n        if (options !== undefined && options !== null && typeof options === 'object') {\r\n            this.options = options;\r\n        }\r\n        if (io !== undefined && io !== null && typeof io === 'object' && io instanceof Array) {\r\n            this.IO = [];\r\n            io.map(function (device) {\r\n                if (typeof device === 'string' && InputHandler.IO[device.toUpperCase()] !== undefined) {\r\n                    device = new (this.defaultIO[device.toUpperCase()])();\r\n                    this.IO[device.toString()] = device;\r\n                    this.IO.push(device);\r\n                    if (this.IO[device].init(this) === false) {\r\n                        throw new Error('Error. Device \"' + device + '\" not initialize.');\r\n                    }\r\n                } else if (typeof device === 'object' && device instanceof Device) {\r\n                    this.IO[device.toString()] = device;\r\n                    this.IO.push(device);\r\n                    if (this.IO[device.toString()].init(this) === false) {\r\n                        throw new Error('Error. Device \"' + device + '\" not initialize.');\r\n                    }\r\n                } else {\r\n                    throw new Error('Error. Unknown IO device \"' + device.toString() + '\" is not supported yet.');\r\n                }\r\n            }.bind(this));\r\n        }\r\n        return this;\r\n    }\r\n\r\n    enable() {\r\n        Handler.prototype.enable.call(this);\r\n        this.bindListeners();\r\n        return this;\r\n    }\r\n\r\n    disable() {\r\n        Handler.prototype.disable.call(this);\r\n        this.unBindListeners();\r\n        return this;\r\n    }\r\n\r\n    toggle(status) {\r\n        Handler.prototype.toggle.call(this, status);\r\n        return this;\r\n    }\r\n\r\n    KEY = InputHandler.KEY;\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * UnexpectedValueException\r\n * Create custom exception with message\r\n *\r\n * @class UnexpectedValueException\r\n * @exports module:exceptions/UnexpectedValueException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class UnexpectedValueException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * RuntimeException\r\n * Create custom exception with message\r\n *\r\n * @class RuntimeException\r\n * @exports module:exceptions/RuntimeException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class RuntimeException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * RangeException\r\n * Create custom exception with message\r\n *\r\n * @class RangeException\r\n * @exports module:exceptions/RangeException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class RangeException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * OutOfRangeException\r\n * Create custom exception with message\r\n *\r\n * @class OutOfRangeException\r\n * @exports module:exceptions/OutOfRangeException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class OutOfRangeException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * OutOfBoundsException\r\n * Create custom exception with message\r\n *\r\n * @class OutOfBoundsException\r\n * @exports module:exceptions/OutOfBoundsException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class OutOfBoundsException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * LogicException\r\n * Create custom exception with message\r\n *\r\n * @class LogicException\r\n * @exports module:exceptions/LogicException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class LogicException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * LengthException\r\n * Create custom exception with message\r\n *\r\n * @class LengthException\r\n * @exports module:exceptions/LengthException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class LengthException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * InvalidArgumentException\r\n * Create custom exception with message\r\n *\r\n * @class InvalidArgumentException\r\n * @exports module:exceptions/InvalidArgumentException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class InvalidArgumentException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","/**\r\n * Default Exception\r\n * Create custom exception with message\r\n *\r\n * @class Exception\r\n * @exports module:exceptions/Exception\r\n *\r\n * @constructor\r\n * @extends Error\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class Exception extends Error {\r\n    constructor(message) {\r\n        super(message);\r\n        this.message = message;\r\n\r\n        /**\r\n         * Convert exception to String\r\n         * @returns {string}\r\n         */\r\n        this.toString = function () {\r\n            return this.message;\r\n        }\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * BadMethodCallException\r\n * Create custom exception with message\r\n *\r\n * @class BadMethodCallException\r\n * @exports module:exceptions/BadMethodCallException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class BadMethodCallException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Exception from \"exceptions/Exception\";\r\n\r\n/**\r\n * BadFunctionCallException\r\n * Create custom exception with message\r\n *\r\n * @class BadFunctionCallException\r\n * @exports module:exceptions/BadFunctionCallException\r\n *\r\n * @constructor\r\n * @extends Exception\r\n * @param {string} message\r\n * @property {string} message\r\n */\r\nexport default class BadFunctionCallException extends Exception {\r\n    constructor(message) {\r\n        super(message)\r\n    }\r\n\r\n    /**\r\n     * Convert exception to String\r\n     * @returns {string}\r\n     */\r\n    toString = function () {\r\n        return this.message;\r\n    }\r\n}\r\n","import Handler from \"api/Handler\";\r\n\r\n/**\r\n * EventHandler\r\n * @constructor\r\n */\r\nexport default class EventHandler extends Handler {\r\n    events = [];\r\n    onces = [];\r\n\r\n    constructor() {\r\n        super();\r\n        this.flush();\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    on(eventName, callback) {\r\n        if (this.events[eventName] !== undefined) {\r\n            var stack = this.events[eventName];\r\n            if (stack.indexOf(callback) === -1) {\r\n                stack.push(callback);\r\n            }\r\n        } else {\r\n            this.events[eventName] = [];\r\n            this.events[eventName].push(callback)\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    once(eventName, callback) {\r\n        if (this.onces[eventName] !== undefined) {\r\n            var stack = this.onces[eventName];\r\n            if (stack.indexOf(callback) === -1) {\r\n                stack.push(callback);\r\n            }\r\n        } else {\r\n            this.onces[eventName] = [];\r\n            this.onces[eventName].push(callback)\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {function} callback\r\n     */\r\n    off(eventName, callback) {\r\n        if (this.onces[eventName] !== undefined) {\r\n            var stack = this.events[eventName];\r\n            if (stack.indexOf(callback) !== -1) {\r\n                stack.splice(stack.indexOf(callback));\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} eventName\r\n     * @param {Object} [data]\r\n     */\r\n    trigger(eventName, data) {\r\n        var stack, i, result;\r\n\r\n        if (this.onces[eventName] !== undefined) {\r\n            stack = this.onces[eventName];\r\n            for (i = 0; i < stack.length; i++) {\r\n                result = stack[i].call(stack[i], data);\r\n                if (typeof result === 'boolean' && !result) return this;\r\n            }\r\n            this.flush(eventName);\r\n        }\r\n\r\n        if (this.events[eventName] !== undefined) {\r\n            stack = this.events[eventName];\r\n            for (i = 0; i < stack.length; i++) {\r\n                result = stack[i].call(stack[i], data);\r\n                if (typeof result === 'boolean' && !result) return this;\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} [eventName]\r\n     */\r\n    flush(eventName) {\r\n        if (eventName !== undefined) {\r\n            if (this.events[eventName] !== undefined) {\r\n                this.events[eventName] = [];\r\n            }\r\n            if (this.onces[eventName] !== undefined) {\r\n                this.onces[eventName] = [];\r\n            }\r\n        } else {\r\n            this.onces = [];\r\n            this.events = [];\r\n        }\r\n        return this;\r\n    }\r\n\r\n    init(eventHandler) {\r\n        Handler.prototype.init.call(this, eventHandler);\r\n        return this;\r\n    }\r\n\r\n    enable() {\r\n        Handler.prototype.enable.call(this);\r\n        return this;\r\n    }\r\n\r\n    disable() {\r\n        Handler.prototype.disable.call(this);\r\n        return this;\r\n    }\r\n\r\n    toggle(status) {\r\n        Handler.prototype.toggle.call(this, status);\r\n        return this;\r\n    }\r\n}\r\n","import ArrayMap from \"utils/ArrayMap\";\r\nimport CameraNode from \"nodes/CameraNode\";\r\nimport Vector2d from \"utils/Vector2d\";\r\n\r\n/**\r\n * @param {{x: number, y: number, offsetX: number, offsetY: number}} screen\r\n * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n * @returns {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}}\r\n */\r\nvar calculateScale = function (screen, viewport) {\r\n    var data = {\r\n        offset: {x: 0, y: 0},\r\n        size: {x: 0, y: 0},\r\n        scale: 1.0,\r\n        angle: viewport.angle\r\n    };\r\n\r\n    data.offset.x = screen.offsetX + viewport.offset.x;\r\n    data.offset.y = screen.offsetY + viewport.offset.y;\r\n\r\n    data.size.x = (screen.x < viewport.size.x) ? screen.x : viewport.size.x;\r\n    data.size.y = (screen.y < viewport.size.y) ? screen.y : viewport.size.y;\r\n\r\n    data.scale = viewport.scale * (((screen.x / viewport.size.x) + (screen.y / viewport.size.y)) / 2);\r\n    return data;\r\n};\r\n\r\n/**\r\n * @class ViewportManager\r\n * @exports module:core/ViewportManager\r\n *\r\n * @constructor\r\n *\r\n * @property {ArrayMap.<CameraNode>|CameraNode[]} cameras\r\n * @property {string} camera\r\n * @property {{x: number, y: number, offsetX: number, offsetY: number}} screen\r\n * @property {boolean} init\r\n * @property {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} data\r\n */\r\nexport default class ViewportManager {\r\n    constructor() {\r\n        /** @type ArrayMap.<CameraNode>|CameraNode[] */\r\n        this.cameras = new ArrayMap();\r\n\r\n        /** @type string */\r\n        this.camera = 'No active cameras';\r\n\r\n        /** @type {{x: number, y: number, offsetX: number, offsetY: number}} */\r\n        this.screen = {\r\n            x: 0,\r\n            y: 0,\r\n            offsetX: 0,\r\n            offsetY: 0\r\n        };\r\n\r\n        this.init = false;\r\n\r\n        this.data = {\r\n            offset: {x: 0.0, y: 0.0},\r\n            size: {x: 0.0, y: 0.0},\r\n            scale: 1.0,\r\n            angle: 0.0\r\n        };\r\n    }\r\n\r\n    /**\r\n     * @param {{x: number|undefined, y: number|undefined}|Array<number>} data\r\n     * @returns {ViewportManager}\r\n     */\r\n    setScreen(data) {\r\n        if (typeof data == 'object') {\r\n            if (data instanceof Array && data.length == 2) {\r\n                this.screen = {\r\n                    x: data[0],\r\n                    y: data[1],\r\n                    offsetX: this.screen.offsetX,\r\n                    offsetY: this.screen.offsetY\r\n                };\r\n                return this;\r\n            }\r\n            if (data.x !== undefined && data.y !== undefined) {\r\n                this.screen = {\r\n                    x: data.x,\r\n                    y: data.y,\r\n                    offsetX: this.screen.offsetX,\r\n                    offsetY: this.screen.offsetY\r\n                };\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {{x: number|undefined, y: number|undefined}|Array<number>} data\r\n     * @returns {ViewportManager}\r\n     */\r\n    setOffset(data) {\r\n        if (typeof data == 'object') {\r\n            if (data instanceof Array && data.length == 2) {\r\n                this.screen = {\r\n                    x: this.screen.x,\r\n                    y: this.screen.y,\r\n                    offsetX: data[0],\r\n                    offsetY: data[1]\r\n                };\r\n                return this;\r\n            }\r\n            if (data.x !== undefined && data.y !== undefined) {\r\n                this.screen = {\r\n                    x: this.screen.x,\r\n                    y: this.screen.y,\r\n                    offsetX: data.x,\r\n                    offsetY: data.y\r\n                };\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @param {CameraNode} node\r\n     * @returns {ViewportManager}\r\n     */\r\n    addCamera(key, node) {\r\n        if (node instanceof CameraNode) {\r\n            this.cameras.add(key, node);\r\n            return this;\r\n        }\r\n        // throw new InvalidArgumentException('Unknown camera node type');\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @returns {ViewportManager}\r\n     */\r\n    removeCamera(key) {\r\n        this.cameras.remove(key);\r\n        if (this.camera == key) {\r\n            this.camera = 'No active cameras';\r\n            this.data = {\r\n                offset: {x: 0.0, y: 0.0},\r\n                size: {x: 0.0, y: 0.0},\r\n                scale: 1.0,\r\n                angle: 0.0\r\n            }\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} key\r\n     * @returns {ViewportManager}\r\n     */\r\n    updateViewport(key) {\r\n        if (this.cameras[key] !== undefined && this.cameras[key] instanceof CameraNode) {\r\n            this.data = this.cameras[key].getCameraViewport(this.screen, calculateScale);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @deprecated Please use CameraNode\r\n     *\r\n     * @param {Vector2d|null} [offset]\r\n     * @param {Vector2d|null} [size]\r\n     * @returns {ViewportManager}\r\n     */\r\n    setViewport(offset, size) {\r\n        if (offset !== undefined && typeof offset == 'object') {\r\n            if (offset instanceof Vector2d) {\r\n                this.data.offset = offset.getVector();\r\n            }\r\n        }\r\n\r\n        if (size !== undefined && typeof size == 'object') {\r\n            if (size instanceof Vector2d) {\r\n                this.data.size = size.getVector();\r\n            }\r\n        }\r\n\r\n        this.data = calculateScale(this.screen, this.data);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}} viewport\r\n     * @returns {ViewportManager}\r\n     */\r\n    setDefaultViewport(viewport) {\r\n        if (!this.init) {\r\n            this.data = viewport;\r\n            this.init = true;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {{offset: {x: number, y: number}, size: {x: number, y: number}, scale: number, angle: number}}\r\n     */\r\n    getViewport() {\r\n        return this.data;\r\n    }\r\n}\r\n","import CollectionNode from \"nodes/CollectionNode\";\r\nimport UUID from \"utils/UUID\";\r\n\r\n/**\r\n * @class LayersManager\r\n * @exports module:core/LayersManager\r\n *\r\n * @constructor\r\n */\r\nexport default class LayersManager {\r\n    constructor() {\r\n        /** @type CollectionNode */\r\n        this.globalCollection = new CollectionNode({id: 'GlobalLayer'});\r\n\r\n        /** @type Array.<CollectionNode>|CollectionNode[] */\r\n        this.layers = [];\r\n\r\n        /** @type number */\r\n        this.index = 1000;\r\n    }\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @param {number} [zIndex]\r\n     * @param {CollectionNode|undefined} [node]\r\n     * @returns {LayersManager}\r\n     */\r\n    addLayer(name, zIndex, node) {\r\n        name = name || UUID.generate();\r\n\r\n        if (node === undefined || node instanceof CollectionNode) {\r\n            if (zIndex === undefined) {\r\n                zIndex = this.index;\r\n                this.index++;\r\n            } else {\r\n                zIndex += 1000;\r\n            }\r\n\r\n            node = node || new CollectionNode({id: name, zIndex: zIndex});\r\n\r\n            this.globalCollection.add(node, name);\r\n            this.layers[zIndex] = node;\r\n\r\n            return this;\r\n        }\r\n        // throw new InvalidArgumentException('Unknown node type to add as layers');\r\n    }\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @returns {LayersManager}\r\n     */\r\n    removeLayer(name) {\r\n        delete this.layers[this.globalCollection.get(name).zIndex];\r\n        this.globalCollection.remove(null, name);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @returns {CollectionNode|null}\r\n     */\r\n    getLayer(name) {\r\n        if (this.globalCollection.has(name)) {\r\n            return this.globalCollection.get(name);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @param {number} zIndex\r\n     * @returns {LayersManager}\r\n     */\r\n    setZIndex(name, zIndex) {\r\n        if (this.globalCollection.has(name)) {\r\n            delete this.layers[this.globalCollection.get(name).zIndex];\r\n            this.globalCollection.get(name).zIndex = zIndex;\r\n            this.layers[zIndex] = this.globalCollection.get(name);\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","import ArrayMap from \"utils/ArrayMap\";\r\nimport ObjectUtil from \"utils/ObjectUtil\";\r\nimport DefaultGameState from \"states/DefaultGameState\";\r\nimport BaseGameState from \"states/BaseGameState\";\r\n\r\n/**\r\n * Game states Manager\r\n *\r\n * @class GameStatesManager\r\n * @abstract\r\n * @constructor\r\n *\r\n * @param {GameStatesManager.defaults|Object} data\r\n * @param {function} sceneCallback\r\n * @property {GameStatesManager.defaults|Object} data\r\n * @property {number} state\r\n */\r\nexport default class GameStatesManager {\r\n    /**\r\n     * @type {{previousState: null, currentState: number, states: ArrayMap}}\r\n     */\r\n    static defaults = {\r\n        previousState: null,\r\n        currentState: 0,\r\n        states: new ArrayMap()\r\n    };\r\n\r\n    constructor(data, sceneCallback) {\r\n        this.data = ObjectUtil.extend(true, {}, GameStatesManager.defaults, data);\r\n        this.add(new DefaultGameState());\r\n        this.sceneCallback = sceneCallback;\r\n    }\r\n\r\n    get state() {\r\n        return this.data.currentState;\r\n    }\r\n\r\n    set state(value) {\r\n        this.data.currentState = value;\r\n    }\r\n\r\n    /**\r\n     * @param {string} [id]\r\n     * @returns {BaseGameState|null}\r\n     */\r\n    getState(id) {\r\n        if (id === undefined) return this.getCurrent();\r\n        if (this.data.states.contains(id)) {\r\n            return this.data.states[id];\r\n        }\r\n        return null\r\n    }\r\n\r\n    getPreviousState() {\r\n        return this.data.states.get(this.data.states[this.data.previousState]);\r\n    }\r\n\r\n    getNextState() {\r\n        if (this.data.states[this.state + 1] !== undefined) {\r\n            return this.data.states.get(this.data.states[this.state + 1]);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    getCurrent() {\r\n        return this.data.states.get(this.data.states[this.data.currentState]);\r\n    }\r\n\r\n    /**\r\n     * @param {string} id\r\n     */\r\n    setState(id) {\r\n        if (this.data.states.contains(id)) {\r\n            this.data.previousState = this.data.currentState;\r\n            this.data.currentState = this.data.states.indexOf(id);\r\n            this.sceneCallback(id);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    setNextState() {\r\n        if (this.data.states[this.state + 1] !== undefined) {\r\n            this.data.previousState = this.data.currentState;\r\n            this.data.currentState = this.state + 1;\r\n            this.sceneCallback(this.data.states[this.state]);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    setPreviousState() {\r\n        if (this.data.states[this.data.previousState] !== undefined) {\r\n            var state = this.data.previousState;\r\n            this.data.previousState = this.data.currentState;\r\n            this.data.currentState = state;\r\n            this.sceneCallback(this.data.states[state]);\r\n        }\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseGameState} state\r\n     * @param {string} [id]\r\n     */\r\n    add(state, id) {\r\n        if (id === undefined) id = state.data.id;\r\n        if (!this.data.states.contains(id) && state instanceof BaseGameState) {\r\n            this.data.states.add(id, state);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} id\r\n     */\r\n    remove(id) {\r\n        if (this.data.states.contains(id)) {\r\n            this.data.states.remove(id);\r\n        }\r\n        return this;\r\n    }\r\n}\r\n","import Tween from \"transitions/Tween\";\r\nimport ArrayMap from \"utils/ArrayMap\";\r\n\r\n/** @type FrameManager */\r\nvar instance;\r\nvar engineStack = new ArrayMap(), dataStack = new ArrayMap();\r\nvar timestamp = 0;\r\n\r\nvar options = {\r\n    frameLimit: 60,\r\n    frameRun: false,\r\n    breakAnimationFrame: false\r\n};\r\n\r\nvar requestAnimationFrame = (function () {\r\n    return window.requestAnimationFrame ||\r\n        window.webkitRequestAnimationFrame ||\r\n        window.mozRequestAnimationFrame ||\r\n        window.oRequestAnimationFrame ||\r\n        window.msRequestAnimationFrame ||\r\n        (function (callback) {\r\n            if (!options.breakAnimationFrame) {\r\n                if (timestamp >= Number.MAX_SAFE_INTEGER - 1) timestamp = 0;\r\n                if (timestamp === 0) timestamp = window.performance === undefined\r\n                    ? Date.now()\r\n                    : window.performance.now();\r\n                window.setTimeout(callback.bind(this, window.performance === undefined\r\n                    ? Date.now() - timestamp\r\n                    : window.performance.now() - timestamp\r\n                ), 1000.0 / options.frameLimit);\r\n            } else {\r\n                options.breakAnimationFrame = false\r\n            }\r\n        });\r\n})();\r\n\r\nvar cancelAnimationFrame = (function () {\r\n    timestamp = 0;\r\n    return window.cancelAnimationFrame ||\r\n        window.webkitCancelAnimationFrame ||\r\n        window.mozCancelAnimationFrame ||\r\n        window.oCancelAnimationFrame ||\r\n        window.msCancelAnimationFrame;\r\n})();\r\n\r\n\r\n/**\r\n * @class FrameManager\r\n * @exports module:core/FrameManager\r\n *\r\n * @constructor\r\n */\r\nexport default class FrameManager {\r\n    /**\r\n     * @param {string} name\r\n     * @param {BaseState} engine\r\n     * @param {Object} [params]\r\n     * @returns {FrameManager}\r\n     */\r\n    start(name, engine, params) {\r\n        var data = {\r\n            j2d: null,\r\n            frameLimit: options.frameLimit,\r\n            now: 0,\r\n            deltaTime: 0,\r\n            lastTime: 0,\r\n            sceneStartTime: 0,\r\n            sceneSkipTime: 0,\r\n\r\n            asyncUpdate: true,\r\n            asyncRender: true\r\n        };\r\n\r\n        if (params.frameLimit !== undefined && params.frameLimit <= options.frameLimit) data.frameLimit = params.frameLimit;\r\n\r\n        if (params.j2d !== undefined) {\r\n            data.j2d = params.j2d;\r\n        } else {\r\n            throw 'j2d not transported to FrameManager.start(id, engine, {... j2d: j2d ...});';\r\n        }\r\n\r\n        data.interval = 1000.0 / data.frameLimit;\r\n        data.lastTime = Date.now();\r\n\r\n        engineStack.add(name, engine);\r\n        dataStack.add(name, data);\r\n        if (!options.frameRun) this.pulse();\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {string} name\r\n     * @returns {FrameManager}\r\n     */\r\n    stop(name) {\r\n        engineStack.remove(name);\r\n        dataStack.remove(name);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {FrameManager}\r\n     */\r\n    pulse() {\r\n        this.runMainLoop(Date.now());\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} timestamp\r\n     * @param {FrameManager} [frameManager]\r\n     */\r\n    runMainLoop(timestamp, frameManager) {\r\n        if (frameManager === undefined) frameManager = this;\r\n\r\n        if (engineStack.length <= 0 && options.frameRun) {\r\n            options.breakAnimationFrame = true;\r\n            options.frameRun = false;\r\n            return cancelAnimationFrame(this.runMainLoop);\r\n        }\r\n        options.frameRun = true;\r\n\r\n        requestAnimationFrame(function (timestamp) {\r\n            frameManager.runMainLoop(timestamp, frameManager);\r\n        });\r\n\r\n        engineStack.each(function (index) {\r\n            if (engineStack.hasOwnProperty(index) && 'object' === typeof engineStack[index]) {\r\n                var engine = engineStack[index];\r\n                var data = dataStack[index];\r\n\r\n                data.now = Date.now();\r\n                data.deltaTime = (data.now - data.lastTime) / 100.0;\r\n\r\n                if (data.j2d.data.io && !data.j2d.data.pause) data.j2d.data.io.update();\r\n\r\n                if (!data.j2d.data.pause) {\r\n                    if (engine.update !== undefined && 'function' === typeof engine.update) {\r\n                        if (data.asyncUpdate) {\r\n                            setTimeout(engine.update.bind(engine, timestamp, data), 0);\r\n                            setTimeout(Tween.update.bind(this, timestamp), 0);\r\n                        } else {\r\n                            engine.update(timestamp, data);\r\n                            Tween.update(timestamp);\r\n                        }\r\n                    }\r\n\r\n                    if ((data.deltaTime * 100.0) > data.interval) {\r\n                        data.lastTime = data.now - ((data.deltaTime * 100.0) % data.interval);\r\n\r\n                        if (engine.render !== undefined && 'function' === typeof engine.render) {\r\n                            if (data.asyncRender) {\r\n                                setTimeout(engine.render.bind(engine, timestamp, data), 0);\r\n                            } else {\r\n                                engine.render(timestamp, data);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                if (data.j2d.data.io && !data.j2d.data.pause) data.j2d.data.io.clear();\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * @param {number} frameLimit\r\n     * @returns {FrameManager}\r\n     */\r\n    setDefaultFrameLimit(frameLimit) {\r\n        if (frameLimit <= 60 && frameLimit > 0) {\r\n            options.frameLimit = frameLimit\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @singleton\r\n     * @returns {FrameManager}\r\n     */\r\n    static Init() {\r\n        if (window.j2d !== undefined) {\r\n            return window.instanceFrameManager || (window.instanceFrameManager = new FrameManager());\r\n        } else {\r\n            return instance || (instance = new FrameManager());\r\n        }\r\n    }\r\n}\r\n\r\n\r\n","import Handler from \"api/Handler\";\r\n\r\n/**\r\n * FrameHandler\r\n * @constructor\r\n */\r\nexport class FrameHandler extends Handler {\r\n    timestamp = 0;\r\n    started = false;\r\n\r\n    renderEngine = null;\r\n    inputHandler = null;\r\n\r\n    engineStack = [];\r\n\r\n    options = {\r\n        frameLimit: 60,\r\n        pause: false\r\n    };\r\n\r\n    store = {\r\n        breakAnimationFrame: false\r\n    };\r\n\r\n    constructor() {\r\n        super();\r\n\r\n        this.requestAnimationFrame = (function () {\r\n            return window.requestAnimationFrame ||\r\n                window.webkitRequestAnimationFrame ||\r\n                window.mozRequestAnimationFrame ||\r\n                window.oRequestAnimationFrame ||\r\n                window.msRequestAnimationFrame ||\r\n                (function (callback) {\r\n                    if (!this.store.breakAnimationFrame) {\r\n                        if (this.timestamp >= Number.MAX_SAFE_INTEGER - 1) this.timestamp = 0;\r\n                        if (this.timestamp === 0) this.timestamp = window.performance === undefined\r\n                            ? Date.now()\r\n                            : window.performance.now();\r\n                        window.setTimeout(callback.bind(this, window.performance === undefined\r\n                            ? Date.now() - this.timestamp\r\n                            : window.performance.now() - this.timestamp\r\n                        ), 1000.0 / this.options.frameLimit);\r\n                    } else {\r\n                        this.store.breakAnimationFrame = false\r\n                    }\r\n                }.bind(this));\r\n        }.bind(this))();\r\n\r\n        this.cancelAnimationFrame = (function () {\r\n            this.timestamp = 0;\r\n            return window.cancelAnimationFrame ||\r\n                window.webkitCancelAnimationFrame ||\r\n                window.mozCancelAnimationFrame ||\r\n                window.oCancelAnimationFrame ||\r\n                window.msCancelAnimationFrame;\r\n        }.bind(this))();\r\n\r\n        this.loop = this.loop.bind(this);\r\n    }\r\n\r\n    loop(timestamp) {\r\n        if (this.engineStack.length <= 0 && this.started || this.options.pause) {\r\n            this.store.breakAnimationFrame = true;\r\n            this.started = false;\r\n            return this.cancelAnimationFrame(this.loop);\r\n        }\r\n        this.started = true;\r\n        this.requestAnimationFrame(function (timestamp) {\r\n            this.loop(timestamp);\r\n        }.bind(this));\r\n\r\n        for (var i = 0; i < this.engineStack; i++) {\r\n            if (!this.engineStack[i].data.isEnabled) continue;\r\n            var engine = this.engineStack[i];\r\n\r\n            if (!engine.data.pause) {\r\n                if (engine.IO) engine.IO.update();\r\n                var data = engine.data.render;\r\n\r\n                data.now = Date.now();\r\n                data.deltaTime = (data.now - data.lastTime) / 100.0;\r\n\r\n                if (engine.update !== undefined && 'function' === typeof engine.update) {\r\n                    if (engine.data.asyncUpdate) {\r\n                        setTimeout(engine.update.bind(engine, timestamp, data), 0);\r\n                        setTimeout(engine.tweens.update.bind(engine, timestamp), 0);\r\n                    } else {\r\n                        engine.update(timestamp, data);\r\n                        engine.tweens.update(timestamp);\r\n                    }\r\n                }\r\n\r\n                if ((data.deltaTime * 100.0) > data.interval) {\r\n                    data.lastTime = data.now - ((data.deltaTime * 100.0) % data.interval);\r\n\r\n                    if (engine.render !== undefined && 'function' === typeof engine.render) {\r\n                        if (data.asyncRender) {\r\n                            setTimeout(engine.render.bind(engine, timestamp, data), 0);\r\n                        } else {\r\n                            engine.render(timestamp, data);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (engine.IO) engine.IO.clear();\r\n            }\r\n        }\r\n    }\r\n\r\n    start(engineHandler) {\r\n        if (this.engineStack[engineHandler.guid] === undefined) {\r\n            this.engineStack[engineHandler.guid] = engineHandler;\r\n            this.engineStack.push(engineHandler);\r\n        }\r\n        if (!this.started) this.loop(Date.now());\r\n        return this;\r\n    }\r\n\r\n    stop(engineHandler) {\r\n        if (this.engineStack[engineHandler.guid] !== undefined) {\r\n            delete this.engineStack[engineHandler.guid];\r\n            this.engineStack.splice(this.engineStack.indexOf(engineHandler.guid), 1);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    setDefaultFrameLimit(frameLimit) {\r\n        if (frameLimit <= 60 && frameLimit > 0) {\r\n            this.options.frameLimit = frameLimit\r\n        }\r\n        return this;\r\n    }\r\n\r\n    init(eventHandler, renderEngine) {\r\n        this.renderEngine = renderEngine;\r\n        Handler.prototype.init.call(this, eventHandler);\r\n        return this;\r\n    }\r\n\r\n    enable() {\r\n        Handler.prototype.enable.call(this);\r\n        this.options.pause = false;\r\n        this.loop(Date.now());\r\n        return this;\r\n    }\r\n\r\n    disable() {\r\n        Handler.prototype.disable.call(this);\r\n        this.options.pause = true;\r\n        return this;\r\n    }\r\n}\r\n","import PrototypeInterface from \"api/PrototypeInterface\";\r\n\r\n/**\r\n * PrototypeObject\r\n * @constructor\r\n */\r\nexport default class PrototypeObject {\r\n    static interfaces = [];\r\n\r\n    constructor() {\r\n        if (this.constructor.interfaces === undefined) this.constructor.interfaces = [];\r\n\r\n        var scope = [];\r\n\r\n        /**\r\n         TODO:: Object.getPrototypeOf(obj),\r\n         @link https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf\r\n         */\r\n        var implement = function (object) {\r\n            if (object.__proto__.constructor.name === 'Object'\r\n                || object.__proto__.constructor === undefined\r\n                || object.__proto__.constructor.interfaces.length < 1\r\n            ) return;\r\n\r\n            for (var i = 0; i < object.__proto__.constructor.interfaces.length; i++) {\r\n                if (!scope.includes(object.__proto__.constructor.interfaces[i].name)) {\r\n                    scope.push(object.__proto__.constructor.interfaces[i].name);\r\n                    this.constructor.interfaces.push(object.__proto__.constructor.interfaces[i]);\r\n                }\r\n            }\r\n\r\n            implement(object.__proto__);\r\n        }.bind(this);\r\n\r\n        implement(this.__proto__);\r\n    }\r\n\r\n    instanceOf(interfaces) {\r\n        var i = 0, j = 0;\r\n        if (typeof interfaces === 'object' && interfaces instanceof Array) {\r\n            for (i = 0; i < interfaces.length; i++) {\r\n                // if (typeof interfaces[i] === 'object' && interfaces[i] instanceof PrototypeInterface) {\r\n                //     for (j = 0; j < this.constructor.interfaces.length; j++) {\r\n                //         if (!(new (this.constructor.interfaces[j]) instanceof interfaces[i].constructor)) return false;\r\n                //     }\r\n                // } else\r\n                if (typeof interfaces[i] === 'function' && new (interfaces[i]) instanceof PrototypeInterface) {\r\n                    for (j = 0; j < this.constructor.interfaces.length; j++) {\r\n                        if (!(new (this.constructor.interfaces[j]) instanceof interfaces[i])) return false;\r\n                    }\r\n                    // } else if (typeof interfaces[i] === 'object') {\r\n                    //     if (!(this instanceof interfaces[i].constructor)) return false;\r\n                } else if (typeof interfaces[i] === 'function') {\r\n                    if (!(this instanceof interfaces[i])) return false;\r\n                } else throw new Error('Error. \"' + interfaces[i].constructor.name + '\" is not interface!');\r\n            }\r\n        } else if (\r\n            //(typeof interfaces === 'object' && interfaces instanceof PrototypeInterface) ||\r\n            (typeof interfaces === 'function' && new (interfaces) instanceof PrototypeInterface)\r\n        ) {\r\n            //if (typeof interfaces === 'object') interfaces = interfaces.constructor;\r\n            for (i = 0; i < this.constructor.interfaces.length; i++) {\r\n                if (!(new (this.constructor.interfaces[i]) instanceof interfaces)) return false;\r\n            }\r\n            // } else if (typeof interfaces === 'object') {\r\n            //     if (!(this instanceof interfaces.constructor)) return false;\r\n        } else if (typeof interfaces === 'function') {\r\n            if (!(this instanceof interfaces)) return false;\r\n        } else {\r\n            throw new Error('Error. \"' + interfaces.constructor.name + '\" is not interface!');\r\n        }\r\n        return true;\r\n    }\r\n\r\n    toString() {\r\n        return this.__proto__.constructor.name;\r\n    }\r\n}\r\n","/**\r\n * PrototypeInterface\r\n * @constructor\r\n */\r\nexport default class PrototypeInterface {\r\n    static interfaces = [PrototypeInterface];\r\n\r\n    instanceOf(interfaces) {\r\n        var i = 0, j = 0;\r\n        if (typeof interfaces === 'object' && interfaces instanceof Array) {\r\n            for (i = 0; i < interfaces.length; i++) {\r\n                // if (typeof interfaces[i] === 'object' && interfaces[i] instanceof PrototypeInterface) {\r\n                //     for (j = 0; j < this.constructor.interfaces.length; j++) {\r\n                //         if (!(new (this.constructor.interfaces[j]) instanceof interfaces[i].constructor)) return false;\r\n                //     }\r\n                // } else\r\n                if (typeof interfaces[i] === 'function' && new (interfaces[i]) instanceof PrototypeInterface) {\r\n                    for (j = 0; j < this.constructor.interfaces.length; j++) {\r\n                        if (!(new (this.constructor.interfaces[j]) instanceof interfaces[i])) return false;\r\n                    }\r\n                } else throw new Error('Error. \"' + interfaces[i].constructor.name + '\" is not interface!');\r\n            }\r\n        } else if (\r\n            //(typeof interfaces === 'object' && interfaces instanceof PrototypeInterface) ||\r\n            (typeof interfaces === 'function' && new (interfaces) instanceof PrototypeInterface)\r\n        ) {\r\n            //if (typeof interfaces === 'object') interfaces = interfaces.constructor;\r\n            for (i = 0; i < this.constructor.interfaces.length; i++) {\r\n                if (!(new (this.constructor.interfaces[i]) instanceof interfaces)) return false;\r\n            }\r\n        } else {\r\n            throw new Error('Error. \"' + interfaces.constructor.name + '\" is not interface!');\r\n        }\r\n        return true;\r\n    }\r\n}\r\n","import PrototypeObject from \"api/PrototypeObject\";\r\nimport IHandler from \"api/interfaces/IHandler\";\r\n\r\n/**\r\n * Handler\r\n * @constructor\r\n */\r\nexport default class Handler extends PrototypeObject {\r\n    static interfaces = [IHandler];\r\n\r\n    constructor() {\r\n        super();\r\n\r\n        this.events = null;\r\n        this.isEnabled = false;\r\n    }\r\n\r\n    init(eventHandler) {\r\n        if (eventHandler !== undefined) {\r\n            this.events = eventHandler;\r\n        }\r\n        return this;\r\n    };\r\n\r\n    enable() {\r\n        this.isEnabled = true;\r\n        return this;\r\n    };\r\n\r\n    disable() {\r\n        this.isEnabled = false;\r\n        return this;\r\n    };\r\n\r\n    toggle(status) {\r\n        if (status === undefined) status = !this.isEnabled;\r\n        if (status) {\r\n            this.enable();\r\n        } else {\r\n            this.disable();\r\n        }\r\n        return this;\r\n    };\r\n}\r\n","/**\r\n * Device\r\n * @constructor\r\n */\r\nexport default class Device {\r\n    input = undefined;\r\n\r\n    constructor(input) {\r\n        if (input !== undefined) this.input = input;\r\n    }\r\n\r\n    enable() {\r\n        return true;\r\n    };\r\n\r\n    disable() {\r\n        return true;\r\n    };\r\n\r\n    init(input) {\r\n        if (input !== undefined && this.input === undefined) this.input = input;\r\n        return false;\r\n    };\r\n\r\n    update() {\r\n        return true;\r\n    };\r\n\r\n    clear() {\r\n        return true;\r\n    };\r\n\r\n    toString() {\r\n        return function (device) {\r\n            return (device[0].toLowerCase() + device.slice(1))\r\n        }(this.constructor.DeviceName || this.constructor.name);\r\n    };\r\n};\r\n","export default class SystemConsole {\r\n    css = (color) => {\r\n        return 'background: ' + color + ';' +\r\n            'background-repeat: no-repeat;' +\r\n            'color: #1df9a8;' +\r\n            'line-height: 16px' +\r\n            'padding: 3px 0';\r\n    };\r\n\r\n    link = (color) => {\r\n        return 'background: ' + color + ';' +\r\n            'background-repeat: no-repeat;' +\r\n            'font-size: 12px;' +\r\n            'color: #446d96;' +\r\n            'line-height: 14px';\r\n    };\r\n\r\n    logSystem(message, link) {\r\n        return console.log(\"%c %c %c %s %c %c %c %c%s\",\r\n            this.css('#5C6166'), this.css('#4F5357'),\r\n            this.css('#313335'), message,\r\n            this.css('#4F5357'), this.css('#5C6166'),\r\n            this.link('none'), this.link('none'), link\r\n        );\r\n    }\r\n\r\n    log(message, level) {\r\n        var css = '';\r\n        if (typeof level === 'string') level = level.toLowerCase();\r\n        switch (level) {\r\n            case 'info':\r\n                level = 'INFO';\r\n                css = 'background: #308AE4; color: #fff; padding: 1px 4px';\r\n                break;\r\n            case 'warn':\r\n            case 'warning':\r\n                level = 'WARNING';\r\n                css = 'background: #f7a148; color: #fff; padding: 1px 4px';\r\n                break;\r\n            case 'error':\r\n                level = 'ERROR';\r\n                css = 'background: #DB5252; color: #fff; padding: 1px 4px';\r\n                break;\r\n            case 'network':\r\n                level = 'NETWORK';\r\n                css = 'background: #7D2998; color: #fff; padding: 1px 4px';\r\n                break;\r\n            case 'debug':\r\n            case undefined:\r\n            default:\r\n                level = 'DEBUG';\r\n                css = 'background: #ADADAD; color: #fff; padding: 1px 4px';\r\n        }\r\n        return console.log(\"%c%s\", css, level, message);\r\n    };\r\n}\r\n\r\n","import ObjectUtil from \"utils/ObjectUtil\";\r\nimport Vector2d from \"utils/Vector2d\";\r\nimport FrameManager from \"core/FrameManager\";\r\nimport LayersManager from \"core/LayersManager\";\r\nimport ViewportManager from \"core/ViewportManager\";\r\nimport GameStatesManager from \"core/GameStatesManager\";\r\n\r\n/**\r\n * @class SceneManager\r\n * @exports module:core/SceneManager\r\n *\r\n * @param {EngineJ2D} j2d\r\n * @constructor\r\n *\r\n * @property {SceneManager.defaults} data\r\n *\r\n * @property {string} backgroundColor\r\n * @property {number} opacity\r\n * @property {boolean} visible\r\n * @property {number} zIndex\r\n * @property {{x:number, y:number}} viewport\r\n */\r\nexport default class SceneManager {\r\n    static defaults = {\r\n        width: 0,\r\n        height: 0,\r\n\r\n        originalWidth: 0,\r\n        originalHeight: 0,\r\n        originalMargin: 0,\r\n\r\n        visible: true,\r\n        position: 'absolute',\r\n        top: 0,\r\n        left: 0,\r\n        zIndex: 1000,\r\n        opacity: 1.0,\r\n        backgroundColor: false,\r\n\r\n        frameLimit: 60,\r\n\r\n        enableFullScreen: false,\r\n\r\n        viewport: {x: 0, y: 0}\r\n    };\r\n\r\n    constructor(j2d) {\r\n        this.setGameCallback = this.setGameCallback.bind(this);\r\n        this.start = this.start.bind(this);\r\n\r\n        /** @type EngineJ2D */\r\n        this.j2d = j2d;\r\n\r\n        /** @type {HTMLCanvasElement} */\r\n        this.canvas = null;\r\n\r\n        /** @type {CanvasRenderingContext2D} */\r\n        this.context = null;\r\n\r\n        /** @type {FrameManager} */\r\n        this.frameManager = FrameManager.Init();\r\n\r\n        /** @type {LayersManager} */\r\n        this.layersManager = new LayersManager();\r\n\r\n        /** @type {ViewportManager} */\r\n        this.viewportManager = new ViewportManager();\r\n\r\n        /** @type {GameStatesManager} */\r\n        this.gameStatesManager = new GameStatesManager({}, this.setGameCallback);\r\n\r\n        this.initLayers();\r\n    }\r\n\r\n    get backgroundColor() {\r\n        return this.data.backgroundColor;\r\n    }\r\n\r\n    set backgroundColor(value) {\r\n        this.data.backgroundColor = value;\r\n        this.context.fillStyle = value;\r\n        this.context.fillRect(0, 0, this.data.width, this.data.height);\r\n    }\r\n\r\n    get opacity() {\r\n        return this.data.opacity;\r\n    }\r\n\r\n    set opacity(value) {\r\n        this.data.opacity = value;\r\n        this.canvas.style.opacity = value;\r\n    }\r\n\r\n    get visible() {\r\n        return this.data.visible;\r\n    }\r\n\r\n    set visible(value) {\r\n        this.data.visible = !!value;\r\n        this.canvas.style.display = (!!value) ? 'block' : 'none';\r\n    }\r\n\r\n    get zIndex() {\r\n        return 1000 - this.data.zIndex;\r\n    }\r\n\r\n    set zIndex(value) {\r\n        this.data.zIndex = 1000 + value;\r\n        this.canvas.style.zIndex = 1000 + value;\r\n    }\r\n\r\n    get viewport() {\r\n        return this.data.viewport;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseGameState} state\r\n     * @returns {Function}\r\n     */\r\n    patchGameStateRender(state) {\r\n        var sceneManager = this;\r\n        var constructor = state.constructor;\r\n        if (typeof constructor === 'function' && constructor.prototype.render === undefined) {\r\n            constructor.prototype.render = function (timestamp, data) {\r\n                sceneManager.clear().fillBackground().render(data);\r\n                return true;\r\n            };\r\n        }\r\n        return constructor;\r\n    };\r\n\r\n    /**\r\n     * @param {SceneManager.defaults|Object|undefined} options\r\n     * @returns {SceneManager}\r\n     */\r\n    init(options) {\r\n        this.data = ObjectUtil.extend(true, {}, SceneManager.defaults, options);\r\n\r\n        this.j2d.trigger('beforeInit');\r\n\r\n        this.data.originalWidth = this.data.width;\r\n        this.data.originalHeight = this.data.height;\r\n        this.data.originalMargin = getComputedStyle(this.j2d.element)['margin'];\r\n\r\n        this.j2d.element.style.width = this.data.width + 'px';\r\n        this.j2d.element.style.height = this.data.height + 'px';\r\n\r\n        this.initCanvas();\r\n\r\n        this.viewportManager.setScreen({\r\n            x: this.data.width,\r\n            y: this.data.height\r\n        }).setDefaultViewport({\r\n            offset: {\r\n                x: 0.0,\r\n                y: 0.0\r\n            },\r\n            size: {\r\n                x: this.data.width,\r\n                y: this.data.height\r\n            },\r\n            scale: 1.0,\r\n            angle: 0.0\r\n        });\r\n\r\n        this.j2d.trigger('afterInit');\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {SceneManager}\r\n     */\r\n    initLayers() {\r\n        if (!this.layersManager.getLayer('scene')) {\r\n            this.layersManager.addLayer('scene', 0);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {SceneManager}\r\n     */\r\n    initCanvas() {\r\n        if (document.querySelectorAll('.j2d[guid=\"' + this.j2d.data.id + '\"] canvas').length === 0) {\r\n            this.canvas = document.createElement('canvas');\r\n\r\n            this.canvas.width = this.data.width;\r\n            this.canvas.height = this.data.height;\r\n            this.canvas.style.zIndex = this.data.zIndex;\r\n            this.canvas.style.position = this.data.position;\r\n\r\n            this.canvas.style.left = this.data.left;\r\n            this.canvas.style.top = this.data.top;\r\n\r\n            if (this.j2d.data.webGL) {\r\n                //WebGL2D.enable(this.canvas);\r\n                this.context = this.canvas.getContext('WebGL-2d');\r\n            } else {\r\n                this.context = this.canvas.getContext('2d');\r\n            }\r\n\r\n            if (!this.j2d.data.smoothing) {\r\n                this.j2d.util.disableSmoothing(this.context);\r\n            }\r\n\r\n            this.context.shadowColor = 'rgba(0,0,0,0)';\r\n            if (this.data.backgroundColor) this.backgroundColor = this.data.backgroundColor;\r\n            if (this.data.opacity) this.opacity = this.data.opacity;\r\n            if (this.data.visible) this.visible = this.data.visible;\r\n            if (this.data.zIndex) this.zIndex = 1000 - this.data.zIndex;\r\n\r\n            this.j2d.element.appendChild(this.canvas);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {{x:number, y:number}|Vector2d} [pos]\r\n     * @param {{x:number, y:number}|Vector2d} [size]\r\n     * @returns {SceneManager}\r\n     */\r\n    clear(pos, size) {\r\n        if (pos !== undefined && size !== undefined) {\r\n            this.context.clearRect(pos.x - this.viewport.x, pos.y - this.viewport.y, size.x, size.y);\r\n        } else {\r\n            this.context.clearRect(0, 0, this.data.width, this.data.height);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {number} width\r\n     * @param {number} height\r\n     * @returns {SceneManager}\r\n     */\r\n    resize(width, height) {\r\n        this.canvas.width = this.data.width = width;\r\n        this.canvas.height = this.data.height = height;\r\n\r\n        if (this.data.backgroundColor) {\r\n            this.context.save();\r\n\r\n            this.clear();\r\n            this.backgroundColor = this.data.backgroundColor;\r\n\r\n            this.context.restore();\r\n        }\r\n        if (!this.j2d.data.smoothing) {\r\n            this.j2d.util.disableSmoothing(this.context);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * TODO:: refactor this\r\n     * @param {string} gameState\r\n     * @returns {SceneManager}\r\n     */\r\n    setGameCallback(gameState) {\r\n        var sceneManager = this;\r\n        sceneManager.data.gameState = gameState || 'init_j2d';\r\n        sceneManager.frameManager.stop(sceneManager.j2d.data.id);\r\n\r\n        var gameConstructor = sceneManager.patchGameStateRender(\r\n            sceneManager.gameStatesManager.getState(gameState)\r\n        );\r\n\r\n        var newGameState = new gameConstructor(sceneManager.gameStatesManager, {});\r\n        newGameState.init({\r\n            callback: function () {\r\n                newGameState.load({\r\n                    callback: function () {\r\n                        sceneManager.frameManager.start(sceneManager.j2d.data.id, newGameState, {\r\n                            j2d: sceneManager.j2d,\r\n                            frameLimit: sceneManager.data.frameLimit\r\n                        });\r\n\r\n                        sceneManager.j2d.trigger('changedGameState');\r\n\r\n                        // TODO:: async unload?\r\n                        sceneManager.gameStatesManager.getPreviousState().unload();\r\n                    }\r\n                });\r\n            }\r\n        });\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {Function|callback} callback\r\n     * @param {*} data\r\n     * @returns {SceneManager}\r\n     */\r\n    async(callback, data) {\r\n        setTimeout(callback.call(callback, data), 0);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {SceneManager}\r\n     */\r\n    start() {\r\n        var sceneManager = this;\r\n        if (sceneManager.j2d.data.io) {\r\n            sceneManager.j2d.data.io.init();\r\n        }\r\n        sceneManager.j2d.trigger('beforeStart');\r\n\r\n        sceneManager.frameManager.stop(sceneManager.j2d.data.id);\r\n\r\n        var gameConstructor = sceneManager.patchGameStateRender(\r\n            sceneManager.gameStatesManager.getCurrent()\r\n        );\r\n\r\n        var newGameState = new gameConstructor(sceneManager.gameStatesManager, {});\r\n        newGameState.init({\r\n            callback: function () {\r\n                newGameState.load({\r\n                    callback: function () {\r\n                        sceneManager.frameManager.start(sceneManager.j2d.data.id, newGameState, {\r\n                            j2d: sceneManager.j2d,\r\n                            frameLimit: sceneManager.data.frameLimit\r\n                        });\r\n\r\n                        sceneManager.j2d.trigger('afterStart');\r\n                    }\r\n                });\r\n            }\r\n        });\r\n\r\n        return sceneManager;\r\n    }\r\n\r\n    /**\r\n     * @returns {SceneManager}\r\n     */\r\n    stop() {\r\n        this.frameManager.stop(this.j2d.data.id);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {boolean} [fullscreen]\r\n     * @returns {SceneManager}\r\n     */\r\n    fullScreen(fullscreen) {\r\n        var element = document.getElementById(this.j2d.element.attr('id'));\r\n\r\n        if (undefined === element.requestFullscreen) {\r\n            //noinspection JSUnresolvedVariable\r\n            element.requestFullscreen = element.webkitRequestFullscreen\r\n                || element.webkitRequestFullScreen\r\n                || element.mozRequestFullScreen\r\n                || element.msRequestFullscreen;\r\n        }\r\n\r\n        if (undefined === document.exitFullscreen) {\r\n            //noinspection JSUnresolvedVariable\r\n            document.exitFullscreen = document.webkitExitFullscreen\r\n                || document.webkitCancelFullScreen\r\n                || document.mozCancelFullScreen\r\n                || document.msExitFullscreen;\r\n        }\r\n        if (fullscreen) {\r\n            element.requestFullscreen();\r\n        } else {\r\n            document.exitFullscreen();\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {boolean} [fullscreen]\r\n     * @returns {SceneManager}\r\n     */\r\n    resizeToFullPage(fullscreen) {\r\n        var j2d = this.j2d;\r\n        var sceneManager = this;\r\n\r\n        if (fullscreen) {\r\n            sceneManager.data.originalWidth = sceneManager.data.width;\r\n            sceneManager.data.originalHeight = sceneManager.data.height;\r\n\r\n            sceneManager.resize(j2d.device.width, j2d.device.height);\r\n            sceneManager.data.enableFullscreen = true;\r\n\r\n            j2d.element.style.width = j2d.device.width + 'px';\r\n            j2d.element.style.height = j2d.device.height + 'px';\r\n            j2d.element.style.margin = 0;\r\n\r\n            sceneManager.viewportManager.setScreen({\r\n                x: j2d.device.width,\r\n                y: j2d.device.height\r\n            }).setOffset({\r\n                x: -(j2d.device.width - sceneManager.data.originalWidth) / 2,\r\n                y: -(j2d.device.height - sceneManager.data.originalHeight) / 2\r\n            });\r\n        } else {\r\n            sceneManager.resize(sceneManager.data.originalWidth, sceneManager.data.originalHeight);\r\n            sceneManager.data.enableFullscreen = false;\r\n\r\n            j2d.element.style.width = sceneManager.data.originalWidth + 'px';\r\n            j2d.element.style.height = sceneManager.data.originalHeight + 'px';\r\n            j2d.element.style.margin = sceneManager.data.originalMargin;\r\n\r\n            sceneManager.viewportManager.setScreen({\r\n                x: sceneManager.data.originalWidth,\r\n                y: sceneManager.data.originalHeight\r\n            }).setOffset({\r\n                x: 0,\r\n                y: 0\r\n            });\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {EngineJ2D} j2d\r\n     * @param {{fullscreen: boolean}} data\r\n     * @returns {SceneManager}\r\n     */\r\n    toggleFullScreen(j2d, data) {\r\n        if (data === undefined) {\r\n            data = {fullscreen: false};\r\n        }\r\n        if (!j2d.scene.enableFullscreen || data.fullscreen) {\r\n            j2d.scene.fullScreen(true);\r\n        } else {\r\n            j2d.scene.fullScreen(false);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {CollectionNode|null}\r\n     */\r\n    getSceneLayer() {\r\n        return this.layersManager.getLayer('scene');\r\n    }\r\n\r\n    /**\r\n     * @returns {SceneManager}\r\n     */\r\n    fillBackground() {\r\n        if (this.data.backgroundColor) {\r\n            this.backgroundColor = this.data.backgroundColor;\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {Object} data\r\n     * @returns {SceneManager}\r\n     */\r\n    render(data) {\r\n        var sceneManager = this;\r\n        sceneManager.layersManager.layers.forEach(function (value, index) {\r\n            sceneManager.layersManager.layers[index].render(\r\n                sceneManager.context,\r\n                sceneManager.viewportManager.getViewport(),\r\n                sceneManager.layersManager.globalCollection,\r\n                data || {}\r\n            );\r\n        });\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseNode} node\r\n     * @param {string} [key]\r\n     * @returns {SceneManager}\r\n     */\r\n    add(node, key) {\r\n        if (this.layersManager.globalCollection.has('scene')) {\r\n            this.layersManager.globalCollection.get('scene').add(node, key);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {BaseNode} [node]\r\n     * @param {string} [key]\r\n     * @returns {SceneManager}\r\n     */\r\n    remove(node, key) {\r\n        if (this.layersManager.globalCollection.has('scene')) {\r\n            this.layersManager.globalCollection.get('scene').remove(node, key);\r\n        }\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @param {CameraNode} node\r\n     * @returns {SceneManager}\r\n     */\r\n    registerCamera(node) {\r\n        this.viewportManager.addCamera(node.data.id, node);\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * Hack to mode without Cameras\r\n     * @returns {SceneManager}\r\n     */\r\n    _updateNoCamerasViewport(scene) {\r\n        // This hack use deprecated method, i known.\r\n        scene.viewportManager.setViewport(\r\n            new Vector2d(0, 0),\r\n            new Vector2d(scene.data.width, scene.data.height)\r\n        );\r\n\r\n        return scene;\r\n    }\r\n\r\n    /**\r\n     * @param {CameraNode} [node]\r\n     * @returns {SceneManager}\r\n     */\r\n    updateViewport(node) {\r\n        if (node === undefined) return this._updateNoCamerasViewport(this);\r\n        this.viewportManager.updateViewport(node.data.id);\r\n        return this;\r\n    }\r\n}\r\n","import Vector2dInteger from \"utils/Vector2dInteger\";\r\n/**\r\n * Class utility for get system browser window size\r\n *\r\n * @class DeviceUtil\r\n * @exports module:utils/DeviceUtil\r\n *\r\n * @constructor\r\n */\r\nexport default class DeviceUtil {\r\n    constructor() {\r\n        let documentWidth = parseInt(Math.max(\r\n            document.documentElement['clientWidth'],\r\n            document.body['scrollWidth'],\r\n            document.documentElement['scrollWidth'],\r\n            document.body['offsetWidth'],\r\n            document.documentElement['offsetWidth']\r\n        ));\r\n\r\n        let documentHeight = parseInt(Math.max(\r\n            document.documentElement['clientHeight'],\r\n            document.body['scrollHeight'],\r\n            document.documentElement['scrollHeight'],\r\n            document.body['offsetHeight'],\r\n            document.documentElement['offsetHeight']\r\n        ));\r\n\r\n        this.width = documentWidth < parseInt(screen.width) ? documentWidth : parseInt(screen.width);\r\n        this.height = documentHeight < parseInt(screen.height) ? documentHeight : parseInt(screen.height);\r\n    }\r\n\r\n    /**\r\n     * @returns {DeviceUtil}\r\n     */\r\n    onResize() {\r\n        this.width = window.innerWidth;\r\n        this.height = window.innerHeight;\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * @returns {number}\r\n     */\r\n    getWidth() {\r\n        return this.width;\r\n    }\r\n\r\n    /**\r\n     * @returns {number}\r\n     */\r\n    getHeight() {\r\n        return this.height;\r\n    }\r\n\r\n    /**\r\n     * @returns {Vector2d}\r\n     */\r\n    getSize() {\r\n        return new Vector2dInteger(this.width, this.height);\r\n    }\r\n}\r\n","/**\r\n * Class for generate uuid\r\n *\r\n * @class UUID\r\n * @exports module:utils/UUID\r\n *\r\n * @constructor\r\n */\r\nexport default class UUID {\r\n    static generate = function () {\r\n        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n            var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n            return v.toString(16);\r\n        });\r\n    }\r\n}\r\n","import PrototypeObject from \"api/PrototypeObject\";\r\nimport IEngineComponent from \"api/interfaces/IEngineComponent\";\r\n\r\n/**\r\n * EngineComponent\r\n * @constructor\r\n */\r\nexport default class EngineComponent extends PrototypeObject {\r\n    static interfaces = [IEngineComponent];\r\n\r\n    constructor() {\r\n        super();\r\n    }\r\n};\r\n\r\n","import PrototypeInterface from \"api/PrototypeInterface\";\r\n\r\n/**\r\n * IEngine\r\n * @constructor\r\n */\r\nexport default class IEngine extends PrototypeInterface {\r\n};\r\n","import IEngine from \"api/interfaces/IEngine\";\r\nimport EngineComponent from \"api/EngineComponent\";\r\nimport ObjectUtil from \"utils/ObjectUtil\";\r\nimport UUID from \"utils/UUID\";\r\nimport DeviceUtil from \"utils/DeviceUtil\";\r\nimport ArrayMap from \"utils/ArrayMap\";\r\nimport SceneManager from \"core/SceneManager\";\r\nimport Log from \"utils/SystemConsole\"\r\n\r\n/*\r\n * TODO:: Events System\r\n */\r\n\r\n/**\r\n * @class EngineJ2D\r\n * @exports module:\"j2d\"\r\n *\r\n * @param {Element} element\r\n * @param {EngineJ2D.defaults} data\r\n *\r\n * @constructor\r\n * @property {boolean} WebGL // TODO:: To scene\r\n * @property {boolean} smoothing // TODO:: To scene\r\n * @property {InputManager|null} io\r\n * @property {MediaManager|null} media\r\n * @property {boolean} isPlay\r\n */\r\nexport default class EngineJ2D extends EngineComponent {\r\n    static interfaces = [IEngine];\r\n\r\n    static VERSION = '1.0.0-dev (VeNoM iNjecTioN)';\r\n\r\n    static defaults = {\r\n        /** @type string|null */\r\n        id: null,\r\n        io: null,\r\n        media: null,\r\n        deltaTime: 0,\r\n        pause: false,\r\n        ready: false,\r\n\r\n        frameLimit: 60,\r\n        smoothing: true,\r\n\r\n        webGL: false\r\n    };\r\n\r\n    /**\r\n     * @type {Array.<EngineJ2D>|ArrayMap.<EngineJ2D>}\r\n     */\r\n    static stack = new ArrayMap();\r\n\r\n    constructor(element, data) {\r\n        super();\r\n\r\n        /** @type {Element} */\r\n        this.element = element;\r\n\r\n        /** @type EngineJ2D.defaults */\r\n        this.data = data;\r\n\r\n        /** @type DeviceUtil */\r\n        this.device = new DeviceUtil();\r\n\r\n        /** @type SceneManager */\r\n        this.scene = new SceneManager(this);\r\n\r\n        /** @type SystemConsole */\r\n        this.Log = new Log();\r\n    }\r\n\r\n    get WebGL() {\r\n        return this.data.webGL;\r\n    }\r\n\r\n    set WebGL(value) {\r\n        this.data.webGL = !!value;\r\n        if (!!value && !this.data.webGL) {\r\n            this.element.classList.add('WebGL');\r\n        } else if (!value && this.data.webGL) {\r\n            this.element.classList.remove('WebGL');\r\n        }\r\n    }\r\n\r\n    get smoothing() {\r\n        return this.data.smoothing;\r\n    }\r\n\r\n    set smoothing(value) {\r\n        this.data.smoothing = !!value;\r\n    }\r\n\r\n    get io() {\r\n        return this.data.io;\r\n    }\r\n\r\n    set io(value) {\r\n        return this.data.io = value\r\n    }\r\n\r\n    get media() {\r\n        return this.data.media;\r\n    }\r\n\r\n    set media(value) {\r\n        return this.data.media = value\r\n    }\r\n\r\n    get isPlay() {\r\n        return !this.data.pause;\r\n    }\r\n\r\n    /** +GameEngine **/\r\n    start() {\r\n        this.scene.start();\r\n        this.trigger('start');\r\n    };\r\n\r\n    stop() {\r\n        this.scene.stop();\r\n        this.trigger('stop');\r\n    };\r\n\r\n    // TODO:: add MediaManager\r\n    pause() {\r\n        if (this.data.io) this.data.io.flush();\r\n        this.data.pause = true;\r\n        this.element.classList.add('pause');\r\n        this.trigger('pause');\r\n    };\r\n\r\n    // TODO:: add MediaManager\r\n    resume() {\r\n        this.element.classList.remove('pause');\r\n        this.element.focus();\r\n        this.data.pause = false;\r\n        if (this.data.io) this.data.io.flush();\r\n        this.trigger('resume');\r\n    };\r\n\r\n    /** -GameEngine **/\r\n\r\n    /** @returns {SceneManager} */\r\n    getSceneManager() {\r\n        return this.scene;\r\n    };\r\n\r\n    /** @returns {LayersManager} */\r\n    getLayersManager() {\r\n        return this.scene.layersManager;\r\n    };\r\n\r\n    /** @returns {FrameManager} */\r\n    getFrameManager() {\r\n        return this.scene.frameManager;\r\n    };\r\n\r\n    /** @returns {ViewportManager} */\r\n    getViewportManager() {\r\n        return this.scene.viewportManager;\r\n    };\r\n\r\n    /** @returns {GameStatesManager} */\r\n    getGameStatesManager() {\r\n        return this.scene.gameStatesManager;\r\n    };\r\n\r\n    on() {\r\n    };\r\n\r\n    once() {\r\n    };\r\n\r\n    off() {\r\n    };\r\n\r\n    trigger() {\r\n    };\r\n\r\n    log(message, level) {\r\n        this.Log.log(message, level);\r\n    };\r\n\r\n    /**\r\n     * @name EngineJ2D\r\n     * @static\r\n     *\r\n     * @param {string|window.jQuery} selected\r\n     * @param {EngineJ2D.defaults|Object} options\r\n     *\r\n     * @returns {EngineJ2D|EngineJ2D[]|Array.<EngineJ2D>}\r\n     */\r\n    static initEngine(selected, options) {\r\n        var nodes = [];\r\n        if (typeof selected === 'string') {\r\n            nodes = window.document.querySelectorAll(selected);\r\n        } else if (typeof selected === 'object' && window.jQuery !== undefined && selected instanceof window.jQuery) {\r\n            nodes = selected.get();\r\n        } else return null;\r\n\r\n        var inactiveNodes = [];\r\n        Array.prototype.forEach.call(nodes, (node) => {\r\n            if (!node.hasAttribute('guid')) inactiveNodes.push(node)\r\n        });\r\n\r\n        inactiveNodes.forEach((element) => {\r\n            var options = ObjectUtil.extend(true, {}, EngineJ2D.defaults, options);\r\n            options.id = UUID.generate();\r\n\r\n            element.setAttribute('guid', options.id);\r\n\r\n            var id = element.getAttribute('id');\r\n            if (id === undefined || id === null) {\r\n                element.setAttribute('guid', options.id);\r\n            }\r\n\r\n            var tabIndex = element.getAttribute('tabindex');\r\n            if (tabIndex === undefined || tabIndex === null || tabIndex === false) {\r\n                element.setAttribute('tabindex', '-1');\r\n            }\r\n\r\n            if (!element.classList.contains('j2d')) {\r\n                element.classList.add('j2d');\r\n            }\r\n\r\n            EngineJ2D.stack.add(options.id, new EngineJ2D(element, options));\r\n            element.click();\r\n            element.focus();\r\n        });\r\n\r\n        var resumeBind = (current) => {\r\n            var nodes, engine;\r\n            nodes = window.document.querySelectorAll('div.canvas[guid]:not(.pause-disable):not(:focus)');\r\n            Array.prototype.forEach.call(nodes, (node) => {\r\n                if (current !== node) {\r\n                    node.classList.remove('active');\r\n                    engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n                    if (engine) engine.pause();\r\n                }\r\n            });\r\n\r\n            nodes = window.document.querySelectorAll('div.canvas[guid].active.pause-disable:not(:focus)');\r\n            Array.prototype.forEach.call(nodes, (node) => {\r\n                if (current !== node) {\r\n                    node.classList.remove('active');\r\n                }\r\n            });\r\n        };\r\n\r\n        function resumeEventListener() {\r\n            var engine;\r\n            if (this.classList.contains('pause')) {\r\n                engine = EngineJ2D.stack.get(this.getAttribute('guid'));\r\n                if (engine) engine.resume();\r\n                resumeBind(this);\r\n            } else if (!this.classList.contains('resume-by-click') && this.classList.contains(':focus')) {\r\n                this.classList.add('active');\r\n                this.focus();\r\n                engine = EngineJ2D.stack.get(this.getAttribute('guid'));\r\n                if (engine) engine.resume();\r\n                resumeBind(this);\r\n            }\r\n            return true;\r\n        }\r\n\r\n        var activeNodes = [];\r\n        nodes = window.document.querySelectorAll('.j2d[guid]');\r\n        Array.prototype.forEach.call(nodes, (node) => {\r\n            activeNodes.push(EngineJ2D.stack.get(node.getAttribute('guid')));\r\n            node.addEventListener('click', resumeEventListener);\r\n            node.addEventListener('touch', resumeEventListener);\r\n            node.addEventListener('mouseenter', resumeEventListener);\r\n        });\r\n        return (1 === activeNodes.length) ? activeNodes[0] : activeNodes;\r\n    };\r\n\r\n    static util = {\r\n        /**\r\n         * @param {CanvasRenderingContext2D} context\r\n         */\r\n        disableSmoothing: (context) => {\r\n            var chrome = window.navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n            var version = chrome ? parseInt(chrome[2], 10) : false;\r\n\r\n            context['imageSmoothingEnabled'] = false;\r\n            context['mozImageSmoothingEnabled'] = false;\r\n            context['oImageSmoothingEnabled'] = false;\r\n            if (version && version <= 29) {\r\n                context['webkitImageSmoothingEnabled'] = false;\r\n            }\r\n            context['msImageSmoothingEnabled'] = false;\r\n        }\r\n    };\r\n\r\n    /** Utils **/\r\n    util = EngineJ2D.util;\r\n    initEngine = EngineJ2D.initEngine;\r\n}\r\n\r\n/* ------------------------------ Plugin ------------------------------ */\r\n(EngineJ2D.initPlugin = () => {\r\n    if (window.j2dPlugin !== undefined) return null;\r\n    window.j2dPlugin = {pluginInit: true, stack: new ArrayMap()};\r\n\r\n    (new Log()).logSystem('j2D v.' + EngineJ2D.VERSION, 'https://github.com/fsggs/j2d');\r\n\r\n    if (window.jQuery !== undefined) {\r\n        /**\r\n         * @param {EngineJ2D.defaults} [options]\r\n         * @returns {EngineJ2D|EngineJ2D[]|Array.<EngineJ2D>}\r\n         */\r\n        window.jQuery.fn.j2d = (options) => {\r\n            return EngineJ2D.initEngine(this, options);\r\n        };\r\n    }\r\n\r\n    window.j2dPlugin.initEngine = EngineJ2D.initEngine;\r\n\r\n    var firefox = window.navigator.userAgent.match(/Firefox\\/([0-9]+)\\./);\r\n    var version = firefox ? parseInt(firefox[2], 10) : false;\r\n\r\n    var isFullScreen = () => {\r\n        //noinspection JSUnresolvedVariable\r\n        return !!(window.document.webkitFullscreenElement\r\n            || window.document.webkitCurrentFullScreenElement\r\n            || (version && version < 47) ? window.document.mozFullScreenElement : window.document.fullscreenElement\r\n            || window.document.msFullscreenElement\r\n        );\r\n    };\r\n\r\n    function fullScreenEventListener() {\r\n        var fullScreen = isFullScreen();\r\n        if (!fullScreen) {\r\n            var node, engine;\r\n            node = window.document.querySelector('.j2d[guid].active');\r\n            if (node) engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n            if (engine) engine.scene.resizeToFullPage(fullScreen);\r\n\r\n            node = window.document.querySelector('.j2d[guid]:not(.active)');\r\n            if (node) engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n            if (engine) engine.toggle(!fullScreen);\r\n        }\r\n    }\r\n\r\n    var html = window.document.querySelector('html');\r\n\r\n    if (!html.classList.contains('j2d')) {\r\n        window.document.addEventListener('fullscreenchange', fullScreenEventListener);\r\n        window.document.addEventListener('webkitfullscreenchange', fullScreenEventListener);\r\n        window.document.addEventListener('mozfullscreenchange', fullScreenEventListener);\r\n        window.document.addEventListener('MSFullscreenChange', fullScreenEventListener);\r\n\r\n        window.addEventListener('focus', () => {\r\n            var node, engine;\r\n            node = window.document.querySelector('.j2d[guid].active:not(.resume-by-click)');\r\n            if (node) engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n            if (engine) engine.resume();\r\n        });\r\n\r\n        window.addEventListener('blur', () => {\r\n            var nodes, engine;\r\n            nodes = window.document.querySelectorAll('.j2d[guid]:not(.pause-disable)');\r\n            Array.prototype.forEach.call(nodes, (node) => {\r\n                if (node) engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n                if (engine) engine.pause();\r\n            });\r\n        });\r\n\r\n        window.addEventListener('resize', () => {\r\n            EngineJ2D.stack.forEach((guid) => {\r\n                EngineJ2D.stack[guid].device.onResize();\r\n            });\r\n\r\n            var fullScreen = isFullScreen();\r\n            if (fullScreen) {\r\n                var node, engine;\r\n                node = window.document.querySelector('.j2d[guid].active');\r\n                if (node) engine = EngineJ2D.stack.get(node.getAttribute('guid'));\r\n                if (engine) engine.scene.resizeToFullPage(fullScreen);\r\n            }\r\n            return true;\r\n        });\r\n        html.classList.add('j2d');\r\n    }\r\n})();\r\n\r\n"]}