@tomorrowevening/hermes 0.0.160 → 0.0.161

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/grid.png ADDED
Binary file
@@ -482,7 +482,7 @@ var<${s}> ${e} : ${r};`}}class NA{constructor(e){this.backend=e}getCurrentDepthS
482
482
  * https://github.com/yomotsu/camera-controls
483
483
  * (c) 2017 @yomotsu
484
484
  * Released under the MIT License.
485
- */const We={LEFT:1,RIGHT:2,MIDDLE:4},D=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,SCREEN_PAN:4,OFFSET:8,DOLLY:16,ZOOM:32,TOUCH_ROTATE:64,TOUCH_TRUCK:128,TOUCH_SCREEN_PAN:256,TOUCH_OFFSET:512,TOUCH_DOLLY:1024,TOUCH_ZOOM:2048,TOUCH_DOLLY_TRUCK:4096,TOUCH_DOLLY_SCREEN_PAN:8192,TOUCH_DOLLY_OFFSET:16384,TOUCH_DOLLY_ROTATE:32768,TOUCH_ZOOM_TRUCK:65536,TOUCH_ZOOM_OFFSET:131072,TOUCH_ZOOM_SCREEN_PAN:262144,TOUCH_ZOOM_ROTATE:524288}),kn={NONE:0,IN:1,OUT:-1};function Yi(a){return a.isPerspectiveCamera}function bi(a){return a.isOrthographicCamera}const zn=Math.PI*2,Of=Math.PI/2,Ly=1e-5,Vr=Math.PI/180;function gs(a,e,t){return Math.max(e,Math.min(t,a))}function Ie(a,e=Ly){return Math.abs(a)<e}function Ae(a,e,t=Ly){return Ie(a-e,t)}function Bf(a,e){return Math.round(a/e)*e}function Hr(a){return isFinite(a)?a:a<0?-Number.MAX_VALUE:Number.MAX_VALUE}function Wr(a){return Math.abs(a)<Number.MAX_VALUE?a:a*(1/0)}function yo(a,e,t,s,i=1/0,n){s=Math.max(1e-4,s);const r=2/s,o=r*n,l=1/(1+o+.48*o*o+.235*o*o*o);let c=a-e;const h=e,u=i*s;c=gs(c,-u,u),e=a-c;const d=(t.value+r*c)*n;t.value=(t.value-r*d)*l;let p=e+(c+d)*l;return h-a>0==p>h&&(p=h,t.value=(p-h)/n),p}function If(a,e,t,s,i=1/0,n,r){s=Math.max(1e-4,s);const o=2/s,l=o*n,c=1/(1+l+.48*l*l+.235*l*l*l);let h=e.x,u=e.y,d=e.z,p=a.x-h,f=a.y-u,m=a.z-d;const y=h,g=u,_=d,b=i*s,T=b*b,S=p*p+f*f+m*m;if(S>T){const Q=Math.sqrt(S);p=p/Q*b,f=f/Q*b,m=m/Q*b}h=a.x-p,u=a.y-f,d=a.z-m;const C=(t.x+o*p)*n,w=(t.y+o*f)*n,R=(t.z+o*m)*n;t.x=(t.x-o*C)*c,t.y=(t.y-o*w)*c,t.z=(t.z-o*R)*c,r.x=h+(p+C)*c,r.y=u+(f+w)*c,r.z=d+(m+R)*c;const P=y-a.x,z=g-a.y,$=_-a.z,q=r.x-y,j=r.y-g,Z=r.z-_;return P*q+z*j+$*Z>0&&(r.x=y,r.y=g,r.z=_,t.x=(r.x-y)/n,t.y=(r.y-g)/n,t.z=(r.z-_)/n),r}function Xc(a,e){e.set(0,0),a.forEach(t=>{e.x+=t.clientX,e.y+=t.clientY}),e.x/=a.length,e.y/=a.length}function Zc(a,e){return bi(a)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}class QR{constructor(){this._listeners={}}addEventListener(e,t){const s=this._listeners;s[e]===void 0&&(s[e]=[]),s[e].indexOf(t)===-1&&s[e].push(t)}hasEventListener(e,t){const s=this._listeners;return s[e]!==void 0&&s[e].indexOf(t)!==-1}removeEventListener(e,t){const i=this._listeners[e];if(i!==void 0){const n=i.indexOf(t);n!==-1&&i.splice(n,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const s=this._listeners[e.type];if(s!==void 0){e.target=this;const i=s.slice(0);for(let n=0,r=i.length;n<r;n++)i[n].call(this,e)}}}var Qc;const KR="2.10.1",xo=1/8,JR=/Mac/.test((Qc=globalThis?.navigator)===null||Qc===void 0?void 0:Qc.platform);let ee,Lf,_o,Kc,It,le,Te,Gn,$r,Ms,As,Xi,Uf,kf,es,jr,Vn,zf,Jc,Gf,eh,th,bo;class Ds extends QR{static install(e){ee=e.THREE,Lf=Object.freeze(new ee.Vector3(0,0,0)),_o=Object.freeze(new ee.Vector3(0,1,0)),Kc=Object.freeze(new ee.Vector3(0,0,1)),It=new ee.Vector2,le=new ee.Vector3,Te=new ee.Vector3,Gn=new ee.Vector3,$r=new ee.Vector3,Ms=new ee.Vector3,As=new ee.Vector3,Xi=new ee.Vector3,Uf=new ee.Vector3,kf=new ee.Vector3,es=new ee.Spherical,jr=new ee.Spherical,Vn=new ee.Box3,zf=new ee.Box3,Jc=new ee.Sphere,Gf=new ee.Quaternion,eh=new ee.Quaternion,th=new ee.Matrix4,bo=new ee.Raycaster}static get ACTION(){return D}set verticalDragToForward(e){console.warn("camera-controls: `verticalDragToForward` was removed. Use `mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.")}constructor(e,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=D.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=kn.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new ee.Vector3,this._focalOffsetVelocity=new ee.Vector3,this._zoomVelocity={value:0},this._truckInternal=(g,_,b,T)=>{let S,C;if(Yi(this._camera)){const w=le.copy(this._camera.position).sub(this._target),R=this._camera.getEffectiveFOV()*Vr,P=w.length()*Math.tan(R*.5);S=this.truckSpeed*g*P/this._elementRect.height,C=this.truckSpeed*_*P/this._elementRect.height}else if(bi(this._camera)){const w=this._camera;S=this.truckSpeed*g*(w.right-w.left)/w.zoom/this._elementRect.width,C=this.truckSpeed*_*(w.top-w.bottom)/w.zoom/this._elementRect.height}else return;T?(b?this.setFocalOffset(this._focalOffsetEnd.x+S,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(S,0,!0),this.forward(-C,!0)):b?this.setFocalOffset(this._focalOffsetEnd.x+S,this._focalOffsetEnd.y+C,this._focalOffsetEnd.z,!0):this.truck(S,C,!0)},this._rotateInternal=(g,_)=>{const b=zn*this.azimuthRotateSpeed*g/this._elementRect.height,T=zn*this.polarRotateSpeed*_/this._elementRect.height;this.rotate(b,T,!0)},this._dollyInternal=(g,_,b)=>{const T=Math.pow(.95,-g*this.dollySpeed),S=this._sphericalEnd.radius,C=this._sphericalEnd.radius*T,w=gs(C,this.minDistance,this.maxDistance),R=w-C;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(C,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(R,!0),this._dollyToNoClamp(w,!0)):this._dollyToNoClamp(w,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?C:w)-S,this._dollyControlCoord.set(_,b)),this._lastDollyDirection=Math.sign(-g)},this._zoomInternal=(g,_,b)=>{const T=Math.pow(.95,g*this.dollySpeed),S=this._zoom,C=this._zoom*T;this.zoomTo(C,!0),this.dollyToCursor&&(this._changedZoom+=C-S,this._dollyControlCoord.set(_,b))},typeof ee>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new ee.Quaternion().setFromUnitVectors(this._camera.up,_o),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=D.NONE,this._target=new ee.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new ee.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new ee.Spherical().setFromVector3(le.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new ee.Vector3,new ee.Vector3,new ee.Vector3,new ee.Vector3],this._updateNearPlaneCorners(),this._boundary=new ee.Box3(new ee.Vector3(-1/0,-1/0,-1/0),new ee.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new ee.Vector2,this.mouseButtons={left:D.ROTATE,middle:D.DOLLY,right:D.TRUCK,wheel:Yi(this._camera)?D.DOLLY:bi(this._camera)?D.ZOOM:D.NONE},this.touches={one:D.TOUCH_ROTATE,two:Yi(this._camera)?D.TOUCH_DOLLY_TRUCK:bi(this._camera)?D.TOUCH_ZOOM_TRUCK:D.NONE,three:D.TOUCH_TRUCK};const s=new ee.Vector2,i=new ee.Vector2,n=new ee.Vector2,r=g=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const T=this._domElement.getBoundingClientRect(),S=g.clientX/T.width,C=g.clientY/T.height;if(S<this._interactiveArea.left||S>this._interactiveArea.right||C<this._interactiveArea.top||C>this._interactiveArea.bottom)return}const _=g.pointerType!=="mouse"?null:(g.buttons&We.LEFT)===We.LEFT?We.LEFT:(g.buttons&We.MIDDLE)===We.MIDDLE?We.MIDDLE:(g.buttons&We.RIGHT)===We.RIGHT?We.RIGHT:null;if(_!==null){const T=this._findPointerByMouseButton(_);T&&this._disposePointer(T)}if((g.buttons&We.LEFT)===We.LEFT&&this._lockedPointer)return;const b={pointerId:g.pointerId,clientX:g.clientX,clientY:g.clientY,deltaX:0,deltaY:0,mouseButton:_};this._activePointers.push(b),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.ownerDocument.addEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",l),this._isDragging=!0,d(g)},o=g=>{g.cancelable&&g.preventDefault();const _=g.pointerId,b=this._lockedPointer||this._findPointerById(_);if(b){if(b.clientX=g.clientX,b.clientY=g.clientY,b.deltaX=g.movementX,b.deltaY=g.movementY,this._state=0,g.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(g.buttons&We.LEFT)===We.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(g.buttons&We.MIDDLE)===We.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(g.buttons&We.RIGHT)===We.RIGHT&&(this._state=this._state|this.mouseButtons.right);p()}},l=g=>{const _=this._findPointerById(g.pointerId);if(!(_&&_===this._lockedPointer)){if(_&&this._disposePointer(_),g.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=D.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=D.NONE;f()}};let c=-1;const h=g=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===D.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const C=this._domElement.getBoundingClientRect(),w=g.clientX/C.width,R=g.clientY/C.height;if(w<this._interactiveArea.left||w>this._interactiveArea.right||R<this._interactiveArea.top||R>this._interactiveArea.bottom)return}if(g.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===D.ROTATE||this.mouseButtons.wheel===D.TRUCK){const C=performance.now();c-C<1e3&&this._getClientRect(this._elementRect),c=C}const _=JR?-1:-3,b=g.deltaMode===1||g.ctrlKey?g.deltaY/_:g.deltaY/(_*10),T=this.dollyToCursor?(g.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,S=this.dollyToCursor?(g.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case D.ROTATE:{this._rotateInternal(g.deltaX,g.deltaY),this._isUserControllingRotate=!0;break}case D.TRUCK:{this._truckInternal(g.deltaX,g.deltaY,!1,!1),this._isUserControllingTruck=!0;break}case D.SCREEN_PAN:{this._truckInternal(g.deltaX,g.deltaY,!1,!0),this._isUserControllingTruck=!0;break}case D.OFFSET:{this._truckInternal(g.deltaX,g.deltaY,!0,!1),this._isUserControllingOffset=!0;break}case D.DOLLY:{this._dollyInternal(-b,T,S),this._isUserControllingDolly=!0;break}case D.ZOOM:{this._zoomInternal(-b,T,S),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},u=g=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===Ds.ACTION.NONE){const _=g instanceof PointerEvent?g.pointerId:0,b=this._findPointerById(_);b&&this._disposePointer(b),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l);return}g.preventDefault()}},d=g=>{if(!this._enabled)return;if(Xc(this._activePointers,It),this._getClientRect(this._elementRect),s.copy(It),i.copy(It),this._activePointers.length>=2){const b=It.x-this._activePointers[1].clientX,T=It.y-this._activePointers[1].clientY,S=Math.sqrt(b*b+T*T);n.set(0,S);const C=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,w=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(C,w)}if(this._state=0,!g)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in g&&g.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(g.buttons&We.LEFT)===We.LEFT&&(this._state=this._state|this.mouseButtons.left),(g.buttons&We.MIDDLE)===We.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(g.buttons&We.RIGHT)===We.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&D.ROTATE)===D.ROTATE||(this._state&D.TOUCH_ROTATE)===D.TOUCH_ROTATE||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&D.TRUCK)===D.TRUCK||(this._state&D.SCREEN_PAN)===D.SCREEN_PAN||(this._state&D.TOUCH_TRUCK)===D.TOUCH_TRUCK||(this._state&D.TOUCH_SCREEN_PAN)===D.TOUCH_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&D.DOLLY)===D.DOLLY||(this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&D.ZOOM)===D.ZOOM||(this._state&D.TOUCH_ZOOM)===D.TOUCH_ZOOM||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&D.OFFSET)===D.OFFSET||(this._state&D.TOUCH_OFFSET)===D.TOUCH_OFFSET||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},p=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Xc(this._activePointers,It);const _=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,b=_?-_.deltaX:i.x-It.x,T=_?-_.deltaY:i.y-It.y;if(i.copy(It),((this._state&D.ROTATE)===D.ROTATE||(this._state&D.TOUCH_ROTATE)===D.TOUCH_ROTATE||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(b,T),this._isUserControllingRotate=!0),(this._state&D.DOLLY)===D.DOLLY||(this._state&D.ZOOM)===D.ZOOM){const S=this.dollyToCursor?(s.x-this._elementRect.x)/this._elementRect.width*2-1:0,C=this.dollyToCursor?(s.y-this._elementRect.y)/this._elementRect.height*-2+1:0,w=this.dollyDragInverted?-1:1;(this._state&D.DOLLY)===D.DOLLY?(this._dollyInternal(w*T*xo,S,C),this._isUserControllingDolly=!0):(this._zoomInternal(w*T*xo,S,C),this._isUserControllingZoom=!0)}if((this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_ZOOM)===D.TOUCH_ZOOM||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE){const S=It.x-this._activePointers[1].clientX,C=It.y-this._activePointers[1].clientY,w=Math.sqrt(S*S+C*C),R=n.y-w;n.set(0,w);const P=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,z=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET?(this._dollyInternal(R*xo,P,z),this._isUserControllingDolly=!0):(this._zoomInternal(R*xo,P,z),this._isUserControllingZoom=!0)}((this._state&D.TRUCK)===D.TRUCK||(this._state&D.TOUCH_TRUCK)===D.TOUCH_TRUCK||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(b,T,!1,!1),this._isUserControllingTruck=!0),((this._state&D.SCREEN_PAN)===D.SCREEN_PAN||(this._state&D.TOUCH_SCREEN_PAN)===D.TOUCH_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN)&&(this._truckInternal(b,T,!1,!0),this._isUserControllingTruck=!0),((this._state&D.OFFSET)===D.OFFSET||(this._state&D.TOUCH_OFFSET)===D.TOUCH_OFFSET||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(b,T,!0,!1),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},f=()=>{Xc(this._activePointers,It),i.copy(It),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",m),this._domElement.ownerDocument.addEventListener("pointerlockerror",y),this._domElement.ownerDocument.addEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",l),d())},this.unlockPointer=()=>{var g,_,b;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(g=this._domElement)===null||g===void 0||g.ownerDocument.exitPointerLock(),(_=this._domElement)===null||_===void 0||_.ownerDocument.removeEventListener("pointerlockchange",m),(b=this._domElement)===null||b===void 0||b.ownerDocument.removeEventListener("pointerlockerror",y),this.cancel()};const m=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},y=()=>{this.unlockPointer()};this._addAllEventListeners=g=>{this._domElement=g,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",r),this._domElement.addEventListener("pointercancel",l),this._domElement.addEventListener("wheel",h,{passive:!1}),this._domElement.addEventListener("contextmenu",u)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",r),this._domElement.removeEventListener("pointercancel",l),this._domElement.removeEventListener("wheel",h,{passive:!1}),this._domElement.removeEventListener("contextmenu",u),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.ownerDocument.removeEventListener("pointerlockchange",m),this._domElement.ownerDocument.removeEventListener("pointerlockerror",y))},this.cancel=()=>{this._state!==D.NONE&&(this._state=D.NONE,this._activePointers.length=0,f())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._domElement&&(e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}set interactiveArea(e){this._interactiveArea.width=gs(e.width,0,1),this._interactiveArea.height=gs(e.height,0,1),this._interactiveArea.x=gs(e.x,0,1-this._interactiveArea.width),this._interactiveArea.y=gs(e.y,0,1-this._interactiveArea.height)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}rotate(e,t,s=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+t,s)}rotateAzimuthTo(e,t=!1){return this.rotateTo(e,this._sphericalEnd.phi,t)}rotatePolarTo(e,t=!1){return this.rotateTo(this._sphericalEnd.theta,e,t)}rotateTo(e,t,s=!1){this._isUserControllingRotate=!1;const i=gs(e,this.minAzimuthAngle,this.maxAzimuthAngle),n=gs(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=n,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,s||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const r=!s||Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(r)}dolly(e,t=!1){return this.dollyTo(this._sphericalEnd.radius-e,t)}dollyTo(e,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0,this._dollyToNoClamp(gs(e,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(e,t=!1){const s=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const r=this._collisionTest(),o=Ae(r,this._spherical.radius);if(!(s>e)&&o)return Promise.resolve();this._sphericalEnd.radius=Math.min(e,r)}else this._sphericalEnd.radius=e;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const n=!t||Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(n)}dollyInFixed(e,t=!1){this._targetEnd.add(this._getCameraDirection($r).multiplyScalar(e)),t||this._target.copy(this._targetEnd);const s=!t||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}zoom(e,t=!1){return this.zoomTo(this._zoomEnd+e,t)}zoomTo(e,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=gs(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const s=!t||Ae(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(s)}pan(e,t,s=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,t,s)}truck(e,t,s=!1){this._camera.updateMatrix(),Ms.setFromMatrixColumn(this._camera.matrix,0),As.setFromMatrixColumn(this._camera.matrix,1),Ms.multiplyScalar(e),As.multiplyScalar(-t);const i=le.copy(Ms).add(As),n=Te.copy(this._targetEnd).add(i);return this.moveTo(n.x,n.y,n.z,s)}forward(e,t=!1){le.setFromMatrixColumn(this._camera.matrix,0),le.crossVectors(this._camera.up,le),le.multiplyScalar(e);const s=Te.copy(this._targetEnd).add(le);return this.moveTo(s.x,s.y,s.z,t)}elevate(e,t=!1){return le.copy(this._camera.up).multiplyScalar(e),this.moveTo(this._targetEnd.x+le.x,this._targetEnd.y+le.y,this._targetEnd.z+le.z,t)}moveTo(e,t,s,i=!1){this._isUserControllingTruck=!1;const n=le.set(e,t,s).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,n,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const r=!i||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(r)}lookInDirectionOf(e,t,s,i=!1){const o=le.set(e,t,s).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(o.x,o.y,o.z,i)}fitToBox(e,t,{cover:s=!1,paddingLeft:i=0,paddingRight:n=0,paddingBottom:r=0,paddingTop:o=0}={}){const l=[],c=e.isBox3?Vn.copy(e):Vn.setFromObject(e);c.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const h=Bf(this._sphericalEnd.theta,Of),u=Bf(this._sphericalEnd.phi,Of);l.push(this.rotateTo(h,u,t));const d=le.setFromSpherical(this._sphericalEnd).normalize(),p=Gf.setFromUnitVectors(d,Kc),f=Ae(Math.abs(d.y),1);f&&p.multiply(eh.setFromAxisAngle(_o,h)),p.multiply(this._yAxisUpSpaceInverse);const m=zf.makeEmpty();Te.copy(c.min).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setX(c.max.x).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setY(c.max.y).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setZ(c.min.z).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setZ(c.max.z).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setY(c.min.y).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setX(c.min.x).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).applyQuaternion(p),m.expandByPoint(Te),m.min.x-=i,m.min.y-=r,m.max.x+=n,m.max.y+=o,p.setFromUnitVectors(Kc,d),f&&p.premultiply(eh.invert()),p.premultiply(this._yAxisUpSpace);const y=m.getSize(le),g=m.getCenter(Te).applyQuaternion(p);if(Yi(this._camera)){const _=this.getDistanceToFitBox(y.x,y.y,y.z,s);l.push(this.moveTo(g.x,g.y,g.z,t)),l.push(this.dollyTo(_,t)),l.push(this.setFocalOffset(0,0,0,t))}else if(bi(this._camera)){const _=this._camera,b=_.right-_.left,T=_.top-_.bottom,S=s?Math.max(b/y.x,T/y.y):Math.min(b/y.x,T/y.y);l.push(this.moveTo(g.x,g.y,g.z,t)),l.push(this.zoomTo(S,t)),l.push(this.setFocalOffset(0,0,0,t))}return Promise.all(l)}fitToSphere(e,t){const s=[],n="isObject3D"in e?Ds.createBoundingSphere(e,Jc):Jc.copy(e);if(s.push(this.moveTo(n.center.x,n.center.y,n.center.z,t)),Yi(this._camera)){const r=this.getDistanceToFitSphere(n.radius);s.push(this.dollyTo(r,t))}else if(bi(this._camera)){const r=this._camera.right-this._camera.left,o=this._camera.top-this._camera.bottom,l=2*n.radius,c=Math.min(r/l,o/l);s.push(this.zoomTo(c,t))}return s.push(this.setFocalOffset(0,0,0,t)),Promise.all(s)}setLookAt(e,t,s,i,n,r,o=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0;const l=Te.set(i,n,r),c=le.set(e,t,s);this._targetEnd.copy(l),this._sphericalEnd.setFromVector3(c.sub(l).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,o||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const h=!o||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold)&&Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(h)}lerpLookAt(e,t,s,i,n,r,o,l,c,h,u,d,p,f=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0;const m=le.set(i,n,r),y=Te.set(e,t,s);es.setFromVector3(y.sub(m).applyQuaternion(this._yAxisUpSpace));const g=Gn.set(h,u,d),_=Te.set(o,l,c);jr.setFromVector3(_.sub(g).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(m.lerp(g,p));const b=jr.theta-es.theta,T=jr.phi-es.phi,S=jr.radius-es.radius;this._sphericalEnd.set(es.radius+S*p,es.phi+T*p,es.theta+b*p),this.normalizeRotations(),this._needsUpdate=!0,f||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const C=!f||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold)&&Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(C)}setPosition(e,t,s,i=!1){return this.setLookAt(e,t,s,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(e,t,s,i=!1){const n=this.getPosition(le),r=this.setLookAt(n.x,n.y,n.z,e,t,s,i);return this._sphericalEnd.phi=gs(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),r}setFocalOffset(e,t,s,i=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(e,t,s),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd);const n=!i||Ae(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&Ae(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&Ae(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(n)}setOrbitPoint(e,t,s){this._camera.updateMatrixWorld(),Ms.setFromMatrixColumn(this._camera.matrixWorldInverse,0),As.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Xi.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=le.set(e,t,s),n=i.distanceTo(this._camera.position),r=i.sub(this._camera.position);Ms.multiplyScalar(r.x),As.multiplyScalar(r.y),Xi.multiplyScalar(r.z),le.copy(Ms).add(As).add(Xi),le.z=le.z+n,this.dollyTo(n,!1),this.setFocalOffset(-le.x,le.y,-le.z,!1),this.moveTo(e,t,s,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,t,s,i){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new ee.Vector4,typeof e=="number"?this._viewport.set(e,t,s,i):this._viewport.copy(e)}getDistanceToFitBox(e,t,s,i=!1){if(Zc(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const n=e/t,r=this._camera.getEffectiveFOV()*Vr,o=this._camera.aspect;return((i?n>o:n<o)?t:e/o)*.5/Math.tan(r*.5)+s*.5}getDistanceToFitSphere(e){if(Zc(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*Vr,s=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,i=1<this._camera.aspect?t:s;return e/Math.sin(i*.5)}getTarget(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).copy(t?this._targetEnd:this._target)}getPosition(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(e,t=!0){return(e||new ee.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%zn,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=zn),this._spherical.theta+=zn*Math.round((this._sphericalEnd.theta-this._spherical.theta)/zn)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(e=!1){if(!Ae(this._camera.up.x,this._cameraUp0.x)||!Ae(this._camera.up.y,this._cameraUp0.y)||!Ae(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const s=this.getPosition(le);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,e),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,e),this.zoomTo(this._zoom0,e)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,_o),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const e=le.subVectors(this._target,this._camera.position).normalize(),t=Te.crossVectors(e,this._camera.up);this._camera.up.crossVectors(t,e).normalize(),this._camera.updateMatrixWorld();const s=this.getPosition(le);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}update(e){const t=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,i=this._sphericalEnd.radius-this._spherical.radius,n=Uf.subVectors(this._targetEnd,this._target),r=kf.subVectors(this._focalOffsetEnd,this._focalOffset),o=this._zoomEnd-this._zoom;if(Ie(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const u=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=yo(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,u,1/0,e),this._needsUpdate=!0}if(Ie(s))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const u=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=yo(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,u,1/0,e),this._needsUpdate=!0}if(Ie(i))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const u=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=yo(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,u,this.maxSpeed,e),this._needsUpdate=!0}if(Ie(n.x)&&Ie(n.y)&&Ie(n.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const u=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;If(this._target,this._targetEnd,this._targetVelocity,u,this.maxSpeed,e,this._target),this._needsUpdate=!0}if(Ie(r.x)&&Ie(r.y)&&Ie(r.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const u=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;If(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,u,this.maxSpeed,e,this._focalOffset),this._needsUpdate=!0}if(Ie(o))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const u=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=yo(this._zoom,this._zoomEnd,this._zoomVelocity,u,1/0,e)}if(this.dollyToCursor){if(Yi(this._camera)&&this._changedDolly!==0){const u=this._spherical.radius-this._lastDistance,d=this._camera,p=this._getCameraDirection($r),f=le.copy(p).cross(d.up).normalize();f.lengthSq()===0&&(f.x=1);const m=Te.crossVectors(f,p),y=this._sphericalEnd.radius*Math.tan(d.getEffectiveFOV()*Vr*.5),_=(this._sphericalEnd.radius-u-this._sphericalEnd.radius)/this._sphericalEnd.radius,b=Gn.copy(this._targetEnd).add(f.multiplyScalar(this._dollyControlCoord.x*y*d.aspect)).add(m.multiplyScalar(this._dollyControlCoord.y*y)),T=le.copy(this._targetEnd).lerp(b,_),S=this._lastDollyDirection===kn.IN&&this._spherical.radius<=this.minDistance,C=this._lastDollyDirection===kn.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(S||C)){this._sphericalEnd.radius-=u,this._spherical.radius-=u;const R=Te.copy(p).multiplyScalar(-u);T.add(R)}this._boundary.clampPoint(T,T);const w=Te.subVectors(T,this._targetEnd);this._targetEnd.copy(T),this._target.add(w),this._changedDolly-=u,Ie(this._changedDolly)&&(this._changedDolly=0)}else if(bi(this._camera)&&this._changedZoom!==0){const u=this._zoom-this._lastZoom,d=this._camera,p=le.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(d.near+d.far)/(d.near-d.far)).unproject(d),f=Te.set(0,0,-1).applyQuaternion(d.quaternion),m=Gn.copy(p).add(f.multiplyScalar(-p.dot(d.up))),g=-(this._zoom-u-this._zoom)/this._zoom,_=this._getCameraDirection($r),b=this._targetEnd.dot(_),T=le.copy(this._targetEnd).lerp(m,g),S=T.dot(_),C=_.multiplyScalar(S-b);T.sub(C),this._boundary.clampPoint(T,T);const w=Te.subVectors(T,this._targetEnd);this._targetEnd.copy(T),this._target.add(w),this._changedZoom-=u,Ie(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const l=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,l),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!Ie(this._focalOffset.x)||!Ie(this._focalOffset.y)||!Ie(this._focalOffset.z))&&(Ms.setFromMatrixColumn(this._camera.matrix,0),As.setFromMatrixColumn(this._camera.matrix,1),Xi.setFromMatrixColumn(this._camera.matrix,2),Ms.multiplyScalar(this._focalOffset.x),As.multiplyScalar(-this._focalOffset.y),Xi.multiplyScalar(this._focalOffset.z),le.copy(Ms).add(As).add(Xi),this._camera.position.add(le),this._camera.updateMatrixWorld()),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),le.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const h=this._needsUpdate;return h&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):h?(this.dispatchEvent({type:"update"}),Ie(t,this.restThreshold)&&Ie(s,this.restThreshold)&&Ie(i,this.restThreshold)&&Ie(n.x,this.restThreshold)&&Ie(n.y,this.restThreshold)&&Ie(n.z,this.restThreshold)&&Ie(r.x,this.restThreshold)&&Ie(r.y,this.restThreshold)&&Ie(r.z,this.restThreshold)&&Ie(o,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!h&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=h,this._needsUpdate=!1,h}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:Hr(this.maxDistance),minZoom:this.minZoom,maxZoom:Hr(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:Hr(this.maxPolarAngle),minAzimuthAngle:Hr(this.minAzimuthAngle),maxAzimuthAngle:Hr(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,target:this._targetEnd.toArray(),position:le.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(e,t=!1){const s=JSON.parse(e);this.enabled=s.enabled,this.minDistance=s.minDistance,this.maxDistance=Wr(s.maxDistance),this.minZoom=s.minZoom,this.maxZoom=Wr(s.maxZoom),this.minPolarAngle=s.minPolarAngle,this.maxPolarAngle=Wr(s.maxPolarAngle),this.minAzimuthAngle=Wr(s.minAzimuthAngle),this.maxAzimuthAngle=Wr(s.maxAzimuthAngle),this.smoothTime=s.smoothTime,this.draggingSmoothTime=s.draggingSmoothTime,this.dollySpeed=s.dollySpeed,this.truckSpeed=s.truckSpeed,this.dollyToCursor=s.dollyToCursor,this._target0.fromArray(s.target0),this._position0.fromArray(s.position0),this._zoom0=s.zoom0,this._focalOffset0.fromArray(s.focalOffset0),this.moveTo(s.target[0],s.target[1],s.target[2],t),es.setFromVector3(le.fromArray(s.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(es.theta,es.phi,t),this.dollyTo(es.radius,t),this.zoomTo(s.zoom,t),this.setFocalOffset(s.focalOffset[0],s.focalOffset[1],s.focalOffset[2],t),this._needsUpdate=!0}connect(e){if(this._domElement){console.warn("camera-controls is already connected.");return}e.setAttribute("data-camera-controls-version",KR),this._addAllEventListeners(e),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(e){return e.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(e){return this._getTargetDirection(e).negate()}_findPointerById(e){return this._activePointers.find(t=>t.pointerId===e)}_findPointerByMouseButton(e){return this._activePointers.find(t=>t.mouseButton===e)}_disposePointer(e){this._activePointers.splice(this._activePointers.indexOf(e),1)}_encloseToBoundary(e,t,s){const i=t.lengthSq();if(i===0)return e;const n=Te.copy(t).add(e),o=this._boundary.clampPoint(n,Gn).sub(n),l=o.lengthSq();if(l===0)return e.add(t);if(l===i)return e;if(s===0)return e.add(t).add(o);{const c=1+s*l/t.dot(o);return e.add(Te.copy(t).multiplyScalar(c)).add(o.multiplyScalar(1-s))}}_updateNearPlaneCorners(){if(Yi(this._camera)){const e=this._camera,t=e.near,s=e.getEffectiveFOV()*Vr,i=Math.tan(s*.5)*t,n=i*e.aspect;this._nearPlaneCorners[0].set(-n,-i,0),this._nearPlaneCorners[1].set(n,-i,0),this._nearPlaneCorners[2].set(n,i,0),this._nearPlaneCorners[3].set(-n,i,0)}else if(bi(this._camera)){const e=this._camera,t=1/e.zoom,s=e.left*t,i=e.right*t,n=e.top*t,r=e.bottom*t;this._nearPlaneCorners[0].set(s,n,0),this._nearPlaneCorners[1].set(i,n,0),this._nearPlaneCorners[2].set(i,r,0),this._nearPlaneCorners[3].set(s,r,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||Zc(this._camera,"_collisionTest"))return e;const s=this._getTargetDirection($r);th.lookAt(Lf,s,this._camera.up);for(let i=0;i<4;i++){const n=Te.copy(this._nearPlaneCorners[i]);n.applyMatrix4(th);const r=Gn.addVectors(this._target,n);bo.set(r,s),bo.far=this._spherical.radius+1;const o=bo.intersectObjects(this.colliderMeshes);o.length!==0&&o[0].distance<e&&(e=o[0].distance)}return e}_getClientRect(e){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return e.x=t.left,e.y=t.top,this._viewport?(e.x+=this._viewport.x,e.y+=t.height-this._viewport.w-this._viewport.y,e.width=this._viewport.z,e.height=this._viewport.w):(e.width=t.width,e.height=t.height),e}_createOnRestPromise(e){return e?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const s=()=>{this.removeEventListener("rest",s),t()};this.addEventListener("rest",s)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(e){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(e){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(e,t=new ee.Sphere){const s=t,i=s.center;Vn.makeEmpty(),e.traverseVisible(r=>{r.isMesh&&Vn.expandByObject(r)}),Vn.getCenter(i);let n=0;return e.traverseVisible(r=>{if(!r.isMesh)return;const o=r;if(!o.geometry)return;const l=o.geometry.clone();l.applyMatrix4(o.matrixWorld);const h=l.attributes.position;for(let u=0,d=h.count;u<d;u++)le.fromBufferAttribute(h,u),n=Math.max(n,i.distanceToSquared(le))}),s.radius=Math.sqrt(n),s}}const al=a=>{const[e,t]=W.useState(a.options[a.index]),s=()=>{a.onToggle(!a.open)},i=n=>{n!==e&&(a.onSelect(n),t(n)),a.onToggle(!1)};return M.jsxs("div",{className:`dropdown ${a.up===!0?"up":""}`,children:[M.jsx("div",{className:"dropdown-toggle",onClick:s,children:`${a.title}: ${e}`}),a.open&&M.jsx("ul",{className:"dropdown-menu",children:a.options.map(n=>M.jsx("li",{onClick:()=>i(n),children:n},n))})]})},Zi=W.forwardRef(function(e,t){const s=["Renderer","Depth","Normals","UVs","Wireframe"],[i,n]=W.useState("Renderer"),[r,o]=W.useState(!1),[l,c]=W.useState(!1),[h,u]=W.useState(!1);return M.jsxs("div",{className:`CameraWindow ${e.name}`,children:[M.jsx("div",{ref:t,className:"clickable",onClick:()=>{h&&u(!1)}}),M.jsxs("div",{className:"options",children:[e.camera!==null&&M.jsx(al,{title:"Camera",index:e.options.indexOf(e.camera.name),open:h,options:e.options,onSelect:e.onSelectCamera,onToggle:d=>{d&&l&&c(!1),u(d)},up:!0}),M.jsx(al,{title:"Mode",index:s.indexOf(i),open:l,options:s,onSelect:d=>{if(d===i)return;const p=d;e.onSelectRenderMode(p),n(p)},onToggle:d=>{d&&h&&u(!1),r&&o(!1),c(d)},up:!0})]})]})}),eN=`out vec3 worldPosition;
485
+ */const We={LEFT:1,RIGHT:2,MIDDLE:4},D=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,SCREEN_PAN:4,OFFSET:8,DOLLY:16,ZOOM:32,TOUCH_ROTATE:64,TOUCH_TRUCK:128,TOUCH_SCREEN_PAN:256,TOUCH_OFFSET:512,TOUCH_DOLLY:1024,TOUCH_ZOOM:2048,TOUCH_DOLLY_TRUCK:4096,TOUCH_DOLLY_SCREEN_PAN:8192,TOUCH_DOLLY_OFFSET:16384,TOUCH_DOLLY_ROTATE:32768,TOUCH_ZOOM_TRUCK:65536,TOUCH_ZOOM_OFFSET:131072,TOUCH_ZOOM_SCREEN_PAN:262144,TOUCH_ZOOM_ROTATE:524288}),kn={NONE:0,IN:1,OUT:-1};function Yi(a){return a.isPerspectiveCamera}function bi(a){return a.isOrthographicCamera}const zn=Math.PI*2,Of=Math.PI/2,Ly=1e-5,Vr=Math.PI/180;function gs(a,e,t){return Math.max(e,Math.min(t,a))}function Ie(a,e=Ly){return Math.abs(a)<e}function Ae(a,e,t=Ly){return Ie(a-e,t)}function Bf(a,e){return Math.round(a/e)*e}function Hr(a){return isFinite(a)?a:a<0?-Number.MAX_VALUE:Number.MAX_VALUE}function Wr(a){return Math.abs(a)<Number.MAX_VALUE?a:a*(1/0)}function yo(a,e,t,s,i=1/0,n){s=Math.max(1e-4,s);const r=2/s,o=r*n,l=1/(1+o+.48*o*o+.235*o*o*o);let c=a-e;const h=e,u=i*s;c=gs(c,-u,u),e=a-c;const d=(t.value+r*c)*n;t.value=(t.value-r*d)*l;let p=e+(c+d)*l;return h-a>0==p>h&&(p=h,t.value=(p-h)/n),p}function If(a,e,t,s,i=1/0,n,r){s=Math.max(1e-4,s);const o=2/s,l=o*n,c=1/(1+l+.48*l*l+.235*l*l*l);let h=e.x,u=e.y,d=e.z,p=a.x-h,f=a.y-u,m=a.z-d;const y=h,g=u,_=d,b=i*s,T=b*b,S=p*p+f*f+m*m;if(S>T){const Q=Math.sqrt(S);p=p/Q*b,f=f/Q*b,m=m/Q*b}h=a.x-p,u=a.y-f,d=a.z-m;const C=(t.x+o*p)*n,w=(t.y+o*f)*n,R=(t.z+o*m)*n;t.x=(t.x-o*C)*c,t.y=(t.y-o*w)*c,t.z=(t.z-o*R)*c,r.x=h+(p+C)*c,r.y=u+(f+w)*c,r.z=d+(m+R)*c;const P=y-a.x,z=g-a.y,$=_-a.z,q=r.x-y,j=r.y-g,Z=r.z-_;return P*q+z*j+$*Z>0&&(r.x=y,r.y=g,r.z=_,t.x=(r.x-y)/n,t.y=(r.y-g)/n,t.z=(r.z-_)/n),r}function Xc(a,e){e.set(0,0),a.forEach(t=>{e.x+=t.clientX,e.y+=t.clientY}),e.x/=a.length,e.y/=a.length}function Zc(a,e){return bi(a)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}class QR{constructor(){this._listeners={}}addEventListener(e,t){const s=this._listeners;s[e]===void 0&&(s[e]=[]),s[e].indexOf(t)===-1&&s[e].push(t)}hasEventListener(e,t){const s=this._listeners;return s[e]!==void 0&&s[e].indexOf(t)!==-1}removeEventListener(e,t){const i=this._listeners[e];if(i!==void 0){const n=i.indexOf(t);n!==-1&&i.splice(n,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const s=this._listeners[e.type];if(s!==void 0){e.target=this;const i=s.slice(0);for(let n=0,r=i.length;n<r;n++)i[n].call(this,e)}}}var Qc;const KR="2.10.1",xo=1/8,JR=/Mac/.test((Qc=globalThis?.navigator)===null||Qc===void 0?void 0:Qc.platform);let ee,Lf,_o,Kc,It,le,Te,Gn,$r,Ms,As,Xi,Uf,kf,es,jr,Vn,zf,Jc,Gf,eh,th,bo;class Ds extends QR{static install(e){ee=e.THREE,Lf=Object.freeze(new ee.Vector3(0,0,0)),_o=Object.freeze(new ee.Vector3(0,1,0)),Kc=Object.freeze(new ee.Vector3(0,0,1)),It=new ee.Vector2,le=new ee.Vector3,Te=new ee.Vector3,Gn=new ee.Vector3,$r=new ee.Vector3,Ms=new ee.Vector3,As=new ee.Vector3,Xi=new ee.Vector3,Uf=new ee.Vector3,kf=new ee.Vector3,es=new ee.Spherical,jr=new ee.Spherical,Vn=new ee.Box3,zf=new ee.Box3,Jc=new ee.Sphere,Gf=new ee.Quaternion,eh=new ee.Quaternion,th=new ee.Matrix4,bo=new ee.Raycaster}static get ACTION(){return D}set verticalDragToForward(e){console.warn("camera-controls: `verticalDragToForward` was removed. Use `mouseButtons.left = CameraControls.ACTION.SCREEN_PAN` instead.")}constructor(e,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=D.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=kn.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new ee.Vector3,this._focalOffsetVelocity=new ee.Vector3,this._zoomVelocity={value:0},this._truckInternal=(g,_,b,T)=>{let S,C;if(Yi(this._camera)){const w=le.copy(this._camera.position).sub(this._target),R=this._camera.getEffectiveFOV()*Vr,P=w.length()*Math.tan(R*.5);S=this.truckSpeed*g*P/this._elementRect.height,C=this.truckSpeed*_*P/this._elementRect.height}else if(bi(this._camera)){const w=this._camera;S=this.truckSpeed*g*(w.right-w.left)/w.zoom/this._elementRect.width,C=this.truckSpeed*_*(w.top-w.bottom)/w.zoom/this._elementRect.height}else return;T?(b?this.setFocalOffset(this._focalOffsetEnd.x+S,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(S,0,!0),this.forward(-C,!0)):b?this.setFocalOffset(this._focalOffsetEnd.x+S,this._focalOffsetEnd.y+C,this._focalOffsetEnd.z,!0):this.truck(S,C,!0)},this._rotateInternal=(g,_)=>{const b=zn*this.azimuthRotateSpeed*g/this._elementRect.height,T=zn*this.polarRotateSpeed*_/this._elementRect.height;this.rotate(b,T,!0)},this._dollyInternal=(g,_,b)=>{const T=Math.pow(.95,-g*this.dollySpeed),S=this._sphericalEnd.radius,C=this._sphericalEnd.radius*T,w=gs(C,this.minDistance,this.maxDistance),R=w-C;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(C,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(R,!0),this._dollyToNoClamp(w,!0)):this._dollyToNoClamp(w,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?C:w)-S,this._dollyControlCoord.set(_,b)),this._lastDollyDirection=Math.sign(-g)},this._zoomInternal=(g,_,b)=>{const T=Math.pow(.95,g*this.dollySpeed),S=this._zoom,C=this._zoom*T;this.zoomTo(C,!0),this.dollyToCursor&&(this._changedZoom+=C-S,this._dollyControlCoord.set(_,b))},typeof ee>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new ee.Quaternion().setFromUnitVectors(this._camera.up,_o),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=D.NONE,this._target=new ee.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new ee.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new ee.Spherical().setFromVector3(le.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new ee.Vector3,new ee.Vector3,new ee.Vector3,new ee.Vector3],this._updateNearPlaneCorners(),this._boundary=new ee.Box3(new ee.Vector3(-1/0,-1/0,-1/0),new ee.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new ee.Vector2,this.mouseButtons={left:D.ROTATE,middle:D.DOLLY,right:D.TRUCK,wheel:Yi(this._camera)?D.DOLLY:bi(this._camera)?D.ZOOM:D.NONE},this.touches={one:D.TOUCH_ROTATE,two:Yi(this._camera)?D.TOUCH_DOLLY_TRUCK:bi(this._camera)?D.TOUCH_ZOOM_TRUCK:D.NONE,three:D.TOUCH_TRUCK};const s=new ee.Vector2,i=new ee.Vector2,n=new ee.Vector2,r=g=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const T=this._domElement.getBoundingClientRect(),S=g.clientX/T.width,C=g.clientY/T.height;if(S<this._interactiveArea.left||S>this._interactiveArea.right||C<this._interactiveArea.top||C>this._interactiveArea.bottom)return}const _=g.pointerType!=="mouse"?null:(g.buttons&We.LEFT)===We.LEFT?We.LEFT:(g.buttons&We.MIDDLE)===We.MIDDLE?We.MIDDLE:(g.buttons&We.RIGHT)===We.RIGHT?We.RIGHT:null;if(_!==null){const T=this._findPointerByMouseButton(_);T&&this._disposePointer(T)}if((g.buttons&We.LEFT)===We.LEFT&&this._lockedPointer)return;const b={pointerId:g.pointerId,clientX:g.clientX,clientY:g.clientY,deltaX:0,deltaY:0,mouseButton:_};this._activePointers.push(b),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.ownerDocument.addEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",l),this._isDragging=!0,d(g)},o=g=>{g.cancelable&&g.preventDefault();const _=g.pointerId,b=this._lockedPointer||this._findPointerById(_);if(b){if(b.clientX=g.clientX,b.clientY=g.clientY,b.deltaX=g.movementX,b.deltaY=g.movementY,this._state=0,g.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(g.buttons&We.LEFT)===We.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(g.buttons&We.MIDDLE)===We.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(g.buttons&We.RIGHT)===We.RIGHT&&(this._state=this._state|this.mouseButtons.right);p()}},l=g=>{const _=this._findPointerById(g.pointerId);if(!(_&&_===this._lockedPointer)){if(_&&this._disposePointer(_),g.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=D.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=D.NONE;f()}};let c=-1;const h=g=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===D.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const C=this._domElement.getBoundingClientRect(),w=g.clientX/C.width,R=g.clientY/C.height;if(w<this._interactiveArea.left||w>this._interactiveArea.right||R<this._interactiveArea.top||R>this._interactiveArea.bottom)return}if(g.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===D.ROTATE||this.mouseButtons.wheel===D.TRUCK){const C=performance.now();c-C<1e3&&this._getClientRect(this._elementRect),c=C}const _=JR?-1:-3,b=g.deltaMode===1||g.ctrlKey?g.deltaY/_:g.deltaY/(_*10),T=this.dollyToCursor?(g.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,S=this.dollyToCursor?(g.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case D.ROTATE:{this._rotateInternal(g.deltaX,g.deltaY),this._isUserControllingRotate=!0;break}case D.TRUCK:{this._truckInternal(g.deltaX,g.deltaY,!1,!1),this._isUserControllingTruck=!0;break}case D.SCREEN_PAN:{this._truckInternal(g.deltaX,g.deltaY,!1,!0),this._isUserControllingTruck=!0;break}case D.OFFSET:{this._truckInternal(g.deltaX,g.deltaY,!0,!1),this._isUserControllingOffset=!0;break}case D.DOLLY:{this._dollyInternal(-b,T,S),this._isUserControllingDolly=!0;break}case D.ZOOM:{this._zoomInternal(-b,T,S),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},u=g=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===Ds.ACTION.NONE){const _=g instanceof PointerEvent?g.pointerId:0,b=this._findPointerById(_);b&&this._disposePointer(b),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l);return}g.preventDefault()}},d=g=>{if(!this._enabled)return;if(Xc(this._activePointers,It),this._getClientRect(this._elementRect),s.copy(It),i.copy(It),this._activePointers.length>=2){const b=It.x-this._activePointers[1].clientX,T=It.y-this._activePointers[1].clientY,S=Math.sqrt(b*b+T*T);n.set(0,S);const C=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,w=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;i.set(C,w)}if(this._state=0,!g)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in g&&g.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(g.buttons&We.LEFT)===We.LEFT&&(this._state=this._state|this.mouseButtons.left),(g.buttons&We.MIDDLE)===We.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(g.buttons&We.RIGHT)===We.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&D.ROTATE)===D.ROTATE||(this._state&D.TOUCH_ROTATE)===D.TOUCH_ROTATE||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&D.TRUCK)===D.TRUCK||(this._state&D.SCREEN_PAN)===D.SCREEN_PAN||(this._state&D.TOUCH_TRUCK)===D.TOUCH_TRUCK||(this._state&D.TOUCH_SCREEN_PAN)===D.TOUCH_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&D.DOLLY)===D.DOLLY||(this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&D.ZOOM)===D.ZOOM||(this._state&D.TOUCH_ZOOM)===D.TOUCH_ZOOM||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&D.OFFSET)===D.OFFSET||(this._state&D.TOUCH_OFFSET)===D.TOUCH_OFFSET||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},p=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,Xc(this._activePointers,It);const _=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,b=_?-_.deltaX:i.x-It.x,T=_?-_.deltaY:i.y-It.y;if(i.copy(It),((this._state&D.ROTATE)===D.ROTATE||(this._state&D.TOUCH_ROTATE)===D.TOUCH_ROTATE||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(b,T),this._isUserControllingRotate=!0),(this._state&D.DOLLY)===D.DOLLY||(this._state&D.ZOOM)===D.ZOOM){const S=this.dollyToCursor?(s.x-this._elementRect.x)/this._elementRect.width*2-1:0,C=this.dollyToCursor?(s.y-this._elementRect.y)/this._elementRect.height*-2+1:0,w=this.dollyDragInverted?-1:1;(this._state&D.DOLLY)===D.DOLLY?(this._dollyInternal(w*T*xo,S,C),this._isUserControllingDolly=!0):(this._zoomInternal(w*T*xo,S,C),this._isUserControllingZoom=!0)}if((this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_ZOOM)===D.TOUCH_ZOOM||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_ZOOM_ROTATE)===D.TOUCH_ZOOM_ROTATE){const S=It.x-this._activePointers[1].clientX,C=It.y-this._activePointers[1].clientY,w=Math.sqrt(S*S+C*C),R=n.y-w;n.set(0,w);const P=this.dollyToCursor?(i.x-this._elementRect.x)/this._elementRect.width*2-1:0,z=this.dollyToCursor?(i.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&D.TOUCH_DOLLY)===D.TOUCH_DOLLY||(this._state&D.TOUCH_DOLLY_ROTATE)===D.TOUCH_DOLLY_ROTATE||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET?(this._dollyInternal(R*xo,P,z),this._isUserControllingDolly=!0):(this._zoomInternal(R*xo,P,z),this._isUserControllingZoom=!0)}((this._state&D.TRUCK)===D.TRUCK||(this._state&D.TOUCH_TRUCK)===D.TOUCH_TRUCK||(this._state&D.TOUCH_DOLLY_TRUCK)===D.TOUCH_DOLLY_TRUCK||(this._state&D.TOUCH_ZOOM_TRUCK)===D.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(b,T,!1,!1),this._isUserControllingTruck=!0),((this._state&D.SCREEN_PAN)===D.SCREEN_PAN||(this._state&D.TOUCH_SCREEN_PAN)===D.TOUCH_SCREEN_PAN||(this._state&D.TOUCH_DOLLY_SCREEN_PAN)===D.TOUCH_DOLLY_SCREEN_PAN||(this._state&D.TOUCH_ZOOM_SCREEN_PAN)===D.TOUCH_ZOOM_SCREEN_PAN)&&(this._truckInternal(b,T,!1,!0),this._isUserControllingTruck=!0),((this._state&D.OFFSET)===D.OFFSET||(this._state&D.TOUCH_OFFSET)===D.TOUCH_OFFSET||(this._state&D.TOUCH_DOLLY_OFFSET)===D.TOUCH_DOLLY_OFFSET||(this._state&D.TOUCH_ZOOM_OFFSET)===D.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(b,T,!0,!1),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},f=()=>{Xc(this._activePointers,It),i.copy(It),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",m),this._domElement.ownerDocument.addEventListener("pointerlockerror",y),this._domElement.ownerDocument.addEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",l),d())},this.unlockPointer=()=>{var g,_,b;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(g=this._domElement)===null||g===void 0||g.ownerDocument.exitPointerLock(),(_=this._domElement)===null||_===void 0||_.ownerDocument.removeEventListener("pointerlockchange",m),(b=this._domElement)===null||b===void 0||b.ownerDocument.removeEventListener("pointerlockerror",y),this.cancel()};const m=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},y=()=>{this.unlockPointer()};this._addAllEventListeners=g=>{this._domElement=g,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",r),this._domElement.addEventListener("pointercancel",l),this._domElement.addEventListener("wheel",h,{passive:!1}),this._domElement.addEventListener("contextmenu",u)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",r),this._domElement.removeEventListener("pointercancel",l),this._domElement.removeEventListener("wheel",h,{passive:!1}),this._domElement.removeEventListener("contextmenu",u),this._domElement.ownerDocument.removeEventListener("pointermove",o,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",l),this._domElement.ownerDocument.removeEventListener("pointerlockchange",m),this._domElement.ownerDocument.removeEventListener("pointerlockerror",y))},this.cancel=()=>{this._state!==D.NONE&&(this._state=D.NONE,this._activePointers.length=0,f())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._domElement&&(e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}set interactiveArea(e){this._interactiveArea.width=gs(e.width,0,1),this._interactiveArea.height=gs(e.height,0,1),this._interactiveArea.x=gs(e.x,0,1-this._interactiveArea.width),this._interactiveArea.y=gs(e.y,0,1-this._interactiveArea.height)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}rotate(e,t,s=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+t,s)}rotateAzimuthTo(e,t=!1){return this.rotateTo(e,this._sphericalEnd.phi,t)}rotatePolarTo(e,t=!1){return this.rotateTo(this._sphericalEnd.theta,e,t)}rotateTo(e,t,s=!1){this._isUserControllingRotate=!1;const i=gs(e,this.minAzimuthAngle,this.maxAzimuthAngle),n=gs(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=i,this._sphericalEnd.phi=n,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,s||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const r=!s||Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(r)}dolly(e,t=!1){return this.dollyTo(this._sphericalEnd.radius-e,t)}dollyTo(e,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0,this._dollyToNoClamp(gs(e,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(e,t=!1){const s=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const r=this._collisionTest(),o=Ae(r,this._spherical.radius);if(!(s>e)&&o)return Promise.resolve();this._sphericalEnd.radius=Math.min(e,r)}else this._sphericalEnd.radius=e;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const n=!t||Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(n)}dollyInFixed(e,t=!1){this._targetEnd.add(this._getCameraDirection($r).multiplyScalar(e)),t||this._target.copy(this._targetEnd);const s=!t||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}zoom(e,t=!1){return this.zoomTo(this._zoomEnd+e,t)}zoomTo(e,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=gs(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const s=!t||Ae(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(s)}pan(e,t,s=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,t,s)}truck(e,t,s=!1){this._camera.updateMatrix(),Ms.setFromMatrixColumn(this._camera.matrix,0),As.setFromMatrixColumn(this._camera.matrix,1),Ms.multiplyScalar(e),As.multiplyScalar(-t);const i=le.copy(Ms).add(As),n=Te.copy(this._targetEnd).add(i);return this.moveTo(n.x,n.y,n.z,s)}forward(e,t=!1){le.setFromMatrixColumn(this._camera.matrix,0),le.crossVectors(this._camera.up,le),le.multiplyScalar(e);const s=Te.copy(this._targetEnd).add(le);return this.moveTo(s.x,s.y,s.z,t)}elevate(e,t=!1){return le.copy(this._camera.up).multiplyScalar(e),this.moveTo(this._targetEnd.x+le.x,this._targetEnd.y+le.y,this._targetEnd.z+le.z,t)}moveTo(e,t,s,i=!1){this._isUserControllingTruck=!1;const n=le.set(e,t,s).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,n,this.boundaryFriction),this._needsUpdate=!0,i||this._target.copy(this._targetEnd);const r=!i||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(r)}lookInDirectionOf(e,t,s,i=!1){const o=le.set(e,t,s).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(o.x,o.y,o.z,i)}fitToBox(e,t,{cover:s=!1,paddingLeft:i=0,paddingRight:n=0,paddingBottom:r=0,paddingTop:o=0}={}){const l=[],c=e.isBox3?Vn.copy(e):Vn.setFromObject(e);c.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const h=Bf(this._sphericalEnd.theta,Of),u=Bf(this._sphericalEnd.phi,Of);l.push(this.rotateTo(h,u,t));const d=le.setFromSpherical(this._sphericalEnd).normalize(),p=Gf.setFromUnitVectors(d,Kc),f=Ae(Math.abs(d.y),1);f&&p.multiply(eh.setFromAxisAngle(_o,h)),p.multiply(this._yAxisUpSpaceInverse);const m=zf.makeEmpty();Te.copy(c.min).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setX(c.max.x).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setY(c.max.y).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setZ(c.min.z).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.min).setZ(c.max.z).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setY(c.min.y).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).setX(c.min.x).applyQuaternion(p),m.expandByPoint(Te),Te.copy(c.max).applyQuaternion(p),m.expandByPoint(Te),m.min.x-=i,m.min.y-=r,m.max.x+=n,m.max.y+=o,p.setFromUnitVectors(Kc,d),f&&p.premultiply(eh.invert()),p.premultiply(this._yAxisUpSpace);const y=m.getSize(le),g=m.getCenter(Te).applyQuaternion(p);if(Yi(this._camera)){const _=this.getDistanceToFitBox(y.x,y.y,y.z,s);l.push(this.moveTo(g.x,g.y,g.z,t)),l.push(this.dollyTo(_,t)),l.push(this.setFocalOffset(0,0,0,t))}else if(bi(this._camera)){const _=this._camera,b=_.right-_.left,T=_.top-_.bottom,S=s?Math.max(b/y.x,T/y.y):Math.min(b/y.x,T/y.y);l.push(this.moveTo(g.x,g.y,g.z,t)),l.push(this.zoomTo(S,t)),l.push(this.setFocalOffset(0,0,0,t))}return Promise.all(l)}fitToSphere(e,t){const s=[],n="isObject3D"in e?Ds.createBoundingSphere(e,Jc):Jc.copy(e);if(s.push(this.moveTo(n.center.x,n.center.y,n.center.z,t)),Yi(this._camera)){const r=this.getDistanceToFitSphere(n.radius);s.push(this.dollyTo(r,t))}else if(bi(this._camera)){const r=this._camera.right-this._camera.left,o=this._camera.top-this._camera.bottom,l=2*n.radius,c=Math.min(r/l,o/l);s.push(this.zoomTo(c,t))}return s.push(this.setFocalOffset(0,0,0,t)),Promise.all(s)}setLookAt(e,t,s,i,n,r,o=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0;const l=Te.set(i,n,r),c=le.set(e,t,s);this._targetEnd.copy(l),this._sphericalEnd.setFromVector3(c.sub(l).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,o||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const h=!o||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold)&&Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(h)}lerpLookAt(e,t,s,i,n,r,o,l,c,h,u,d,p,f=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=kn.NONE,this._changedDolly=0;const m=le.set(i,n,r),y=Te.set(e,t,s);es.setFromVector3(y.sub(m).applyQuaternion(this._yAxisUpSpace));const g=Gn.set(h,u,d),_=Te.set(o,l,c);jr.setFromVector3(_.sub(g).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(m.lerp(g,p));const b=jr.theta-es.theta,T=jr.phi-es.phi,S=jr.radius-es.radius;this._sphericalEnd.set(es.radius+S*p,es.phi+T*p,es.theta+b*p),this.normalizeRotations(),this._needsUpdate=!0,f||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const C=!f||Ae(this._target.x,this._targetEnd.x,this.restThreshold)&&Ae(this._target.y,this._targetEnd.y,this.restThreshold)&&Ae(this._target.z,this._targetEnd.z,this.restThreshold)&&Ae(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&Ae(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&Ae(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(C)}setPosition(e,t,s,i=!1){return this.setLookAt(e,t,s,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,i)}setTarget(e,t,s,i=!1){const n=this.getPosition(le),r=this.setLookAt(n.x,n.y,n.z,e,t,s,i);return this._sphericalEnd.phi=gs(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),r}setFocalOffset(e,t,s,i=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(e,t,s),this._needsUpdate=!0,i||this._focalOffset.copy(this._focalOffsetEnd);const n=!i||Ae(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&Ae(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&Ae(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(n)}setOrbitPoint(e,t,s){this._camera.updateMatrixWorld(),Ms.setFromMatrixColumn(this._camera.matrixWorldInverse,0),As.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Xi.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const i=le.set(e,t,s),n=i.distanceTo(this._camera.position),r=i.sub(this._camera.position);Ms.multiplyScalar(r.x),As.multiplyScalar(r.y),Xi.multiplyScalar(r.z),le.copy(Ms).add(As).add(Xi),le.z=le.z+n,this.dollyTo(n,!1),this.setFocalOffset(-le.x,le.y,-le.z,!1),this.moveTo(e,t,s,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,t,s,i){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new ee.Vector4,typeof e=="number"?this._viewport.set(e,t,s,i):this._viewport.copy(e)}getDistanceToFitBox(e,t,s,i=!1){if(Zc(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const n=e/t,r=this._camera.getEffectiveFOV()*Vr,o=this._camera.aspect;return((i?n>o:n<o)?t:e/o)*.5/Math.tan(r*.5)+s*.5}getDistanceToFitSphere(e){if(Zc(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*Vr,s=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,i=1<this._camera.aspect?t:s;return e/Math.sin(i*.5)}getTarget(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).copy(t?this._targetEnd:this._target)}getPosition(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(e,t=!0){return(e||new ee.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(e,t=!0){return(e&&e.isVector3?e:new ee.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%zn,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=zn),this._spherical.theta+=zn*Math.round((this._sphericalEnd.theta-this._spherical.theta)/zn)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(e=!1){if(!Ae(this._camera.up.x,this._cameraUp0.x)||!Ae(this._camera.up.y,this._cameraUp0.y)||!Ae(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const s=this.getPosition(le);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,e),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,e),this.zoomTo(this._zoom0,e)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,_o),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const e=le.subVectors(this._target,this._camera.position).normalize(),t=Te.crossVectors(e,this._camera.up);this._camera.up.crossVectors(t,e).normalize(),this._camera.updateMatrixWorld();const s=this.getPosition(le);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}update(e){const t=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,i=this._sphericalEnd.radius-this._spherical.radius,n=Uf.subVectors(this._targetEnd,this._target),r=kf.subVectors(this._focalOffsetEnd,this._focalOffset),o=this._zoomEnd-this._zoom;if(Ie(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const u=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=yo(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,u,1/0,e),this._needsUpdate=!0}if(Ie(s))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const u=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=yo(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,u,1/0,e),this._needsUpdate=!0}if(Ie(i))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const u=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=yo(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,u,this.maxSpeed,e),this._needsUpdate=!0}if(Ie(n.x)&&Ie(n.y)&&Ie(n.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const u=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;If(this._target,this._targetEnd,this._targetVelocity,u,this.maxSpeed,e,this._target),this._needsUpdate=!0}if(Ie(r.x)&&Ie(r.y)&&Ie(r.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const u=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;If(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,u,this.maxSpeed,e,this._focalOffset),this._needsUpdate=!0}if(Ie(o))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const u=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=yo(this._zoom,this._zoomEnd,this._zoomVelocity,u,1/0,e)}if(this.dollyToCursor){if(Yi(this._camera)&&this._changedDolly!==0){const u=this._spherical.radius-this._lastDistance,d=this._camera,p=this._getCameraDirection($r),f=le.copy(p).cross(d.up).normalize();f.lengthSq()===0&&(f.x=1);const m=Te.crossVectors(f,p),y=this._sphericalEnd.radius*Math.tan(d.getEffectiveFOV()*Vr*.5),_=(this._sphericalEnd.radius-u-this._sphericalEnd.radius)/this._sphericalEnd.radius,b=Gn.copy(this._targetEnd).add(f.multiplyScalar(this._dollyControlCoord.x*y*d.aspect)).add(m.multiplyScalar(this._dollyControlCoord.y*y)),T=le.copy(this._targetEnd).lerp(b,_),S=this._lastDollyDirection===kn.IN&&this._spherical.radius<=this.minDistance,C=this._lastDollyDirection===kn.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(S||C)){this._sphericalEnd.radius-=u,this._spherical.radius-=u;const R=Te.copy(p).multiplyScalar(-u);T.add(R)}this._boundary.clampPoint(T,T);const w=Te.subVectors(T,this._targetEnd);this._targetEnd.copy(T),this._target.add(w),this._changedDolly-=u,Ie(this._changedDolly)&&(this._changedDolly=0)}else if(bi(this._camera)&&this._changedZoom!==0){const u=this._zoom-this._lastZoom,d=this._camera,p=le.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(d.near+d.far)/(d.near-d.far)).unproject(d),f=Te.set(0,0,-1).applyQuaternion(d.quaternion),m=Gn.copy(p).add(f.multiplyScalar(-p.dot(d.up))),g=-(this._zoom-u-this._zoom)/this._zoom,_=this._getCameraDirection($r),b=this._targetEnd.dot(_),T=le.copy(this._targetEnd).lerp(m,g),S=T.dot(_),C=_.multiplyScalar(S-b);T.sub(C),this._boundary.clampPoint(T,T);const w=Te.subVectors(T,this._targetEnd);this._targetEnd.copy(T),this._target.add(w),this._changedZoom-=u,Ie(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const l=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,l),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!Ie(this._focalOffset.x)||!Ie(this._focalOffset.y)||!Ie(this._focalOffset.z))&&(Ms.setFromMatrixColumn(this._camera.matrix,0),As.setFromMatrixColumn(this._camera.matrix,1),Xi.setFromMatrixColumn(this._camera.matrix,2),Ms.multiplyScalar(this._focalOffset.x),As.multiplyScalar(-this._focalOffset.y),Xi.multiplyScalar(this._focalOffset.z),le.copy(Ms).add(As).add(Xi),this._camera.position.add(le),this._camera.updateMatrixWorld()),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),le.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const h=this._needsUpdate;return h&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):h?(this.dispatchEvent({type:"update"}),Ie(t,this.restThreshold)&&Ie(s,this.restThreshold)&&Ie(i,this.restThreshold)&&Ie(n.x,this.restThreshold)&&Ie(n.y,this.restThreshold)&&Ie(n.z,this.restThreshold)&&Ie(r.x,this.restThreshold)&&Ie(r.y,this.restThreshold)&&Ie(r.z,this.restThreshold)&&Ie(o,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!h&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=h,this._needsUpdate=!1,h}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:Hr(this.maxDistance),minZoom:this.minZoom,maxZoom:Hr(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:Hr(this.maxPolarAngle),minAzimuthAngle:Hr(this.minAzimuthAngle),maxAzimuthAngle:Hr(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,target:this._targetEnd.toArray(),position:le.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(e,t=!1){const s=JSON.parse(e);this.enabled=s.enabled,this.minDistance=s.minDistance,this.maxDistance=Wr(s.maxDistance),this.minZoom=s.minZoom,this.maxZoom=Wr(s.maxZoom),this.minPolarAngle=s.minPolarAngle,this.maxPolarAngle=Wr(s.maxPolarAngle),this.minAzimuthAngle=Wr(s.minAzimuthAngle),this.maxAzimuthAngle=Wr(s.maxAzimuthAngle),this.smoothTime=s.smoothTime,this.draggingSmoothTime=s.draggingSmoothTime,this.dollySpeed=s.dollySpeed,this.truckSpeed=s.truckSpeed,this.dollyToCursor=s.dollyToCursor,this._target0.fromArray(s.target0),this._position0.fromArray(s.position0),this._zoom0=s.zoom0,this._focalOffset0.fromArray(s.focalOffset0),this.moveTo(s.target[0],s.target[1],s.target[2],t),es.setFromVector3(le.fromArray(s.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(es.theta,es.phi,t),this.dollyTo(es.radius,t),this.zoomTo(s.zoom,t),this.setFocalOffset(s.focalOffset[0],s.focalOffset[1],s.focalOffset[2],t),this._needsUpdate=!0}connect(e){if(this._domElement){console.warn("camera-controls is already connected.");return}e.setAttribute("data-camera-controls-version",KR),this._addAllEventListeners(e),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(e){return e.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(e){return this._getTargetDirection(e).negate()}_findPointerById(e){return this._activePointers.find(t=>t.pointerId===e)}_findPointerByMouseButton(e){return this._activePointers.find(t=>t.mouseButton===e)}_disposePointer(e){this._activePointers.splice(this._activePointers.indexOf(e),1)}_encloseToBoundary(e,t,s){const i=t.lengthSq();if(i===0)return e;const n=Te.copy(t).add(e),o=this._boundary.clampPoint(n,Gn).sub(n),l=o.lengthSq();if(l===0)return e.add(t);if(l===i)return e;if(s===0)return e.add(t).add(o);{const c=1+s*l/t.dot(o);return e.add(Te.copy(t).multiplyScalar(c)).add(o.multiplyScalar(1-s))}}_updateNearPlaneCorners(){if(Yi(this._camera)){const e=this._camera,t=e.near,s=e.getEffectiveFOV()*Vr,i=Math.tan(s*.5)*t,n=i*e.aspect;this._nearPlaneCorners[0].set(-n,-i,0),this._nearPlaneCorners[1].set(n,-i,0),this._nearPlaneCorners[2].set(n,i,0),this._nearPlaneCorners[3].set(-n,i,0)}else if(bi(this._camera)){const e=this._camera,t=1/e.zoom,s=e.left*t,i=e.right*t,n=e.top*t,r=e.bottom*t;this._nearPlaneCorners[0].set(s,n,0),this._nearPlaneCorners[1].set(i,n,0),this._nearPlaneCorners[2].set(i,r,0),this._nearPlaneCorners[3].set(s,r,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||Zc(this._camera,"_collisionTest"))return e;const s=this._getTargetDirection($r);th.lookAt(Lf,s,this._camera.up);for(let i=0;i<4;i++){const n=Te.copy(this._nearPlaneCorners[i]);n.applyMatrix4(th);const r=Gn.addVectors(this._target,n);bo.set(r,s),bo.far=this._spherical.radius+1;const o=bo.intersectObjects(this.colliderMeshes);o.length!==0&&o[0].distance<e&&(e=o[0].distance)}return e}_getClientRect(e){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return e.x=t.left,e.y=t.top,this._viewport?(e.x+=this._viewport.x,e.y+=t.height-this._viewport.w-this._viewport.y,e.width=this._viewport.z,e.height=this._viewport.w):(e.width=t.width,e.height=t.height),e}_createOnRestPromise(e){return e?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const s=()=>{this.removeEventListener("rest",s),t()};this.addEventListener("rest",s)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(e){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(e){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(e,t=new ee.Sphere){const s=t,i=s.center;Vn.makeEmpty(),e.traverseVisible(r=>{r.isMesh&&Vn.expandByObject(r)}),Vn.getCenter(i);let n=0;return e.traverseVisible(r=>{if(!r.isMesh)return;const o=r;if(!o.geometry)return;const l=o.geometry.clone();l.applyMatrix4(o.matrixWorld);const h=l.attributes.position;for(let u=0,d=h.count;u<d;u++)le.fromBufferAttribute(h,u),n=Math.max(n,i.distanceToSquared(le))}),s.radius=Math.sqrt(n),s}}const al=a=>{const[e,t]=W.useState(a.options[a.index]),s=()=>{a.onToggle(!a.open)},i=r=>{r!==e&&(a.onSelect(r),t(r)),a.onToggle(!1)},n=a.open?`${a.options.length*31-1}px`:"0px";return M.jsxs("div",{className:`dropdown ${a.up===!0?"up":""}`,children:[M.jsx("div",{className:"dropdown-toggle",onClick:s,children:`${a.title}: ${e}`}),M.jsx("ul",{className:"dropdown-menu",style:{height:n},children:a.options.map(r=>M.jsx("li",{onClick:()=>i(r),children:r},r))})]})},Zi=W.forwardRef(function(e,t){const s=["Renderer","Depth","Normals","UVs","Wireframe"],[i,n]=W.useState("Renderer"),[r,o]=W.useState(!1),[l,c]=W.useState(!1),[h,u]=W.useState(!1);return M.jsxs("div",{className:`CameraWindow ${e.name}`,children:[M.jsx("div",{ref:t,className:"clickable",onClick:()=>{h&&u(!1)}}),M.jsxs("div",{className:"options",children:[e.camera!==null&&M.jsx(al,{title:"Camera",index:e.options.indexOf(e.camera.name),open:h,options:e.options,onSelect:e.onSelectCamera,onToggle:d=>{d&&l&&c(!1),u(d)},up:!0}),M.jsx(al,{title:"Mode",index:s.indexOf(i),open:l,options:s,onSelect:d=>{if(d===i)return;const p=d;e.onSelectRenderMode(p),n(p)},onToggle:d=>{d&&h&&u(!1),r&&o(!1),c(d)},up:!0})]})]})}),eN=`out vec3 worldPosition;
486
486
  uniform float uDistance;
487
487
 
488
488
  void main() {
package/dist/hermes.css CHANGED
@@ -1 +1 @@
1
- .editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor #SidePanel .field{align-items:center;background-color:#222;display:flex;flex-direction:row;flex-wrap:wrap;min-height:21px;overflow:hidden;padding:1px;position:relative}.editor #SidePanel .field span{font-family:Arial;font-weight:700;line-height:20px;height:20px;padding:0 5px;max-width:180px;user-select:none;width:fit-content;min-width:20px;text-align:center}.editor #SidePanel .field input{background-color:#191919;block-size:11px;color:#fff;flex:1%;font-family:Arial;min-height:20px;margin:0;padding:4px;outline:none}.editor #SidePanel .field input.min{height:11px;width:30px;margin-right:1px}.editor #SidePanel .field input.color{flex:none;width:60px}.editor #SidePanel .field input[type=checkbox]{appearance:none;background-color:#191919;border:4px solid #191919;cursor:pointer;display:inline-block;flex:none;min-height:16px;width:16px;height:16px;transition:background-color .25s linear}.editor #SidePanel .field input[type=checkbox]:checked{background-color:#ccc}.editor #SidePanel .field input[type=color]{appearance:none;border:none;block-size:revert;cursor:pointer;height:28px;padding-block:revert;padding:0;margin:0}.editor #SidePanel .field input[type=number],.editor #SidePanel .field input[type=range]{appearance:none;height:20px}.editor #SidePanel .field input[type=range]::-webkit-slider-runnable-track{border:none}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb{appearance:none;background-color:#666;cursor:pointer;height:17px;width:17px;transition:.2s linear background-color}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb:hover{background-color:#999}.editor #SidePanel .field textarea{background-color:#191919;color:#fff;font-size:12px;line-height:12px}.editor #SidePanel .field img{border:1px dotted #333;cursor:pointer;object-fit:cover;width:100px;height:100px}.editor #SidePanel .field button{background-color:#333;border-top:1px dotted #444;height:16px;margin:0;padding:0 0 0 5px;text-align:center;transition:.2s background-color linear;width:100%}.editor #SidePanel .field button:hover{background-color:#444}.editor #SidePanel .field.block label{display:inline;line-height:21px;max-width:100%;text-align:left;width:100%}.editor #SidePanel .field select{background-color:#222;border:1px solid #333;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;padding:1px 5px;position:absolute;right:4px}.editor #SidePanel .field option{cursor:pointer}.editor #SidePanel .field .vector2{position:relative;width:100%}.editor #SidePanel .field .vector2 .fields{display:inline-block;margin-bottom:2px;position:relative;overflow:hidden;width:60%}.editor #SidePanel .field .vector2 .fields div{display:block;margin:3px 0}.editor #SidePanel .field .vector2 .fields label{background:none;display:inline-block;width:30px}.editor #SidePanel .field .vector2 .fields input{width:66%}.editor #SidePanel .field .vector2 .input{background-image:url(data:image/gif;base64,R0lGODlhYwBjAIAAABoaGgAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCNzgwMTU3OUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCNzgwMTU3QUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI3ODAxNTc3RTE5NzExRUU5OTI1REI2QUIxNTBERTA3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI3ODAxNTc4RTE5NzExRUU5OTI1REI2QUIxNTBERTA3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAGMAYwAAAv+Mf4Crm/5gaJA6y+TUGiMfVd0ogYa5cWJJru7Vwqwqv9lsf/Gd0+i/0+FqRB4tVBT2TkGk8XkEDqFOZbKKVUmXKe72yjxaqWFvswzuXgDstvsNj8vn9Lr9Hj+ryfuxP9sHqPfFR/iHxjeoOHUYiNi4aMYIaCg4+UgZmVappVno2YgCmnnpaMrJgao6itmaynoKq4pHW2t7eyurW4q6K/m7KRbqG8wrTAr8aVxKrJw8fBy7/Iyc1gxN7So6XZwtzXVd7dy9hmt+jk4brr1u2r7KnRiPTT4u7w2Pr/fOzzwvTs8epH/sCH6zZjBfvYBR+unjlS6ixIkOFwK09DCjRVfXFQVe5JiwI0MfIj8eFKPQY0FvJVdudBcypkaULU+OPDExp05bNVPefCXzpU+SQVXaxCi0576iP4eCnNm0nVKmSI06PeqSJtWsUUvs/ApWzlSoVbuS5VrW5NW10bC6Zevv7FupW+fWHZs0bl65V/FaHRQ2cGC/ZhHyJUz0cN1tihsb3gv5bzS4ju9FLiz5GOXLJhGj/TxBsOidnu2CW1y69GatlTEPbK0Wlmq6sEH3RY37dG3TQkf7ljj7bm7OoIPLNU4c6O7VDYdnfvw8uuvEyZmntY18QQEAOw==);border:1px solid #333;display:inline-block;width:99px;height:99px;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .x{background-color:#333;height:.5px;width:100%;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .y{background-color:#333;height:100%;width:.5px;position:absolute;left:50%;transform:translate(-50%)}.editor #SidePanel .field .vector2 .input .pt{background-color:#fff;border-radius:5px;width:5px;height:5px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10}.editor #SidePanel .field .grid3{grid-template-columns:repeat(3,1fr)}.editor #SidePanel .field .grid4{grid-template-columns:repeat(4,1fr)}.editor #SidePanel .field .grid3,.editor #SidePanel .field .grid4{display:grid;margin-top:4px}.editor #SidePanel .field .grid3 div,.editor #SidePanel .field .grid4 div{display:flex;overflow:hidden}.editor #SidePanel .field .grid3 div label,.editor #SidePanel .field .grid4 div label{padding:0 10px;line-height:30px;min-width:inherit}.editor #SidePanel .field .grid3 div input,.editor #SidePanel .field .grid4 div input{width:100%}.editor #SidePanel .field .imageField{display:block;height:120px;position:relative}.editor #SidePanel .field .imageField img{display:inline-block}.editor #SidePanel .field .imageField .fields{display:inline-block;position:absolute;top:0;width:170px}.editor #SidePanel .field .imageField .fields div{display:inline-block;width:100%}.editor #SidePanel .field .imageField .fields div label{background:none;display:block;padding:0 5px}.editor #SidePanel .field .imageField .fields div input{width:calc(50% - 10px)}.editor #SidePanel .group{background-color:#191919;margin:2px 0}.editor #SidePanel .group h4{display:inline;font-weight:700;pointer-events:none;width:fit-content}.editor #SidePanel .group .toggleBtn{background-color:#191919;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAB1CAYAAADN5fjJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAzklEQVR4nO3bwQqCUBBA0Yz+/5dt1eYRkVfKWZyzUgi5zEJSxm3f99tU96sDPhFXiavEVeIqcZW4anTcYzmf8P9pex2Mnpy4Slwlrhodt96Et7e/usjoyYmrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiqtFx69LLUd9sKuZFmtGTE1eJq8RV4ipx1T+2+o9e01b/aeIqcZW46uxWvweckcRV4ipxlbhqdNzZl4c//cJu9ORGxz0BUl8I9T4qXncAAAAASUVORK5CYII=);background-position:1px 1px;background-repeat:no-repeat;background-size:15px 45px;display:inline-block;height:15px;opacity:.8;overflow:hidden;margin:0 0 0 5px;padding-left:20px;width:calc(100% - 7px);transition:all .15s linear}.editor #SidePanel .group .toggleBtn:hover{background-color:#222;opacity:1}.editor #SidePanel .group .fieldItems{border-top:1px dotted #333;overflow-y:auto;user-select:none}.editor .multiview{display:grid;font-family:Arial,Helvetica,sans-serif;font-size:10px;grid-template-columns:auto;position:absolute;overflow:hidden;inset:0 300px 0 0;z-index:1}.editor .multiview canvas{pointer-events:none}.editor .multiview .dropdown{background-color:#222;display:inline-block;font-size:10px;text-align:center}.editor .multiview .dropdown .dropdown-toggle{cursor:pointer;padding:0 10px;height:30px;line-height:30px;overflow:hidden}.editor .multiview .dropdown .dropdown-toggle:hover{background-color:#333}.editor .multiview .dropdown .dropdown-menu{position:absolute;top:20px;left:50%;z-index:1;list-style:none;padding:0;margin:0;min-width:100%;width:auto;transform:translate(-50%)}.editor .multiview .dropdown .dropdown-menu li{background-color:#222;border-top:1px solid #191919;cursor:pointer;height:30px;line-height:30px;padding:0 10px;transition:.2s linear background-color}.editor .multiview .dropdown .dropdown-menu li:hover{background-color:#333}.editor .multiview .cameras{display:grid;grid-template-columns:repeat(2,1fr);pointer-events:visible;position:absolute;width:100%;height:100%}.editor .multiview .cameras.single{grid-template-columns:repeat(1,1fr)}.editor .multiview .cameras .CameraWindow{border:1px dotted #333;border-top:none;border-left:none;pointer-events:visible;position:relative}.editor .multiview .cameras .CameraWindow .clickable{display:inline-block;width:100%;height:100%}.editor .multiview .cameras .CameraWindow .options{position:absolute;height:30px;top:initial;bottom:0;left:50%;transform:translate(-50%);width:max-content}.editor .multiview .cameras .CameraWindow .options .dropdown{position:relative;top:0;transition:background-color .25s linear}.editor .multiview .cameras .CameraWindow .options .dropdown.up{background-color:#333;bottom:0;top:initial}.editor .multiview .cameras .CameraWindow .options .dropdown.up .dropdown-menu{top:initial;bottom:100%}.editor .multiview .settings{pointer-events:visible;position:absolute;left:50%;transform:translate(-50%)}.editor .multiview .settings .toggle{background-blend-mode:overlay;background-color:#222;background-position:2px 2px;background-repeat:no-repeat;background-size:26px 26px;display:inline-block;position:relative;left:0;transform:none;width:30px;height:30px;overflow:hidden}.editor .multiview .settings .toggle.selected{background-blend-mode:normal}.editor .multiview .connectionStatus{background-color:red;font-weight:700;line-height:30px;padding:0 10px;text-transform:uppercase;position:absolute;left:0;bottom:0;z-index:10}body .tp-dfwv,body .tp-dfwv button,body .tp-dfwv input{text-transform:none}.tp-ckbv{float:right}.tp-dfwv{left:50%;top:0;max-height:100%;overflow-x:hidden;overflow-y:auto;transform:translate(-50%);width:400px;z-index:100}.tp-dfwv .tp-lblv{position:relative}.tp-dfwv .tp-lblv_v{display:inline-block}.tp-dfwv .tp-lblv_v .tp-ckbv{width:20px}.tp-dfwv .tp-lblv_v .tp-fpsv{width:280px}.tp-dfwv .tp-btnv_b{padding:0 5px}.tp-dfwv .tp-btngridv{max-height:100px;overflow-x:hidden;overflow-y:auto}.tp-dfwv .tp-tabv{max-height:90vh;overflow:hidden auto}.tp-dfwv{font-family:Roboto Mono,Source Code Pro,Menlo,Courier,monospace;font-size:10px}.editor #SidePanel{background-color:#0d0d0d;border:1px solid #111;max-height:100%;min-height:20px;overflow-y:auto;pointer-events:visible;position:absolute;right:0;top:0;bottom:0;width:300px}.editor #SidePanel .accordion{border-bottom:1px dotted #333;background-color:#111;line-height:0;resize:vertical;overflow-y:auto}.editor #SidePanel .accordion.hide{resize:none;overflow-y:hidden}.editor #SidePanel .accordion>div{display:grid;grid-template-rows:0fr;margin-left:5px;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .accordion>div>div{overflow:hidden}.editor #SidePanel .accordion>div.open{border-top:1px solid #222;grid-template-rows:1fr}.editor #SidePanel .accordion .icon{height:20px;width:20px}.editor #SidePanel .accordion .icon button{text-indent:-9999px;white-space:nowrap}.editor #SidePanel .accordion .toggle{background-color:#333;display:inline-block;font-size:12px;font-weight:700;margin:0;padding:0;position:relative;user-select:none;width:100%;height:20px;transition:background-color .2s linear}.editor #SidePanel .accordion .toggle:hover{background-color:#444}.editor #SidePanel .accordion .toggle p{margin:0;padding:0}.editor #SidePanel .accordion .toggle .label{display:inline;position:absolute;left:25px;top:3px;height:15px;line-height:15px}.editor #SidePanel input{background-color:#222;border:1px dotted #333;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:4px}.editor #SidePanel button{background-color:transparent;border:none;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;margin:0;padding:0;text-align:left}.editor #SidePanel #options{border-bottom:1px solid #111;display:flex;margin:0;padding:0;list-style-type:none;width:100%}.editor #SidePanel #options .selected{background-color:#222}.editor #SidePanel #options .selected button{pointer-events:none}.editor #SidePanel #options button{min-width:20px;height:20px;text-align:center;width:100%}.editor #SidePanel #options button:hover{background-color:#333}.editor #SidePanel #options li{border-right:1px solid #111;font-size:12px;line-height:20px;min-height:20px;min-width:20px;text-align:center;width:100%}.editor #SidePanel #options li:first-child{border-left:1px solid #111}.editor #SidePanel .status,.editor #SidePanel .refresh,.editor #SidePanel .remove,.editor #SidePanel .visibility{display:inline-block;margin:0;padding:0;overflow:hidden;width:20px;height:20px;text-indent:-9999px;white-space:nowrap}.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .status.open{background-position-x:18px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject{background-color:#111;min-height:20px;overflow:hidden}.editor #SidePanel .childObject ::-webkit-scrollbar{width:10px}.editor #SidePanel .childObject ::-webkit-scrollbar-track{background:#0d0d0d}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb{background:#666}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb:hover{background:#999}.editor #SidePanel .childObject .child{background-color:#222;border:none;border-bottom:1px solid #111;height:20px;position:relative}.editor #SidePanel .childObject .child:hover{background-color:#333}.editor #SidePanel .childObject .name{background-color:transparent;font-family:Arial;height:20px;overflow:hidden;position:absolute;left:5px;right:50px;top:50%;transform:translateY(-50%);white-space:nowrap}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject>div{display:grid;grid-template-rows:0fr;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .childObject>div.open{grid-template-rows:1fr}.editor #SidePanel .childObject>div .container{padding-left:5px;height:auto;overflow-x:hidden;overflow-y:auto;max-height:200px}.editor #SidePanel .childObject>div .container.closed{height:0;overflow:hidden}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor .header .dropdown{color:#fff;display:inline-block;margin-right:1px;text-align:left;height:fit-content;min-width:auto;width:max-content}.editor .header .dropdown button{backdrop-filter:blur(2px);background-color:#222c;border:none;color:#ffffff80;font-size:12px;padding:5px 10px;position:relative;text-align:left;min-width:22px;width:100%;height:32px;transition:all .2s linear}.editor .header .dropdown button:hover{background-color:#333c;color:#fff}.editor .header .dropdown button.svg{line-height:0;width:32px}.editor .header .dropdown p{background-color:#222c;display:inline-block;height:22px;margin:0;min-width:22px;padding:5px}.editor .header .dropdown svg{position:relative;left:50%;transform:translate(-50%)}.editor .header .dropdown ul{list-style:none;margin:0;margin-block:0;padding-inline:0;position:absolute;width:max-content}.editor .header .dropdown ul li{border-top:1px solid rgba(17,17,17,.9);display:block;position:relative}.editor .header .dropdown ul li.selected button{background-color:#444c}.editor .header .dropdown ul li.selected button:hover{background-color:#555c}.editor .header .dropdown.subdropdown{min-width:100%}.editor .header .dropdown.subdropdown ul{border-left:1px solid rgba(17,17,17,.9);left:100%;top:-1px}.editor .header .draggable li{cursor:grab;transition:transform .25s ease-out}.editor .header .draggable li.dragging{transform:scale(1.1)}.editor .header .draggable li.dragging div{background-color:#404040}.editor .header .draggable li div{background-color:#222c;line-height:14px;padding:5px 10px;transition:background-color .25s linear}.editor .header .draggable li div:hover{background-color:#333c}.editor .header .draggable li div span{font-size:12px;margin:0 15px 0 10px;padding:0 5px}.editor .header .draggable li div .dragIcon{position:absolute;left:10px}.editor .header .draggable li div .closeIcon{background-color:transparent;padding:0;position:absolute;right:5px;top:50%;min-width:14px;width:14px;height:14px;transform:translateY(-50%);visibility:inherit}.editor .header .draggable li div .closeIcon svg{background-color:transparent;left:0;position:relative}.editor{font-family:Arial,Helvetica,sans-serif;font-size:12px;left:0;pointer-events:none;position:absolute;top:0;width:100%;height:100%;z-index:100}.editor button{background:none;border:none;color:#fff;display:inline-block;margin:0;padding:0;text-align:left}.editor .header{display:inline-block;pointer-events:visible;position:relative;left:130px;z-index:101}.editor .footer{position:absolute;right:5px;bottom:0}.fsAbsolute{position:absolute;inset:0}.absoluteCenter{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.hidden{display:none;visibility:hidden}.hideText{text-indent:-9999px;white-space:nowrap}
1
+ .editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor #SidePanel .field{align-items:center;background-color:#222;display:flex;flex-direction:row;flex-wrap:wrap;min-height:21px;overflow:hidden;padding:1px;position:relative}.editor #SidePanel .field span{font-family:Arial;font-weight:700;line-height:20px;height:20px;padding:0 5px;max-width:180px;user-select:none;width:fit-content;min-width:20px;text-align:center}.editor #SidePanel .field input{background-color:#191919;block-size:11px;color:#fff;flex:1%;font-family:Arial;min-height:20px;margin:0;padding:4px;outline:none}.editor #SidePanel .field input.min{height:11px;width:30px;margin-right:1px}.editor #SidePanel .field input.color{flex:none;width:60px}.editor #SidePanel .field input[type=checkbox]{appearance:none;background-color:#191919;border:4px solid #191919;cursor:pointer;display:inline-block;flex:none;min-height:16px;width:16px;height:16px;transition:background-color .25s linear}.editor #SidePanel .field input[type=checkbox]:checked{background-color:#ccc}.editor #SidePanel .field input[type=color]{appearance:none;border:none;block-size:revert;cursor:pointer;height:28px;padding-block:revert;padding:0;margin:0}.editor #SidePanel .field input[type=number],.editor #SidePanel .field input[type=range]{appearance:none;height:20px}.editor #SidePanel .field input[type=range]::-webkit-slider-runnable-track{border:none}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb{appearance:none;background-color:#666;cursor:pointer;height:17px;width:17px;transition:.2s linear background-color}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb:hover{background-color:#999}.editor #SidePanel .field textarea{background-color:#191919;color:#fff;font-size:12px;line-height:12px}.editor #SidePanel .field img{border:1px dotted #333;cursor:pointer;object-fit:cover;width:100px;height:100px}.editor #SidePanel .field button{background-color:#333;border-top:1px dotted #444;height:16px;margin:0;padding:0 0 0 5px;text-align:center;transition:.2s background-color linear;width:100%}.editor #SidePanel .field button:hover{background-color:#444}.editor #SidePanel .field.block label{display:inline;line-height:21px;max-width:100%;text-align:left;width:100%}.editor #SidePanel .field select{background-color:#222;border:1px solid #333;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;padding:1px 5px;position:absolute;right:4px}.editor #SidePanel .field option{cursor:pointer}.editor #SidePanel .field .vector2{position:relative;width:100%}.editor #SidePanel .field .vector2 .fields{display:inline-block;margin-bottom:2px;position:relative;overflow:hidden;width:60%}.editor #SidePanel .field .vector2 .fields div{display:block;margin:3px 0}.editor #SidePanel .field .vector2 .fields label{background:none;display:inline-block;width:30px}.editor #SidePanel .field .vector2 .fields input{width:66%}.editor #SidePanel .field .vector2 .input{background-image:url(data:image/gif;base64,R0lGODlhYwBjAIAAABoaGgAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCNzgwMTU3OUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCNzgwMTU3QUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI3ODAxNTc3RTE5NzExRUU5OTI1REI2QUIxNTBERTA3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI3ODAxNTc4RTE5NzExRUU5OTI1REI2QUIxNTBERTA3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAGMAYwAAAv+Mf4Crm/5gaJA6y+TUGiMfVd0ogYa5cWJJru7Vwqwqv9lsf/Gd0+i/0+FqRB4tVBT2TkGk8XkEDqFOZbKKVUmXKe72yjxaqWFvswzuXgDstvsNj8vn9Lr9Hj+ryfuxP9sHqPfFR/iHxjeoOHUYiNi4aMYIaCg4+UgZmVappVno2YgCmnnpaMrJgao6itmaynoKq4pHW2t7eyurW4q6K/m7KRbqG8wrTAr8aVxKrJw8fBy7/Iyc1gxN7So6XZwtzXVd7dy9hmt+jk4brr1u2r7KnRiPTT4u7w2Pr/fOzzwvTs8epH/sCH6zZjBfvYBR+unjlS6ixIkOFwK09DCjRVfXFQVe5JiwI0MfIj8eFKPQY0FvJVdudBcypkaULU+OPDExp05bNVPefCXzpU+SQVXaxCi0576iP4eCnNm0nVKmSI06PeqSJtWsUUvs/ApWzlSoVbuS5VrW5NW10bC6Zevv7FupW+fWHZs0bl65V/FaHRQ2cGC/ZhHyJUz0cN1tihsb3gv5bzS4ju9FLiz5GOXLJhGj/TxBsOidnu2CW1y69GatlTEPbK0Wlmq6sEH3RY37dG3TQkf7ljj7bm7OoIPLNU4c6O7VDYdnfvw8uuvEyZmntY18QQEAOw==);border:1px solid #333;display:inline-block;width:99px;height:99px;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .x{background-color:#333;height:.5px;width:100%;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .y{background-color:#333;height:100%;width:.5px;position:absolute;left:50%;transform:translate(-50%)}.editor #SidePanel .field .vector2 .input .pt{background-color:#fff;border-radius:5px;width:5px;height:5px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10}.editor #SidePanel .field .grid3{grid-template-columns:repeat(3,1fr)}.editor #SidePanel .field .grid4{grid-template-columns:repeat(4,1fr)}.editor #SidePanel .field .grid3,.editor #SidePanel .field .grid4{display:grid;margin-top:4px}.editor #SidePanel .field .grid3 div,.editor #SidePanel .field .grid4 div{display:flex;overflow:hidden}.editor #SidePanel .field .grid3 div label,.editor #SidePanel .field .grid4 div label{padding:0 10px;line-height:30px;min-width:inherit}.editor #SidePanel .field .grid3 div input,.editor #SidePanel .field .grid4 div input{width:100%}.editor #SidePanel .field .imageField{display:block;height:120px;position:relative}.editor #SidePanel .field .imageField img{display:inline-block}.editor #SidePanel .field .imageField .fields{display:inline-block;position:absolute;top:0;width:170px}.editor #SidePanel .field .imageField .fields div{display:inline-block;width:100%}.editor #SidePanel .field .imageField .fields div label{background:none;display:block;padding:0 5px}.editor #SidePanel .field .imageField .fields div input{width:calc(50% - 10px)}.editor #SidePanel .group{background-color:#191919;margin:2px 0}.editor #SidePanel .group h4{display:inline;font-weight:700;pointer-events:none;width:fit-content}.editor #SidePanel .group .toggleBtn{background-color:#191919;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAB1CAYAAADN5fjJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAzklEQVR4nO3bwQqCUBBA0Yz+/5dt1eYRkVfKWZyzUgi5zEJSxm3f99tU96sDPhFXiavEVeIqcZW4anTcYzmf8P9pex2Mnpy4Slwlrhodt96Et7e/usjoyYmrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiqtFx69LLUd9sKuZFmtGTE1eJq8RV4ipx1T+2+o9e01b/aeIqcZW46uxWvweckcRV4ipxlbhqdNzZl4c//cJu9ORGxz0BUl8I9T4qXncAAAAASUVORK5CYII=);background-position:1px 1px;background-repeat:no-repeat;background-size:15px 45px;display:inline-block;height:15px;opacity:.8;overflow:hidden;margin:0 0 0 5px;padding-left:20px;width:calc(100% - 7px);transition:all .15s linear}.editor #SidePanel .group .toggleBtn:hover{background-color:#222;opacity:1}.editor #SidePanel .group .fieldItems{border-top:1px dotted #333;overflow-y:auto;user-select:none}.editor .multiview{background:url(/grid.png);display:grid;font-family:Arial,Helvetica,sans-serif;font-size:10px;grid-template-columns:auto;position:absolute;overflow:hidden;inset:0 300px 0 0;z-index:1}.editor .multiview canvas{pointer-events:none}.editor .multiview .dropdown{background-color:#222;display:inline-block;font-size:10px;text-align:center}.editor .multiview .dropdown .dropdown-toggle{cursor:pointer;padding:0 10px;height:30px;line-height:30px;overflow:hidden}.editor .multiview .dropdown .dropdown-toggle:hover{background-color:#333}.editor .multiview .dropdown .dropdown-menu{overflow:hidden;position:absolute;top:30px;left:50%;z-index:1;list-style:none;padding:0;margin:0;min-width:100%;width:auto;transform:translate(-50%);transition:all .33s cubic-bezier(.75,0,.25,1)}.editor .multiview .dropdown .dropdown-menu li{background-color:#222;border-top:1px solid #191919;cursor:pointer;height:30px;line-height:30px;padding:0 10px;transition:.2s linear background-color}.editor .multiview .dropdown .dropdown-menu li:hover{background-color:#333}.editor .multiview .cameras{display:grid;grid-template-columns:repeat(2,1fr);pointer-events:visible;position:absolute;width:100%;height:100%}.editor .multiview .cameras.single{grid-template-columns:repeat(1,1fr)}.editor .multiview .cameras .CameraWindow{border:1px dotted #333;border-top:none;border-left:none;pointer-events:visible;position:relative}.editor .multiview .cameras .CameraWindow .clickable{display:inline-block;width:100%;height:100%}.editor .multiview .cameras .CameraWindow .options{position:absolute;height:30px;top:initial;bottom:-1px;left:50%;transform:translate(-50%);width:max-content}.editor .multiview .cameras .CameraWindow .options .dropdown{position:relative;top:0;transition:background-color .25s linear}.editor .multiview .cameras .CameraWindow .options .dropdown.up{background-color:#333;bottom:0;top:initial}.editor .multiview .cameras .CameraWindow .options .dropdown.up .dropdown-menu{top:initial;bottom:100%}.editor .multiview .settings{filter:drop-shadow(0px 5px 5px rgba(0,0,0,.33));pointer-events:visible;position:absolute;left:50%;transform:translate(-50%)}.editor .multiview .settings .toggle{background-blend-mode:overlay;background-color:#222;background-position:2px 2px;background-repeat:no-repeat;background-size:26px 26px;display:inline-block;position:relative;left:0;transform:none;width:30px;height:30px;overflow:hidden}.editor .multiview .settings .toggle.selected{background-blend-mode:normal}.editor .multiview .connectionStatus{background-color:red;font-weight:700;line-height:30px;padding:0 10px;text-transform:uppercase;position:absolute;left:0;bottom:0;z-index:10}body .tp-dfwv,body .tp-dfwv button,body .tp-dfwv input{text-transform:none}.tp-ckbv{float:right}.tp-dfwv{left:50%;top:0;max-height:100%;overflow-x:hidden;overflow-y:auto;transform:translate(-50%);width:400px;z-index:100}.tp-dfwv .tp-lblv{position:relative}.tp-dfwv .tp-lblv_v{display:inline-block}.tp-dfwv .tp-lblv_v .tp-ckbv{width:20px}.tp-dfwv .tp-lblv_v .tp-fpsv{width:280px}.tp-dfwv .tp-btnv_b{padding:0 5px}.tp-dfwv .tp-btngridv{max-height:100px;overflow-x:hidden;overflow-y:auto}.tp-dfwv .tp-tabv{max-height:90vh;overflow:hidden auto}.tp-dfwv{font-family:Roboto Mono,Source Code Pro,Menlo,Courier,monospace;font-size:10px}.editor #SidePanel{background-color:#0d0d0d;border:1px solid #111;max-height:100%;min-height:20px;overflow-y:auto;pointer-events:visible;position:absolute;right:0;top:0;bottom:0;width:300px}.editor #SidePanel .accordion{border-bottom:1px dotted #333;background-color:#111;line-height:0;resize:vertical;overflow-y:auto}.editor #SidePanel .accordion.hide{resize:none;overflow-y:hidden}.editor #SidePanel .accordion>div{display:grid;grid-template-rows:0fr;margin-left:5px;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .accordion>div>div{overflow:hidden}.editor #SidePanel .accordion>div.open{border-top:1px solid #222;grid-template-rows:1fr}.editor #SidePanel .accordion .icon{height:20px;width:20px}.editor #SidePanel .accordion .icon button{text-indent:-9999px;white-space:nowrap}.editor #SidePanel .accordion .toggle{background-color:#333;display:inline-block;font-size:12px;font-weight:700;margin:0;padding:0;position:relative;user-select:none;width:100%;height:20px;transition:background-color .2s linear}.editor #SidePanel .accordion .toggle:hover{background-color:#444}.editor #SidePanel .accordion .toggle p{margin:0;padding:0}.editor #SidePanel .accordion .toggle .label{display:inline;position:absolute;left:25px;top:3px;height:15px;line-height:15px}.editor #SidePanel input{background-color:#222;border:1px dotted #333;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:4px}.editor #SidePanel button{background-color:transparent;border:none;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;margin:0;padding:0;text-align:left}.editor #SidePanel #options{border-bottom:1px solid #111;display:flex;margin:0;padding:0;list-style-type:none;width:100%}.editor #SidePanel #options .selected{background-color:#222}.editor #SidePanel #options .selected button{pointer-events:none}.editor #SidePanel #options button{min-width:20px;height:20px;text-align:center;width:100%}.editor #SidePanel #options button:hover{background-color:#333}.editor #SidePanel #options li{border-right:1px solid #111;font-size:12px;line-height:20px;min-height:20px;min-width:20px;text-align:center;width:100%}.editor #SidePanel #options li:first-child{border-left:1px solid #111}.editor #SidePanel .status,.editor #SidePanel .refresh,.editor #SidePanel .remove,.editor #SidePanel .visibility{display:inline-block;margin:0;padding:0;overflow:hidden;width:20px;height:20px;text-indent:-9999px;white-space:nowrap}.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .status.open{background-position-x:18px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject{background-color:#111;min-height:20px;overflow:hidden}.editor #SidePanel .childObject ::-webkit-scrollbar{width:10px}.editor #SidePanel .childObject ::-webkit-scrollbar-track{background:#0d0d0d}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb{background:#666}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb:hover{background:#999}.editor #SidePanel .childObject .child{background-color:#222;border:none;border-bottom:1px solid #111;height:20px;position:relative}.editor #SidePanel .childObject .child:hover{background-color:#333}.editor #SidePanel .childObject .name{background-color:transparent;font-family:Arial;height:20px;overflow:hidden;position:absolute;left:5px;right:50px;top:50%;transform:translateY(-50%);white-space:nowrap}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject>div{display:grid;grid-template-rows:0fr;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .childObject>div.open{grid-template-rows:1fr}.editor #SidePanel .childObject>div .container{padding-left:5px;height:auto;overflow-x:hidden;overflow-y:auto;max-height:200px}.editor #SidePanel .childObject>div .container.closed{height:0;overflow:hidden}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor .header .dropdown{color:#fff;display:inline-block;margin-right:1px;text-align:left;height:fit-content;min-width:auto;width:max-content}.editor .header .dropdown button{backdrop-filter:blur(2px);background-color:#222c;border:none;color:#ffffff80;font-size:12px;padding:5px 10px;position:relative;text-align:left;min-width:22px;width:100%;height:32px;transition:all .2s linear}.editor .header .dropdown button:hover{background-color:#333c;color:#fff}.editor .header .dropdown button.svg{line-height:0;width:32px}.editor .header .dropdown p{background-color:#222c;display:inline-block;height:22px;margin:0;min-width:22px;padding:5px}.editor .header .dropdown svg{position:relative;left:50%;transform:translate(-50%)}.editor .header .dropdown ul{list-style:none;margin:0;margin-block:0;padding-inline:0;position:absolute;width:max-content}.editor .header .dropdown ul li{border-top:1px solid rgba(17,17,17,.9);display:block;position:relative}.editor .header .dropdown ul li.selected button{background-color:#444c}.editor .header .dropdown ul li.selected button:hover{background-color:#555c}.editor .header .dropdown.subdropdown{min-width:100%}.editor .header .dropdown.subdropdown ul{border-left:1px solid rgba(17,17,17,.9);left:100%;top:-1px}.editor .header .draggable li{cursor:grab;transition:transform .25s ease-out}.editor .header .draggable li.dragging{transform:scale(1.1)}.editor .header .draggable li.dragging div{background-color:#404040}.editor .header .draggable li div{background-color:#222c;line-height:14px;padding:5px 10px;transition:background-color .25s linear}.editor .header .draggable li div:hover{background-color:#333c}.editor .header .draggable li div span{font-size:12px;margin:0 15px 0 10px;padding:0 5px}.editor .header .draggable li div .dragIcon{position:absolute;left:10px}.editor .header .draggable li div .closeIcon{background-color:transparent;padding:0;position:absolute;right:5px;top:50%;min-width:14px;width:14px;height:14px;transform:translateY(-50%);visibility:inherit}.editor .header .draggable li div .closeIcon svg{background-color:transparent;left:0;position:relative}.editor{background:linear-gradient(45deg,#000,#333);font-family:Arial,Helvetica,sans-serif;font-size:12px;left:0;pointer-events:none;position:absolute;top:0;width:100%;height:100%;z-index:100}.editor button{background:none;border:none;color:#fff;display:inline-block;margin:0;padding:0;text-align:left}.editor .header{display:inline-block;pointer-events:visible;position:relative;left:130px;z-index:101}.editor .footer{position:absolute;right:5px;bottom:0}.fsAbsolute{position:absolute;inset:0}.absoluteCenter{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.hidden{display:none;visibility:hidden}.hideText{text-indent:-9999px;white-space:nowrap}
package/dist/hermes.es.js CHANGED
@@ -41672,12 +41672,12 @@ class ks extends wN {
41672
41672
  const Al = (a) => {
41673
41673
  const [e, t] = Ne(a.options[a.index]), s = () => {
41674
41674
  a.onToggle(!a.open);
41675
- }, i = (n) => {
41676
- n !== e && (a.onSelect(n), t(n)), a.onToggle(!1);
41677
- };
41675
+ }, i = (r) => {
41676
+ r !== e && (a.onSelect(r), t(r)), a.onToggle(!1);
41677
+ }, n = a.open ? `${a.options.length * 31 - 1}px` : "0px";
41678
41678
  return /* @__PURE__ */ C.jsxs("div", { className: `dropdown ${a.up === !0 ? "up" : ""}`, children: [
41679
41679
  /* @__PURE__ */ C.jsx("div", { className: "dropdown-toggle", onClick: s, children: `${a.title}: ${e}` }),
41680
- a.open && /* @__PURE__ */ C.jsx("ul", { className: "dropdown-menu", children: a.options.map((n) => /* @__PURE__ */ C.jsx("li", { onClick: () => i(n), children: n }, n)) })
41680
+ /* @__PURE__ */ C.jsx("ul", { className: "dropdown-menu", style: { height: n }, children: a.options.map((r) => /* @__PURE__ */ C.jsx("li", { onClick: () => i(r), children: r }, r)) })
41681
41681
  ] });
41682
41682
  }, sn = Qx(function(e, t) {
41683
41683
  const s = [
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "module": "./dist/hermes.esm.js",
8
8
  "types": "./types/index.d.ts",
9
9
  "type": "module",
10
- "version": "0.0.160",
10
+ "version": "0.0.161",
11
11
  "homepage": "https://github.com/tomorrowevening/hermes#readme",
12
12
  "bugs": {
13
13
  "url": "https://github.com/tomorrowevening/hermes/issues"
@@ -22,6 +22,7 @@
22
22
  "dist/hermes.es.js",
23
23
  "dist/hermes.cjs.js",
24
24
  "dist/hermes.css",
25
+ "dist/grid.png",
25
26
  "types/**/*.d.ts"
26
27
  ],
27
28
  "exports": {
@@ -30,7 +31,8 @@
30
31
  "import": "./dist/hermes.es.js",
31
32
  "require": "./dist/hermes.cjs.js"
32
33
  },
33
- "./hermes.css": "./dist/hermes.css"
34
+ "./hermes.css": "./dist/hermes.css",
35
+ "./grid.png": "./dist/grid.png"
34
36
  },
35
37
  "repository": {
36
38
  "type": "git",
@@ -1,94 +1,94 @@
1
- import { EventDispatcher } from 'three';
2
- import BaseRemote from './remote/BaseRemote';
3
- import { ApplicationMode, BroadcastData } from './types';
4
- import { AppSettings } from '@/utils/detectSettings';
5
- export declare enum ToolEvents {
6
- CUSTOM = "ToolEvents::custom",
7
- REMOTE_CONNECTED = "ToolEvents::remoteConnected",
8
- REMOTE_DISCONNECTED = "ToolEvents::remoteDisconnected",
9
- SELECT_DROPDOWN = "ToolEvents::selectDropdown",
10
- DRAG_UPDATE = "ToolEvents::dragUpdate",
11
- ADD_SCENE = "ToolEvents::addScene",
12
- REFRESH_SCENE = "ToolEvents::refreshScene",
13
- REMOVE_SCENE = "ToolEvents::removeScene",
14
- SET_SCENE = "ToolEvents::setScene",
15
- GET_OBJECT = "ToolEvents::getObject",
16
- SET_OBJECT = "ToolEvents::setObject",
17
- CLEAR_OBJECT = "ToolEvents::clearObject",
18
- UPDATE_OBJECT = "ToolEvents::updateObject",
19
- CREATE_TEXTURE = "ToolEvents::createTexture",
20
- REQUEST_METHOD = "ToolEvents::requestMethod",
21
- ADD_CAMERA = "ToolEvents::addCamera",
22
- REMOVE_CAMERA = "ToolEvents::removeCamera",
23
- ADD_GROUP = "ToolEvents::addGroup",
24
- REMOVE_GROUP = "ToolEvents::removeGroup",
25
- ADD_SPLINE = "ToolEvents::addSpline",
26
- ADD_RENDERER = "ToolEvents::addRenderer",
27
- UPDATE_RENDERER = "ToolEvents::updateRenderer"
28
- }
29
- export type ToolEvent = {
30
- [key in ToolEvents]: {
31
- value?: unknown;
32
- };
33
- };
34
- export type RemoteCallback = (msg: BroadcastData) => void;
35
- export interface RemoteCall {
36
- remote: any;
37
- callback: RemoteCallback;
38
- }
39
- export declare class Application extends EventDispatcher<ToolEvent> {
40
- assets: {
41
- audio: Map<string, any>;
42
- image: Map<string, ImageBitmap>;
43
- json: Map<string, any>;
44
- model: Map<string, any>;
45
- video: Map<string, any>;
46
- };
47
- components: Map<string, any>;
48
- settings: AppSettings;
49
- appHandlers: RemoteCall[];
50
- editorHandlers: RemoteCall[];
51
- onUpdateCallback?: () => void;
52
- protected _appID: string;
53
- protected _mode: ApplicationMode;
54
- protected _broadcastChannel?: BroadcastChannel | undefined;
55
- protected _webSocket?: WebSocket | undefined;
56
- protected _connected: boolean;
57
- protected _useBC: boolean;
58
- protected playing: boolean;
59
- protected rafID: number;
60
- protected _pingInterval?: number;
61
- protected _lastPingTime: number;
62
- protected _pingTimeout: number;
63
- protected _peerConnected: boolean;
64
- constructor(id: string);
65
- dispose(): void;
66
- detectSettings(dev?: boolean, editor?: boolean): Promise<void>;
67
- update(): void;
68
- draw(): void;
69
- play: () => void;
70
- pause: () => void;
71
- private onUpdate;
72
- setupRemote(useBC?: boolean): void;
73
- addComponent(name: string, component: BaseRemote): void;
74
- send(data: BroadcastData): void;
75
- private messageHandler;
76
- private handleAppBroadcast;
77
- private handleEditorBroadcast;
78
- private openHandler;
79
- private closeHandler;
80
- get appID(): string;
81
- get connected(): boolean;
82
- get debugEnabled(): boolean;
83
- get mode(): ApplicationMode;
84
- get isApp(): boolean;
85
- set isApp(value: boolean);
86
- get editor(): boolean;
87
- set editor(value: boolean);
88
- get peerConnected(): boolean;
89
- private startPing;
90
- private stopPing;
91
- private sendPing;
92
- private handlePing;
93
- private checkPingTimeout;
94
- }
1
+ import { EventDispatcher } from 'three';
2
+ import BaseRemote from './remote/BaseRemote';
3
+ import { ApplicationMode, BroadcastData } from './types';
4
+ import { AppSettings } from '@/utils/detectSettings';
5
+ export declare enum ToolEvents {
6
+ CUSTOM = "ToolEvents::custom",
7
+ REMOTE_CONNECTED = "ToolEvents::remoteConnected",
8
+ REMOTE_DISCONNECTED = "ToolEvents::remoteDisconnected",
9
+ SELECT_DROPDOWN = "ToolEvents::selectDropdown",
10
+ DRAG_UPDATE = "ToolEvents::dragUpdate",
11
+ ADD_SCENE = "ToolEvents::addScene",
12
+ REFRESH_SCENE = "ToolEvents::refreshScene",
13
+ REMOVE_SCENE = "ToolEvents::removeScene",
14
+ SET_SCENE = "ToolEvents::setScene",
15
+ GET_OBJECT = "ToolEvents::getObject",
16
+ SET_OBJECT = "ToolEvents::setObject",
17
+ CLEAR_OBJECT = "ToolEvents::clearObject",
18
+ UPDATE_OBJECT = "ToolEvents::updateObject",
19
+ CREATE_TEXTURE = "ToolEvents::createTexture",
20
+ REQUEST_METHOD = "ToolEvents::requestMethod",
21
+ ADD_CAMERA = "ToolEvents::addCamera",
22
+ REMOVE_CAMERA = "ToolEvents::removeCamera",
23
+ ADD_GROUP = "ToolEvents::addGroup",
24
+ REMOVE_GROUP = "ToolEvents::removeGroup",
25
+ ADD_SPLINE = "ToolEvents::addSpline",
26
+ ADD_RENDERER = "ToolEvents::addRenderer",
27
+ UPDATE_RENDERER = "ToolEvents::updateRenderer"
28
+ }
29
+ export type ToolEvent = {
30
+ [key in ToolEvents]: {
31
+ value?: unknown;
32
+ };
33
+ };
34
+ export type RemoteCallback = (msg: BroadcastData) => void;
35
+ export interface RemoteCall {
36
+ remote: any;
37
+ callback: RemoteCallback;
38
+ }
39
+ export declare class Application extends EventDispatcher<ToolEvent> {
40
+ assets: {
41
+ audio: Map<string, any>;
42
+ image: Map<string, ImageBitmap>;
43
+ json: Map<string, any>;
44
+ model: Map<string, any>;
45
+ video: Map<string, any>;
46
+ };
47
+ components: Map<string, any>;
48
+ settings: AppSettings;
49
+ appHandlers: RemoteCall[];
50
+ editorHandlers: RemoteCall[];
51
+ onUpdateCallback?: () => void;
52
+ protected _appID: string;
53
+ protected _mode: ApplicationMode;
54
+ protected _broadcastChannel?: BroadcastChannel | undefined;
55
+ protected _webSocket?: WebSocket | undefined;
56
+ protected _connected: boolean;
57
+ protected _useBC: boolean;
58
+ protected playing: boolean;
59
+ protected rafID: number;
60
+ protected _pingInterval?: number;
61
+ protected _lastPingTime: number;
62
+ protected _pingTimeout: number;
63
+ protected _peerConnected: boolean;
64
+ constructor(id: string);
65
+ dispose(): void;
66
+ detectSettings(dev?: boolean, editor?: boolean): Promise<void>;
67
+ update(): void;
68
+ draw(): void;
69
+ play: () => void;
70
+ pause: () => void;
71
+ private onUpdate;
72
+ setupRemote(useBC?: boolean): void;
73
+ addComponent(name: string, component: BaseRemote): void;
74
+ send(data: BroadcastData): void;
75
+ private messageHandler;
76
+ private handleAppBroadcast;
77
+ private handleEditorBroadcast;
78
+ private openHandler;
79
+ private closeHandler;
80
+ get appID(): string;
81
+ get connected(): boolean;
82
+ get debugEnabled(): boolean;
83
+ get mode(): ApplicationMode;
84
+ get isApp(): boolean;
85
+ set isApp(value: boolean);
86
+ get editor(): boolean;
87
+ set editor(value: boolean);
88
+ get peerConnected(): boolean;
89
+ private startPing;
90
+ private stopPing;
91
+ private sendPing;
92
+ private handlePing;
93
+ private checkPingTimeout;
94
+ }
@@ -1,42 +1,42 @@
1
- import { Camera, Curve, RenderTargetOptions, Scene, WebGLRenderTarget } from 'three';
2
- import BaseRemote from './BaseRemote';
3
- import { BroadcastData, GroupData } from '../types';
4
- export default class RemoteThree extends BaseRemote {
5
- canvas: HTMLCanvasElement | null;
6
- inputElement: any;
7
- scene?: Scene;
8
- scenes: Map<string, Scene>;
9
- renderer?: any;
10
- renderTargets: Map<string, WebGLRenderTarget>;
11
- private renderTargetsResize;
12
- private groups;
13
- dispose(): void;
14
- getObject(uuid: string): void;
15
- setObject(value: any): void;
16
- requestMethod(uuid: string, key: string, value?: any, subitem?: string): void;
17
- updateObject(uuid: string, key: string, value: any): void;
18
- createTexture(uuid: string, key: string, value: any): void;
19
- addGroup(data: GroupData): void;
20
- removeGroup(name: string): void;
21
- updateGroup(group: string, prop: string, value: any): void;
22
- addSpline(spline: Curve<any>): void;
23
- setRenderer(value: any, inputElement?: any): void;
24
- updateRenderer(data: any): void;
25
- addScene(value: Scene): void;
26
- refreshScene(value: string): void;
27
- removeScene(value: Scene): void;
28
- removeAllScenes(): void;
29
- getScene(uuid: string): Scene | null;
30
- setScene(value: Scene): void;
31
- addCamera(camera: Camera): void;
32
- removeCamera(camera: Camera): void;
33
- handleApp(msg: BroadcastData): void;
34
- handleEditor(msg: BroadcastData): void;
35
- addRT(name: string, resize?: boolean, params?: RenderTargetOptions): void;
36
- removeRT(name: string): void;
37
- resize(width: number, height: number): void;
38
- set dpr(value: number);
39
- get dpr(): number;
40
- get width(): number;
41
- get height(): number;
42
- }
1
+ import { Camera, Curve, RenderTargetOptions, Scene, WebGLRenderTarget } from 'three';
2
+ import BaseRemote from './BaseRemote';
3
+ import { BroadcastData, GroupData } from '../types';
4
+ export default class RemoteThree extends BaseRemote {
5
+ canvas: HTMLCanvasElement | null;
6
+ inputElement: any;
7
+ scene?: Scene;
8
+ scenes: Map<string, Scene>;
9
+ renderer?: any;
10
+ renderTargets: Map<string, WebGLRenderTarget>;
11
+ private renderTargetsResize;
12
+ private groups;
13
+ dispose(): void;
14
+ getObject(uuid: string): void;
15
+ setObject(value: any): void;
16
+ requestMethod(uuid: string, key: string, value?: any, subitem?: string): void;
17
+ updateObject(uuid: string, key: string, value: any): void;
18
+ createTexture(uuid: string, key: string, value: any): void;
19
+ addGroup(data: GroupData): void;
20
+ removeGroup(name: string): void;
21
+ updateGroup(group: string, prop: string, value: any): void;
22
+ addSpline(spline: Curve<any>): void;
23
+ setRenderer(value: any, inputElement?: any): void;
24
+ updateRenderer(data: any): void;
25
+ addScene(value: Scene): void;
26
+ refreshScene(value: string): void;
27
+ removeScene(value: Scene): void;
28
+ removeAllScenes(): void;
29
+ getScene(uuid: string): Scene | null;
30
+ setScene(value: Scene): void;
31
+ addCamera(camera: Camera): void;
32
+ removeCamera(camera: Camera): void;
33
+ handleApp(msg: BroadcastData): void;
34
+ handleEditor(msg: BroadcastData): void;
35
+ addRT(name: string, resize?: boolean, params?: RenderTargetOptions): void;
36
+ removeRT(name: string): void;
37
+ resize(width: number, height: number): void;
38
+ set dpr(value: number);
39
+ get dpr(): number;
40
+ get width(): number;
41
+ get height(): number;
42
+ }
@@ -1,40 +1,40 @@
1
- import { InspectorFieldType } from '@/editor/sidePanel/inspector/InspectorField';
2
- export interface BroadcastData {
3
- target: ApplicationMode;
4
- event: EditorEvent;
5
- data?: any;
6
- }
7
- export type OptionInfo = {
8
- title: string;
9
- value: any;
10
- };
11
- export interface GroupItemData {
12
- type: InspectorFieldType;
13
- prop: string;
14
- title?: string;
15
- value?: any;
16
- min?: number;
17
- max?: number;
18
- step?: number;
19
- disabled?: boolean;
20
- options?: OptionInfo[];
21
- }
22
- export interface GroupData {
23
- title: string;
24
- expanded?: boolean;
25
- items: GroupItemData[];
26
- onUpdate: (prop: string, value: any) => void;
27
- }
28
- export interface GroupCallback {
29
- title: string;
30
- onUpdate: (prop: string, value: any) => void;
31
- }
32
- export type ApplicationMode = 'app' | 'editor';
33
- export type VoidCallback = () => void;
34
- export type DataUpdateCallback = (data: any) => void;
35
- export type EditorEvent = 'custom' | 'ping' | 'setSheet' | 'setSheetObject' | 'updateSheetObject' | 'updateTimeline' | 'playSheet' | 'pauseSheet' | 'getObject' | 'setObject' | 'updateObject' | 'addScene' | 'refreshScene' | 'removeScene' | 'setScene' | 'createTexture' | 'requestMethod' | 'addCamera' | 'removeCamera' | 'addSpline' | 'addRenderer' | 'updateRenderer' | 'addFolder' | 'bindObject' | 'updateBind' | 'addButton' | 'clickButton' | 'selectComponent' | 'draggableListUpdate' | 'addGroup' | 'removeGroup' | 'updateGroup';
36
- export type VoidFunc = () => void;
37
- export type BroadcastCallback = (data: BroadcastData) => void;
38
- export type TheatreUpdateCallback = (data: any) => void;
39
- export declare const noop: () => void;
40
- export declare const defaultTheatreCallback: TheatreUpdateCallback;
1
+ import { InspectorFieldType } from '@/editor/sidePanel/inspector/InspectorField';
2
+ export interface BroadcastData {
3
+ target: ApplicationMode;
4
+ event: EditorEvent;
5
+ data?: any;
6
+ }
7
+ export type OptionInfo = {
8
+ title: string;
9
+ value: any;
10
+ };
11
+ export interface GroupItemData {
12
+ type: InspectorFieldType;
13
+ prop: string;
14
+ title?: string;
15
+ value?: any;
16
+ min?: number;
17
+ max?: number;
18
+ step?: number;
19
+ disabled?: boolean;
20
+ options?: OptionInfo[];
21
+ }
22
+ export interface GroupData {
23
+ title: string;
24
+ expanded?: boolean;
25
+ items: GroupItemData[];
26
+ onUpdate: (prop: string, value: any) => void;
27
+ }
28
+ export interface GroupCallback {
29
+ title: string;
30
+ onUpdate: (prop: string, value: any) => void;
31
+ }
32
+ export type ApplicationMode = 'app' | 'editor';
33
+ export type VoidCallback = () => void;
34
+ export type DataUpdateCallback = (data: any) => void;
35
+ export type EditorEvent = 'custom' | 'ping' | 'setSheet' | 'setSheetObject' | 'updateSheetObject' | 'updateTimeline' | 'playSheet' | 'pauseSheet' | 'getObject' | 'setObject' | 'updateObject' | 'addScene' | 'refreshScene' | 'removeScene' | 'setScene' | 'createTexture' | 'requestMethod' | 'addCamera' | 'removeCamera' | 'addSpline' | 'addRenderer' | 'updateRenderer' | 'addFolder' | 'bindObject' | 'updateBind' | 'addButton' | 'clickButton' | 'selectComponent' | 'draggableListUpdate' | 'addGroup' | 'removeGroup' | 'updateGroup';
36
+ export type VoidFunc = () => void;
37
+ export type BroadcastCallback = (data: BroadcastData) => void;
38
+ export type TheatreUpdateCallback = (data: any) => void;
39
+ export declare const noop: () => void;
40
+ export declare const defaultTheatreCallback: TheatreUpdateCallback;
@@ -1,131 +1,131 @@
1
- import { Component, ReactNode } from 'react';
2
- import { Camera, Group, Object3D, OrthographicCamera, PerspectiveCamera, Scene, WebGLRenderer } from 'three';
3
- import WebGPURenderer from 'three/src/renderers/webgpu/WebGPURenderer';
4
- import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
5
- import RemoteThree from '@/core/remote/RemoteThree';
6
- import { InteractionMode, MultiViewMode } from './MultiViewData';
7
- import { Application } from '@/core/Application';
8
- import './MultiView.scss';
9
- type MultiViewProps = {
10
- app: Application;
11
- three: RemoteThree;
12
- scenes: Map<string, any>;
13
- onSceneSet?: (scene: Scene) => void;
14
- onSceneUpdate?: (scene: Scene) => void;
15
- onSceneResize?: (scene: Scene, width: number, height: number) => void;
16
- };
17
- type MultiViewState = {
18
- mode: MultiViewMode;
19
- modeOpen: boolean;
20
- renderModeOpen: boolean;
21
- interactionMode: InteractionMode;
22
- interactionModeOpen: boolean;
23
- lastUpdate: number;
24
- connected: boolean;
25
- };
26
- export default class MultiView extends Component<MultiViewProps, MultiViewState> {
27
- static instance: MultiView | null;
28
- app: Application;
29
- scene: Scene;
30
- renderer?: WebGLRenderer | WebGPURenderer | null;
31
- currentScene?: Scene;
32
- scenes: Map<string, Scene>;
33
- cameras: Map<string, Camera>;
34
- controls: Map<string, OrbitControls>;
35
- currentCamera: PerspectiveCamera | OrthographicCamera;
36
- currentWindow: any;
37
- helpersContainer: Group<import("three").Object3DEventMap>;
38
- private cameraHelpers;
39
- private lightHelpers;
40
- private grid;
41
- private interactionHelper;
42
- private currentTransform?;
43
- private splineEditor;
44
- private depthMaterial;
45
- private normalsMaterial;
46
- private uvMaterial;
47
- private wireframeMaterial;
48
- private playing;
49
- private rafID;
50
- private cameraControlsRafID;
51
- private width;
52
- private height;
53
- private tlCam;
54
- private trCam;
55
- private blCam;
56
- private brCam;
57
- private tlRender;
58
- private trRender;
59
- private blRender;
60
- private brRender;
61
- private cameraVisibility;
62
- private lightVisibility;
63
- private gridVisibility;
64
- selectedItem: Object3D | undefined;
65
- private debugCamera;
66
- private raycaster;
67
- private pointer;
68
- private cameraControls;
69
- private canvasRef;
70
- private containerRef;
71
- private tlWindow;
72
- private trWindow;
73
- private blWindow;
74
- private brWindow;
75
- private editorCameras;
76
- constructor(props: MultiViewProps);
77
- componentDidMount(): void;
78
- componentDidUpdate(prevProps: Readonly<MultiViewProps>, prevState: Readonly<MultiViewState>, snapshot?: any): void;
79
- componentWillUnmount(): void;
80
- render(): ReactNode;
81
- private setupRenderer;
82
- private setupScene;
83
- private setupTools;
84
- play(): void;
85
- pause(): void;
86
- toggleOrbitControls(value: boolean): void;
87
- clear(): void;
88
- private update;
89
- private draw;
90
- private onUpdate;
91
- private enable;
92
- private disable;
93
- private resize;
94
- private addScene;
95
- private sceneUpdate;
96
- private removeScene;
97
- private addCamera;
98
- private removeCamera;
99
- private onMouseMove;
100
- private onClick;
101
- private onKey;
102
- private onSetSelectedItem;
103
- private updateSelectedItemHelper;
104
- private onUpdateTransform;
105
- private onRemoteConnected;
106
- private onRemoteDisconnected;
107
- private clearLightHelpers;
108
- private addLightHelpers;
109
- private createControls;
110
- private clearCamera;
111
- private killControls;
112
- private assignControls;
113
- private updateCamera;
114
- private updateCameraControls;
115
- private clearControls;
116
- private saveExpandedCameraVisibility;
117
- private saveExpandedLightVisibility;
118
- private saveExpandedGridVisibility;
119
- private getSceneOverride;
120
- private drawTo;
121
- private drawSingle;
122
- private drawDouble;
123
- private drawQuad;
124
- get appID(): string;
125
- get mode(): MultiViewMode;
126
- get three(): RemoteThree;
127
- get expandedCameraVisibility(): string;
128
- get expandedLightVisibility(): string;
129
- get expandedGridVisibility(): string;
130
- }
131
- export {};
1
+ import { Component, ReactNode } from 'react';
2
+ import { Camera, Group, Object3D, OrthographicCamera, PerspectiveCamera, Scene, WebGLRenderer } from 'three';
3
+ import WebGPURenderer from 'three/src/renderers/webgpu/WebGPURenderer';
4
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
5
+ import RemoteThree from '@/core/remote/RemoteThree';
6
+ import { InteractionMode, MultiViewMode } from './MultiViewData';
7
+ import { Application } from '@/core/Application';
8
+ import './MultiView.scss';
9
+ type MultiViewProps = {
10
+ app: Application;
11
+ three: RemoteThree;
12
+ scenes: Map<string, any>;
13
+ onSceneSet?: (scene: Scene) => void;
14
+ onSceneUpdate?: (scene: Scene) => void;
15
+ onSceneResize?: (scene: Scene, width: number, height: number) => void;
16
+ };
17
+ type MultiViewState = {
18
+ mode: MultiViewMode;
19
+ modeOpen: boolean;
20
+ renderModeOpen: boolean;
21
+ interactionMode: InteractionMode;
22
+ interactionModeOpen: boolean;
23
+ lastUpdate: number;
24
+ connected: boolean;
25
+ };
26
+ export default class MultiView extends Component<MultiViewProps, MultiViewState> {
27
+ static instance: MultiView | null;
28
+ app: Application;
29
+ scene: Scene;
30
+ renderer?: WebGLRenderer | WebGPURenderer | null;
31
+ currentScene?: Scene;
32
+ scenes: Map<string, Scene>;
33
+ cameras: Map<string, Camera>;
34
+ controls: Map<string, OrbitControls>;
35
+ currentCamera: PerspectiveCamera | OrthographicCamera;
36
+ currentWindow: any;
37
+ helpersContainer: Group<import("three").Object3DEventMap>;
38
+ private cameraHelpers;
39
+ private lightHelpers;
40
+ private grid;
41
+ private interactionHelper;
42
+ private currentTransform?;
43
+ private splineEditor;
44
+ private depthMaterial;
45
+ private normalsMaterial;
46
+ private uvMaterial;
47
+ private wireframeMaterial;
48
+ private playing;
49
+ private rafID;
50
+ private cameraControlsRafID;
51
+ private width;
52
+ private height;
53
+ private tlCam;
54
+ private trCam;
55
+ private blCam;
56
+ private brCam;
57
+ private tlRender;
58
+ private trRender;
59
+ private blRender;
60
+ private brRender;
61
+ private cameraVisibility;
62
+ private lightVisibility;
63
+ private gridVisibility;
64
+ selectedItem: Object3D | undefined;
65
+ private debugCamera;
66
+ private raycaster;
67
+ private pointer;
68
+ private cameraControls;
69
+ private canvasRef;
70
+ private containerRef;
71
+ private tlWindow;
72
+ private trWindow;
73
+ private blWindow;
74
+ private brWindow;
75
+ private editorCameras;
76
+ constructor(props: MultiViewProps);
77
+ componentDidMount(): void;
78
+ componentDidUpdate(prevProps: Readonly<MultiViewProps>, prevState: Readonly<MultiViewState>, snapshot?: any): void;
79
+ componentWillUnmount(): void;
80
+ render(): ReactNode;
81
+ private setupRenderer;
82
+ private setupScene;
83
+ private setupTools;
84
+ play(): void;
85
+ pause(): void;
86
+ toggleOrbitControls(value: boolean): void;
87
+ clear(): void;
88
+ private update;
89
+ private draw;
90
+ private onUpdate;
91
+ private enable;
92
+ private disable;
93
+ private resize;
94
+ private addScene;
95
+ private sceneUpdate;
96
+ private removeScene;
97
+ private addCamera;
98
+ private removeCamera;
99
+ private onMouseMove;
100
+ private onClick;
101
+ private onKey;
102
+ private onSetSelectedItem;
103
+ private updateSelectedItemHelper;
104
+ private onUpdateTransform;
105
+ private onRemoteConnected;
106
+ private onRemoteDisconnected;
107
+ private clearLightHelpers;
108
+ private addLightHelpers;
109
+ private createControls;
110
+ private clearCamera;
111
+ private killControls;
112
+ private assignControls;
113
+ private updateCamera;
114
+ private updateCameraControls;
115
+ private clearControls;
116
+ private saveExpandedCameraVisibility;
117
+ private saveExpandedLightVisibility;
118
+ private saveExpandedGridVisibility;
119
+ private getSceneOverride;
120
+ private drawTo;
121
+ private drawSingle;
122
+ private drawDouble;
123
+ private drawQuad;
124
+ get appID(): string;
125
+ get mode(): MultiViewMode;
126
+ get three(): RemoteThree;
127
+ get expandedCameraVisibility(): string;
128
+ get expandedLightVisibility(): string;
129
+ get expandedGridVisibility(): string;
130
+ }
131
+ export {};
@@ -1,28 +1,28 @@
1
- import { Component, ReactNode, RefObject } from 'react';
2
- import { Application } from '@/core/Application';
3
- import RemoteThree from '@/core/remote/RemoteThree';
4
- import { GroupData } from '@/core/types';
5
- import InspectorGroup from './inspector/InspectorGroup';
6
- interface DebugDataProps {
7
- app: Application;
8
- three: RemoteThree;
9
- }
10
- type DebugDataState = {
11
- lastUpdate: number;
12
- };
13
- export default class DebugData extends Component<DebugDataProps, DebugDataState> {
14
- static instance: DebugData;
15
- static groups: JSX.Element[];
16
- static groupsRefs: RefObject<InspectorGroup>[];
17
- static groupTitles: string[];
18
- static app: Application;
19
- constructor(props: DebugDataProps);
20
- componentWillUnmount(): void;
21
- render(): ReactNode;
22
- private addGroup;
23
- private removeGroup;
24
- static addEditorGroup(data: GroupData): RefObject<InspectorGroup> | null;
25
- static removeEditorGroup(name: string): void;
26
- static removeAllGroups(): void;
27
- }
28
- export {};
1
+ import { Component, ReactNode, RefObject } from 'react';
2
+ import { Application } from '@/core/Application';
3
+ import RemoteThree from '@/core/remote/RemoteThree';
4
+ import { GroupData } from '@/core/types';
5
+ import InspectorGroup from './inspector/InspectorGroup';
6
+ interface DebugDataProps {
7
+ app: Application;
8
+ three: RemoteThree;
9
+ }
10
+ type DebugDataState = {
11
+ lastUpdate: number;
12
+ };
13
+ export default class DebugData extends Component<DebugDataProps, DebugDataState> {
14
+ static instance: DebugData;
15
+ static groups: JSX.Element[];
16
+ static groupsRefs: RefObject<InspectorGroup>[];
17
+ static groupTitles: string[];
18
+ static app: Application;
19
+ constructor(props: DebugDataProps);
20
+ componentWillUnmount(): void;
21
+ render(): ReactNode;
22
+ private addGroup;
23
+ private removeGroup;
24
+ static addEditorGroup(data: GroupData): RefObject<InspectorGroup> | null;
25
+ static removeEditorGroup(name: string): void;
26
+ static removeAllGroups(): void;
27
+ }
28
+ export {};