mage-engine 3.17.5 → 3.17.8

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.
Files changed (2) hide show
  1. package/dist/mage.js +1776 -1461
  2. package/package.json +1 -1
package/dist/mage.js CHANGED
@@ -224,6 +224,10 @@ function _get() {
224
224
  return _get.apply(this, arguments);
225
225
  }
226
226
 
227
+ function _slicedToArray(arr, i) {
228
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
229
+ }
230
+
227
231
  function _toConsumableArray(arr) {
228
232
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
229
233
  }
@@ -232,10 +236,44 @@ function _arrayWithoutHoles(arr) {
232
236
  if (Array.isArray(arr)) return _arrayLikeToArray(arr);
233
237
  }
234
238
 
239
+ function _arrayWithHoles(arr) {
240
+ if (Array.isArray(arr)) return arr;
241
+ }
242
+
235
243
  function _iterableToArray(iter) {
236
244
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
237
245
  }
238
246
 
247
+ function _iterableToArrayLimit(arr, i) {
248
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
249
+
250
+ if (_i == null) return;
251
+ var _arr = [];
252
+ var _n = true;
253
+ var _d = false;
254
+
255
+ var _s, _e;
256
+
257
+ try {
258
+ for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
259
+ _arr.push(_s.value);
260
+
261
+ if (i && _arr.length === i) break;
262
+ }
263
+ } catch (err) {
264
+ _d = true;
265
+ _e = err;
266
+ } finally {
267
+ try {
268
+ if (!_n && _i["return"] != null) _i["return"]();
269
+ } finally {
270
+ if (_d) throw _e;
271
+ }
272
+ }
273
+
274
+ return _arr;
275
+ }
276
+
239
277
  function _unsupportedIterableToArray(o, minLen) {
240
278
  if (!o) return;
241
279
  if (typeof o === "string") return _arrayLikeToArray(o, minLen);
@@ -257,6 +295,10 @@ function _nonIterableSpread() {
257
295
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
258
296
  }
259
297
 
298
+ function _nonIterableRest() {
299
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
300
+ }
301
+
260
302
  function _createForOfIteratorHelper(o, allowArrayLike) {
261
303
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
262
304
 
@@ -50438,7 +50480,7 @@ class ArrowHelper extends Object3D {
50438
50480
 
50439
50481
  }
50440
50482
 
50441
- class AxesHelper extends LineSegments {
50483
+ class AxesHelper$1 extends LineSegments {
50442
50484
 
50443
50485
  constructor( size = 1 ) {
50444
50486
 
@@ -51672,7 +51714,7 @@ Path.prototype.fromPoints = function ( points ) {
51672
51714
  function AxisHelper( size ) {
51673
51715
 
51674
51716
  console.warn( 'THREE.AxisHelper has been renamed to THREE.AxesHelper.' );
51675
- return new AxesHelper( size );
51717
+ return new AxesHelper$1( size );
51676
51718
 
51677
51719
  }
51678
51720
 
@@ -53542,10 +53584,13 @@ if ( typeof window !== 'undefined' ) {
53542
53584
 
53543
53585
  }
53544
53586
 
53545
- }var three_module=/*#__PURE__*/Object.freeze({__proto__:null,ACESFilmicToneMapping:ACESFilmicToneMapping,AddEquation:AddEquation,AddOperation:AddOperation,AdditiveAnimationBlendMode:AdditiveAnimationBlendMode,AdditiveBlending:AdditiveBlending,AlphaFormat:AlphaFormat,AlwaysDepth:AlwaysDepth,AlwaysStencilFunc:AlwaysStencilFunc,AmbientLight:AmbientLight$1,AmbientLightProbe:AmbientLightProbe,AnimationClip:AnimationClip,AnimationLoader:AnimationLoader,AnimationMixer:AnimationMixer,AnimationObjectGroup:AnimationObjectGroup,AnimationUtils:AnimationUtils,ArcCurve:ArcCurve,ArrayCamera:ArrayCamera,ArrowHelper:ArrowHelper,Audio:Audio$2,AudioAnalyser:AudioAnalyser,AudioContext:AudioContext,AudioListener:AudioListener,AudioLoader:AudioLoader,AxesHelper:AxesHelper,AxisHelper:AxisHelper,BackSide:BackSide,BasicDepthPacking:BasicDepthPacking,BasicShadowMap:BasicShadowMap,BinaryTextureLoader:BinaryTextureLoader,Bone:Bone,BooleanKeyframeTrack:BooleanKeyframeTrack,BoundingBoxHelper:BoundingBoxHelper,Box2:Box2,Box3:Box3,Box3Helper:Box3Helper,BoxBufferGeometry:BoxGeometry,BoxGeometry:BoxGeometry,BoxHelper:BoxHelper,BufferAttribute:BufferAttribute,BufferGeometry:BufferGeometry,BufferGeometryLoader:BufferGeometryLoader,ByteType:ByteType,Cache:Cache,Camera:Camera$1,CameraHelper:CameraHelper,CanvasRenderer:CanvasRenderer,CanvasTexture:CanvasTexture,CatmullRomCurve3:CatmullRomCurve3,CineonToneMapping:CineonToneMapping,CircleBufferGeometry:CircleGeometry,CircleGeometry:CircleGeometry,ClampToEdgeWrapping:ClampToEdgeWrapping,Clock:Clock,Color:Color$1,ColorKeyframeTrack:ColorKeyframeTrack,CompressedTexture:CompressedTexture,CompressedTextureLoader:CompressedTextureLoader,ConeBufferGeometry:ConeGeometry,ConeGeometry:ConeGeometry,CubeCamera:CubeCamera,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,CubeTexture:CubeTexture,CubeTextureLoader:CubeTextureLoader,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,CubicInterpolant:CubicInterpolant,CullFaceBack:CullFaceBack,CullFaceFront:CullFaceFront,CullFaceFrontBack:CullFaceFrontBack,CullFaceNone:CullFaceNone,Curve:Curve,CurvePath:CurvePath,CustomBlending:CustomBlending,CustomToneMapping:CustomToneMapping,CylinderBufferGeometry:CylinderGeometry,CylinderGeometry:CylinderGeometry,Cylindrical:Cylindrical,DataTexture:DataTexture,DataTexture2DArray:DataTexture2DArray,DataTexture3D:DataTexture3D,DataTextureLoader:DataTextureLoader,DataUtils:DataUtils,DecrementStencilOp:DecrementStencilOp,DecrementWrapStencilOp:DecrementWrapStencilOp,DefaultLoadingManager:DefaultLoadingManager,DepthFormat:DepthFormat,DepthStencilFormat:DepthStencilFormat,DepthTexture:DepthTexture,DirectionalLight:DirectionalLight,DirectionalLightHelper:DirectionalLightHelper,DiscreteInterpolant:DiscreteInterpolant,DodecahedronBufferGeometry:DodecahedronGeometry,DodecahedronGeometry:DodecahedronGeometry,DoubleSide:DoubleSide,DstAlphaFactor:DstAlphaFactor,DstColorFactor:DstColorFactor,DynamicBufferAttribute:DynamicBufferAttribute,DynamicCopyUsage:DynamicCopyUsage,DynamicDrawUsage:DynamicDrawUsage,DynamicReadUsage:DynamicReadUsage,EdgesGeometry:EdgesGeometry,EdgesHelper:EdgesHelper,EllipseCurve:EllipseCurve,EqualDepth:EqualDepth,EqualStencilFunc:EqualStencilFunc,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,Euler:Euler,EventDispatcher:EventDispatcher,ExtrudeBufferGeometry:ExtrudeGeometry,ExtrudeGeometry:ExtrudeGeometry,FaceColors:FaceColors,FileLoader:FileLoader,FlatShading:FlatShading,Float16BufferAttribute:Float16BufferAttribute,Float32Attribute:Float32Attribute,Float32BufferAttribute:Float32BufferAttribute,Float64Attribute:Float64Attribute,Float64BufferAttribute:Float64BufferAttribute,FloatType:FloatType$1,Fog:Fog,FogExp2:FogExp2,Font:Font,FontLoader:FontLoader,FrontSide:FrontSide,Frustum:Frustum$1,GLBufferAttribute:GLBufferAttribute,GLSL1:GLSL1,GLSL3:GLSL3,GammaEncoding:GammaEncoding,GreaterDepth:GreaterDepth,GreaterEqualDepth:GreaterEqualDepth,GreaterEqualStencilFunc:GreaterEqualStencilFunc,GreaterStencilFunc:GreaterStencilFunc,GridHelper:GridHelper,Group:Group,HalfFloatType:HalfFloatType,HemisphereLight:HemisphereLight$1,HemisphereLightHelper:HemisphereLightHelper,HemisphereLightProbe:HemisphereLightProbe,IcosahedronBufferGeometry:IcosahedronGeometry,IcosahedronGeometry:IcosahedronGeometry,ImageBitmapLoader:ImageBitmapLoader,ImageLoader:ImageLoader,ImageUtils:ImageUtils,ImmediateRenderObject:ImmediateRenderObject,IncrementStencilOp:IncrementStencilOp,IncrementWrapStencilOp:IncrementWrapStencilOp,InstancedBufferAttribute:InstancedBufferAttribute,InstancedBufferGeometry:InstancedBufferGeometry,InstancedInterleavedBuffer:InstancedInterleavedBuffer,InstancedMesh:InstancedMesh,Int16Attribute:Int16Attribute,Int16BufferAttribute:Int16BufferAttribute,Int32Attribute:Int32Attribute,Int32BufferAttribute:Int32BufferAttribute,Int8Attribute:Int8Attribute,Int8BufferAttribute:Int8BufferAttribute,IntType:IntType,InterleavedBuffer:InterleavedBuffer,InterleavedBufferAttribute:InterleavedBufferAttribute,Interpolant:Interpolant,InterpolateDiscrete:InterpolateDiscrete,InterpolateLinear:InterpolateLinear,InterpolateSmooth:InterpolateSmooth,InvertStencilOp:InvertStencilOp,JSONLoader:JSONLoader,KeepStencilOp:KeepStencilOp,KeyframeTrack:KeyframeTrack,LOD:LOD,LatheBufferGeometry:LatheGeometry,LatheGeometry:LatheGeometry,Layers:Layers,LensFlare:LensFlare,LessDepth:LessDepth,LessEqualDepth:LessEqualDepth,LessEqualStencilFunc:LessEqualStencilFunc,LessStencilFunc:LessStencilFunc,Light:Light$1,LightProbe:LightProbe,Line:Line$1,Line3:Line3,LineBasicMaterial:LineBasicMaterial,LineCurve:LineCurve,LineCurve3:LineCurve3,LineDashedMaterial:LineDashedMaterial,LineLoop:LineLoop,LinePieces:LinePieces,LineSegments:LineSegments,LineStrip:LineStrip,LinearEncoding:LinearEncoding,LinearFilter:LinearFilter,LinearInterpolant:LinearInterpolant,LinearMipMapLinearFilter:LinearMipMapLinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipmapLinearFilter:LinearMipmapLinearFilter,LinearMipmapNearestFilter:LinearMipmapNearestFilter,LinearToneMapping:LinearToneMapping,Loader:Loader$1,LoaderUtils:LoaderUtils,LoadingManager:LoadingManager,LogLuvEncoding:LogLuvEncoding,LoopOnce:LoopOnce,LoopPingPong:LoopPingPong,LoopRepeat:LoopRepeat,LuminanceAlphaFormat:LuminanceAlphaFormat,LuminanceFormat:LuminanceFormat,MOUSE:MOUSE,Material:Material,MaterialLoader:MaterialLoader,Math:MathUtils,MathUtils:MathUtils,Matrix3:Matrix3,Matrix4:Matrix4,MaxEquation:MaxEquation,Mesh:Mesh,MeshBasicMaterial:MeshBasicMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshFaceMaterial:MeshFaceMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshMatcapMaterial:MeshMatcapMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshToonMaterial:MeshToonMaterial,MinEquation:MinEquation,MirroredRepeatWrapping:MirroredRepeatWrapping,MixOperation:MixOperation,MultiMaterial:MultiMaterial,MultiplyBlending:MultiplyBlending,MultiplyOperation:MultiplyOperation,NearestFilter:NearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipmapLinearFilter:NearestMipmapLinearFilter,NearestMipmapNearestFilter:NearestMipmapNearestFilter,NeverDepth:NeverDepth,NeverStencilFunc:NeverStencilFunc,NoBlending:NoBlending,NoColors:NoColors,NoToneMapping:NoToneMapping,NormalAnimationBlendMode:NormalAnimationBlendMode,NormalBlending:NormalBlending,NotEqualDepth:NotEqualDepth,NotEqualStencilFunc:NotEqualStencilFunc,NumberKeyframeTrack:NumberKeyframeTrack,Object3D:Object3D,ObjectLoader:ObjectLoader,ObjectSpaceNormalMap:ObjectSpaceNormalMap,OctahedronBufferGeometry:OctahedronGeometry,OctahedronGeometry:OctahedronGeometry,OneFactor:OneFactor,OneMinusDstAlphaFactor:OneMinusDstAlphaFactor,OneMinusDstColorFactor:OneMinusDstColorFactor,OneMinusSrcAlphaFactor:OneMinusSrcAlphaFactor,OneMinusSrcColorFactor:OneMinusSrcColorFactor,OrthographicCamera:OrthographicCamera,PCFShadowMap:PCFShadowMap,PCFSoftShadowMap:PCFSoftShadowMap,PMREMGenerator:PMREMGenerator,ParametricBufferGeometry:ParametricGeometry,ParametricGeometry:ParametricGeometry,Particle:Particle,ParticleBasicMaterial:ParticleBasicMaterial,ParticleSystem:ParticleSystem,ParticleSystemMaterial:ParticleSystemMaterial,Path:Path,PerspectiveCamera:PerspectiveCamera,Plane:Plane$1,PlaneBufferGeometry:PlaneGeometry,PlaneGeometry:PlaneGeometry,PlaneHelper:PlaneHelper,PointCloud:PointCloud,PointCloudMaterial:PointCloudMaterial,PointLight:PointLight$1,PointLightHelper:PointLightHelper,Points:Points,PointsMaterial:PointsMaterial,PolarGridHelper:PolarGridHelper,PolyhedronBufferGeometry:PolyhedronGeometry,PolyhedronGeometry:PolyhedronGeometry,PositionalAudio:PositionalAudio,PropertyBinding:PropertyBinding,PropertyMixer:PropertyMixer,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,Quaternion:Quaternion,QuaternionKeyframeTrack:QuaternionKeyframeTrack,QuaternionLinearInterpolant:QuaternionLinearInterpolant,REVISION:REVISION,RGBADepthPacking:RGBADepthPacking,RGBAFormat:RGBAFormat,RGBAIntegerFormat:RGBAIntegerFormat,RGBA_ASTC_10x10_Format:RGBA_ASTC_10x10_Format,RGBA_ASTC_10x5_Format:RGBA_ASTC_10x5_Format,RGBA_ASTC_10x6_Format:RGBA_ASTC_10x6_Format,RGBA_ASTC_10x8_Format:RGBA_ASTC_10x8_Format,RGBA_ASTC_12x10_Format:RGBA_ASTC_12x10_Format,RGBA_ASTC_12x12_Format:RGBA_ASTC_12x12_Format,RGBA_ASTC_4x4_Format:RGBA_ASTC_4x4_Format,RGBA_ASTC_5x4_Format:RGBA_ASTC_5x4_Format,RGBA_ASTC_5x5_Format:RGBA_ASTC_5x5_Format,RGBA_ASTC_6x5_Format:RGBA_ASTC_6x5_Format,RGBA_ASTC_6x6_Format:RGBA_ASTC_6x6_Format,RGBA_ASTC_8x5_Format:RGBA_ASTC_8x5_Format,RGBA_ASTC_8x6_Format:RGBA_ASTC_8x6_Format,RGBA_ASTC_8x8_Format:RGBA_ASTC_8x8_Format,RGBA_BPTC_Format:RGBA_BPTC_Format,RGBA_ETC2_EAC_Format:RGBA_ETC2_EAC_Format,RGBA_PVRTC_2BPPV1_Format:RGBA_PVRTC_2BPPV1_Format,RGBA_PVRTC_4BPPV1_Format:RGBA_PVRTC_4BPPV1_Format,RGBA_S3TC_DXT1_Format:RGBA_S3TC_DXT1_Format,RGBA_S3TC_DXT3_Format:RGBA_S3TC_DXT3_Format,RGBA_S3TC_DXT5_Format:RGBA_S3TC_DXT5_Format,RGBDEncoding:RGBDEncoding,RGBEEncoding:RGBEEncoding,RGBEFormat:RGBEFormat,RGBFormat:RGBFormat,RGBIntegerFormat:RGBIntegerFormat,RGBM16Encoding:RGBM16Encoding,RGBM7Encoding:RGBM7Encoding,RGB_ETC1_Format:RGB_ETC1_Format,RGB_ETC2_Format:RGB_ETC2_Format,RGB_PVRTC_2BPPV1_Format:RGB_PVRTC_2BPPV1_Format,RGB_PVRTC_4BPPV1_Format:RGB_PVRTC_4BPPV1_Format,RGB_S3TC_DXT1_Format:RGB_S3TC_DXT1_Format,RGFormat:RGFormat,RGIntegerFormat:RGIntegerFormat,RawShaderMaterial:RawShaderMaterial,Ray:Ray,Raycaster:Raycaster,RectAreaLight:RectAreaLight,RedFormat:RedFormat,RedIntegerFormat:RedIntegerFormat,ReinhardToneMapping:ReinhardToneMapping,RepeatWrapping:RepeatWrapping$1,ReplaceStencilOp:ReplaceStencilOp,ReverseSubtractEquation:ReverseSubtractEquation,RingBufferGeometry:RingGeometry,RingGeometry:RingGeometry,SRGB8_ALPHA8_ASTC_10x10_Format:SRGB8_ALPHA8_ASTC_10x10_Format,SRGB8_ALPHA8_ASTC_10x5_Format:SRGB8_ALPHA8_ASTC_10x5_Format,SRGB8_ALPHA8_ASTC_10x6_Format:SRGB8_ALPHA8_ASTC_10x6_Format,SRGB8_ALPHA8_ASTC_10x8_Format:SRGB8_ALPHA8_ASTC_10x8_Format,SRGB8_ALPHA8_ASTC_12x10_Format:SRGB8_ALPHA8_ASTC_12x10_Format,SRGB8_ALPHA8_ASTC_12x12_Format:SRGB8_ALPHA8_ASTC_12x12_Format,SRGB8_ALPHA8_ASTC_4x4_Format:SRGB8_ALPHA8_ASTC_4x4_Format,SRGB8_ALPHA8_ASTC_5x4_Format:SRGB8_ALPHA8_ASTC_5x4_Format,SRGB8_ALPHA8_ASTC_5x5_Format:SRGB8_ALPHA8_ASTC_5x5_Format,SRGB8_ALPHA8_ASTC_6x5_Format:SRGB8_ALPHA8_ASTC_6x5_Format,SRGB8_ALPHA8_ASTC_6x6_Format:SRGB8_ALPHA8_ASTC_6x6_Format,SRGB8_ALPHA8_ASTC_8x5_Format:SRGB8_ALPHA8_ASTC_8x5_Format,SRGB8_ALPHA8_ASTC_8x6_Format:SRGB8_ALPHA8_ASTC_8x6_Format,SRGB8_ALPHA8_ASTC_8x8_Format:SRGB8_ALPHA8_ASTC_8x8_Format,Scene:Scene$2,SceneUtils:SceneUtils,ShaderChunk:ShaderChunk,ShaderLib:ShaderLib,ShaderMaterial:ShaderMaterial,ShadowMaterial:ShadowMaterial,Shape:Shape,ShapeBufferGeometry:ShapeGeometry,ShapeGeometry:ShapeGeometry,ShapePath:ShapePath,ShapeUtils:ShapeUtils,ShortType:ShortType,Skeleton:Skeleton,SkeletonHelper:SkeletonHelper,SkinnedMesh:SkinnedMesh,SmoothShading:SmoothShading,Sphere:Sphere$1,SphereBufferGeometry:SphereGeometry,SphereGeometry:SphereGeometry,Spherical:Spherical,SphericalHarmonics3:SphericalHarmonics3,SplineCurve:SplineCurve,SpotLight:SpotLight$1,SpotLightHelper:SpotLightHelper,Sprite:Sprite$1,SpriteMaterial:SpriteMaterial,SrcAlphaFactor:SrcAlphaFactor,SrcAlphaSaturateFactor:SrcAlphaSaturateFactor,SrcColorFactor:SrcColorFactor,StaticCopyUsage:StaticCopyUsage,StaticDrawUsage:StaticDrawUsage,StaticReadUsage:StaticReadUsage,StereoCamera:StereoCamera,StreamCopyUsage:StreamCopyUsage,StreamDrawUsage:StreamDrawUsage,StreamReadUsage:StreamReadUsage,StringKeyframeTrack:StringKeyframeTrack,SubtractEquation:SubtractEquation,SubtractiveBlending:SubtractiveBlending,TOUCH:TOUCH,TangentSpaceNormalMap:TangentSpaceNormalMap,TetrahedronBufferGeometry:TetrahedronGeometry,TetrahedronGeometry:TetrahedronGeometry,TextBufferGeometry:TextGeometry,TextGeometry:TextGeometry,Texture:Texture,TextureLoader:TextureLoader,TorusBufferGeometry:TorusGeometry,TorusGeometry:TorusGeometry,TorusKnotBufferGeometry:TorusKnotGeometry,TorusKnotGeometry:TorusKnotGeometry,Triangle:Triangle,TriangleFanDrawMode:TriangleFanDrawMode,TriangleStripDrawMode:TriangleStripDrawMode,TrianglesDrawMode:TrianglesDrawMode,TubeBufferGeometry:TubeGeometry,TubeGeometry:TubeGeometry,UVMapping:UVMapping,Uint16Attribute:Uint16Attribute,Uint16BufferAttribute:Uint16BufferAttribute,Uint32Attribute:Uint32Attribute,Uint32BufferAttribute:Uint32BufferAttribute,Uint8Attribute:Uint8Attribute,Uint8BufferAttribute:Uint8BufferAttribute,Uint8ClampedAttribute:Uint8ClampedAttribute,Uint8ClampedBufferAttribute:Uint8ClampedBufferAttribute,Uniform:Uniform,UniformsLib:UniformsLib,UniformsUtils:UniformsUtils,UnsignedByteType:UnsignedByteType,UnsignedInt248Type:UnsignedInt248Type,UnsignedIntType:UnsignedIntType,UnsignedShort4444Type:UnsignedShort4444Type,UnsignedShort5551Type:UnsignedShort5551Type,UnsignedShort565Type:UnsignedShort565Type,UnsignedShortType:UnsignedShortType,VSMShadowMap:VSMShadowMap,Vector2:Vector2,Vector3:Vector3$1,Vector4:Vector4,VectorKeyframeTrack:VectorKeyframeTrack,Vertex:Vertex,VertexColors:VertexColors,VideoTexture:VideoTexture,WebGL1Renderer:WebGL1Renderer,WebGLCubeRenderTarget:WebGLCubeRenderTarget,WebGLMultisampleRenderTarget:WebGLMultisampleRenderTarget,WebGLRenderTarget:WebGLRenderTarget,WebGLRenderTargetCube:WebGLRenderTargetCube,WebGLRenderer:WebGLRenderer,WebGLUtils:WebGLUtils,WireframeGeometry:WireframeGeometry,WireframeHelper:WireframeHelper,WrapAroundEnding:WrapAroundEnding,XHRLoader:XHRLoader,ZeroCurvatureEnding:ZeroCurvatureEnding,ZeroFactor:ZeroFactor,ZeroSlopeEnding:ZeroSlopeEnding,ZeroStencilOp:ZeroStencilOp,sRGBEncoding:sRGBEncoding});var PREFIX = '[Mage]';
53587
+ }var three_module=/*#__PURE__*/Object.freeze({__proto__:null,ACESFilmicToneMapping:ACESFilmicToneMapping,AddEquation:AddEquation,AddOperation:AddOperation,AdditiveAnimationBlendMode:AdditiveAnimationBlendMode,AdditiveBlending:AdditiveBlending,AlphaFormat:AlphaFormat,AlwaysDepth:AlwaysDepth,AlwaysStencilFunc:AlwaysStencilFunc,AmbientLight:AmbientLight$1,AmbientLightProbe:AmbientLightProbe,AnimationClip:AnimationClip,AnimationLoader:AnimationLoader,AnimationMixer:AnimationMixer,AnimationObjectGroup:AnimationObjectGroup,AnimationUtils:AnimationUtils,ArcCurve:ArcCurve,ArrayCamera:ArrayCamera,ArrowHelper:ArrowHelper,Audio:Audio$2,AudioAnalyser:AudioAnalyser,AudioContext:AudioContext,AudioListener:AudioListener,AudioLoader:AudioLoader,AxesHelper:AxesHelper$1,AxisHelper:AxisHelper,BackSide:BackSide,BasicDepthPacking:BasicDepthPacking,BasicShadowMap:BasicShadowMap,BinaryTextureLoader:BinaryTextureLoader,Bone:Bone,BooleanKeyframeTrack:BooleanKeyframeTrack,BoundingBoxHelper:BoundingBoxHelper,Box2:Box2,Box3:Box3,Box3Helper:Box3Helper,BoxBufferGeometry:BoxGeometry,BoxGeometry:BoxGeometry,BoxHelper:BoxHelper,BufferAttribute:BufferAttribute,BufferGeometry:BufferGeometry,BufferGeometryLoader:BufferGeometryLoader,ByteType:ByteType,Cache:Cache,Camera:Camera$1,CameraHelper:CameraHelper,CanvasRenderer:CanvasRenderer,CanvasTexture:CanvasTexture,CatmullRomCurve3:CatmullRomCurve3,CineonToneMapping:CineonToneMapping,CircleBufferGeometry:CircleGeometry,CircleGeometry:CircleGeometry,ClampToEdgeWrapping:ClampToEdgeWrapping,Clock:Clock,Color:Color$1,ColorKeyframeTrack:ColorKeyframeTrack,CompressedTexture:CompressedTexture,CompressedTextureLoader:CompressedTextureLoader,ConeBufferGeometry:ConeGeometry,ConeGeometry:ConeGeometry,CubeCamera:CubeCamera,CubeReflectionMapping:CubeReflectionMapping,CubeRefractionMapping:CubeRefractionMapping,CubeTexture:CubeTexture,CubeTextureLoader:CubeTextureLoader,CubeUVReflectionMapping:CubeUVReflectionMapping,CubeUVRefractionMapping:CubeUVRefractionMapping,CubicBezierCurve:CubicBezierCurve,CubicBezierCurve3:CubicBezierCurve3,CubicInterpolant:CubicInterpolant,CullFaceBack:CullFaceBack,CullFaceFront:CullFaceFront,CullFaceFrontBack:CullFaceFrontBack,CullFaceNone:CullFaceNone,Curve:Curve,CurvePath:CurvePath,CustomBlending:CustomBlending,CustomToneMapping:CustomToneMapping,CylinderBufferGeometry:CylinderGeometry,CylinderGeometry:CylinderGeometry,Cylindrical:Cylindrical,DataTexture:DataTexture,DataTexture2DArray:DataTexture2DArray,DataTexture3D:DataTexture3D,DataTextureLoader:DataTextureLoader,DataUtils:DataUtils,DecrementStencilOp:DecrementStencilOp,DecrementWrapStencilOp:DecrementWrapStencilOp,DefaultLoadingManager:DefaultLoadingManager,DepthFormat:DepthFormat,DepthStencilFormat:DepthStencilFormat,DepthTexture:DepthTexture,DirectionalLight:DirectionalLight,DirectionalLightHelper:DirectionalLightHelper,DiscreteInterpolant:DiscreteInterpolant,DodecahedronBufferGeometry:DodecahedronGeometry,DodecahedronGeometry:DodecahedronGeometry,DoubleSide:DoubleSide,DstAlphaFactor:DstAlphaFactor,DstColorFactor:DstColorFactor,DynamicBufferAttribute:DynamicBufferAttribute,DynamicCopyUsage:DynamicCopyUsage,DynamicDrawUsage:DynamicDrawUsage,DynamicReadUsage:DynamicReadUsage,EdgesGeometry:EdgesGeometry,EdgesHelper:EdgesHelper,EllipseCurve:EllipseCurve,EqualDepth:EqualDepth,EqualStencilFunc:EqualStencilFunc,EquirectangularReflectionMapping:EquirectangularReflectionMapping,EquirectangularRefractionMapping:EquirectangularRefractionMapping,Euler:Euler,EventDispatcher:EventDispatcher,ExtrudeBufferGeometry:ExtrudeGeometry,ExtrudeGeometry:ExtrudeGeometry,FaceColors:FaceColors,FileLoader:FileLoader,FlatShading:FlatShading,Float16BufferAttribute:Float16BufferAttribute,Float32Attribute:Float32Attribute,Float32BufferAttribute:Float32BufferAttribute,Float64Attribute:Float64Attribute,Float64BufferAttribute:Float64BufferAttribute,FloatType:FloatType$1,Fog:Fog,FogExp2:FogExp2,Font:Font,FontLoader:FontLoader,FrontSide:FrontSide,Frustum:Frustum$1,GLBufferAttribute:GLBufferAttribute,GLSL1:GLSL1,GLSL3:GLSL3,GammaEncoding:GammaEncoding,GreaterDepth:GreaterDepth,GreaterEqualDepth:GreaterEqualDepth,GreaterEqualStencilFunc:GreaterEqualStencilFunc,GreaterStencilFunc:GreaterStencilFunc,GridHelper:GridHelper,Group:Group,HalfFloatType:HalfFloatType,HemisphereLight:HemisphereLight$1,HemisphereLightHelper:HemisphereLightHelper,HemisphereLightProbe:HemisphereLightProbe,IcosahedronBufferGeometry:IcosahedronGeometry,IcosahedronGeometry:IcosahedronGeometry,ImageBitmapLoader:ImageBitmapLoader,ImageLoader:ImageLoader,ImageUtils:ImageUtils,ImmediateRenderObject:ImmediateRenderObject,IncrementStencilOp:IncrementStencilOp,IncrementWrapStencilOp:IncrementWrapStencilOp,InstancedBufferAttribute:InstancedBufferAttribute,InstancedBufferGeometry:InstancedBufferGeometry,InstancedInterleavedBuffer:InstancedInterleavedBuffer,InstancedMesh:InstancedMesh,Int16Attribute:Int16Attribute,Int16BufferAttribute:Int16BufferAttribute,Int32Attribute:Int32Attribute,Int32BufferAttribute:Int32BufferAttribute,Int8Attribute:Int8Attribute,Int8BufferAttribute:Int8BufferAttribute,IntType:IntType,InterleavedBuffer:InterleavedBuffer,InterleavedBufferAttribute:InterleavedBufferAttribute,Interpolant:Interpolant,InterpolateDiscrete:InterpolateDiscrete,InterpolateLinear:InterpolateLinear,InterpolateSmooth:InterpolateSmooth,InvertStencilOp:InvertStencilOp,JSONLoader:JSONLoader,KeepStencilOp:KeepStencilOp,KeyframeTrack:KeyframeTrack,LOD:LOD,LatheBufferGeometry:LatheGeometry,LatheGeometry:LatheGeometry,Layers:Layers,LensFlare:LensFlare,LessDepth:LessDepth,LessEqualDepth:LessEqualDepth,LessEqualStencilFunc:LessEqualStencilFunc,LessStencilFunc:LessStencilFunc,Light:Light$1,LightProbe:LightProbe,Line:Line$1,Line3:Line3,LineBasicMaterial:LineBasicMaterial,LineCurve:LineCurve,LineCurve3:LineCurve3,LineDashedMaterial:LineDashedMaterial,LineLoop:LineLoop,LinePieces:LinePieces,LineSegments:LineSegments,LineStrip:LineStrip,LinearEncoding:LinearEncoding,LinearFilter:LinearFilter,LinearInterpolant:LinearInterpolant,LinearMipMapLinearFilter:LinearMipMapLinearFilter,LinearMipMapNearestFilter:LinearMipMapNearestFilter,LinearMipmapLinearFilter:LinearMipmapLinearFilter,LinearMipmapNearestFilter:LinearMipmapNearestFilter,LinearToneMapping:LinearToneMapping,Loader:Loader$1,LoaderUtils:LoaderUtils,LoadingManager:LoadingManager,LogLuvEncoding:LogLuvEncoding,LoopOnce:LoopOnce,LoopPingPong:LoopPingPong,LoopRepeat:LoopRepeat,LuminanceAlphaFormat:LuminanceAlphaFormat,LuminanceFormat:LuminanceFormat,MOUSE:MOUSE,Material:Material,MaterialLoader:MaterialLoader,Math:MathUtils,MathUtils:MathUtils,Matrix3:Matrix3,Matrix4:Matrix4,MaxEquation:MaxEquation,Mesh:Mesh,MeshBasicMaterial:MeshBasicMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshFaceMaterial:MeshFaceMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshMatcapMaterial:MeshMatcapMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshToonMaterial:MeshToonMaterial,MinEquation:MinEquation,MirroredRepeatWrapping:MirroredRepeatWrapping,MixOperation:MixOperation,MultiMaterial:MultiMaterial,MultiplyBlending:MultiplyBlending,MultiplyOperation:MultiplyOperation,NearestFilter:NearestFilter,NearestMipMapLinearFilter:NearestMipMapLinearFilter,NearestMipMapNearestFilter:NearestMipMapNearestFilter,NearestMipmapLinearFilter:NearestMipmapLinearFilter,NearestMipmapNearestFilter:NearestMipmapNearestFilter,NeverDepth:NeverDepth,NeverStencilFunc:NeverStencilFunc,NoBlending:NoBlending,NoColors:NoColors,NoToneMapping:NoToneMapping,NormalAnimationBlendMode:NormalAnimationBlendMode,NormalBlending:NormalBlending,NotEqualDepth:NotEqualDepth,NotEqualStencilFunc:NotEqualStencilFunc,NumberKeyframeTrack:NumberKeyframeTrack,Object3D:Object3D,ObjectLoader:ObjectLoader,ObjectSpaceNormalMap:ObjectSpaceNormalMap,OctahedronBufferGeometry:OctahedronGeometry,OctahedronGeometry:OctahedronGeometry,OneFactor:OneFactor,OneMinusDstAlphaFactor:OneMinusDstAlphaFactor,OneMinusDstColorFactor:OneMinusDstColorFactor,OneMinusSrcAlphaFactor:OneMinusSrcAlphaFactor,OneMinusSrcColorFactor:OneMinusSrcColorFactor,OrthographicCamera:OrthographicCamera,PCFShadowMap:PCFShadowMap,PCFSoftShadowMap:PCFSoftShadowMap,PMREMGenerator:PMREMGenerator,ParametricBufferGeometry:ParametricGeometry,ParametricGeometry:ParametricGeometry,Particle:Particle,ParticleBasicMaterial:ParticleBasicMaterial,ParticleSystem:ParticleSystem,ParticleSystemMaterial:ParticleSystemMaterial,Path:Path,PerspectiveCamera:PerspectiveCamera,Plane:Plane$1,PlaneBufferGeometry:PlaneGeometry,PlaneGeometry:PlaneGeometry,PlaneHelper:PlaneHelper,PointCloud:PointCloud,PointCloudMaterial:PointCloudMaterial,PointLight:PointLight$1,PointLightHelper:PointLightHelper,Points:Points,PointsMaterial:PointsMaterial,PolarGridHelper:PolarGridHelper,PolyhedronBufferGeometry:PolyhedronGeometry,PolyhedronGeometry:PolyhedronGeometry,PositionalAudio:PositionalAudio,PropertyBinding:PropertyBinding,PropertyMixer:PropertyMixer,QuadraticBezierCurve:QuadraticBezierCurve,QuadraticBezierCurve3:QuadraticBezierCurve3,Quaternion:Quaternion,QuaternionKeyframeTrack:QuaternionKeyframeTrack,QuaternionLinearInterpolant:QuaternionLinearInterpolant,REVISION:REVISION,RGBADepthPacking:RGBADepthPacking,RGBAFormat:RGBAFormat,RGBAIntegerFormat:RGBAIntegerFormat,RGBA_ASTC_10x10_Format:RGBA_ASTC_10x10_Format,RGBA_ASTC_10x5_Format:RGBA_ASTC_10x5_Format,RGBA_ASTC_10x6_Format:RGBA_ASTC_10x6_Format,RGBA_ASTC_10x8_Format:RGBA_ASTC_10x8_Format,RGBA_ASTC_12x10_Format:RGBA_ASTC_12x10_Format,RGBA_ASTC_12x12_Format:RGBA_ASTC_12x12_Format,RGBA_ASTC_4x4_Format:RGBA_ASTC_4x4_Format,RGBA_ASTC_5x4_Format:RGBA_ASTC_5x4_Format,RGBA_ASTC_5x5_Format:RGBA_ASTC_5x5_Format,RGBA_ASTC_6x5_Format:RGBA_ASTC_6x5_Format,RGBA_ASTC_6x6_Format:RGBA_ASTC_6x6_Format,RGBA_ASTC_8x5_Format:RGBA_ASTC_8x5_Format,RGBA_ASTC_8x6_Format:RGBA_ASTC_8x6_Format,RGBA_ASTC_8x8_Format:RGBA_ASTC_8x8_Format,RGBA_BPTC_Format:RGBA_BPTC_Format,RGBA_ETC2_EAC_Format:RGBA_ETC2_EAC_Format,RGBA_PVRTC_2BPPV1_Format:RGBA_PVRTC_2BPPV1_Format,RGBA_PVRTC_4BPPV1_Format:RGBA_PVRTC_4BPPV1_Format,RGBA_S3TC_DXT1_Format:RGBA_S3TC_DXT1_Format,RGBA_S3TC_DXT3_Format:RGBA_S3TC_DXT3_Format,RGBA_S3TC_DXT5_Format:RGBA_S3TC_DXT5_Format,RGBDEncoding:RGBDEncoding,RGBEEncoding:RGBEEncoding,RGBEFormat:RGBEFormat,RGBFormat:RGBFormat,RGBIntegerFormat:RGBIntegerFormat,RGBM16Encoding:RGBM16Encoding,RGBM7Encoding:RGBM7Encoding,RGB_ETC1_Format:RGB_ETC1_Format,RGB_ETC2_Format:RGB_ETC2_Format,RGB_PVRTC_2BPPV1_Format:RGB_PVRTC_2BPPV1_Format,RGB_PVRTC_4BPPV1_Format:RGB_PVRTC_4BPPV1_Format,RGB_S3TC_DXT1_Format:RGB_S3TC_DXT1_Format,RGFormat:RGFormat,RGIntegerFormat:RGIntegerFormat,RawShaderMaterial:RawShaderMaterial,Ray:Ray,Raycaster:Raycaster,RectAreaLight:RectAreaLight,RedFormat:RedFormat,RedIntegerFormat:RedIntegerFormat,ReinhardToneMapping:ReinhardToneMapping,RepeatWrapping:RepeatWrapping$1,ReplaceStencilOp:ReplaceStencilOp,ReverseSubtractEquation:ReverseSubtractEquation,RingBufferGeometry:RingGeometry,RingGeometry:RingGeometry,SRGB8_ALPHA8_ASTC_10x10_Format:SRGB8_ALPHA8_ASTC_10x10_Format,SRGB8_ALPHA8_ASTC_10x5_Format:SRGB8_ALPHA8_ASTC_10x5_Format,SRGB8_ALPHA8_ASTC_10x6_Format:SRGB8_ALPHA8_ASTC_10x6_Format,SRGB8_ALPHA8_ASTC_10x8_Format:SRGB8_ALPHA8_ASTC_10x8_Format,SRGB8_ALPHA8_ASTC_12x10_Format:SRGB8_ALPHA8_ASTC_12x10_Format,SRGB8_ALPHA8_ASTC_12x12_Format:SRGB8_ALPHA8_ASTC_12x12_Format,SRGB8_ALPHA8_ASTC_4x4_Format:SRGB8_ALPHA8_ASTC_4x4_Format,SRGB8_ALPHA8_ASTC_5x4_Format:SRGB8_ALPHA8_ASTC_5x4_Format,SRGB8_ALPHA8_ASTC_5x5_Format:SRGB8_ALPHA8_ASTC_5x5_Format,SRGB8_ALPHA8_ASTC_6x5_Format:SRGB8_ALPHA8_ASTC_6x5_Format,SRGB8_ALPHA8_ASTC_6x6_Format:SRGB8_ALPHA8_ASTC_6x6_Format,SRGB8_ALPHA8_ASTC_8x5_Format:SRGB8_ALPHA8_ASTC_8x5_Format,SRGB8_ALPHA8_ASTC_8x6_Format:SRGB8_ALPHA8_ASTC_8x6_Format,SRGB8_ALPHA8_ASTC_8x8_Format:SRGB8_ALPHA8_ASTC_8x8_Format,Scene:Scene$2,SceneUtils:SceneUtils,ShaderChunk:ShaderChunk,ShaderLib:ShaderLib,ShaderMaterial:ShaderMaterial,ShadowMaterial:ShadowMaterial,Shape:Shape,ShapeBufferGeometry:ShapeGeometry,ShapeGeometry:ShapeGeometry,ShapePath:ShapePath,ShapeUtils:ShapeUtils,ShortType:ShortType,Skeleton:Skeleton,SkeletonHelper:SkeletonHelper,SkinnedMesh:SkinnedMesh,SmoothShading:SmoothShading,Sphere:Sphere$1,SphereBufferGeometry:SphereGeometry,SphereGeometry:SphereGeometry,Spherical:Spherical,SphericalHarmonics3:SphericalHarmonics3,SplineCurve:SplineCurve,SpotLight:SpotLight$1,SpotLightHelper:SpotLightHelper,Sprite:Sprite$1,SpriteMaterial:SpriteMaterial,SrcAlphaFactor:SrcAlphaFactor,SrcAlphaSaturateFactor:SrcAlphaSaturateFactor,SrcColorFactor:SrcColorFactor,StaticCopyUsage:StaticCopyUsage,StaticDrawUsage:StaticDrawUsage,StaticReadUsage:StaticReadUsage,StereoCamera:StereoCamera,StreamCopyUsage:StreamCopyUsage,StreamDrawUsage:StreamDrawUsage,StreamReadUsage:StreamReadUsage,StringKeyframeTrack:StringKeyframeTrack,SubtractEquation:SubtractEquation,SubtractiveBlending:SubtractiveBlending,TOUCH:TOUCH,TangentSpaceNormalMap:TangentSpaceNormalMap,TetrahedronBufferGeometry:TetrahedronGeometry,TetrahedronGeometry:TetrahedronGeometry,TextBufferGeometry:TextGeometry,TextGeometry:TextGeometry,Texture:Texture,TextureLoader:TextureLoader,TorusBufferGeometry:TorusGeometry,TorusGeometry:TorusGeometry,TorusKnotBufferGeometry:TorusKnotGeometry,TorusKnotGeometry:TorusKnotGeometry,Triangle:Triangle,TriangleFanDrawMode:TriangleFanDrawMode,TriangleStripDrawMode:TriangleStripDrawMode,TrianglesDrawMode:TrianglesDrawMode,TubeBufferGeometry:TubeGeometry,TubeGeometry:TubeGeometry,UVMapping:UVMapping,Uint16Attribute:Uint16Attribute,Uint16BufferAttribute:Uint16BufferAttribute,Uint32Attribute:Uint32Attribute,Uint32BufferAttribute:Uint32BufferAttribute,Uint8Attribute:Uint8Attribute,Uint8BufferAttribute:Uint8BufferAttribute,Uint8ClampedAttribute:Uint8ClampedAttribute,Uint8ClampedBufferAttribute:Uint8ClampedBufferAttribute,Uniform:Uniform,UniformsLib:UniformsLib,UniformsUtils:UniformsUtils,UnsignedByteType:UnsignedByteType,UnsignedInt248Type:UnsignedInt248Type,UnsignedIntType:UnsignedIntType,UnsignedShort4444Type:UnsignedShort4444Type,UnsignedShort5551Type:UnsignedShort5551Type,UnsignedShort565Type:UnsignedShort565Type,UnsignedShortType:UnsignedShortType,VSMShadowMap:VSMShadowMap,Vector2:Vector2,Vector3:Vector3$1,Vector4:Vector4,VectorKeyframeTrack:VectorKeyframeTrack,Vertex:Vertex,VertexColors:VertexColors,VideoTexture:VideoTexture,WebGL1Renderer:WebGL1Renderer,WebGLCubeRenderTarget:WebGLCubeRenderTarget,WebGLMultisampleRenderTarget:WebGLMultisampleRenderTarget,WebGLRenderTarget:WebGLRenderTarget,WebGLRenderTargetCube:WebGLRenderTargetCube,WebGLRenderer:WebGLRenderer,WebGLUtils:WebGLUtils,WireframeGeometry:WireframeGeometry,WireframeHelper:WireframeHelper,WrapAroundEnding:WrapAroundEnding,XHRLoader:XHRLoader,ZeroCurvatureEnding:ZeroCurvatureEnding,ZeroFactor:ZeroFactor,ZeroSlopeEnding:ZeroSlopeEnding,ZeroStencilOp:ZeroStencilOp,sRGBEncoding:sRGBEncoding});var PREFIX = '[Mage]';
53588
+ var DEPRECATED = '[DEPRECATED]';
53546
53589
  var DEPRECATIONS = {
53547
- SCRIPTS_CREATE: "".concat(PREFIX, " [DEPRECATED] Scripts.create is deprecated, use Scripts.register instead. Will be removed in next major release."),
53548
- ELEMENT_SET_TEXTURE_MAP: "".concat(PREFIX, " [DEPRECATED] Element.setTextureMap is deprecated, use Element.setTexture() instead. Will be removed in next major release.")
53590
+ PARTICLES_ADD_PARTICLE_EMITTER: "".concat(PREFIX, " ").concat(DEPRECATED, " Particles.addParticleEmitter is deprecated, use Particles.add instead. Will be removed in the next major release"),
53591
+ MODELS_GETMODEL: "".concat(PREFIX, " ").concat(DEPRECATED, " Models.getModel is deprecated, use Models.get instead. Will be removed in next major release"),
53592
+ SCRIPTS_CREATE: "".concat(PREFIX, " ").concat(DEPRECATED, " Scripts.create is deprecated, use Scripts.register instead. Will be removed in next major release."),
53593
+ ELEMENT_SET_TEXTURE_MAP: "".concat(PREFIX, " ").concat(DEPRECATED, " Element.setTextureMap is deprecated, use Element.setTexture() instead. Will be removed in next major release.")
53549
53594
  };
53550
53595
  var ONCREATE_NOT_AVAILABLE = "".concat(PREFIX, " Your scene needs a onCreate method.");
53551
53596
  var PATH_NOT_FOUND = "".concat(PREFIX, " can't find requested path");
@@ -53560,10 +53605,11 @@ var METHOD_NOT_SUPPORTED = "".concat(PREFIX, " This method is not supported.");
53560
53605
  var ANIMATION_NOT_FOUND = "".concat(PREFIX, " Required animation can't be found.");
53561
53606
  var ANIMATION_HANDLER_NOT_FOUND = "".concat(PREFIX, " AnimationHander hasn't been defined yet.");
53562
53607
  var ELEMENT_NOT_SET$1 = "".concat(PREFIX, " Body hasn't been defined yet.");
53563
- var ELEMENT_NAME_NOT_PROVIDED = "".concat(PREFIX, " Desired element name wasn't provided.");
53564
53608
  var ELEMENT_SET_COLOR_MISSING_COLOR = "".concat(PREFIX, " Can't set color for this element, missing color");
53565
53609
  var ELEMENT_MATERIAL_NO_SUPPORT_FOR_TEXTURE = "".concat(PREFIX, " This element's material does not support texture: ");
53610
+ var ENTITY_NOT_SET = "".concat(PREFIX, " This entity does not have a body.");
53566
53611
  var ENTITY_TYPE_NOT_ALLOWED = "".concat(PREFIX, " The desired Entity type is not allowed.");
53612
+ var ENTITY_CANT_ADD_NOT_ENTITY = "".concat(PREFIX, " Entity.add requires an Entity.");
53567
53613
  var ERROR_LOADING_TEXTURE = "".concat(PREFIX, " Error while loading texture:");
53568
53614
  var TAG_CANT_BE_REMOVED = "".concat(PREFIX, " The default tag can't be removed.");
53569
53615
  var TAG_ALREADY_EXISTS = "".concat(PREFIX, " The following tag has already been added: ");
@@ -53591,9 +53637,24 @@ var LIGHT_HOLDER_MODEL_NOT_FOUND = "".concat(PREFIX, " This light holder model c
53591
53637
  }
53592
53638
  }, {
53593
53639
  key: "__hasStarted",
53594
- value: function __hasStarted(flag) {
53640
+ value: function __hasStarted() {
53641
+ return this.hasStarted;
53642
+ }
53643
+ }, {
53644
+ key: "__isDisposed",
53645
+ value: function __isDisposed() {
53646
+ return this.isDisposed;
53647
+ }
53648
+ }, {
53649
+ key: "__setStartedFlag",
53650
+ value: function __setStartedFlag(flag) {
53595
53651
  this.hasStarted = flag;
53596
53652
  }
53653
+ }, {
53654
+ key: "__setDisposedFlag",
53655
+ value: function __setDisposedFlag(flag) {
53656
+ this.isDisposed = flag;
53657
+ }
53597
53658
  }]);
53598
53659
 
53599
53660
  function BaseScript(name) {
@@ -54476,9 +54537,8 @@ var Config$1 = new Config();var Universe = /*#__PURE__*/function () {
54476
54537
  });
54477
54538
 
54478
54539
  _defineProperty$1(this, "forEach", function (callback) {
54479
- var keys = Object.keys(_this.reality);
54480
- keys.forEach(function (k) {
54481
- return callback(_this.reality[k]);
54540
+ Object.keys(_this.reality).forEach(function (k) {
54541
+ return callback(_this.reality[k], k);
54482
54542
  });
54483
54543
  });
54484
54544
 
@@ -54486,14 +54546,14 @@ var Config$1 = new Config();var Universe = /*#__PURE__*/function () {
54486
54546
  var keys = Object.keys(_this.reality);
54487
54547
  return new Promise(function (resolve) {
54488
54548
  Promise.all(keys.map(function (k) {
54489
- return callback(_this.reality[k]);
54549
+ return callback(_this.reality[k], k);
54490
54550
  })).then(resolve);
54491
54551
  });
54492
54552
  });
54493
54553
 
54494
54554
  _defineProperty$1(this, "bigfreeze", function () {
54495
54555
  _this.forEach(function (o) {
54496
- return o.dispose();
54556
+ o && o.dispose && o.dispose();
54497
54557
  });
54498
54558
 
54499
54559
  _this.reset();
@@ -54697,9 +54757,10 @@ var ROOT = '/';
54697
54757
  var DIVIDER = '/';
54698
54758
  var HASH = '#';
54699
54759
  var EMPTY$1 = '';
54760
+ var QUERY_START = '?';
54700
54761
  var DEFAULT_SELECTOR = '#gameContainer';
54701
54762
  var BEFORE_UNLOAD = 'beforeunload';
54702
- var HASH_CHANGE = 'hashchange';var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,UP:UP$1,DOWN:DOWN$1,LEFT:LEFT,RIGHT:RIGHT,FRONT:FRONT,BACK:BACK,VECTOR_UP:VECTOR_UP,VECTOR_DOWN:VECTOR_DOWN,VECTOR_LEFT:VECTOR_LEFT,VECTOR_RIGHT:VECTOR_RIGHT,VECTOR_FRONT:VECTOR_FRONT,VECTOR_BACK:VECTOR_BACK,ORIGIN:ORIGIN,ZERO_QUATERNION:ZERO_QUATERNION,MATERIALS:MATERIALS,TEXTURES:TEXTURES,EFFECTS:EFFECTS,COLLISION_EVENT:COLLISION_EVENT,COLORS:COLORS,ASSETS_TYPES:ASSETS_TYPES,OUTPUT_ENCODINGS:OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING:DEFAULT_OUTPUT_ENCODING,ROOT:ROOT,DIVIDER:DIVIDER,HASH:HASH,EMPTY:EMPTY$1,DEFAULT_SELECTOR:DEFAULT_SELECTOR,BEFORE_UNLOAD:BEFORE_UNLOAD,HASH_CHANGE:HASH_CHANGE});var buildAssetId = function buildAssetId(name, level) {
54763
+ var HASH_CHANGE = 'hashchange';var lib_constants=/*#__PURE__*/Object.freeze({__proto__:null,UP:UP$1,DOWN:DOWN$1,LEFT:LEFT,RIGHT:RIGHT,FRONT:FRONT,BACK:BACK,VECTOR_UP:VECTOR_UP,VECTOR_DOWN:VECTOR_DOWN,VECTOR_LEFT:VECTOR_LEFT,VECTOR_RIGHT:VECTOR_RIGHT,VECTOR_FRONT:VECTOR_FRONT,VECTOR_BACK:VECTOR_BACK,ORIGIN:ORIGIN,ZERO_QUATERNION:ZERO_QUATERNION,MATERIALS:MATERIALS,TEXTURES:TEXTURES,EFFECTS:EFFECTS,COLLISION_EVENT:COLLISION_EVENT,COLORS:COLORS,ASSETS_TYPES:ASSETS_TYPES,OUTPUT_ENCODINGS:OUTPUT_ENCODINGS,DEFAULT_OUTPUT_ENCODING:DEFAULT_OUTPUT_ENCODING,ROOT:ROOT,DIVIDER:DIVIDER,HASH:HASH,EMPTY:EMPTY$1,QUERY_START:QUERY_START,DEFAULT_SELECTOR:DEFAULT_SELECTOR,BEFORE_UNLOAD:BEFORE_UNLOAD,HASH_CHANGE:HASH_CHANGE});var buildAssetId = function buildAssetId(name, level) {
54703
54764
  return level ? "".concat(level, "_").concat(name) : name;
54704
54765
  };
54705
54766
  var isLevelName = function isLevelName(level) {
@@ -54865,7 +54926,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
54865
54926
  url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
54866
54927
  return new Worker(url, options);
54867
54928
  };
54868
- }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIEFQUExZOiB7CiAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnCiAgICAgICAgfQogICAgICB9LAogICAgICBWRUhJQ0xFOiB7CiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cXVhdGVybmlvbicKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczp2ZWhpY2xlOnJlc2V0JywKICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsCiAgICAgICAgRElSRUNUSU9OOiAncGh5c2ljczp2ZWhpY2xlOmRpcmVjdGlvbicKICAgICAgfSwKICAgICAgRUZGRUNUUzogewogICAgICAgIEVYUExPU0lPTjogJ3BoeXNpY3M6ZWZmZWN0czpleHBsb3Npb24nCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsKCiAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7CiAgICAgICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307CiAgICAgICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIERpc3BhdGNoZXIgPSBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRQaHlzaWNzVXBkYXRlIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5VUERBVEUsCiAgICAgICAgICBkdDogZHQKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRSZWFkeUV2ZW50IiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuUkVBRFkKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRUZXJtaW5hdGVFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZEJvZHlVcGRhdGUiLCBmdW5jdGlvbiAodXVpZCwgcG9zaXRpb24sIHJvdGF0aW9uLCBkdCwgZXh0cmFEYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURSwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBwb3NpdGlvbjogewogICAgICAgICAgICB4OiBwb3NpdGlvbi54KCksCiAgICAgICAgICAgIHk6IHBvc2l0aW9uLnkoKSwKICAgICAgICAgICAgejogcG9zaXRpb24ueigpCiAgICAgICAgICB9LAogICAgICAgICAgcXVhdGVybmlvbjogewogICAgICAgICAgICB4OiByb3RhdGlvbi54KCksCiAgICAgICAgICAgIHk6IHJvdGF0aW9uLnkoKSwKICAgICAgICAgICAgejogcm90YXRpb24ueigpLAogICAgICAgICAgICB3OiByb3RhdGlvbi53KCkKICAgICAgICAgIH0KICAgICAgICB9LCBleHRyYURhdGEpLCB7fSwgewogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSkpOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZERpc3BhdGNoRXZlbnQiLCBmdW5jdGlvbiAodXVpZCwgZXZlbnROYW1lLCBldmVudERhdGEpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkRJU1BBVENILAogICAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICAgIGV2ZW50TmFtZTogZXZlbnROYW1lLAogICAgICAgICAgZXZlbnREYXRhOiBldmVudERhdGEKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGRpc3BhdGNoZXIkMSA9IG5ldyBEaXNwYXRjaGVyKCk7CgogICAgdmFyIGFwcGx5TWF0cml4NFRvVmVjdG9yMyA9IGZ1bmN0aW9uIGFwcGx5TWF0cml4NFRvVmVjdG9yMyhfcmVmKSB7CiAgICAgIHZhciBfcmVmJHggPSBfcmVmLngsCiAgICAgICAgICB4ID0gX3JlZiR4ID09PSB2b2lkIDAgPyAwIDogX3JlZiR4LAogICAgICAgICAgX3JlZiR5ID0gX3JlZi55LAogICAgICAgICAgeSA9IF9yZWYkeSA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeSwKICAgICAgICAgIF9yZWYkeiA9IF9yZWYueiwKICAgICAgICAgIHogPSBfcmVmJHogPT09IHZvaWQgMCA/IDAgOiBfcmVmJHo7CiAgICAgIHZhciBtYXRyaXggPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFtdOwogICAgICB2YXIgdyA9IDEgLyAobWF0cml4WzNdICogeCArIG1hdHJpeFs3XSAqIHkgKyBtYXRyaXhbMTFdICogeiArIG1hdHJpeFsxNV0pOwogICAgICByZXR1cm4gewogICAgICAgIHg6IChtYXRyaXhbMF0gKiB4ICsgbWF0cml4WzRdICogeSArIG1hdHJpeFs4XSAqIHogKyBtYXRyaXhbMTJdKSAqIHcsCiAgICAgICAgeTogKG1hdHJpeFsxXSAqIHggKyBtYXRyaXhbNV0gKiB5ICsgbWF0cml4WzldICogeiArIG1hdHJpeFsxM10pICogdywKICAgICAgICB6OiAobWF0cml4WzJdICogeCArIG1hdHJpeFs2XSAqIHkgKyBtYXRyaXhbMTBdICogeiArIG1hdHJpeFsxNF0pICogdwogICAgICB9OwogICAgfTsKCiAgICB2YXIgY3JlYXRlUmlnaWRCb2R5ID0gZnVuY3Rpb24gY3JlYXRlUmlnaWRCb2R5KHNoYXBlLCBvcHRpb25zKSB7CiAgICAgIHZhciB1dWlkID0gb3B0aW9ucy51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9IG9wdGlvbnMucmVzdGl0dXRpb24sCiAgICAgICAgICByZXN0aXR1dGlvbiA9IF9vcHRpb25zJHJlc3RpdHV0aW9uID09PSB2b2lkIDAgPyAuOSA6IF9vcHRpb25zJHJlc3RpdHV0aW9uLAogICAgICAgICAgX29wdGlvbnMkZGFtcGluZyA9IG9wdGlvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfb3B0aW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyB7CiAgICAgICAgbGluZWFyOiAwLjIsCiAgICAgICAgYW5ndWxhcjogMC4yCiAgICAgIH0gOiBfb3B0aW9ucyRkYW1waW5nOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgc2hhcGUuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciByYkluZm8gPSBuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIHNoYXBlLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgYm9keSA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KHJiSW5mbyk7CgogICAgICBpZiAobWFzcyA+IDApIHsKICAgICAgICBib2R5LnNldEZyaWN0aW9uKGZyaWN0aW9uKTsKICAgICAgICBib2R5LnNldFJlc3RpdHV0aW9uKHJlc3RpdHV0aW9uKTsKICAgICAgICBib2R5LnNldERhbXBpbmcoZGFtcGluZy5saW5lYXIsIGRhbXBpbmcuYW5ndWxhcik7CiAgICAgICAgYm9keS5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pOwogICAgICB9IC8vIHN0b3JpbmcgdXVpZCBmb3IgZnV0dXJlIHJlZmVyZW5jZQoKCiAgICAgIGJvZHkudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgcmV0dXJuIGJvZHk7CiAgICB9OwogICAgdmFyIGFkZE1vZGVsID0gZnVuY3Rpb24gYWRkTW9kZWwob3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHZlcnRpY2VzID0gb3B0aW9ucy52ZXJ0aWNlcywKICAgICAgICAgIG1hdHJpY2VzID0gb3B0aW9ucy5tYXRyaWNlcywKICAgICAgICAgIGluZGV4ZXMgPSBvcHRpb25zLmluZGV4ZXMsCiAgICAgICAgICBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gb3B0aW9ucy5xdWF0ZXJuaW9uLAogICAgICAgICAgX29wdGlvbnMkbWFzcyA9IG9wdGlvbnMubWFzcywKICAgICAgICAgIG1hc3MgPSBfb3B0aW9ucyRtYXNzID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkbWFzcywKICAgICAgICAgIF9vcHRpb25zJGZyaWN0aW9uID0gb3B0aW9ucy5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX29wdGlvbnMkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfb3B0aW9ucyRmcmljdGlvbjsKICAgICAgdmFyIHNjYWxlID0gREVGQVVMVF9TQ0FMRTsKICAgICAgdmFyIGJ0YSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRiID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciBidGMgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIHRyaU1lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCh0cnVlLCBmYWxzZSk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNvbXBvbmVudHMgPSB2ZXJ0aWNlc1tpXTsKICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2ldID8gaW5kZXhlc1tpXSA6IG51bGw7CiAgICAgICAgdmFyIG1hdHJpeCA9IEFycmF5LmZyb20obWF0cmljZXNbaV0pOwoKICAgICAgICBpZiAoaW5kZXgpIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgaW5kZXgubGVuZ3RoOyBqICs9IDMpIHsKICAgICAgICAgICAgdmFyIGFpID0gaW5kZXhbal0gKiAzOwogICAgICAgICAgICB2YXIgYmkgPSBpbmRleFtqICsgMV0gKiAzOwogICAgICAgICAgICB2YXIgY2kgPSBpbmRleFtqICsgMl0gKiAzOwogICAgICAgICAgICB2YXIgdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbYWldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbYWkgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2FpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgdmFyIHZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2JpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2JpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tiaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tjaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tjaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbY2kgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICBidGEuc2V0VmFsdWUodmEueCwgdmEueSwgdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZSh2Yi54LCB2Yi55LCB2Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yICh2YXIgX2ogPSAwOyBfaiA8IGNvbXBvbmVudHMubGVuZ3RoOyBfaiArPSA5KSB7CiAgICAgICAgICAgIHZhciBfdmEgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyAwXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICB2YXIgX3ZiID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgM10sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDRdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyA1XQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDZdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA3XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgOF0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZShfdmEueCwgX3ZhLnksIF92YS56KTsKICAgICAgICAgICAgYnRiLnNldFZhbHVlKF92Yi54LCBfdmIueSwgX3ZiLnopOwogICAgICAgICAgICBidGMuc2V0VmFsdWUoX3ZjLngsIF92Yy55LCBfdmMueik7CiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdmFyIGxvY2FsU2NhbGUgPSBuZXcgQW1tby5idFZlY3RvcjMoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7CiAgICAgIHRyaU1lc2guc2V0U2NhbGluZyhsb2NhbFNjYWxlKTsKICAgICAgQW1tby5kZXN0cm95KGxvY2FsU2NhbGUpOwogICAgICB2YXIgY29sbGlzaW9uU2hhcGUgPSBuZXcgQW1tby5idEJ2aFRyaWFuZ2xlTWVzaFNoYXBlKHRyaU1lc2gsIHRydWUsIHRydWUpOwogICAgICBjb2xsaXNpb25TaGFwZS5yZXNvdXJjZXMgPSBbdHJpTWVzaF07CiAgICAgIEFtbW8uZGVzdHJveShidGEpOwogICAgICBBbW1vLmRlc3Ryb3koYnRiKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yyk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNvbGxpc2lvblNoYXBlLCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLk1FU0gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRCb3ggPSBmdW5jdGlvbiBhZGRCb3goZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIGxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAwLjUsIGhlaWdodCAqIDAuNSwgbGVuZ3RoICogMC41KSk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLkJPWCwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGFkZFNwaGVyZSA9IGZ1bmN0aW9uIGFkZFNwaGVyZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcmFkaXVzID0gZGF0YS5yYWRpdXMsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgX2RhdGEkbWFzczIgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzczIgPT09IHZvaWQgMCA/IDAgOiBfZGF0YSRtYXNzMiwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uMiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uMiA9PT0gdm9pZCAwID8gMiA6IF9kYXRhJGZyaWN0aW9uMjsKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5TUEhFUkUsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRMaW5lYXJWZWxvY2l0eSA9IGZ1bmN0aW9uIHNldExpbmVhclZlbG9jaXR5KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBfZGF0YSR2ZWxvY2l0eSA9IGRhdGEudmVsb2NpdHksCiAgICAgICAgICB2ZWxvY2l0eSA9IF9kYXRhJHZlbG9jaXR5ID09PSB2b2lkIDAgPyBERUZBVUxUX0xJTkVBUl9WRUxPQ0lUWSA6IF9kYXRhJHZlbG9jaXR5OwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGxpbmVhclZlbG9jaXR5ID0gbmV3IEFtbW8uYnRWZWN0b3IzKHZlbG9jaXR5LngsIHZlbG9jaXR5LnksIHZlbG9jaXR5LnopOwogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIEFtbW8uZGVzdHJveShsaW5lYXJWZWxvY2l0eSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgc2V0UG9zaXRpb24gPSBmdW5jdGlvbiBzZXRQb3NpdGlvbihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MiA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQyLmJvZHk7CgogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgIH07CiAgICB2YXIgYXBwbHlJbXB1c2UgPSBmdW5jdGlvbiBhcHBseUltcHVzZShfcmVmKSB7CiAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgX3JlZiRpbXB1bHNlID0gX3JlZi5pbXB1bHNlLAogICAgICAgICAgaW1wdWxzZSA9IF9yZWYkaW1wdWxzZSA9PT0gdm9pZCAwID8gREVGQVVMVF9JTVBVTFNFIDogX3JlZiRpbXB1bHNlOwoKICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50MyA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQzLmJvZHk7CgogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgaW1wdWxzZVZlY3RvciA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhpbXB1bHNlLngsIGltcHVsc2UueSwgaW1wdWxzZS56KTsKICAgICAgICBib2R5LmFwcGx5Q2VudHJhbEltcHVsc2UoaW1wdWxzZVZlY3Rvcik7CiAgICAgICAgQW1tby5kZXN0cm95KGltcHVsc2VWZWN0b3IpOwogICAgICB9CiAgICB9OwogICAgdmFyIGhhbmRsZUVsZW1lbnRVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVFbGVtZW50VXBkYXRlKF9yZWYyLCBkdCkgewogICAgICB2YXIgYm9keSA9IF9yZWYyLmJvZHksCiAgICAgICAgICB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIF9yZWYyLnN0YXRlOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgYWRkUGxheWVyID0gZnVuY3Rpb24gYWRkUGxheWVyKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gZGF0YS5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBkYXRhLmZyaWN0aW9uOwogICAgICB2YXIgY2Fwc3VsZSA9IG5ldyBBbW1vLmJ0Q2Fwc3VsZVNoYXBlKHdpZHRoLCBoZWlnaHQpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjYXBzdWxlLCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsgLy8gZGlzYWJsaWluZyByb3RhdGlvbiBmb3IgY29sbGlzaW9ucwoKICAgICAgYm9keS5zZXRBbmd1bGFyRmFjdG9yKDApOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5QTEFZRVIsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBoYW5kbGVQbGF5ZXJVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVQbGF5ZXJVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmLmJvZHksCiAgICAgICAgICB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgX3JlZiRzdGF0ZSA9IF9yZWYuc3RhdGUsCiAgICAgICAgICBzdGF0ZSA9IF9yZWYkc3RhdGUgPT09IHZvaWQgMCA/IERFRkFVTFRfUklHSURCT0RZX1NUQVRFIDogX3JlZiRzdGF0ZTsKICAgICAgdmFyIG1vdmVtZW50ID0gc3RhdGUubW92ZW1lbnQ7CiAgICAgICAgICBzdGF0ZS5kaXJlY3Rpb247CiAgICAgICAgICB2YXIgY2FtZXJhRGlyZWN0aW9uID0gc3RhdGUuY2FtZXJhRGlyZWN0aW9uOwogICAgICAgICAgc3RhdGUucXVhdGVybmlvbjsKICAgICAgICAgIHN0YXRlLnBvc2l0aW9uOwogICAgICB2YXIgTUFYX1NQRUVEID0gMTsKICAgICAgdmFyIHdhbGtWZWxvY2l0eSA9IC4xOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IGJvZHkuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICB2YXIgc3BlZWQgPSBsaW5lYXJWZWxvY2l0eS5sZW5ndGgoKTsKICAgICAgICB2YXIgZm9yd2FyZERpciA9IHRyYW5zZm9ybS5nZXRCYXNpcygpLmdldFJvdygyKTsKICAgICAgICBmb3J3YXJkRGlyLm5vcm1hbGl6ZSgpOwogICAgICAgIHZhciB3YWxrRGlyZWN0aW9uID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAuMCwgMC4wLCAwLjApOwogICAgICAgIHZhciB3YWxrU3BlZWQgPSB3YWxrVmVsb2NpdHkgKiBkdDsKCiAgICAgICAgaWYgKG1vdmVtZW50LmZvcndhcmQpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSArIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpICsgZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSArIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmIChtb3ZlbWVudC5iYWNrd2FyZHMpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSAtIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpIC0gZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSAtIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmICghbW92ZW1lbnQuZm9yd2FyZCAmJiAhbW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSAqIDAuMik7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSAqIDAuMik7CiAgICAgICAgfSBlbHNlIGlmIChzcGVlZCA8IE1BWF9TUEVFRCkgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKyBjYW1lcmFEaXJlY3Rpb24ueCAqIHdhbGtTcGVlZCk7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSArIGNhbWVyYURpcmVjdGlvbi56ICogd2Fsa1NwZWVkKTsKICAgICAgICB9CgogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIGJvZHkuZ2V0TW90aW9uU3RhdGUoKS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGJvZHkuc2V0Q2VudGVyT2ZNYXNzVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdmFyIG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICB2YXIgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTsKICAgICAgICBkaXNwYXRjaGVyLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgQ2xvY2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBDbG9jaygpIHsKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xvY2spOwoKICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhDbG9jaywgW3sKICAgICAgICBrZXk6ICJnZXREZWx0YSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlbHRhKCkgewogICAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwoKICAgICAgICAgIGlmICh0aGlzLnRpbWVzdGFtcCkgewogICAgICAgICAgICB2YXIgZGVsdGEgPSB0aW1lIC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIGRlbHRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBDbG9jazsKICAgIH0oKTsKCiAgICB2YXIgV29ybGQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBXb3JsZCgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV29ybGQpOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImluaXQiLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgdmFyIF9vcHRpb25zJGdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHksCiAgICAgICAgICAgICAgZ3Jhdml0eSA9IF9vcHRpb25zJGdyYXZpdHkgPT09IHZvaWQgMCA/IEdSQVZJVFkgOiBfb3B0aW9ucyRncmF2aXR5OwogICAgICAgICAgX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IG5ldyBBbW1vLmJ0RGVmYXVsdENvbGxpc2lvbkNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgIF90aGlzLmRpc3BhdGNoZXIgPSBuZXcgQW1tby5idENvbGxpc2lvbkRpc3BhdGNoZXIoX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBfdGhpcy5icm9hZHBoYXNlID0gbmV3IEFtbW8uYnREYnZ0QnJvYWRwaGFzZSgpOwogICAgICAgICAgX3RoaXMuc29sdmVyID0gbmV3IEFtbW8uYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIoKTsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQgPSBuZXcgQW1tby5idERpc2NyZXRlRHluYW1pY3NXb3JsZChfdGhpcy5kaXNwYXRjaGVyLCBfdGhpcy5icm9hZHBoYXNlLCBfdGhpcy5zb2x2ZXIsIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwoKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc2V0R3Jhdml0eShuZXcgQW1tby5idFZlY3RvcjMoZ3Jhdml0eS54LCBncmF2aXR5LnksIGdyYXZpdHkueikpOyAvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZ2hvc3RPYmplY3QgY29sbGlzaW9ucwoKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmdldEJyb2FkcGhhc2UoKS5nZXRPdmVybGFwcGluZ1BhaXJDYWNoZSgpLnNldEludGVybmFsR2hvc3RQYWlyQ2FsbGJhY2sobmV3IEFtbW8uYnRHaG9zdFBhaXJDYWxsYmFjaygpKTsKCiAgICAgICAgICBfdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICBpZiAoX3RoaXMuaGFzRWxlbWVudCh1dWlkKSkgewogICAgICAgICAgICBfdGhpcy5lbGVtZW50c1t1dWlkXS5kZWxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJyZW1vdmVEZWxldGVkRWxlbWVudHMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZpbHRlcihmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZDsKICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgZGVsZXRlIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaGFzRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmluY2x1ZGVzKHV1aWQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldEVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImlzSW5pdGlhbGlzZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuaW5pdGlhbGlzZWQ7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZ2V0RHluYW1pY3NXb3JsZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5keW5hbWljc1dvcmxkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZFJpZ2lkQm9keSIsIGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRBY3Rpb24iLCBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZEFjdGlvbihhY3Rpb24pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZENvbGxpc2lvbk9iamVjdCIsIGZ1bmN0aW9uIChjb2xsaXNpb25PYmplY3QpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGNvbGxpc2lvbk9iamVjdCk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic3RlcFNpbXVsYXRpb24iLCBmdW5jdGlvbiAoZHQpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc3RlcFNpbXVsYXRpb24oZHQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNpbXVsYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGR0ID0gX3RoaXMuY2xvY2suZ2V0RGVsdGEoKTsKCiAgICAgICAgICBfdGhpcy5zdGVwU2ltdWxhdGlvbihkdCk7CgogICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5CT1g6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlNQSEVSRToKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuTUVTSDoKICAgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudFVwZGF0ZShlbGVtZW50LCBkdCk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuUExBWUVSOgogICAgICAgICAgICAgICAgICBoYW5kbGVQbGF5ZXJVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlZFSElDTEU6CiAgICAgICAgICAgICAgICAgIGhhbmRsZVZlaGljbGVVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIF90aGlzLmNhbGN1bGF0ZUNvbGxpc2lvbnMoKTsKCiAgICAgICAgICBfdGhpcy5yZW1vdmVEZWxldGVkRWxlbWVudHMoKTsKCiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFBoeXNpY3NVcGRhdGUoZHQpOwogICAgICAgICAgX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMuc2ltdWxhdGUuYmluZChfdGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImNhbGN1bGF0ZUNvbGxpc2lvbnMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYW1tb0Rpc3BhdGNoZXIgPSBfdGhpcy5keW5hbWljc1dvcmxkLmdldERpc3BhdGNoZXIoKTsKCiAgICAgICAgICB2YXIgbnVtTWFuaWZvbGRzID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TnVtTWFuaWZvbGRzKCk7CgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1NYW5pZm9sZHM7IGkrKykgewogICAgICAgICAgICB2YXIgY29udGFjdE1hbmlmb2xkID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwoaSk7CiAgICAgICAgICAgIHZhciByYjAgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkwKCksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgICAgICB2YXIgcmIxID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MSgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIG51bUNvbnRhY3RzID0gY29udGFjdE1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7IC8vIHRoaXMgaXRlcmF0aW9uIGRvZXNuJ3QgaGF2ZSB1dWlkcwoKICAgICAgICAgICAgaWYgKCFyYjAudXVpZCB8fCAhcmIxLnV1aWQpIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgY29udGFjdHMgPSBbXTsKCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtQ29udGFjdHM7IGorKykgewogICAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQgPSBjb250YWN0TWFuaWZvbGQuZ2V0Q29udGFjdFBvaW50KGopOwogICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbnRhY3RQb2ludC5nZXREaXN0YW5jZSgpOwogICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IDAuMCkgY29udGludWU7CiAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5MCA9IHJiMC5nZXRMaW5lYXJWZWxvY2l0eSgpOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTEgPSByYjEuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MwID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkEoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MxID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkIoKTsKICAgICAgICAgICAgICB2YXIgbG9jYWxQb3MwID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRBKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QigpOwogICAgICAgICAgICAgIGNvbnRhY3RzLnB1c2goewogICAgICAgICAgICAgICAgZGlzdGFuY2U6IGRpc3RhbmNlLAogICAgICAgICAgICAgICAgZWxlbWVudHM6IFt7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMC51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMC55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MwLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMS51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMS55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MxLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIwLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIxLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZEVsZW1lbnQiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgX3RoaXMuZWxlbWVudHNbZGF0YS51dWlkXSA9IGRhdGE7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidXBkYXRlQm9keVN0YXRlIiwgZnVuY3Rpb24gKF9yZWYpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTsKCiAgICAgICAgICBpZiAoX3RoaXMuaGFzRWxlbWVudCh1dWlkKSkgewogICAgICAgICAgICBfdGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBfdGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSksIHN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJ0ZXJtaW5hdGUiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZHluYW1pY3NXb3JsZCk7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuc29sdmVyKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5kaXNwYXRjaGVyKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkKTsKICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kVGVybWluYXRlRXZlbnQoKTsKICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5lbGVtZW50cyA9IHt9OwogICAgICAgIHRoaXMuaW5pdGlhbGlzZWQgPSBmYWxzZTsKICAgICAgICB0aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuYnJvYWRwaGFzZSA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLnNvbHZlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IG51bGw7CiAgICAgICAgdGhpcy5jbG9jayA9IG5ldyBDbG9jaygpOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoV29ybGQsIFt7CiAgICAgICAga2V5OiAiZGlzcG9zZUJvZHkiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlQm9keShfcmVmMikgewogICAgICAgICAgdmFyIHV1aWQgPSBfcmVmMi51dWlkOwogICAgICAgICAgdmFyIGVsZW1lbnQgPSB0aGlzLmdldEVsZW1lbnQodXVpZCk7CiAgICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQucmVtb3ZlUmlnaWRCb2R5KGVsZW1lbnQuYm9keSk7CiAgICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodXVpZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEVsZW1lbnREaXNwb3NlZCh7CiAgICAgICAgICAgIHV1aWQ6IHV1aWQKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfV0pOwoKICAgICAgcmV0dXJuIFdvcmxkOwogICAgfSgpOwogICAgdmFyIHdvcmxkID0gbmV3IFdvcmxkKCk7CgogICAgdmFyIERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UgPSAwLjI7CiAgICB2YXIgREVGQVVMVF9GUklDVElPTiA9IDEwMDA7CiAgICB2YXIgREVGQVVMVF9NQVNTID0gODAwOwogICAgdmFyIGFkZFZlaGljbGUgPSBmdW5jdGlvbiBhZGRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2hlZWxzID0gZGF0YS53aGVlbHMsCiAgICAgICAgICBfZGF0YSRtYXNzID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFTUyA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSR3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICB3aWR0aCA9IF9kYXRhJHdpZHRoID09PSB2b2lkIDAgPyAxLjggOiBfZGF0YSR3aWR0aCwKICAgICAgICAgIF9kYXRhJGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgaGVpZ2h0ID0gX2RhdGEkaGVpZ2h0ID09PSB2b2lkIDAgPyAuNiA6IF9kYXRhJGhlaWdodCwKICAgICAgICAgIF9kYXRhJGxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgbGVuZ3RoID0gX2RhdGEkbGVuZ3RoID09PSB2b2lkIDAgPyA0IDogX2RhdGEkbGVuZ3RoLAogICAgICAgICAgX2RhdGEkZnJpY3Rpb24gPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbiA9PT0gdm9pZCAwID8gREVGQVVMVF9GUklDVElPTiA6IF9kYXRhJGZyaWN0aW9uLAogICAgICAgICAgX2RhdGEkcm9sbEluZmx1ZW5jZSA9IGRhdGEucm9sbEluZmx1ZW5jZSwKICAgICAgICAgIHJvbGxJbmZsdWVuY2UgPSBfZGF0YSRyb2xsSW5mbHVlbmNlID09PSB2b2lkIDAgPyBERUZBVUxUX1JPTExfSU5GTFVFTkNFIDogX2RhdGEkcm9sbEluZmx1ZW5jZSwKICAgICAgICAgIF9kYXRhJHdoZWVsc09wdGlvbnMgPSBkYXRhLndoZWVsc09wdGlvbnMsCiAgICAgICAgICB3aGVlbHNPcHRpb25zID0gX2RhdGEkd2hlZWxzT3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfZGF0YSR3aGVlbHNPcHRpb25zLAogICAgICAgICAgX2RhdGEkc3VzcGVuc2lvbnMgPSBkYXRhLnN1c3BlbnNpb25zLAogICAgICAgICAgc3VzcGVuc2lvbnMgPSBfZGF0YSRzdXNwZW5zaW9ucyA9PT0gdm9pZCAwID8ge30gOiBfZGF0YSRzdXNwZW5zaW9uczsKICAgICAgdmFyIF93aGVlbHNPcHRpb25zJGJhY2sgPSB3aGVlbHNPcHRpb25zLmJhY2ssCiAgICAgICAgICBiYWNrID0gX3doZWVsc09wdGlvbnMkYmFjayA9PT0gdm9pZCAwID8ge30gOiBfd2hlZWxzT3B0aW9ucyRiYWNrLAogICAgICAgICAgX3doZWVsc09wdGlvbnMkZnJvbnQgPSB3aGVlbHNPcHRpb25zLmZyb250LAogICAgICAgICAgZnJvbnQgPSBfd2hlZWxzT3B0aW9ucyRmcm9udCA9PT0gdm9pZCAwID8ge30gOiBfd2hlZWxzT3B0aW9ucyRmcm9udDsKICAgICAgdmFyIF9iYWNrJGF4aXNQb3NpdGlvbiA9IGJhY2suYXhpc1Bvc2l0aW9uLAogICAgICAgICAgYXhpc1Bvc2l0aW9uQmFjayA9IF9iYWNrJGF4aXNQb3NpdGlvbiA9PT0gdm9pZCAwID8gLTEgOiBfYmFjayRheGlzUG9zaXRpb24sCiAgICAgICAgICBfYmFjayRyYWRpdXMgPSBiYWNrLnJhZGl1cywKICAgICAgICAgIHdoZWVsUmFkaXVzQmFjayA9IF9iYWNrJHJhZGl1cyA9PT0gdm9pZCAwID8gLjQgOiBfYmFjayRyYWRpdXMsCiAgICAgICAgICBfYmFjayRoYWxmVHJhY2sgPSBiYWNrLmhhbGZUcmFjaywKICAgICAgICAgIHdoZWVsSGFsZlRyYWNrQmFjayA9IF9iYWNrJGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9iYWNrJGhhbGZUcmFjaywKICAgICAgICAgIF9iYWNrJGF4aXNIZWlnaHQgPSBiYWNrLmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRCYWNrID0gX2JhY2skYXhpc0hlaWdodCA9PT0gdm9pZCAwID8gLjMgOiBfYmFjayRheGlzSGVpZ2h0OwogICAgICB2YXIgX2Zyb250JGF4aXNQb3NpdGlvbiA9IGZyb250LmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkZyb250ID0gX2Zyb250JGF4aXNQb3NpdGlvbiA9PT0gdm9pZCAwID8gMS43IDogX2Zyb250JGF4aXNQb3NpdGlvbiwKICAgICAgICAgIF9mcm9udCRyYWRpdXMgPSBmcm9udC5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0Zyb250ID0gX2Zyb250JHJhZGl1cyA9PT0gdm9pZCAwID8gLjQgOiBfZnJvbnQkcmFkaXVzLAogICAgICAgICAgX2Zyb250JGhhbGZUcmFjayA9IGZyb250LmhhbGZUcmFjaywKICAgICAgICAgIHdoZWVsSGFsZlRyYWNrRnJvbnQgPSBfZnJvbnQkaGFsZlRyYWNrID09PSB2b2lkIDAgPyAxIDogX2Zyb250JGhhbGZUcmFjaywKICAgICAgICAgIF9mcm9udCRheGlzSGVpZ2h0ID0gZnJvbnQuYXhpc0hlaWdodCwKICAgICAgICAgIHdoZWVsQXhpc0hlaWdodEZyb250ID0gX2Zyb250JGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2Zyb250JGF4aXNIZWlnaHQ7CiAgICAgIHZhciBfc3VzcGVuc2lvbnMkc3RpZmZuZXMgPSBzdXNwZW5zaW9ucy5zdGlmZm5lc3MsCiAgICAgICAgICBzdGlmZm5lc3MgPSBfc3VzcGVuc2lvbnMkc3RpZmZuZXMgPT09IHZvaWQgMCA/IDIwLjAgOiBfc3VzcGVuc2lvbnMkc3RpZmZuZXMsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkZGFtcGluZyA9IHN1c3BlbnNpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX3N1c3BlbnNpb25zJGRhbXBpbmcgPT09IHZvaWQgMCA/IDIuMyA6IF9zdXNwZW5zaW9ucyRkYW1waW5nLAogICAgICAgICAgX3N1c3BlbnNpb25zJGNvbXByZXNzID0gc3VzcGVuc2lvbnMuY29tcHJlc3Npb24sCiAgICAgICAgICBjb21wcmVzc2lvbiA9IF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9PT0gdm9pZCAwID8gNC40IDogX3N1c3BlbnNpb25zJGNvbXByZXNzLAogICAgICAgICAgX3N1c3BlbnNpb25zJHJlc3RMZW5nID0gc3VzcGVuc2lvbnMucmVzdExlbmd0aCwKICAgICAgICAgIHJlc3RMZW5ndGggPSBfc3VzcGVuc2lvbnMkcmVzdExlbmcgPT09IHZvaWQgMCA/IDAuNiA6IF9zdXNwZW5zaW9ucyRyZXN0TGVuZzsgLy8gQ2hhc3NpcwoKICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAuNSwgaGVpZ2h0ICogLjUsIGxlbmd0aCAqIC41KSk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZSh0cmFuc2Zvcm0pOwogICAgICB2YXIgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApOwogICAgICBnZW9tZXRyeS5jYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGNoYXNzaXMgPSBuZXcgQW1tby5idFJpZ2lkQm9keShuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIGdlb21ldHJ5LCBsb2NhbEluZXJ0aWEpKTsKICAgICAgY2hhc3Npcy5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoY2hhc3Npcyk7IC8vIFJheWNhc3QgVmVoaWNsZQoKICAgICAgdmFyIHR1bmluZyA9IG5ldyBBbW1vLmJ0VmVoaWNsZVR1bmluZygpOwogICAgICB2YXIgcmF5Q2FzdGVyID0gbmV3IEFtbW8uYnREZWZhdWx0VmVoaWNsZVJheWNhc3Rlcih3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkpOwogICAgICB2YXIgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUodHVuaW5nLCBjaGFzc2lzLCByYXlDYXN0ZXIpOwogICAgICB2ZWhpY2xlLnNldENvb3JkaW5hdGVTeXN0ZW0oMCwgMSwgMik7CiAgICAgIHdvcmxkLmFkZEFjdGlvbih2ZWhpY2xlKTsKICAgICAgdmFyIHdoZWVsRGlyZWN0aW9uQ1MwID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIC0xLCAwKTsKICAgICAgdmFyIHdoZWVsQXhsZUNTID0gbmV3IEFtbW8uYnRWZWN0b3IzKC0xLCAwLCAwKTsKCiAgICAgIHZhciBhZGRXaGVlbCA9IGZ1bmN0aW9uIGFkZFdoZWVsKGlzRnJvbnQsIHBvcywgcmFkaXVzKSB7CiAgICAgICAgdmFyIHdoZWVsSW5mbyA9IHZlaGljbGUuYWRkV2hlZWwocG9zLCB3aGVlbERpcmVjdGlvbkNTMCwgd2hlZWxBeGxlQ1MsIHJlc3RMZW5ndGgsIHJhZGl1cywgdHVuaW5nLCBpc0Zyb250KTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fc3VzcGVuc2lvblN0aWZmbmVzcyhzdGlmZm5lc3MpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV93aGVlbHNEYW1waW5nUmVsYXhhdGlvbihkYW1waW5nKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uKGNvbXByZXNzaW9uKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fZnJpY3Rpb25TbGlwKGZyaWN0aW9uKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fcm9sbEluZmx1ZW5jZShyb2xsSW5mbHVlbmNlKTsKICAgICAgfTsKCiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTsKICAgICAgYWRkV2hlZWwodHJ1ZSwgbmV3IEFtbW8uYnRWZWN0b3IzKC13aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTsKICAgICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spOwogICAgICB2ZWhpY2xlLnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB0eXBlOiBUWVBFUy5WRUhJQ0xFLAogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgdmVoaWNsZTogdmVoaWNsZSwKICAgICAgICB3aGVlbHM6IHdoZWVscywKICAgICAgICBvcHRpb25zOiBkYXRhLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1ZFSElDTEVfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVQb3NpdGlvbiA9IGZ1bmN0aW9uIHNldFZlaGljbGVQb3NpdGlvbihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgc2V0VmVoaWNsZVF1YXRlcm5pb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUXVhdGVybmlvbihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciByZXNldFZlaGljbGUgPSBmdW5jdGlvbiByZXNldFZlaGljbGUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGhhbmRsZVZlaGljbGVVcGRhdGUgPSBmdW5jdGlvbiBoYW5kbGVWZWhpY2xlVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciB2ZWhpY2xlID0gX3JlZi52ZWhpY2xlLAogICAgICAgICAgd2hlZWxzID0gX3JlZi53aGVlbHMsCiAgICAgICAgICB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgX3JlZiRzdGF0ZSA9IF9yZWYuc3RhdGUsCiAgICAgICAgICBzdGF0ZSA9IF9yZWYkc3RhdGUgPT09IHZvaWQgMCA/IERFRkFVTFRfVkVISUNMRV9TVEFURSA6IF9yZWYkc3RhdGUsCiAgICAgICAgICBfcmVmJG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsCiAgICAgICAgICBvcHRpb25zID0gX3JlZiRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYkb3B0aW9uczsKICAgICAgdmFyIGJyZWFraW5nRm9yY2UgPSAwOwogICAgICB2YXIgZW5naW5lRm9yY2UgPSAwOwogICAgICB2YXIgX29wdGlvbnMkc3RlZXJpbmdDbGFtID0gb3B0aW9ucy5zdGVlcmluZ0NsYW1wLAogICAgICAgICAgc3RlZXJpbmdDbGFtcCA9IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19DTEFNUCA6IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSwKICAgICAgICAgIF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9IG9wdGlvbnMuc3RlZXJpbmdJbmNyZW1lbnQsCiAgICAgICAgICBzdGVlcmluZ0luY3JlbWVudCA9IF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgOiBfb3B0aW9ucyRzdGVlcmluZ0luY3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPSBvcHRpb25zLm1heEVuZ2luZUZvcmNlLAogICAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA6IF9vcHRpb25zJG1heEVuZ2luZUZvciwKICAgICAgICAgIF9vcHRpb25zJG1heEJyZWFraW5nRiA9IG9wdGlvbnMubWF4QnJlYWtpbmdGb3JjZSwKICAgICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIDogX29wdGlvbnMkbWF4QnJlYWtpbmdGOwoKICAgICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikgewogICAgICAgIGlmIChzcGVlZCA8IC0xKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5icmFraW5nKSB7CiAgICAgICAgaWYgKHNwZWVkID4gMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5sZWZ0KSB7CiAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IHN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3RhdGUucmlnaHQpIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiAtc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgLXN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiBzdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfUklHSFQpOwogICAgICB2YXIgdG0sIHAsIHEsIGk7CiAgICAgIHZhciBuID0gdmVoaWNsZS5nZXROdW1XaGVlbHMoKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpOwogICAgICAgIHRtID0gdmVoaWNsZS5nZXRXaGVlbFRyYW5zZm9ybVdTKGkpOwogICAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgICB2YXIgd2hlZWxVVUlEID0gd2hlZWxzW2ldOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh3aGVlbFVVSUQsIHAsIHEsIGR0KTsKICAgICAgfQoKICAgICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpOwogICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICB2YXIgZGlyZWN0aW9uID0gdmVoaWNsZS5nZXRGb3J3YXJkVmVjdG9yKCk7CiAgICAgIHZhciBzcGVlZCA9IHZlaGljbGUuZ2V0Q3VycmVudFNwZWVkS21Ib3VyKCk7CiAgICAgIHZhciBleHRyYURhdGEgPSB7CiAgICAgICAgZGlyZWN0aW9uOiB7CiAgICAgICAgICB4OiBkaXJlY3Rpb24ueCgpLAogICAgICAgICAgeTogZGlyZWN0aW9uLnkoKSwKICAgICAgICAgIHo6IGRpcmVjdGlvbi56KCkKICAgICAgICB9LAogICAgICAgIHNwZWVkOiBzcGVlZAogICAgICB9OwogICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUodXVpZCwgcCwgcSwgZHQsIGV4dHJhRGF0YSk7CiAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZSh1dWlkLCBzdGF0ZSk7CiAgICB9OwoKICAgIHZhciBjcmVhdGVHaG9zdENvbGxpZGVyID0gZnVuY3Rpb24gY3JlYXRlR2hvc3RDb2xsaWRlcihyYWRpdXMsIHBvc2l0aW9uKSB7CiAgICAgIHZhciBnaG9zdENvbGxpZGVyID0gbmV3IEFtbW8uYnRHaG9zdE9iamVjdCgpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRDb2xsaXNpb25TaGFwZShuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cykpOwogICAgICBnaG9zdENvbGxpZGVyLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKHBvc2l0aW9uKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbigwLCAwLCAwLCAxKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBnaG9zdENvbGxpZGVyOiBnaG9zdENvbGxpZGVyLAogICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtCiAgICAgIH07CiAgICB9OwogICAgdmFyIGZvckVhY2hHaG9zdENvbGxpc2lvbiA9IGZ1bmN0aW9uIGZvckVhY2hHaG9zdENvbGxpc2lvbihnaG9zdENvbGxpZGVyKSB7CiAgICAgIHZhciBmb3JFYWNoQ2FsbGJhY2sgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZ1bmN0aW9uICgpIHt9OwogICAgICB2YXIgY29sbGlzaW9ucyA9IGdob3N0Q29sbGlkZXIuZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzKCk7CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxpc2lvbnM7IGkrKykgewogICAgICAgIHZhciBvYmplY3QgPSBBbW1vLmNhc3RPYmplY3QoZ2hvc3RDb2xsaWRlci5nZXRPdmVybGFwcGluZ09iamVjdChpKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgb2JqZWN0LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgZm9yRWFjaENhbGxiYWNrKG9iamVjdCwgdHJhbnNmb3JtLCBpKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBnZXRFeHBsb3Npb25Qb3NpdGlvbiA9IGZ1bmN0aW9uIGdldEV4cGxvc2lvblBvc2l0aW9uKHV1aWQsIHBvc2l0aW9uKSB7CiAgICAgIHZhciBleHBsb3Npb25Qb3NpdGlvbiA9IHBvc2l0aW9uOwoKICAgICAgaWYgKCFleHBsb3Npb25Qb3NpdGlvbikgewogICAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudC5ib2R5OwoKICAgICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBleHBsb3Npb25Qb3NpdGlvbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGV4cGxvc2lvblBvc2l0aW9uOwogICAgfTsKICAgIHZhciBnZXRFeHBsb3Npb25JbXB1bHNlID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uSW1wdWxzZShwb3NpdGlvbiwgZXhwbG9zaW9uUG9zaXRpb24sIHN0cmVuZ3RoKSB7CiAgICAgIHZhciBkaXN0YW5jZSA9IHBvc2l0aW9uLm9wX3N1YihleHBsb3Npb25Qb3NpdGlvbik7CiAgICAgIGRpc3RhbmNlLm5vcm1hbGl6ZSgpOwogICAgICB2YXIgaW1wdWxzZSA9IGRpc3RhbmNlLm9wX211bChzdHJlbmd0aCk7CiAgICAgIGltcHVsc2Uuc2V0WShpbXB1bHNlLnkoKSArIHN0cmVuZ3RoKTsKICAgICAgcmV0dXJuIGltcHVsc2U7CiAgICB9OwogICAgdmFyIGNyZWF0ZUV4cGxvc2lvbiA9IGZ1bmN0aW9uIGNyZWF0ZUV4cGxvc2lvbihfcmVmKSB7CiAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBfcmVmLnBvc2l0aW9uLAogICAgICAgICAgX3JlZiRyYWRpdXMgPSBfcmVmLnJhZGl1cywKICAgICAgICAgIHJhZGl1cyA9IF9yZWYkcmFkaXVzID09PSB2b2lkIDAgPyBFWFBMT1NJT05fU0laRVMuU01BTEwgOiBfcmVmJHJhZGl1cywKICAgICAgICAgIF9yZWYkc3RyZW5ndGggPSBfcmVmLnN0cmVuZ3RoLAogICAgICAgICAgc3RyZW5ndGggPSBfcmVmJHN0cmVuZ3RoID09PSB2b2lkIDAgPyBFWFBMT1NJT05fU1RSRU5HVEhTLk1FRElVTSA6IF9yZWYkc3RyZW5ndGg7CgogICAgICB0cnkgewogICAgICAgIHZhciBleHBsb3Npb25Qb3NpdGlvbiA9IGdldEV4cGxvc2lvblBvc2l0aW9uKHV1aWQsIHBvc2l0aW9uKTsKCiAgICAgICAgdmFyIF9jcmVhdGVHaG9zdENvbGxpZGVyID0gY3JlYXRlR2hvc3RDb2xsaWRlcihyYWRpdXMsIGV4cGxvc2lvblBvc2l0aW9uKSwKICAgICAgICAgICAgZ2hvc3RDb2xsaWRlciA9IF9jcmVhdGVHaG9zdENvbGxpZGVyLmdob3N0Q29sbGlkZXIsCiAgICAgICAgICAgIHRyYW5zZm9ybSA9IF9jcmVhdGVHaG9zdENvbGxpZGVyLnRyYW5zZm9ybTsKCiAgICAgICAgd29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIGZvckVhY2hHaG9zdENvbGxpc2lvbihnaG9zdENvbGxpZGVyLCBmdW5jdGlvbiAob2JqZWN0LCBvYmplY3RUcmFuc2Zvcm0pIHsKICAgICAgICAgIHZhciBvcmlnaW4gPSBvYmplY3RUcmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgICBvYmplY3QuYWN0aXZhdGUodHJ1ZSk7CiAgICAgICAgICBvYmplY3QuYXBwbHlDZW50cmFsSW1wdWxzZShnZXRFeHBsb3Npb25JbXB1bHNlKG9yaWdpbiwgZXhwbG9zaW9uUG9zaXRpb24sIHN0cmVuZ3RoKSk7CiAgICAgICAgfSk7CiAgICAgICAgd29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpLnJlbW92ZUNvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3koZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICBjb25zb2xlLmxvZyhlKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgaGFuZGxlTG9hZEV2ZW50ID0gZnVuY3Rpb24gaGFuZGxlTG9hZEV2ZW50KG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChBbW1vKSB7CiAgICAgICAgc2VsZi5BbW1vID0gQW1tbzsKCiAgICAgICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKF9yZWYpIHsKICAgICAgICAgIHZhciBkYXRhID0gX3JlZi5kYXRhOwoKICAgICAgICAgIHN3aXRjaCAoZGF0YS5ldmVudCkgewogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5CT1g6CiAgICAgICAgICAgICAgYWRkQm94KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuU1BIRVJFOgogICAgICAgICAgICAgIGFkZFNwaGVyZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlZFSElDTEU6CiAgICAgICAgICAgICAgYWRkVmVoaWNsZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELk1PREVMOgogICAgICAgICAgICAgIGFkZE1vZGVsKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuUExBWUVSOgogICAgICAgICAgICAgIGFkZFBsYXllcihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuTElORUFSX1ZFTE9DSVRZOgogICAgICAgICAgICAgIHNldExpbmVhclZlbG9jaXR5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRQb3NpdGlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUE9TSVRJT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5RVUFURVJOSU9OOgogICAgICAgICAgICAgIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlJFU0VUOgogICAgICAgICAgICAgIHJlc2V0VmVoaWNsZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5BUFBMWS5JTVBVTFNFOgogICAgICAgICAgICAgIGFwcGx5SW1wdXNlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURToKICAgICAgICAgICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuRElTUE9TRToKICAgICAgICAgICAgICB3b3JsZC5kaXNwb3NlQm9keShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUZGRUNUUy5FWFBMT1NJT046CiAgICAgICAgICAgICAgY3JlYXRlRXhwbG9zaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEU6CiAgICAgICAgICAgICAgd29ybGQudGVybWluYXRlKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgd29ybGQuaW5pdChvcHRpb25zKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFJlYWR5RXZlbnQoKTsKICAgICAgICB3b3JsZC5zaW11bGF0ZSgpOwogICAgICB9OwogICAgfTsKCiAgICB2YXIgbG9hZEFtbW8gPSBmdW5jdGlvbiBsb2FkQW1tbyhvcHRpb25zKSB7CiAgICAgIHZhciBzY3JpcHRVcmwgPSBvcHRpb25zLmhvc3QgKyAnLycgKyAob3B0aW9ucy5wYXRoIHx8IExJQlJBUllfTkFNRSk7CiAgICAgIGltcG9ydFNjcmlwdHMoc2NyaXB0VXJsKTsKICAgICAgQW1tbygpLnRoZW4oaGFuZGxlTG9hZEV2ZW50KG9wdGlvbnMpKTsKICAgIH07CgogICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKF9yZWYyKSB7CiAgICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTsKCiAgICAgIHN3aXRjaCAoZGF0YS5ldmVudCkgewogICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuTE9BRC5BTU1POgogICAgICAgICAgbG9hZEFtbW8oZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfTsKCn0pKCk7Cgo=', null, false);
54929
+ }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczplbGVtZW50OnJlc2V0JywKICAgICAgICBBUFBMWTogewogICAgICAgICAgSU1QVUxTRTogJ3BoeXNpY3M6ZWxlbWVudDphcHBseTppbXB1bHNlJwogICAgICAgIH0KICAgICAgfSwKICAgICAgVkVISUNMRTogewogICAgICAgIFNFVDogewogICAgICAgICAgUE9TSVRJT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnBvc2l0aW9uJywKICAgICAgICAgIFFVQVRFUk5JT046ICdwaHlzaWNzOnZlaGljbGU6c2V0OnF1YXRlcm5pb24nCiAgICAgICAgfSwKICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsCiAgICAgICAgU1BFRUQ6ICdwaHlzaWNzOnZlaGljbGU6c3BlZWQnLAogICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nCiAgICAgIH0sCiAgICAgIEVGRkVDVFM6IHsKICAgICAgICBFWFBMT1NJT046ICdwaHlzaWNzOmVmZmVjdHM6ZXhwbG9zaW9uJwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgewogICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7CgogICAgICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgewogICAgICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOwogICAgICAgIGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7CiAgICAgICAgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7CiAgICAgIH0KCiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIF9vYmplY3RTcHJlYWQyKHRhcmdldCkgewogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OwogICAgICAgIGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsKICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsKICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07CiAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICBpZiAoInZhbHVlIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7CiAgICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOwogICAgICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb25zdHJ1Y3RvciwgInByb3RvdHlwZSIsIHsKICAgICAgICB3cml0YWJsZTogZmFsc2UKICAgICAgfSk7CiAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7CiAgICAgIGlmIChrZXkgaW4gb2JqKSB7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7CiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmpba2V5XSA9IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBEaXNwYXRjaGVyID0gZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHsKICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUGh5c2ljc1VwZGF0ZSIsIGZ1bmN0aW9uIChkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuVVBEQVRFLAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kUmVhZHlFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kVGVybWluYXRlRXZlbnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEUKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRCb2R5VXBkYXRlIiwgZnVuY3Rpb24gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQsIGV4dHJhRGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZShfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9CiAgICAgICAgfSwgZXh0cmFEYXRhKSwge30sIHsKICAgICAgICAgIGR0OiBkdAogICAgICAgIH0pKTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmREaXNwYXRjaEV2ZW50IiwgZnVuY3Rpb24gKHV1aWQsIGV2ZW50TmFtZSwgZXZlbnREYXRhKSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5ESVNQQVRDSCwKICAgICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgICBldmVudE5hbWU6IGV2ZW50TmFtZSwKICAgICAgICAgIGV2ZW50RGF0YTogZXZlbnREYXRhCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfTsKICAgIHZhciBkaXNwYXRjaGVyJDEgPSBuZXcgRGlzcGF0Y2hlcigpOwoKICAgIHZhciBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSBmdW5jdGlvbiBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoX3JlZikgewogICAgICB2YXIgX3JlZiR4ID0gX3JlZi54LAogICAgICAgICAgeCA9IF9yZWYkeCA9PT0gdm9pZCAwID8gMCA6IF9yZWYkeCwKICAgICAgICAgIF9yZWYkeSA9IF9yZWYueSwKICAgICAgICAgIHkgPSBfcmVmJHkgPT09IHZvaWQgMCA/IDAgOiBfcmVmJHksCiAgICAgICAgICBfcmVmJHogPSBfcmVmLnosCiAgICAgICAgICB6ID0gX3JlZiR6ID09PSB2b2lkIDAgPyAwIDogX3JlZiR6OwogICAgICB2YXIgbWF0cml4ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBbXTsKICAgICAgdmFyIHcgPSAxIC8gKG1hdHJpeFszXSAqIHggKyBtYXRyaXhbN10gKiB5ICsgbWF0cml4WzExXSAqIHogKyBtYXRyaXhbMTVdKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAobWF0cml4WzBdICogeCArIG1hdHJpeFs0XSAqIHkgKyBtYXRyaXhbOF0gKiB6ICsgbWF0cml4WzEyXSkgKiB3LAogICAgICAgIHk6IChtYXRyaXhbMV0gKiB4ICsgbWF0cml4WzVdICogeSArIG1hdHJpeFs5XSAqIHogKyBtYXRyaXhbMTNdKSAqIHcsCiAgICAgICAgejogKG1hdHJpeFsyXSAqIHggKyBtYXRyaXhbNl0gKiB5ICsgbWF0cml4WzEwXSAqIHogKyBtYXRyaXhbMTRdKSAqIHcKICAgICAgfTsKICAgIH07CgogICAgdmFyIGNyZWF0ZVJpZ2lkQm9keSA9IGZ1bmN0aW9uIGNyZWF0ZVJpZ2lkQm9keShzaGFwZSwgb3B0aW9ucykgewogICAgICB2YXIgdXVpZCA9IG9wdGlvbnMudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgX29wdGlvbnMkcmVzdGl0dXRpb24gPSBvcHRpb25zLnJlc3RpdHV0aW9uLAogICAgICAgICAgcmVzdGl0dXRpb24gPSBfb3B0aW9ucyRyZXN0aXR1dGlvbiA9PT0gdm9pZCAwID8gLjkgOiBfb3B0aW9ucyRyZXN0aXR1dGlvbiwKICAgICAgICAgIF9vcHRpb25zJGRhbXBpbmcgPSBvcHRpb25zLmRhbXBpbmcsCiAgICAgICAgICBkYW1waW5nID0gX29wdGlvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gewogICAgICAgIGxpbmVhcjogMC4yLAogICAgICAgIGFuZ3VsYXI6IDAuMgogICAgICB9IDogX29wdGlvbnMkZGFtcGluZzsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIHNoYXBlLmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgcmJJbmZvID0gbmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBzaGFwZSwgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIGJvZHkgPSBuZXcgQW1tby5idFJpZ2lkQm9keShyYkluZm8pOwoKICAgICAgaWYgKG1hc3MgPiAwKSB7CiAgICAgICAgYm9keS5zZXRGcmljdGlvbihmcmljdGlvbik7CiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7CiAgICAgICAgYm9keS5zZXREYW1waW5nKGRhbXBpbmcubGluZWFyLCBkYW1waW5nLmFuZ3VsYXIpOwogICAgICAgIGJvZHkuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgfSAvLyBzdG9yaW5nIHV1aWQgZm9yIGZ1dHVyZSByZWZlcmVuY2UKCgogICAgICBib2R5LnV1aWQgPSB1dWlkOwogICAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgIHJldHVybiBib2R5OwogICAgfTsKICAgIHZhciBhZGRNb2RlbCA9IGZ1bmN0aW9uIGFkZE1vZGVsKG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICB2ZXJ0aWNlcyA9IG9wdGlvbnMudmVydGljZXMsCiAgICAgICAgICBtYXRyaWNlcyA9IG9wdGlvbnMubWF0cmljZXMsCiAgICAgICAgICBpbmRleGVzID0gb3B0aW9ucy5pbmRleGVzLAogICAgICAgICAgcG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IG9wdGlvbnMucXVhdGVybmlvbiwKICAgICAgICAgIF9vcHRpb25zJG1hc3MgPSBvcHRpb25zLm1hc3MsCiAgICAgICAgICBtYXNzID0gX29wdGlvbnMkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJG1hc3MsCiAgICAgICAgICBfb3B0aW9ucyRmcmljdGlvbiA9IG9wdGlvbnMuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9vcHRpb25zJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX29wdGlvbnMkZnJpY3Rpb247CiAgICAgIHZhciBzY2FsZSA9IERFRkFVTFRfU0NBTEU7CiAgICAgIHZhciBidGEgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgYnRjID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciB0cmlNZXNoID0gbmV3IEFtbW8uYnRUcmlhbmdsZU1lc2godHJ1ZSwgZmFsc2UpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZXJ0aWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjb21wb25lbnRzID0gdmVydGljZXNbaV07CiAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tpXSA/IGluZGV4ZXNbaV0gOiBudWxsOwogICAgICAgIHZhciBtYXRyaXggPSBBcnJheS5mcm9tKG1hdHJpY2VzW2ldKTsKCiAgICAgICAgaWYgKGluZGV4KSB7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGluZGV4Lmxlbmd0aDsgaiArPSAzKSB7CiAgICAgICAgICAgIHZhciBhaSA9IGluZGV4W2pdICogMzsKICAgICAgICAgICAgdmFyIGJpID0gaW5kZXhbaiArIDFdICogMzsKICAgICAgICAgICAgdmFyIGNpID0gaW5kZXhbaiArIDJdICogMzsKICAgICAgICAgICAgdmFyIHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2FpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2FpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1thaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIHZhciB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tiaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tiaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYmkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbY2ldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbY2kgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2NpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZSh2Yy54LCB2Yy55LCB2Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIF9qID0gMDsgX2ogPCBjb21wb25lbnRzLmxlbmd0aDsgX2ogKz0gOSkgewogICAgICAgICAgICB2YXIgX3ZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgMF0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgdmFyIF92YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDNdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyA0XSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgNV0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyA2XSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgN10sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDhdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICBidGEuc2V0VmFsdWUoX3ZhLngsIF92YS55LCBfdmEueik7CiAgICAgICAgICAgIGJ0Yi5zZXRWYWx1ZShfdmIueCwgX3ZiLnksIF92Yi56KTsKICAgICAgICAgICAgYnRjLnNldFZhbHVlKF92Yy54LCBfdmMueSwgX3ZjLnopOwogICAgICAgICAgICB0cmlNZXNoLmFkZFRyaWFuZ2xlKGJ0YSwgYnRiLCBidGMsIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBsb2NhbFNjYWxlID0gbmV3IEFtbW8uYnRWZWN0b3IzKHNjYWxlLngsIHNjYWxlLnksIHNjYWxlLnopOwogICAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7CiAgICAgIEFtbW8uZGVzdHJveShsb2NhbFNjYWxlKTsKICAgICAgdmFyIGNvbGxpc2lvblNoYXBlID0gbmV3IEFtbW8uYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSh0cmlNZXNoLCB0cnVlLCB0cnVlKTsKICAgICAgY29sbGlzaW9uU2hhcGUucmVzb3VyY2VzID0gW3RyaU1lc2hdOwogICAgICBBbW1vLmRlc3Ryb3koYnRhKTsKICAgICAgQW1tby5kZXN0cm95KGJ0Yik7CiAgICAgIEFtbW8uZGVzdHJveShidGMpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5NRVNILAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkQm94ID0gZnVuY3Rpb24gYWRkQm94KGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aWR0aCA9IGRhdGEud2lkdGgsCiAgICAgICAgICBsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGhlaWdodCA9IGRhdGEuaGVpZ2h0LAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb247CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogMC41LCBoZWlnaHQgKiAwLjUsIGxlbmd0aCAqIDAuNSkpOwogICAgICB2YXIgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShnZW9tZXRyeSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgYm9keTogYm9keSwKICAgICAgICB0eXBlOiBUWVBFUy5CT1gsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfUklHSURCT0RZX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBhZGRTcGhlcmUgPSBmdW5jdGlvbiBhZGRTcGhlcmUoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHJhZGl1cyA9IGRhdGEucmFkaXVzLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIF9kYXRhJG1hc3MyID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MyID09PSB2b2lkIDAgPyAwIDogX2RhdGEkbWFzczIsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbjIgPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbjIgPT09IHZvaWQgMCA/IDIgOiBfZGF0YSRmcmljdGlvbjI7CiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuU1BIRVJFLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0TGluZWFyVmVsb2NpdHkgPSBmdW5jdGlvbiBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgX2RhdGEkdmVsb2NpdHkgPSBkYXRhLnZlbG9jaXR5LAogICAgICAgICAgdmVsb2NpdHkgPSBfZGF0YSR2ZWxvY2l0eSA9PT0gdm9pZCAwID8gREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgOiBfZGF0YSR2ZWxvY2l0eTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCksCiAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTsKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBBbW1vLmRlc3Ryb3kobGluZWFyVmVsb2NpdHkpOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFBvc2l0aW9uID0gZnVuY3Rpb24gc2V0UG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDIgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50Mi5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIHJlc2V0RWxlbWVudCA9IGZ1bmN0aW9uIHJlc2V0RWxlbWVudChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbjsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDMgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50My5ib2R5OwoKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICB9OwogICAgdmFyIGFwcGx5SW1wdXNlID0gZnVuY3Rpb24gYXBwbHlJbXB1c2UoX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkaW1wdWxzZSA9IF9yZWYuaW1wdWxzZSwKICAgICAgICAgIGltcHVsc2UgPSBfcmVmJGltcHVsc2UgPT09IHZvaWQgMCA/IERFRkFVTFRfSU1QVUxTRSA6IF9yZWYkaW1wdWxzZTsKCiAgICAgIHZhciBfd29ybGQkZ2V0RWxlbWVudDQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50NC5ib2R5OwoKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIGltcHVsc2VWZWN0b3IgPSBuZXcgQW1tby5idFZlY3RvcjMoaW1wdWxzZS54LCBpbXB1bHNlLnksIGltcHVsc2Uueik7CiAgICAgICAgYm9keS5hcHBseUNlbnRyYWxJbXB1bHNlKGltcHVsc2VWZWN0b3IpOwogICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVFbGVtZW50VXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlRWxlbWVudFVwZGF0ZShfcmVmMiwgZHQpIHsKICAgICAgdmFyIGJvZHkgPSBfcmVmMi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50OwogICAgICAgICAgc3RhdGUuZGlyZWN0aW9uOwogICAgICAgICAgdmFyIGNhbWVyYURpcmVjdGlvbiA9IHN0YXRlLmNhbWVyYURpcmVjdGlvbjsKICAgICAgICAgIHN0YXRlLnF1YXRlcm5pb247CiAgICAgICAgICBzdGF0ZS5wb3NpdGlvbjsKICAgICAgdmFyIE1BWF9TUEVFRCA9IDE7CiAgICAgIHZhciB3YWxrVmVsb2NpdHkgPSAuMTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBib2R5LmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgdmFyIHNwZWVkID0gbGluZWFyVmVsb2NpdHkubGVuZ3RoKCk7CiAgICAgICAgdmFyIGZvcndhcmREaXIgPSB0cmFuc2Zvcm0uZ2V0QmFzaXMoKS5nZXRSb3coMik7CiAgICAgICAgZm9yd2FyZERpci5ub3JtYWxpemUoKTsKICAgICAgICB2YXIgd2Fsa0RpcmVjdGlvbiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLjAsIDAuMCwgMC4wKTsKICAgICAgICB2YXIgd2Fsa1NwZWVkID0gd2Fsa1ZlbG9jaXR5ICogZHQ7CgogICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgKyBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSArIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgKyBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgod2Fsa0RpcmVjdGlvbi54KCkgLSBmb3J3YXJkRGlyLngoKSk7IC8vd2Fsa0RpcmVjdGlvbi5zZXRZKCB3YWxrRGlyZWN0aW9uLnkoKSAtIGZvcndhcmREaXIueSgpKTsKCiAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFood2Fsa0RpcmVjdGlvbi56KCkgLSBmb3J3YXJkRGlyLnooKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIW1vdmVtZW50LmZvcndhcmQgJiYgIW1vdmVtZW50LmJhY2t3YXJkcykgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKiAwLjIpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKiAwLjIpOwogICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHsKICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpOwogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7CiAgICAgICAgfQoKICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTsKICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBib2R5LnNldENlbnRlck9mTWFzc1RyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBvcmlnaW4gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgICAgdmFyIHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIENsb2NrID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gQ2xvY2soKSB7CiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENsb2NrKTsKCiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBudWxsOwogICAgICB9CgogICAgICBfY3JlYXRlQ2xhc3MoQ2xvY2ssIFt7CiAgICAgICAga2V5OiAiZ2V0RGVsdGEiLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREZWx0YSgpIHsKICAgICAgICAgIHZhciB0aW1lID0gRGF0ZS5ub3coKTsKCiAgICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHsKICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wOwogICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7CiAgICAgICAgICAgIHJldHVybiBkZWx0YTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gQ2xvY2s7CiAgICB9KCk7CgogICAgdmFyIFdvcmxkID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gV29ybGQoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFdvcmxkKTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpbml0IiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBfb3B0aW9ucyRncmF2aXR5ID0gb3B0aW9ucy5ncmF2aXR5LAogICAgICAgICAgICAgIGdyYXZpdHkgPSBfb3B0aW9ucyRncmF2aXR5ID09PSB2b2lkIDAgPyBHUkFWSVRZIDogX29wdGlvbnMkZ3Jhdml0eTsKICAgICAgICAgIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSBuZXcgQW1tby5idERlZmF1bHRDb2xsaXNpb25Db25maWd1cmF0aW9uKCk7CiAgICAgICAgICBfdGhpcy5kaXNwYXRjaGVyID0gbmV3IEFtbW8uYnRDb2xsaXNpb25EaXNwYXRjaGVyKF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgX3RoaXMuYnJvYWRwaGFzZSA9IG5ldyBBbW1vLmJ0RGJ2dEJyb2FkcGhhc2UoKTsKICAgICAgICAgIF90aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkID0gbmV3IEFtbW8uYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQoX3RoaXMuZGlzcGF0Y2hlciwgX3RoaXMuYnJvYWRwaGFzZSwgX3RoaXMuc29sdmVyLCBfdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTsKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTsgLy8gdGhpcyBpcyBuZWVkZWQgZm9yIGdob3N0T2JqZWN0IGNvbGxpc2lvbnMKCgogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5nZXRCcm9hZHBoYXNlKCkuZ2V0T3ZlcmxhcHBpbmdQYWlyQ2FjaGUoKS5zZXRJbnRlcm5hbEdob3N0UGFpckNhbGxiYWNrKG5ldyBBbW1vLmJ0R2hvc3RQYWlyQ2FsbGJhY2soKSk7CgogICAgICAgICAgX3RoaXMuaW5pdGlhbGlzZWQgPSB0cnVlOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInJlbW92ZUVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5maWx0ZXIoZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdLmRlbGV0ZWQ7CiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIGRlbGV0ZSBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImhhc0VsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5pbmNsdWRlcyh1dWlkKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJnZXRFbGVtZW50IiwgZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5lbGVtZW50c1t1dWlkXTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJpc0luaXRpYWxpc2VkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmluaXRpYWxpc2VkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldER5bmFtaWNzV29ybGQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuZHluYW1pY3NXb3JsZDsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRSaWdpZEJvZHkiLCBmdW5jdGlvbiAoYm9keSkgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiYWRkQWN0aW9uIiwgZnVuY3Rpb24gKGFjdGlvbikgewogICAgICAgICAgX3RoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRDb2xsaXNpb25PYmplY3QiLCBmdW5jdGlvbiAoY29sbGlzaW9uT2JqZWN0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZENvbGxpc2lvbk9iamVjdChjb2xsaXNpb25PYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInN0ZXBTaW11bGF0aW9uIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLnN0ZXBTaW11bGF0aW9uKGR0KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzaW11bGF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHZhciBkdCA9IF90aGlzLmNsb2NrLmdldERlbHRhKCk7CgogICAgICAgICAgX3RoaXMuc3RlcFNpbXVsYXRpb24oZHQpOwoKICAgICAgICAgIE9iamVjdC5rZXlzKF90aGlzLmVsZW1lbnRzKS5mb3JFYWNoKGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuQk9YOgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5TUEhFUkU6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLk1FU0g6CiAgICAgICAgICAgICAgICAgIGhhbmRsZUVsZW1lbnRVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlBMQVlFUjoKICAgICAgICAgICAgICAgICAgaGFuZGxlUGxheWVyVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5WRUhJQ0xFOgogICAgICAgICAgICAgICAgICBoYW5kbGVWZWhpY2xlVXBkYXRlKGVsZW1lbnQsIGR0KTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgICBfdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7CgogICAgICAgICAgX3RoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7CgogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRQaHlzaWNzVXBkYXRlKGR0KTsKICAgICAgICAgIF90aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKF90aGlzLnNpbXVsYXRlLmJpbmQoX3RoaXMpKTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJjYWxjdWxhdGVDb2xsaXNpb25zIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGFtbW9EaXNwYXRjaGVyID0gX3RoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7CgogICAgICAgICAgdmFyIG51bU1hbmlmb2xkcyA9IGFtbW9EaXNwYXRjaGVyLmdldE51bU1hbmlmb2xkcygpOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtTWFuaWZvbGRzOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbnRhY3RNYW5pZm9sZCA9IGFtbW9EaXNwYXRjaGVyLmdldE1hbmlmb2xkQnlJbmRleEludGVybmFsKGkpOwogICAgICAgICAgICB2YXIgcmIwID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MCgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIHJiMSA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTEoKSwgQW1tby5idFJpZ2lkQm9keSk7CiAgICAgICAgICAgIHZhciBudW1Db250YWN0cyA9IGNvbnRhY3RNYW5pZm9sZC5nZXROdW1Db250YWN0cygpOyAvLyB0aGlzIGl0ZXJhdGlvbiBkb2Vzbid0IGhhdmUgdXVpZHMKCiAgICAgICAgICAgIGlmICghcmIwLnV1aWQgfHwgIXJiMS51dWlkKSBjb250aW51ZTsKICAgICAgICAgICAgdmFyIGNvbnRhY3RzID0gW107CgogICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG51bUNvbnRhY3RzOyBqKyspIHsKICAgICAgICAgICAgICB2YXIgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTsKICAgICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTsKICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAwLjApIGNvbnRpbnVlOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTAgPSByYjAuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgdmVsb2NpdHkxID0gcmIxLmdldExpbmVhclZlbG9jaXR5KCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25BKCk7CiAgICAgICAgICAgICAgdmFyIHdvcmxkUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9wb3NpdGlvbldvcmxkT25CKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMCA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QSgpOwogICAgICAgICAgICAgIHZhciBsb2NhbFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEIoKTsKICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGRpc3RhbmNlOiBkaXN0YW5jZSwKICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbewogICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MC55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkwLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgewogICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCwKICAgICAgICAgICAgICAgICAgdmVsb2NpdHk6IHsKICAgICAgICAgICAgICAgICAgICB4OiB2ZWxvY2l0eTEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHZlbG9jaXR5MS55KCksCiAgICAgICAgICAgICAgICAgICAgejogdmVsb2NpdHkxLnooKQogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB3b3JsZFBvczogewogICAgICAgICAgICAgICAgICAgIHg6IHdvcmxkUG9zMS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogd29ybGRQb3MxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB3b3JsZFBvczEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogbG9jYWxQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiBsb2NhbFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IGxvY2FsUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMC51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmREaXNwYXRjaEV2ZW50KHJiMS51dWlkLCBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkNPTExJU0lPTiwgewogICAgICAgICAgICAgIGNvbnRhY3RzOiBjb250YWN0cwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRFbGVtZW50IiwgZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW2RhdGEudXVpZF0gPSBkYXRhOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInVwZGF0ZUJvZHlTdGF0ZSIsIGZ1bmN0aW9uIChfcmVmKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgICAgICBzdGF0ZSA9IF9yZWYuc3RhdGU7CgogICAgICAgICAgaWYgKF90aGlzLmhhc0VsZW1lbnQodXVpZCkpIHsKICAgICAgICAgICAgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgX3RoaXMuZWxlbWVudHNbdXVpZF0uc3RhdGUpLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidGVybWluYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmR5bmFtaWNzV29ybGQpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLnNvbHZlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuZGlzcGF0Y2hlcik7CiAgICAgICAgICBBbW1vLmRlc3Ryb3koX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShfdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7CiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFRlcm1pbmF0ZUV2ZW50KCk7CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuZWxlbWVudHMgPSB7fTsKICAgICAgICB0aGlzLmluaXRpYWxpc2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmJyb2FkcGhhc2UgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5zb2x2ZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsOwogICAgICAgIHRoaXMuY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUNsYXNzKFdvcmxkLCBbewogICAgICAgIGtleTogImRpc3Bvc2VCb2R5IiwKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZUJvZHkoX3JlZjIpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZjIudXVpZDsKICAgICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpOwogICAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpOwogICAgICAgICAgdGhpcy5yZW1vdmVFbGVtZW50KHV1aWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRFbGVtZW50RGlzcG9zZWQoewogICAgICAgICAgICB1dWlkOiB1dWlkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBXb3JsZDsKICAgIH0oKTsKICAgIHZhciB3b3JsZCA9IG5ldyBXb3JsZCgpOwoKICAgIHZhciBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yOwogICAgdmFyIERFRkFVTFRfRlJJQ1RJT04gPSAxMDAwOwogICAgdmFyIERFRkFVTFRfTUFTUyA9IDgwMDsKICAgIHZhciBhZGRWZWhpY2xlID0gZnVuY3Rpb24gYWRkVmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHdoZWVscyA9IGRhdGEud2hlZWxzLAogICAgICAgICAgX2RhdGEkbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzID09PSB2b2lkIDAgPyBERUZBVUxUX01BU1MgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgd2lkdGggPSBfZGF0YSR3aWR0aCA9PT0gdm9pZCAwID8gMS44IDogX2RhdGEkd2lkdGgsCiAgICAgICAgICBfZGF0YSRoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIGhlaWdodCA9IF9kYXRhJGhlaWdodCA9PT0gdm9pZCAwID8gLjYgOiBfZGF0YSRoZWlnaHQsCiAgICAgICAgICBfZGF0YSRsZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IF9kYXRhJGxlbmd0aCA9PT0gdm9pZCAwID8gNCA6IF9kYXRhJGxlbmd0aCwKICAgICAgICAgIF9kYXRhJGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24gPT09IHZvaWQgMCA/IERFRkFVTFRfRlJJQ1RJT04gOiBfZGF0YSRmcmljdGlvbiwKICAgICAgICAgIF9kYXRhJHJvbGxJbmZsdWVuY2UgPSBkYXRhLnJvbGxJbmZsdWVuY2UsCiAgICAgICAgICByb2xsSW5mbHVlbmNlID0gX2RhdGEkcm9sbEluZmx1ZW5jZSA9PT0gdm9pZCAwID8gREVGQVVMVF9ST0xMX0lORkxVRU5DRSA6IF9kYXRhJHJvbGxJbmZsdWVuY2UsCiAgICAgICAgICBfZGF0YSR3aGVlbHNPcHRpb25zID0gZGF0YS53aGVlbHNPcHRpb25zLAogICAgICAgICAgd2hlZWxzT3B0aW9ucyA9IF9kYXRhJHdoZWVsc09wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkd2hlZWxzT3B0aW9ucywKICAgICAgICAgIF9kYXRhJHN1c3BlbnNpb25zID0gZGF0YS5zdXNwZW5zaW9ucywKICAgICAgICAgIHN1c3BlbnNpb25zID0gX2RhdGEkc3VzcGVuc2lvbnMgPT09IHZvaWQgMCA/IHt9IDogX2RhdGEkc3VzcGVuc2lvbnM7CiAgICAgIHZhciBfd2hlZWxzT3B0aW9ucyRiYWNrID0gd2hlZWxzT3B0aW9ucy5iYWNrLAogICAgICAgICAgYmFjayA9IF93aGVlbHNPcHRpb25zJGJhY2sgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkYmFjaywKICAgICAgICAgIF93aGVlbHNPcHRpb25zJGZyb250ID0gd2hlZWxzT3B0aW9ucy5mcm9udCwKICAgICAgICAgIGZyb250ID0gX3doZWVsc09wdGlvbnMkZnJvbnQgPT09IHZvaWQgMCA/IHt9IDogX3doZWVsc09wdGlvbnMkZnJvbnQ7CiAgICAgIHZhciBfYmFjayRheGlzUG9zaXRpb24gPSBiYWNrLmF4aXNQb3NpdGlvbiwKICAgICAgICAgIGF4aXNQb3NpdGlvbkJhY2sgPSBfYmFjayRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IC0xIDogX2JhY2skYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2JhY2skcmFkaXVzID0gYmFjay5yYWRpdXMsCiAgICAgICAgICB3aGVlbFJhZGl1c0JhY2sgPSBfYmFjayRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2JhY2skcmFkaXVzLAogICAgICAgICAgX2JhY2skaGFsZlRyYWNrID0gYmFjay5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0JhY2sgPSBfYmFjayRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfYmFjayRoYWxmVHJhY2ssCiAgICAgICAgICBfYmFjayRheGlzSGVpZ2h0ID0gYmFjay5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0QmFjayA9IF9iYWNrJGF4aXNIZWlnaHQgPT09IHZvaWQgMCA/IC4zIDogX2JhY2skYXhpc0hlaWdodDsKICAgICAgdmFyIF9mcm9udCRheGlzUG9zaXRpb24gPSBmcm9udC5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25Gcm9udCA9IF9mcm9udCRheGlzUG9zaXRpb24gPT09IHZvaWQgMCA/IDEuNyA6IF9mcm9udCRheGlzUG9zaXRpb24sCiAgICAgICAgICBfZnJvbnQkcmFkaXVzID0gZnJvbnQucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNGcm9udCA9IF9mcm9udCRyYWRpdXMgPT09IHZvaWQgMCA/IC40IDogX2Zyb250JHJhZGl1cywKICAgICAgICAgIF9mcm9udCRoYWxmVHJhY2sgPSBmcm9udC5oYWxmVHJhY2ssCiAgICAgICAgICB3aGVlbEhhbGZUcmFja0Zyb250ID0gX2Zyb250JGhhbGZUcmFjayA9PT0gdm9pZCAwID8gMSA6IF9mcm9udCRoYWxmVHJhY2ssCiAgICAgICAgICBfZnJvbnQkYXhpc0hlaWdodCA9IGZyb250LmF4aXNIZWlnaHQsCiAgICAgICAgICB3aGVlbEF4aXNIZWlnaHRGcm9udCA9IF9mcm9udCRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9mcm9udCRheGlzSGVpZ2h0OwogICAgICB2YXIgX3N1c3BlbnNpb25zJHN0aWZmbmVzID0gc3VzcGVuc2lvbnMuc3RpZmZuZXNzLAogICAgICAgICAgc3RpZmZuZXNzID0gX3N1c3BlbnNpb25zJHN0aWZmbmVzID09PSB2b2lkIDAgPyAyMC4wIDogX3N1c3BlbnNpb25zJHN0aWZmbmVzLAogICAgICAgICAgX3N1c3BlbnNpb25zJGRhbXBpbmcgPSBzdXNwZW5zaW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9zdXNwZW5zaW9ucyRkYW1waW5nID09PSB2b2lkIDAgPyAyLjMgOiBfc3VzcGVuc2lvbnMkZGFtcGluZywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRjb21wcmVzcyA9IHN1c3BlbnNpb25zLmNvbXByZXNzaW9uLAogICAgICAgICAgY29tcHJlc3Npb24gPSBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPT09IHZvaWQgMCA/IDQuNCA6IF9zdXNwZW5zaW9ucyRjb21wcmVzcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9IHN1c3BlbnNpb25zLnJlc3RMZW5ndGgsCiAgICAgICAgICByZXN0TGVuZ3RoID0gX3N1c3BlbnNpb25zJHJlc3RMZW5nID09PSB2b2lkIDAgPyAwLjYgOiBfc3VzcGVuc2lvbnMkcmVzdExlbmc7IC8vIENoYXNzaXMKCiAgICAgIHZhciBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0Qm94U2hhcGUobmV3IEFtbW8uYnRWZWN0b3IzKHdpZHRoICogLjUsIGhlaWdodCAqIC41LCBsZW5ndGggKiAuNSkpOwogICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gbmV3IEFtbW8uYnREZWZhdWx0TW90aW9uU3RhdGUodHJhbnNmb3JtKTsKICAgICAgdmFyIGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTsKICAgICAgZ2VvbWV0cnkuY2FsY3VsYXRlTG9jYWxJbmVydGlhKG1hc3MsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBjaGFzc2lzID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkobmV3IEFtbW8uYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvKG1hc3MsIG1vdGlvblN0YXRlLCBnZW9tZXRyeSwgbG9jYWxJbmVydGlhKSk7CiAgICAgIGNoYXNzaXMuc2V0QWN0aXZhdGlvblN0YXRlKERJU0FCTEVfREVBQ1RJVkFUSU9OKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpOyAvLyBSYXljYXN0IFZlaGljbGUKCiAgICAgIHZhciB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTsKICAgICAgdmFyIHJheUNhc3RlciA9IG5ldyBBbW1vLmJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIod29ybGQuZ2V0RHluYW1pY3NXb3JsZCgpKTsKICAgICAgdmFyIHZlaGljbGUgPSBuZXcgQW1tby5idFJheWNhc3RWZWhpY2xlKHR1bmluZywgY2hhc3NpcywgcmF5Q2FzdGVyKTsKICAgICAgdmVoaWNsZS5zZXRDb29yZGluYXRlU3lzdGVtKDAsIDEsIDIpOwogICAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7CiAgICAgIHZhciB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7CiAgICAgIHZhciB3aGVlbEF4bGVDUyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygtMSwgMCwgMCk7CgogICAgICB2YXIgYWRkV2hlZWwgPSBmdW5jdGlvbiBhZGRXaGVlbChpc0Zyb250LCBwb3MsIHJhZGl1cykgewogICAgICAgIHZhciB3aGVlbEluZm8gPSB2ZWhpY2xlLmFkZFdoZWVsKHBvcywgd2hlZWxEaXJlY3Rpb25DUzAsIHdoZWVsQXhsZUNTLCByZXN0TGVuZ3RoLCByYWRpdXMsIHR1bmluZywgaXNGcm9udCk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTsKICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ1JlbGF4YXRpb24oZGFtcGluZyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbihjb21wcmVzc2lvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3JvbGxJbmZsdWVuY2Uocm9sbEluZmx1ZW5jZSk7CiAgICAgIH07CgogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMygtd2hlZWxIYWxmVHJhY2tGcm9udCwgd2hlZWxBeGlzSGVpZ2h0RnJvbnQsIGF4aXNQb3NpdGlvbkZyb250KSwgd2hlZWxSYWRpdXNGcm9udCk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMod2hlZWxIYWxmVHJhY2tCYWNrLCB3aGVlbEF4aXNIZWlnaHRCYWNrLCBheGlzUG9zaXRpb25CYWNrKSwgd2hlZWxSYWRpdXNCYWNrKTsKICAgICAgdmVoaWNsZS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdHlwZTogVFlQRVMuVkVISUNMRSwKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHZlaGljbGU6IHZlaGljbGUsCiAgICAgICAgd2hlZWxzOiB3aGVlbHMsCiAgICAgICAgb3B0aW9uczogZGF0YSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9WRUhJQ0xFX1NUQVRFCiAgICAgIH0pOwogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUG9zaXRpb24gPSBmdW5jdGlvbiBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHNldFZlaGljbGVRdWF0ZXJuaW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcmVzZXRWZWhpY2xlID0gZnVuY3Rpb24gcmVzZXRWZWhpY2xlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBoYW5kbGVWZWhpY2xlVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlVmVoaWNsZVVwZGF0ZShfcmVmLCBkdCkgewogICAgICB2YXIgdmVoaWNsZSA9IF9yZWYudmVoaWNsZSwKICAgICAgICAgIHdoZWVscyA9IF9yZWYud2hlZWxzLAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1ZFSElDTEVfU1RBVEUgOiBfcmVmJHN0YXRlLAogICAgICAgICAgX3JlZiRvcHRpb25zID0gX3JlZi5vcHRpb25zLAogICAgICAgICAgb3B0aW9ucyA9IF9yZWYkb3B0aW9ucyA9PT0gdm9pZCAwID8ge30gOiBfcmVmJG9wdGlvbnM7CiAgICAgIHZhciBicmVha2luZ0ZvcmNlID0gMDsKICAgICAgdmFyIGVuZ2luZUZvcmNlID0gMDsKICAgICAgdmFyIF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9IG9wdGlvbnMuc3RlZXJpbmdDbGFtcCwKICAgICAgICAgIHN0ZWVyaW5nQ2xhbXAgPSBfb3B0aW9ucyRzdGVlcmluZ0NsYW0gPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgOiBfb3B0aW9ucyRzdGVlcmluZ0NsYW0sCiAgICAgICAgICBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPSBvcHRpb25zLnN0ZWVyaW5nSW5jcmVtZW50LAogICAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBfb3B0aW9ucyRzdGVlcmluZ0luY3IgPT09IHZvaWQgMCA/IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIDogX29wdGlvbnMkc3RlZXJpbmdJbmNyLAogICAgICAgICAgX29wdGlvbnMkbWF4RW5naW5lRm9yID0gb3B0aW9ucy5tYXhFbmdpbmVGb3JjZSwKICAgICAgICAgIG1heEVuZ2luZUZvcmNlID0gX29wdGlvbnMkbWF4RW5naW5lRm9yID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgOiBfb3B0aW9ucyRtYXhFbmdpbmVGb3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPSBvcHRpb25zLm1heEJyZWFraW5nRm9yY2UsCiAgICAgICAgICBtYXhCcmVha2luZ0ZvcmNlID0gX29wdGlvbnMkbWF4QnJlYWtpbmdGID09PSB2b2lkIDAgPyBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRSA6IF9vcHRpb25zJG1heEJyZWFraW5nRjsKCiAgICAgIGlmIChzdGF0ZS5hY2NlbGVyYXRpb24pIHsKICAgICAgICBpZiAoc3BlZWQgPCAtMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IG1heEVuZ2luZUZvcmNlOwogICAgICB9CgogICAgICBpZiAoc3RhdGUuYnJha2luZykgewogICAgICAgIGlmIChzcGVlZCA+IDEpIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO2Vsc2UgZW5naW5lRm9yY2UgPSAtbWF4RW5naW5lRm9yY2UgLyAyOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubGVmdCkgewogICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHN0YXRlLnJpZ2h0KSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gLXN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IC1zdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nID4gc3RlZXJpbmdJbmNyZW1lbnQpIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtlbHNlIHsKICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2ZWhpY2xlLmFwcGx5RW5naW5lRm9yY2UoZW5naW5lRm9yY2UsIEJBQ0tfTEVGVCk7CiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0U3RlZXJpbmdWYWx1ZShzdGF0ZS52ZWhpY2xlU3RlZXJpbmcsIEZST05UX1JJR0hUKTsKICAgICAgdmFyIHRtLCBwLCBxLCBpOwogICAgICB2YXIgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgdmVoaWNsZS51cGRhdGVXaGVlbFRyYW5zZm9ybShpLCB0cnVlKTsKICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTsKICAgICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgICAgcSA9IHRtLmdldFJvdGF0aW9uKCk7CiAgICAgICAgdmFyIHdoZWVsVVVJRCA9IHdoZWVsc1tpXTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7CiAgICAgIH0KCiAgICAgIHRtID0gdmVoaWNsZS5nZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0oKTsKICAgICAgcCA9IHRtLmdldE9yaWdpbigpOwogICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgdmFyIGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICB2YXIgZXh0cmFEYXRhID0gewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfSwKICAgICAgICBzcGVlZDogc3BlZWQKICAgICAgfTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0LCBleHRyYURhdGEpOwogICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUodXVpZCwgc3RhdGUpOwogICAgfTsKCiAgICB2YXIgY3JlYXRlR2hvc3RDb2xsaWRlciA9IGZ1bmN0aW9uIGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBwb3NpdGlvbikgewogICAgICB2YXIgZ2hvc3RDb2xsaWRlciA9IG5ldyBBbW1vLmJ0R2hvc3RPYmplY3QoKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihwb3NpdGlvbik7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24oMCwgMCwgMCwgMSkpOwogICAgICBnaG9zdENvbGxpZGVyLnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgZ2hvc3RDb2xsaWRlcjogZ2hvc3RDb2xsaWRlciwKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zZm9ybQogICAgICB9OwogICAgfTsKICAgIHZhciBmb3JFYWNoR2hvc3RDb2xsaXNpb24gPSBmdW5jdGlvbiBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlcikgewogICAgICB2YXIgZm9yRWFjaENhbGxiYWNrID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7fTsKICAgICAgdmFyIGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2xsaXNpb25zOyBpKyspIHsKICAgICAgICB2YXIgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGZvckVhY2hDYWxsYmFjayhvYmplY3QsIHRyYW5zZm9ybSwgaSk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uUG9zaXRpb24gPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbikgewogICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBwb3NpdGlvbjsKCiAgICAgIGlmICghZXhwbG9zaW9uUG9zaXRpb24pIHsKICAgICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgICBib2R5ID0gX3dvcmxkJGdldEVsZW1lbnQuYm9keTsKCiAgICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgZXhwbG9zaW9uUG9zaXRpb24gPSB0cmFuc2Zvcm0uZ2V0T3JpZ2luKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjsKICAgIH07CiAgICB2YXIgZ2V0RXhwbG9zaW9uSW1wdWxzZSA9IGZ1bmN0aW9uIGdldEV4cGxvc2lvbkltcHVsc2UocG9zaXRpb24sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkgewogICAgICB2YXIgZGlzdGFuY2UgPSBwb3NpdGlvbi5vcF9zdWIoZXhwbG9zaW9uUG9zaXRpb24pOwogICAgICBkaXN0YW5jZS5ub3JtYWxpemUoKTsKICAgICAgdmFyIGltcHVsc2UgPSBkaXN0YW5jZS5vcF9tdWwoc3RyZW5ndGgpOwogICAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7CiAgICAgIHJldHVybiBpbXB1bHNlOwogICAgfTsKICAgIHZhciBjcmVhdGVFeHBsb3Npb24gPSBmdW5jdGlvbiBjcmVhdGVFeHBsb3Npb24oX3JlZikgewogICAgICB2YXIgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIHBvc2l0aW9uID0gX3JlZi5wb3NpdGlvbiwKICAgICAgICAgIF9yZWYkcmFkaXVzID0gX3JlZi5yYWRpdXMsCiAgICAgICAgICByYWRpdXMgPSBfcmVmJHJhZGl1cyA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NJWkVTLlNNQUxMIDogX3JlZiRyYWRpdXMsCiAgICAgICAgICBfcmVmJHN0cmVuZ3RoID0gX3JlZi5zdHJlbmd0aCwKICAgICAgICAgIHN0cmVuZ3RoID0gX3JlZiRzdHJlbmd0aCA9PT0gdm9pZCAwID8gRVhQTE9TSU9OX1NUUkVOR1RIUy5NRURJVU0gOiBfcmVmJHN0cmVuZ3RoOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgZXhwbG9zaW9uUG9zaXRpb24gPSBnZXRFeHBsb3Npb25Qb3NpdGlvbih1dWlkLCBwb3NpdGlvbik7CgogICAgICAgIHZhciBfY3JlYXRlR2hvc3RDb2xsaWRlciA9IGNyZWF0ZUdob3N0Q29sbGlkZXIocmFkaXVzLCBleHBsb3Npb25Qb3NpdGlvbiksCiAgICAgICAgICAgIGdob3N0Q29sbGlkZXIgPSBfY3JlYXRlR2hvc3RDb2xsaWRlci5naG9zdENvbGxpZGVyLAogICAgICAgICAgICB0cmFuc2Zvcm0gPSBfY3JlYXRlR2hvc3RDb2xsaWRlci50cmFuc2Zvcm07CgogICAgICAgIHdvcmxkLmFkZENvbGxpc2lvbk9iamVjdChnaG9zdENvbGxpZGVyKTsKICAgICAgICBmb3JFYWNoR2hvc3RDb2xsaXNpb24oZ2hvc3RDb2xsaWRlciwgZnVuY3Rpb24gKG9iamVjdCwgb2JqZWN0VHJhbnNmb3JtKSB7CiAgICAgICAgICB2YXIgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpOwogICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpOwogICAgICAgIH0pOwogICAgICAgIHdvcmxkLmdldER5bmFtaWNzV29ybGQoKS5yZW1vdmVDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgQW1tby5kZXN0cm95KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgY29uc29sZS5sb2coZSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGhhbmRsZUxvYWRFdmVudCA9IGZ1bmN0aW9uIGhhbmRsZUxvYWRFdmVudChvcHRpb25zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoQW1tbykgewogICAgICAgIHNlbGYuQW1tbyA9IEFtbW87CgogICAgICAgIG9ubWVzc2FnZSA9IGZ1bmN0aW9uIG9ubWVzc2FnZShfcmVmKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IF9yZWYuZGF0YTsKCiAgICAgICAgICBzd2l0Y2ggKGRhdGEuZXZlbnQpIHsKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOgogICAgICAgICAgICAgIGFkZEJveChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRToKICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOgogICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDoKICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjoKICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWToKICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5SRVNFVDoKICAgICAgICAgICAgICByZXNldEVsZW1lbnQoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWtqOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRQb3NpdGlvbihkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUE9TSVRJT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5RVUFURVJOSU9OOgogICAgICAgICAgICAgIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlJFU0VUOgogICAgICAgICAgICAgIHJlc2V0VmVoaWNsZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5BUFBMWS5JTVBVTFNFOgogICAgICAgICAgICAgIGFwcGx5SW1wdXNlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlVQREFURToKICAgICAgICAgICAgICB3b3JsZC51cGRhdGVCb2R5U3RhdGUoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuRElTUE9TRToKICAgICAgICAgICAgICB3b3JsZC5kaXNwb3NlQm9keShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUZGRUNUUy5FWFBMT1NJT046CiAgICAgICAgICAgICAgY3JlYXRlRXhwbG9zaW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5URVJNSU5BVEU6CiAgICAgICAgICAgICAgd29ybGQudGVybWluYXRlKCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgd29ybGQuaW5pdChvcHRpb25zKTsKICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFJlYWR5RXZlbnQoKTsKICAgICAgICB3b3JsZC5zaW11bGF0ZSgpOwogICAgICB9OwogICAgfTsKCiAgICB2YXIgbG9hZEFtbW8gPSBmdW5jdGlvbiBsb2FkQW1tbyhvcHRpb25zKSB7CiAgICAgIHZhciBzY3JpcHRVcmwgPSBvcHRpb25zLmhvc3QgKyAnLycgKyAob3B0aW9ucy5wYXRoIHx8IExJQlJBUllfTkFNRSk7CiAgICAgIGltcG9ydFNjcmlwdHMoc2NyaXB0VXJsKTsKICAgICAgQW1tbygpLnRoZW4oaGFuZGxlTG9hZEV2ZW50KG9wdGlvbnMpKTsKICAgIH07CgogICAgb25tZXNzYWdlID0gZnVuY3Rpb24gb25tZXNzYWdlKF9yZWYyKSB7CiAgICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTsKCiAgICAgIHN3aXRjaCAoZGF0YS5ldmVudCkgewogICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuTE9BRC5BTU1POgogICAgICAgICAgbG9hZEFtbW8oZGF0YSk7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfTsKCn0pKCk7Cgo=', null, false);
54869
54930
  /* eslint-enable */var PHYSICS_EVENTS = {
54870
54931
  DISPATCH: 'physics:dispatch',
54871
54932
  TERMINATE: 'physics:terminate',
@@ -54892,6 +54953,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
54892
54953
  QUATERNION: 'physics:element:set:quaternion',
54893
54954
  LINEAR_VELOCITY: 'physics:element:set:linear_velocity'
54894
54955
  },
54956
+ RESET: 'physics:element:reset',
54895
54957
  APPLY: {
54896
54958
  IMPULSE: 'physics:element:apply:impulse'
54897
54959
  }
@@ -54910,8 +54972,12 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
54910
54972
  }
54911
54973
  };var PI = Math.PI;
54912
54974
  var PI_2$1 = PI / 2;
54913
- var pickRandom = function pickRandom(list) {
54914
- return list.length && list[Math.floor(Math.random() * list.length)];
54975
+ var identity = function identity(a) {
54976
+ return a;
54977
+ };
54978
+ var pickRandom = function pickRandom() {
54979
+ var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
54980
+ return list[Math.floor(Math.random() * list.length)];
54915
54981
  };
54916
54982
  var degToRad = function degToRad(angle) {
54917
54983
  return angle * (PI / 180);
@@ -55038,7 +55104,7 @@ var smoothDampAngle = function smoothDampAngle(current, target, currentVelocity,
55038
55104
  var dt = arguments.length > 5 ? arguments[5] : undefined;
55039
55105
  target = current + deltaAngle(current, target);
55040
55106
  return smoothDamp(current, target, currentVelocity, smoothTime, maxSpeed, dt);
55041
- };var math=/*#__PURE__*/Object.freeze({__proto__:null,PI:PI,PI_2:PI_2$1,pickRandom:pickRandom,degToRad:degToRad,getProportion:getProportion,clamp:clamp,isWithin:isWithin,randomIntFromInterval:randomIntFromInterval,getDistance:getDistance,findPointBetweenAtDistance:findPointBetweenAtDistance,lerpVectors:lerpVectors,lerp:lerp,scaleVector:scaleVector,getSphereVolume:getSphereVolume,repeat:repeat,deltaAngle:deltaAngle,smoothDamp:smoothDamp,smoothDampAngle:smoothDampAngle});var LIBRARY_NAME = 'ammo.js';
55107
+ };var math=/*#__PURE__*/Object.freeze({__proto__:null,PI:PI,PI_2:PI_2$1,identity:identity,pickRandom:pickRandom,degToRad:degToRad,getProportion:getProportion,clamp:clamp,isWithin:isWithin,randomIntFromInterval:randomIntFromInterval,getDistance:getDistance,findPointBetweenAtDistance:findPointBetweenAtDistance,lerpVectors:lerpVectors,lerp:lerp,scaleVector:scaleVector,getSphereVolume:getSphereVolume,repeat:repeat,deltaAngle:deltaAngle,smoothDamp:smoothDamp,smoothDampAngle:smoothDampAngle});var LIBRARY_NAME = 'ammo.js';
55042
55108
  var TYPES = {
55043
55109
  BOX: 'BOX',
55044
55110
  SPHERE: 'SPHERE',
@@ -55303,7 +55369,7 @@ var convertAmmoVector = function convertAmmoVector(_ref2) {
55303
55369
  };
55304
55370
  };var utils=/*#__PURE__*/Object.freeze({__proto__:null,DEFAULT_DESCRIPTION:DEFAULT_DESCRIPTION$1,mapColliderTypeToAddEvent:mapColliderTypeToAddEvent$1,extractBoundingBox:extractBoundingBox,extractBiggestBoundingBox:extractBiggestBoundingBox,extractBoundingSphere:extractBoundingSphere,extractBiggestBoundingSphere:extractBiggestBoundingSphere,parseBoundingBoxSize:parseBoundingBoxSize,extractPositionAndQuaternion:extractPositionAndQuaternion$1,extractBoxDescription:extractBoxDescription,extractSphereDescription:extractSphereDescription,getBoxDescriptionForElement:getBoxDescriptionForElement$1,getSphereDescriptionForElement:getSphereDescriptionForElement,mapColliderTypeToDescription:mapColliderTypeToDescription$1,iterateGeometries:iterateGeometries$1,convertAmmoVector:convertAmmoVector});var getHostURL = function getHostURL() {
55305
55371
  return "".concat(document.location.protocol, "//").concat(document.location.host);
55306
- };var _excluded$5 = ["uuid"];
55372
+ };var _excluded$7 = ["uuid"];
55307
55373
  var COLLIDER_TYPES = COLLIDER_TYPES$1;
55308
55374
  var getBoxDescriptionForElement = getBoxDescriptionForElement$1,
55309
55375
  extractPositionAndQuaternion = extractPositionAndQuaternion$1,
@@ -55312,6 +55378,12 @@ var getBoxDescriptionForElement = getBoxDescriptionForElement$1,
55312
55378
  mapColliderTypeToAddEvent = mapColliderTypeToAddEvent$1,
55313
55379
  DEFAULT_DESCRIPTION = DEFAULT_DESCRIPTION$1;
55314
55380
  var WORKER_READY_TIMEOUT = 200;
55381
+ var PHYSICS_STATE_TIMEOUT = 50;
55382
+ var PHYSICS_STATES = {
55383
+ READY: 'READY',
55384
+ TERMINATING: 'TERMINATING',
55385
+ TERMINATED: 'TERMINATED'
55386
+ };
55315
55387
  var Physics = /*#__PURE__*/function (_EventDispatcher) {
55316
55388
  _inherits(Physics, _EventDispatcher);
55317
55389
 
@@ -55365,11 +55437,13 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55365
55437
 
55366
55438
  _defineProperty$1(_assertThisInitialized(_this), "handleTerminateEvent", function () {
55367
55439
  _this.worker.terminate();
55440
+
55441
+ _this.state = PHYSICS_STATES.READY;
55368
55442
  });
55369
55443
 
55370
55444
  _defineProperty$1(_assertThisInitialized(_this), "handleBodyUpdate", function (_ref3) {
55371
55445
  var uuid = _ref3.uuid,
55372
- data = _objectWithoutProperties(_ref3, _excluded$5);
55446
+ data = _objectWithoutProperties(_ref3, _excluded$7);
55373
55447
 
55374
55448
  var element = Universe$1.getByUUID(uuid);
55375
55449
 
@@ -55411,6 +55485,10 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55411
55485
  });
55412
55486
 
55413
55487
  _defineProperty$1(_assertThisInitialized(_this), "setPosition", function (element, position) {
55488
+ _this.setElementPosition(element, position);
55489
+ });
55490
+
55491
+ _defineProperty$1(_assertThisInitialized(_this), "setElementPosition", function (element, position) {
55414
55492
  if (Config$1.physics().enabled) {
55415
55493
  var uuid = element.uuid();
55416
55494
 
@@ -55422,6 +55500,21 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55422
55500
  }
55423
55501
  });
55424
55502
 
55503
+ _defineProperty$1(_assertThisInitialized(_this), "setElementQuaternion", function (element, quaternion) {});
55504
+
55505
+ _defineProperty$1(_assertThisInitialized(_this), "resetElement", function (element, position, quaternion) {
55506
+ if (Config$1.physics().enabled) {
55507
+ var uuid = element.uuid();
55508
+
55509
+ _this.worker.postMessage({
55510
+ event: PHYSICS_EVENTS.ELEMENT.RESET,
55511
+ uuid: uuid,
55512
+ position: position,
55513
+ quaternion: quaternion
55514
+ });
55515
+ }
55516
+ });
55517
+
55425
55518
  _defineProperty$1(_assertThisInitialized(_this), "setVehiclePosition", function (vehicle, _ref5) {
55426
55519
  var x = _ref5.x,
55427
55520
  y = _ref5.y,
@@ -55498,17 +55591,6 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55498
55591
  }
55499
55592
  });
55500
55593
 
55501
- _defineProperty$1(_assertThisInitialized(_this), "disposeElement", function (element) {
55502
- if (Config$1.physics().enabled) {
55503
- var uuid = element.uuid();
55504
-
55505
- _this.worker.postMessage({
55506
- event: PHYSICS_EVENTS.ELEMENT.DISPOSE,
55507
- uuid: uuid
55508
- });
55509
- }
55510
- });
55511
-
55512
55594
  _defineProperty$1(_assertThisInitialized(_this), "explosion", function (element, strength, radius) {
55513
55595
  if (Config$1.physics().enabled) {
55514
55596
  var uuid = element.uuid();
@@ -55523,6 +55605,8 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55523
55605
  });
55524
55606
 
55525
55607
  _this.elements = [];
55608
+ _this.isWorkerReady = false;
55609
+ _this.state = PHYSICS_STATES.READY;
55526
55610
  return _this;
55527
55611
  }
55528
55612
 
@@ -55531,12 +55615,52 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55531
55615
  value: function createWorker() {
55532
55616
  this.worker = new WorkerFactory();
55533
55617
  this.workerReady = false;
55618
+ this.state = PHYSICS_STATES.READY;
55534
55619
  this.worker.onmessage = this.handleWorkerMessages;
55535
55620
  }
55621
+ }, {
55622
+ key: "isTerminating",
55623
+ value: function isTerminating() {
55624
+ return this.state === PHYSICS_STATES.TERMINATING;
55625
+ }
55626
+ }, {
55627
+ key: "isTerminated",
55628
+ value: function isTerminated() {
55629
+ return this.state === PHYSICS_STATES.TERMINATED;
55630
+ }
55631
+ }, {
55632
+ key: "isReady",
55633
+ value: function isReady() {
55634
+ return this.state === PHYSICS_STATES.READY;
55635
+ }
55636
+ }, {
55637
+ key: "waitForState",
55638
+ value: function waitForState(state) {
55639
+ var _this2 = this;
55640
+
55641
+ return new Promise(function (resolve) {
55642
+ var isStateReached = function isStateReached() {
55643
+ return _this2.state === state;
55644
+ };
55645
+
55646
+ var check = function check() {
55647
+ setTimeout(function () {
55648
+ if (isStateReached()) {
55649
+ resolve();
55650
+ } else {
55651
+ check();
55652
+ }
55653
+ }, PHYSICS_STATE_TIMEOUT);
55654
+ };
55655
+
55656
+ check();
55657
+ });
55658
+ }
55536
55659
  }, {
55537
55660
  key: "dispose",
55538
55661
  value: function dispose() {
55539
55662
  if (Config$1.physics().enabled) {
55663
+ this.state = PHYSICS_STATES.TERMINATING;
55540
55664
  this.worker.postMessage({
55541
55665
  event: PHYSICS_EVENTS.TERMINATE
55542
55666
  });
@@ -55572,7 +55696,7 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55572
55696
  }, {
55573
55697
  key: "init",
55574
55698
  value: function init() {
55575
- var _this2 = this;
55699
+ var _this3 = this;
55576
55700
 
55577
55701
  if (Config$1.physics().enabled) {
55578
55702
  this.createWorker();
@@ -55583,7 +55707,7 @@ var Physics = /*#__PURE__*/function (_EventDispatcher) {
55583
55707
  }));
55584
55708
  return new Promise(function (resolve) {
55585
55709
  var isWorkerReady = function isWorkerReady() {
55586
- return _this2.workerReady;
55710
+ return _this3.workerReady;
55587
55711
  };
55588
55712
 
55589
55713
  var check = function check() {
@@ -55712,11 +55836,12 @@ var Physics$1 = new Physics();var ENTITY_TYPES = {
55712
55836
  SCENERY: 'EFFECT.SCENERY'
55713
55837
  },
55714
55838
  HELPER: {
55715
- GRID: 'HELPER.GRID'
55839
+ GRID: 'HELPER.GRID',
55840
+ AXES: 'HELPER.AXES'
55716
55841
  },
55717
55842
  UNKNOWN: 'UNKNOWN'
55718
55843
  };
55719
- var FLAT_ENTITY_TYPES = ['SCENE', 'CAMERA', 'MESH', 'LIGHT.DEFAULT', 'LIGHT.AMBIENT', 'LIGHT.SUN', 'LIGHT.HEMISPHERE', 'LIGHT.POINT', 'LIGHT.SPOT', 'AUDIO.DEFAULT', 'AUDIO.AMBIENT', 'AUDIO.DIRECTIONAL', 'AUDIO.BACKGROUND', 'MODEL', 'SPRITE', 'PARTICLE', 'EFFECT.PARTICLE', 'EFFECT.SCENERY', 'HELPER.GRID', 'UNKNOWN'];
55844
+ var FLAT_ENTITY_TYPES = [ENTITY_TYPES.SCENE, ENTITY_TYPES.CAMERA, ENTITY_TYPES.MESH, ENTITY_TYPES.LIGHT.DEFAULT, ENTITY_TYPES.LIGHT.AMBIENT, ENTITY_TYPES.LIGHT.SUN, ENTITY_TYPES.LIGHT.HEMISPHERE, ENTITY_TYPES.LIGHT.POINT, ENTITY_TYPES.LIGHT.SPOT, ENTITY_TYPES.AUDIO.DEFAULT, ENTITY_TYPES.AUDIO.AMBIENT, ENTITY_TYPES.AUDIO.DIRECTIONAL, ENTITY_TYPES.AUDIO.BACKGROUND, ENTITY_TYPES.MODEL, ENTITY_TYPES.SPRITE, ENTITY_TYPES.PARTICLE, ENTITY_TYPES.EFFECT.PARTICLE, ENTITY_TYPES.EFFECT.SCENERY, ENTITY_TYPES.HELPER.GRID, ENTITY_TYPES.HELPER.AXES, ENTITY_TYPES.UNKNOWN];
55720
55845
  var ENTITY_EVENTS = {
55721
55846
  DISPOSE: 'DISPOSE',
55722
55847
  STATE_MACHINE: {
@@ -57193,7 +57318,7 @@ function applyMiddleware() {
57193
57318
 
57194
57319
  var thunk = createThunkMiddleware();
57195
57320
  thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
57196
- var version = "3.17.5";
57321
+ var version = "3.17.8";
57197
57322
  var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
57198
57323
  var main = "dist/mage.js";
57199
57324
  var author$1 = {
@@ -58459,7 +58584,7 @@ if (!self.fetch) {
58459
58584
  self.Headers = Headers;
58460
58585
  self.Request = Request;
58461
58586
  self.Response = Response;
58462
- }var _excluded$4 = ["wheels", "accelerationKey", "brakingKey", "rightKey", "leftKey", "debug"];
58587
+ }var _excluded$6 = ["wheels", "accelerationKey", "brakingKey", "rightKey", "leftKey", "debug"];
58463
58588
 
58464
58589
  var BaseCar = /*#__PURE__*/function (_BaseScript) {
58465
58590
  _inherits(BaseCar, _BaseScript);
@@ -58485,7 +58610,7 @@ var BaseCar = /*#__PURE__*/function (_BaseScript) {
58485
58610
  _options$leftKey = options.leftKey,
58486
58611
  leftKey = _options$leftKey === void 0 ? 'a' : _options$leftKey;
58487
58612
  options.debug;
58488
- var physicsOptions = _objectWithoutProperties(options, _excluded$4);
58613
+ var physicsOptions = _objectWithoutProperties(options, _excluded$6);
58489
58614
 
58490
58615
  this.car = element;
58491
58616
  this.wheels = wheels;
@@ -58709,1557 +58834,1648 @@ var Scripts = /*#__PURE__*/function () {
58709
58834
 
58710
58835
  return Scripts;
58711
58836
  }();
58712
- var Scripts$1 = new Scripts();var Entity = /*#__PURE__*/function (_EventDispatcher) {
58713
- _inherits(Entity, _EventDispatcher);
58714
-
58715
- var _super = _createSuper(Entity);
58716
-
58717
- function Entity(_ref) {
58718
- var _this;
58837
+ var Scripts$1 = new Scripts();var inverseProjectionMatrix = new Matrix4();
58719
58838
 
58720
- var _ref$serializable = _ref.serializable,
58721
- serializable = _ref$serializable === void 0 ? true : _ref$serializable,
58722
- _ref$tag = _ref.tag,
58723
- tag = _ref$tag === void 0 ? '' : _ref$tag,
58724
- _ref$tags = _ref.tags,
58725
- tags = _ref$tags === void 0 ? [] : _ref$tags;
58726
-
58727
- _classCallCheck(this, Entity);
58728
-
58729
- _this = _super.call(this);
58730
-
58731
- _defineProperty$1(_assertThisInitialized(_this), "addTag", function (tagName) {
58732
- if (!tagName) return;
58733
-
58734
- if (!_this.hasTag(tagName)) {
58735
- _this.tags.push(tagName);
58839
+ var Frustum = /*#__PURE__*/function () {
58840
+ function Frustum(data) {
58841
+ _classCallCheck(this, Frustum);
58736
58842
 
58737
- return true;
58738
- } else {
58739
- console.log(TAG_ALREADY_EXISTS, tagName);
58740
- return false;
58741
- }
58742
- });
58843
+ data = data || {};
58844
+ this.vertices = {
58845
+ near: [new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1()],
58846
+ far: [new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1()]
58847
+ };
58743
58848
 
58744
- _defineProperty$1(_assertThisInitialized(_this), "hasStateMachine", function () {
58745
- return !!_this.stateMachine;
58746
- });
58849
+ if (data.projectionMatrix !== undefined) {
58850
+ this.setFromProjectionMatrix(data.projectionMatrix, data.maxFar || 10000);
58851
+ }
58852
+ }
58747
58853
 
58748
- _defineProperty$1(_assertThisInitialized(_this), "hasScripts", function () {
58749
- return _this.scripts.length > 0;
58750
- });
58854
+ _createClass(Frustum, [{
58855
+ key: "setFromProjectionMatrix",
58856
+ value: function setFromProjectionMatrix(projectionMatrix, maxFar) {
58857
+ var isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0;
58858
+ inverseProjectionMatrix.copy(projectionMatrix).invert(); // 3 --- 0 vertices.near/far order
58859
+ // | |
58860
+ // 2 --- 1
58861
+ // clip space spans from [-1, 1]
58751
58862
 
58752
- _defineProperty$1(_assertThisInitialized(_this), "parseScripts", function (list, options, enabled) {
58753
- return list.map(function (script, i) {
58754
- return {
58755
- script: script,
58756
- name: script.getName(),
58757
- enabled: enabled,
58758
- options: options[i]
58759
- };
58863
+ this.vertices.near[0].set(1, 1, -1);
58864
+ this.vertices.near[1].set(1, -1, -1);
58865
+ this.vertices.near[2].set(-1, -1, -1);
58866
+ this.vertices.near[3].set(-1, 1, -1);
58867
+ this.vertices.near.forEach(function (v) {
58868
+ v.applyMatrix4(inverseProjectionMatrix);
58760
58869
  });
58761
- });
58870
+ this.vertices.far[0].set(1, 1, 1);
58871
+ this.vertices.far[1].set(1, -1, 1);
58872
+ this.vertices.far[2].set(-1, -1, 1);
58873
+ this.vertices.far[3].set(-1, 1, 1);
58874
+ this.vertices.far.forEach(function (v) {
58875
+ v.applyMatrix4(inverseProjectionMatrix);
58876
+ var absZ = Math.abs(v.z);
58762
58877
 
58763
- _defineProperty$1(_assertThisInitialized(_this), "isMesh", function () {
58764
- return _this.getEntityType() === ENTITY_TYPES.MESH;
58765
- });
58878
+ if (isOrthographic) {
58879
+ v.z *= Math.min(maxFar / absZ, 1.0);
58880
+ } else {
58881
+ v.multiplyScalar(Math.min(maxFar / absZ, 1.0));
58882
+ }
58883
+ });
58884
+ return this.vertices;
58885
+ }
58886
+ }, {
58887
+ key: "split",
58888
+ value: function split(breaks, target) {
58889
+ while (breaks.length > target.length) {
58890
+ target.push(new Frustum());
58891
+ }
58766
58892
 
58767
- _defineProperty$1(_assertThisInitialized(_this), "isModel", function () {
58768
- return _this.getEntityType() === ENTITY_TYPES.MODEL;
58769
- });
58893
+ target.length = breaks.length;
58770
58894
 
58771
- _defineProperty$1(_assertThisInitialized(_this), "isSprite", function () {
58772
- return _this.getEntityType() === ENTITY_TYPES.SPRITE;
58773
- });
58895
+ for (var i = 0; i < breaks.length; i++) {
58896
+ var cascade = target[i];
58774
58897
 
58775
- _defineProperty$1(_assertThisInitialized(_this), "isLight", function () {
58776
- return Object.values(ENTITY_TYPES.LIGHT).includes(_this.getEntityType());
58777
- });
58898
+ if (i === 0) {
58899
+ for (var j = 0; j < 4; j++) {
58900
+ cascade.vertices.near[j].copy(this.vertices.near[j]);
58901
+ }
58902
+ } else {
58903
+ for (var _j = 0; _j < 4; _j++) {
58904
+ cascade.vertices.near[_j].lerpVectors(this.vertices.near[_j], this.vertices.far[_j], breaks[i - 1]);
58905
+ }
58906
+ }
58778
58907
 
58779
- _defineProperty$1(_assertThisInitialized(_this), "isHelper", function () {
58780
- return Object.values(ENTITY_TYPES.HELPER).includes(_this.getEntityType());
58781
- });
58908
+ if (i === breaks - 1) {
58909
+ for (var _j2 = 0; _j2 < 4; _j2++) {
58910
+ cascade.vertices.far[_j2].copy(this.vertices.far[_j2]);
58911
+ }
58912
+ } else {
58913
+ for (var _j3 = 0; _j3 < 4; _j3++) {
58914
+ cascade.vertices.far[_j3].lerpVectors(this.vertices.near[_j3], this.vertices.far[_j3], breaks[i]);
58915
+ }
58916
+ }
58917
+ }
58918
+ }
58919
+ }, {
58920
+ key: "toSpace",
58921
+ value: function toSpace(cameraMatrix, target) {
58922
+ for (var i = 0; i < 4; i++) {
58923
+ target.vertices.near[i].copy(this.vertices.near[i]).applyMatrix4(cameraMatrix);
58924
+ target.vertices.far[i].copy(this.vertices.far[i]).applyMatrix4(cameraMatrix);
58925
+ }
58926
+ }
58927
+ }]);
58782
58928
 
58783
- _defineProperty$1(_assertThisInitialized(_this), "isEffect", function () {
58784
- return Object.values(ENTITY_TYPES.EFFECT).includes(_this.getEntityType());
58785
- });
58929
+ return Frustum;
58930
+ }();var Shader$1 = {
58931
+ lights_fragment_begin:
58932
+ /* glsl */
58933
+ "\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef CLEARCOAT\n\n geometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n pointLight = pointLights[ i ];\n\n getPointDirectLightIrradiance( pointLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n SpotLight spotLight;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n spotLight = spotLights[ i ];\n\n getSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0) && defined( RE_Direct ) && defined( USE_CSM ) && defined( CSM_CASCADES )\n\n DirectionalLight directionalLight;\n float linearDepth = (vViewPosition.z) / (shadowFar - cameraNear);\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n #if defined( USE_SHADOWMAP ) && defined( CSM_FADE )\n vec2 cascade;\n float cascadeCenter;\n float closestEdge;\n float margin;\n float csmx;\n float csmy;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n // NOTE: Depth gets larger away from the camera.\n // cascade.x is closer, cascade.y is further\n cascade = CSM_cascades[ i ];\n cascadeCenter = ( cascade.x + cascade.y ) / 2.0;\n closestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;\n margin = 0.25 * pow( closestEdge, 2.0 );\n csmx = cascade.x - margin / 2.0;\n csmy = cascade.y + margin / 2.0;\n if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS && linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {\n\n float dist = min( linearDepth - csmx, csmy - linearDepth );\n float ratio = clamp( dist / margin, 0.0, 1.0 );\n if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) {\n\n vec3 prevColor = directLight.color;\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n bool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;\n directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );\n\n }\n\n ReflectedLight prevLight = reflectedLight;\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;\n float blendRatio = shouldBlend ? ratio : 1.0;\n\n reflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );\n reflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, blendRatio );\n reflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, blendRatio );\n reflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, blendRatio );\n\n }\n\n }\n #pragma unroll_loop_end\n #else\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\n directionalLightShadow = directionalLightShadows[ i ];\n if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n #endif\n\n if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n #endif\n\n#endif\n\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && !defined( USE_CSM ) && !defined( CSM_CASCADES )\n\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n RectAreaLight rectAreaLight;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n vec3 iblIrradiance = vec3( 0.0 );\n\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n irradiance += getLightProbeIrradiance( lightProbe, geometry );\n\n #if ( NUM_HEMI_LIGHTS > 0 )\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\n }\n #pragma unroll_loop_end\n\n #endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n",
58934
+ lights_pars_begin:
58935
+ /* glsl */
58936
+ "\n#if defined( USE_CSM ) && defined( CSM_CASCADES )\nuniform vec2 CSM_cascades[CSM_CASCADES];\nuniform float cameraNear;\nuniform float shadowFar;\n#endif\n " + ShaderChunk.lights_pars_begin
58937
+ };var _cameraToLightMatrix = new Matrix4();
58786
58938
 
58787
- _defineProperty$1(_assertThisInitialized(_this), "setQuaternion", function (_ref2) {
58788
- var x = _ref2.x,
58789
- y = _ref2.y,
58790
- z = _ref2.z,
58791
- w = _ref2.w;
58939
+ var _lightSpaceFrustum = new Frustum();
58792
58940
 
58793
- _this.body.quaternion.set(x, y, z, w);
58794
- });
58941
+ var _center = new Vector3$1();
58795
58942
 
58796
- _defineProperty$1(_assertThisInitialized(_this), "setUuid", function (uuid) {
58797
- if (uuid) {
58798
- _this.body.uuid = uuid;
58799
- }
58800
- });
58943
+ var _bbox = new Box3();
58801
58944
 
58802
- _this.scripts = [];
58803
- _this.tags = [];
58804
- _this.children = [];
58805
- _this.isMage = true;
58945
+ var _uniformArray = [];
58946
+ var _logArray = [];
58947
+ var DEFAULT_MAX_FAR = 100000;
58948
+ var DEFAULT_MODE = 'practical';
58949
+ var DEFAULT_SHADOWMAP_SIZE = 2048;
58950
+ var DEFAULT_CASCADE = 3;
58951
+ var DEFAULT_BIAS$3 = 0.000001;
58952
+ var DEFAULT_INTENSITY$5 = 1;
58953
+ var DEFAULT_NEAR$3 = 1;
58954
+ var DEFAULT_FAR$3 = 2000;
58955
+ var DEFAULT_MARGIN = 200;
58956
+ var CascadeShadowMaps = /*#__PURE__*/function () {
58957
+ function CascadeShadowMaps(_ref) {
58958
+ var _ref$camera = _ref.camera,
58959
+ camera = _ref$camera === void 0 ? Scene$1.getCameraBody() : _ref$camera,
58960
+ _ref$parent = _ref.parent,
58961
+ parent = _ref$parent === void 0 ? Scene$1.getScene() : _ref$parent,
58962
+ _ref$cascades = _ref.cascades,
58963
+ cascades = _ref$cascades === void 0 ? DEFAULT_CASCADE : _ref$cascades,
58964
+ _ref$maxFar = _ref.maxFar,
58965
+ maxFar = _ref$maxFar === void 0 ? DEFAULT_MAX_FAR : _ref$maxFar,
58966
+ _ref$mode = _ref.mode,
58967
+ mode = _ref$mode === void 0 ? DEFAULT_MODE : _ref$mode,
58968
+ _ref$shadowMapSize = _ref.shadowMapSize,
58969
+ shadowMapSize = _ref$shadowMapSize === void 0 ? DEFAULT_SHADOWMAP_SIZE : _ref$shadowMapSize,
58970
+ _ref$shadowBias = _ref.shadowBias,
58971
+ shadowBias = _ref$shadowBias === void 0 ? DEFAULT_BIAS$3 : _ref$shadowBias,
58972
+ _ref$lightDirection = _ref.lightDirection,
58973
+ lightDirection = _ref$lightDirection === void 0 ? new Vector3$1(1, -1, 1).normalize() : _ref$lightDirection,
58974
+ _ref$lightIntensity = _ref.lightIntensity,
58975
+ lightIntensity = _ref$lightIntensity === void 0 ? DEFAULT_INTENSITY$5 : _ref$lightIntensity,
58976
+ _ref$lightNear = _ref.lightNear,
58977
+ lightNear = _ref$lightNear === void 0 ? DEFAULT_NEAR$3 : _ref$lightNear,
58978
+ _ref$lightFar = _ref.lightFar,
58979
+ lightFar = _ref$lightFar === void 0 ? DEFAULT_FAR$3 : _ref$lightFar,
58980
+ _ref$lightMargin = _ref.lightMargin,
58981
+ lightMargin = _ref$lightMargin === void 0 ? DEFAULT_MARGIN : _ref$lightMargin,
58982
+ customSplitsCallback = _ref.customSplitsCallback;
58806
58983
 
58807
- _this.addTags([DEFAULT_TAG, tag].concat(_toConsumableArray(tags)));
58984
+ _classCallCheck(this, CascadeShadowMaps);
58808
58985
 
58809
- _this.serializable = serializable;
58810
- return _this;
58986
+ this.camera = camera;
58987
+ this.parent = parent;
58988
+ this.cascades = cascades;
58989
+ this.maxFar = maxFar;
58990
+ this.mode = mode;
58991
+ this.shadowMapSize = shadowMapSize;
58992
+ this.shadowBias = shadowBias;
58993
+ this.lightDirection = lightDirection;
58994
+ this.lightIntensity = lightIntensity;
58995
+ this.lightNear = lightNear;
58996
+ this.lightFar = lightFar;
58997
+ this.lightMargin = lightMargin;
58998
+ this.customSplitsCallback = customSplitsCallback;
58999
+ this.fade = false;
59000
+ this.mainFrustum = new Frustum();
59001
+ this.frustums = [];
59002
+ this.breaks = [];
59003
+ this.lights = [];
59004
+ this.shaders = new Map();
59005
+ this.createLights();
59006
+ this.updateFrustums();
59007
+ this.injectInclude();
58811
59008
  }
58812
59009
 
58813
- _createClass(Entity, [{
58814
- key: "reset",
58815
- value: function reset() {
58816
- this.scripts = [];
58817
- this.tags = [DEFAULT_TAG];
58818
- }
58819
- }, {
58820
- key: "hasBody",
58821
- value: function hasBody() {
58822
- return !!this.body;
58823
- }
58824
- }, {
58825
- key: "getBody",
58826
- value: function getBody() {
58827
- return this.body;
58828
- }
58829
- }, {
58830
- key: "setBody",
58831
- value: function setBody(body) {
58832
- this.body = body;
58833
- }
58834
- }, {
58835
- key: "hasParent",
58836
- value: function hasParent() {
58837
- return !!this.parent;
58838
- }
58839
- }, {
58840
- key: "getParent",
58841
- value: function getParent() {
58842
- return this.parent;
59010
+ _createClass(CascadeShadowMaps, [{
59011
+ key: "createLights",
59012
+ value: function createLights() {
59013
+ for (var i = 0; i < this.cascades; i++) {
59014
+ var light = new DirectionalLight(0xffffff, this.lightIntensity);
59015
+ light.castShadow = true;
59016
+ light.shadow.mapSize.width = this.shadowMapSize;
59017
+ light.shadow.mapSize.height = this.shadowMapSize;
59018
+ light.shadow.camera.near = this.lightNear;
59019
+ light.shadow.camera.far = this.lightFar;
59020
+ light.shadow.bias = this.shadowBias;
59021
+ this.parent.add(light);
59022
+ this.parent.add(light.target);
59023
+ this.lights.push(light);
59024
+ }
58843
59025
  }
58844
59026
  }, {
58845
- key: "setParent",
58846
- value: function setParent(parent) {
58847
- this.parent = parent;
59027
+ key: "initCascades",
59028
+ value: function initCascades() {
59029
+ var camera = this.camera;
59030
+ camera.updateProjectionMatrix();
59031
+ this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar);
59032
+ this.mainFrustum.split(this.breaks, this.frustums);
58848
59033
  }
58849
59034
  }, {
58850
- key: "add",
58851
- value: function add(element) {
58852
- var _this2 = this;
58853
-
58854
- if (this.hasBody()) {
58855
- var _add = function _add(toAdd) {
58856
- _this2.children.push(toAdd);
59035
+ key: "updateShadowBounds",
59036
+ value: function updateShadowBounds() {
59037
+ var frustums = this.frustums;
58857
59038
 
58858
- toAdd.setParent(_this2);
59039
+ for (var i = 0; i < frustums.length; i++) {
59040
+ var light = this.lights[i];
59041
+ var shadowCam = light.shadow.camera;
59042
+ var frustum = this.frustums[i]; // Get the two points that represent that furthest points on the frustum assuming
59043
+ // that's either the diagonal across the far plane or the diagonal across the whole
59044
+ // frustum itself.
58859
59045
 
58860
- _this2.getBody().add(toAdd.getBody());
58861
- };
59046
+ var nearVerts = frustum.vertices.near;
59047
+ var farVerts = frustum.vertices.far;
59048
+ var point1 = farVerts[0];
59049
+ var point2 = void 0;
58862
59050
 
58863
- if (Array.isArray(element)) {
58864
- element.forEach(_add);
59051
+ if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {
59052
+ point2 = farVerts[2];
58865
59053
  } else {
58866
- _add(element);
59054
+ point2 = nearVerts[2];
58867
59055
  }
58868
- }
58869
- }
58870
- }, {
58871
- key: "isParentOf",
58872
- value: function isParentOf(element) {
58873
- var comparator = function comparator(child) {
58874
- return !!child.getBody().getObjectById(element.id);
58875
- };
58876
59056
 
58877
- if (element.isMage) {
58878
- comparator = function comparator(child) {
58879
- return child.getBody().getObjectById(element.id());
58880
- };
58881
- }
59057
+ var squaredBBWidth = point1.distanceTo(point2);
58882
59058
 
58883
- return this.children.filter(comparator).length > 0;
58884
- }
58885
- }, {
58886
- key: "has",
58887
- value: function has(element) {
58888
- if (element.isMage) {
58889
- return this.equals(element) || this.isParentOf(element);
58890
- } else {
58891
- return this.getBody().getObjectById(element.id);
59059
+ if (this.fade) {
59060
+ // expand the shadow extents by the fade margin if fade is enabled.
59061
+ var camera = this.camera;
59062
+ var far = Math.max(camera.far, this.maxFar);
59063
+ var linearDepth = frustum.vertices.far[0].z / (far - camera.near);
59064
+ var margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near);
59065
+ squaredBBWidth += margin;
59066
+ }
59067
+
59068
+ shadowCam.left = -squaredBBWidth / 2;
59069
+ shadowCam.right = squaredBBWidth / 2;
59070
+ shadowCam.top = squaredBBWidth / 2;
59071
+ shadowCam.bottom = -squaredBBWidth / 2;
59072
+ shadowCam.updateProjectionMatrix();
58892
59073
  }
58893
59074
  }
58894
59075
  }, {
58895
- key: "remove",
58896
- value: function remove(element) {
58897
- if (this.hasBody() && this.has(element)) {
58898
- this.body.remove(element.body);
58899
- var index = this.children.findIndex(function (m) {
58900
- return m.equals(element);
58901
- });
58902
- this.children.splice(index, 1);
59076
+ key: "getBreaks",
59077
+ value: function getBreaks() {
59078
+ var camera = this.camera;
59079
+ var far = Math.min(camera.far, this.maxFar);
59080
+ this.breaks.length = 0;
59081
+
59082
+ switch (this.mode) {
59083
+ case 'uniform':
59084
+ uniformSplit(this.cascades, camera.near, far, this.breaks);
59085
+ break;
59086
+
59087
+ case 'logarithmic':
59088
+ logarithmicSplit(this.cascades, camera.near, far, this.breaks);
59089
+ break;
59090
+
59091
+ case 'practical':
59092
+ practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks);
59093
+ break;
59094
+
59095
+ case 'custom':
59096
+ if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.');
59097
+ this.customSplitsCallback(this.cascades, camera.near, far, this.breaks);
59098
+ break;
58903
59099
  }
58904
- }
58905
- }, {
58906
- key: "getHierarchy",
58907
- value: function getHierarchy() {
58908
- return {
58909
- element: this,
58910
- children: this.children.map(function (e) {
58911
- return e.getHierarchy();
58912
- })
58913
- };
58914
- }
58915
- }, {
58916
- key: "addTags",
58917
- value: function addTags() {
58918
- var tags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
58919
- tags.forEach(this.addTag);
58920
- }
58921
- }, {
58922
- key: "removeTag",
58923
- value: function removeTag(tagName) {
58924
- if (tagName === DEFAULT_TAG) {
58925
- console.log(TAG_CANT_BE_REMOVED);
58926
- return;
59100
+
59101
+ function uniformSplit(amount, near, far, target) {
59102
+ for (var i = 1; i < amount; i++) {
59103
+ target.push((near + (far - near) * i / amount) / far);
59104
+ }
59105
+
59106
+ target.push(1);
58927
59107
  }
58928
59108
 
58929
- if (this.hasTag(tagName)) {
58930
- this.tags.splice(this.tags.indexOf(tagName), 1);
58931
- } else {
58932
- console.log(TAG_NOT_EXISTING_REMOVAL);
59109
+ function logarithmicSplit(amount, near, far, target) {
59110
+ for (var i = 1; i < amount; i++) {
59111
+ target.push(near * Math.pow(far / near, i / amount) / far);
59112
+ }
59113
+
59114
+ target.push(1);
58933
59115
  }
58934
- }
58935
- }, {
58936
- key: "removeAllTags",
58937
- value: function removeAllTags() {
58938
- this.tags = [DEFAULT_TAG];
58939
- }
58940
- }, {
58941
- key: "hasTag",
58942
- value: function hasTag(tagName) {
58943
- return this.tags.includes(tagName);
58944
- }
58945
- }, {
58946
- key: "getTags",
58947
- value: function getTags() {
58948
- return this.tags;
58949
- }
58950
- }, {
58951
- key: "stopScripts",
58952
- value: function stopScripts() {
58953
- if (this.hasScripts()) {
58954
- this.scripts.forEach(function (_ref3) {
58955
- var script = _ref3.script,
58956
- enabled = _ref3.enabled;
58957
59116
 
58958
- if (enabled) {
58959
- script.onDispose();
59117
+ function practicalSplit(amount, near, far, lambda, target) {
59118
+ _uniformArray.length = 0;
59119
+ _logArray.length = 0;
59120
+ logarithmicSplit(amount, near, far, _logArray);
59121
+ uniformSplit(amount, near, far, _uniformArray);
58960
59122
 
58961
- script.__hasStarted(false);
58962
- }
58963
- });
59123
+ for (var i = 1; i < amount; i++) {
59124
+ target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda));
59125
+ }
59126
+
59127
+ target.push(1);
58964
59128
  }
58965
59129
  }
58966
59130
  }, {
58967
- key: "start",
58968
- value: function start() {
58969
- var _this3 = this;
59131
+ key: "update",
59132
+ value: function update() {
59133
+ var camera = this.camera;
59134
+ var frustums = this.frustums;
58970
59135
 
58971
- if (this.hasScripts()) {
58972
- this.scripts.forEach(function (_ref4) {
58973
- var script = _ref4.script,
58974
- enabled = _ref4.enabled,
58975
- options = _ref4.options;
59136
+ for (var i = 0; i < frustums.length; i++) {
59137
+ var light = this.lights[i];
59138
+ var shadowCam = light.shadow.camera;
59139
+ var texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize;
59140
+ var texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize;
59141
+ light.shadow.camera.updateMatrixWorld(true);
58976
59142
 
58977
- if (enabled) {
58978
- script.start(_this3, options);
59143
+ _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld);
58979
59144
 
58980
- script.__hasStarted(true);
58981
- }
58982
- });
58983
- }
58984
- }
58985
- }, {
58986
- key: "update",
58987
- value: function update(dt) {
58988
- if (this.hasScripts()) {
58989
- this.scripts.forEach(function (_ref5) {
58990
- var script = _ref5.script,
58991
- enabled = _ref5.enabled;
59145
+ frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum);
59146
+ var nearVerts = _lightSpaceFrustum.vertices.near;
59147
+ var farVerts = _lightSpaceFrustum.vertices.far;
58992
59148
 
58993
- if (script && enabled) {
58994
- script.update(dt);
58995
- }
58996
- });
58997
- }
58998
- }
58999
- }, {
59000
- key: "onPhysicsUpdate",
59001
- value: function onPhysicsUpdate(dt) {
59002
- if (this.hasScripts()) {
59003
- this.scripts.forEach(function (_ref6) {
59004
- var script = _ref6.script,
59005
- enabled = _ref6.enabled;
59149
+ _bbox.makeEmpty();
59006
59150
 
59007
- if (script && enabled) {
59008
- script.physicsUpdate(dt);
59009
- }
59010
- });
59011
- }
59012
- }
59013
- }, {
59014
- key: "dispose",
59015
- value: function dispose() {
59016
- if (this.hasBody()) {
59017
- this.stopStateMachine();
59018
- this.stopScripts();
59019
- this.reset();
59020
- }
59151
+ for (var j = 0; j < 4; j++) {
59152
+ _bbox.expandByPoint(nearVerts[j]);
59021
59153
 
59022
- this.dispatchEvent({
59023
- type: ENTITY_EVENTS.DISPOSE
59024
- });
59025
- }
59026
- }, {
59027
- key: "addStateMachine",
59028
- value: function addStateMachine(description) {
59029
- var _this4 = this;
59154
+ _bbox.expandByPoint(farVerts[j]);
59155
+ }
59030
59156
 
59031
- this.stateMachine = interpret(createMachine(description)).onTransition(function (state) {
59032
- _this4.dispatchEvent({
59033
- type: ENTITY_EVENTS.STATE_MACHINE.CHANGE,
59034
- state: state
59035
- });
59036
- });
59157
+ _bbox.getCenter(_center);
59037
59158
 
59038
- if (description.autostart) {
59039
- this.startStateMachine();
59040
- }
59041
- }
59042
- }, {
59043
- key: "startStateMachine",
59044
- value: function startStateMachine() {
59045
- if (this.hasStateMachine()) {
59046
- this.stateMachine.start();
59047
- } else {
59048
- console.log(STATE_MACHINE_NOT_AVAILABLE);
59049
- }
59050
- }
59051
- }, {
59052
- key: "stopStateMachine",
59053
- value: function stopStateMachine() {
59054
- if (this.hasStateMachine()) {
59055
- this.stateMachine.stop();
59159
+ _center.z = _bbox.max.z + this.lightMargin;
59160
+ _center.x = Math.floor(_center.x / texelWidth) * texelWidth;
59161
+ _center.y = Math.floor(_center.y / texelHeight) * texelHeight;
59162
+
59163
+ _center.applyMatrix4(light.shadow.camera.matrixWorld);
59164
+
59165
+ light.position.copy(_center);
59166
+ light.target.position.copy(_center);
59167
+ light.target.position.x += this.lightDirection.x;
59168
+ light.target.position.y += this.lightDirection.y;
59169
+ light.target.position.z += this.lightDirection.z;
59056
59170
  }
59057
59171
  }
59058
59172
  }, {
59059
- key: "changeState",
59060
- value: function changeState(event) {
59061
- if (this.hasStateMachine()) {
59062
- this.stateMachine.send(event);
59063
- } else {
59064
- console.log(STATE_MACHINE_NOT_AVAILABLE);
59065
- }
59173
+ key: "injectInclude",
59174
+ value: function injectInclude() {
59175
+ ShaderChunk.lights_fragment_begin = Shader$1.lights_fragment_begin;
59176
+ ShaderChunk.lights_pars_begin = Shader$1.lights_pars_begin;
59066
59177
  }
59067
59178
  }, {
59068
- key: "getScript",
59069
- value: function getScript(name) {
59070
- var script = this.scripts.filter(function (script) {
59071
- return script.name === name;
59072
- })[0].script;
59179
+ key: "setupMaterial",
59180
+ value: function setupMaterial(material) {
59181
+ material.defines = material.defines || {};
59182
+ material.defines.USE_CSM = 1;
59183
+ material.defines.CSM_CASCADES = this.cascades;
59073
59184
 
59074
- if (script) {
59075
- return script;
59076
- } else {
59077
- console.warn(SCRIPT_NOT_FOUND);
59185
+ if (this.fade) {
59186
+ material.defines.CSM_FADE = '';
59078
59187
  }
59079
- }
59080
- }, {
59081
- key: "addScripts",
59082
- value: function addScripts() {
59083
- var _this5 = this;
59084
59188
 
59085
- var scripts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
59086
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
59087
- var enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
59088
- var parsedScripts = this.parseScripts(scripts, options, enabled);
59089
- this.scripts = [].concat(_toConsumableArray(this.scripts), [parsedScripts]);
59189
+ var breaksVec2 = [];
59190
+ var scope = this;
59191
+ var shaders = this.shaders;
59090
59192
 
59091
- if (enabled) {
59092
- parsedScripts.forEach(function (parsed) {
59093
- return parsed.start(_this5, parsed.options);
59094
- });
59095
- }
59193
+ material.onBeforeCompile = function (shader) {
59194
+ var far = Math.min(scope.camera.far, scope.maxFar);
59195
+ scope.getExtendedBreaks(breaksVec2);
59196
+ shader.uniforms.CSM_cascades = {
59197
+ value: breaksVec2
59198
+ };
59199
+ shader.uniforms.cameraNear = {
59200
+ value: scope.camera.near
59201
+ };
59202
+ shader.uniforms.shadowFar = {
59203
+ value: far
59204
+ };
59205
+ shaders.set(material, shader);
59206
+ };
59207
+
59208
+ shaders.set(material, null);
59096
59209
  }
59097
59210
  }, {
59098
- key: "addScript",
59099
- value: function addScript(name) {
59100
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
59101
- var script = Scripts$1.get(name);
59102
- var _options$enabled = options.enabled,
59103
- enabled = _options$enabled === void 0 ? true : _options$enabled;
59104
-
59105
- if (script) {
59106
- this.scripts.push({
59107
- script: script,
59108
- name: name,
59109
- enabled: enabled,
59110
- options: options
59111
- });
59112
-
59113
- if (enabled) {
59114
- script.start(this, options);
59211
+ key: "updateUniforms",
59212
+ value: function updateUniforms() {
59213
+ var far = Math.min(this.camera.far, this.maxFar);
59214
+ var shaders = this.shaders;
59215
+ shaders.forEach(function (shader, material) {
59216
+ if (shader !== null) {
59217
+ var uniforms = shader.uniforms;
59218
+ this.getExtendedBreaks(uniforms.CSM_cascades.value);
59219
+ uniforms.cameraNear.value = this.camera.near;
59220
+ uniforms.shadowFar.value = far;
59115
59221
  }
59116
- } else {
59117
- console.log(SCRIPT_NOT_FOUND);
59118
- }
59119
59222
 
59120
- return script;
59121
- }
59122
- }, {
59123
- key: "enableScripts",
59124
- value: function enableScripts() {
59125
- this.scriptsEnabled = true;
59126
- }
59127
- }, {
59128
- key: "disableScripts",
59129
- value: function disableScripts() {
59130
- this.scriptsEnabled = false;
59223
+ if (!this.fade && 'CSM_FADE' in material.defines) {
59224
+ delete material.defines.CSM_FADE;
59225
+ material.needsUpdate = true;
59226
+ } else if (this.fade && !('CSM_FADE' in material.defines)) {
59227
+ material.defines.CSM_FADE = '';
59228
+ material.needsUpdate = true;
59229
+ }
59230
+ }, this);
59131
59231
  }
59132
59232
  }, {
59133
- key: "setEntityType",
59134
- value: function setEntityType(type) {
59135
- if (FLAT_ENTITY_TYPES.includes(type)) {
59136
- this.entityType = type;
59137
- } else {
59138
- console.log(ENTITY_TYPE_NOT_ALLOWED);
59139
- this.entityType = ENTITY_TYPES.UNKNOWN;
59233
+ key: "getExtendedBreaks",
59234
+ value: function getExtendedBreaks(target) {
59235
+ while (target.length < this.breaks.length) {
59236
+ target.push(new Vector2());
59140
59237
  }
59141
- }
59142
- }, {
59143
- key: "getEntityType",
59144
- value: function getEntityType() {
59145
- return this.entityType;
59146
- }
59147
- }, {
59148
- key: "addLight",
59149
- // TODO: sounds should become entities
59150
- // addSound(name, options) {
59151
- // const { autoplay = false, ...opts } = options;
59152
- // this.isPlayingSound = autoplay;
59153
- // this.sound = new Sound(name, {
59154
- // autoplay,
59155
- // ...opts
59156
- // });
59157
- // this.sound.setTarget(this);
59158
- // return this.sound;
59159
- // }
59160
- // addDirectionalSound(name, options) {
59161
- // const { autoplay = false, ...opts } = options;
59162
- // this.isPlayingSound = autoplay;
59163
- // this.sound = new DirectionalSound(name, {
59164
- // autoplay,
59165
- // ...opts
59166
- // });
59167
- // this.sound.setTarget(this);
59168
- // return this.sound;
59169
- // }
59170
- // addAmbientSound(name, options) {
59171
- // const { autoplay = false, ...opts } = options;
59172
- // this.isPlayingSound = autoplay;
59173
- // this.sound = new AmbientSound(name, {
59174
- // body: this.body,
59175
- // autoplay,
59176
- // ...opts
59177
- // });
59178
- // return this.sound;
59179
- // }
59180
- value: function addLight(light) {
59181
- var _this$getPosition = this.getPosition(),
59182
- x = _this$getPosition.x,
59183
- y = _this$getPosition.y,
59184
- z = _this$getPosition.z;
59185
59238
 
59186
- light.setPosition({
59187
- x: x,
59188
- y: y,
59189
- z: z
59190
- });
59191
- this.light = light;
59239
+ target.length = this.breaks.length;
59240
+
59241
+ for (var i = 0; i < this.cascades; i++) {
59242
+ var amount = this.breaks[i];
59243
+ var prev = this.breaks[i - 1] || 0;
59244
+ target[i].x = prev;
59245
+ target[i].y = amount;
59246
+ }
59192
59247
  }
59193
59248
  }, {
59194
- key: "playSound",
59195
- value: function playSound() {
59196
- if (this.sound && !this.isPlayingSound) {
59197
- this.sound.play();
59198
- this.isPlayingSound = true;
59199
- }
59249
+ key: "updateFrustums",
59250
+ value: function updateFrustums() {
59251
+ this.getBreaks();
59252
+ this.initCascades();
59253
+ this.updateShadowBounds();
59254
+ this.updateUniforms();
59200
59255
  }
59201
59256
  }, {
59202
- key: "stopSound",
59203
- value: function stopSound() {
59204
- if (this.sound && this.isPlayingSound) {
59205
- this.sound.stop();
59206
- this.isPlayingSound = false;
59257
+ key: "remove",
59258
+ value: function remove() {
59259
+ for (var i = 0; i < this.lights.length; i++) {
59260
+ this.parent.remove(this.lights[i]);
59207
59261
  }
59208
59262
  }
59209
59263
  }, {
59210
- key: "getScale",
59211
- value: function getScale() {
59212
- return {
59213
- x: this.body.scale.x,
59214
- y: this.body.scale.y,
59215
- z: this.body.scale.z
59216
- };
59264
+ key: "dispose",
59265
+ value: function dispose() {
59266
+ var shaders = this.shaders;
59267
+ shaders.forEach(function (shader, material) {
59268
+ delete material.onBeforeCompile;
59269
+ delete material.defines.USE_CSM;
59270
+ delete material.defines.CSM_CASCADES;
59271
+ delete material.defines.CSM_FADE;
59272
+
59273
+ if (shader !== null) {
59274
+ delete shader.uniforms.CSM_cascades;
59275
+ delete shader.uniforms.cameraNear;
59276
+ delete shader.uniforms.shadowFar;
59277
+ }
59278
+
59279
+ material.needsUpdate = true;
59280
+ });
59281
+ shaders.clear();
59217
59282
  }
59218
- }, {
59219
- key: "setScale",
59220
- value: function setScale(howbig) {
59221
- if (this.hasBody()) {
59222
- var scale = _objectSpread2$1(_objectSpread2$1({}, this.getScale()), howbig);
59283
+ }]);
59223
59284
 
59224
- this.body.scale.set(scale.x, scale.y, scale.z);
59225
- }
59285
+ return CascadeShadowMaps;
59286
+ }();var POINTLIGHT = 'pointlight';
59287
+ var AMBIENTLIGHT = 'ambientlight';
59288
+ var SUNLIGHT = 'sunlight';
59289
+ var SPOTLIGHT = 'spotlight';
59290
+ var HEMISPHERELIGHT = 'hemisphere';
59291
+ var TIME_TO_UPDATE = 5;
59292
+ var Lights = /*#__PURE__*/function () {
59293
+ function Lights() {
59294
+ _classCallCheck(this, Lights);
59295
+
59296
+ this.delayFactor = 0.1;
59297
+ this.delayStep = 30;
59298
+ this.holderRadius = 0.01;
59299
+ this.holderSegments = 1;
59300
+ this.numLights = 0;
59301
+ this.map = {};
59302
+ this.lights = [];
59303
+ this.csm = undefined;
59304
+ }
59305
+
59306
+ _createClass(Lights, [{
59307
+ key: "isUsingCSM",
59308
+ value: function isUsingCSM() {
59309
+ return !!this.csm;
59226
59310
  }
59227
59311
  }, {
59228
- key: "getQuaternion",
59229
- value: function getQuaternion() {
59230
- if (this.hasBody()) {
59231
- return this.getBody().quaternion.clone();
59232
- }
59312
+ key: "setUpCSM",
59313
+ value: function setUpCSM() {
59314
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
59315
+ this.csm = new CascadeShadowMaps(options);
59233
59316
  }
59234
59317
  }, {
59235
- key: "getPosition",
59236
- value: function getPosition() {
59237
- return this.getBody().position.clone();
59318
+ key: "add",
59319
+ value: function add(light) {
59320
+ this.lights.push(light);
59238
59321
  }
59239
59322
  }, {
59240
- key: "setPosition",
59241
- value: function setPosition(where) {
59242
- if (this.hasBody()) {
59243
- var _this$getPosition2 = this.getPosition(),
59244
- x = _this$getPosition2.x,
59245
- y = _this$getPosition2.y,
59246
- z = _this$getPosition2.z;
59247
-
59248
- var position = _objectSpread2$1({
59249
- x: x,
59250
- y: y,
59251
- z: z
59252
- }, where);
59253
-
59254
- this.body.position.set(position.x, position.y, position.z);
59323
+ key: "update",
59324
+ value: function update(dt) {
59325
+ if (this.isUsingCSM()) {
59326
+ this.csm.update();
59255
59327
  }
59256
- }
59257
- }, {
59258
- key: "getRotation",
59259
- value: function getRotation() {
59260
- return this.getBody().rotation.clone();
59261
- }
59262
- }, {
59263
- key: "setRotation",
59264
- value: function setRotation(how) {
59265
- if (this.hasBody()) {
59266
- var _this$getRotation = this.getRotation(),
59267
- x = _this$getRotation.x,
59268
- y = _this$getRotation.y,
59269
- z = _this$getRotation.z;
59270
59328
 
59271
- var rotation = _objectSpread2$1({
59272
- x: x,
59273
- y: y,
59274
- z: z
59275
- }, how);
59329
+ var start = new Date();
59276
59330
 
59277
- this.body.rotation.set(rotation.x, rotation.y, rotation.z);
59331
+ for (var index in this.lights) {
59332
+ var light = this.lights[index];
59333
+ light.update(dt);
59334
+ if (+new Date() - start > TIME_TO_UPDATE) break;
59278
59335
  }
59279
59336
  }
59280
59337
  }, {
59281
- key: "getWorldTransform",
59282
- value: function getWorldTransform() {
59283
- var position = this.getBody().getWorldPosition(new Vector3$1());
59284
- var quaternion = this.getBody().getWorldQuaternion(new Quaternion(0, 0, 0, 1));
59285
- var rotation = new Euler(0, 0, 0, 'XYZ').setFromQuaternion(quaternion, 'XYZ');
59338
+ key: "toJSON",
59339
+ value: function toJSON() {
59286
59340
  return {
59287
- position: position,
59288
- rotation: rotation,
59289
- quaternion: quaternion
59341
+ lights: this.lights.map(function (l) {
59342
+ return l.toJSON();
59343
+ })
59290
59344
  };
59291
59345
  }
59292
- }, {
59293
- key: "translate",
59294
- value: function translate(_ref7) {
59295
- var _ref7$x = _ref7.x,
59296
- x = _ref7$x === void 0 ? 0 : _ref7$x,
59297
- _ref7$y = _ref7.y,
59298
- y = _ref7$y === void 0 ? 0 : _ref7$y,
59299
- _ref7$z = _ref7.z,
59300
- z = _ref7$z === void 0 ? 0 : _ref7$z;
59346
+ }]);
59301
59347
 
59302
- if (this.hasBody()) {
59303
- this.body.translateX(x);
59304
- this.body.translateY(y);
59305
- this.body.translateZ(z);
59306
- }
59348
+ return Lights;
59349
+ }();
59350
+ var Lights$1 = new Lights();var ToonShader = {
59351
+ uniforms: {
59352
+ "uDirLightPos": {
59353
+ type: "v3",
59354
+ value: new Vector3$1()
59355
+ },
59356
+ "uDirLightColor": {
59357
+ type: "c",
59358
+ value: new Color$1(0xffffff)
59359
+ },
59360
+ "uMaterialColor": {
59361
+ type: "c",
59362
+ value: new Color$1(0xffffff)
59363
+ },
59364
+ uKd: {
59365
+ type: "f",
59366
+ value: 1
59367
+ },
59368
+ uBorder: {
59369
+ type: "f",
59370
+ value: 0.4
59307
59371
  }
59308
- }, {
59309
- key: "rotateTo",
59310
- value: function rotateTo() {
59311
- var _this6 = this;
59372
+ },
59373
+ vertexShader: ["varying vec3 vNormal;", "varying vec3 vViewPosition;", "void main() {", "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "vNormal = normalize( normalMatrix * normal );", "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", "vViewPosition = -mvPosition.xyz;", "}"].join("\n"),
59374
+ fragmentShader: ["uniform vec3 uMaterialColor;", "uniform vec3 uDirLightPos;", "uniform vec3 uDirLightColor;", "uniform float uKd;", "uniform float uBorder;", "varying vec3 vNormal;", "varying vec3 vViewPosition;", "void main() {", // compute direction to light
59375
+ "vec4 lDirection = viewMatrix * vec4( uDirLightPos, 0.0 );", "vec3 lVector = normalize( lDirection.xyz );", // diffuse: N * L. Normal must be normalized, since it's interpolated.
59376
+ "vec3 normal = normalize( vNormal );", //was: "float diffuse = max( dot( normal, lVector ), 0.0);",
59377
+ // solution
59378
+ "float diffuse = dot( normal, lVector );", "if ( diffuse > 0.6 ) { diffuse = 1.0; }", "else if ( diffuse > -0.2 ) { diffuse = 0.7; }", "else { diffuse = 0.3; }", "gl_FragColor = vec4( uKd * uMaterialColor * uDirLightColor * diffuse, 1.0 );", "}"].join("\n")
59379
+ };
59312
59380
 
59313
- var rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getRotation();
59314
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
59381
+ var ToonMaterial = /*#__PURE__*/function (_ShaderMaterial) {
59382
+ _inherits(ToonMaterial, _ShaderMaterial);
59315
59383
 
59316
- var _this$getRotation2 = this.getRotation(),
59317
- x = _this$getRotation2.x,
59318
- y = _this$getRotation2.y,
59319
- z = _this$getRotation2.z;
59384
+ var _super = _createSuper(ToonMaterial);
59320
59385
 
59321
- return new Promise(function (resolve) {
59322
- return new Between({
59323
- x: x,
59324
- y: y,
59325
- z: z
59326
- }, rotation).time(time).on('update', function (value) {
59327
- return _this6.setRotation(value);
59328
- }).on('complete', resolve);
59329
- });
59330
- }
59331
- }, {
59332
- key: "goTo",
59333
- value: function goTo() {
59334
- var _this7 = this;
59386
+ function ToonMaterial(_ref) {
59387
+ var _this;
59335
59388
 
59336
- var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getPosition();
59337
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
59389
+ var _ref$light = _ref.light,
59390
+ light = _ref$light === void 0 ? {} : _ref$light,
59391
+ color = _ref.color;
59338
59392
 
59339
- var _this$getPosition3 = this.getPosition(),
59340
- x = _this$getPosition3.x,
59341
- y = _this$getPosition3.y,
59342
- z = _this$getPosition3.z;
59393
+ _classCallCheck(this, ToonMaterial);
59343
59394
 
59344
- return new Promise(function (resolve) {
59345
- return new Between({
59346
- x: x,
59347
- y: y,
59348
- z: z
59349
- }, position).time(time).on('update', function (value) {
59350
- return _this7.setPosition(value);
59351
- }).on('complete', resolve);
59395
+ var uniforms = UniformsUtils.clone(ToonShader.uniforms);
59396
+ var vertexShader = ToonShader.vertexShader,
59397
+ fragmentShader = ToonShader.fragmentShader;
59398
+ _this = _super.call(this, {
59399
+ uniforms: uniforms,
59400
+ vertexShader: vertexShader,
59401
+ fragmentShader: fragmentShader,
59402
+ flatShading: true
59403
+ });
59404
+ var position = light.position,
59405
+ lightColor = light.color;
59406
+
59407
+ if (color) {
59408
+ var materialColor = new Color$1(color);
59409
+
59410
+ _this.uniforms.uMaterialColor.value.copy(materialColor);
59411
+ }
59412
+
59413
+ _this.uniforms.uDirLightPos.value = position;
59414
+
59415
+ _this.uniforms.uDirLightColor.value.copy(new Color$1(lightColor));
59416
+
59417
+ _this.side = DoubleSide;
59418
+ return _this;
59419
+ }
59420
+
59421
+ return ToonMaterial;
59422
+ }(ShaderMaterial);var setUpLightsAndShadows = function setUpLightsAndShadows(mesh) {
59423
+ var _Config$lights = Config$1.lights(),
59424
+ textureAnisotropy = _Config$lights.textureAnisotropy,
59425
+ shadows = _Config$lights.shadows;
59426
+
59427
+ mesh.castShadow = Boolean(shadows);
59428
+ mesh.receiveShadow = Boolean(shadows);
59429
+
59430
+ if (hasMaterial(mesh)) {
59431
+ var setUpMaterial = function setUpMaterial(material) {
59432
+ if (Lights$1.isUsingCSM()) {
59433
+ Lights$1.csm.setupMaterial(material);
59434
+ }
59435
+
59436
+ if (material.map) {
59437
+ material.map.anisotropy = textureAnisotropy;
59438
+ }
59439
+
59440
+ return material;
59441
+ };
59442
+
59443
+ mesh.material = processMaterial(mesh.material, setUpMaterial);
59444
+ }
59445
+ };
59446
+ var isScene = function isScene(mesh) {
59447
+ return mesh.isScene;
59448
+ };
59449
+
59450
+ var hasMaterial = function hasMaterial(mesh) {
59451
+ return Boolean(mesh.material);
59452
+ };
59453
+ var hasGeometry = function hasGeometry(mesh) {
59454
+ return Boolean(mesh.geometry);
59455
+ };
59456
+ var processMaterial = function processMaterial(material, callback) {
59457
+ return Array.isArray(material) ? material.map(callback) : callback(material);
59458
+ };
59459
+ var changeMaterialByName = function changeMaterialByName(name, mesh, materialOptions) {
59460
+ if (!hasMaterial(mesh)) return;
59461
+
59462
+ switch (name) {
59463
+ case MATERIALS.LAMBERT:
59464
+ return cloneMaterial(MeshLambertMaterial, mesh, materialOptions);
59465
+
59466
+ case MATERIALS.PHONG:
59467
+ return cloneMaterial(MeshPhongMaterial, mesh, materialOptions);
59468
+
59469
+ case MATERIALS.DEPTH:
59470
+ return cloneMaterial(MeshDepthMaterial, mesh, materialOptions);
59471
+
59472
+ case MATERIALS.STANDARD:
59473
+ return cloneMaterial(MeshStandardMaterial, mesh, materialOptions);
59474
+
59475
+ case MATERIALS.TOON:
59476
+ return cloneMaterial(ToonMaterial, mesh, materialOptions);
59477
+
59478
+ case MATERIALS.THREE_TOON:
59479
+ return cloneMaterial(MeshToonMaterial, mesh, materialOptions);
59480
+
59481
+ case MATERIALS.BASIC:
59482
+ default:
59483
+ return cloneMaterial(MeshBasicMaterial, mesh, materialOptions);
59484
+ }
59485
+ };
59486
+
59487
+ var cloneMaterial = function cloneMaterial(MeshMaterial, mesh) {
59488
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
59489
+
59490
+ var _cloneMaterial = function _cloneMaterial(material) {
59491
+ var clone = material.clone();
59492
+ var newMaterial = new MeshMaterial(_objectSpread2$1({
59493
+ map: clone.map,
59494
+ color: clone.color
59495
+ }, options));
59496
+ newMaterial.skinning = true;
59497
+ return newMaterial;
59498
+ };
59499
+
59500
+ mesh.material = processMaterial(mesh.material, _cloneMaterial);
59501
+ setUpLightsAndShadows(mesh);
59502
+ };
59503
+
59504
+ var disposeTextures = function disposeTextures(mesh) {
59505
+ if (hasMaterial(mesh)) {
59506
+ var _disposeTexture = function _disposeTexture(material) {
59507
+ Object.values(TEXTURES).forEach(function (key) {
59508
+ if (material[key]) {
59509
+ material[key].dispose();
59510
+ }
59511
+ });
59512
+ };
59513
+
59514
+ processMaterial(mesh.material, _disposeTexture);
59515
+ }
59516
+ };
59517
+ var disposeMaterial = function disposeMaterial(mesh) {
59518
+ if (hasMaterial(mesh)) {
59519
+ mesh.material.dispose && mesh.material.dispose();
59520
+ }
59521
+ };
59522
+ var disposeGeometry = function disposeGeometry(mesh) {
59523
+ if (hasGeometry(mesh)) {
59524
+ mesh.geometry.dispose && mesh.geometry.dispose();
59525
+ }
59526
+ };
59527
+ var prepareModel = function prepareModel(model) {
59528
+ setUpLightsAndShadows(model);
59529
+ model.traverse(function (mesh) {
59530
+ setUpLightsAndShadows(mesh);
59531
+ });
59532
+ return model;
59533
+ };var Entity = /*#__PURE__*/function (_EventDispatcher) {
59534
+ _inherits(Entity, _EventDispatcher);
59535
+
59536
+ var _super = _createSuper(Entity);
59537
+
59538
+ function Entity() {
59539
+ var _this;
59540
+
59541
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
59542
+ _ref$serializable = _ref.serializable,
59543
+ serializable = _ref$serializable === void 0 ? true : _ref$serializable,
59544
+ _ref$tag = _ref.tag,
59545
+ tag = _ref$tag === void 0 ? '' : _ref$tag,
59546
+ _ref$tags = _ref.tags,
59547
+ tags = _ref$tags === void 0 ? [] : _ref$tags;
59548
+
59549
+ _classCallCheck(this, Entity);
59550
+
59551
+ _this = _super.call(this);
59552
+
59553
+ _defineProperty$1(_assertThisInitialized(_this), "getBodyByName", function (name) {
59554
+ if (name && _this.hasBody()) {
59555
+ return _this.getBody().getObjectByName(name);
59556
+ }
59557
+
59558
+ console.warn(ELEMENT_NAME_NOT_PROVIDED);
59559
+ });
59560
+
59561
+ _defineProperty$1(_assertThisInitialized(_this), "addTag", function (tagName) {
59562
+ if (!tagName) return;
59563
+
59564
+ if (!_this.hasTag(tagName)) {
59565
+ _this.tags.push(tagName);
59566
+
59567
+ return true;
59568
+ } else {
59569
+ console.log(TAG_ALREADY_EXISTS, tagName);
59570
+ return false;
59571
+ }
59572
+ });
59573
+
59574
+ _defineProperty$1(_assertThisInitialized(_this), "hasStateMachine", function () {
59575
+ return !!_this.stateMachine;
59576
+ });
59577
+
59578
+ _defineProperty$1(_assertThisInitialized(_this), "hasScripts", function () {
59579
+ return _this.scripts.length > 0;
59580
+ });
59581
+
59582
+ _defineProperty$1(_assertThisInitialized(_this), "parseScripts", function (list, options, enabled) {
59583
+ return list.map(function (script, i) {
59584
+ return {
59585
+ script: script,
59586
+ name: script.getName(),
59587
+ enabled: enabled,
59588
+ options: options[i]
59589
+ };
59352
59590
  });
59591
+ });
59592
+
59593
+ _defineProperty$1(_assertThisInitialized(_this), "isMesh", function () {
59594
+ return _this.getEntityType() === ENTITY_TYPES.MESH;
59595
+ });
59596
+
59597
+ _defineProperty$1(_assertThisInitialized(_this), "isModel", function () {
59598
+ return _this.getEntityType() === ENTITY_TYPES.MODEL;
59599
+ });
59600
+
59601
+ _defineProperty$1(_assertThisInitialized(_this), "isSprite", function () {
59602
+ return _this.getEntityType() === ENTITY_TYPES.SPRITE;
59603
+ });
59604
+
59605
+ _defineProperty$1(_assertThisInitialized(_this), "isLight", function () {
59606
+ return Object.values(ENTITY_TYPES.LIGHT).includes(_this.getEntityType());
59607
+ });
59608
+
59609
+ _defineProperty$1(_assertThisInitialized(_this), "isHelper", function () {
59610
+ return Object.values(ENTITY_TYPES.HELPER).includes(_this.getEntityType());
59611
+ });
59612
+
59613
+ _defineProperty$1(_assertThisInitialized(_this), "isEffect", function () {
59614
+ return Object.values(ENTITY_TYPES.EFFECT).includes(_this.getEntityType());
59615
+ });
59616
+
59617
+ _defineProperty$1(_assertThisInitialized(_this), "setQuaternion", function (_ref2) {
59618
+ var x = _ref2.x,
59619
+ y = _ref2.y,
59620
+ z = _ref2.z,
59621
+ w = _ref2.w;
59622
+
59623
+ _this.body.quaternion.set(x, y, z, w);
59624
+ });
59625
+
59626
+ _defineProperty$1(_assertThisInitialized(_this), "setUuid", function (uuid) {
59627
+ if (uuid) {
59628
+ _this.body.uuid = uuid;
59629
+ }
59630
+ });
59631
+
59632
+ _this.scripts = [];
59633
+ _this.tags = [];
59634
+ _this.children = [];
59635
+ _this.isMage = true;
59636
+ _this.parent = false;
59637
+ _this.disposed = false;
59638
+
59639
+ _this.addTags([DEFAULT_TAG, tag].concat(_toConsumableArray(tags)));
59640
+
59641
+ _this.serializable = serializable;
59642
+ return _this;
59643
+ }
59644
+
59645
+ _createClass(Entity, [{
59646
+ key: "isSerializable",
59647
+ value: function isSerializable() {
59648
+ return !!this.serializable;
59353
59649
  }
59354
59650
  }, {
59355
- key: "uuid",
59356
- value: function uuid() {
59357
- return this.body.uuid;
59651
+ key: "isDisposed",
59652
+ value: function isDisposed() {
59653
+ return this.disposed;
59358
59654
  }
59359
59655
  }, {
59360
- key: "setId",
59361
- value: function setId() {
59362
- return this.body.id;
59656
+ key: "reset",
59657
+ value: function reset() {
59658
+ this.scripts = [];
59659
+ this.children = [];
59660
+ this.isMage = true;
59661
+ this.parent = false;
59662
+ this.tags = [DEFAULT_TAG];
59363
59663
  }
59364
59664
  }, {
59365
- key: "id",
59366
- value: function id() {
59367
- return this.body.id;
59665
+ key: "hasBody",
59666
+ value: function hasBody() {
59667
+ return !!this.body;
59368
59668
  }
59369
59669
  }, {
59370
- key: "setVisible",
59371
- value: function setVisible() {
59372
- var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
59373
- this.getBody().visible = flag;
59670
+ key: "getBody",
59671
+ value: function getBody() {
59672
+ return this.body;
59374
59673
  }
59375
59674
  }, {
59376
- key: "equals",
59377
- value: function equals(entity) {
59378
- try {
59379
- return entity.uuid ? this.uuid() === entity.uuid() : false;
59380
- } catch (e) {
59381
- return false;
59382
- }
59675
+ key: "setBody",
59676
+ value: function setBody(body) {
59677
+ this.body = body;
59383
59678
  }
59384
59679
  }, {
59385
- key: "setName",
59386
- value: function setName(name) {
59387
- this.name = name;
59680
+ key: "hasParent",
59681
+ value: function hasParent() {
59682
+ return !!this.parent;
59388
59683
  }
59389
59684
  }, {
59390
- key: "getName",
59391
- value: function getName() {
59392
- return this.name;
59685
+ key: "getParent",
59686
+ value: function getParent() {
59687
+ return this.parent;
59393
59688
  }
59394
59689
  }, {
59395
- key: "setData",
59396
- value: function setData(key, value) {
59397
- if (this.getBody().userData) {
59398
- if (key && value) {
59399
- this.getBody().userData[key] = value;
59690
+ key: "setParent",
59691
+ value: function setParent(parent) {
59692
+ this.parent = parent;
59693
+ }
59694
+ }, {
59695
+ key: "add",
59696
+ value: function add(child) {
59697
+ var _this2 = this;
59698
+
59699
+ var container = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.getBody();
59700
+
59701
+ if (this.hasBody()) {
59702
+ var _add = function _add(toAdd) {
59703
+ if (toAdd instanceof Entity) {
59704
+ _this2.children.push(toAdd);
59705
+
59706
+ toAdd.setParent(_this2);
59707
+ container.add(toAdd.getBody());
59708
+ } else {
59709
+ console.log(ENTITY_CANT_ADD_NOT_ENTITY);
59710
+ }
59711
+ };
59712
+
59713
+ if (Array.isArray(child)) {
59714
+ child.forEach(_add);
59400
59715
  } else {
59401
- console.log(KEY_VALUE_IS_MISSING);
59716
+ _add(child);
59402
59717
  }
59403
59718
  } else {
59404
- console.log(USER_DATA_IS_MISSING);
59719
+ console.log(ENTITY_NOT_SET);
59405
59720
  }
59406
59721
  }
59407
59722
  }, {
59408
- key: "getData",
59409
- value: function getData(key) {
59410
- if (this.getBody().userData) {
59411
- if (key) {
59412
- return this.getBody().userData[key];
59723
+ key: "isParentOf",
59724
+ value: function isParentOf(child) {
59725
+ var comparator = function comparator(child) {
59726
+ return !!child.getBody().getObjectById(child.id);
59727
+ };
59728
+
59729
+ if (child.isMage) {
59730
+ comparator = function comparator(child) {
59731
+ return child.getBody().getObjectById(child.id());
59732
+ };
59733
+ }
59734
+
59735
+ return this.children.filter(comparator).length > 0;
59736
+ }
59737
+ }, {
59738
+ key: "has",
59739
+ value: function has(child) {
59740
+ if (child.isMage) {
59741
+ return this.equals(child) || this.isParentOf(child);
59742
+ } else {
59743
+ return !!this.getBody().getObjectById(child.id);
59744
+ }
59745
+ }
59746
+ }, {
59747
+ key: "remove",
59748
+ value: function remove(element) {
59749
+ if (this.hasBody() && this.has(element)) {
59750
+ if (element.isMage) {
59751
+ this.body.remove(element.getBody());
59752
+ var index = this.children.findIndex(function (m) {
59753
+ return m.equals(element);
59754
+ });
59755
+ if (index) this.children.splice(index, 1);
59413
59756
  } else {
59414
- console.log(KEY_IS_MISSING);
59757
+ this.body.remove(element.getBody());
59415
59758
  }
59416
- } else {
59417
- console.log(USER_DATA_IS_MISSING);
59418
59759
  }
59419
59760
  }
59420
59761
  }, {
59421
- key: "mapScriptsToJSON",
59422
- value: function mapScriptsToJSON() {
59423
- this.scripts.reduce(function (acc, _ref8) {
59424
- var name = _ref8.name,
59425
- _ref8$options = _ref8.options,
59426
- options = _ref8$options === void 0 ? {} : _ref8$options;
59427
- acc.names.push(name);
59428
- acc.options.push(options);
59429
- return acc;
59430
- }, {
59431
- names: [],
59432
- options: []
59433
- });
59762
+ key: "addTo",
59763
+ value: function addTo(target, childName) {
59764
+ if (target && target.isMage) {
59765
+ if (childName) {
59766
+ target.add(this, target.getBodyByName(childName));
59767
+ } else {
59768
+ target.add(this);
59769
+ }
59770
+ }
59434
59771
  }
59435
59772
  }, {
59436
- key: "toJSON",
59437
- value: function toJSON() {
59773
+ key: "hasChildren",
59774
+ value: function hasChildren() {
59775
+ return this.children.length > 0;
59776
+ }
59777
+ }, {
59778
+ key: "getHierarchy",
59779
+ value: function getHierarchy() {
59438
59780
  return {
59439
- position: this.getPosition(),
59440
- rotation: this.getRotation(),
59441
- scale: this.getScale(),
59442
- entityType: this.getEntityType(),
59443
- tags: this.getTags()
59781
+ element: this,
59782
+ children: this.children.map(function (e) {
59783
+ return e.getHierarchy();
59784
+ })
59444
59785
  };
59445
59786
  }
59446
- }]);
59447
-
59448
- return Entity;
59449
- }(EventDispatcher);var AnimationHandler = /*#__PURE__*/function (_EventDispatcher) {
59450
- _inherits(AnimationHandler, _EventDispatcher);
59451
-
59452
- var _super = _createSuper(AnimationHandler);
59453
-
59454
- function AnimationHandler(mesh) {
59455
- var _this;
59456
-
59457
- var animations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
59458
-
59459
- _classCallCheck(this, AnimationHandler);
59460
-
59461
- _this = _super.call(this);
59462
-
59463
- _defineProperty$1(_assertThisInitialized(_this), "getAnimationEventHandler", function (type) {
59464
- return function (_ref) {
59465
- var action = _ref.action,
59466
- direction = _ref.direction;
59467
-
59468
- _this.dispatchEvent({
59469
- type: type,
59470
- action: action,
59471
- direction: direction
59472
- });
59473
- };
59474
- });
59475
-
59476
- _this.mixer = new AnimationMixer(mesh);
59477
- _this.animations = animations;
59478
- _this.isPlayingAnimation = false;
59479
-
59480
- _this.addEventsListeners();
59481
-
59482
- return _this;
59483
- }
59484
-
59485
- _createClass(AnimationHandler, [{
59486
- key: "addEventsListeners",
59487
- value: function addEventsListeners() {
59488
- this.mixer.addEventListener('loop', this.getAnimationEventHandler(ENTITY_EVENTS.ANIMATION.LOOP));
59489
- this.mixer.addEventListener('finished', this.getAnimationEventHandler(ENTITY_EVENTS.ANIMATION.FINISHED));
59787
+ }, {
59788
+ key: "addTags",
59789
+ value: function addTags() {
59790
+ var tags = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
59791
+ tags.forEach(this.addTag);
59490
59792
  }
59491
59793
  }, {
59492
- key: "getAction",
59493
- value: function getAction(id) {
59494
- var action;
59495
-
59496
- if (typeof id === 'number') {
59497
- action = this.animations[id];
59498
- } else if (typeof id === 'string') {
59499
- action = AnimationClip.findByName(this.animations, id);
59794
+ key: "removeTag",
59795
+ value: function removeTag(tagName) {
59796
+ if (tagName === DEFAULT_TAG) {
59797
+ console.log(TAG_CANT_BE_REMOVED);
59798
+ return;
59500
59799
  }
59501
59800
 
59502
- return action;
59801
+ if (this.hasTag(tagName)) {
59802
+ this.tags.splice(this.tags.indexOf(tagName), 1);
59803
+ } else {
59804
+ console.log(TAG_NOT_EXISTING_REMOVAL);
59805
+ }
59503
59806
  }
59504
59807
  }, {
59505
- key: "getAvailableAnimations",
59506
- value: function getAvailableAnimations() {
59507
- return this.animations.map(function (_ref2) {
59508
- var name = _ref2.name;
59509
- return name;
59510
- });
59808
+ key: "removeAllTags",
59809
+ value: function removeAllTags() {
59810
+ this.tags = [DEFAULT_TAG];
59511
59811
  }
59512
59812
  }, {
59513
- key: "stopAll",
59514
- value: function stopAll() {
59515
- this.mixer.stopAllAction();
59516
- this.isPlayingAnimation = false;
59813
+ key: "hasTag",
59814
+ value: function hasTag(tagName) {
59815
+ return this.tags.includes(tagName);
59517
59816
  }
59518
59817
  }, {
59519
- key: "stopCurrentAnimation",
59520
- value: function stopCurrentAnimation() {
59521
- if (this.currentAction) {
59522
- this.currentAction.stop();
59523
- }
59524
-
59525
- this.isPlayingAnimation = false;
59818
+ key: "getTags",
59819
+ value: function getTags() {
59820
+ return this.tags;
59526
59821
  }
59527
59822
  }, {
59528
- key: "playAnimation",
59529
- value: function playAnimation(id, options) {
59530
- var action = this.getAction(id);
59531
- var _options$loop = options.loop,
59532
- loop = _options$loop === void 0 ? LoopRepeat : _options$loop;
59533
- this.isPlayingAnimation = true;
59823
+ key: "disposeScripts",
59824
+ value: function disposeScripts() {
59825
+ if (this.hasScripts()) {
59826
+ var length = this.scripts.length;
59534
59827
 
59535
- if (this.currentAction) {
59536
- this.fadeToAnimation(action, options);
59537
- } else if (action) {
59538
- this.currentAction = this.mixer.clipAction(action).setLoop(loop).play();
59539
- } else {
59540
- console.warn(ANIMATION_NOT_FOUND);
59828
+ for (var i = 0; i < length; i++) {
59829
+ var _this$scripts$i = this.scripts[i],
59830
+ script = _this$scripts$i.script,
59831
+ enabled = _this$scripts$i.enabled;
59832
+
59833
+ if (enabled) {
59834
+ script.onDispose();
59835
+
59836
+ script.__setStartedFlag(false);
59837
+ }
59838
+
59839
+ delete this.scripts[i];
59840
+ }
59541
59841
  }
59542
59842
  }
59543
59843
  }, {
59544
- key: "fadeToAnimation",
59545
- value: function fadeToAnimation(action) {
59546
- var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
59547
- _ref3$duration = _ref3.duration,
59548
- duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration,
59549
- _ref3$loop = _ref3.loop,
59550
- loop = _ref3$loop === void 0 ? LoopRepeat : _ref3$loop;
59844
+ key: "start",
59845
+ value: function start() {
59846
+ var _this3 = this;
59551
59847
 
59552
- var previousAction = this.currentAction;
59553
- this.currentAction = this.mixer.clipAction(action);
59848
+ if (this.hasScripts()) {
59849
+ this.scripts.forEach(function (_ref3) {
59850
+ var script = _ref3.script,
59851
+ enabled = _ref3.enabled,
59852
+ options = _ref3.options;
59554
59853
 
59555
- if (previousAction !== this.currentAction) {
59556
- previousAction.fadeOut(duration);
59557
- }
59854
+ if (enabled) {
59855
+ script.start(_this3, options);
59558
59856
 
59559
- this.currentAction.reset().setEffectiveTimeScale(1).setEffectiveWeight(1).fadeIn(duration).setLoop(loop).play();
59857
+ script.__setStartedFlag(true);
59858
+ }
59859
+ });
59860
+ }
59560
59861
  }
59561
59862
  }, {
59562
59863
  key: "update",
59563
59864
  value: function update(dt) {
59564
- this.mixer.update(dt);
59565
- }
59566
- }]);
59865
+ if (this.hasScripts()) {
59866
+ this.scripts.forEach(function (_ref4) {
59867
+ var script = _ref4.script,
59868
+ enabled = _ref4.enabled;
59567
59869
 
59568
- return AnimationHandler;
59569
- }(EventDispatcher);var inverseProjectionMatrix = new Matrix4();
59870
+ if (script && enabled) {
59871
+ script.update(dt);
59872
+ }
59873
+ });
59874
+ }
59875
+ }
59876
+ }, {
59877
+ key: "onPhysicsUpdate",
59878
+ value: function onPhysicsUpdate(dt) {
59879
+ if (this.hasScripts()) {
59880
+ this.scripts.forEach(function (_ref5) {
59881
+ var script = _ref5.script,
59882
+ enabled = _ref5.enabled;
59570
59883
 
59571
- var Frustum = /*#__PURE__*/function () {
59572
- function Frustum(data) {
59573
- _classCallCheck(this, Frustum);
59574
-
59575
- data = data || {};
59576
- this.vertices = {
59577
- near: [new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1()],
59578
- far: [new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1()]
59579
- };
59580
-
59581
- if (data.projectionMatrix !== undefined) {
59582
- this.setFromProjectionMatrix(data.projectionMatrix, data.maxFar || 10000);
59884
+ if (script && enabled) {
59885
+ script.physicsUpdate(dt);
59886
+ }
59887
+ });
59888
+ }
59583
59889
  }
59584
- }
59585
-
59586
- _createClass(Frustum, [{
59587
- key: "setFromProjectionMatrix",
59588
- value: function setFromProjectionMatrix(projectionMatrix, maxFar) {
59589
- var isOrthographic = projectionMatrix.elements[2 * 4 + 3] === 0;
59590
- inverseProjectionMatrix.copy(projectionMatrix).invert(); // 3 --- 0 vertices.near/far order
59591
- // | |
59592
- // 2 --- 1
59593
- // clip space spans from [-1, 1]
59594
-
59595
- this.vertices.near[0].set(1, 1, -1);
59596
- this.vertices.near[1].set(1, -1, -1);
59597
- this.vertices.near[2].set(-1, -1, -1);
59598
- this.vertices.near[3].set(-1, 1, -1);
59599
- this.vertices.near.forEach(function (v) {
59600
- v.applyMatrix4(inverseProjectionMatrix);
59601
- });
59602
- this.vertices.far[0].set(1, 1, 1);
59603
- this.vertices.far[1].set(1, -1, 1);
59604
- this.vertices.far[2].set(-1, -1, 1);
59605
- this.vertices.far[3].set(-1, 1, 1);
59606
- this.vertices.far.forEach(function (v) {
59607
- v.applyMatrix4(inverseProjectionMatrix);
59608
- var absZ = Math.abs(v.z);
59890
+ }, {
59891
+ key: "disposeBody",
59892
+ value: function disposeBody() {
59893
+ this.getBody().clear();
59609
59894
 
59610
- if (isOrthographic) {
59611
- v.z *= Math.min(maxFar / absZ, 1.0);
59612
- } else {
59613
- v.multiplyScalar(Math.min(maxFar / absZ, 1.0));
59614
- }
59615
- });
59616
- return this.vertices;
59895
+ if (this.getBody().dispose && !isScene(this.getBody())) {
59896
+ this.getBody().dispose();
59897
+ }
59617
59898
  }
59618
59899
  }, {
59619
- key: "split",
59620
- value: function split(breaks, target) {
59621
- while (breaks.length > target.length) {
59622
- target.push(new Frustum());
59900
+ key: "dispose",
59901
+ value: function dispose() {
59902
+ if (this.hasChildren()) {
59903
+ this.children.forEach(function (child) {
59904
+ child.dispose();
59905
+ });
59623
59906
  }
59624
59907
 
59625
- target.length = breaks.length;
59908
+ if (this.hasBody()) {
59909
+ this.stopStateMachine();
59910
+ this.disposeScripts();
59911
+ Scene$1.remove(this.getBody());
59912
+ this.disposeBody();
59913
+ }
59626
59914
 
59627
- for (var i = 0; i < breaks.length; i++) {
59628
- var cascade = target[i];
59915
+ this.dispatchEvent({
59916
+ type: ENTITY_EVENTS.DISPOSE
59917
+ });
59918
+ this.reset();
59919
+ }
59920
+ }, {
59921
+ key: "addStateMachine",
59922
+ value: function addStateMachine(description) {
59923
+ var _this4 = this;
59629
59924
 
59630
- if (i === 0) {
59631
- for (var j = 0; j < 4; j++) {
59632
- cascade.vertices.near[j].copy(this.vertices.near[j]);
59633
- }
59634
- } else {
59635
- for (var _j = 0; _j < 4; _j++) {
59636
- cascade.vertices.near[_j].lerpVectors(this.vertices.near[_j], this.vertices.far[_j], breaks[i - 1]);
59637
- }
59638
- }
59925
+ this.stateMachine = interpret(createMachine(description)).onTransition(function (state) {
59926
+ _this4.dispatchEvent({
59927
+ type: ENTITY_EVENTS.STATE_MACHINE.CHANGE,
59928
+ state: state
59929
+ });
59930
+ });
59639
59931
 
59640
- if (i === breaks - 1) {
59641
- for (var _j2 = 0; _j2 < 4; _j2++) {
59642
- cascade.vertices.far[_j2].copy(this.vertices.far[_j2]);
59643
- }
59644
- } else {
59645
- for (var _j3 = 0; _j3 < 4; _j3++) {
59646
- cascade.vertices.far[_j3].lerpVectors(this.vertices.near[_j3], this.vertices.far[_j3], breaks[i]);
59647
- }
59648
- }
59932
+ if (description.autostart) {
59933
+ this.startStateMachine();
59649
59934
  }
59650
59935
  }
59651
59936
  }, {
59652
- key: "toSpace",
59653
- value: function toSpace(cameraMatrix, target) {
59654
- for (var i = 0; i < 4; i++) {
59655
- target.vertices.near[i].copy(this.vertices.near[i]).applyMatrix4(cameraMatrix);
59656
- target.vertices.far[i].copy(this.vertices.far[i]).applyMatrix4(cameraMatrix);
59937
+ key: "startStateMachine",
59938
+ value: function startStateMachine() {
59939
+ if (this.hasStateMachine()) {
59940
+ this.stateMachine.start();
59941
+ } else {
59942
+ console.log(STATE_MACHINE_NOT_AVAILABLE);
59657
59943
  }
59658
59944
  }
59659
- }]);
59660
-
59661
- return Frustum;
59662
- }();var Shader$1 = {
59663
- lights_fragment_begin:
59664
- /* glsl */
59665
- "\nGeometricContext geometry;\n\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n#ifdef CLEARCOAT\n\n geometry.clearcoatNormal = clearcoatNormal;\n\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n pointLight = pointLights[ i ];\n\n getPointDirectLightIrradiance( pointLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n SpotLight spotLight;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n spotLight = spotLights[ i ];\n\n getSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0) && defined( RE_Direct ) && defined( USE_CSM ) && defined( CSM_CASCADES )\n\n DirectionalLight directionalLight;\n float linearDepth = (vViewPosition.z) / (shadowFar - cameraNear);\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n #if defined( USE_SHADOWMAP ) && defined( CSM_FADE )\n vec2 cascade;\n float cascadeCenter;\n float closestEdge;\n float margin;\n float csmx;\n float csmy;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n // NOTE: Depth gets larger away from the camera.\n // cascade.x is closer, cascade.y is further\n cascade = CSM_cascades[ i ];\n cascadeCenter = ( cascade.x + cascade.y ) / 2.0;\n closestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;\n margin = 0.25 * pow( closestEdge, 2.0 );\n csmx = cascade.x - margin / 2.0;\n csmy = cascade.y + margin / 2.0;\n if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS && linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {\n\n float dist = min( linearDepth - csmx, csmy - linearDepth );\n float ratio = clamp( dist / margin, 0.0, 1.0 );\n if( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS ) {\n\n vec3 prevColor = directLight.color;\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n bool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;\n directLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );\n\n }\n\n ReflectedLight prevLight = reflectedLight;\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n bool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;\n float blendRatio = shouldBlend ? ratio : 1.0;\n\n reflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );\n reflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, blendRatio );\n reflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, blendRatio );\n reflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, blendRatio );\n\n }\n\n }\n #pragma unroll_loop_end\n #else\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\n directionalLightShadow = directionalLightShadows[ i ];\n if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n #endif\n\n if(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n #endif\n\n#endif\n\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && !defined( USE_CSM ) && !defined( CSM_CASCADES )\n\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n\n getDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n\n RE_Direct( directLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n RectAreaLight rectAreaLight;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n rectAreaLight = rectAreaLights[ i ];\n RE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\n }\n #pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n vec3 iblIrradiance = vec3( 0.0 );\n\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n irradiance += getLightProbeIrradiance( lightProbe, geometry );\n\n #if ( NUM_HEMI_LIGHTS > 0 )\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n irradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\n }\n #pragma unroll_loop_end\n\n #endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n",
59666
- lights_pars_begin:
59667
- /* glsl */
59668
- "\n#if defined( USE_CSM ) && defined( CSM_CASCADES )\nuniform vec2 CSM_cascades[CSM_CASCADES];\nuniform float cameraNear;\nuniform float shadowFar;\n#endif\n " + ShaderChunk.lights_pars_begin
59669
- };var _cameraToLightMatrix = new Matrix4();
59670
-
59671
- var _lightSpaceFrustum = new Frustum();
59672
-
59673
- var _center = new Vector3$1();
59674
-
59675
- var _bbox = new Box3();
59676
-
59677
- var _uniformArray = [];
59678
- var _logArray = [];
59679
- var DEFAULT_MAX_FAR = 100000;
59680
- var DEFAULT_MODE = 'practical';
59681
- var DEFAULT_SHADOWMAP_SIZE = 2048;
59682
- var DEFAULT_CASCADE = 3;
59683
- var DEFAULT_BIAS$3 = 0.000001;
59684
- var DEFAULT_INTENSITY$5 = 1;
59685
- var DEFAULT_NEAR$3 = 1;
59686
- var DEFAULT_FAR$3 = 2000;
59687
- var DEFAULT_MARGIN = 200;
59688
- var CascadeShadowMaps = /*#__PURE__*/function () {
59689
- function CascadeShadowMaps(_ref) {
59690
- var _ref$camera = _ref.camera,
59691
- camera = _ref$camera === void 0 ? Scene$1.getCameraBody() : _ref$camera,
59692
- _ref$parent = _ref.parent,
59693
- parent = _ref$parent === void 0 ? Scene$1.getScene() : _ref$parent,
59694
- _ref$cascades = _ref.cascades,
59695
- cascades = _ref$cascades === void 0 ? DEFAULT_CASCADE : _ref$cascades,
59696
- _ref$maxFar = _ref.maxFar,
59697
- maxFar = _ref$maxFar === void 0 ? DEFAULT_MAX_FAR : _ref$maxFar,
59698
- _ref$mode = _ref.mode,
59699
- mode = _ref$mode === void 0 ? DEFAULT_MODE : _ref$mode,
59700
- _ref$shadowMapSize = _ref.shadowMapSize,
59701
- shadowMapSize = _ref$shadowMapSize === void 0 ? DEFAULT_SHADOWMAP_SIZE : _ref$shadowMapSize,
59702
- _ref$shadowBias = _ref.shadowBias,
59703
- shadowBias = _ref$shadowBias === void 0 ? DEFAULT_BIAS$3 : _ref$shadowBias,
59704
- _ref$lightDirection = _ref.lightDirection,
59705
- lightDirection = _ref$lightDirection === void 0 ? new Vector3$1(1, -1, 1).normalize() : _ref$lightDirection,
59706
- _ref$lightIntensity = _ref.lightIntensity,
59707
- lightIntensity = _ref$lightIntensity === void 0 ? DEFAULT_INTENSITY$5 : _ref$lightIntensity,
59708
- _ref$lightNear = _ref.lightNear,
59709
- lightNear = _ref$lightNear === void 0 ? DEFAULT_NEAR$3 : _ref$lightNear,
59710
- _ref$lightFar = _ref.lightFar,
59711
- lightFar = _ref$lightFar === void 0 ? DEFAULT_FAR$3 : _ref$lightFar,
59712
- _ref$lightMargin = _ref.lightMargin,
59713
- lightMargin = _ref$lightMargin === void 0 ? DEFAULT_MARGIN : _ref$lightMargin,
59714
- customSplitsCallback = _ref.customSplitsCallback;
59715
-
59716
- _classCallCheck(this, CascadeShadowMaps);
59717
-
59718
- this.camera = camera;
59719
- this.parent = parent;
59720
- this.cascades = cascades;
59721
- this.maxFar = maxFar;
59722
- this.mode = mode;
59723
- this.shadowMapSize = shadowMapSize;
59724
- this.shadowBias = shadowBias;
59725
- this.lightDirection = lightDirection;
59726
- this.lightIntensity = lightIntensity;
59727
- this.lightNear = lightNear;
59728
- this.lightFar = lightFar;
59729
- this.lightMargin = lightMargin;
59730
- this.customSplitsCallback = customSplitsCallback;
59731
- this.fade = false;
59732
- this.mainFrustum = new Frustum();
59733
- this.frustums = [];
59734
- this.breaks = [];
59735
- this.lights = [];
59736
- this.shaders = new Map();
59737
- this.createLights();
59738
- this.updateFrustums();
59739
- this.injectInclude();
59740
- }
59741
-
59742
- _createClass(CascadeShadowMaps, [{
59743
- key: "createLights",
59744
- value: function createLights() {
59745
- for (var i = 0; i < this.cascades; i++) {
59746
- var light = new DirectionalLight(0xffffff, this.lightIntensity);
59747
- light.castShadow = true;
59748
- light.shadow.mapSize.width = this.shadowMapSize;
59749
- light.shadow.mapSize.height = this.shadowMapSize;
59750
- light.shadow.camera.near = this.lightNear;
59751
- light.shadow.camera.far = this.lightFar;
59752
- light.shadow.bias = this.shadowBias;
59753
- this.parent.add(light);
59754
- this.parent.add(light.target);
59755
- this.lights.push(light);
59945
+ }, {
59946
+ key: "stopStateMachine",
59947
+ value: function stopStateMachine() {
59948
+ if (this.hasStateMachine()) {
59949
+ this.stateMachine.stop();
59756
59950
  }
59757
59951
  }
59758
59952
  }, {
59759
- key: "initCascades",
59760
- value: function initCascades() {
59761
- var camera = this.camera;
59762
- camera.updateProjectionMatrix();
59763
- this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar);
59764
- this.mainFrustum.split(this.breaks, this.frustums);
59953
+ key: "changeState",
59954
+ value: function changeState(event) {
59955
+ if (this.hasStateMachine()) {
59956
+ this.stateMachine.send(event);
59957
+ } else {
59958
+ console.log(STATE_MACHINE_NOT_AVAILABLE);
59959
+ }
59765
59960
  }
59766
59961
  }, {
59767
- key: "updateShadowBounds",
59768
- value: function updateShadowBounds() {
59769
- var frustums = this.frustums;
59962
+ key: "getScript",
59963
+ value: function getScript(name) {
59964
+ var script = this.scripts.filter(function (script) {
59965
+ return script.name === name;
59966
+ })[0].script;
59770
59967
 
59771
- for (var i = 0; i < frustums.length; i++) {
59772
- var light = this.lights[i];
59773
- var shadowCam = light.shadow.camera;
59774
- var frustum = this.frustums[i]; // Get the two points that represent that furthest points on the frustum assuming
59775
- // that's either the diagonal across the far plane or the diagonal across the whole
59776
- // frustum itself.
59968
+ if (script) {
59969
+ return script;
59970
+ } else {
59971
+ console.warn(SCRIPT_NOT_FOUND);
59972
+ }
59973
+ }
59974
+ }, {
59975
+ key: "addScripts",
59976
+ value: function addScripts() {
59977
+ var _this5 = this;
59777
59978
 
59778
- var nearVerts = frustum.vertices.near;
59779
- var farVerts = frustum.vertices.far;
59780
- var point1 = farVerts[0];
59781
- var point2 = void 0;
59979
+ var scripts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
59980
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
59981
+ var enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
59982
+ var parsedScripts = this.parseScripts(scripts, options, enabled);
59983
+ this.scripts = [].concat(_toConsumableArray(this.scripts), [parsedScripts]);
59782
59984
 
59783
- if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {
59784
- point2 = farVerts[2];
59785
- } else {
59786
- point2 = nearVerts[2];
59787
- }
59985
+ if (enabled) {
59986
+ parsedScripts.forEach(function (parsed) {
59987
+ return parsed.start(_this5, parsed.options);
59988
+ });
59989
+ }
59990
+ }
59991
+ }, {
59992
+ key: "addScript",
59993
+ value: function addScript(name) {
59994
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
59995
+ var script = Scripts$1.get(name);
59996
+ var _options$enabled = options.enabled,
59997
+ enabled = _options$enabled === void 0 ? true : _options$enabled;
59788
59998
 
59789
- var squaredBBWidth = point1.distanceTo(point2);
59999
+ if (script) {
60000
+ this.scripts.push({
60001
+ script: script,
60002
+ name: name,
60003
+ enabled: enabled,
60004
+ options: options
60005
+ });
59790
60006
 
59791
- if (this.fade) {
59792
- // expand the shadow extents by the fade margin if fade is enabled.
59793
- var camera = this.camera;
59794
- var far = Math.max(camera.far, this.maxFar);
59795
- var linearDepth = frustum.vertices.far[0].z / (far - camera.near);
59796
- var margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near);
59797
- squaredBBWidth += margin;
60007
+ if (enabled) {
60008
+ script.start(this, options);
59798
60009
  }
60010
+ } else {
60011
+ console.log(SCRIPT_NOT_FOUND);
60012
+ }
59799
60013
 
59800
- shadowCam.left = -squaredBBWidth / 2;
59801
- shadowCam.right = squaredBBWidth / 2;
59802
- shadowCam.top = squaredBBWidth / 2;
59803
- shadowCam.bottom = -squaredBBWidth / 2;
59804
- shadowCam.updateProjectionMatrix();
60014
+ return script;
60015
+ }
60016
+ }, {
60017
+ key: "enableScripts",
60018
+ value: function enableScripts() {
60019
+ this.scriptsEnabled = true;
60020
+ }
60021
+ }, {
60022
+ key: "disableScripts",
60023
+ value: function disableScripts() {
60024
+ this.scriptsEnabled = false;
60025
+ }
60026
+ }, {
60027
+ key: "setEntityType",
60028
+ value: function setEntityType(type) {
60029
+ if (FLAT_ENTITY_TYPES.includes(type)) {
60030
+ this.entityType = type;
60031
+ } else {
60032
+ console.log(ENTITY_TYPE_NOT_ALLOWED);
60033
+ this.entityType = ENTITY_TYPES.UNKNOWN;
59805
60034
  }
59806
60035
  }
59807
60036
  }, {
59808
- key: "getBreaks",
59809
- value: function getBreaks() {
59810
- var camera = this.camera;
59811
- var far = Math.min(camera.far, this.maxFar);
59812
- this.breaks.length = 0;
59813
-
59814
- switch (this.mode) {
59815
- case 'uniform':
59816
- uniformSplit(this.cascades, camera.near, far, this.breaks);
59817
- break;
59818
-
59819
- case 'logarithmic':
59820
- logarithmicSplit(this.cascades, camera.near, far, this.breaks);
59821
- break;
59822
-
59823
- case 'practical':
59824
- practicalSplit(this.cascades, camera.near, far, 0.5, this.breaks);
59825
- break;
60037
+ key: "getEntityType",
60038
+ value: function getEntityType() {
60039
+ return this.entityType;
60040
+ }
60041
+ }, {
60042
+ key: "addLight",
60043
+ // TODO: sounds should become entities
60044
+ // addSound(name, options) {
60045
+ // const { autoplay = false, ...opts } = options;
60046
+ // this.isPlayingSound = autoplay;
60047
+ // this.sound = new Sound(name, {
60048
+ // autoplay,
60049
+ // ...opts
60050
+ // });
60051
+ // this.sound.setTarget(this);
60052
+ // return this.sound;
60053
+ // }
60054
+ // addDirectionalSound(name, options) {
60055
+ // const { autoplay = false, ...opts } = options;
60056
+ // this.isPlayingSound = autoplay;
60057
+ // this.sound = new DirectionalSound(name, {
60058
+ // autoplay,
60059
+ // ...opts
60060
+ // });
60061
+ // this.sound.setTarget(this);
60062
+ // return this.sound;
60063
+ // }
60064
+ // addAmbientSound(name, options) {
60065
+ // const { autoplay = false, ...opts } = options;
60066
+ // this.isPlayingSound = autoplay;
60067
+ // this.sound = new AmbientSound(name, {
60068
+ // body: this.body,
60069
+ // autoplay,
60070
+ // ...opts
60071
+ // });
60072
+ // return this.sound;
60073
+ // }
60074
+ value: function addLight(light) {
60075
+ var _this$getPosition = this.getPosition(),
60076
+ x = _this$getPosition.x,
60077
+ y = _this$getPosition.y,
60078
+ z = _this$getPosition.z;
59826
60079
 
59827
- case 'custom':
59828
- if (this.customSplitsCallback === undefined) console.error('CSM: Custom split scheme callback not defined.');
59829
- this.customSplitsCallback(this.cascades, camera.near, far, this.breaks);
59830
- break;
60080
+ light.setPosition({
60081
+ x: x,
60082
+ y: y,
60083
+ z: z
60084
+ });
60085
+ this.light = light;
60086
+ }
60087
+ }, {
60088
+ key: "playSound",
60089
+ value: function playSound() {
60090
+ if (this.sound && !this.isPlayingSound) {
60091
+ this.sound.play();
60092
+ this.isPlayingSound = true;
59831
60093
  }
59832
-
59833
- function uniformSplit(amount, near, far, target) {
59834
- for (var i = 1; i < amount; i++) {
59835
- target.push((near + (far - near) * i / amount) / far);
59836
- }
59837
-
59838
- target.push(1);
60094
+ }
60095
+ }, {
60096
+ key: "stopSound",
60097
+ value: function stopSound() {
60098
+ if (this.sound && this.isPlayingSound) {
60099
+ this.sound.stop();
60100
+ this.isPlayingSound = false;
59839
60101
  }
60102
+ }
60103
+ }, {
60104
+ key: "getScale",
60105
+ value: function getScale() {
60106
+ return {
60107
+ x: this.body.scale.x,
60108
+ y: this.body.scale.y,
60109
+ z: this.body.scale.z
60110
+ };
60111
+ }
60112
+ }, {
60113
+ key: "setScale",
60114
+ value: function setScale(howbig) {
60115
+ if (this.hasBody()) {
60116
+ var scale = _objectSpread2$1(_objectSpread2$1({}, this.getScale()), howbig);
59840
60117
 
59841
- function logarithmicSplit(amount, near, far, target) {
59842
- for (var i = 1; i < amount; i++) {
59843
- target.push(near * Math.pow(far / near, i / amount) / far);
59844
- }
59845
-
59846
- target.push(1);
60118
+ this.body.scale.set(scale.x, scale.y, scale.z);
59847
60119
  }
59848
-
59849
- function practicalSplit(amount, near, far, lambda, target) {
59850
- _uniformArray.length = 0;
59851
- _logArray.length = 0;
59852
- logarithmicSplit(amount, near, far, _logArray);
59853
- uniformSplit(amount, near, far, _uniformArray);
59854
-
59855
- for (var i = 1; i < amount; i++) {
59856
- target.push(MathUtils.lerp(_uniformArray[i - 1], _logArray[i - 1], lambda));
59857
- }
59858
-
59859
- target.push(1);
60120
+ }
60121
+ }, {
60122
+ key: "getQuaternion",
60123
+ value: function getQuaternion() {
60124
+ if (this.hasBody()) {
60125
+ return this.getBody().quaternion.clone();
59860
60126
  }
59861
60127
  }
59862
60128
  }, {
59863
- key: "update",
59864
- value: function update() {
59865
- var camera = this.camera;
59866
- var frustums = this.frustums;
59867
-
59868
- for (var i = 0; i < frustums.length; i++) {
59869
- var light = this.lights[i];
59870
- var shadowCam = light.shadow.camera;
59871
- var texelWidth = (shadowCam.right - shadowCam.left) / this.shadowMapSize;
59872
- var texelHeight = (shadowCam.top - shadowCam.bottom) / this.shadowMapSize;
59873
- light.shadow.camera.updateMatrixWorld(true);
59874
-
59875
- _cameraToLightMatrix.multiplyMatrices(light.shadow.camera.matrixWorldInverse, camera.matrixWorld);
59876
-
59877
- frustums[i].toSpace(_cameraToLightMatrix, _lightSpaceFrustum);
59878
- var nearVerts = _lightSpaceFrustum.vertices.near;
59879
- var farVerts = _lightSpaceFrustum.vertices.far;
59880
-
59881
- _bbox.makeEmpty();
59882
-
59883
- for (var j = 0; j < 4; j++) {
59884
- _bbox.expandByPoint(nearVerts[j]);
59885
-
59886
- _bbox.expandByPoint(farVerts[j]);
59887
- }
60129
+ key: "getPosition",
60130
+ value: function getPosition() {
60131
+ return this.getBody().position.clone();
60132
+ }
60133
+ }, {
60134
+ key: "setPosition",
60135
+ value: function setPosition(where) {
60136
+ if (this.hasBody()) {
60137
+ var _this$getPosition2 = this.getPosition(),
60138
+ x = _this$getPosition2.x,
60139
+ y = _this$getPosition2.y,
60140
+ z = _this$getPosition2.z;
59888
60141
 
59889
- _bbox.getCenter(_center);
60142
+ var position = _objectSpread2$1({
60143
+ x: x,
60144
+ y: y,
60145
+ z: z
60146
+ }, where);
59890
60147
 
59891
- _center.z = _bbox.max.z + this.lightMargin;
59892
- _center.x = Math.floor(_center.x / texelWidth) * texelWidth;
59893
- _center.y = Math.floor(_center.y / texelHeight) * texelHeight;
60148
+ this.body.position.set(position.x, position.y, position.z);
60149
+ }
60150
+ }
60151
+ }, {
60152
+ key: "getRotation",
60153
+ value: function getRotation() {
60154
+ return this.getBody().rotation.clone();
60155
+ }
60156
+ }, {
60157
+ key: "setRotation",
60158
+ value: function setRotation(how) {
60159
+ if (this.hasBody()) {
60160
+ var _this$getRotation = this.getRotation(),
60161
+ x = _this$getRotation.x,
60162
+ y = _this$getRotation.y,
60163
+ z = _this$getRotation.z;
59894
60164
 
59895
- _center.applyMatrix4(light.shadow.camera.matrixWorld);
60165
+ var rotation = _objectSpread2$1({
60166
+ x: x,
60167
+ y: y,
60168
+ z: z
60169
+ }, how);
59896
60170
 
59897
- light.position.copy(_center);
59898
- light.target.position.copy(_center);
59899
- light.target.position.x += this.lightDirection.x;
59900
- light.target.position.y += this.lightDirection.y;
59901
- light.target.position.z += this.lightDirection.z;
60171
+ this.body.rotation.set(rotation.x, rotation.y, rotation.z);
59902
60172
  }
59903
60173
  }
59904
60174
  }, {
59905
- key: "injectInclude",
59906
- value: function injectInclude() {
59907
- ShaderChunk.lights_fragment_begin = Shader$1.lights_fragment_begin;
59908
- ShaderChunk.lights_pars_begin = Shader$1.lights_pars_begin;
60175
+ key: "getWorldTransform",
60176
+ value: function getWorldTransform() {
60177
+ var position = this.getBody().getWorldPosition(new Vector3$1());
60178
+ var quaternion = this.getBody().getWorldQuaternion(new Quaternion(0, 0, 0, 1));
60179
+ var rotation = new Euler(0, 0, 0, 'XYZ').setFromQuaternion(quaternion, 'XYZ');
60180
+ return {
60181
+ position: position,
60182
+ rotation: rotation,
60183
+ quaternion: quaternion
60184
+ };
59909
60185
  }
59910
60186
  }, {
59911
- key: "setupMaterial",
59912
- value: function setupMaterial(material) {
59913
- material.defines = material.defines || {};
59914
- material.defines.USE_CSM = 1;
59915
- material.defines.CSM_CASCADES = this.cascades;
60187
+ key: "translate",
60188
+ value: function translate(_ref6) {
60189
+ var _ref6$x = _ref6.x,
60190
+ x = _ref6$x === void 0 ? 0 : _ref6$x,
60191
+ _ref6$y = _ref6.y,
60192
+ y = _ref6$y === void 0 ? 0 : _ref6$y,
60193
+ _ref6$z = _ref6.z,
60194
+ z = _ref6$z === void 0 ? 0 : _ref6$z;
59916
60195
 
59917
- if (this.fade) {
59918
- material.defines.CSM_FADE = '';
60196
+ if (this.hasBody()) {
60197
+ this.body.translateX(x);
60198
+ this.body.translateY(y);
60199
+ this.body.translateZ(z);
59919
60200
  }
60201
+ }
60202
+ }, {
60203
+ key: "rotateTo",
60204
+ value: function rotateTo() {
60205
+ var _this6 = this;
59920
60206
 
59921
- var breaksVec2 = [];
59922
- var scope = this;
59923
- var shaders = this.shaders;
60207
+ var rotation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getRotation();
60208
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
60209
+ var easing = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Between.Easing.Linear;
59924
60210
 
59925
- material.onBeforeCompile = function (shader) {
59926
- var far = Math.min(scope.camera.far, scope.maxFar);
59927
- scope.getExtendedBreaks(breaksVec2);
59928
- shader.uniforms.CSM_cascades = {
59929
- value: breaksVec2
59930
- };
59931
- shader.uniforms.cameraNear = {
59932
- value: scope.camera.near
59933
- };
59934
- shader.uniforms.shadowFar = {
59935
- value: far
59936
- };
59937
- shaders.set(material, shader);
59938
- };
60211
+ var _this$getRotation2 = this.getRotation(),
60212
+ x = _this$getRotation2.x,
60213
+ y = _this$getRotation2.y,
60214
+ z = _this$getRotation2.z;
59939
60215
 
59940
- shaders.set(material, null);
60216
+ return new Promise(function (resolve) {
60217
+ return new Between({
60218
+ x: x,
60219
+ y: y,
60220
+ z: z
60221
+ }, rotation).time(time).easing(easing).on('update', function (value) {
60222
+ return !_this6.isDisposed() && _this6.setRotation(value);
60223
+ }).on('complete', resolve);
60224
+ });
59941
60225
  }
59942
60226
  }, {
59943
- key: "updateUniforms",
59944
- value: function updateUniforms() {
59945
- var far = Math.min(this.camera.far, this.maxFar);
59946
- var shaders = this.shaders;
59947
- shaders.forEach(function (shader, material) {
59948
- if (shader !== null) {
59949
- var uniforms = shader.uniforms;
59950
- this.getExtendedBreaks(uniforms.CSM_cascades.value);
59951
- uniforms.cameraNear.value = this.camera.near;
59952
- uniforms.shadowFar.value = far;
59953
- }
60227
+ key: "goTo",
60228
+ value: function goTo() {
60229
+ var _this7 = this;
59954
60230
 
59955
- if (!this.fade && 'CSM_FADE' in material.defines) {
59956
- delete material.defines.CSM_FADE;
59957
- material.needsUpdate = true;
59958
- } else if (this.fade && !('CSM_FADE' in material.defines)) {
59959
- material.defines.CSM_FADE = '';
59960
- material.needsUpdate = true;
59961
- }
59962
- }, this);
59963
- }
59964
- }, {
59965
- key: "getExtendedBreaks",
59966
- value: function getExtendedBreaks(target) {
59967
- while (target.length < this.breaks.length) {
59968
- target.push(new Vector2());
59969
- }
60231
+ var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getPosition();
60232
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 250;
60233
+ var easing = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Between.Easing.Linear;
59970
60234
 
59971
- target.length = this.breaks.length;
60235
+ var _this$getPosition3 = this.getPosition(),
60236
+ x = _this$getPosition3.x,
60237
+ y = _this$getPosition3.y,
60238
+ z = _this$getPosition3.z;
59972
60239
 
59973
- for (var i = 0; i < this.cascades; i++) {
59974
- var amount = this.breaks[i];
59975
- var prev = this.breaks[i - 1] || 0;
59976
- target[i].x = prev;
59977
- target[i].y = amount;
59978
- }
60240
+ return new Promise(function (resolve) {
60241
+ return new Between({
60242
+ x: x,
60243
+ y: y,
60244
+ z: z
60245
+ }, position).time(time).easing(easing).on('update', function (value) {
60246
+ return !_this7.isDisposed() && _this7.setPosition(value);
60247
+ }).on('complete', resolve);
60248
+ });
59979
60249
  }
59980
60250
  }, {
59981
- key: "updateFrustums",
59982
- value: function updateFrustums() {
59983
- this.getBreaks();
59984
- this.initCascades();
59985
- this.updateShadowBounds();
59986
- this.updateUniforms();
60251
+ key: "uuid",
60252
+ value: function uuid() {
60253
+ return this.body.uuid;
60254
+ }
60255
+ }, {
60256
+ key: "setId",
60257
+ value: function setId() {
60258
+ return this.body.id;
60259
+ }
60260
+ }, {
60261
+ key: "id",
60262
+ value: function id() {
60263
+ return this.body.id;
59987
60264
  }
59988
60265
  }, {
59989
- key: "remove",
59990
- value: function remove() {
59991
- for (var i = 0; i < this.lights.length; i++) {
59992
- this.parent.remove(this.lights[i]);
59993
- }
60266
+ key: "setVisible",
60267
+ value: function setVisible() {
60268
+ var flag = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
60269
+ this.getBody().visible = flag;
59994
60270
  }
59995
60271
  }, {
59996
- key: "dispose",
59997
- value: function dispose() {
59998
- var shaders = this.shaders;
59999
- shaders.forEach(function (shader, material) {
60000
- delete material.onBeforeCompile;
60001
- delete material.defines.USE_CSM;
60002
- delete material.defines.CSM_CASCADES;
60003
- delete material.defines.CSM_FADE;
60004
-
60005
- if (shader !== null) {
60006
- delete shader.uniforms.CSM_cascades;
60007
- delete shader.uniforms.cameraNear;
60008
- delete shader.uniforms.shadowFar;
60009
- }
60010
-
60011
- material.needsUpdate = true;
60012
- });
60013
- shaders.clear();
60014
- }
60015
- }]);
60016
-
60017
- return CascadeShadowMaps;
60018
- }();var POINTLIGHT = 'pointlight';
60019
- var AMBIENTLIGHT = 'ambientlight';
60020
- var SUNLIGHT = 'sunlight';
60021
- var SPOTLIGHT = 'spotlight';
60022
- var HEMISPHERELIGHT = 'hemisphere';
60023
- var TIME_TO_UPDATE = 5;
60024
- var Lights = /*#__PURE__*/function () {
60025
- function Lights() {
60026
- _classCallCheck(this, Lights);
60027
-
60028
- this.delayFactor = 0.1;
60029
- this.delayStep = 30;
60030
- this.holderRadius = 0.01;
60031
- this.holderSegments = 1;
60032
- this.numLights = 0;
60033
- this.map = {};
60034
- this.lights = [];
60035
- this.csm = undefined;
60036
- }
60037
-
60038
- _createClass(Lights, [{
60039
- key: "isUsingCSM",
60040
- value: function isUsingCSM() {
60041
- return !!this.csm;
60272
+ key: "equals",
60273
+ value: function equals(entity) {
60274
+ try {
60275
+ return entity.uuid ? this.uuid() === entity.uuid() : false;
60276
+ } catch (e) {
60277
+ return false;
60278
+ }
60042
60279
  }
60043
60280
  }, {
60044
- key: "setUpCSM",
60045
- value: function setUpCSM() {
60046
- var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
60047
- this.csm = new CascadeShadowMaps(options);
60281
+ key: "setName",
60282
+ value: function setName(name) {
60283
+ this.name = name;
60048
60284
  }
60049
60285
  }, {
60050
- key: "add",
60051
- value: function add(light) {
60052
- this.lights.push(light);
60286
+ key: "getName",
60287
+ value: function getName() {
60288
+ return this.name;
60053
60289
  }
60054
60290
  }, {
60055
- key: "update",
60056
- value: function update(dt) {
60057
- if (this.isUsingCSM()) {
60058
- this.csm.update();
60291
+ key: "setData",
60292
+ value: function setData(key, value) {
60293
+ if (this.getBody().userData) {
60294
+ if (key && value) {
60295
+ this.getBody().userData[key] = value;
60296
+ } else {
60297
+ console.log(KEY_VALUE_IS_MISSING);
60298
+ }
60299
+ } else {
60300
+ console.log(USER_DATA_IS_MISSING);
60059
60301
  }
60060
-
60061
- var start = new Date();
60062
-
60063
- for (var index in this.lights) {
60064
- var light = this.lights[index];
60065
- light.update(dt);
60066
- if (+new Date() - start > TIME_TO_UPDATE) break;
60302
+ }
60303
+ }, {
60304
+ key: "getData",
60305
+ value: function getData(key) {
60306
+ if (this.getBody().userData) {
60307
+ if (key) {
60308
+ return this.getBody().userData[key];
60309
+ } else {
60310
+ console.log(KEY_IS_MISSING);
60311
+ }
60312
+ } else {
60313
+ console.log(USER_DATA_IS_MISSING);
60067
60314
  }
60068
60315
  }
60316
+ }, {
60317
+ key: "mapScriptsToJSON",
60318
+ value: function mapScriptsToJSON() {
60319
+ this.scripts.reduce(function (acc, _ref7) {
60320
+ var name = _ref7.name,
60321
+ _ref7$options = _ref7.options,
60322
+ options = _ref7$options === void 0 ? {} : _ref7$options;
60323
+ acc.names.push(name);
60324
+ acc.options.push(options);
60325
+ return acc;
60326
+ }, {
60327
+ names: [],
60328
+ options: []
60329
+ });
60330
+ }
60069
60331
  }, {
60070
60332
  key: "toJSON",
60071
60333
  value: function toJSON() {
60072
- return {
60073
- lights: this.lights.map(function (l) {
60074
- return l.toJSON();
60075
- })
60076
- };
60334
+ if (this.isSerializable()) {
60335
+ return {
60336
+ position: this.getPosition(),
60337
+ rotation: this.getRotation(),
60338
+ scale: this.getScale(),
60339
+ entityType: this.getEntityType(),
60340
+ scripts: this.mapScriptsToJSON(),
60341
+ tags: this.getTags()
60342
+ };
60343
+ }
60077
60344
  }
60078
- }]);
60079
-
60080
- return Lights;
60081
- }();
60082
- var Lights$1 = new Lights();var ToonShader = {
60083
- uniforms: {
60084
- "uDirLightPos": {
60085
- type: "v3",
60086
- value: new Vector3$1()
60087
- },
60088
- "uDirLightColor": {
60089
- type: "c",
60090
- value: new Color$1(0xffffff)
60091
- },
60092
- "uMaterialColor": {
60093
- type: "c",
60094
- value: new Color$1(0xffffff)
60095
- },
60096
- uKd: {
60097
- type: "f",
60098
- value: 1
60099
- },
60100
- uBorder: {
60101
- type: "f",
60102
- value: 0.4
60345
+ }], [{
60346
+ key: "create",
60347
+ value: function create() {
60348
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
60349
+ return new this(options);
60103
60350
  }
60104
- },
60105
- vertexShader: ["varying vec3 vNormal;", "varying vec3 vViewPosition;", "void main() {", "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", "vNormal = normalize( normalMatrix * normal );", "vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );", "vViewPosition = -mvPosition.xyz;", "}"].join("\n"),
60106
- fragmentShader: ["uniform vec3 uMaterialColor;", "uniform vec3 uDirLightPos;", "uniform vec3 uDirLightColor;", "uniform float uKd;", "uniform float uBorder;", "varying vec3 vNormal;", "varying vec3 vViewPosition;", "void main() {", // compute direction to light
60107
- "vec4 lDirection = viewMatrix * vec4( uDirLightPos, 0.0 );", "vec3 lVector = normalize( lDirection.xyz );", // diffuse: N * L. Normal must be normalized, since it's interpolated.
60108
- "vec3 normal = normalize( vNormal );", //was: "float diffuse = max( dot( normal, lVector ), 0.0);",
60109
- // solution
60110
- "float diffuse = dot( normal, lVector );", "if ( diffuse > 0.6 ) { diffuse = 1.0; }", "else if ( diffuse > -0.2 ) { diffuse = 0.7; }", "else { diffuse = 0.3; }", "gl_FragColor = vec4( uKd * uMaterialColor * uDirLightColor * diffuse, 1.0 );", "}"].join("\n")
60111
- };
60351
+ }]);
60112
60352
 
60113
- var ToonMaterial = /*#__PURE__*/function (_ShaderMaterial) {
60114
- _inherits(ToonMaterial, _ShaderMaterial);
60353
+ return Entity;
60354
+ }(EventDispatcher);var AnimationHandler = /*#__PURE__*/function (_EventDispatcher) {
60355
+ _inherits(AnimationHandler, _EventDispatcher);
60115
60356
 
60116
- var _super = _createSuper(ToonMaterial);
60357
+ var _super = _createSuper(AnimationHandler);
60117
60358
 
60118
- function ToonMaterial(_ref) {
60359
+ function AnimationHandler(mesh) {
60119
60360
  var _this;
60120
60361
 
60121
- var _ref$light = _ref.light,
60122
- light = _ref$light === void 0 ? {} : _ref$light,
60123
- color = _ref.color;
60362
+ var animations = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
60124
60363
 
60125
- _classCallCheck(this, ToonMaterial);
60364
+ _classCallCheck(this, AnimationHandler);
60126
60365
 
60127
- var uniforms = UniformsUtils.clone(ToonShader.uniforms);
60128
- var vertexShader = ToonShader.vertexShader,
60129
- fragmentShader = ToonShader.fragmentShader;
60130
- _this = _super.call(this, {
60131
- uniforms: uniforms,
60132
- vertexShader: vertexShader,
60133
- fragmentShader: fragmentShader,
60134
- flatShading: true
60135
- });
60136
- var position = light.position,
60137
- lightColor = light.color;
60366
+ _this = _super.call(this);
60138
60367
 
60139
- if (color) {
60140
- var materialColor = new Color$1(color);
60368
+ _defineProperty$1(_assertThisInitialized(_this), "getAnimationEventHandler", function (type) {
60369
+ return function (_ref) {
60370
+ var action = _ref.action,
60371
+ direction = _ref.direction;
60141
60372
 
60142
- _this.uniforms.uMaterialColor.value.copy(materialColor);
60143
- }
60373
+ _this.dispatchEvent({
60374
+ type: type,
60375
+ action: action,
60376
+ direction: direction
60377
+ });
60378
+ };
60379
+ });
60144
60380
 
60145
- _this.uniforms.uDirLightPos.value = position;
60381
+ _this.mixer = new AnimationMixer(mesh);
60382
+ _this.animations = animations;
60383
+ _this.isPlaying = false;
60146
60384
 
60147
- _this.uniforms.uDirLightColor.value.copy(new Color$1(lightColor));
60385
+ _this.addEventsListeners();
60148
60386
 
60149
- _this.side = DoubleSide;
60150
60387
  return _this;
60151
60388
  }
60152
60389
 
60153
- return ToonMaterial;
60154
- }(ShaderMaterial);var setUpLightsAndShadows = function setUpLightsAndShadows(mesh) {
60155
- var _Config$lights = Config$1.lights(),
60156
- textureAnisotropy = _Config$lights.textureAnisotropy,
60157
- shadows = _Config$lights.shadows;
60158
-
60159
- mesh.castShadow = Boolean(shadows);
60160
- mesh.receiveShadow = Boolean(shadows);
60390
+ _createClass(AnimationHandler, [{
60391
+ key: "addEventsListeners",
60392
+ value: function addEventsListeners() {
60393
+ this.mixer.addEventListener('loop', this.getAnimationEventHandler(ENTITY_EVENTS.ANIMATION.LOOP));
60394
+ this.mixer.addEventListener('finished', this.getAnimationEventHandler(ENTITY_EVENTS.ANIMATION.FINISHED));
60395
+ }
60396
+ }, {
60397
+ key: "getAction",
60398
+ value: function getAction(id) {
60399
+ var action;
60161
60400
 
60162
- if (hasMaterial(mesh)) {
60163
- var setUpMaterial = function setUpMaterial(material) {
60164
- if (Lights$1.isUsingCSM()) {
60165
- Lights$1.csm.setupMaterial(material);
60401
+ if (typeof id === 'number') {
60402
+ action = this.animations[id];
60403
+ } else if (typeof id === 'string') {
60404
+ action = AnimationClip.findByName(this.animations, id);
60166
60405
  }
60167
60406
 
60168
- if (material.map) {
60169
- material.map.anisotropy = textureAnisotropy;
60407
+ return action;
60408
+ }
60409
+ }, {
60410
+ key: "getAvailableAnimations",
60411
+ value: function getAvailableAnimations() {
60412
+ return this.animations.map(function (_ref2) {
60413
+ var name = _ref2.name;
60414
+ return name;
60415
+ });
60416
+ }
60417
+ }, {
60418
+ key: "stopAll",
60419
+ value: function stopAll() {
60420
+ this.mixer.stopAllAction();
60421
+ this.isPlaying = false;
60422
+ }
60423
+ }, {
60424
+ key: "stopCurrentAnimation",
60425
+ value: function stopCurrentAnimation() {
60426
+ if (this.currentAction) {
60427
+ this.currentAction.stop();
60170
60428
  }
60171
60429
 
60172
- return material;
60173
- };
60174
-
60175
- mesh.material = processMaterial(mesh.material, setUpMaterial);
60176
- }
60177
- };
60178
-
60179
- var hasMaterial = function hasMaterial(mesh) {
60180
- return Boolean(mesh.material);
60181
- };
60182
- var hasGeometry = function hasGeometry(mesh) {
60183
- return Boolean(mesh.geometry);
60184
- };
60185
- var processMaterial = function processMaterial(material, callback) {
60186
- return Array.isArray(material) ? material.map(callback) : callback(material);
60187
- };
60188
- var changeMaterialByName = function changeMaterialByName(name, mesh, materialOptions) {
60189
- if (!hasMaterial(mesh)) return;
60190
-
60191
- switch (name) {
60192
- case MATERIALS.LAMBERT:
60193
- return cloneMaterial(MeshLambertMaterial, mesh, materialOptions);
60194
-
60195
- case MATERIALS.PHONG:
60196
- return cloneMaterial(MeshPhongMaterial, mesh, materialOptions);
60197
-
60198
- case MATERIALS.DEPTH:
60199
- return cloneMaterial(MeshDepthMaterial, mesh, materialOptions);
60200
-
60201
- case MATERIALS.STANDARD:
60202
- return cloneMaterial(MeshStandardMaterial, mesh, materialOptions);
60203
-
60204
- case MATERIALS.TOON:
60205
- return cloneMaterial(ToonMaterial, mesh, materialOptions);
60206
-
60207
- case MATERIALS.THREE_TOON:
60208
- return cloneMaterial(MeshToonMaterial, mesh, materialOptions);
60209
-
60210
- case MATERIALS.BASIC:
60211
- default:
60212
- return cloneMaterial(MeshBasicMaterial, mesh, materialOptions);
60213
- }
60214
- };
60430
+ this.isPlaying = false;
60431
+ }
60432
+ }, {
60433
+ key: "playAnimation",
60434
+ value: function playAnimation(id, options) {
60435
+ var action = this.getAction(id);
60436
+ var _options$loop = options.loop,
60437
+ loop = _options$loop === void 0 ? LoopRepeat : _options$loop;
60438
+ this.isPlaying = true;
60215
60439
 
60216
- var cloneMaterial = function cloneMaterial(MeshMaterial, mesh) {
60217
- var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
60440
+ if (this.currentAction) {
60441
+ this.fadeToAnimation(action, options);
60442
+ } else if (action) {
60443
+ this.currentAction = this.mixer.clipAction(action).setLoop(loop).play();
60444
+ } else {
60445
+ console.warn(ANIMATION_NOT_FOUND);
60446
+ }
60447
+ }
60448
+ }, {
60449
+ key: "fadeToAnimation",
60450
+ value: function fadeToAnimation(action) {
60451
+ var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
60452
+ _ref3$duration = _ref3.duration,
60453
+ duration = _ref3$duration === void 0 ? 0.2 : _ref3$duration,
60454
+ _ref3$loop = _ref3.loop,
60455
+ loop = _ref3$loop === void 0 ? LoopRepeat : _ref3$loop;
60218
60456
 
60219
- var _cloneMaterial = function _cloneMaterial(material) {
60220
- var clone = material.clone();
60221
- var newMaterial = new MeshMaterial(_objectSpread2$1({
60222
- map: clone.map,
60223
- color: clone.color
60224
- }, options));
60225
- newMaterial.skinning = true;
60226
- return newMaterial;
60227
- };
60457
+ var previousAction = this.currentAction;
60458
+ this.currentAction = this.mixer.clipAction(action);
60228
60459
 
60229
- mesh.material = processMaterial(mesh.material, _cloneMaterial);
60230
- setUpLightsAndShadows(mesh);
60231
- };
60460
+ if (previousAction !== this.currentAction) {
60461
+ previousAction.fadeOut(duration);
60462
+ }
60232
60463
 
60233
- var disposeTextures = function disposeTextures(mesh) {
60234
- if (hasMaterial(mesh)) {
60235
- var _disposeTexture = function _disposeTexture(material) {
60236
- material.map && material.dispose();
60237
- };
60464
+ this.currentAction.reset().setEffectiveTimeScale(1).setEffectiveWeight(1).fadeIn(duration).setLoop(loop).play();
60465
+ }
60466
+ }, {
60467
+ key: "update",
60468
+ value: function update(dt) {
60469
+ this.mixer.update(dt);
60470
+ }
60471
+ }]);
60238
60472
 
60239
- processMaterial(mesh.material, _disposeTexture);
60240
- }
60241
- };
60242
- var disposeMaterial = function disposeMaterial(mesh) {
60243
- if (hasMaterial(mesh)) {
60244
- mesh.material.dispose();
60245
- }
60246
- };
60247
- var disposeGeometry = function disposeGeometry(mesh) {
60248
- if (hasGeometry(mesh)) {
60249
- mesh.geometry.dispose();
60250
- }
60251
- };
60252
- var prepareModel = function prepareModel(model) {
60253
- setUpLightsAndShadows(model);
60254
- model.traverse(function (mesh) {
60255
- setUpLightsAndShadows(mesh);
60256
- });
60257
- return model;
60258
- };var _MATERIAL_TEXTURE_MAP;
60473
+ return AnimationHandler;
60474
+ }(EventDispatcher);var _MATERIAL_TEXTURE_MAP;
60259
60475
  var MATERIAL_TEXTURE_MAP = (_MATERIAL_TEXTURE_MAP = {}, _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.BASIC, [TEXTURES.ALPHA, TEXTURES.AO, TEXTURES.ENV, TEXTURES.LIGHT, TEXTURES.MAP, TEXTURES.SPECULAR]), _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.LAMBERT, [TEXTURES.ALPHA, TEXTURES.AO, TEXTURES.ENV, TEXTURES.LIGHT, TEXTURES.MAP, TEXTURES.SPECULAR, TEXTURES.EMISSIVE]), _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.PHONG, [TEXTURES.ALPHA, TEXTURES.AO, TEXTURES.ENV, TEXTURES.LIGHT, TEXTURES.MAP, TEXTURES.SPECULAR, TEXTURES.EMISSIVE, TEXTURES.BUMP, TEXTURES.DISPLACEMENT, TEXTURES.NORMAL]), _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.DEPTH, [TEXTURES.ALPHA, TEXTURES.MAP, TEXTURES.DISPLACEMENT]), _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.STANDARD, [TEXTURES.ALPHA, TEXTURES.AO, TEXTURES.ENV, TEXTURES.LIGHT, TEXTURES.MAP, TEXTURES.EMISSIVE, TEXTURES.BUMP, TEXTURES.DISPLACEMENT, TEXTURES.NORMAL, TEXTURES.METALNESS, TEXTURES.ROUGHNESS]), _defineProperty$1(_MATERIAL_TEXTURE_MAP, MATERIALS.THREE_TOON, [TEXTURES.ALPHA, TEXTURES.AO, TEXTURES.BUMP, TEXTURES.DISPLACEMENT, TEXTURES.EMISSIVE, TEXTURES.GRADIENT, TEXTURES.LIGHT, TEXTURES.MAP, TEXTURES.NORMAL]), _MATERIAL_TEXTURE_MAP);
60260
60476
  var isTextureMapAllowedForMaterial = function isTextureMapAllowedForMaterial(materialType, textureType) {
60261
60477
  return MATERIAL_TEXTURE_MAP[materialType] && MATERIAL_TEXTURE_MAP[materialType].includes(textureType);
60262
- };var _excluded$3 = ["position", "quaternion"],
60478
+ };var _excluded$5 = ["position", "quaternion"],
60263
60479
  _excluded2 = ["applyPhysicsUpdate"],
60264
60480
  _excluded3 = ["dt", "event"];
60265
60481
  var COLLIDER_TAG = 'collider';
@@ -60286,30 +60502,6 @@ var Element = /*#__PURE__*/function (_Entity) {
60286
60502
 
60287
60503
  _this = _super.call(this, _options);
60288
60504
 
60289
- _defineProperty$1(_assertThisInitialized(_this), "getBodyByName", function (name) {
60290
- if (name) {
60291
- if (_this.hasBody()) {
60292
- return _this.body.getObjectByName(name);
60293
- } else {
60294
- var body;
60295
-
60296
- _this.body.traverse(function (element) {
60297
- if (element.name === name) {
60298
- body = element;
60299
- }
60300
- });
60301
-
60302
- if (body) {
60303
- return body;
60304
- }
60305
-
60306
- console.warn(ELEMENT_NOT_SET$1);
60307
- }
60308
- } else {
60309
- console.warn(ELEMENT_NAME_NOT_PROVIDED);
60310
- }
60311
- });
60312
-
60313
60505
  _defineProperty$1(_assertThisInitialized(_this), "handleAnimationHandlerEvents", function (e) {
60314
60506
  _this.dispatchEvent(e);
60315
60507
  });
@@ -60473,7 +60665,7 @@ var Element = /*#__PURE__*/function (_Entity) {
60473
60665
  _defineProperty$1(_assertThisInitialized(_this), "handlePhysicsUpdate", function (_ref6) {
60474
60666
  var position = _ref6.position,
60475
60667
  quaternion = _ref6.quaternion,
60476
- data = _objectWithoutProperties(_ref6, _excluded$3);
60668
+ data = _objectWithoutProperties(_ref6, _excluded$5);
60477
60669
 
60478
60670
  _this.setPosition(position);
60479
60671
 
@@ -60491,15 +60683,14 @@ var Element = /*#__PURE__*/function (_Entity) {
60491
60683
  });
60492
60684
 
60493
60685
  var _options$name = _options.name,
60494
- _name = _options$name === void 0 ? "default_".concat(Math.random()) : _options$name,
60686
+ name = _options$name === void 0 ? "default_".concat(Math.random()) : _options$name,
60495
60687
  geometry = _options.geometry,
60496
60688
  material = _options.material,
60497
60689
  _body = _options.body;
60498
-
60499
60690
  _this.textures = {};
60500
60691
  _this.opacity = 1;
60501
60692
  _this.options = _objectSpread2$1(_objectSpread2$1({}, _options), {}, {
60502
- name: _name
60693
+ name: name
60503
60694
  });
60504
60695
  _this.physicsOptions = DEFAULT_PHYSICS_OPTIONS;
60505
60696
  _this.physicsState = {};
@@ -60950,7 +61141,7 @@ var Element = /*#__PURE__*/function (_Entity) {
60950
61141
 
60951
61142
  return new Promise(function (resolve) {
60952
61143
  return new Between(_this4.opacity, opacity).time(time).on('update', function (value) {
60953
- return _this4.setOpacity(value);
61144
+ return !_this4.isDisposed() && _this4.setOpacity(value);
60954
61145
  }).on('complete', resolve);
60955
61146
  });
60956
61147
  }
@@ -60987,19 +61178,21 @@ var Element = /*#__PURE__*/function (_Entity) {
60987
61178
  }, {
60988
61179
  key: "disposeBody",
60989
61180
  value: function disposeBody() {
60990
- if (hasMaterial(this.body)) {
61181
+ _get(_getPrototypeOf(Element.prototype), "disposeBody", this).call(this);
61182
+
61183
+ if (hasMaterial(this.getBody())) {
60991
61184
  disposeTextures(this.getBody());
60992
61185
  disposeMaterial(this.getBody());
60993
61186
  disposeGeometry(this.getBody());
60994
- } else {
60995
- this.body.traverse(function (child) {
60996
- if (hasMaterial(child)) {
60997
- disposeTextures(child);
60998
- disposeMaterial(child);
60999
- disposeGeometry(child);
61000
- }
61001
- });
61002
61187
  }
61188
+
61189
+ this.getBody().traverse(function (child) {
61190
+ if (hasMaterial(child)) {
61191
+ disposeTextures(child);
61192
+ disposeMaterial(child);
61193
+ disposeGeometry(child);
61194
+ }
61195
+ });
61003
61196
  }
61004
61197
  }, {
61005
61198
  key: "update",
@@ -61011,7 +61204,7 @@ var Element = /*#__PURE__*/function (_Entity) {
61011
61204
  this.checkCollisions();
61012
61205
  }
61013
61206
 
61014
- if (this.hasAnimationHandler() && this.animationHandler.isPlayingAnimation) {
61207
+ if (this.hasAnimationHandler() && this.animationHandler.isPlaying) {
61015
61208
  this.animationHandler.update(dt);
61016
61209
  }
61017
61210
  }
@@ -61020,11 +61213,6 @@ var Element = /*#__PURE__*/function (_Entity) {
61020
61213
  value: function dispose() {
61021
61214
  _get(_getPrototypeOf(Element.prototype), "dispose", this).call(this);
61022
61215
 
61023
- if (this.hasBody()) {
61024
- Scene$1.remove(this.getBody());
61025
- this.disposeBody();
61026
- }
61027
-
61028
61216
  if (this.hasAnimationHandler()) {
61029
61217
  this.removeAnimationHandlerListeners();
61030
61218
  }
@@ -61034,10 +61222,9 @@ var Element = /*#__PURE__*/function (_Entity) {
61034
61222
  }, {
61035
61223
  key: "toJSON",
61036
61224
  value: function toJSON() {
61037
- if (this.serializable) {
61225
+ if (this.isSerializable()) {
61038
61226
  return _objectSpread2$1(_objectSpread2$1({}, _get(_getPrototypeOf(Element.prototype), "toJSON", this).call(this)), {}, {
61039
61227
  body: this.body.toJSON(),
61040
- scripts: this.mapScriptsToJSON(),
61041
61228
  textures: this.textures
61042
61229
  }, this.options);
61043
61230
  }
@@ -61152,6 +61339,95 @@ var Element = /*#__PURE__*/function (_Entity) {
61152
61339
  }]);
61153
61340
 
61154
61341
  return Grid;
61342
+ }(Element);var AxesHelper = /*#__PURE__*/function (_LineSegments) {
61343
+ _inherits(AxesHelper, _LineSegments);
61344
+
61345
+ var _super = _createSuper(AxesHelper);
61346
+
61347
+ function AxesHelper() {
61348
+ var _this;
61349
+
61350
+ var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
61351
+ var thickness = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
61352
+
61353
+ _classCallCheck(this, AxesHelper);
61354
+
61355
+ var vertices = [0, 0, 0, size, 0, 0, 0, 0, 0, 0, size, 0, 0, 0, 0, 0, 0, size];
61356
+ var colors = [1, 0, 0, 1, 0.6, 0, 0, 1, 0, 0.6, 1, 0, 0, 0, 1, 0, 0.6, 1];
61357
+ var geometry = new BufferGeometry();
61358
+ geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3));
61359
+ geometry.setAttribute('color', new Float32BufferAttribute(colors, 3));
61360
+ var material = new LineBasicMaterial({
61361
+ vertexColors: true,
61362
+ toneMapped: false,
61363
+ linewidth: thickness
61364
+ });
61365
+ _this = _super.call(this, geometry, material);
61366
+ _this.type = 'AxesHelper';
61367
+ return _this;
61368
+ }
61369
+
61370
+ _createClass(AxesHelper, [{
61371
+ key: "setColors",
61372
+ value: function setColors(xAxisColor, yAxisColor, zAxisColor) {
61373
+ var color = new Color$1();
61374
+ var array = this.geometry.attributes.color.array;
61375
+ color.set(xAxisColor);
61376
+ color.toArray(array, 0);
61377
+ color.toArray(array, 3);
61378
+ color.set(yAxisColor);
61379
+ color.toArray(array, 6);
61380
+ color.toArray(array, 9);
61381
+ color.set(zAxisColor);
61382
+ color.toArray(array, 12);
61383
+ color.toArray(array, 15);
61384
+ this.geometry.attributes.color.needsUpdate = true;
61385
+ return this;
61386
+ }
61387
+ }, {
61388
+ key: "dispose",
61389
+ value: function dispose() {
61390
+ this.geometry.dispose();
61391
+ this.material.dispose();
61392
+ }
61393
+ }]);
61394
+
61395
+ return AxesHelper;
61396
+ }(LineSegments);
61397
+
61398
+ var Axes = /*#__PURE__*/function (_Element) {
61399
+ _inherits(Axes, _Element);
61400
+
61401
+ var _super2 = _createSuper(Axes);
61402
+
61403
+ function Axes(size, thickness) {
61404
+ var _this2;
61405
+
61406
+ _classCallCheck(this, Axes);
61407
+
61408
+ var options = {
61409
+ size: size,
61410
+ thickness: thickness,
61411
+ name: "AxesHelper_".concat(Math.random())
61412
+ };
61413
+ _this2 = _super2.call(this, options);
61414
+ var body = new AxesHelper(size, thickness);
61415
+
61416
+ _this2.setBody({
61417
+ body: body
61418
+ });
61419
+
61420
+ _this2.setEntityType(ENTITY_TYPES.HELPER.AXES);
61421
+
61422
+ return _this2;
61423
+ }
61424
+
61425
+ _createClass(Axes, [{
61426
+ key: "update",
61427
+ value: function update() {}
61428
+ }]);
61429
+
61430
+ return Axes;
61155
61431
  }(Element);var Cube = /*#__PURE__*/function (_Element) {
61156
61432
  _inherits(Cube, _Element);
61157
61433
 
@@ -61481,7 +61757,7 @@ var Plane = /*#__PURE__*/function (_Element) {
61481
61757
  }
61482
61758
 
61483
61759
  return Box;
61484
- }(Element);var _excluded$2 = ["anisotropy"];
61760
+ }(Element);var _excluded$4 = ["anisotropy"];
61485
61761
 
61486
61762
  var validateAnisotropy = function validateAnisotropy(anisotropy) {
61487
61763
  var max = Scene$1.getRenderer().capabilities.getMaxAnisotropy();
@@ -61507,7 +61783,7 @@ var Sprite = /*#__PURE__*/function (_Element) {
61507
61783
 
61508
61784
  var _options$anisotropy = options.anisotropy,
61509
61785
  anisotropy = _options$anisotropy === void 0 ? 1 : _options$anisotropy,
61510
- rest = _objectWithoutProperties(options, _excluded$2);
61786
+ rest = _objectWithoutProperties(options, _excluded$4);
61511
61787
 
61512
61788
  var texture = Images$1.get(spriteTexture);
61513
61789
  texture.anisotropy = validateAnisotropy(anisotropy);
@@ -72487,7 +72763,9 @@ var colladaParser = function colladaParser(_ref3) {
72487
72763
  var fbxParser = function fbxParser(scene) {
72488
72764
  scene.traverse(function (node) {
72489
72765
  if (node.isSkinnedMesh) {
72490
- node.material.skinning = true;
72766
+ processMaterial(node.material, function (material) {
72767
+ return material.skinning = true;
72768
+ });
72491
72769
  }
72492
72770
  });
72493
72771
  return {
@@ -72518,6 +72796,12 @@ var Models = function Models() {
72518
72796
 
72519
72797
  _defineProperty$1(this, "getModel", function (name) {
72520
72798
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
72799
+ console.warn(DEPRECATIONS.MODELS_GETMODEL);
72800
+ return _this.get(name, options);
72801
+ });
72802
+
72803
+ _defineProperty$1(this, "get", function (name) {
72804
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
72521
72805
 
72522
72806
  var _ref4 = _this.map[name] || _this.map[buildAssetId(name, _this.currentLevel)] || {},
72523
72807
  scene = _ref4.scene,
@@ -73618,7 +73902,7 @@ var Stats$1 = new Stats();var Loader = /*#__PURE__*/function () {
73618
73902
  }]);
73619
73903
 
73620
73904
  return Loader;
73621
- }();var _excluded$1 = ["mesh", "scripts", "texture"];
73905
+ }();var _excluded$3 = ["mesh", "scripts", "texture"];
73622
73906
  var MeshLoader = /*#__PURE__*/function (_Loader) {
73623
73907
  _inherits(MeshLoader, _Loader);
73624
73908
 
@@ -73644,7 +73928,7 @@ var MeshLoader = /*#__PURE__*/function (_Loader) {
73644
73928
  var mesh = _ref.mesh,
73645
73929
  scripts = _ref.scripts,
73646
73930
  texture = _ref.texture,
73647
- opts = _objectWithoutProperties(_ref, _excluded$1);
73931
+ opts = _objectWithoutProperties(_ref, _excluded$3);
73648
73932
 
73649
73933
  return _this.loadMesh(_this.parseMesh(mesh), scripts, texture, opts);
73650
73934
  });
@@ -73833,7 +74117,7 @@ var Light = /*#__PURE__*/function (_Entity) {
73833
74117
  var intensity = this.getIntensity();
73834
74118
  return new Promise(function (resolve) {
73835
74119
  return new Between(intensity, value).time(time).on('update', function (value) {
73836
- return _this2.setIntensity(value);
74120
+ return !_this2.isDisposed() && _this2.setIntensity(value);
73837
74121
  }).on('complete', resolve);
73838
74122
  });
73839
74123
  }
@@ -74079,9 +74363,11 @@ var AmbientLight = /*#__PURE__*/function (_Light) {
74079
74363
 
74080
74364
  var _super = _createSuper(AmbientLight);
74081
74365
 
74082
- function AmbientLight(options) {
74366
+ function AmbientLight() {
74083
74367
  var _this;
74084
74368
 
74369
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
74370
+
74085
74371
  _classCallCheck(this, AmbientLight);
74086
74372
 
74087
74373
  var _options$color = options.color,
@@ -76594,12 +76880,12 @@ var index$1=/*#__PURE__*/Object.freeze({__proto__:null,Emitter:k,Particle:P,Part
76594
76880
 
76595
76881
  _this.setSystem();
76596
76882
 
76883
+ _this.setName(name);
76884
+
76597
76885
  _this.setBody({
76598
76886
  body: new Object3D()
76599
76887
  });
76600
76888
 
76601
- _this.setName(name);
76602
-
76603
76889
  _this.setEntityType(ENTITY_TYPES.EFFECT.PARTICLE);
76604
76890
 
76605
76891
  return _this;
@@ -76701,12 +76987,17 @@ var index$1=/*#__PURE__*/Object.freeze({__proto__:null,Emitter:k,Particle:P,Part
76701
76987
  this.system.particleSystem.rotation.set(rotation.x, rotation.y, rotation.z);
76702
76988
  }
76703
76989
  }
76990
+ }, {
76991
+ key: "dispose",
76992
+ value: function dispose() {
76993
+ _get(_getPrototypeOf(ParticleEmitter.prototype), "dispose", this).call(this);
76994
+ }
76704
76995
  }, {
76705
76996
  key: "update",
76706
76997
  value: function update(dt) {
76707
76998
  _get(_getPrototypeOf(ParticleEmitter.prototype), "update", this).call(this, dt);
76708
76999
 
76709
- if (this.hasSystem()) {
77000
+ if (this.hasSystem() && !this.isSystemDead()) {
76710
77001
  this.system.update(dt);
76711
77002
  }
76712
77003
 
@@ -76947,7 +77238,9 @@ var index$1=/*#__PURE__*/Object.freeze({__proto__:null,Emitter:k,Particle:P,Part
76947
77238
  }]);
76948
77239
 
76949
77240
  return ParticleEmitterGroup;
76950
- }(Entity);var DEFAULT_PARTICLE_COLOR = PALETTES.BASE.BLACK;
77241
+ }(Entity);var _excluded$2 = ["initializers", "behaviours", "texture", "color", "rate"];
77242
+ var DEFAULT_PARTICLE_COLOR = PALETTES.BASE.BLACK;
77243
+ var SYSTEM_DISPOSE_TIMEOUT = 700;
76951
77244
 
76952
77245
  var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
76953
77246
  _inherits(ProtonParticleEmitter, _ParticleEmitter);
@@ -76955,6 +77248,8 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
76955
77248
  var _super = _createSuper(ProtonParticleEmitter);
76956
77249
 
76957
77250
  function ProtonParticleEmitter() {
77251
+ var _this;
77252
+
76958
77253
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
76959
77254
 
76960
77255
  _classCallCheck(this, ProtonParticleEmitter);
@@ -76967,15 +77262,28 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
76967
77262
  texture = _options$texture === void 0 ? false : _options$texture,
76968
77263
  _options$color = options.color,
76969
77264
  color = _options$color === void 0 ? DEFAULT_PARTICLE_COLOR : _options$color,
76970
- rate = options.rate;
76971
- var parsedOptions = {
77265
+ rate = options.rate,
77266
+ rest = _objectWithoutProperties(options, _excluded$2);
77267
+
77268
+ var parsedOptions = _objectSpread2$1({
76972
77269
  initializers: initializers,
76973
77270
  behaviours: behaviours,
76974
77271
  texture: texture,
76975
77272
  color: color,
76976
77273
  rate: rate
76977
- };
76978
- return _super.call(this, parsedOptions);
77274
+ }, rest);
77275
+
77276
+ _this = _super.call(this, parsedOptions);
77277
+
77278
+ _defineProperty$1(_assertThisInitialized(_this), "disposeSystem", function () {
77279
+ if (_this.hasSystem()) {
77280
+ _this.system.removeAllParticles();
77281
+
77282
+ _this.system.destroy();
77283
+ }
77284
+ });
77285
+
77286
+ return _this;
76979
77287
  }
76980
77288
 
76981
77289
  _createClass(ProtonParticleEmitter, [{
@@ -77003,7 +77311,7 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
77003
77311
  }, {
77004
77312
  key: "setSystem",
77005
77313
  value: function setSystem() {
77006
- var _this = this;
77314
+ var _this2 = this;
77007
77315
 
77008
77316
  var _this$options = this.options,
77009
77317
  _this$options$initial = _this$options.initializers,
@@ -77016,7 +77324,7 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
77016
77324
  this.system = new Proton.Emitter();
77017
77325
  this.system.rate = rate;
77018
77326
  initializers.forEach(function (initializer) {
77019
- return _this.system.addInitialize(initializer);
77327
+ return _this2.system.addInitialize(initializer);
77020
77328
  });
77021
77329
 
77022
77330
  if (texture) {
@@ -77024,7 +77332,7 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
77024
77332
  }
77025
77333
 
77026
77334
  behaviours.forEach(function (behaviour) {
77027
- return _this.system.addBehaviour(behaviour);
77335
+ return _this2.system.addBehaviour(behaviour);
77028
77336
  });
77029
77337
  }
77030
77338
  }, {
@@ -77065,8 +77373,8 @@ var ProtonParticleEmitter = /*#__PURE__*/function (_ParticleEmitter) {
77065
77373
  value: function dispose() {
77066
77374
  _get(_getPrototypeOf(ProtonParticleEmitter.prototype), "dispose", this).call(this);
77067
77375
 
77068
- this.system.stopEmit();
77069
- this.system.destroy();
77376
+ this.stop();
77377
+ setTimeout(this.disposeSystem, SYSTEM_DISPOSE_TIMEOUT);
77070
77378
  }
77071
77379
  }]);
77072
77380
 
@@ -77164,7 +77472,9 @@ var Explosion = /*#__PURE__*/function (_ParticleEmitterGroup) {
77164
77472
  }
77165
77473
 
77166
77474
  return Explosion;
77167
- }(ParticleEmitterGroup);var getFireRate = function getFireRate() {
77475
+ }(ParticleEmitterGroup);var _excluded$1 = ["texture", "direction", "size", "strength", "colors"];
77476
+
77477
+ var getFireRate = function getFireRate() {
77168
77478
  return new Proton.Rate(new Proton.Span(10, 15), new Proton.Span(.05, .1));
77169
77479
  };
77170
77480
 
@@ -77174,7 +77484,8 @@ var getFireInitializers = function getFireInitializers(direction, strength, size
77174
77484
  };
77175
77485
 
77176
77486
  var getFireBehaviours = function getFireBehaviours(direction, strength) {
77177
- return [new Proton.Scale(new Proton.Span(2, 2.5), 0), new Proton.G(strength / 100), new Proton.Color('#FF0026', ['#ffff00', '#ffff11'], Infinity, Proton.easeOutSine), new Proton.RandomDrift(direction.x / 100, direction.y / 100, direction.z / 100, 2.5)];
77487
+ var colors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [PALETTES.FRENCH.MANDARIN_RED, PALETTES.FRENCH.MELON_MELODY];
77488
+ return [new Proton.Scale(new Proton.Span(2, 2.5), 0), new Proton.G(strength / 100), new Proton.Color(colors[0], colors[1], Infinity, Proton.easeOutSine), new Proton.RandomDrift(direction.x / 100, direction.y / 100, direction.z / 100, 2.5)];
77178
77489
  };
77179
77490
 
77180
77491
  var Fire = /*#__PURE__*/function (_ProtonParticleEmitte) {
@@ -77191,13 +77502,17 @@ var Fire = /*#__PURE__*/function (_ProtonParticleEmitte) {
77191
77502
  _options$size = options.size,
77192
77503
  size = _options$size === void 0 ? 20 : _options$size,
77193
77504
  _options$strength = options.strength,
77194
- strength = _options$strength === void 0 ? 100 : _options$strength;
77195
- var fireOptions = {
77505
+ strength = _options$strength === void 0 ? 100 : _options$strength,
77506
+ colors = options.colors,
77507
+ rest = _objectWithoutProperties(options, _excluded$1);
77508
+
77509
+ var fireOptions = _objectSpread2$1({
77196
77510
  rate: getFireRate(),
77197
77511
  texture: texture,
77198
77512
  initializers: getFireInitializers(direction, strength, size),
77199
- behaviours: getFireBehaviours(direction, strength)
77200
- };
77513
+ behaviours: getFireBehaviours(direction, strength, colors)
77514
+ }, rest);
77515
+
77201
77516
  return _super.call(this, fireOptions);
77202
77517
  }
77203
77518
 
@@ -77402,7 +77717,14 @@ var Particles = /*#__PURE__*/function () {
77402
77717
  }
77403
77718
  }, {
77404
77719
  key: "addParticleEmitter",
77405
- value: function addParticleEmitter(_emitter) {
77720
+ value: function addParticleEmitter(emitter) {
77721
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
77722
+ console.warn(DEPRECATIONS.PARTICLES_ADD_PARTICLE_EMITTER);
77723
+ return this.add(emitter, options);
77724
+ }
77725
+ }, {
77726
+ key: "add",
77727
+ value: function add(_emitter) {
77406
77728
  var _this2 = this;
77407
77729
 
77408
77730
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
@@ -77455,7 +77777,7 @@ var Particles = /*#__PURE__*/function () {
77455
77777
  }
77456
77778
 
77457
77779
  if (emitter.isSystemDead()) {
77458
- this.toDispose.push(emitter.uuid);
77780
+ this.toDispose.push(emitter.uuid());
77459
77781
  }
77460
77782
  }
77461
77783
  }, {
@@ -80699,7 +81021,7 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80699
81021
 
80700
81022
  var _super = _createSuper(Level);
80701
81023
 
80702
- function Level(_options) {
81024
+ function Level(props) {
80703
81025
  var _this;
80704
81026
 
80705
81027
  _classCallCheck(this, Level);
@@ -80735,13 +81057,13 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80735
81057
  });
80736
81058
 
80737
81059
  _defineProperty$1(_assertThisInitialized(_this), "getJSONUrl", function () {
80738
- return "assets/scenes/".concat(_this.name, ".json");
81060
+ return null;
80739
81061
  });
80740
81062
 
80741
81063
  _defineProperty$1(_assertThisInitialized(_this), "loadScene", function () {
80742
81064
  var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this.getJSONUrl();
80743
81065
 
80744
- if (getWindow()) {
81066
+ if (getWindow() && url) {
80745
81067
  return fetch$1(url).then(function (res) {
80746
81068
  return res.json();
80747
81069
  }).then(_this.parseScene).catch(function () {
@@ -80758,11 +81080,10 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80758
81080
  });
80759
81081
 
80760
81082
  _defineProperty$1(_assertThisInitialized(_this), "cancelNextAnimationFrame", function () {
80761
- cancelAnimationFrame(_this.requestAnimationFrameId);
81083
+ return cancelAnimationFrame(_this.requestAnimationFrameId);
80762
81084
  });
80763
81085
 
80764
81086
  _defineProperty$1(_assertThisInitialized(_this), "init", function () {
80765
- _this.options.path;
80766
81087
  Scene$1.create(_this.getName());
80767
81088
  Scene$1.createCamera(new Camera());
80768
81089
  Physics$1.init().then(function () {
@@ -80796,7 +81117,7 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80796
81117
  _this.onDispose();
80797
81118
  });
80798
81119
 
80799
- _this.options = _options;
81120
+ _this.props = props;
80800
81121
  _this.name = _this.constructor.name;
80801
81122
  _this.debug = true;
80802
81123
  _this.inputListenersAreSet = false;
@@ -80818,24 +81139,12 @@ var Level = /*#__PURE__*/function (_EventDispatcher) {
80818
81139
  }, {
80819
81140
  key: "onUpdate",
80820
81141
  value: function onUpdate() {}
80821
- }, {
80822
- key: "onFailedTest",
80823
- value: function onFailedTest(message, test) {}
80824
- }, {
80825
- key: "onSuccededTest",
80826
- value: function onSuccededTest(message) {}
80827
81142
  }, {
80828
81143
  key: "onBeforeDispose",
80829
81144
  value: function onBeforeDispose() {}
80830
81145
  }, {
80831
81146
  key: "onDispose",
80832
81147
  value: function onDispose() {}
80833
- }, {
80834
- key: "onInputEnabled",
80835
- value: function onInputEnabled() {}
80836
- }, {
80837
- key: "onInputDisabled",
80838
- value: function onInputDisabled() {}
80839
81148
  }, {
80840
81149
  key: "requestNextAnimationFrame",
80841
81150
  value: function requestNextAnimationFrame() {
@@ -81043,17 +81352,19 @@ var storage = new Storage();var GameRunner = /*#__PURE__*/function () {
81043
81352
 
81044
81353
  _classCallCheck(this, GameRunner);
81045
81354
 
81046
- _defineProperty$1(this, "createNewScene", function (path, options) {
81355
+ _defineProperty$1(this, "createNewLevel", function (path, options) {
81047
81356
  var classname = _this.get(path);
81048
81357
 
81049
- var scene = new classname(_objectSpread2$1(_objectSpread2$1({}, options), {}, {
81358
+ var levelConfig = _objectSpread2$1(_objectSpread2$1({}, options), {}, {
81050
81359
  path: path
81051
- }));
81052
- subscribe(scene);
81053
- return scene;
81360
+ });
81361
+
81362
+ var level = new classname(levelConfig);
81363
+ subscribe(level);
81364
+ return level;
81054
81365
  });
81055
81366
 
81056
- _defineProperty$1(this, "disposeCurrentScene", function () {
81367
+ _defineProperty$1(this, "disposeCurrentLevel", function () {
81057
81368
  unsubscribeAll();
81058
81369
 
81059
81370
  _this.running.dispose();
@@ -81070,12 +81381,12 @@ var storage = new Storage();var GameRunner = /*#__PURE__*/function () {
81070
81381
  }
81071
81382
 
81072
81383
  if (_this.running) {
81073
- _this.disposeCurrentScene();
81384
+ _this.disposeCurrentLevel();
81074
81385
  }
81075
81386
 
81076
81387
  _this.setCurrentPath(path);
81077
81388
 
81078
- _this.setCurrentLevel(_this.createNewScene(path, options));
81389
+ _this.setCurrentLevel(_this.createNewLevel(path, options));
81079
81390
 
81080
81391
  if (loading) {
81081
81392
  storage.loadScene().then(_this.getCurrentLevel().parseScene).then(function () {
@@ -81086,13 +81397,15 @@ var storage = new Storage();var GameRunner = /*#__PURE__*/function () {
81086
81397
  resolve(_this.getCurrentLevel());
81087
81398
  });
81088
81399
  } else {
81089
- _this.getCurrentLevel().preload().then(function () {
81090
- _this.getCurrentLevel().prepareScene();
81400
+ Physics$1.waitForState(PHYSICS_STATES.READY).then(function () {
81401
+ _this.getCurrentLevel().preload().then(function () {
81402
+ _this.getCurrentLevel().prepareScene();
81091
81403
 
81092
- _this.getCurrentLevel().init();
81404
+ _this.getCurrentLevel().init();
81093
81405
 
81094
- resolve(_this.getCurrentLevel());
81095
- }).catch(reject);
81406
+ resolve(_this.getCurrentLevel());
81407
+ }).catch(reject);
81408
+ });
81096
81409
  }
81097
81410
  });
81098
81411
  });
@@ -81196,7 +81509,8 @@ var toQueryString = function toQueryString() {
81196
81509
  }).join(EMPTY);
81197
81510
  return q.endsWith(AMPERSAND) ? q.substr(0, q.length - 1) : q;
81198
81511
  };
81199
- var parseQuery = function parseQuery(queryString) {
81512
+ var parseQuery = function parseQuery() {
81513
+ var queryString = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
81200
81514
  return queryString.length > 1 ? queryString.replace(QUERY_PREFIX, EMPTY).split(AMPERSAND).map(function (couple) {
81201
81515
  var split = couple.split(EQUALS);
81202
81516
  return _defineProperty$1({}, split[0], split[1]);
@@ -86434,20 +86748,15 @@ var unmount = function unmount() {
86434
86748
  };var hasLocation = function hasLocation() {
86435
86749
  return window && window.location;
86436
86750
  };
86437
- var getLocationSearch = function getLocationSearch() {
86438
- return hasLocation() ? location.search : EMPTY$1;
86439
- };
86440
- var setLocationSearch = function setLocationSearch(search) {
86441
- if (hasLocation()) {
86442
- location.search = search;
86443
- }
86444
- };
86445
86751
  var getLocationHash = function getLocationHash() {
86446
86752
  return hasLocation() ? location.hash : HASH;
86447
86753
  };
86448
- var setLocationHash = function setLocationHash(hash) {
86754
+ var setLocationHash = function setLocationHash() {
86755
+ var hash = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
86756
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
86757
+
86449
86758
  if (hasLocation()) {
86450
- location.hash = hash;
86759
+ location.hash = "".concat(hash).concat(options);
86451
86760
  }
86452
86761
  };var Router = /*#__PURE__*/function () {
86453
86762
  function Router() {
@@ -86481,8 +86790,10 @@ var setLocationHash = function setLocationHash(hash) {
86481
86790
  });
86482
86791
 
86483
86792
  _defineProperty$1(this, "startLevel", function () {
86484
- var hash = Router.extractLocationHash();
86485
- var query = Router.extractQuery();
86793
+ var _Router$extractHashAn = Router.extractHashAndQuery(),
86794
+ hash = _Router$extractHashAn.hash,
86795
+ query = _Router$extractHashAn.query;
86796
+
86486
86797
  dispatchLocationPathChange(hash);
86487
86798
 
86488
86799
  if (_this.isValidRoute(hash)) {
@@ -86526,15 +86837,12 @@ var setLocationHash = function setLocationHash(hash) {
86526
86837
  }
86527
86838
  }, {
86528
86839
  key: "goTo",
86529
- value: function goTo(path, options) {
86840
+ value: function goTo(path) {
86841
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
86530
86842
  var origin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.getCurrentLevel();
86531
86843
 
86532
86844
  if (!Router.areRoutesIdentical(origin, path)) {
86533
- if (options) {
86534
- setLocationSearch(toQueryString(options));
86535
- }
86536
-
86537
- setLocationHash(path);
86845
+ setLocationHash(path, toQueryString(options));
86538
86846
  }
86539
86847
  }
86540
86848
  }, {
@@ -86556,7 +86864,9 @@ var setLocationHash = function setLocationHash(hash) {
86556
86864
  value: function start(config, assets) {
86557
86865
  var _config$selector = config.selector,
86558
86866
  selector = _config$selector === void 0 ? DEFAULT_SELECTOR : _config$selector;
86559
- var hash = Router.extractLocationHash();
86867
+
86868
+ var _Router$extractHashAn2 = Router.extractHashAndQuery(),
86869
+ hash = _Router$extractHashAn2.hash;
86560
86870
 
86561
86871
  if (!this.isValidRoute(hash)) {
86562
86872
  setLocationHash(ROOT);
@@ -86574,14 +86884,17 @@ var setLocationHash = function setLocationHash(hash) {
86574
86884
  }).then(this.startLevel).catch(this.handleStartError);
86575
86885
  }
86576
86886
  }], [{
86577
- key: "extractLocationHash",
86578
- value: function extractLocationHash() {
86579
- return Router.cleanRoute(getLocationHash());
86580
- }
86581
- }, {
86582
- key: "extractQuery",
86583
- value: function extractQuery() {
86584
- return parseQuery(getLocationSearch());
86887
+ key: "extractHashAndQuery",
86888
+ value: function extractHashAndQuery() {
86889
+ var _Router$cleanRoute$sp = Router.cleanRoute(getLocationHash()).split(QUERY_START),
86890
+ _Router$cleanRoute$sp2 = _slicedToArray(_Router$cleanRoute$sp, 2),
86891
+ hash = _Router$cleanRoute$sp2[0],
86892
+ query = _Router$cleanRoute$sp2[1];
86893
+
86894
+ return {
86895
+ hash: hash,
86896
+ query: parseQuery(query)
86897
+ };
86585
86898
  }
86586
86899
  }, {
86587
86900
  key: "cleanRoute",
@@ -86835,9 +87148,11 @@ var HemisphereLight = /*#__PURE__*/function (_Light) {
86835
87148
 
86836
87149
  var _super = _createSuper(HemisphereLight);
86837
87150
 
86838
- function HemisphereLight(options) {
87151
+ function HemisphereLight() {
86839
87152
  var _this;
86840
87153
 
87154
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
87155
+
86841
87156
  _classCallCheck(this, HemisphereLight);
86842
87157
 
86843
87158
  var _options$color = options.color,
@@ -88486,4 +88801,4 @@ var Shaders$1 = new Shaders();var Shader = function Shader(name, attributes, uni
88486
88801
  } else {
88487
88802
  this.instance = this.shader.instance;
88488
88803
  }
88489
- };var constants = _objectSpread2$1(_objectSpread2$1({}, lib_constants), light_contants);export{AUDIO_RAMPS,AmbientLight,Atmosphere,Audio$1 as Audio,BUILTIN,BackgroundSound,BaseScript,Box,Camera,Color,Config$1 as Config,Controls$1 as Controls,Cube,CurveLine,Cylinder,DirectionalSound,ENTITY_EVENTS,ENTITY_TYPES,Element,Entity,EventDispatcher,FEATURES,Features$1 as Features,GameRunner$1 as GameRunner,Grid,HemisphereLight,INPUT_EVENTS,Images$1 as Images,Input$1 as Input,Level,LightLoader$1 as LightLoader,Lights$1 as Lights,Line,MeshLoader$1 as MeshLoader,Mirror,Models$1 as Models,Ocean,PALETTES,PARTICLES,constants$1 as PHYSICS_CONSTANTS,PHYSICS_EVENTS,ParticleEmitter,ParticleEmitterGroup,Particles$1 as Particles,index$1 as Partykals,Physics$1 as Physics,Plane,PointLight,PostProcessing$1 as PostProcessing,Proton,ProtonParticleEmitter,Provider,Router$1 as Router,Scene$1 as Scene,Scripts$1 as Scripts,Shader,Sky,Skybox,Sound,Sphere,SpotLight,Sprite,Stats$1 as Stats,SunLight,three_module as THREE,Universe$1 as Universe,Vector3$1 as Vector3,Water,author,connect,constants,functions,hitbox as hitboxUtils,math,utils as physicsUtils,index as store,strings,uuid,workers};
88804
+ };var constants = _objectSpread2$1(_objectSpread2$1({}, lib_constants), light_contants);export{AUDIO_RAMPS,AmbientLight,Atmosphere,Audio$1 as Audio,Axes,BUILTIN,BackgroundSound,BaseScript,Box,Camera,Color,Config$1 as Config,Controls$1 as Controls,Cube,CurveLine,Cylinder,DirectionalSound,ENTITY_EVENTS,ENTITY_TYPES,Element,Entity,EventDispatcher,FEATURES,Features$1 as Features,GameRunner$1 as GameRunner,Grid,HemisphereLight,INPUT_EVENTS,Images$1 as Images,Input$1 as Input,Level,LightLoader$1 as LightLoader,Lights$1 as Lights,Line,MeshLoader$1 as MeshLoader,Mirror,Models$1 as Models,Ocean,PALETTES,PARTICLES,constants$1 as PHYSICS_CONSTANTS,PHYSICS_EVENTS,ParticleEmitter,ParticleEmitterGroup,Particles$1 as Particles,index$1 as Partykals,Physics$1 as Physics,Plane,PointLight,PostProcessing$1 as PostProcessing,Proton,ProtonParticleEmitter,Provider,Router$1 as Router,Scene$1 as Scene,Scripts$1 as Scripts,Shader,Sky,Skybox,Sound,Sphere,SpotLight,Sprite,Stats$1 as Stats,SunLight,three_module as THREE,Universe$1 as Universe,Vector3$1 as Vector3,Water,author,connect,constants,functions,hitbox as hitboxUtils,math,utils as physicsUtils,index as store,strings,uuid,workers};