From eb38cbe27c61737eeed761a37644313401c038af Mon Sep 17 00:00:00 2001 From: "Theunis J. Botha" Date: Tue, 1 Nov 2016 14:11:10 +0100 Subject: [PATCH 1/6] start messing around with texture loading --- build/game-lib-min.js | 6 +- build/game-lib.js | 231 ++++++++++++++++++++------------------- src/game-lib-material.js | 33 ++++-- src/game-lib-mesh.js | 2 +- src/game-lib-scene.js | 82 +++++++------- src/game-lib-texture.js | 114 ++++++++++--------- 6 files changed, 245 insertions(+), 223 deletions(-) diff --git a/build/game-lib-min.js b/build/game-lib-min.js index 6fa8bc9..66fa75a 100644 --- a/build/game-lib-min.js +++ b/build/game-lib-min.js @@ -1,3 +1,3 @@ -function GameLib(){}if("undefined"==typeof GameLib.D3&&(GameLib.D3=function(){}),"undefined"==typeof Q){if("undefined"==typeof require)throw console.warn("You need the Q promise library for the GameLib.D3"),new Error("You need the Q promise library for the GameLib.D3");var Q=require("q")}GameLib.D3.BoneWeight=function(e,i){this.boneIndex=e,this.weight=i},GameLib.D3.Bone=function(e,i,t,n,s,o,a,r,h,c){this.id=e,this.name=t,this.boneId=i,"undefined"==typeof n&&(n=[]),this.childBoneIds=n,"undefined"==typeof s&&(s=null),this.parentBoneId=s,"undefined"==typeof o&&(o=new GameLib.D3.Vector4),this.quaternion=o,"undefined"==typeof a&&(a=new GameLib.D3.Vector3(0,0,0)),this.position=a,"undefined"==typeof r&&(r=new GameLib.D3.Vector3(0,0,0)),this.rotation=r,"undefined"==typeof h&&(h=new GameLib.D3.Vector3(1,1,1)),this.scale=h,"undefined"==typeof c&&(c=new GameLib.D3.Vector3(0,1,0)),this.up=c},GameLib.D3.Broadphase=function(e,i,t,n){this.id=e,"undefined"==typeof i&&(i="broadphase-"+t),this.name=i,"undefined"==typeof t&&(t=GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE),this.broadphaseType=t,this.engine=n,this.engine.isNotCannonThrow(),this.instance=this.createInstance()},GameLib.D3.Broadphase.prototype.createInstance=function(){var e=null;if(this.broadphaseType==GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE)e=new this.engine.instance.NaiveBroadphase;else if(this.broadphaseType==GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID)e=new this.engine.instance.GridBroadphase;else{if(this.broadphaseType!=GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP)throw console.warn("Unsupported broadphase type: "+this.broadphaseType),new Error("Unsupported broadphase type: "+this.broadphaseType);e=new this.engine.instance.SAPBroadphase}return e},GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE=1,GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID=2,GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP=3,GameLib.D3.Color=function(e,i,t,n){this.r=e,this.g=i,this.b=t,this.a=n},GameLib.D3.Engine=function(e,i){this.engineType=e,this.instance=i},GameLib.D3.Engine.prototype.isCannon=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_CANNON},GameLib.D3.Engine.prototype.isNotCannonThrow=function(){if(this.engineType!=GameLib.D3.Engine.ENGINE_TYPE_CANNON)throw console.warn("Only CANNON supported for this function"),new Error("Only CANNON supported for this function")},GameLib.D3.Engine.prototype.isAmmo=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_AMMO},GameLib.D3.Engine.prototype.isGoblin=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_GOBLIN},GameLib.D3.Engine.ENGINE_TYPE_CANNON=1,GameLib.D3.Engine.ENGINE_TYPE_AMMO=2,GameLib.D3.Engine.ENGINE_TYPE_GOBLIN=3,GameLib.D3.Entity=function(e,i){this.meshId=e,"undefined"==typeof i&&(i=[]),this.componentIds=i},GameLib.D3.FlyControls=function(e,i,t){this.flySpeed=100,this.canvas=t,this.THREE=i,this.yaw=0,this.pitch=0,this.canRotate=!1,this.moveForward=!1,this.moveBackward=!1,this.moveLeft=!1,this.moveRight=!1,this.moveUp=!1,this.moveDown=!1,this.mouseUpCallback=this.onMouseUp.bind(this),this.mouseDownCallback=this.onMouseDown.bind(this),this.mouseMoveCallback=this.onMouseMove.bind(this),this.mouseWheelCallback=this.onMouseWheel.bind(this),this.keyDownCallback=this.onKeyDown.bind(this),this.keyUpCallback=this.onKeyUp.bind(this),this.camera=e,this.canvas.addEventListener("keydown",this.keyDownCallback,!1),this.canvas.addEventListener("keyup",this.keyUpCallback,!1),this.canvas.addEventListener("mousedown",this.mouseDownCallback,!1),this.canvas.addEventListener("mouseup",this.mouseUpCallback,!1),this.canvas.addEventListener("mousewheel",this.mouseWheelCallback,!1),this.havePointerLock="pointerLockElement"in document||"mozPointerLockElement"in document||"webkitPointerLockElement"in document,this.element=document.body,this.havePointerLock&&(this.element.requestPointerLock=this.element.requestPointerLock||this.element.mozRequestPointerLock||this.element.webkitRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock)},GameLib.D3.FlyControls.prototype.onMouseWheel=function(e){this.moveForward=!0,this.applyTranslation(.001*e.wheelDelta),e.preventDefault(),this.moveForward=!1},GameLib.D3.FlyControls.prototype.onMouseDown=function(e){1==e.button&&(this.canRotate=!0,this.canvas.addEventListener("mousemove",this.mouseMoveCallback,!1))},GameLib.D3.FlyControls.prototype.onMouseUp=function(e){1==e.button&&(this.canRotate=!1,this.canvas.removeEventListener("mousemove",this.mouseMoveCallback))},GameLib.D3.FlyControls.prototype.applyRotation=function(){this.camera.rotation.set(this.pitch,this.yaw,0,"YXZ")},GameLib.D3.FlyControls.prototype.applyTranslation=function(e){var i=new this.THREE.Vector3(0,0,-1),t=new this.THREE.Euler(0,0,0,"YXZ");t.set(this.pitch,this.yaw,0,"YXZ"),i=i.applyEuler(t);var n=i.normalize(),s=n.cross(new this.THREE.Vector3(0,1,0));this.moveForward?(this.camera.position.x+=n.x*(e*this.flySpeed),this.camera.position.y+=n.y*(e*this.flySpeed),this.camera.position.z+=n.z*(e*this.flySpeed)):this.moveBackward&&(this.camera.position.x-=n.x*(e*this.flySpeed),this.camera.position.y-=n.y*(e*this.flySpeed),this.camera.position.z-=n.z*(e*this.flySpeed)),this.moveLeft?(this.camera.position.x-=s.x*(e*this.flySpeed),this.camera.position.y-=s.y*(e*this.flySpeed),this.camera.position.z-=s.z*(e*this.flySpeed)):this.moveRight&&(this.camera.position.x+=s.x*(e*this.flySpeed),this.camera.position.y+=s.y*(e*this.flySpeed),this.camera.position.z+=s.z*(e*this.flySpeed)),this.moveUp?this.camera.position.y+=e*this.flySpeed:this.moveDown&&(this.camera.position.y-=e*this.flySpeed)},GameLib.D3.FlyControls.prototype.update=function(e){this.applyRotation(),this.applyTranslation(e)},GameLib.D3.FlyControls.prototype.onMouseMove=function(e){if(this.canRotate){var i=e.movementX||e.mozMovementX||e.webkitMovementX||0,t=e.movementY||e.mozMovementY||e.webkitMovementY||0;this.yaw-=.002*i,this.pitch-=.002*t}},GameLib.D3.FlyControls.prototype.onKeyDown=function(e){switch(e.keyCode){case 87:this.moveForward=!0;break;case 65:this.moveLeft=!0;break;case 83:this.moveBackward=!0;break;case 68:this.moveRight=!0;break;case 104:this.moveUp=!0;break;case 98:this.moveDown=!0}},GameLib.D3.FlyControls.prototype.onKeyUp=function(e){switch(e.keyCode){case 38:case 87:this.moveForward=!1;break;case 37:case 65:this.moveLeft=!1;break;case 40:case 83:this.moveBackward=!1;break;case 39:case 68:this.moveRight=!1;break;case 104:this.moveUp=!1;break;case 98:this.moveDown=!1}},GameLib.D3.Game=function(){this.scenes={},this.physicsWorlds=[],this.sceneToPhysicsWorldsMap={}},GameLib.D3.Game.prototype.AddScene=function(e){this.scenes[e.name]=e},GameLib.D3.Game.prototype.AddPhysicsWorld=function(e){this.physicsWorlds.push(e)},GameLib.D3.Game.prototype.LinkPhysicsWorldToScene=function(e,i){this.sceneToPhysicsWorldsMap[i.name]=this.sceneToPhysicsWorldsMap[i.name]||[],this.sceneToPhysicsWorldsMap[i.name].push(e)},GameLib.D3.Game.prototype.GetPhysicsWorldsForScene=function(e){return this.sceneToPhysicsWorldsMap[e.name]},GameLib.D3.Game.prototype.ProcessPhysics=function(e){for(var i in this.sceneToPhysicsWorldsMap){var t=this.sceneToPhysicsWorldsMap[i],n=this.scenes[i];if(n&&t)for(var s=0,o=t.length;s0){var r=GameLib.D3.Texture.loadMaps(e,a,o,i,t,n);Q.all(r).then(function(){s.resolve(o)}).catch(function(e){console.log(e),s.reject(e)})}else s.resolve(o);return s.promise},GameLib.D3.Matrix3=function(e,i,t){this.identity(),e&&(this.rows[0]=e),i&&(this.rows[1]=i),t&&(this.rows[2]=t)},GameLib.D3.Matrix3.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0),new GameLib.D3.Vector4(0,1,0),new GameLib.D3.Vector4(0,0,1)]},GameLib.D3.Matrix4=function(e,i,t,n){this.identity(),e&&(this.rows[0]=e),i&&(this.rows[1]=i),t&&(this.rows[2]=t),n&&(this.rows[3]=n)},GameLib.D3.Matrix4.prototype.rotationMatrixX=function(e){return this.identity(),this.rows[1]=new GameLib.D3.Vector4(0,Math.cos(e),-1*Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(0,Math.sin(e),Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixY=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),0,Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(-1*Math.sin(e),0,Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixZ=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),-1*Math.sin(e),0,0),this.rows[1]=new GameLib.D3.Vector4(Math.sin(e),Math.cos(e),0,0),this},GameLib.D3.Matrix4.prototype.rotateX=function(e,i){return this.identity(),this.rotationMatrixX(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.rotateY=function(e,i){return this.identity(),this.rotationMatrixY(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.rotateZ=function(e,i){return this.identity(),this.rotationMatrixZ(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.multiply=function(e){return e instanceof GameLib.D3.Vector4?new GameLib.D3.Vector4(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z+this.rows[0].w*e.w,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z+this.rows[1].w*e.w,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z+this.rows[2].w*e.w,this.rows[3].x*e.x+this.rows[3].y*e.y+this.rows[3].z*e.z+this.rows[3].w*e.w):e instanceof GameLib.D3.Vector3?new GameLib.D3.Vector3(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z):void 0},GameLib.D3.Matrix4.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0,0),new GameLib.D3.Vector4(0,1,0,0),new GameLib.D3.Vector4(0,0,1,0),new GameLib.D3.Vector4(0,0,0,1)]},GameLib.D3.Matrix4.prototype.lookAt=function(e,i,t){var n=new GameLib.D3.Vector3(e.x,e.y,e.z),s=n.subtract(i).normalize();0===s.squared()&&(s.z=1);var o=t.cross(s).normalize();0===o.squared()&&(s.x+=1e-4,o=t.cross(s).normalize());var a=s.cross(o);return this.rows[0].x=o.x,this.rows[0].y=o.y,this.rows[0].z=o.z,this.rows[1].x=a.x,this.rows[1].y=a.y,this.rows[1].z=a.z,this.rows[2].x=s.x,this.rows[2].y=s.y,this.rows[2].z=s.z,this},GameLib.D3.Mesh=function(e,i,t,n,s,o,a,r,h,c,l,p,d,m,u,f,y,v,L){this.id=e,this.meshId=GameLib.D3.Tools.RandomId(),this.path=i,this.name=t,this.meshType=n,this.vertices=s,this.faces=o,"undefined"==typeof a&&(a=null),this.skeleton=a,"undefined"==typeof r&&(r=[]),this.faceVertexUvs=r,"undefined"==typeof h&&(h=[]),this.skinIndices=h,"undefined"==typeof c&&(c=[]),this.skinWeights=c,"undefined"==typeof l&&(l=[]),this.materials=l,"undefined"==typeof p&&(p=new GameLib.D3.Vector3(0,0,0)),this.position=p,"undefined"==typeof d&&new GameLib.D3.Vector4,this.quaternion=d,"undefined"==typeof m&&(m=new GameLib.D3.Vector3(0,0,0)),this.rotation=m,"undefined"==typeof u&&(u=new GameLib.D3.Vector3(1,1,1)),this.scale=u,"undefined"==typeof f&&(f=new GameLib.D3.Vector3(0,1,0)),this.up=f,this.physics=y,this.parentMeshId=v,this.parentSceneId=L},GameLib.D3.Mesh.TYPE_NORMAL=0,GameLib.D3.Mesh.TYPE_SKINNED=1,GameLib.D3.Mesh.createInstanceMesh=function(e,i,t,n){var s=null;if(e.meshType==GameLib.D3.Mesh.TYPE_NORMAL&&(s=new n.instance.Mesh(i,t)),e.meshType==GameLib.D3.Mesh.TYPE_SKINNED){for(var o=e.skeleton.bones,a=e.skinIndices,r=e.skinWeights,h=[],c=0;c0;){var a=s.pop();if(a.triangle.v0==a.edge.x&&a.triangle.v1==a.edge.y||a.triangle.v1==a.edge.x&&a.triangle.v2==a.edge.y||a.triangle.v2==a.edge.x&&a.triangle.v0==a.edge.y){var r=a.triangle.v1;a.triangle.v1=a.triangle.v2,a.triangle.v2=r;var h=a.triangle.v1uv;a.triangle.v1uv=a.triangle.v2uv,a.triangle.v2uv=h}o.push(a);for(var c=[new GameLib.D3.Vector2(a.triangle.v0,a.triangle.v1),new GameLib.D3.Vector2(a.triangle.v1,a.triangle.v2),new GameLib.D3.Vector2(a.triangle.v2,a.triangle.v0)],l=0;l9||console.log("The vertices are not in the right length : "+e.length);for(var t=[],n=new GameLib.D3.Vector4.Points,s=0;s0)for(var h=0;h0},GameLib.D3.Vector3.normal=function(e,i,t){var n=i.copy(),s=t.copy();return n.subtract(e).cross(s.subtract(e))},GameLib.D3.Vector3.prototype.lookAt=function(e,i){var t=GameLib.D3.Matrix4.lookAt(this,e,i);this.multiply(t)},GameLib.D3.Vector3.prototype.translate=function(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this},GameLib.D3.Vector3.prototype.squared=function(){return this.x*this.x+this.y*this.y+this.z*this.z},GameLib.D3.Vector3.prototype.copy=function(){return new GameLib.D3.Vector3(this.x,this.y,this.z)},GameLib.D3.Vector3.prototype.multiply=function(e){if(e instanceof GameLib.D3.Vector3)this.x*=e.x,this.y*=e.y,this.z*=e.z;else{if(!(e instanceof GameLib.D3.Matrix4))throw console.log("functionality not implemented - please do this"),new Error("not implemented");var i=e.rows[0].x*this.x+e.rows[0].y*this.y+e.rows[0].z*this.z,t=e.rows[1].x*this.x+e.rows[1].y*this.y+e.rows[1].z*this.z,n=e.rows[2].x*this.x+e.rows[2].y*this.y+e.rows[2].z*this.z;this.x=i,this.y=t,this.z=n}return this},GameLib.D3.Vector3.prototype.dot=function(e){return this.x*e.x+this.y*e.y+this.z*e.z},GameLib.D3.Vector3.prototype.normalize=function(){var e=1e-6,i=this.squared();if(io&&(o=h.x,n=i*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixY(n),l=0;lo&&(o=h.y,n=i*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixX(n),l=0;ln&&(n=this.vectors[a].x),this.vectors[a].y>s&&(s=this.vectors[a].y),this.vectors[a].z>o&&(o=this.vectors[a].z);return new GameLib.D3.Vector3(Math.abs(n-e),Math.abs(s-i),Math.abs(s-t))},GameLib.D3.Vector4.Points.prototype.average=function(){for(var e=0,i=0,t=0,n=0;n0){var r=GameLib.D3.Texture.LoadMaps(e,a,o,i,t,n);r.length>0&&Q.all(r).then(function(e){s.resolve(o)},function(e){console.log(e),s.reject(e)},function(e){console.log("progress")})}else s.resolve(o);return s.promise},GameLib.D3.Matrix3=function(e,i,t){this.identity(),e&&(this.rows[0]=e),i&&(this.rows[1]=i),t&&(this.rows[2]=t)},GameLib.D3.Matrix3.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0),new GameLib.D3.Vector4(0,1,0),new GameLib.D3.Vector4(0,0,1)]},GameLib.D3.Matrix4=function(e,i,t,n){this.identity(),e&&(this.rows[0]=e),i&&(this.rows[1]=i),t&&(this.rows[2]=t),n&&(this.rows[3]=n)},GameLib.D3.Matrix4.prototype.rotationMatrixX=function(e){return this.identity(),this.rows[1]=new GameLib.D3.Vector4(0,Math.cos(e),-1*Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(0,Math.sin(e),Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixY=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),0,Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(-1*Math.sin(e),0,Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixZ=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),-1*Math.sin(e),0,0),this.rows[1]=new GameLib.D3.Vector4(Math.sin(e),Math.cos(e),0,0),this},GameLib.D3.Matrix4.prototype.rotateX=function(e,i){return this.identity(),this.rotationMatrixX(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.rotateY=function(e,i){return this.identity(),this.rotationMatrixY(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.rotateZ=function(e,i){return this.identity(),this.rotationMatrixZ(e),this.multiply(i)},GameLib.D3.Matrix4.prototype.multiply=function(e){return e instanceof GameLib.D3.Vector4?new GameLib.D3.Vector4(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z+this.rows[0].w*e.w,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z+this.rows[1].w*e.w,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z+this.rows[2].w*e.w,this.rows[3].x*e.x+this.rows[3].y*e.y+this.rows[3].z*e.z+this.rows[3].w*e.w):e instanceof GameLib.D3.Vector3?new GameLib.D3.Vector3(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z):void 0},GameLib.D3.Matrix4.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0,0),new GameLib.D3.Vector4(0,1,0,0),new GameLib.D3.Vector4(0,0,1,0),new GameLib.D3.Vector4(0,0,0,1)]},GameLib.D3.Matrix4.prototype.lookAt=function(e,i,t){var n=new GameLib.D3.Vector3(e.x,e.y,e.z),s=n.subtract(i).normalize();0===s.squared()&&(s.z=1);var o=t.cross(s).normalize();0===o.squared()&&(s.x+=1e-4,o=t.cross(s).normalize());var a=s.cross(o);return this.rows[0].x=o.x,this.rows[0].y=o.y,this.rows[0].z=o.z,this.rows[1].x=a.x,this.rows[1].y=a.y,this.rows[1].z=a.z,this.rows[2].x=s.x,this.rows[2].y=s.y,this.rows[2].z=s.z,this},GameLib.D3.Mesh=function(e,i,t,n,s,o,a,r,h,c,l,p,d,m,u,f,y,v,L){this.id=e,this.meshId=GameLib.D3.Tools.RandomId(),this.path=i,this.name=t,this.meshType=n,this.vertices=s,this.faces=o,"undefined"==typeof a&&(a=null),this.skeleton=a,"undefined"==typeof r&&(r=[]),this.faceVertexUvs=r,"undefined"==typeof h&&(h=[]),this.skinIndices=h,"undefined"==typeof c&&(c=[]),this.skinWeights=c,"undefined"==typeof l&&(l=[]),this.materials=l,"undefined"==typeof p&&(p=new GameLib.D3.Vector3(0,0,0)),this.position=p,"undefined"==typeof d&&new GameLib.D3.Vector4,this.quaternion=d,"undefined"==typeof m&&(m=new GameLib.D3.Vector3(0,0,0)),this.rotation=m,"undefined"==typeof u&&(u=new GameLib.D3.Vector3(1,1,1)),this.scale=u,"undefined"==typeof f&&(f=new GameLib.D3.Vector3(0,1,0)),this.up=f,this.physics=y,this.parentMeshId=v,this.parentSceneId=L},GameLib.D3.Mesh.TYPE_NORMAL=0,GameLib.D3.Mesh.TYPE_SKINNED=1,GameLib.D3.Mesh.CreateInstanceMesh=function(e,i,t,n){var s=null;if(e.meshType==GameLib.D3.Mesh.TYPE_NORMAL&&(s=new n.instance.Mesh(i,t)),e.meshType==GameLib.D3.Mesh.TYPE_SKINNED){for(var o=e.skeleton.bones,a=e.skinIndices,r=e.skinWeights,h=[],c=0;c0;){var a=s.pop();if(a.triangle.v0==a.edge.x&&a.triangle.v1==a.edge.y||a.triangle.v1==a.edge.x&&a.triangle.v2==a.edge.y||a.triangle.v2==a.edge.x&&a.triangle.v0==a.edge.y){var r=a.triangle.v1;a.triangle.v1=a.triangle.v2,a.triangle.v2=r;var h=a.triangle.v1uv;a.triangle.v1uv=a.triangle.v2uv,a.triangle.v2uv=h}o.push(a);for(var c=[new GameLib.D3.Vector2(a.triangle.v0,a.triangle.v1),new GameLib.D3.Vector2(a.triangle.v1,a.triangle.v2),new GameLib.D3.Vector2(a.triangle.v2,a.triangle.v0)],l=0;l9||console.log("The vertices are not in the right length : "+e.length);for(var t=[],n=new GameLib.D3.Vector4.Points,s=0;s0)for(var h=0;h0},GameLib.D3.Vector3.normal=function(e,i,t){var n=i.copy(),s=t.copy();return n.subtract(e).cross(s.subtract(e))},GameLib.D3.Vector3.prototype.lookAt=function(e,i){var t=GameLib.D3.Matrix4.lookAt(this,e,i);this.multiply(t)},GameLib.D3.Vector3.prototype.translate=function(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this},GameLib.D3.Vector3.prototype.squared=function(){return this.x*this.x+this.y*this.y+this.z*this.z},GameLib.D3.Vector3.prototype.copy=function(){return new GameLib.D3.Vector3(this.x,this.y,this.z)},GameLib.D3.Vector3.prototype.multiply=function(e){if(e instanceof GameLib.D3.Vector3)this.x*=e.x,this.y*=e.y,this.z*=e.z;else{if(!(e instanceof GameLib.D3.Matrix4))throw console.log("functionality not implemented - please do this"),new Error("not implemented");var i=e.rows[0].x*this.x+e.rows[0].y*this.y+e.rows[0].z*this.z,t=e.rows[1].x*this.x+e.rows[1].y*this.y+e.rows[1].z*this.z,n=e.rows[2].x*this.x+e.rows[2].y*this.y+e.rows[2].z*this.z;this.x=i,this.y=t,this.z=n}return this},GameLib.D3.Vector3.prototype.dot=function(e){return this.x*e.x+this.y*e.y+this.z*e.z},GameLib.D3.Vector3.prototype.normalize=function(){var e=1e-6,i=this.squared();if(io&&(o=h.x,n=i*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixY(n),l=0;lo&&(o=h.y,n=i*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixX(n),l=0;ln&&(n=this.vectors[a].x),this.vectors[a].y>s&&(s=this.vectors[a].y),this.vectors[a].z>o&&(o=this.vectors[a].z);return new GameLib.D3.Vector3(Math.abs(n-e),Math.abs(s-i),Math.abs(s-t))},GameLib.D3.Vector4.Points.prototype.average=function(){for(var e=0,i=0,t=0,n=0;n 0) { - var textureMaps = GameLib.D3.Texture.loadMaps( + + var textureMaps = GameLib.D3.Texture.LoadMaps( gameLibMaterial, blenderMaps, instanceMaterial, @@ -1582,16 +1585,22 @@ GameLib.D3.Material.createInstanceMaterial = function( uploadUrl, progressCallback ); - Q.all(textureMaps).then( - function(){ - defer.resolve(instanceMaterial); - } - ).catch( - function(error){ - console.log(error); - defer.reject(error); - } - ) + + if (textureMaps.length > 0) { + Q.all(textureMaps).then( + function onFulfilled(map){ + defer.resolve(instanceMaterial); + }, + function onRejected(message) { + console.log(message); + defer.reject(message); + }, + function onProgress(progress) { + console.log('progress'); + } + ) + } + } else { defer.resolve(instanceMaterial); } @@ -1935,7 +1944,7 @@ GameLib.D3.Mesh.TYPE_SKINNED = 1; * @param graphics * @returns {*} */ -GameLib.D3.Mesh.createInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) { +GameLib.D3.Mesh.CreateInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) { var threeMesh = null; @@ -3390,24 +3399,16 @@ GameLib.D3.Scene.loadScene = function( geometry.computeVertexNormals(); } - var instanceMaterialLoaders = []; + var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( + materials[0], + graphics, + uploadUrl, + progressCallback + ); - /** - * Setup materials - */ - for (var mi = 0; mi < materials.length; mi++) { - instanceMaterialLoaders.push( - GameLib.D3.Material.createInstanceMaterial( - materials[mi], - graphics, - uploadUrl, - progressCallback - ) - ); - } + var result = instanceMaterial.then( - var result = Q.all(instanceMaterialLoaders).then( - function(mesh, geometry) { + (function(__mesh, __geometry) { return function(materials) { console.log("loaded material : " + materials[0].name); @@ -3417,41 +3418,49 @@ GameLib.D3.Scene.loadScene = function( */ var material = materials[0]; - var threeMesh = GameLib.D3.Mesh.createInstanceMesh( - mesh, - geometry, + var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh( + __mesh, + __geometry, material, graphics ); - threeMesh.name = mesh.name; + instanceMesh.name = __mesh.name; - threeMesh.position.x = mesh.position.x; - threeMesh.position.y = mesh.position.y; - threeMesh.position.z = mesh.position.z; + instanceMesh.position.x = __mesh.position.x; + instanceMesh.position.y = __mesh.position.y; + instanceMesh.position.z = __mesh.position.z; - threeMesh.rotation.x = mesh.rotation.x; - threeMesh.rotation.y = mesh.rotation.y; - threeMesh.rotation.z = mesh.rotation.z; + instanceMesh.rotation.x = __mesh.rotation.x; + instanceMesh.rotation.y = __mesh.rotation.y; + instanceMesh.rotation.z = __mesh.rotation.z; - threeMesh.scale.x = mesh.scale.x; - threeMesh.scale.y = mesh.scale.y; - threeMesh.scale.z = mesh.scale.z; + instanceMesh.scale.x = __mesh.scale.x; + instanceMesh.scale.y = __mesh.scale.y; + instanceMesh.scale.z = __mesh.scale.z; - threeMesh.quaternion.x = mesh.quaternion.x; - threeMesh.quaternion.y = mesh.quaternion.y; - threeMesh.quaternion.z = mesh.quaternion.z; - threeMesh.quaternion.w = mesh.quaternion.w; + instanceMesh.quaternion.x = __mesh.quaternion.x; + instanceMesh.quaternion.y = __mesh.quaternion.y; + instanceMesh.quaternion.z = __mesh.quaternion.z; + instanceMesh.quaternion.w = __mesh.quaternion.w; - return threeMesh; + return instanceMesh; }; - }(mesh, geometry) - ).catch(function(error){ - console.log(error); - }); + })(mesh, geometry), + function onRejected(message) { + console.log(message); + return null; + }, + function onProgress(progress) { + console.log('material progress'); + } + ); meshQ.push(result); } + debugger; + console.log('hi'); + Q.all(meshQ).then( function(instanceMeshes){ console.log("all meshes have loaded"); @@ -3541,7 +3550,11 @@ GameLib.D3.Scene.loadScene = function( } ); } - }).catch( + }, + function(error) { + console.log(error); + } + ).catch( function(error){ console.log(error); } @@ -4162,7 +4175,7 @@ GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256. * @param progressCallback * @returns {Promise} */ -GameLib.D3.Texture.loadMap = function( +GameLib.D3.Texture.LoadMap = function( gameLibTexture, instanceMaterial, instanceMaterialMapType, @@ -4184,62 +4197,61 @@ GameLib.D3.Texture.loadMap = function( imagePath = uploadUrl + '/' + gameLibTexture.image.filename; } - if (imagePath) { - - textureLoader.crossOrigin = ''; - - textureLoader.load( - imagePath, - function(texture) { - /** - * onLoad - */ - instanceMaterial[instanceMaterialMapType] = texture; - instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; - instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; - instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; - instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; - /** - * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes - */ - instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; - instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; - instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; - instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; - instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; - instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( - gameLibTexture.offset.x, - gameLibTexture.offset.y - ); - instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; - instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; - instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; - instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; - instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; - instanceMaterial.needsUpdate = true; - defer.resolve(true); - }, - function(xhr) { - /** - * onProgress - */ - if (progressCallback) { - progressCallback(Math.round(xhr.loaded / xhr.total * 100)); - } - }, - function(error) { - /** - * onError - */ - console.log("an error occurred while trying to load the image : " + imagePath); - defer.resolve(null); - } - ); - - } else { - defer.resolve(null); + if (!imagePath) { + defer.reject("No image path"); + return defer.promise; } + textureLoader.crossOrigin = ''; + + textureLoader.load( + imagePath, + function(texture) { + /** + * onLoad + */ + instanceMaterial[instanceMaterialMapType] = texture; + instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; + instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; + instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; + instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; + /** + * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes + */ + instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; + instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; + instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; + instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; + instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; + instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( + gameLibTexture.offset.x, + gameLibTexture.offset.y + ); + instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; + instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; + instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; + instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; + instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; + instanceMaterial.needsUpdate = true; + defer.resolve(true); + }, + function(xhr) { + /** + * onProgress + */ + if (progressCallback) { + progressCallback(Math.round(xhr.loaded / xhr.total * 100)); + } + }, + function(error) { + /** + * onError + */ + console.log('Image could not be loaded: ' + imagePath, error); + defer.reject('Image could not be loaded: ' + imagePath); + } + ); + return defer.promise; }; @@ -4254,7 +4266,7 @@ GameLib.D3.Texture.loadMap = function( * @param progressCallback * @returns Q[] */ -GameLib.D3.Texture.loadMaps = function( +GameLib.D3.Texture.LoadMaps = function( gameLibMaterial, blenderMaps, instanceMaterial, @@ -4262,7 +4274,6 @@ GameLib.D3.Texture.loadMaps = function( uploadUrl, progressCallback ) { - var textureMaps = []; for (var ti = 0; ti < blenderMaps.length; ti++) { @@ -4330,7 +4341,7 @@ GameLib.D3.Texture.loadMaps = function( } textureMaps.push( - GameLib.D3.Texture.loadMap( + GameLib.D3.Texture.LoadMap( gameLibMaterial.maps[map], instanceMaterial, instanceMap, diff --git a/src/game-lib-material.js b/src/game-lib-material.js index 9656c04..5cd7a91 100644 --- a/src/game-lib-material.js +++ b/src/game-lib-material.js @@ -513,7 +513,7 @@ GameLib.D3.Material.TYPE_MULTI_MATERIAL= "MultiMaterial"; * @param uploadUrl String * @param progressCallback */ -GameLib.D3.Material.createInstanceMaterial = function( +GameLib.D3.Material.CreateInstanceMaterial = function( gameLibMaterial, graphics, uploadUrl, @@ -665,10 +665,13 @@ GameLib.D3.Material.createInstanceMaterial = function( } else { console.log("material type is not implemented yet: " + gameLibMaterial.materialType + " - material indexes could be screwed up"); + defer.reject(null); + return defer.promise; } if (blenderMaps.length > 0) { - var textureMaps = GameLib.D3.Texture.loadMaps( + + var textureMaps = GameLib.D3.Texture.LoadMaps( gameLibMaterial, blenderMaps, instanceMaterial, @@ -676,16 +679,22 @@ GameLib.D3.Material.createInstanceMaterial = function( uploadUrl, progressCallback ); - Q.all(textureMaps).then( - function(){ - defer.resolve(instanceMaterial); - } - ).catch( - function(error){ - console.log(error); - defer.reject(error); - } - ) + + if (textureMaps.length > 0) { + Q.all(textureMaps).then( + function onFulfilled(map){ + defer.resolve(instanceMaterial); + }, + function onRejected(message) { + console.log(message); + defer.reject(message); + }, + function onProgress(progress) { + console.log('progress'); + } + ) + } + } else { defer.resolve(instanceMaterial); } diff --git a/src/game-lib-mesh.js b/src/game-lib-mesh.js index 290b1d1..7cc1786 100644 --- a/src/game-lib-mesh.js +++ b/src/game-lib-mesh.js @@ -124,7 +124,7 @@ GameLib.D3.Mesh.TYPE_SKINNED = 1; * @param graphics * @returns {*} */ -GameLib.D3.Mesh.createInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) { +GameLib.D3.Mesh.CreateInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) { var threeMesh = null; diff --git a/src/game-lib-scene.js b/src/game-lib-scene.js index caa1cee..c3c15d7 100644 --- a/src/game-lib-scene.js +++ b/src/game-lib-scene.js @@ -470,24 +470,16 @@ GameLib.D3.Scene.loadScene = function( geometry.computeVertexNormals(); } - var instanceMaterialLoaders = []; + var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( + materials[0], + graphics, + uploadUrl, + progressCallback + ); - /** - * Setup materials - */ - for (var mi = 0; mi < materials.length; mi++) { - instanceMaterialLoaders.push( - GameLib.D3.Material.createInstanceMaterial( - materials[mi], - graphics, - uploadUrl, - progressCallback - ) - ); - } + var result = instanceMaterial.then( - var result = Q.all(instanceMaterialLoaders).then( - function(mesh, geometry) { + (function(__mesh, __geometry) { return function(materials) { console.log("loaded material : " + materials[0].name); @@ -497,41 +489,49 @@ GameLib.D3.Scene.loadScene = function( */ var material = materials[0]; - var threeMesh = GameLib.D3.Mesh.createInstanceMesh( - mesh, - geometry, + var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh( + __mesh, + __geometry, material, graphics ); - threeMesh.name = mesh.name; + instanceMesh.name = __mesh.name; - threeMesh.position.x = mesh.position.x; - threeMesh.position.y = mesh.position.y; - threeMesh.position.z = mesh.position.z; + instanceMesh.position.x = __mesh.position.x; + instanceMesh.position.y = __mesh.position.y; + instanceMesh.position.z = __mesh.position.z; - threeMesh.rotation.x = mesh.rotation.x; - threeMesh.rotation.y = mesh.rotation.y; - threeMesh.rotation.z = mesh.rotation.z; + instanceMesh.rotation.x = __mesh.rotation.x; + instanceMesh.rotation.y = __mesh.rotation.y; + instanceMesh.rotation.z = __mesh.rotation.z; - threeMesh.scale.x = mesh.scale.x; - threeMesh.scale.y = mesh.scale.y; - threeMesh.scale.z = mesh.scale.z; + instanceMesh.scale.x = __mesh.scale.x; + instanceMesh.scale.y = __mesh.scale.y; + instanceMesh.scale.z = __mesh.scale.z; - threeMesh.quaternion.x = mesh.quaternion.x; - threeMesh.quaternion.y = mesh.quaternion.y; - threeMesh.quaternion.z = mesh.quaternion.z; - threeMesh.quaternion.w = mesh.quaternion.w; + instanceMesh.quaternion.x = __mesh.quaternion.x; + instanceMesh.quaternion.y = __mesh.quaternion.y; + instanceMesh.quaternion.z = __mesh.quaternion.z; + instanceMesh.quaternion.w = __mesh.quaternion.w; - return threeMesh; + return instanceMesh; }; - }(mesh, geometry) - ).catch(function(error){ - console.log(error); - }); + })(mesh, geometry), + function onRejected(message) { + console.log(message); + return null; + }, + function onProgress(progress) { + console.log('material progress'); + } + ); meshQ.push(result); } + debugger; + console.log('hi'); + Q.all(meshQ).then( function(instanceMeshes){ console.log("all meshes have loaded"); @@ -621,7 +621,11 @@ GameLib.D3.Scene.loadScene = function( } ); } - }).catch( + }, + function(error) { + console.log(error); + } + ).catch( function(error){ console.log(error); } diff --git a/src/game-lib-texture.js b/src/game-lib-texture.js index 34e51bc..73a0ba7 100644 --- a/src/game-lib-texture.js +++ b/src/game-lib-texture.js @@ -213,7 +213,7 @@ GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256. * @param progressCallback * @returns {Promise} */ -GameLib.D3.Texture.loadMap = function( +GameLib.D3.Texture.LoadMap = function( gameLibTexture, instanceMaterial, instanceMaterialMapType, @@ -235,62 +235,61 @@ GameLib.D3.Texture.loadMap = function( imagePath = uploadUrl + '/' + gameLibTexture.image.filename; } - if (imagePath) { - - textureLoader.crossOrigin = ''; - - textureLoader.load( - imagePath, - function(texture) { - /** - * onLoad - */ - instanceMaterial[instanceMaterialMapType] = texture; - instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; - instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; - instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; - instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; - /** - * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes - */ - instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; - instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; - instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; - instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; - instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; - instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( - gameLibTexture.offset.x, - gameLibTexture.offset.y - ); - instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; - instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; - instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; - instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; - instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; - instanceMaterial.needsUpdate = true; - defer.resolve(true); - }, - function(xhr) { - /** - * onProgress - */ - if (progressCallback) { - progressCallback(Math.round(xhr.loaded / xhr.total * 100)); - } - }, - function(error) { - /** - * onError - */ - console.log("an error occurred while trying to load the image : " + imagePath); - defer.resolve(null); - } - ); - - } else { - defer.resolve(null); + if (!imagePath) { + defer.reject("No image path"); + return defer.promise; } + textureLoader.crossOrigin = ''; + + textureLoader.load( + imagePath, + function(texture) { + /** + * onLoad + */ + instanceMaterial[instanceMaterialMapType] = texture; + instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; + instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; + instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; + instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; + /** + * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes + */ + instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; + instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; + instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; + instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; + instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; + instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( + gameLibTexture.offset.x, + gameLibTexture.offset.y + ); + instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; + instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; + instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; + instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; + instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; + instanceMaterial.needsUpdate = true; + defer.resolve(true); + }, + function(xhr) { + /** + * onProgress + */ + if (progressCallback) { + progressCallback(Math.round(xhr.loaded / xhr.total * 100)); + } + }, + function(error) { + /** + * onError + */ + console.log('Image could not be loaded: ' + imagePath, error); + defer.reject('Image could not be loaded: ' + imagePath); + } + ); + return defer.promise; }; @@ -305,7 +304,7 @@ GameLib.D3.Texture.loadMap = function( * @param progressCallback * @returns Q[] */ -GameLib.D3.Texture.loadMaps = function( +GameLib.D3.Texture.LoadMaps = function( gameLibMaterial, blenderMaps, instanceMaterial, @@ -313,7 +312,6 @@ GameLib.D3.Texture.loadMaps = function( uploadUrl, progressCallback ) { - var textureMaps = []; for (var ti = 0; ti < blenderMaps.length; ti++) { @@ -381,7 +379,7 @@ GameLib.D3.Texture.loadMaps = function( } textureMaps.push( - GameLib.D3.Texture.loadMap( + GameLib.D3.Texture.LoadMap( gameLibMaterial.maps[map], instanceMaterial, instanceMap, From 74098b062d26310e180c4a8854925976dfed371e Mon Sep 17 00:00:00 2001 From: "Theunis J. Botha" Date: Tue, 1 Nov 2016 16:21:06 +0100 Subject: [PATCH 2/6] backward compatible with no lights --- src/game-lib-scene.js | 94 ++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 46 deletions(-) diff --git a/src/game-lib-scene.js b/src/game-lib-scene.js index d56935c..972e75d 100644 --- a/src/game-lib-scene.js +++ b/src/game-lib-scene.js @@ -135,55 +135,57 @@ GameLib.D3.Scene.LoadSceneFromApi = function( var lights3d = []; - for (var l = 0; l < scene.lights.length; l++) { + if (scene.lights && scene.lights.length > 0) { + for (var l = 0; l < scene.lights.length; l++) { - var light = scene.lights[l]; + var light = scene.lights[l]; - var light3d = new GameLib.D3.Light( - light.id, - light.lightType, - light.name, - new GameLib.D3.Color( - light.color.r, - light.color.g, - light.color.b, - light.color.a - ), - light.intensity, - new GameLib.D3.Vector3( - light.position.x, - light.position.y, - light.position.z - ), - new GameLib.D3.Vector3( - light.targetPosition.x, - light.targetPosition.y, - light.targetPosition.z - ), - new GameLib.D3.Vector4( - light.quaternion.x, - light.quaternion.y, - light.quaternion.z, - light.quaternion.w - ), - new GameLib.D3.Vector3( - light.rotation.x, - light.rotation.y, - light.rotation.z - ), - new GameLib.D3.Vector3( - light.scale.x, - light.scale.y, - light.scale.z - ), - light.distance, - light.decay, - light.power, - light.angle, - light.penumbra - ); + var light3d = new GameLib.D3.Light( + light.id, + light.lightType, + light.name, + new GameLib.D3.Color( + light.color.r, + light.color.g, + light.color.b, + light.color.a + ), + light.intensity, + new GameLib.D3.Vector3( + light.position.x, + light.position.y, + light.position.z + ), + new GameLib.D3.Vector3( + light.targetPosition.x, + light.targetPosition.y, + light.targetPosition.z + ), + new GameLib.D3.Vector4( + light.quaternion.x, + light.quaternion.y, + light.quaternion.z, + light.quaternion.w + ), + new GameLib.D3.Vector3( + light.rotation.x, + light.rotation.y, + light.rotation.z + ), + new GameLib.D3.Vector3( + light.scale.x, + light.scale.y, + light.scale.z + ), + light.distance, + light.decay, + light.power, + light.angle, + light.penumbra + ); - lights3d.push(light3d); + lights3d.push(light3d); + } } var scene3d = new GameLib.D3.Scene( From 0d1c4ad144d8dd84a417d12e7a096dfa2a5d70fd Mon Sep 17 00:00:00 2001 From: cybafelo Date: Tue, 1 Nov 2016 15:27:16 +0000 Subject: [PATCH 3/6] remove build from source control --- build/coverage/coverage-final.json | 2 - build/coverage/lcov-report/base.css | 213 - .../lcov-report/build/game-lib.js.html | 17498 ---------------- build/coverage/lcov-report/build/index.html | 93 - build/coverage/lcov-report/index.html | 93 - build/coverage/lcov-report/prettify.css | 1 - build/coverage/lcov-report/prettify.js | 1 - .../lcov-report/sort-arrow-sprite.png | Bin 209 -> 0 bytes build/coverage/lcov-report/sorter.js | 158 - build/coverage/lcov.info | 3201 --- build/game-lib-min.js | 3 - build/game-lib.js | 5760 ----- 12 files changed, 27023 deletions(-) delete mode 100644 build/coverage/coverage-final.json delete mode 100644 build/coverage/lcov-report/base.css delete mode 100644 build/coverage/lcov-report/build/game-lib.js.html delete mode 100644 build/coverage/lcov-report/build/index.html delete mode 100644 build/coverage/lcov-report/index.html delete mode 100644 build/coverage/lcov-report/prettify.css delete mode 100644 build/coverage/lcov-report/prettify.js delete mode 100644 build/coverage/lcov-report/sort-arrow-sprite.png delete mode 100644 build/coverage/lcov-report/sorter.js delete mode 100644 build/coverage/lcov.info delete mode 100644 build/game-lib-min.js delete mode 100644 build/game-lib.js diff --git a/build/coverage/coverage-final.json b/build/coverage/coverage-final.json deleted file mode 100644 index 6705917..0000000 --- a/build/coverage/coverage-final.json +++ /dev/null @@ -1,2 +0,0 @@ -{ -"/usr/share/gamewheel/game-lib/build/game-lib.js":{"path":"/usr/share/gamewheel/game-lib/build/game-lib.js","s":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":0,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":0,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":1,"43":1,"44":0,"45":1,"46":1,"47":0,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":0,"55":0,"56":1,"57":1,"58":1,"59":1,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":2,"73":2,"74":2,"75":2,"76":1,"77":2,"78":2,"79":1,"80":0,"81":1,"82":1,"83":0,"84":0,"85":1,"86":0,"87":1,"88":0,"89":1,"90":1,"91":1,"92":1,"93":0,"94":0,"95":0,"96":0,"97":1,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":0,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":0,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":1,"128":0,"129":0,"130":0,"131":0,"132":1,"133":0,"134":0,"135":0,"136":1,"137":0,"138":0,"139":0,"140":1,"141":0,"142":1,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0,"155":0,"156":0,"157":0,"158":0,"159":0,"160":0,"161":0,"162":0,"163":0,"164":0,"165":0,"166":0,"167":0,"168":0,"169":1,"170":0,"171":0,"172":1,"173":0,"174":0,"175":0,"176":0,"177":0,"178":1,"179":0,"180":0,"181":0,"182":0,"183":0,"184":0,"185":0,"186":0,"187":0,"188":0,"189":0,"190":0,"191":0,"192":1,"193":0,"194":0,"195":0,"196":0,"197":0,"198":0,"199":0,"200":0,"201":0,"202":0,"203":0,"204":0,"205":0,"206":1,"207":0,"208":0,"209":0,"210":1,"211":0,"212":1,"213":0,"214":1,"215":0,"216":0,"217":1,"218":0,"219":1,"220":0,"221":0,"222":0,"223":0,"224":0,"225":0,"226":0,"227":0,"228":0,"229":0,"230":0,"231":0,"232":0,"233":0,"234":0,"235":0,"236":0,"237":0,"238":0,"239":0,"240":0,"241":0,"242":0,"243":0,"244":0,"245":0,"246":0,"247":0,"248":0,"249":0,"250":1,"251":0,"252":0,"253":1,"254":1,"255":1,"256":1,"257":0,"258":1,"259":0,"260":0,"261":0,"262":1,"263":1,"264":0,"265":0,"266":0,"267":0,"268":0,"269":0,"270":0,"271":0,"272":0,"273":0,"274":0,"275":0,"276":0,"277":0,"278":0,"279":1,"280":0,"281":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"288":0,"289":0,"290":0,"291":0,"292":0,"293":0,"294":0,"295":0,"296":0,"297":0,"298":0,"299":0,"300":0,"301":0,"302":1,"303":0,"304":0,"305":0,"306":0,"307":0,"308":0,"309":0,"310":0,"311":0,"312":0,"313":0,"314":0,"315":0,"316":0,"317":0,"318":0,"319":0,"320":0,"321":0,"322":0,"323":0,"324":1,"325":0,"326":0,"327":0,"328":0,"329":0,"330":0,"331":0,"332":0,"333":0,"334":0,"335":0,"336":0,"337":0,"338":0,"339":0,"340":1,"341":0,"342":0,"343":0,"344":0,"345":0,"346":0,"347":0,"348":0,"349":0,"350":0,"351":0,"352":0,"353":0,"354":0,"355":0,"356":0,"357":0,"358":0,"359":0,"360":0,"361":0,"362":0,"363":0,"364":0,"365":0,"366":0,"367":0,"368":0,"369":0,"370":0,"371":0,"372":0,"373":0,"374":0,"375":0,"376":1,"377":0,"378":0,"379":0,"380":0,"381":0,"382":0,"383":0,"384":0,"385":0,"386":0,"387":0,"388":0,"389":0,"390":0,"391":0,"392":0,"393":0,"394":0,"395":0,"396":0,"397":0,"398":0,"399":0,"400":0,"401":0,"402":0,"403":0,"404":0,"405":0,"406":0,"407":0,"408":0,"409":0,"410":0,"411":0,"412":0,"413":0,"414":0,"415":0,"416":0,"417":0,"418":0,"419":0,"420":0,"421":0,"422":0,"423":0,"424":0,"425":0,"426":0,"427":0,"428":0,"429":0,"430":0,"431":0,"432":0,"433":0,"434":0,"435":0,"436":0,"437":0,"438":0,"439":0,"440":0,"441":0,"442":0,"443":0,"444":0,"445":0,"446":0,"447":0,"448":0,"449":0,"450":0,"451":0,"452":0,"453":0,"454":0,"455":0,"456":0,"457":0,"458":0,"459":0,"460":0,"461":0,"462":0,"463":0,"464":0,"465":0,"466":0,"467":0,"468":0,"469":0,"470":0,"471":0,"472":0,"473":0,"474":0,"475":0,"476":0,"477":0,"478":0,"479":0,"480":0,"481":0,"482":0,"483":0,"484":0,"485":0,"486":0,"487":0,"488":0,"489":0,"490":0,"491":0,"492":0,"493":0,"494":0,"495":0,"496":0,"497":0,"498":0,"499":0,"500":0,"501":0,"502":0,"503":0,"504":0,"505":0,"506":0,"507":0,"508":0,"509":0,"510":0,"511":0,"512":0,"513":0,"514":0,"515":0,"516":0,"517":0,"518":0,"519":0,"520":0,"521":0,"522":0,"523":0,"524":0,"525":0,"526":0,"527":0,"528":0,"529":0,"530":0,"531":0,"532":0,"533":0,"534":0,"535":0,"536":0,"537":0,"538":0,"539":0,"540":0,"541":0,"542":0,"543":0,"544":1,"545":1,"546":1,"547":1,"548":1,"549":1,"550":1,"551":1,"552":1,"553":1,"554":1,"555":1,"556":1,"557":1,"558":1,"559":1,"560":1,"561":1,"562":1,"563":1,"564":1,"565":1,"566":1,"567":1,"568":1,"569":1,"570":1,"571":1,"572":1,"573":1,"574":1,"575":1,"576":1,"577":1,"578":1,"579":1,"580":1,"581":1,"582":1,"583":1,"584":1,"585":1,"586":1,"587":1,"588":1,"589":1,"590":1,"591":1,"592":1,"593":1,"594":1,"595":1,"596":0,"597":0,"598":0,"599":0,"600":0,"601":0,"602":0,"603":0,"604":0,"605":0,"606":0,"607":0,"608":0,"609":0,"610":0,"611":0,"612":0,"613":0,"614":1,"615":0,"616":0,"617":0,"618":0,"619":0,"620":0,"621":0,"622":1,"623":0,"624":1,"625":0,"626":0,"627":0,"628":0,"629":0,"630":0,"631":0,"632":0,"633":0,"634":1,"635":0,"636":0,"637":0,"638":0,"639":1,"640":0,"641":0,"642":0,"643":0,"644":1,"645":0,"646":0,"647":0,"648":0,"649":1,"650":0,"651":0,"652":0,"653":1,"654":0,"655":0,"656":0,"657":1,"658":0,"659":0,"660":0,"661":1,"662":0,"663":0,"664":0,"665":0,"666":1,"667":0,"668":1,"669":0,"670":0,"671":0,"672":0,"673":0,"674":0,"675":0,"676":0,"677":0,"678":0,"679":0,"680":0,"681":0,"682":0,"683":0,"684":0,"685":0,"686":0,"687":0,"688":1,"689":0,"690":0,"691":0,"692":0,"693":0,"694":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"706":0,"707":0,"708":0,"709":0,"710":0,"711":0,"712":0,"713":0,"714":0,"715":0,"716":0,"717":0,"718":0,"719":0,"720":0,"721":0,"722":0,"723":0,"724":0,"725":0,"726":0,"727":0,"728":0,"729":1,"730":1,"731":1,"732":0,"733":0,"734":0,"735":0,"736":0,"737":0,"738":0,"739":0,"740":0,"741":0,"742":0,"743":0,"744":0,"745":0,"746":0,"747":0,"748":0,"749":0,"750":0,"751":0,"752":0,"753":0,"754":0,"755":0,"756":0,"757":0,"758":0,"759":0,"760":0,"761":0,"762":0,"763":0,"764":0,"765":0,"766":0,"767":0,"768":0,"769":0,"770":0,"771":0,"772":0,"773":0,"774":0,"775":0,"776":0,"777":0,"778":0,"779":0,"780":0,"781":0,"782":1,"783":0,"784":0,"785":0,"786":0,"787":0,"788":0,"789":0,"790":0,"791":1,"792":0,"793":0,"794":0,"795":0,"796":0,"797":0,"798":0,"799":0,"800":0,"801":0,"802":0,"803":0,"804":0,"805":0,"806":0,"807":0,"808":0,"809":0,"810":1,"811":1,"812":0,"813":0,"814":0,"815":0,"816":1,"817":0,"818":0,"819":0,"820":0,"821":0,"822":0,"823":0,"824":0,"825":0,"826":0,"827":0,"828":0,"829":0,"830":0,"831":0,"832":0,"833":0,"834":0,"835":0,"836":0,"837":0,"838":0,"839":0,"840":0,"841":0,"842":0,"843":0,"844":0,"845":0,"846":0,"847":0,"848":0,"849":0,"850":0,"851":1,"852":0,"853":0,"854":0,"855":0,"856":0,"857":0,"858":0,"859":0,"860":0,"861":0,"862":0,"863":0,"864":1,"865":0,"866":0,"867":0,"868":0,"869":0,"870":0,"871":1,"872":1,"873":1,"874":0,"875":0,"876":0,"877":0,"878":0,"879":1,"880":0,"881":1,"882":0,"883":0,"884":0,"885":0,"886":0,"887":0,"888":0,"889":0,"890":1,"891":0,"892":1,"893":0,"894":0,"895":1,"896":0,"897":1,"898":0,"899":0,"900":0,"901":0,"902":0,"903":0,"904":0,"905":0,"906":0,"907":0,"908":0,"909":0,"910":0,"911":0,"912":0,"913":0,"914":0,"915":0,"916":0,"917":0,"918":0,"919":0,"920":0,"921":0,"922":0,"923":0,"924":0,"925":0,"926":0,"927":0,"928":0,"929":0,"930":0,"931":0,"932":0,"933":0,"934":0,"935":0,"936":0,"937":0,"938":0,"939":0,"940":0,"941":0,"942":0,"943":0,"944":0,"945":0,"946":0,"947":0,"948":0,"949":0,"950":0,"951":0,"952":0,"953":0,"954":0,"955":0,"956":0,"957":0,"958":0,"959":0,"960":0,"961":0,"962":0,"963":0,"964":0,"965":0,"966":0,"967":0,"968":0,"969":0,"970":0,"971":0,"972":0,"973":0,"974":0,"975":0,"976":0,"977":0,"978":0,"979":0,"980":0,"981":0,"982":0,"983":1,"984":0,"985":1,"986":0,"987":0,"988":0,"989":0,"990":0,"991":0,"992":0,"993":0,"994":1,"995":0,"996":1,"997":0,"998":1,"999":0,"1000":0,"1001":1,"1002":0,"1003":0,"1004":0,"1005":0,"1006":0,"1007":0,"1008":0,"1009":0,"1010":0,"1011":0,"1012":0,"1013":0,"1014":0,"1015":0,"1016":0,"1017":0,"1018":0,"1019":0,"1020":0,"1021":1,"1022":0,"1023":0,"1024":0,"1025":1,"1026":0,"1027":0,"1028":0,"1029":0,"1030":0,"1031":1,"1032":0,"1033":0,"1034":0,"1035":0,"1036":0,"1037":1,"1038":1,"1039":1,"1040":1,"1041":1,"1042":1,"1043":0,"1044":1,"1045":1,"1046":1,"1047":1,"1048":1,"1049":1,"1050":1,"1051":1,"1052":1,"1053":1,"1054":1,"1055":1,"1056":1,"1057":1,"1058":1,"1059":1,"1060":1,"1061":1,"1062":1,"1063":1,"1064":1,"1065":1,"1066":1,"1067":1,"1068":1,"1069":1,"1070":1,"1071":1,"1072":1,"1073":1,"1074":1,"1075":0,"1076":0,"1077":0,"1078":0,"1079":0,"1080":0,"1081":0,"1082":0,"1083":0,"1084":0,"1085":0,"1086":0,"1087":0,"1088":0,"1089":0,"1090":0,"1091":0,"1092":0,"1093":0,"1094":0,"1095":0,"1096":0,"1097":0,"1098":0,"1099":0,"1100":0,"1101":0,"1102":0,"1103":0,"1104":0,"1105":0,"1106":0,"1107":0,"1108":0,"1109":0,"1110":0,"1111":0,"1112":0,"1113":0,"1114":0,"1115":0,"1116":1,"1117":0,"1118":0,"1119":0,"1120":0,"1121":0,"1122":0,"1123":0,"1124":0,"1125":0,"1126":0,"1127":0,"1128":0,"1129":0,"1130":0,"1131":0,"1132":0,"1133":0,"1134":0,"1135":0,"1136":0,"1137":0,"1138":0,"1139":0,"1140":0,"1141":0,"1142":0,"1143":0,"1144":0,"1145":0,"1146":0,"1147":0,"1148":0,"1149":0,"1150":0,"1151":0,"1152":0,"1153":0,"1154":0,"1155":0,"1156":0,"1157":0,"1158":0,"1159":0,"1160":0,"1161":0,"1162":0,"1163":0,"1164":0,"1165":0,"1166":0,"1167":0,"1168":0,"1169":0,"1170":0,"1171":0,"1172":0,"1173":0,"1174":0,"1175":0,"1176":0,"1177":0,"1178":0,"1179":0,"1180":0,"1181":0,"1182":0,"1183":0,"1184":0,"1185":0,"1186":0,"1187":0,"1188":0,"1189":0,"1190":0,"1191":0,"1192":0,"1193":0,"1194":0,"1195":0,"1196":0,"1197":0,"1198":0,"1199":0,"1200":0,"1201":0,"1202":0,"1203":0,"1204":0,"1205":0,"1206":0,"1207":0,"1208":0,"1209":0,"1210":0,"1211":0,"1212":0,"1213":0,"1214":0,"1215":0,"1216":0,"1217":0,"1218":0,"1219":0,"1220":0,"1221":0,"1222":0,"1223":1,"1224":0,"1225":0,"1226":0,"1227":0,"1228":0,"1229":0,"1230":0,"1231":0,"1232":0,"1233":0,"1234":0,"1235":0,"1236":0,"1237":0,"1238":0,"1239":0,"1240":0,"1241":0,"1242":0,"1243":0,"1244":0,"1245":0,"1246":0,"1247":0,"1248":0,"1249":0,"1250":0,"1251":0,"1252":0,"1253":0,"1254":0,"1255":0,"1256":0,"1257":0,"1258":1,"1259":1,"1260":1,"1261":1,"1262":1,"1263":1,"1264":1,"1265":0,"1266":0,"1267":0,"1268":0,"1269":0,"1270":0,"1271":0,"1272":0,"1273":0,"1274":0,"1275":0,"1276":0,"1277":0,"1278":0,"1279":0,"1280":0,"1281":0,"1282":0,"1283":1,"1284":0,"1285":0,"1286":0,"1287":0,"1288":0,"1289":0,"1290":0,"1291":0,"1292":1,"1293":0,"1294":0,"1295":0,"1296":0,"1297":0,"1298":0,"1299":0,"1300":0,"1301":0,"1302":0,"1303":0,"1304":0,"1305":0,"1306":0,"1307":0,"1308":0,"1309":0,"1310":0,"1311":0,"1312":0,"1313":0,"1314":0,"1315":1,"1316":0,"1317":0,"1318":0,"1319":0,"1320":1,"1321":0,"1322":0,"1323":0,"1324":0,"1325":0,"1326":0,"1327":0,"1328":0,"1329":0,"1330":0,"1331":0,"1332":0,"1333":0,"1334":0,"1335":0,"1336":0,"1337":0,"1338":0,"1339":0,"1340":1,"1341":0,"1342":0,"1343":0,"1344":0,"1345":0,"1346":0,"1347":0,"1348":1,"1349":0,"1350":0,"1351":0,"1352":0,"1353":0,"1354":0,"1355":0,"1356":0,"1357":0,"1358":0,"1359":0,"1360":1,"1361":1,"1362":1,"1363":0,"1364":0,"1365":0,"1366":0,"1367":0,"1368":0,"1369":0,"1370":0,"1371":0,"1372":0,"1373":0,"1374":0,"1375":0,"1376":0,"1377":0,"1378":0,"1379":0,"1380":0,"1381":0,"1382":0,"1383":0,"1384":0,"1385":0,"1386":0,"1387":0,"1388":0,"1389":0,"1390":0,"1391":0,"1392":0,"1393":0,"1394":0,"1395":0,"1396":0,"1397":0,"1398":0,"1399":0,"1400":0,"1401":0,"1402":0,"1403":0,"1404":0,"1405":0,"1406":0,"1407":0,"1408":0,"1409":0,"1410":0,"1411":0,"1412":0,"1413":0,"1414":0,"1415":0,"1416":0,"1417":1,"1418":1,"1419":1,"1420":1,"1421":1,"1422":1,"1423":1,"1424":1,"1425":1,"1426":1,"1427":1,"1428":1,"1429":1,"1430":1,"1431":1,"1432":1,"1433":1,"1434":1,"1435":1,"1436":1,"1437":1,"1438":1,"1439":1,"1440":1,"1441":1,"1442":1,"1443":1,"1444":1,"1445":1,"1446":1,"1447":1,"1448":1,"1449":1,"1450":1,"1451":1,"1452":1,"1453":1,"1454":1,"1455":1,"1456":1,"1457":0,"1458":0,"1459":0,"1460":0,"1461":0,"1462":0,"1463":0,"1464":0,"1465":0,"1466":0,"1467":0,"1468":0,"1469":0,"1470":0,"1471":0,"1472":0,"1473":0,"1474":0,"1475":0,"1476":0,"1477":0,"1478":0,"1479":0,"1480":0,"1481":0,"1482":0,"1483":0,"1484":0,"1485":0,"1486":0,"1487":0,"1488":0,"1489":1,"1490":0,"1491":0,"1492":0,"1493":0,"1494":0,"1495":0,"1496":0,"1497":0,"1498":0,"1499":0,"1500":0,"1501":0,"1502":0,"1503":0,"1504":0,"1505":0,"1506":0,"1507":0,"1508":0,"1509":0,"1510":0,"1511":0,"1512":0,"1513":0,"1514":0,"1515":0,"1516":0,"1517":0,"1518":0,"1519":0,"1520":0,"1521":0,"1522":0,"1523":1,"1524":1,"1525":1,"1526":1,"1527":0,"1528":0,"1529":1,"1530":0,"1531":0,"1532":0,"1533":0,"1534":0,"1535":0,"1536":0,"1537":0,"1538":0,"1539":0,"1540":0,"1541":0,"1542":0,"1543":0,"1544":0,"1545":0,"1546":0,"1547":0,"1548":0,"1549":1,"1550":0,"1551":1,"1552":0,"1553":1,"1554":0,"1555":0,"1556":0,"1557":0,"1558":0,"1559":0,"1560":1,"1561":0,"1562":1,"1563":0,"1564":1,"1565":7,"1566":7,"1567":7,"1568":7,"1569":2,"1570":7,"1571":3,"1572":7,"1573":2,"1574":1,"1575":0,"1576":0,"1577":0,"1578":0,"1579":0,"1580":0,"1581":0,"1582":1,"1583":0,"1584":1,"1585":0,"1586":0,"1587":0,"1588":0,"1589":1,"1590":0,"1591":0,"1592":0,"1593":0,"1594":1,"1595":0,"1596":0,"1597":0,"1598":1,"1599":0,"1600":0,"1601":1,"1602":0,"1603":0,"1604":0,"1605":0,"1606":1,"1607":0,"1608":1,"1609":0,"1610":1,"1611":0,"1612":0,"1613":0,"1614":0,"1615":0,"1616":0,"1617":0,"1618":0,"1619":0,"1620":0,"1621":0,"1622":0,"1623":0,"1624":0,"1625":1,"1626":0,"1627":1,"1628":0,"1629":0,"1630":0,"1631":0,"1632":0,"1633":0,"1634":0,"1635":0,"1636":0,"1637":1,"1638":2,"1639":2,"1640":2,"1641":2,"1642":2,"1643":0,"1644":2,"1645":0,"1646":2,"1647":0,"1648":2,"1649":0,"1650":1,"1651":0,"1652":0,"1653":0,"1654":0,"1655":1,"1656":0,"1657":1,"1658":0,"1659":0,"1660":0,"1661":0,"1662":0,"1663":0,"1664":0,"1665":0,"1666":0,"1667":0,"1668":0,"1669":0,"1670":0,"1671":0,"1672":0,"1673":1,"1674":0,"1675":0,"1676":0,"1677":0,"1678":0,"1679":0,"1680":0,"1681":0,"1682":0,"1683":1,"1684":0,"1685":0,"1686":0,"1687":0,"1688":0,"1689":0,"1690":0,"1691":0,"1692":0,"1693":0,"1694":1,"1695":0,"1696":1,"1697":0,"1698":0,"1699":0,"1700":0,"1701":0,"1702":0,"1703":0,"1704":1,"1705":0,"1706":0,"1707":0,"1708":0,"1709":1,"1710":0,"1711":0,"1712":0,"1713":0,"1714":0,"1715":0,"1716":0,"1717":0,"1718":0,"1719":0,"1720":0,"1721":0,"1722":0,"1723":0,"1724":0,"1725":0,"1726":0,"1727":1,"1728":0,"1729":0,"1730":0,"1731":0,"1732":0,"1733":0,"1734":0,"1735":0,"1736":0,"1737":0,"1738":0,"1739":0,"1740":0,"1741":0,"1742":0,"1743":0,"1744":0,"1745":1,"1746":0,"1747":0,"1748":0,"1749":0,"1750":0,"1751":0,"1752":0,"1753":0,"1754":0,"1755":0,"1756":0,"1757":1,"1758":0,"1759":0,"1760":0,"1761":0,"1762":0,"1763":0,"1764":0,"1765":0,"1766":0,"1767":0,"1768":0,"1769":0,"1770":0,"1771":0,"1772":0,"1773":0,"1774":0,"1775":0,"1776":0,"1777":0,"1778":1,"1779":0,"1780":0,"1781":0,"1782":0,"1783":0,"1784":0,"1785":0,"1786":0,"1787":1,"1788":0,"1789":0,"1790":0,"1791":0,"1792":0,"1793":1,"1794":0,"1795":0,"1796":0,"1797":1,"1798":0,"1799":0,"1800":1,"1801":0,"1802":0,"1803":0,"1804":0,"1805":0,"1806":0,"1807":0,"1808":0,"1809":0,"1810":0,"1811":0,"1812":0,"1813":0,"1814":0,"1815":0,"1816":0,"1817":0,"1818":1,"1819":0,"1820":0,"1821":0,"1822":0,"1823":0,"1824":0,"1825":0,"1826":0,"1827":1,"1828":0,"1829":1,"1830":0,"1831":1,"1832":0,"1833":0,"1834":0,"1835":0,"1836":0,"1837":0,"1838":0,"1839":0,"1840":1,"1841":0,"1842":0,"1843":0,"1844":1,"1845":0,"1846":0,"1847":0,"1848":0,"1849":0,"1850":0,"1851":0,"1852":0,"1853":0,"1854":0,"1855":0,"1856":0,"1857":0,"1858":0,"1859":0,"1860":0,"1861":0,"1862":0,"1863":0,"1864":0,"1865":0,"1866":0,"1867":0,"1868":0,"1869":0,"1870":0,"1871":0,"1872":0,"1873":1,"1874":0,"1875":0,"1876":0,"1877":0,"1878":0,"1879":0,"1880":0,"1881":0,"1882":0,"1883":0,"1884":0,"1885":0,"1886":0,"1887":0,"1888":0,"1889":0,"1890":0,"1891":0,"1892":0,"1893":0,"1894":0,"1895":0,"1896":0,"1897":0,"1898":0,"1899":0,"1900":0,"1901":0,"1902":0,"1903":0,"1904":1,"1905":0,"1906":0,"1907":0,"1908":0,"1909":0,"1910":0,"1911":0,"1912":0,"1913":0,"1914":0,"1915":0,"1916":0,"1917":0,"1918":0,"1919":0,"1920":0,"1921":0,"1922":0,"1923":0,"1924":0,"1925":0,"1926":0,"1927":0,"1928":0,"1929":0,"1930":0,"1931":0,"1932":0,"1933":0,"1934":0,"1935":0,"1936":0,"1937":0,"1938":0,"1939":0,"1940":0,"1941":0,"1942":0,"1943":0,"1944":0,"1945":0,"1946":0,"1947":0,"1948":0,"1949":0,"1950":1,"1951":0,"1952":0,"1953":0,"1954":0,"1955":0,"1956":0,"1957":0,"1958":0,"1959":0,"1960":0,"1961":0,"1962":0,"1963":0,"1964":0,"1965":0,"1966":0,"1967":0,"1968":0,"1969":0,"1970":0,"1971":0,"1972":0,"1973":0,"1974":0,"1975":0,"1976":0,"1977":0,"1978":0,"1979":0,"1980":0,"1981":0,"1982":0,"1983":0,"1984":0,"1985":0,"1986":0,"1987":0,"1988":0,"1989":0,"1990":0,"1991":0,"1992":1,"1993":0,"1994":0,"1995":0,"1996":0,"1997":0,"1998":0,"1999":0,"2000":0,"2001":0,"2002":0,"2003":0,"2004":0,"2005":0,"2006":0,"2007":0,"2008":0,"2009":0,"2010":0,"2011":0,"2012":0,"2013":0,"2014":0,"2015":0,"2016":0,"2017":0,"2018":0,"2019":0,"2020":0,"2021":0,"2022":0,"2023":0,"2024":0,"2025":0,"2026":0,"2027":0,"2028":0,"2029":0,"2030":0,"2031":0,"2032":0,"2033":0,"2034":0,"2035":0,"2036":0,"2037":0,"2038":0,"2039":0,"2040":0,"2041":0,"2042":0,"2043":0,"2044":0,"2045":0,"2046":0,"2047":0,"2048":0,"2049":0,"2050":0,"2051":0,"2052":0,"2053":0,"2054":0,"2055":0,"2056":0,"2057":0,"2058":0,"2059":0,"2060":0,"2061":0,"2062":0,"2063":0,"2064":0,"2065":0,"2066":0,"2067":0,"2068":0,"2069":0,"2070":0,"2071":0,"2072":0,"2073":1,"2074":1},"b":{"1":[0,1],"2":[1,0],"3":[1,0],"4":[0,1],"5":[0,1],"6":[1,0],"7":[1,0],"8":[1,0],"9":[1,0],"10":[1,0],"11":[1,0],"12":[0,1],"13":[0,1],"14":[0,1],"15":[1,0],"16":[0,1],"17":[1,0],"18":[0,0],"19":[0,0],"20":[0,1],"21":[0,0],"22":[0,0,0],"23":[0,0],"24":[0,0,0],"25":[0,0,0],"26":[0,0],"27":[0,0],"28":[0,0],"29":[0,0],"30":[0,0],"31":[0,0],"32":[0,0],"33":[0,0],"34":[0,0],"35":[0,0,0,0],"36":[0,0,0,0],"37":[0,0,0,0,0,0],"38":[0,0,0,0,0,0,0,0,0,0],"39":[0,0],"40":[0,0],"41":[0,0],"42":[0,0],"43":[0,0],"44":[0,0],"45":[0,0],"46":[0,0],"47":[0,0],"48":[0,0],"49":[0,0],"50":[0,0],"51":[0,0],"52":[0,0],"53":[0,0],"54":[0,0],"55":[0,0],"56":[0,0],"57":[0,0],"58":[0,0],"59":[0,0],"60":[0,0],"61":[0,0],"62":[0,0],"63":[0,0],"64":[0,0],"65":[0,0],"66":[0,0],"67":[0,0],"68":[0,0],"69":[0,0],"70":[0,0],"71":[0,0],"72":[0,0],"73":[0,0],"74":[0,0],"75":[0,0],"76":[0,0],"77":[0,0],"78":[0,0],"79":[0,0],"80":[0,0],"81":[0,0],"82":[0,0],"83":[0,0],"84":[0,0],"85":[0,0],"86":[0,0],"87":[0,0],"88":[0,0],"89":[0,0],"90":[0,0],"91":[0,0],"92":[0,0],"93":[0,0],"94":[0,0],"95":[0,0],"96":[0,0],"97":[0,0],"98":[0,0],"99":[0,0],"100":[0,0],"101":[0,0],"102":[0,0],"103":[0,0],"104":[0,0],"105":[0,0],"106":[0,0],"107":[0,0],"108":[0,0],"109":[0,0],"110":[0,0],"111":[0,0],"112":[0,0],"113":[0,0],"114":[0,0],"115":[0,0],"116":[0,0],"117":[0,0],"118":[0,0],"119":[0,0],"120":[0,0],"121":[0,0],"122":[0,0],"123":[0,0],"124":[0,0],"125":[0,0],"126":[0,0],"127":[0,0],"128":[0,0],"129":[0,0],"130":[0,0],"131":[0,0],"132":[0,0],"133":[0,0],"134":[0,0],"135":[0,0],"136":[0,0],"137":[0,0],"138":[0,0],"139":[0,0],"140":[0,0],"141":[0,0],"142":[0,0],"143":[0,0],"144":[0,0],"145":[0,0],"146":[0,0],"147":[0,0],"148":[0,0],"149":[0,0],"150":[0,0],"151":[0,0],"152":[0,0],"153":[0,0],"154":[0,0],"155":[0,0],"156":[0,0,0,0,0,0,0,0,0,0,0,0],"157":[0,0],"158":[0,0],"159":[0,0,0,0,0,0],"160":[0,0],"161":[0,0],"162":[0,0],"163":[0,0],"164":[0,0],"165":[0,0],"166":[0,0],"167":[0,0],"168":[0,0],"169":[0,0],"170":[0,0],"171":[0,0],"172":[0,0],"173":[0,0],"174":[0,0],"175":[0,0],"176":[0,0],"177":[0,0],"178":[0,0],"179":[0,0],"180":[0,0],"181":[0,0],"182":[0,0],"183":[0,0],"184":[0,0],"185":[0,0],"186":[0,0],"187":[0,0],"188":[0,0],"189":[0,0],"190":[0,0],"191":[0,0],"192":[0,0],"193":[0,0],"194":[0,0],"195":[0,0],"196":[0,0],"197":[0,0],"198":[0,0],"199":[0,0],"200":[0,0],"201":[0,0],"202":[0,0],"203":[0,0],"204":[0,0],"205":[0,0],"206":[0,0],"207":[0,0],"208":[0,0],"209":[0,0],"210":[0,0],"211":[0,0],"212":[0,0],"213":[0,1],"214":[1,0],"215":[1,0],"216":[1,0],"217":[1,0],"218":[1,0],"219":[1,0],"220":[1,0],"221":[1,0],"222":[1,0],"223":[1,0],"224":[0,0],"225":[0,0],"226":[0,0],"227":[0,0],"228":[0,0],"229":[0,0],"230":[0,0],"231":[0,0],"232":[0,0],"233":[0,0],"234":[0,0],"235":[0,0],"236":[0,0],"237":[0,0],"238":[0,0],"239":[0,0],"240":[0,0],"241":[0,0],"242":[0,0],"243":[0,0],"244":[0,0],"245":[0,0],"246":[0,0],"247":[0,0],"248":[0,0],"249":[0,0],"250":[0,0],"251":[0,0],"252":[0,0],"253":[0,0],"254":[0,0],"255":[0,0],"256":[0,0],"257":[0,0],"258":[0,0],"259":[0,0],"260":[0,0],"261":[0,0],"262":[0,0],"263":[0,0],"264":[0,0],"265":[0,0],"266":[0,0],"267":[0,0],"268":[0,0],"269":[0,0],"270":[0,0],"271":[0,0],"272":[0,0],"273":[0,0],"274":[0,0],"275":[0,0],"276":[0,0],"277":[0,0],"278":[0,0],"279":[0,0],"280":[0,0],"281":[0,0],"282":[0,0],"283":[0,0,0],"284":[0,0],"285":[0,0],"286":[0,0],"287":[0,0],"288":[0,0,0],"289":[0,0],"290":[0,0],"291":[0,0],"292":[0,0],"293":[0,0],"294":[0,0],"295":[0,0],"296":[0,0],"297":[0,0],"298":[0,0],"299":[0,0],"300":[0,0],"301":[0,0],"302":[0,0],"303":[0,0],"304":[0,0],"305":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"306":[0,0],"307":[0,0],"308":[0,0,0,0],"309":[2,5],"310":[3,4],"311":[2,5],"312":[0,0],"313":[0,0],"314":[0,0],"315":[0,0],"316":[0,0],"317":[0,2],"318":[0,2],"319":[0,2],"320":[0,2],"321":[0,0],"322":[0,0],"323":[0,0],"324":[0,0],"325":[0,0],"326":[0,0],"327":[0,0],"328":[0,0],"329":[0,0],"330":[0,0],"331":[0,0],"332":[0,0],"333":[0,0],"334":[0,0],"335":[0,0],"336":[0,0],"337":[0,0],"338":[0,0],"339":[0,0],"340":[0,0],"341":[0,0],"342":[0,0],"343":[0,0],"344":[0,0],"345":[0,0],"346":[0,0],"347":[0,0],"348":[0,0],"349":[0,0],"350":[0,0],"351":[0,0],"352":[0,0],"353":[0,0],"354":[0,0],"355":[0,0],"356":[0,0],"357":[0,0],"358":[0,0],"359":[0,0],"360":[0,0],"361":[0,0],"362":[0,0],"363":[0,0],"364":[0,0],"365":[0,0],"366":[0,0],"367":[0,0,0],"368":[0,0],"369":[0,0],"370":[0,0],"371":[0,0],"372":[0,0],"373":[0,0],"374":[0,0],"375":[0,0],"376":[0,0],"377":[0,0],"378":[1,0]},"f":{"1":0,"2":0,"3":1,"4":1,"5":1,"6":1,"7":2,"8":2,"9":0,"10":1,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":0,"67":0,"68":0,"69":0,"70":0,"71":0,"72":0,"73":0,"74":0,"75":0,"76":0,"77":0,"78":0,"79":0,"80":0,"81":1,"82":1,"83":0,"84":0,"85":0,"86":0,"87":0,"88":0,"89":0,"90":0,"91":0,"92":0,"93":0,"94":0,"95":0,"96":0,"97":0,"98":0,"99":0,"100":0,"101":0,"102":0,"103":0,"104":0,"105":0,"106":1,"107":0,"108":0,"109":0,"110":0,"111":0,"112":0,"113":0,"114":7,"115":0,"116":0,"117":0,"118":0,"119":0,"120":0,"121":0,"122":0,"123":0,"124":0,"125":0,"126":0,"127":2,"128":0,"129":0,"130":0,"131":0,"132":0,"133":0,"134":0,"135":0,"136":0,"137":0,"138":0,"139":0,"140":0,"141":0,"142":0,"143":0,"144":0,"145":0,"146":0,"147":0,"148":0,"149":0,"150":0,"151":0,"152":0,"153":0,"154":0},"fnMap":{"1":{"name":"GameLib","line":2,"loc":{"start":{"line":2,"column":4},"end":{"line":2,"column":23}}},"2":{"name":"(anonymous_2)","line":6,"loc":{"start":{"line":6,"column":17},"end":{"line":6,"column":27}}},"3":{"name":"(anonymous_3)","line":23,"loc":{"start":{"line":23,"column":24},"end":{"line":26,"column":2}}},"4":{"name":"(anonymous_4)","line":44,"loc":{"start":{"line":44,"column":18},"end":{"line":55,"column":2}}},"5":{"name":"(anonymous_5)","line":104,"loc":{"start":{"line":104,"column":24},"end":{"line":110,"column":2}}},"6":{"name":"(anonymous_6)","line":138,"loc":{"start":{"line":138,"column":49},"end":{"line":138,"column":60}}},"7":{"name":"(anonymous_7)","line":180,"loc":{"start":{"line":180,"column":19},"end":{"line":180,"column":40}}},"8":{"name":"(anonymous_8)","line":192,"loc":{"start":{"line":192,"column":20},"end":{"line":195,"column":2}}},"9":{"name":"(anonymous_9)","line":204,"loc":{"start":{"line":204,"column":39},"end":{"line":204,"column":50}}},"10":{"name":"(anonymous_10)","line":211,"loc":{"start":{"line":211,"column":47},"end":{"line":211,"column":58}}},"11":{"name":"(anonymous_11)","line":222,"loc":{"start":{"line":222,"column":37},"end":{"line":222,"column":48}}},"12":{"name":"(anonymous_12)","line":230,"loc":{"start":{"line":230,"column":39},"end":{"line":230,"column":50}}},"13":{"name":"(anonymous_13)","line":241,"loc":{"start":{"line":241,"column":20},"end":{"line":244,"column":2}}},"14":{"name":"(anonymous_14)","line":260,"loc":{"start":{"line":260,"column":25},"end":{"line":264,"column":2}}},"15":{"name":"(anonymous_15)","line":310,"loc":{"start":{"line":310,"column":48},"end":{"line":310,"column":64}}},"16":{"name":"(anonymous_16)","line":321,"loc":{"start":{"line":321,"column":47},"end":{"line":321,"column":63}}},"17":{"name":"(anonymous_17)","line":332,"loc":{"start":{"line":332,"column":45},"end":{"line":332,"column":61}}},"18":{"name":"(anonymous_18)","line":342,"loc":{"start":{"line":342,"column":49},"end":{"line":342,"column":60}}},"19":{"name":"(anonymous_19)","line":350,"loc":{"start":{"line":350,"column":52},"end":{"line":350,"column":72}}},"20":{"name":"(anonymous_20)","line":402,"loc":{"start":{"line":402,"column":42},"end":{"line":402,"column":62}}},"21":{"name":"(anonymous_21)","line":411,"loc":{"start":{"line":411,"column":47},"end":{"line":411,"column":66}}},"22":{"name":"(anonymous_22)","line":425,"loc":{"start":{"line":425,"column":45},"end":{"line":425,"column":64}}},"23":{"name":"(anonymous_23)","line":458,"loc":{"start":{"line":458,"column":43},"end":{"line":458,"column":62}}},"24":{"name":"(anonymous_24)","line":490,"loc":{"start":{"line":490,"column":18},"end":{"line":492,"column":2}}},"25":{"name":"(anonymous_25)","line":498,"loc":{"start":{"line":498,"column":37},"end":{"line":500,"column":2}}},"26":{"name":"(anonymous_26)","line":504,"loc":{"start":{"line":504,"column":44},"end":{"line":506,"column":2}}},"27":{"name":"(anonymous_27)","line":510,"loc":{"start":{"line":510,"column":52},"end":{"line":513,"column":2}}},"28":{"name":"(anonymous_28)","line":518,"loc":{"start":{"line":518,"column":53},"end":{"line":520,"column":2}}},"29":{"name":"(anonymous_29)","line":524,"loc":{"start":{"line":524,"column":43},"end":{"line":526,"column":2}}},"30":{"name":"(anonymous_30)","line":584,"loc":{"start":{"line":584,"column":37},"end":{"line":588,"column":2}}},"31":{"name":"(anonymous_31)","line":602,"loc":{"start":{"line":602,"column":22},"end":{"line":605,"column":2}}},"32":{"name":"(anonymous_32)","line":614,"loc":{"start":{"line":614,"column":40},"end":{"line":614,"column":51}}},"33":{"name":"(anonymous_33)","line":621,"loc":{"start":{"line":621,"column":48},"end":{"line":621,"column":59}}},"34":{"name":"(anonymous_34)","line":641,"loc":{"start":{"line":641,"column":23},"end":{"line":647,"column":2}}},"35":{"name":"(anonymous_35)","line":681,"loc":{"start":{"line":681,"column":44},"end":{"line":685,"column":2}}},"36":{"name":"(anonymous_36)","line":736,"loc":{"start":{"line":736,"column":54},"end":{"line":740,"column":2}}},"37":{"name":"(anonymous_37)","line":743,"loc":{"start":{"line":743,"column":17},"end":{"line":743,"column":29}}},"38":{"name":"(anonymous_38)","line":796,"loc":{"start":{"line":796,"column":19},"end":{"line":802,"column":2}}},"39":{"name":"(anonymous_39)","line":851,"loc":{"start":{"line":851,"column":19},"end":{"line":867,"column":2}}},"40":{"name":"(anonymous_40)","line":985,"loc":{"start":{"line":985,"column":22},"end":{"line":1043,"column":2}}},"41":{"name":"(anonymous_41)","line":1439,"loc":{"start":{"line":1439,"column":45},"end":{"line":1444,"column":2}}},"42":{"name":"(anonymous_42)","line":1603,"loc":{"start":{"line":1603,"column":12},"end":{"line":1603,"column":22}}},"43":{"name":"(anonymous_43)","line":1607,"loc":{"start":{"line":1607,"column":12},"end":{"line":1607,"column":27}}},"44":{"name":"(anonymous_44)","line":1625,"loc":{"start":{"line":1625,"column":21},"end":{"line":1629,"column":2}}},"45":{"name":"(anonymous_45)","line":1648,"loc":{"start":{"line":1648,"column":40},"end":{"line":1648,"column":52}}},"46":{"name":"(anonymous_46)","line":1655,"loc":{"start":{"line":1655,"column":21},"end":{"line":1660,"column":2}}},"47":{"name":"(anonymous_47)","line":1681,"loc":{"start":{"line":1681,"column":47},"end":{"line":1681,"column":66}}},"48":{"name":"(anonymous_48)","line":1688,"loc":{"start":{"line":1688,"column":47},"end":{"line":1688,"column":66}}},"49":{"name":"(anonymous_49)","line":1705,"loc":{"start":{"line":1705,"column":47},"end":{"line":1705,"column":66}}},"50":{"name":"(anonymous_50)","line":1712,"loc":{"start":{"line":1712,"column":39},"end":{"line":1712,"column":65}}},"51":{"name":"(anonymous_51)","line":1718,"loc":{"start":{"line":1718,"column":39},"end":{"line":1718,"column":65}}},"52":{"name":"(anonymous_52)","line":1724,"loc":{"start":{"line":1724,"column":39},"end":{"line":1724,"column":65}}},"53":{"name":"(anonymous_53)","line":1730,"loc":{"start":{"line":1730,"column":40},"end":{"line":1730,"column":55}}},"54":{"name":"(anonymous_54)","line":1747,"loc":{"start":{"line":1747,"column":40},"end":{"line":1747,"column":52}}},"55":{"name":"(anonymous_55)","line":1756,"loc":{"start":{"line":1756,"column":38},"end":{"line":1756,"column":70}}},"56":{"name":"(anonymous_56)","line":1852,"loc":{"start":{"line":1852,"column":18},"end":{"line":1872,"column":2}}},"57":{"name":"(anonymous_57)","line":1955,"loc":{"start":{"line":1955,"column":37},"end":{"line":1955,"column":105}}},"58":{"name":"(anonymous_58)","line":2070,"loc":{"start":{"line":2070,"column":42},"end":{"line":2070,"column":62}}},"59":{"name":"(anonymous_59)","line":2088,"loc":{"start":{"line":2088,"column":41},"end":{"line":2088,"column":67}}},"60":{"name":"(anonymous_60)","line":2173,"loc":{"start":{"line":2173,"column":29},"end":{"line":2173,"column":62}}},"61":{"name":"inProcessed","line":2181,"loc":{"start":{"line":2181,"column":4},"end":{"line":2181,"column":46}}},"62":{"name":"neighbourOnEdge","line":2199,"loc":{"start":{"line":2199,"column":4},"end":{"line":2199,"column":59}}},"63":{"name":"(anonymous_63)","line":2331,"loc":{"start":{"line":2331,"column":27},"end":{"line":2331,"column":57}}},"64":{"name":"(anonymous_64)","line":2375,"loc":{"start":{"line":2375,"column":21},"end":{"line":2380,"column":2}}},"65":{"name":"(anonymous_65)","line":2407,"loc":{"start":{"line":2407,"column":24},"end":{"line":2413,"column":2}}},"66":{"name":"(anonymous_66)","line":2425,"loc":{"start":{"line":2425,"column":40},"end":{"line":2425,"column":51}}},"67":{"name":"(anonymous_67)","line":2441,"loc":{"start":{"line":2441,"column":28},"end":{"line":2445,"column":2}}},"68":{"name":"(anonymous_68)","line":2465,"loc":{"start":{"line":2465,"column":53},"end":{"line":2465,"column":64}}},"69":{"name":"(anonymous_69)","line":2475,"loc":{"start":{"line":2475,"column":47},"end":{"line":2477,"column":2}}},"70":{"name":"(anonymous_70)","line":2487,"loc":{"start":{"line":2487,"column":51},"end":{"line":2487,"column":62}}},"71":{"name":"(anonymous_71)","line":2490,"loc":{"start":{"line":2490,"column":26},"end":{"line":2519,"column":2}}},"72":{"name":"(anonymous_72)","line":2663,"loc":{"start":{"line":2663,"column":51},"end":{"line":2663,"column":62}}},"73":{"name":"(anonymous_73)","line":2704,"loc":{"start":{"line":2704,"column":30},"end":{"line":2708,"column":2}}},"74":{"name":"(anonymous_74)","line":2727,"loc":{"start":{"line":2727,"column":53},"end":{"line":2727,"column":64}}},"75":{"name":"(anonymous_75)","line":2735,"loc":{"start":{"line":2735,"column":55},"end":{"line":2735,"column":66}}},"76":{"name":"(anonymous_76)","line":2745,"loc":{"start":{"line":2745,"column":49},"end":{"line":2745,"column":65}}},"77":{"name":"(anonymous_77)","line":2791,"loc":{"start":{"line":2791,"column":23},"end":{"line":2808,"column":2}}},"78":{"name":"(anonymous_78)","line":2837,"loc":{"start":{"line":2837,"column":48},"end":{"line":2837,"column":59}}},"79":{"name":"(anonymous_79)","line":2886,"loc":{"start":{"line":2886,"column":42},"end":{"line":2890,"column":2}}},"80":{"name":"(anonymous_80)","line":2925,"loc":{"start":{"line":2925,"column":24},"end":{"line":2930,"column":2}}},"81":{"name":"(anonymous_81)","line":2954,"loc":{"start":{"line":2954,"column":19},"end":{"line":2967,"column":2}}},"82":{"name":"(anonymous_82)","line":3031,"loc":{"start":{"line":3031,"column":36},"end":{"line":3038,"column":2}}},"83":{"name":"(anonymous_83)","line":3054,"loc":{"start":{"line":3054,"column":29},"end":{"line":3054,"column":43}}},"84":{"name":"(anonymous_84)","line":3055,"loc":{"start":{"line":3055,"column":15},"end":{"line":3055,"column":26}}},"85":{"name":"(anonymous_85)","line":3260,"loc":{"start":{"line":3260,"column":29},"end":{"line":3267,"column":2}}},"86":{"name":"(anonymous_86)","line":3427,"loc":{"start":{"line":3427,"column":12},"end":{"line":3427,"column":37}}},"87":{"name":"(anonymous_87)","line":3428,"loc":{"start":{"line":3428,"column":23},"end":{"line":3428,"column":43}}},"88":{"name":"(anonymous_88)","line":3465,"loc":{"start":{"line":3465,"column":16},"end":{"line":3465,"column":31}}},"89":{"name":"(anonymous_89)","line":3473,"loc":{"start":{"line":3473,"column":8},"end":{"line":3473,"column":32}}},"90":{"name":"(anonymous_90)","line":3562,"loc":{"start":{"line":3562,"column":8},"end":{"line":3562,"column":23}}},"91":{"name":"(anonymous_91)","line":3584,"loc":{"start":{"line":3584,"column":19},"end":{"line":3597,"column":2}}},"92":{"name":"(anonymous_92)","line":3672,"loc":{"start":{"line":3672,"column":44},"end":{"line":3672,"column":55}}},"93":{"name":"(anonymous_93)","line":3724,"loc":{"start":{"line":3724,"column":36},"end":{"line":3726,"column":2}}},"94":{"name":"(anonymous_94)","line":3757,"loc":{"start":{"line":3757,"column":22},"end":{"line":3766,"column":2}}},"95":{"name":"(anonymous_95)","line":3815,"loc":{"start":{"line":3815,"column":20},"end":{"line":3817,"column":2}}},"96":{"name":"(anonymous_96)","line":3826,"loc":{"start":{"line":3826,"column":35},"end":{"line":3828,"column":2}}},"97":{"name":"(anonymous_97)","line":3866,"loc":{"start":{"line":3866,"column":37},"end":{"line":3869,"column":2}}},"98":{"name":"(anonymous_98)","line":3894,"loc":{"start":{"line":3894,"column":28},"end":{"line":3900,"column":2}}},"99":{"name":"(anonymous_99)","line":3948,"loc":{"start":{"line":3948,"column":21},"end":{"line":3969,"column":2}}},"100":{"name":"(anonymous_100)","line":4139,"loc":{"start":{"line":4139,"column":29},"end":{"line":4146,"column":2}}},"101":{"name":"(anonymous_101)","line":4167,"loc":{"start":{"line":4167,"column":12},"end":{"line":4167,"column":30}}},"102":{"name":"(anonymous_102)","line":4196,"loc":{"start":{"line":4196,"column":12},"end":{"line":4196,"column":26}}},"103":{"name":"(anonymous_103)","line":4204,"loc":{"start":{"line":4204,"column":12},"end":{"line":4204,"column":28}}},"104":{"name":"(anonymous_104)","line":4231,"loc":{"start":{"line":4231,"column":30},"end":{"line":4238,"column":2}}},"105":{"name":"(anonymous_105)","line":4323,"loc":{"start":{"line":4323,"column":19},"end":{"line":4323,"column":29}}},"106":{"name":"(anonymous_106)","line":4330,"loc":{"start":{"line":4330,"column":28},"end":{"line":4330,"column":39}}},"107":{"name":"(anonymous_107)","line":4339,"loc":{"start":{"line":4339,"column":26},"end":{"line":4342,"column":2}}},"108":{"name":"(anonymous_108)","line":4361,"loc":{"start":{"line":4361,"column":26},"end":{"line":4373,"column":2}}},"109":{"name":"(anonymous_109)","line":4415,"loc":{"start":{"line":4415,"column":42},"end":{"line":4415,"column":52}}},"110":{"name":"(anonymous_110)","line":4432,"loc":{"start":{"line":4432,"column":43},"end":{"line":4432,"column":62}}},"111":{"name":"(anonymous_111)","line":4472,"loc":{"start":{"line":4472,"column":21},"end":{"line":4472,"column":36}}},"112":{"name":"(anonymous_112)","line":4486,"loc":{"start":{"line":4486,"column":36},"end":{"line":4486,"column":47}}},"113":{"name":"(anonymous_113)","line":4493,"loc":{"start":{"line":4493,"column":38},"end":{"line":4493,"column":50}}},"114":{"name":"(anonymous_114)","line":4500,"loc":{"start":{"line":4500,"column":21},"end":{"line":4500,"column":39}}},"115":{"name":"(anonymous_115)","line":4519,"loc":{"start":{"line":4519,"column":40},"end":{"line":4519,"column":53}}},"116":{"name":"(anonymous_116)","line":4534,"loc":{"start":{"line":4534,"column":37},"end":{"line":4534,"column":50}}},"117":{"name":"(anonymous_117)","line":4542,"loc":{"start":{"line":4542,"column":40},"end":{"line":4542,"column":52}}},"118":{"name":"(anonymous_118)","line":4549,"loc":{"start":{"line":4549,"column":31},"end":{"line":4549,"column":61}}},"119":{"name":"(anonymous_119)","line":4560,"loc":{"start":{"line":4560,"column":28},"end":{"line":4560,"column":47}}},"120":{"name":"(anonymous_120)","line":4566,"loc":{"start":{"line":4566,"column":38},"end":{"line":4566,"column":56}}},"121":{"name":"(anonymous_121)","line":4573,"loc":{"start":{"line":4573,"column":41},"end":{"line":4573,"column":54}}},"122":{"name":"(anonymous_122)","line":4580,"loc":{"start":{"line":4580,"column":39},"end":{"line":4580,"column":51}}},"123":{"name":"(anonymous_123)","line":4584,"loc":{"start":{"line":4584,"column":36},"end":{"line":4584,"column":48}}},"124":{"name":"(anonymous_124)","line":4592,"loc":{"start":{"line":4592,"column":40},"end":{"line":4592,"column":53}}},"125":{"name":"(anonymous_125)","line":4612,"loc":{"start":{"line":4612,"column":35},"end":{"line":4612,"column":48}}},"126":{"name":"(anonymous_126)","line":4616,"loc":{"start":{"line":4616,"column":41},"end":{"line":4616,"column":53}}},"127":{"name":"(anonymous_127)","line":4635,"loc":{"start":{"line":4635,"column":21},"end":{"line":4635,"column":42}}},"128":{"name":"(anonymous_128)","line":4659,"loc":{"start":{"line":4659,"column":41},"end":{"line":4659,"column":54}}},"129":{"name":"(anonymous_129)","line":4666,"loc":{"start":{"line":4666,"column":36},"end":{"line":4666,"column":48}}},"130":{"name":"(anonymous_130)","line":4675,"loc":{"start":{"line":4675,"column":40},"end":{"line":4675,"column":53}}},"131":{"name":"(anonymous_131)","line":4696,"loc":{"start":{"line":4696,"column":41},"end":{"line":4696,"column":53}}},"132":{"name":"(anonymous_132)","line":4716,"loc":{"start":{"line":4716,"column":40},"end":{"line":4716,"column":53}}},"133":{"name":"(anonymous_133)","line":4734,"loc":{"start":{"line":4734,"column":28},"end":{"line":4734,"column":40}}},"134":{"name":"(anonymous_134)","line":4738,"loc":{"start":{"line":4738,"column":42},"end":{"line":4738,"column":60}}},"135":{"name":"(anonymous_135)","line":4759,"loc":{"start":{"line":4759,"column":43},"end":{"line":4759,"column":55}}},"136":{"name":"(anonymous_136)","line":4770,"loc":{"start":{"line":4770,"column":56},"end":{"line":4770,"column":73}}},"137":{"name":"(anonymous_137)","line":4815,"loc":{"start":{"line":4815,"column":56},"end":{"line":4815,"column":73}}},"138":{"name":"(anonymous_138)","line":4860,"loc":{"start":{"line":4860,"column":45},"end":{"line":4860,"column":63}}},"139":{"name":"(anonymous_139)","line":4881,"loc":{"start":{"line":4881,"column":48},"end":{"line":4881,"column":60}}},"140":{"name":"(anonymous_140)","line":4920,"loc":{"start":{"line":4920,"column":46},"end":{"line":4920,"column":58}}},"141":{"name":"(anonymous_141)","line":4938,"loc":{"start":{"line":4938,"column":47},"end":{"line":4938,"column":59}}},"142":{"name":"(anonymous_142)","line":4950,"loc":{"start":{"line":4950,"column":47},"end":{"line":4950,"column":59}}},"143":{"name":"(anonymous_143)","line":4965,"loc":{"start":{"line":4965,"column":20},"end":{"line":4968,"column":2}}},"144":{"name":"(anonymous_144)","line":4983,"loc":{"start":{"line":4983,"column":19},"end":{"line":4991,"column":2}}},"145":{"name":"(anonymous_145)","line":5036,"loc":{"start":{"line":5036,"column":44},"end":{"line":5036,"column":55}}},"146":{"name":"(anonymous_146)","line":5058,"loc":{"start":{"line":5058,"column":42},"end":{"line":5060,"column":2}}},"147":{"name":"(anonymous_147)","line":5069,"loc":{"start":{"line":5069,"column":40},"end":{"line":5071,"column":2}}},"148":{"name":"(anonymous_148)","line":5075,"loc":{"start":{"line":5075,"column":34},"end":{"line":5077,"column":2}}},"149":{"name":"(anonymous_149)","line":5097,"loc":{"start":{"line":5097,"column":48},"end":{"line":5099,"column":2}}},"150":{"name":"(anonymous_150)","line":5125,"loc":{"start":{"line":5125,"column":63},"end":{"line":5132,"column":2}}},"151":{"name":"(anonymous_151)","line":5232,"loc":{"start":{"line":5232,"column":65},"end":{"line":5239,"column":2}}},"152":{"name":"(anonymous_152)","line":5330,"loc":{"start":{"line":5330,"column":62},"end":{"line":5338,"column":2}}},"153":{"name":"(anonymous_153)","line":5427,"loc":{"start":{"line":5427,"column":55},"end":{"line":5430,"column":2}}},"154":{"name":"(anonymous_154)","line":5528,"loc":{"start":{"line":5528,"column":52},"end":{"line":5536,"column":2}}}},"statementMap":{"1":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},"2":{"start":{"line":2,"column":4},"end":{"line":2,"column":25}},"3":{"start":{"line":5,"column":0},"end":{"line":7,"column":1}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":30}},"5":{"start":{"line":9,"column":0},"end":{"line":16,"column":1}},"6":{"start":{"line":10,"column":4},"end":{"line":13,"column":5}},"7":{"start":{"line":11,"column":8},"end":{"line":11,"column":74}},"8":{"start":{"line":12,"column":8},"end":{"line":12,"column":77}},"9":{"start":{"line":15,"column":4},"end":{"line":15,"column":25}},"10":{"start":{"line":23,"column":0},"end":{"line":29,"column":2}},"11":{"start":{"line":27,"column":4},"end":{"line":27,"column":31}},"12":{"start":{"line":28,"column":4},"end":{"line":28,"column":25}},"13":{"start":{"line":44,"column":0},"end":{"line":94,"column":2}},"14":{"start":{"line":56,"column":4},"end":{"line":56,"column":17}},"15":{"start":{"line":57,"column":4},"end":{"line":57,"column":21}},"16":{"start":{"line":58,"column":4},"end":{"line":58,"column":25}},"17":{"start":{"line":60,"column":4},"end":{"line":62,"column":5}},"18":{"start":{"line":61,"column":8},"end":{"line":61,"column":26}},"19":{"start":{"line":63,"column":4},"end":{"line":63,"column":37}},"20":{"start":{"line":65,"column":4},"end":{"line":67,"column":5}},"21":{"start":{"line":66,"column":8},"end":{"line":66,"column":28}},"22":{"start":{"line":68,"column":4},"end":{"line":68,"column":37}},"23":{"start":{"line":70,"column":4},"end":{"line":72,"column":5}},"24":{"start":{"line":71,"column":8},"end":{"line":71,"column":46}},"25":{"start":{"line":73,"column":4},"end":{"line":73,"column":33}},"26":{"start":{"line":75,"column":4},"end":{"line":77,"column":5}},"27":{"start":{"line":76,"column":8},"end":{"line":76,"column":49}},"28":{"start":{"line":78,"column":4},"end":{"line":78,"column":29}},"29":{"start":{"line":80,"column":4},"end":{"line":82,"column":5}},"30":{"start":{"line":81,"column":8},"end":{"line":81,"column":49}},"31":{"start":{"line":83,"column":4},"end":{"line":83,"column":29}},"32":{"start":{"line":85,"column":4},"end":{"line":87,"column":5}},"33":{"start":{"line":86,"column":8},"end":{"line":86,"column":46}},"34":{"start":{"line":88,"column":4},"end":{"line":88,"column":23}},"35":{"start":{"line":90,"column":4},"end":{"line":92,"column":5}},"36":{"start":{"line":91,"column":8},"end":{"line":91,"column":43}},"37":{"start":{"line":93,"column":4},"end":{"line":93,"column":17}},"38":{"start":{"line":104,"column":0},"end":{"line":133,"column":2}},"39":{"start":{"line":111,"column":4},"end":{"line":111,"column":17}},"40":{"start":{"line":113,"column":4},"end":{"line":115,"column":5}},"41":{"start":{"line":114,"column":8},"end":{"line":114,"column":46}},"42":{"start":{"line":116,"column":4},"end":{"line":116,"column":21}},"43":{"start":{"line":118,"column":4},"end":{"line":120,"column":5}},"44":{"start":{"line":119,"column":8},"end":{"line":119,"column":69}},"45":{"start":{"line":121,"column":4},"end":{"line":121,"column":41}},"46":{"start":{"line":123,"column":4},"end":{"line":125,"column":5}},"47":{"start":{"line":124,"column":8},"end":{"line":124,"column":22}},"48":{"start":{"line":126,"column":4},"end":{"line":126,"column":25}},"49":{"start":{"line":128,"column":4},"end":{"line":128,"column":25}},"50":{"start":{"line":130,"column":4},"end":{"line":132,"column":5}},"51":{"start":{"line":131,"column":8},"end":{"line":131,"column":30}},"52":{"start":{"line":138,"column":0},"end":{"line":163,"column":2}},"53":{"start":{"line":140,"column":4},"end":{"line":143,"column":5}},"54":{"start":{"line":141,"column":8},"end":{"line":141,"column":34}},"55":{"start":{"line":142,"column":8},"end":{"line":142,"column":37}},"56":{"start":{"line":145,"column":4},"end":{"line":145,"column":35}},"57":{"start":{"line":147,"column":4},"end":{"line":147,"column":24}},"58":{"start":{"line":149,"column":4},"end":{"line":158,"column":5}},"59":{"start":{"line":150,"column":8},"end":{"line":150,"column":62}},"60":{"start":{"line":151,"column":11},"end":{"line":158,"column":5}},"61":{"start":{"line":152,"column":8},"end":{"line":152,"column":61}},"62":{"start":{"line":153,"column":11},"end":{"line":158,"column":5}},"63":{"start":{"line":154,"column":8},"end":{"line":154,"column":61}},"64":{"start":{"line":156,"column":8},"end":{"line":156,"column":76}},"65":{"start":{"line":157,"column":8},"end":{"line":157,"column":79}},"66":{"start":{"line":160,"column":4},"end":{"line":160,"column":29}},"67":{"start":{"line":162,"column":4},"end":{"line":162,"column":20}},"68":{"start":{"line":169,"column":0},"end":{"line":169,"column":50}},"69":{"start":{"line":170,"column":0},"end":{"line":170,"column":49}},"70":{"start":{"line":171,"column":0},"end":{"line":171,"column":48}},"71":{"start":{"line":180,"column":0},"end":{"line":185,"column":2}},"72":{"start":{"line":181,"column":4},"end":{"line":181,"column":15}},"73":{"start":{"line":182,"column":4},"end":{"line":182,"column":15}},"74":{"start":{"line":183,"column":4},"end":{"line":183,"column":15}},"75":{"start":{"line":184,"column":4},"end":{"line":184,"column":15}},"76":{"start":{"line":192,"column":0},"end":{"line":198,"column":2}},"77":{"start":{"line":196,"column":4},"end":{"line":196,"column":33}},"78":{"start":{"line":197,"column":4},"end":{"line":197,"column":29}},"79":{"start":{"line":204,"column":0},"end":{"line":206,"column":2}},"80":{"start":{"line":205,"column":4},"end":{"line":205,"column":68}},"81":{"start":{"line":211,"column":0},"end":{"line":216,"column":2}},"82":{"start":{"line":212,"column":4},"end":{"line":215,"column":5}},"83":{"start":{"line":213,"column":8},"end":{"line":213,"column":64}},"84":{"start":{"line":214,"column":8},"end":{"line":214,"column":67}},"85":{"start":{"line":222,"column":0},"end":{"line":224,"column":2}},"86":{"start":{"line":223,"column":4},"end":{"line":223,"column":66}},"87":{"start":{"line":230,"column":0},"end":{"line":232,"column":2}},"88":{"start":{"line":231,"column":4},"end":{"line":231,"column":68}},"89":{"start":{"line":238,"column":0},"end":{"line":238,"column":43}},"90":{"start":{"line":239,"column":0},"end":{"line":239,"column":41}},"91":{"start":{"line":240,"column":0},"end":{"line":240,"column":43}},"92":{"start":{"line":241,"column":0},"end":{"line":252,"column":2}},"93":{"start":{"line":245,"column":4},"end":{"line":245,"column":25}},"94":{"start":{"line":247,"column":4},"end":{"line":249,"column":5}},"95":{"start":{"line":248,"column":8},"end":{"line":248,"column":26}},"96":{"start":{"line":251,"column":4},"end":{"line":251,"column":37}},"97":{"start":{"line":260,"column":0},"end":{"line":304,"column":2}},"98":{"start":{"line":265,"column":4},"end":{"line":265,"column":24}},"99":{"start":{"line":267,"column":4},"end":{"line":267,"column":25}},"100":{"start":{"line":269,"column":4},"end":{"line":269,"column":23}},"101":{"start":{"line":271,"column":4},"end":{"line":271,"column":17}},"102":{"start":{"line":272,"column":4},"end":{"line":272,"column":19}},"103":{"start":{"line":273,"column":4},"end":{"line":273,"column":27}},"104":{"start":{"line":275,"column":4},"end":{"line":275,"column":29}},"105":{"start":{"line":276,"column":4},"end":{"line":276,"column":30}},"106":{"start":{"line":277,"column":4},"end":{"line":277,"column":26}},"107":{"start":{"line":278,"column":4},"end":{"line":278,"column":27}},"108":{"start":{"line":279,"column":4},"end":{"line":279,"column":24}},"109":{"start":{"line":280,"column":4},"end":{"line":280,"column":26}},"110":{"start":{"line":282,"column":4},"end":{"line":282,"column":53}},"111":{"start":{"line":283,"column":4},"end":{"line":283,"column":57}},"112":{"start":{"line":284,"column":4},"end":{"line":284,"column":57}},"113":{"start":{"line":285,"column":4},"end":{"line":285,"column":59}},"114":{"start":{"line":286,"column":4},"end":{"line":286,"column":53}},"115":{"start":{"line":287,"column":4},"end":{"line":287,"column":49}},"116":{"start":{"line":289,"column":4},"end":{"line":289,"column":25}},"117":{"start":{"line":291,"column":4},"end":{"line":291,"column":73}},"118":{"start":{"line":292,"column":4},"end":{"line":292,"column":69}},"119":{"start":{"line":293,"column":4},"end":{"line":293,"column":77}},"120":{"start":{"line":294,"column":4},"end":{"line":294,"column":73}},"121":{"start":{"line":295,"column":4},"end":{"line":295,"column":79}},"122":{"start":{"line":297,"column":4},"end":{"line":297,"column":141}},"123":{"start":{"line":298,"column":4},"end":{"line":298,"column":33}},"124":{"start":{"line":300,"column":4},"end":{"line":303,"column":5}},"125":{"start":{"line":301,"column":8},"end":{"line":301,"column":153}},"126":{"start":{"line":302,"column":8},"end":{"line":302,"column":125}},"127":{"start":{"line":310,"column":0},"end":{"line":315,"column":2}},"128":{"start":{"line":311,"column":4},"end":{"line":311,"column":28}},"129":{"start":{"line":312,"column":4},"end":{"line":312,"column":52}},"130":{"start":{"line":313,"column":4},"end":{"line":313,"column":27}},"131":{"start":{"line":314,"column":4},"end":{"line":314,"column":29}},"132":{"start":{"line":321,"column":0},"end":{"line":326,"column":2}},"133":{"start":{"line":322,"column":4},"end":{"line":325,"column":5}},"134":{"start":{"line":323,"column":8},"end":{"line":323,"column":30}},"135":{"start":{"line":324,"column":8},"end":{"line":324,"column":81}},"136":{"start":{"line":332,"column":0},"end":{"line":337,"column":2}},"137":{"start":{"line":333,"column":4},"end":{"line":336,"column":5}},"138":{"start":{"line":334,"column":8},"end":{"line":334,"column":31}},"139":{"start":{"line":335,"column":8},"end":{"line":335,"column":77}},"140":{"start":{"line":342,"column":0},"end":{"line":344,"column":2}},"141":{"start":{"line":343,"column":4},"end":{"line":343,"column":61}},"142":{"start":{"line":350,"column":0},"end":{"line":395,"column":2}},"143":{"start":{"line":351,"column":4},"end":{"line":351,"column":53}},"144":{"start":{"line":352,"column":4},"end":{"line":352,"column":56}},"145":{"start":{"line":353,"column":4},"end":{"line":353,"column":49}},"146":{"start":{"line":355,"column":4},"end":{"line":355,"column":47}},"147":{"start":{"line":357,"column":4},"end":{"line":357,"column":40}},"148":{"start":{"line":358,"column":4},"end":{"line":358,"column":63}},"149":{"start":{"line":360,"column":4},"end":{"line":371,"column":5}},"150":{"start":{"line":362,"column":8},"end":{"line":362,"column":74}},"151":{"start":{"line":363,"column":8},"end":{"line":363,"column":74}},"152":{"start":{"line":364,"column":8},"end":{"line":364,"column":74}},"153":{"start":{"line":366,"column":11},"end":{"line":371,"column":5}},"154":{"start":{"line":368,"column":8},"end":{"line":368,"column":74}},"155":{"start":{"line":369,"column":8},"end":{"line":369,"column":74}},"156":{"start":{"line":370,"column":8},"end":{"line":370,"column":74}},"157":{"start":{"line":373,"column":4},"end":{"line":384,"column":5}},"158":{"start":{"line":375,"column":8},"end":{"line":375,"column":72}},"159":{"start":{"line":376,"column":8},"end":{"line":376,"column":72}},"160":{"start":{"line":377,"column":8},"end":{"line":377,"column":72}},"161":{"start":{"line":379,"column":11},"end":{"line":384,"column":5}},"162":{"start":{"line":381,"column":8},"end":{"line":381,"column":72}},"163":{"start":{"line":382,"column":8},"end":{"line":382,"column":72}},"164":{"start":{"line":383,"column":8},"end":{"line":383,"column":72}},"165":{"start":{"line":386,"column":4},"end":{"line":394,"column":5}},"166":{"start":{"line":388,"column":8},"end":{"line":388,"column":62}},"167":{"start":{"line":390,"column":11},"end":{"line":394,"column":5}},"168":{"start":{"line":392,"column":8},"end":{"line":392,"column":62}},"169":{"start":{"line":402,"column":0},"end":{"line":405,"column":2}},"170":{"start":{"line":403,"column":4},"end":{"line":403,"column":25}},"171":{"start":{"line":404,"column":4},"end":{"line":404,"column":37}},"172":{"start":{"line":411,"column":0},"end":{"line":419,"column":2}},"173":{"start":{"line":412,"column":4},"end":{"line":418,"column":5}},"174":{"start":{"line":413,"column":8},"end":{"line":413,"column":92}},"175":{"start":{"line":414,"column":8},"end":{"line":414,"column":92}},"176":{"start":{"line":416,"column":8},"end":{"line":416,"column":38}},"177":{"start":{"line":417,"column":8},"end":{"line":417,"column":40}},"178":{"start":{"line":425,"column":0},"end":{"line":452,"column":2}},"179":{"start":{"line":426,"column":4},"end":{"line":451,"column":5}},"180":{"start":{"line":429,"column":12},"end":{"line":429,"column":36}},"181":{"start":{"line":430,"column":12},"end":{"line":430,"column":18}},"182":{"start":{"line":433,"column":12},"end":{"line":433,"column":33}},"183":{"start":{"line":434,"column":12},"end":{"line":434,"column":18}},"184":{"start":{"line":437,"column":12},"end":{"line":437,"column":37}},"185":{"start":{"line":438,"column":12},"end":{"line":438,"column":18}},"186":{"start":{"line":441,"column":12},"end":{"line":441,"column":34}},"187":{"start":{"line":442,"column":12},"end":{"line":442,"column":18}},"188":{"start":{"line":445,"column":12},"end":{"line":445,"column":31}},"189":{"start":{"line":446,"column":12},"end":{"line":446,"column":18}},"190":{"start":{"line":449,"column":12},"end":{"line":449,"column":33}},"191":{"start":{"line":450,"column":12},"end":{"line":450,"column":18}},"192":{"start":{"line":458,"column":0},"end":{"line":489,"column":2}},"193":{"start":{"line":459,"column":4},"end":{"line":488,"column":5}},"194":{"start":{"line":463,"column":12},"end":{"line":463,"column":37}},"195":{"start":{"line":464,"column":12},"end":{"line":464,"column":18}},"196":{"start":{"line":468,"column":12},"end":{"line":468,"column":34}},"197":{"start":{"line":469,"column":12},"end":{"line":469,"column":18}},"198":{"start":{"line":473,"column":12},"end":{"line":473,"column":38}},"199":{"start":{"line":474,"column":12},"end":{"line":474,"column":18}},"200":{"start":{"line":478,"column":12},"end":{"line":478,"column":35}},"201":{"start":{"line":479,"column":12},"end":{"line":479,"column":18}},"202":{"start":{"line":482,"column":12},"end":{"line":482,"column":32}},"203":{"start":{"line":483,"column":12},"end":{"line":483,"column":18}},"204":{"start":{"line":486,"column":12},"end":{"line":486,"column":34}},"205":{"start":{"line":487,"column":12},"end":{"line":487,"column":18}},"206":{"start":{"line":490,"column":0},"end":{"line":496,"column":2}},"207":{"start":{"line":493,"column":4},"end":{"line":493,"column":21}},"208":{"start":{"line":494,"column":4},"end":{"line":494,"column":28}},"209":{"start":{"line":495,"column":4},"end":{"line":495,"column":38}},"210":{"start":{"line":498,"column":0},"end":{"line":502,"column":2}},"211":{"start":{"line":501,"column":4},"end":{"line":501,"column":36}},"212":{"start":{"line":504,"column":0},"end":{"line":508,"column":2}},"213":{"start":{"line":507,"column":4},"end":{"line":507,"column":42}},"214":{"start":{"line":510,"column":0},"end":{"line":516,"column":2}},"215":{"start":{"line":514,"column":4},"end":{"line":514,"column":94}},"216":{"start":{"line":515,"column":4},"end":{"line":515,"column":64}},"217":{"start":{"line":518,"column":0},"end":{"line":522,"column":2}},"218":{"start":{"line":521,"column":4},"end":{"line":521,"column":52}},"219":{"start":{"line":524,"column":0},"end":{"line":582,"column":2}},"220":{"start":{"line":527,"column":4},"end":{"line":581,"column":5}},"221":{"start":{"line":529,"column":8},"end":{"line":529,"column":64}},"222":{"start":{"line":530,"column":8},"end":{"line":530,"column":35}},"223":{"start":{"line":532,"column":8},"end":{"line":579,"column":9}},"224":{"start":{"line":534,"column":12},"end":{"line":578,"column":13}},"225":{"start":{"line":536,"column":16},"end":{"line":536,"column":56}},"226":{"start":{"line":537,"column":16},"end":{"line":537,"column":44}},"227":{"start":{"line":539,"column":16},"end":{"line":577,"column":17}},"228":{"start":{"line":540,"column":20},"end":{"line":540,"column":59}},"229":{"start":{"line":541,"column":20},"end":{"line":541,"column":46}},"230":{"start":{"line":542,"column":20},"end":{"line":542,"column":48}},"231":{"start":{"line":544,"column":20},"end":{"line":576,"column":21}},"232":{"start":{"line":545,"column":24},"end":{"line":575,"column":25}},"233":{"start":{"line":547,"column":28},"end":{"line":547,"column":68}},"234":{"start":{"line":548,"column":28},"end":{"line":548,"column":79}},"235":{"start":{"line":550,"column":28},"end":{"line":550,"column":68}},"236":{"start":{"line":552,"column":28},"end":{"line":552,"column":63}},"237":{"start":{"line":553,"column":28},"end":{"line":553,"column":75}},"238":{"start":{"line":555,"column":28},"end":{"line":571,"column":29}},"239":{"start":{"line":557,"column":32},"end":{"line":570,"column":33}},"240":{"start":{"line":558,"column":36},"end":{"line":562,"column":37}},"241":{"start":{"line":559,"column":40},"end":{"line":559,"column":86}},"242":{"start":{"line":560,"column":40},"end":{"line":560,"column":96}},"243":{"start":{"line":561,"column":40},"end":{"line":561,"column":103}},"244":{"start":{"line":564,"column":36},"end":{"line":569,"column":37}},"245":{"start":{"line":565,"column":40},"end":{"line":565,"column":81}},"246":{"start":{"line":566,"column":40},"end":{"line":566,"column":92}},"247":{"start":{"line":568,"column":40},"end":{"line":568,"column":112}},"248":{"start":{"line":573,"column":28},"end":{"line":573,"column":57}},"249":{"start":{"line":574,"column":28},"end":{"line":574,"column":61}},"250":{"start":{"line":584,"column":0},"end":{"line":595,"column":2}},"251":{"start":{"line":589,"column":4},"end":{"line":589,"column":62}},"252":{"start":{"line":591,"column":4},"end":{"line":594,"column":7}},"253":{"start":{"line":602,"column":0},"end":{"line":608,"column":2}},"254":{"start":{"line":606,"column":4},"end":{"line":606,"column":37}},"255":{"start":{"line":607,"column":4},"end":{"line":607,"column":29}},"256":{"start":{"line":614,"column":0},"end":{"line":616,"column":2}},"257":{"start":{"line":615,"column":4},"end":{"line":615,"column":73}},"258":{"start":{"line":621,"column":0},"end":{"line":626,"column":2}},"259":{"start":{"line":622,"column":4},"end":{"line":625,"column":5}},"260":{"start":{"line":623,"column":8},"end":{"line":623,"column":63}},"261":{"start":{"line":624,"column":8},"end":{"line":624,"column":66}},"262":{"start":{"line":632,"column":0},"end":{"line":632,"column":46}},"263":{"start":{"line":641,"column":0},"end":{"line":672,"column":2}},"264":{"start":{"line":648,"column":4},"end":{"line":650,"column":5}},"265":{"start":{"line":649,"column":8},"end":{"line":649,"column":18}},"266":{"start":{"line":651,"column":4},"end":{"line":651,"column":23}},"267":{"start":{"line":653,"column":4},"end":{"line":655,"column":5}},"268":{"start":{"line":654,"column":8},"end":{"line":654,"column":18}},"269":{"start":{"line":656,"column":4},"end":{"line":656,"column":23}},"270":{"start":{"line":658,"column":4},"end":{"line":660,"column":5}},"271":{"start":{"line":659,"column":8},"end":{"line":659,"column":20}},"272":{"start":{"line":661,"column":4},"end":{"line":661,"column":25}},"273":{"start":{"line":663,"column":4},"end":{"line":665,"column":5}},"274":{"start":{"line":664,"column":8},"end":{"line":664,"column":25}},"275":{"start":{"line":666,"column":4},"end":{"line":666,"column":35}},"276":{"start":{"line":668,"column":4},"end":{"line":670,"column":5}},"277":{"start":{"line":669,"column":8},"end":{"line":669,"column":25}},"278":{"start":{"line":671,"column":4},"end":{"line":671,"column":35}},"279":{"start":{"line":681,"column":0},"end":{"line":727,"column":2}},"280":{"start":{"line":686,"column":4},"end":{"line":686,"column":31}},"281":{"start":{"line":687,"column":4},"end":{"line":687,"column":30}},"282":{"start":{"line":689,"column":4},"end":{"line":689,"column":52}},"283":{"start":{"line":691,"column":4},"end":{"line":691,"column":40}},"284":{"start":{"line":692,"column":4},"end":{"line":692,"column":40}},"285":{"start":{"line":693,"column":4},"end":{"line":693,"column":40}},"286":{"start":{"line":695,"column":5},"end":{"line":714,"column":5}},"287":{"start":{"line":696,"column":8},"end":{"line":713,"column":9}},"288":{"start":{"line":697,"column":12},"end":{"line":712,"column":13}},"289":{"start":{"line":698,"column":16},"end":{"line":698,"column":70}},"290":{"start":{"line":699,"column":16},"end":{"line":699,"column":65}},"291":{"start":{"line":700,"column":16},"end":{"line":700,"column":65}},"292":{"start":{"line":701,"column":16},"end":{"line":701,"column":65}},"293":{"start":{"line":702,"column":16},"end":{"line":702,"column":57}},"294":{"start":{"line":703,"column":16},"end":{"line":703,"column":57}},"295":{"start":{"line":704,"column":16},"end":{"line":704,"column":57}},"296":{"start":{"line":705,"column":16},"end":{"line":709,"column":18}},"297":{"start":{"line":710,"column":16},"end":{"line":710,"column":53}},"298":{"start":{"line":711,"column":16},"end":{"line":711,"column":78}},"299":{"start":{"line":715,"column":4},"end":{"line":715,"column":37}},"300":{"start":{"line":716,"column":4},"end":{"line":716,"column":34}},"301":{"start":{"line":718,"column":4},"end":{"line":726,"column":6}},"302":{"start":{"line":736,"column":0},"end":{"line":786,"column":2}},"303":{"start":{"line":741,"column":4},"end":{"line":741,"column":26}},"304":{"start":{"line":743,"column":4},"end":{"line":783,"column":6}},"305":{"start":{"line":745,"column":8},"end":{"line":745,"column":54}},"306":{"start":{"line":746,"column":8},"end":{"line":746,"column":33}},"307":{"start":{"line":747,"column":8},"end":{"line":747,"column":35}},"308":{"start":{"line":749,"column":8},"end":{"line":749,"column":46}},"309":{"start":{"line":750,"column":8},"end":{"line":750,"column":37}},"310":{"start":{"line":752,"column":8},"end":{"line":752,"column":69}},"311":{"start":{"line":753,"column":8},"end":{"line":753,"column":31}},"312":{"start":{"line":755,"column":8},"end":{"line":755,"column":28}},"313":{"start":{"line":756,"column":8},"end":{"line":758,"column":9}},"314":{"start":{"line":757,"column":12},"end":{"line":757,"column":39}},"315":{"start":{"line":760,"column":8},"end":{"line":760,"column":24}},"316":{"start":{"line":761,"column":8},"end":{"line":762,"column":31}},"317":{"start":{"line":764,"column":8},"end":{"line":770,"column":9}},"318":{"start":{"line":765,"column":12},"end":{"line":765,"column":28}},"319":{"start":{"line":766,"column":12},"end":{"line":769,"column":13}},"320":{"start":{"line":767,"column":16},"end":{"line":767,"column":87}},"321":{"start":{"line":768,"column":16},"end":{"line":768,"column":39}},"322":{"start":{"line":774,"column":8},"end":{"line":782,"column":10}},"323":{"start":{"line":785,"column":4},"end":{"line":785,"column":24}},"324":{"start":{"line":796,"column":0},"end":{"line":831,"column":2}},"325":{"start":{"line":803,"column":4},"end":{"line":803,"column":17}},"326":{"start":{"line":805,"column":4},"end":{"line":805,"column":29}},"327":{"start":{"line":807,"column":4},"end":{"line":807,"column":35}},"328":{"start":{"line":809,"column":4},"end":{"line":811,"column":5}},"329":{"start":{"line":810,"column":8},"end":{"line":810,"column":17}},"330":{"start":{"line":812,"column":4},"end":{"line":812,"column":21}},"331":{"start":{"line":814,"column":4},"end":{"line":829,"column":5}},"332":{"start":{"line":816,"column":8},"end":{"line":816,"column":49}},"333":{"start":{"line":818,"column":8},"end":{"line":820,"column":9}},"334":{"start":{"line":819,"column":12},"end":{"line":819,"column":38}},"335":{"start":{"line":822,"column":8},"end":{"line":824,"column":9}},"336":{"start":{"line":823,"column":12},"end":{"line":823,"column":39}},"337":{"start":{"line":826,"column":8},"end":{"line":828,"column":9}},"338":{"start":{"line":827,"column":12},"end":{"line":827,"column":38}},"339":{"start":{"line":830,"column":4},"end":{"line":830,"column":35}},"340":{"start":{"line":851,"column":0},"end":{"line":923,"column":2}},"341":{"start":{"line":868,"column":4},"end":{"line":868,"column":17}},"342":{"start":{"line":869,"column":4},"end":{"line":869,"column":31}},"343":{"start":{"line":870,"column":4},"end":{"line":870,"column":21}},"344":{"start":{"line":871,"column":4},"end":{"line":871,"column":23}},"345":{"start":{"line":872,"column":4},"end":{"line":872,"column":31}},"346":{"start":{"line":874,"column":4},"end":{"line":876,"column":5}},"347":{"start":{"line":875,"column":8},"end":{"line":875,"column":49}},"348":{"start":{"line":877,"column":4},"end":{"line":877,"column":29}},"349":{"start":{"line":879,"column":4},"end":{"line":881,"column":5}},"350":{"start":{"line":880,"column":8},"end":{"line":880,"column":55}},"351":{"start":{"line":882,"column":4},"end":{"line":882,"column":41}},"352":{"start":{"line":884,"column":4},"end":{"line":886,"column":5}},"353":{"start":{"line":885,"column":8},"end":{"line":885,"column":46}},"354":{"start":{"line":887,"column":4},"end":{"line":887,"column":33}},"355":{"start":{"line":889,"column":4},"end":{"line":891,"column":5}},"356":{"start":{"line":890,"column":8},"end":{"line":890,"column":49}},"357":{"start":{"line":892,"column":4},"end":{"line":892,"column":29}},"358":{"start":{"line":894,"column":4},"end":{"line":896,"column":5}},"359":{"start":{"line":895,"column":8},"end":{"line":895,"column":46}},"360":{"start":{"line":897,"column":4},"end":{"line":897,"column":23}},"361":{"start":{"line":899,"column":4},"end":{"line":901,"column":5}},"362":{"start":{"line":900,"column":8},"end":{"line":900,"column":21}},"363":{"start":{"line":902,"column":4},"end":{"line":902,"column":29}},"364":{"start":{"line":904,"column":4},"end":{"line":906,"column":5}},"365":{"start":{"line":905,"column":8},"end":{"line":905,"column":18}},"366":{"start":{"line":907,"column":4},"end":{"line":907,"column":23}},"367":{"start":{"line":909,"column":4},"end":{"line":911,"column":5}},"368":{"start":{"line":910,"column":8},"end":{"line":910,"column":28}},"369":{"start":{"line":912,"column":4},"end":{"line":912,"column":23}},"370":{"start":{"line":914,"column":4},"end":{"line":916,"column":5}},"371":{"start":{"line":915,"column":8},"end":{"line":915,"column":28}},"372":{"start":{"line":917,"column":4},"end":{"line":917,"column":23}},"373":{"start":{"line":919,"column":4},"end":{"line":921,"column":5}},"374":{"start":{"line":920,"column":8},"end":{"line":920,"column":21}},"375":{"start":{"line":922,"column":4},"end":{"line":922,"column":29}},"376":{"start":{"line":985,"column":0},"end":{"line":1334,"column":2}},"377":{"start":{"line":1044,"column":4},"end":{"line":1044,"column":17}},"378":{"start":{"line":1045,"column":4},"end":{"line":1045,"column":21}},"379":{"start":{"line":1046,"column":4},"end":{"line":1048,"column":5}},"380":{"start":{"line":1047,"column":8},"end":{"line":1047,"column":62}},"381":{"start":{"line":1049,"column":4},"end":{"line":1049,"column":37}},"382":{"start":{"line":1051,"column":4},"end":{"line":1053,"column":5}},"383":{"start":{"line":1052,"column":8},"end":{"line":1052,"column":22}},"384":{"start":{"line":1054,"column":4},"end":{"line":1054,"column":27}},"385":{"start":{"line":1056,"column":4},"end":{"line":1058,"column":5}},"386":{"start":{"line":1057,"column":8},"end":{"line":1057,"column":51}},"387":{"start":{"line":1059,"column":4},"end":{"line":1059,"column":21}},"388":{"start":{"line":1061,"column":4},"end":{"line":1063,"column":5}},"389":{"start":{"line":1062,"column":8},"end":{"line":1062,"column":28}},"390":{"start":{"line":1064,"column":4},"end":{"line":1064,"column":35}},"391":{"start":{"line":1066,"column":4},"end":{"line":1081,"column":5}},"392":{"start":{"line":1067,"column":8},"end":{"line":1080,"column":10}},"393":{"start":{"line":1082,"column":4},"end":{"line":1082,"column":21}},"394":{"start":{"line":1084,"column":4},"end":{"line":1086,"column":5}},"395":{"start":{"line":1085,"column":8},"end":{"line":1085,"column":64}},"396":{"start":{"line":1087,"column":4},"end":{"line":1087,"column":29}},"397":{"start":{"line":1089,"column":4},"end":{"line":1091,"column":5}},"398":{"start":{"line":1090,"column":8},"end":{"line":1090,"column":30}},"399":{"start":{"line":1092,"column":4},"end":{"line":1092,"column":47}},"400":{"start":{"line":1094,"column":4},"end":{"line":1096,"column":5}},"401":{"start":{"line":1095,"column":8},"end":{"line":1095,"column":27}},"402":{"start":{"line":1097,"column":4},"end":{"line":1097,"column":41}},"403":{"start":{"line":1099,"column":4},"end":{"line":1101,"column":5}},"404":{"start":{"line":1100,"column":8},"end":{"line":1100,"column":48}},"405":{"start":{"line":1102,"column":4},"end":{"line":1102,"column":23}},"406":{"start":{"line":1104,"column":4},"end":{"line":1106,"column":5}},"407":{"start":{"line":1105,"column":8},"end":{"line":1105,"column":52}},"408":{"start":{"line":1107,"column":4},"end":{"line":1107,"column":29}},"409":{"start":{"line":1109,"column":4},"end":{"line":1111,"column":5}},"410":{"start":{"line":1110,"column":8},"end":{"line":1110,"column":30}},"411":{"start":{"line":1112,"column":4},"end":{"line":1112,"column":47}},"412":{"start":{"line":1114,"column":4},"end":{"line":1116,"column":5}},"413":{"start":{"line":1115,"column":8},"end":{"line":1115,"column":62}},"414":{"start":{"line":1117,"column":4},"end":{"line":1117,"column":27}},"415":{"start":{"line":1119,"column":4},"end":{"line":1121,"column":5}},"416":{"start":{"line":1120,"column":8},"end":{"line":1120,"column":23}},"417":{"start":{"line":1122,"column":4},"end":{"line":1122,"column":31}},"418":{"start":{"line":1124,"column":4},"end":{"line":1126,"column":5}},"419":{"start":{"line":1125,"column":8},"end":{"line":1125,"column":25}},"420":{"start":{"line":1127,"column":4},"end":{"line":1127,"column":37}},"421":{"start":{"line":1129,"column":4},"end":{"line":1131,"column":5}},"422":{"start":{"line":1130,"column":8},"end":{"line":1130,"column":31}},"423":{"start":{"line":1132,"column":4},"end":{"line":1132,"column":43}},"424":{"start":{"line":1134,"column":4},"end":{"line":1136,"column":5}},"425":{"start":{"line":1135,"column":8},"end":{"line":1135,"column":19}},"426":{"start":{"line":1137,"column":4},"end":{"line":1137,"column":19}},"427":{"start":{"line":1139,"column":4},"end":{"line":1141,"column":5}},"428":{"start":{"line":1140,"column":8},"end":{"line":1140,"column":26}},"429":{"start":{"line":1142,"column":4},"end":{"line":1142,"column":31}},"430":{"start":{"line":1144,"column":4},"end":{"line":1146,"column":5}},"431":{"start":{"line":1145,"column":8},"end":{"line":1145,"column":31}},"432":{"start":{"line":1147,"column":4},"end":{"line":1147,"column":49}},"433":{"start":{"line":1149,"column":4},"end":{"line":1151,"column":5}},"434":{"start":{"line":1150,"column":8},"end":{"line":1150,"column":35}},"435":{"start":{"line":1152,"column":4},"end":{"line":1152,"column":45}},"436":{"start":{"line":1154,"column":4},"end":{"line":1156,"column":5}},"437":{"start":{"line":1155,"column":8},"end":{"line":1155,"column":36}},"438":{"start":{"line":1157,"column":4},"end":{"line":1157,"column":47}},"439":{"start":{"line":1159,"column":4},"end":{"line":1161,"column":5}},"440":{"start":{"line":1160,"column":8},"end":{"line":1160,"column":58}},"441":{"start":{"line":1162,"column":4},"end":{"line":1162,"column":37}},"442":{"start":{"line":1164,"column":4},"end":{"line":1166,"column":5}},"443":{"start":{"line":1165,"column":8},"end":{"line":1165,"column":25}},"444":{"start":{"line":1167,"column":4},"end":{"line":1167,"column":29}},"445":{"start":{"line":1169,"column":4},"end":{"line":1171,"column":5}},"446":{"start":{"line":1170,"column":8},"end":{"line":1170,"column":29}},"447":{"start":{"line":1172,"column":4},"end":{"line":1172,"column":37}},"448":{"start":{"line":1174,"column":4},"end":{"line":1176,"column":5}},"449":{"start":{"line":1175,"column":8},"end":{"line":1175,"column":29}},"450":{"start":{"line":1177,"column":4},"end":{"line":1177,"column":37}},"451":{"start":{"line":1179,"column":4},"end":{"line":1181,"column":5}},"452":{"start":{"line":1180,"column":8},"end":{"line":1180,"column":21}},"453":{"start":{"line":1182,"column":4},"end":{"line":1182,"column":29}},"454":{"start":{"line":1184,"column":4},"end":{"line":1186,"column":5}},"455":{"start":{"line":1185,"column":8},"end":{"line":1185,"column":22}},"456":{"start":{"line":1187,"column":4},"end":{"line":1187,"column":31}},"457":{"start":{"line":1189,"column":4},"end":{"line":1191,"column":5}},"458":{"start":{"line":1190,"column":8},"end":{"line":1190,"column":26}},"459":{"start":{"line":1192,"column":4},"end":{"line":1192,"column":27}},"460":{"start":{"line":1194,"column":4},"end":{"line":1196,"column":5}},"461":{"start":{"line":1195,"column":8},"end":{"line":1195,"column":27}},"462":{"start":{"line":1197,"column":4},"end":{"line":1197,"column":29}},"463":{"start":{"line":1199,"column":4},"end":{"line":1201,"column":5}},"464":{"start":{"line":1200,"column":8},"end":{"line":1200,"column":21}},"465":{"start":{"line":1202,"column":4},"end":{"line":1202,"column":29}},"466":{"start":{"line":1204,"column":4},"end":{"line":1206,"column":5}},"467":{"start":{"line":1205,"column":8},"end":{"line":1205,"column":21}},"468":{"start":{"line":1207,"column":4},"end":{"line":1207,"column":29}},"469":{"start":{"line":1209,"column":4},"end":{"line":1211,"column":5}},"470":{"start":{"line":1210,"column":8},"end":{"line":1210,"column":60}},"471":{"start":{"line":1212,"column":4},"end":{"line":1212,"column":29}},"472":{"start":{"line":1214,"column":4},"end":{"line":1216,"column":5}},"473":{"start":{"line":1215,"column":8},"end":{"line":1215,"column":61}},"474":{"start":{"line":1217,"column":4},"end":{"line":1217,"column":29}},"475":{"start":{"line":1219,"column":4},"end":{"line":1221,"column":5}},"476":{"start":{"line":1220,"column":8},"end":{"line":1220,"column":71}},"477":{"start":{"line":1222,"column":4},"end":{"line":1222,"column":29}},"478":{"start":{"line":1224,"column":4},"end":{"line":1226,"column":5}},"479":{"start":{"line":1225,"column":8},"end":{"line":1225,"column":62}},"480":{"start":{"line":1227,"column":4},"end":{"line":1227,"column":39}},"481":{"start":{"line":1229,"column":4},"end":{"line":1231,"column":5}},"482":{"start":{"line":1230,"column":8},"end":{"line":1230,"column":25}},"483":{"start":{"line":1232,"column":4},"end":{"line":1232,"column":31}},"484":{"start":{"line":1234,"column":4},"end":{"line":1236,"column":5}},"485":{"start":{"line":1235,"column":8},"end":{"line":1235,"column":62}},"486":{"start":{"line":1237,"column":4},"end":{"line":1237,"column":31}},"487":{"start":{"line":1239,"column":4},"end":{"line":1241,"column":5}},"488":{"start":{"line":1240,"column":8},"end":{"line":1240,"column":26}},"489":{"start":{"line":1242,"column":4},"end":{"line":1242,"column":33}},"490":{"start":{"line":1244,"column":4},"end":{"line":1246,"column":5}},"491":{"start":{"line":1245,"column":8},"end":{"line":1245,"column":30}},"492":{"start":{"line":1247,"column":4},"end":{"line":1247,"column":39}},"493":{"start":{"line":1249,"column":4},"end":{"line":1251,"column":5}},"494":{"start":{"line":1250,"column":8},"end":{"line":1250,"column":32}},"495":{"start":{"line":1252,"column":4},"end":{"line":1252,"column":51}},"496":{"start":{"line":1254,"column":4},"end":{"line":1256,"column":5}},"497":{"start":{"line":1255,"column":8},"end":{"line":1255,"column":31}},"498":{"start":{"line":1257,"column":4},"end":{"line":1257,"column":49}},"499":{"start":{"line":1259,"column":4},"end":{"line":1261,"column":5}},"500":{"start":{"line":1260,"column":8},"end":{"line":1260,"column":22}},"501":{"start":{"line":1262,"column":4},"end":{"line":1262,"column":31}},"502":{"start":{"line":1264,"column":4},"end":{"line":1266,"column":5}},"503":{"start":{"line":1265,"column":8},"end":{"line":1265,"column":28}},"504":{"start":{"line":1267,"column":4},"end":{"line":1267,"column":41}},"505":{"start":{"line":1269,"column":4},"end":{"line":1271,"column":5}},"506":{"start":{"line":1270,"column":8},"end":{"line":1270,"column":28}},"507":{"start":{"line":1272,"column":4},"end":{"line":1272,"column":35}},"508":{"start":{"line":1274,"column":4},"end":{"line":1276,"column":5}},"509":{"start":{"line":1275,"column":8},"end":{"line":1275,"column":23}},"510":{"start":{"line":1277,"column":4},"end":{"line":1277,"column":27}},"511":{"start":{"line":1279,"column":4},"end":{"line":1281,"column":5}},"512":{"start":{"line":1280,"column":8},"end":{"line":1280,"column":56}},"513":{"start":{"line":1282,"column":4},"end":{"line":1282,"column":27}},"514":{"start":{"line":1284,"column":4},"end":{"line":1286,"column":5}},"515":{"start":{"line":1285,"column":8},"end":{"line":1285,"column":22}},"516":{"start":{"line":1287,"column":4},"end":{"line":1287,"column":31}},"517":{"start":{"line":1289,"column":4},"end":{"line":1291,"column":5}},"518":{"start":{"line":1290,"column":8},"end":{"line":1290,"column":24}},"519":{"start":{"line":1292,"column":4},"end":{"line":1292,"column":35}},"520":{"start":{"line":1294,"column":4},"end":{"line":1296,"column":5}},"521":{"start":{"line":1295,"column":8},"end":{"line":1295,"column":30}},"522":{"start":{"line":1297,"column":4},"end":{"line":1297,"column":47}},"523":{"start":{"line":1299,"column":4},"end":{"line":1301,"column":5}},"524":{"start":{"line":1300,"column":8},"end":{"line":1300,"column":29}},"525":{"start":{"line":1302,"column":4},"end":{"line":1302,"column":45}},"526":{"start":{"line":1304,"column":4},"end":{"line":1306,"column":5}},"527":{"start":{"line":1305,"column":8},"end":{"line":1305,"column":24}},"528":{"start":{"line":1307,"column":4},"end":{"line":1307,"column":31}},"529":{"start":{"line":1309,"column":4},"end":{"line":1311,"column":5}},"530":{"start":{"line":1310,"column":8},"end":{"line":1310,"column":24}},"531":{"start":{"line":1312,"column":4},"end":{"line":1312,"column":31}},"532":{"start":{"line":1314,"column":4},"end":{"line":1316,"column":5}},"533":{"start":{"line":1315,"column":8},"end":{"line":1315,"column":22}},"534":{"start":{"line":1317,"column":4},"end":{"line":1317,"column":31}},"535":{"start":{"line":1319,"column":4},"end":{"line":1321,"column":5}},"536":{"start":{"line":1320,"column":8},"end":{"line":1320,"column":36}},"537":{"start":{"line":1322,"column":4},"end":{"line":1322,"column":53}},"538":{"start":{"line":1324,"column":4},"end":{"line":1326,"column":5}},"539":{"start":{"line":1325,"column":8},"end":{"line":1325,"column":27}},"540":{"start":{"line":1327,"column":4},"end":{"line":1327,"column":41}},"541":{"start":{"line":1329,"column":4},"end":{"line":1331,"column":5}},"542":{"start":{"line":1330,"column":8},"end":{"line":1330,"column":30}},"543":{"start":{"line":1332,"column":4},"end":{"line":1332,"column":43}},"544":{"start":{"line":1340,"column":0},"end":{"line":1340,"column":48}},"545":{"start":{"line":1341,"column":0},"end":{"line":1341,"column":43}},"546":{"start":{"line":1342,"column":0},"end":{"line":1342,"column":43}},"547":{"start":{"line":1348,"column":0},"end":{"line":1348,"column":39}},"548":{"start":{"line":1349,"column":0},"end":{"line":1349,"column":41}},"549":{"start":{"line":1350,"column":0},"end":{"line":1350,"column":43}},"550":{"start":{"line":1356,"column":0},"end":{"line":1356,"column":45}},"551":{"start":{"line":1357,"column":0},"end":{"line":1357,"column":47}},"552":{"start":{"line":1358,"column":0},"end":{"line":1358,"column":50}},"553":{"start":{"line":1359,"column":0},"end":{"line":1359,"column":47}},"554":{"start":{"line":1360,"column":0},"end":{"line":1360,"column":45}},"555":{"start":{"line":1366,"column":0},"end":{"line":1366,"column":43}},"556":{"start":{"line":1367,"column":0},"end":{"line":1367,"column":42}},"557":{"start":{"line":1368,"column":0},"end":{"line":1368,"column":48}},"558":{"start":{"line":1369,"column":0},"end":{"line":1369,"column":58}},"559":{"start":{"line":1370,"column":0},"end":{"line":1370,"column":48}},"560":{"start":{"line":1371,"column":0},"end":{"line":1371,"column":58}},"561":{"start":{"line":1372,"column":0},"end":{"line":1372,"column":48}},"562":{"start":{"line":1373,"column":0},"end":{"line":1373,"column":58}},"563":{"start":{"line":1374,"column":0},"end":{"line":1374,"column":48}},"564":{"start":{"line":1375,"column":0},"end":{"line":1375,"column":58}},"565":{"start":{"line":1376,"column":0},"end":{"line":1376,"column":57}},"566":{"start":{"line":1382,"column":0},"end":{"line":1382,"column":44}},"567":{"start":{"line":1383,"column":0},"end":{"line":1383,"column":49}},"568":{"start":{"line":1384,"column":0},"end":{"line":1384,"column":57}},"569":{"start":{"line":1385,"column":0},"end":{"line":1385,"column":44}},"570":{"start":{"line":1386,"column":0},"end":{"line":1386,"column":44}},"571":{"start":{"line":1392,"column":0},"end":{"line":1392,"column":41}},"572":{"start":{"line":1393,"column":0},"end":{"line":1393,"column":42}},"573":{"start":{"line":1394,"column":0},"end":{"line":1394,"column":40}},"574":{"start":{"line":1395,"column":0},"end":{"line":1395,"column":46}},"575":{"start":{"line":1396,"column":0},"end":{"line":1396,"column":41}},"576":{"start":{"line":1397,"column":0},"end":{"line":1397,"column":49}},"577":{"start":{"line":1398,"column":0},"end":{"line":1398,"column":43}},"578":{"start":{"line":1399,"column":0},"end":{"line":1399,"column":45}},"579":{"start":{"line":1405,"column":0},"end":{"line":1405,"column":40}},"580":{"start":{"line":1406,"column":0},"end":{"line":1406,"column":39}},"581":{"start":{"line":1407,"column":0},"end":{"line":1407,"column":41}},"582":{"start":{"line":1413,"column":0},"end":{"line":1413,"column":42}},"583":{"start":{"line":1414,"column":0},"end":{"line":1414,"column":44}},"584":{"start":{"line":1420,"column":0},"end":{"line":1420,"column":61}},"585":{"start":{"line":1421,"column":0},"end":{"line":1421,"column":62}},"586":{"start":{"line":1422,"column":0},"end":{"line":1422,"column":61}},"587":{"start":{"line":1423,"column":0},"end":{"line":1423,"column":61}},"588":{"start":{"line":1424,"column":0},"end":{"line":1424,"column":63}},"589":{"start":{"line":1425,"column":0},"end":{"line":1425,"column":62}},"590":{"start":{"line":1426,"column":0},"end":{"line":1426,"column":61}},"591":{"start":{"line":1427,"column":0},"end":{"line":1427,"column":64}},"592":{"start":{"line":1428,"column":0},"end":{"line":1428,"column":58}},"593":{"start":{"line":1429,"column":0},"end":{"line":1429,"column":58}},"594":{"start":{"line":1430,"column":0},"end":{"line":1430,"column":57}},"595":{"start":{"line":1439,"column":0},"end":{"line":1617,"column":2}},"596":{"start":{"line":1446,"column":4},"end":{"line":1446,"column":26}},"597":{"start":{"line":1448,"column":4},"end":{"line":1448,"column":32}},"598":{"start":{"line":1450,"column":4},"end":{"line":1450,"column":25}},"599":{"start":{"line":1452,"column":4},"end":{"line":1591,"column":5}},"600":{"start":{"line":1454,"column":8},"end":{"line":1503,"column":11}},"601":{"start":{"line":1505,"column":8},"end":{"line":1517,"column":10}},"602":{"start":{"line":1518,"column":11},"end":{"line":1591,"column":5}},"603":{"start":{"line":1520,"column":8},"end":{"line":1574,"column":11}},"604":{"start":{"line":1576,"column":8},"end":{"line":1587,"column":10}},"605":{"start":{"line":1590,"column":8},"end":{"line":1590,"column":137}},"606":{"start":{"line":1593,"column":4},"end":{"line":1614,"column":5}},"607":{"start":{"line":1594,"column":8},"end":{"line":1601,"column":10}},"608":{"start":{"line":1602,"column":8},"end":{"line":1611,"column":9}},"609":{"start":{"line":1604,"column":16},"end":{"line":1604,"column":48}},"610":{"start":{"line":1608,"column":16},"end":{"line":1608,"column":35}},"611":{"start":{"line":1609,"column":16},"end":{"line":1609,"column":36}},"612":{"start":{"line":1613,"column":8},"end":{"line":1613,"column":40}},"613":{"start":{"line":1616,"column":4},"end":{"line":1616,"column":25}},"614":{"start":{"line":1625,"column":0},"end":{"line":1643,"column":2}},"615":{"start":{"line":1630,"column":4},"end":{"line":1630,"column":20}},"616":{"start":{"line":1632,"column":4},"end":{"line":1634,"column":5}},"617":{"start":{"line":1633,"column":8},"end":{"line":1633,"column":28}},"618":{"start":{"line":1636,"column":4},"end":{"line":1638,"column":5}},"619":{"start":{"line":1637,"column":8},"end":{"line":1637,"column":28}},"620":{"start":{"line":1640,"column":4},"end":{"line":1642,"column":5}},"621":{"start":{"line":1641,"column":8},"end":{"line":1641,"column":28}},"622":{"start":{"line":1648,"column":0},"end":{"line":1654,"column":2}},"623":{"start":{"line":1649,"column":4},"end":{"line":1653,"column":6}},"624":{"start":{"line":1655,"column":0},"end":{"line":1679,"column":2}},"625":{"start":{"line":1662,"column":4},"end":{"line":1662,"column":20}},"626":{"start":{"line":1664,"column":4},"end":{"line":1666,"column":5}},"627":{"start":{"line":1665,"column":8},"end":{"line":1665,"column":28}},"628":{"start":{"line":1668,"column":4},"end":{"line":1670,"column":5}},"629":{"start":{"line":1669,"column":8},"end":{"line":1669,"column":28}},"630":{"start":{"line":1672,"column":4},"end":{"line":1674,"column":5}},"631":{"start":{"line":1673,"column":8},"end":{"line":1673,"column":28}},"632":{"start":{"line":1676,"column":4},"end":{"line":1678,"column":5}},"633":{"start":{"line":1677,"column":8},"end":{"line":1677,"column":28}},"634":{"start":{"line":1681,"column":0},"end":{"line":1686,"column":2}},"635":{"start":{"line":1682,"column":4},"end":{"line":1682,"column":20}},"636":{"start":{"line":1683,"column":4},"end":{"line":1683,"column":91}},"637":{"start":{"line":1684,"column":4},"end":{"line":1684,"column":86}},"638":{"start":{"line":1685,"column":4},"end":{"line":1685,"column":16}},"639":{"start":{"line":1688,"column":0},"end":{"line":1703,"column":2}},"640":{"start":{"line":1689,"column":4},"end":{"line":1689,"column":20}},"641":{"start":{"line":1690,"column":4},"end":{"line":1695,"column":6}},"642":{"start":{"line":1696,"column":4},"end":{"line":1701,"column":6}},"643":{"start":{"line":1702,"column":4},"end":{"line":1702,"column":16}},"644":{"start":{"line":1705,"column":0},"end":{"line":1710,"column":2}},"645":{"start":{"line":1706,"column":4},"end":{"line":1706,"column":20}},"646":{"start":{"line":1707,"column":4},"end":{"line":1707,"column":91}},"647":{"start":{"line":1708,"column":4},"end":{"line":1708,"column":86}},"648":{"start":{"line":1709,"column":4},"end":{"line":1709,"column":16}},"649":{"start":{"line":1712,"column":0},"end":{"line":1716,"column":2}},"650":{"start":{"line":1713,"column":4},"end":{"line":1713,"column":20}},"651":{"start":{"line":1714,"column":4},"end":{"line":1714,"column":34}},"652":{"start":{"line":1715,"column":4},"end":{"line":1715,"column":32}},"653":{"start":{"line":1718,"column":0},"end":{"line":1722,"column":2}},"654":{"start":{"line":1719,"column":4},"end":{"line":1719,"column":20}},"655":{"start":{"line":1720,"column":4},"end":{"line":1720,"column":34}},"656":{"start":{"line":1721,"column":4},"end":{"line":1721,"column":32}},"657":{"start":{"line":1724,"column":0},"end":{"line":1728,"column":2}},"658":{"start":{"line":1725,"column":4},"end":{"line":1725,"column":20}},"659":{"start":{"line":1726,"column":4},"end":{"line":1726,"column":34}},"660":{"start":{"line":1727,"column":4},"end":{"line":1727,"column":32}},"661":{"start":{"line":1730,"column":0},"end":{"line":1745,"column":2}},"662":{"start":{"line":1731,"column":4},"end":{"line":1744,"column":5}},"663":{"start":{"line":1732,"column":8},"end":{"line":1737,"column":10}},"664":{"start":{"line":1738,"column":11},"end":{"line":1744,"column":5}},"665":{"start":{"line":1739,"column":8},"end":{"line":1743,"column":10}},"666":{"start":{"line":1747,"column":0},"end":{"line":1754,"column":2}},"667":{"start":{"line":1748,"column":4},"end":{"line":1753,"column":6}},"668":{"start":{"line":1756,"column":0},"end":{"line":1827,"column":2}},"669":{"start":{"line":1758,"column":4},"end":{"line":1758,"column":72}},"670":{"start":{"line":1760,"column":4},"end":{"line":1760,"column":44}},"671":{"start":{"line":1762,"column":4},"end":{"line":1764,"column":5}},"672":{"start":{"line":1763,"column":8},"end":{"line":1763,"column":16}},"673":{"start":{"line":1766,"column":4},"end":{"line":1766,"column":36}},"674":{"start":{"line":1768,"column":4},"end":{"line":1771,"column":5}},"675":{"start":{"line":1769,"column":8},"end":{"line":1769,"column":22}},"676":{"start":{"line":1770,"column":8},"end":{"line":1770,"column":36}},"677":{"start":{"line":1773,"column":4},"end":{"line":1773,"column":23}},"678":{"start":{"line":1775,"column":4},"end":{"line":1775,"column":25}},"679":{"start":{"line":1776,"column":4},"end":{"line":1776,"column":25}},"680":{"start":{"line":1777,"column":4},"end":{"line":1777,"column":25}},"681":{"start":{"line":1779,"column":4},"end":{"line":1779,"column":25}},"682":{"start":{"line":1780,"column":4},"end":{"line":1780,"column":25}},"683":{"start":{"line":1781,"column":4},"end":{"line":1781,"column":25}},"684":{"start":{"line":1783,"column":4},"end":{"line":1783,"column":25}},"685":{"start":{"line":1784,"column":4},"end":{"line":1784,"column":25}},"686":{"start":{"line":1785,"column":4},"end":{"line":1785,"column":25}},"687":{"start":{"line":1787,"column":4},"end":{"line":1787,"column":16}},"688":{"start":{"line":1852,"column":0},"end":{"line":1936,"column":2}},"689":{"start":{"line":1873,"column":4},"end":{"line":1873,"column":17}},"690":{"start":{"line":1874,"column":4},"end":{"line":1874,"column":46}},"691":{"start":{"line":1875,"column":4},"end":{"line":1875,"column":21}},"692":{"start":{"line":1876,"column":4},"end":{"line":1876,"column":21}},"693":{"start":{"line":1877,"column":4},"end":{"line":1877,"column":29}},"694":{"start":{"line":1878,"column":4},"end":{"line":1878,"column":29}},"695":{"start":{"line":1879,"column":4},"end":{"line":1879,"column":23}},"696":{"start":{"line":1881,"column":4},"end":{"line":1883,"column":5}},"697":{"start":{"line":1882,"column":8},"end":{"line":1882,"column":24}},"698":{"start":{"line":1884,"column":4},"end":{"line":1884,"column":29}},"699":{"start":{"line":1886,"column":4},"end":{"line":1888,"column":5}},"700":{"start":{"line":1887,"column":8},"end":{"line":1887,"column":27}},"701":{"start":{"line":1889,"column":4},"end":{"line":1889,"column":39}},"702":{"start":{"line":1891,"column":4},"end":{"line":1893,"column":5}},"703":{"start":{"line":1892,"column":8},"end":{"line":1892,"column":25}},"704":{"start":{"line":1894,"column":4},"end":{"line":1894,"column":35}},"705":{"start":{"line":1896,"column":4},"end":{"line":1898,"column":5}},"706":{"start":{"line":1897,"column":8},"end":{"line":1897,"column":25}},"707":{"start":{"line":1899,"column":4},"end":{"line":1899,"column":35}},"708":{"start":{"line":1901,"column":4},"end":{"line":1903,"column":5}},"709":{"start":{"line":1902,"column":8},"end":{"line":1902,"column":23}},"710":{"start":{"line":1904,"column":4},"end":{"line":1904,"column":31}},"711":{"start":{"line":1906,"column":4},"end":{"line":1908,"column":5}},"712":{"start":{"line":1907,"column":8},"end":{"line":1907,"column":49}},"713":{"start":{"line":1909,"column":4},"end":{"line":1909,"column":29}},"714":{"start":{"line":1911,"column":4},"end":{"line":1913,"column":5}},"715":{"start":{"line":1912,"column":8},"end":{"line":1912,"column":33}},"716":{"start":{"line":1914,"column":4},"end":{"line":1914,"column":33}},"717":{"start":{"line":1916,"column":4},"end":{"line":1918,"column":5}},"718":{"start":{"line":1917,"column":8},"end":{"line":1917,"column":49}},"719":{"start":{"line":1919,"column":4},"end":{"line":1919,"column":29}},"720":{"start":{"line":1921,"column":4},"end":{"line":1923,"column":5}},"721":{"start":{"line":1922,"column":8},"end":{"line":1922,"column":46}},"722":{"start":{"line":1924,"column":4},"end":{"line":1924,"column":23}},"723":{"start":{"line":1926,"column":4},"end":{"line":1928,"column":5}},"724":{"start":{"line":1927,"column":8},"end":{"line":1927,"column":43}},"725":{"start":{"line":1929,"column":4},"end":{"line":1929,"column":17}},"726":{"start":{"line":1931,"column":4},"end":{"line":1931,"column":27}},"727":{"start":{"line":1933,"column":4},"end":{"line":1933,"column":37}},"728":{"start":{"line":1935,"column":4},"end":{"line":1935,"column":39}},"729":{"start":{"line":1943,"column":0},"end":{"line":1943,"column":32}},"730":{"start":{"line":1944,"column":0},"end":{"line":1944,"column":33}},"731":{"start":{"line":1955,"column":0},"end":{"line":2068,"column":2}},"732":{"start":{"line":1957,"column":4},"end":{"line":1957,"column":25}},"733":{"start":{"line":1959,"column":4},"end":{"line":1961,"column":5}},"734":{"start":{"line":1960,"column":8},"end":{"line":1960,"column":83}},"735":{"start":{"line":1963,"column":4},"end":{"line":2059,"column":5}},"736":{"start":{"line":1965,"column":8},"end":{"line":1965,"column":47}},"737":{"start":{"line":1967,"column":8},"end":{"line":1967,"column":50}},"738":{"start":{"line":1969,"column":8},"end":{"line":1969,"column":50}},"739":{"start":{"line":1971,"column":8},"end":{"line":1971,"column":28}},"740":{"start":{"line":1973,"column":8},"end":{"line":2001,"column":9}},"741":{"start":{"line":1975,"column":12},"end":{"line":1975,"column":52}},"742":{"start":{"line":1977,"column":12},"end":{"line":1977,"column":39}},"743":{"start":{"line":1979,"column":12},"end":{"line":1979,"column":51}},"744":{"start":{"line":1980,"column":12},"end":{"line":1980,"column":51}},"745":{"start":{"line":1981,"column":12},"end":{"line":1981,"column":51}},"746":{"start":{"line":1983,"column":12},"end":{"line":1983,"column":51}},"747":{"start":{"line":1984,"column":12},"end":{"line":1984,"column":51}},"748":{"start":{"line":1985,"column":12},"end":{"line":1985,"column":51}},"749":{"start":{"line":1987,"column":12},"end":{"line":1987,"column":55}},"750":{"start":{"line":1988,"column":12},"end":{"line":1988,"column":55}},"751":{"start":{"line":1989,"column":12},"end":{"line":1989,"column":55}},"752":{"start":{"line":1990,"column":12},"end":{"line":1990,"column":55}},"753":{"start":{"line":1992,"column":12},"end":{"line":1992,"column":45}},"754":{"start":{"line":1993,"column":12},"end":{"line":1993,"column":45}},"755":{"start":{"line":1994,"column":12},"end":{"line":1994,"column":45}},"756":{"start":{"line":1996,"column":12},"end":{"line":1996,"column":39}},"757":{"start":{"line":1997,"column":12},"end":{"line":1997,"column":39}},"758":{"start":{"line":1998,"column":12},"end":{"line":1998,"column":39}},"759":{"start":{"line":2000,"column":12},"end":{"line":2000,"column":34}},"760":{"start":{"line":2006,"column":8},"end":{"line":2010,"column":9}},"761":{"start":{"line":2007,"column":12},"end":{"line":2009,"column":13}},"762":{"start":{"line":2008,"column":16},"end":{"line":2008,"column":76}},"763":{"start":{"line":2015,"column":8},"end":{"line":2024,"column":9}},"764":{"start":{"line":2016,"column":12},"end":{"line":2023,"column":14}},"765":{"start":{"line":2029,"column":8},"end":{"line":2038,"column":9}},"766":{"start":{"line":2030,"column":12},"end":{"line":2037,"column":14}},"767":{"start":{"line":2040,"column":8},"end":{"line":2040,"column":90}},"768":{"start":{"line":2042,"column":8},"end":{"line":2042,"column":66}},"769":{"start":{"line":2044,"column":8},"end":{"line":2044,"column":74}},"770":{"start":{"line":2046,"column":8},"end":{"line":2051,"column":9}},"771":{"start":{"line":2047,"column":12},"end":{"line":2050,"column":13}},"772":{"start":{"line":2048,"column":16},"end":{"line":2048,"column":45}},"773":{"start":{"line":2049,"column":16},"end":{"line":2049,"column":22}},"774":{"start":{"line":2053,"column":8},"end":{"line":2053,"column":33}},"775":{"start":{"line":2055,"column":8},"end":{"line":2055,"column":25}},"776":{"start":{"line":2057,"column":8},"end":{"line":2057,"column":92}},"777":{"start":{"line":2058,"column":8},"end":{"line":2058,"column":65}},"778":{"start":{"line":2061,"column":4},"end":{"line":2063,"column":5}},"779":{"start":{"line":2062,"column":8},"end":{"line":2062,"column":86}},"780":{"start":{"line":2065,"column":4},"end":{"line":2065,"column":43}},"781":{"start":{"line":2067,"column":4},"end":{"line":2067,"column":21}},"782":{"start":{"line":2070,"column":0},"end":{"line":2083,"column":2}},"783":{"start":{"line":2072,"column":4},"end":{"line":2080,"column":5}},"784":{"start":{"line":2073,"column":8},"end":{"line":2073,"column":33}},"785":{"start":{"line":2074,"column":8},"end":{"line":2074,"column":42}},"786":{"start":{"line":2075,"column":8},"end":{"line":2075,"column":29}},"787":{"start":{"line":2077,"column":8},"end":{"line":2077,"column":50}},"788":{"start":{"line":2078,"column":8},"end":{"line":2078,"column":64}},"789":{"start":{"line":2079,"column":8},"end":{"line":2079,"column":46}},"790":{"start":{"line":2082,"column":4},"end":{"line":2082,"column":21}},"791":{"start":{"line":2088,"column":0},"end":{"line":2146,"column":2}},"792":{"start":{"line":2090,"column":4},"end":{"line":2090,"column":53}},"793":{"start":{"line":2092,"column":4},"end":{"line":2098,"column":5}},"794":{"start":{"line":2093,"column":8},"end":{"line":2097,"column":11}},"795":{"start":{"line":2100,"column":4},"end":{"line":2100,"column":33}},"796":{"start":{"line":2102,"column":4},"end":{"line":2102,"column":23}},"797":{"start":{"line":2104,"column":4},"end":{"line":2125,"column":5}},"798":{"start":{"line":2106,"column":8},"end":{"line":2106,"column":26}},"799":{"start":{"line":2107,"column":8},"end":{"line":2107,"column":28}},"800":{"start":{"line":2108,"column":8},"end":{"line":2108,"column":28}},"801":{"start":{"line":2110,"column":8},"end":{"line":2124,"column":10}},"802":{"start":{"line":2127,"column":4},"end":{"line":2143,"column":5}},"803":{"start":{"line":2128,"column":8},"end":{"line":2142,"column":9}},"804":{"start":{"line":2136,"column":12},"end":{"line":2136,"column":37}},"805":{"start":{"line":2137,"column":12},"end":{"line":2137,"column":38}},"806":{"start":{"line":2138,"column":12},"end":{"line":2138,"column":46}},"807":{"start":{"line":2139,"column":12},"end":{"line":2139,"column":34}},"808":{"start":{"line":2141,"column":12},"end":{"line":2141,"column":41}},"809":{"start":{"line":2145,"column":4},"end":{"line":2145,"column":21}},"810":{"start":{"line":2173,"column":0},"end":{"line":2321,"column":2}},"811":{"start":{"line":2181,"column":4},"end":{"line":2190,"column":5}},"812":{"start":{"line":2183,"column":8},"end":{"line":2187,"column":9}},"813":{"start":{"line":2184,"column":12},"end":{"line":2186,"column":13}},"814":{"start":{"line":2185,"column":16},"end":{"line":2185,"column":28}},"815":{"start":{"line":2189,"column":8},"end":{"line":2189,"column":21}},"816":{"start":{"line":2199,"column":4},"end":{"line":2233,"column":5}},"817":{"start":{"line":2201,"column":8},"end":{"line":2230,"column":9}},"818":{"start":{"line":2202,"column":12},"end":{"line":2229,"column":13}},"819":{"start":{"line":2211,"column":16},"end":{"line":2219,"column":18}},"820":{"start":{"line":2221,"column":16},"end":{"line":2223,"column":17}},"821":{"start":{"line":2222,"column":20},"end":{"line":2222,"column":29}},"822":{"start":{"line":2225,"column":16},"end":{"line":2228,"column":18}},"823":{"start":{"line":2232,"column":8},"end":{"line":2232,"column":20}},"824":{"start":{"line":2235,"column":4},"end":{"line":2248,"column":6}},"825":{"start":{"line":2250,"column":4},"end":{"line":2250,"column":23}},"826":{"start":{"line":2252,"column":4},"end":{"line":2300,"column":5}},"827":{"start":{"line":2254,"column":8},"end":{"line":2254,"column":43}},"828":{"start":{"line":2260,"column":8},"end":{"line":2275,"column":9}},"829":{"start":{"line":2268,"column":12},"end":{"line":2268,"column":51}},"830":{"start":{"line":2269,"column":12},"end":{"line":2269,"column":64}},"831":{"start":{"line":2270,"column":12},"end":{"line":2270,"column":47}},"832":{"start":{"line":2272,"column":12},"end":{"line":2272,"column":54}},"833":{"start":{"line":2273,"column":12},"end":{"line":2273,"column":68}},"834":{"start":{"line":2274,"column":12},"end":{"line":2274,"column":50}},"835":{"start":{"line":2277,"column":8},"end":{"line":2277,"column":37}},"836":{"start":{"line":2279,"column":8},"end":{"line":2292,"column":10}},"837":{"start":{"line":2294,"column":8},"end":{"line":2299,"column":9}},"838":{"start":{"line":2295,"column":12},"end":{"line":2295,"column":84}},"839":{"start":{"line":2296,"column":12},"end":{"line":2298,"column":13}},"840":{"start":{"line":2297,"column":16},"end":{"line":2297,"column":42}},"841":{"start":{"line":2306,"column":4},"end":{"line":2306,"column":23}},"842":{"start":{"line":2307,"column":4},"end":{"line":2318,"column":5}},"843":{"start":{"line":2308,"column":8},"end":{"line":2308,"column":26}},"844":{"start":{"line":2309,"column":8},"end":{"line":2314,"column":9}},"845":{"start":{"line":2310,"column":12},"end":{"line":2313,"column":13}},"846":{"start":{"line":2311,"column":16},"end":{"line":2311,"column":29}},"847":{"start":{"line":2312,"column":16},"end":{"line":2312,"column":22}},"848":{"start":{"line":2315,"column":8},"end":{"line":2317,"column":9}},"849":{"start":{"line":2316,"column":12},"end":{"line":2316,"column":50}},"850":{"start":{"line":2320,"column":4},"end":{"line":2320,"column":21}},"851":{"start":{"line":2331,"column":0},"end":{"line":2365,"column":2}},"852":{"start":{"line":2333,"column":4},"end":{"line":2335,"column":5}},"853":{"start":{"line":2334,"column":8},"end":{"line":2334,"column":89}},"854":{"start":{"line":2337,"column":4},"end":{"line":2337,"column":22}},"855":{"start":{"line":2339,"column":4},"end":{"line":2339,"column":49}},"856":{"start":{"line":2341,"column":4},"end":{"line":2347,"column":5}},"857":{"start":{"line":2342,"column":8},"end":{"line":2346,"column":11}},"858":{"start":{"line":2349,"column":4},"end":{"line":2349,"column":22}},"859":{"start":{"line":2351,"column":4},"end":{"line":2351,"column":36}},"860":{"start":{"line":2353,"column":4},"end":{"line":2353,"column":36}},"861":{"start":{"line":2355,"column":4},"end":{"line":2362,"column":5}},"862":{"start":{"line":2356,"column":8},"end":{"line":2361,"column":10}},"863":{"start":{"line":2364,"column":4},"end":{"line":2364,"column":20}},"864":{"start":{"line":2375,"column":0},"end":{"line":2389,"column":2}},"865":{"start":{"line":2381,"column":4},"end":{"line":2381,"column":17}},"866":{"start":{"line":2382,"column":4},"end":{"line":2382,"column":21}},"867":{"start":{"line":2383,"column":4},"end":{"line":2383,"column":25}},"868":{"start":{"line":2385,"column":4},"end":{"line":2387,"column":5}},"869":{"start":{"line":2386,"column":8},"end":{"line":2386,"column":20}},"870":{"start":{"line":2388,"column":4},"end":{"line":2388,"column":25}},"871":{"start":{"line":2396,"column":0},"end":{"line":2396,"column":38}},"872":{"start":{"line":2397,"column":0},"end":{"line":2397,"column":35}},"873":{"start":{"line":2407,"column":0},"end":{"line":2419,"column":2}},"874":{"start":{"line":2414,"column":4},"end":{"line":2414,"column":33}},"875":{"start":{"line":2415,"column":4},"end":{"line":2415,"column":33}},"876":{"start":{"line":2416,"column":4},"end":{"line":2416,"column":17}},"877":{"start":{"line":2417,"column":4},"end":{"line":2417,"column":39}},"878":{"start":{"line":2418,"column":4},"end":{"line":2418,"column":31}},"879":{"start":{"line":2425,"column":0},"end":{"line":2433,"column":2}},"880":{"start":{"line":2426,"column":4},"end":{"line":2432,"column":5}},"881":{"start":{"line":2441,"column":0},"end":{"line":2459,"column":2}},"882":{"start":{"line":2446,"column":4},"end":{"line":2446,"column":25}},"883":{"start":{"line":2447,"column":4},"end":{"line":2447,"column":35}},"884":{"start":{"line":2449,"column":4},"end":{"line":2449,"column":51}},"885":{"start":{"line":2451,"column":4},"end":{"line":2451,"column":35}},"886":{"start":{"line":2453,"column":4},"end":{"line":2455,"column":5}},"887":{"start":{"line":2454,"column":8},"end":{"line":2454,"column":20}},"888":{"start":{"line":2456,"column":4},"end":{"line":2456,"column":25}},"889":{"start":{"line":2458,"column":4},"end":{"line":2458,"column":42}},"890":{"start":{"line":2465,"column":0},"end":{"line":2469,"column":2}},"891":{"start":{"line":2466,"column":4},"end":{"line":2468,"column":7}},"892":{"start":{"line":2475,"column":0},"end":{"line":2480,"column":2}},"893":{"start":{"line":2478,"column":4},"end":{"line":2478,"column":28}},"894":{"start":{"line":2479,"column":4},"end":{"line":2479,"column":43}},"895":{"start":{"line":2487,"column":0},"end":{"line":2489,"column":2}},"896":{"start":{"line":2488,"column":4},"end":{"line":2488,"column":36}},"897":{"start":{"line":2490,"column":0},"end":{"line":2661,"column":2}},"898":{"start":{"line":2520,"column":4},"end":{"line":2520,"column":25}},"899":{"start":{"line":2521,"column":4},"end":{"line":2521,"column":35}},"900":{"start":{"line":2523,"column":4},"end":{"line":2523,"column":51}},"901":{"start":{"line":2525,"column":1},"end":{"line":2527,"column":2}},"902":{"start":{"line":2526,"column":2},"end":{"line":2526,"column":64}},"903":{"start":{"line":2528,"column":1},"end":{"line":2528,"column":64}},"904":{"start":{"line":2530,"column":1},"end":{"line":2532,"column":2}},"905":{"start":{"line":2531,"column":2},"end":{"line":2531,"column":64}},"906":{"start":{"line":2533,"column":1},"end":{"line":2533,"column":64}},"907":{"start":{"line":2535,"column":1},"end":{"line":2537,"column":2}},"908":{"start":{"line":2536,"column":2},"end":{"line":2536,"column":51}},"909":{"start":{"line":2538,"column":1},"end":{"line":2538,"column":38}},"910":{"start":{"line":2540,"column":1},"end":{"line":2542,"column":2}},"911":{"start":{"line":2541,"column":2},"end":{"line":2541,"column":51}},"912":{"start":{"line":2543,"column":1},"end":{"line":2543,"column":38}},"913":{"start":{"line":2545,"column":1},"end":{"line":2547,"column":2}},"914":{"start":{"line":2546,"column":2},"end":{"line":2546,"column":46}},"915":{"start":{"line":2548,"column":1},"end":{"line":2548,"column":28}},"916":{"start":{"line":2550,"column":1},"end":{"line":2552,"column":2}},"917":{"start":{"line":2551,"column":2},"end":{"line":2551,"column":46}},"918":{"start":{"line":2553,"column":1},"end":{"line":2553,"column":28}},"919":{"start":{"line":2555,"column":1},"end":{"line":2557,"column":2}},"920":{"start":{"line":2556,"column":2},"end":{"line":2556,"column":27}},"921":{"start":{"line":2558,"column":1},"end":{"line":2558,"column":50}},"922":{"start":{"line":2560,"column":1},"end":{"line":2562,"column":2}},"923":{"start":{"line":2561,"column":2},"end":{"line":2561,"column":26}},"924":{"start":{"line":2563,"column":1},"end":{"line":2563,"column":48}},"925":{"start":{"line":2565,"column":1},"end":{"line":2567,"column":2}},"926":{"start":{"line":2566,"column":2},"end":{"line":2566,"column":13}},"927":{"start":{"line":2568,"column":1},"end":{"line":2568,"column":22}},"928":{"start":{"line":2570,"column":1},"end":{"line":2572,"column":2}},"929":{"start":{"line":2571,"column":2},"end":{"line":2571,"column":28}},"930":{"start":{"line":2573,"column":1},"end":{"line":2573,"column":48}},"931":{"start":{"line":2575,"column":1},"end":{"line":2577,"column":2}},"932":{"start":{"line":2576,"column":2},"end":{"line":2576,"column":26}},"933":{"start":{"line":2578,"column":1},"end":{"line":2578,"column":46}},"934":{"start":{"line":2580,"column":1},"end":{"line":2582,"column":2}},"935":{"start":{"line":2581,"column":2},"end":{"line":2581,"column":25}},"936":{"start":{"line":2583,"column":1},"end":{"line":2583,"column":44}},"937":{"start":{"line":2585,"column":1},"end":{"line":2587,"column":2}},"938":{"start":{"line":2586,"column":2},"end":{"line":2586,"column":23}},"939":{"start":{"line":2588,"column":1},"end":{"line":2588,"column":34}},"940":{"start":{"line":2590,"column":1},"end":{"line":2592,"column":2}},"941":{"start":{"line":2591,"column":2},"end":{"line":2591,"column":15}},"942":{"start":{"line":2593,"column":1},"end":{"line":2593,"column":26}},"943":{"start":{"line":2595,"column":1},"end":{"line":2597,"column":2}},"944":{"start":{"line":2596,"column":2},"end":{"line":2596,"column":15}},"945":{"start":{"line":2598,"column":1},"end":{"line":2598,"column":26}},"946":{"start":{"line":2600,"column":1},"end":{"line":2602,"column":2}},"947":{"start":{"line":2601,"column":2},"end":{"line":2601,"column":20}},"948":{"start":{"line":2603,"column":1},"end":{"line":2603,"column":36}},"949":{"start":{"line":2605,"column":1},"end":{"line":2607,"column":2}},"950":{"start":{"line":2606,"column":2},"end":{"line":2606,"column":23}},"951":{"start":{"line":2608,"column":1},"end":{"line":2608,"column":36}},"952":{"start":{"line":2610,"column":1},"end":{"line":2612,"column":2}},"953":{"start":{"line":2611,"column":2},"end":{"line":2611,"column":40}},"954":{"start":{"line":2613,"column":1},"end":{"line":2613,"column":46}},"955":{"start":{"line":2615,"column":1},"end":{"line":2617,"column":2}},"956":{"start":{"line":2616,"column":2},"end":{"line":2616,"column":22}},"957":{"start":{"line":2618,"column":1},"end":{"line":2618,"column":34}},"958":{"start":{"line":2620,"column":1},"end":{"line":2622,"column":2}},"959":{"start":{"line":2621,"column":2},"end":{"line":2621,"column":37}},"960":{"start":{"line":2623,"column":1},"end":{"line":2623,"column":70}},"961":{"start":{"line":2625,"column":1},"end":{"line":2627,"column":2}},"962":{"start":{"line":2626,"column":2},"end":{"line":2626,"column":33}},"963":{"start":{"line":2628,"column":1},"end":{"line":2628,"column":62}},"964":{"start":{"line":2630,"column":1},"end":{"line":2632,"column":2}},"965":{"start":{"line":2631,"column":2},"end":{"line":2631,"column":22}},"966":{"start":{"line":2633,"column":1},"end":{"line":2633,"column":40}},"967":{"start":{"line":2635,"column":1},"end":{"line":2637,"column":2}},"968":{"start":{"line":2636,"column":2},"end":{"line":2636,"column":15}},"969":{"start":{"line":2638,"column":1},"end":{"line":2638,"column":26}},"970":{"start":{"line":2640,"column":1},"end":{"line":2642,"column":2}},"971":{"start":{"line":2641,"column":2},"end":{"line":2641,"column":23}},"972":{"start":{"line":2643,"column":1},"end":{"line":2643,"column":42}},"973":{"start":{"line":2645,"column":1},"end":{"line":2647,"column":2}},"974":{"start":{"line":2646,"column":2},"end":{"line":2646,"column":26}},"975":{"start":{"line":2648,"column":1},"end":{"line":2648,"column":48}},"976":{"start":{"line":2650,"column":1},"end":{"line":2652,"column":2}},"977":{"start":{"line":2651,"column":2},"end":{"line":2651,"column":42}},"978":{"start":{"line":2653,"column":1},"end":{"line":2653,"column":72}},"979":{"start":{"line":2655,"column":1},"end":{"line":2657,"column":2}},"980":{"start":{"line":2656,"column":2},"end":{"line":2656,"column":38}},"981":{"start":{"line":2658,"column":1},"end":{"line":2658,"column":66}},"982":{"start":{"line":2660,"column":4},"end":{"line":2660,"column":42}},"983":{"start":{"line":2663,"column":0},"end":{"line":2695,"column":2}},"984":{"start":{"line":2665,"column":4},"end":{"line":2693,"column":7}},"985":{"start":{"line":2704,"column":0},"end":{"line":2721,"column":2}},"986":{"start":{"line":2709,"column":4},"end":{"line":2709,"column":51}},"987":{"start":{"line":2710,"column":4},"end":{"line":2710,"column":25}},"988":{"start":{"line":2711,"column":4},"end":{"line":2711,"column":35}},"989":{"start":{"line":2713,"column":4},"end":{"line":2713,"column":35}},"990":{"start":{"line":2715,"column":4},"end":{"line":2717,"column":5}},"991":{"start":{"line":2716,"column":8},"end":{"line":2716,"column":20}},"992":{"start":{"line":2718,"column":4},"end":{"line":2718,"column":25}},"993":{"start":{"line":2720,"column":4},"end":{"line":2720,"column":42}},"994":{"start":{"line":2727,"column":0},"end":{"line":2729,"column":2}},"995":{"start":{"line":2728,"column":4},"end":{"line":2728,"column":37}},"996":{"start":{"line":2735,"column":0},"end":{"line":2739,"column":2}},"997":{"start":{"line":2736,"column":4},"end":{"line":2738,"column":7}},"998":{"start":{"line":2745,"column":0},"end":{"line":2768,"column":2}},"999":{"start":{"line":2747,"column":4},"end":{"line":2747,"column":28}},"1000":{"start":{"line":2749,"column":4},"end":{"line":2766,"column":7}},"1001":{"start":{"line":2791,"column":0},"end":{"line":2831,"column":2}},"1002":{"start":{"line":2809,"column":4},"end":{"line":2809,"column":51}},"1003":{"start":{"line":2810,"column":4},"end":{"line":2810,"column":57}},"1004":{"start":{"line":2811,"column":4},"end":{"line":2811,"column":57}},"1005":{"start":{"line":2812,"column":4},"end":{"line":2812,"column":71}},"1006":{"start":{"line":2813,"column":4},"end":{"line":2813,"column":71}},"1007":{"start":{"line":2814,"column":4},"end":{"line":2814,"column":54}},"1008":{"start":{"line":2815,"column":4},"end":{"line":2815,"column":66}},"1009":{"start":{"line":2816,"column":4},"end":{"line":2816,"column":84}},"1010":{"start":{"line":2817,"column":4},"end":{"line":2817,"column":87}},"1011":{"start":{"line":2818,"column":4},"end":{"line":2818,"column":75}},"1012":{"start":{"line":2819,"column":4},"end":{"line":2819,"column":89}},"1013":{"start":{"line":2820,"column":4},"end":{"line":2820,"column":86}},"1014":{"start":{"line":2821,"column":4},"end":{"line":2821,"column":102}},"1015":{"start":{"line":2822,"column":4},"end":{"line":2822,"column":99}},"1016":{"start":{"line":2823,"column":4},"end":{"line":2823,"column":85}},"1017":{"start":{"line":2824,"column":4},"end":{"line":2824,"column":60}},"1018":{"start":{"line":2826,"column":4},"end":{"line":2826,"column":25}},"1019":{"start":{"line":2828,"column":4},"end":{"line":2828,"column":35}},"1020":{"start":{"line":2830,"column":4},"end":{"line":2830,"column":42}},"1021":{"start":{"line":2837,"column":0},"end":{"line":2877,"column":2}},"1022":{"start":{"line":2839,"column":4},"end":{"line":2872,"column":7}},"1023":{"start":{"line":2874,"column":4},"end":{"line":2874,"column":29}},"1024":{"start":{"line":2876,"column":4},"end":{"line":2876,"column":20}},"1025":{"start":{"line":2886,"column":0},"end":{"line":2913,"column":2}},"1026":{"start":{"line":2891,"column":4},"end":{"line":2893,"column":5}},"1027":{"start":{"line":2892,"column":8},"end":{"line":2892,"column":47}},"1028":{"start":{"line":2895,"column":4},"end":{"line":2897,"column":5}},"1029":{"start":{"line":2896,"column":8},"end":{"line":2896,"column":54}},"1030":{"start":{"line":2899,"column":4},"end":{"line":2912,"column":6}},"1031":{"start":{"line":2925,"column":0},"end":{"line":2936,"column":2}},"1032":{"start":{"line":2931,"column":4},"end":{"line":2931,"column":51}},"1033":{"start":{"line":2932,"column":4},"end":{"line":2932,"column":21}},"1034":{"start":{"line":2933,"column":4},"end":{"line":2933,"column":29}},"1035":{"start":{"line":2934,"column":4},"end":{"line":2934,"column":21}},"1036":{"start":{"line":2935,"column":4},"end":{"line":2935,"column":31}},"1037":{"start":{"line":2954,"column":0},"end":{"line":3020,"column":2}},"1038":{"start":{"line":2968,"column":4},"end":{"line":2968,"column":17}},"1039":{"start":{"line":2969,"column":4},"end":{"line":2969,"column":47}},"1040":{"start":{"line":2970,"column":4},"end":{"line":2970,"column":21}},"1041":{"start":{"line":2971,"column":4},"end":{"line":2971,"column":21}},"1042":{"start":{"line":2972,"column":4},"end":{"line":2974,"column":5}},"1043":{"start":{"line":2973,"column":8},"end":{"line":2973,"column":30}},"1044":{"start":{"line":2976,"column":4},"end":{"line":2978,"column":5}},"1045":{"start":{"line":2977,"column":8},"end":{"line":2977,"column":20}},"1046":{"start":{"line":2979,"column":4},"end":{"line":2979,"column":25}},"1047":{"start":{"line":2981,"column":4},"end":{"line":2983,"column":5}},"1048":{"start":{"line":2982,"column":8},"end":{"line":2982,"column":46}},"1049":{"start":{"line":2984,"column":4},"end":{"line":2984,"column":33}},"1050":{"start":{"line":2986,"column":4},"end":{"line":2988,"column":5}},"1051":{"start":{"line":2987,"column":8},"end":{"line":2987,"column":49}},"1052":{"start":{"line":2989,"column":4},"end":{"line":2989,"column":29}},"1053":{"start":{"line":2991,"column":4},"end":{"line":2993,"column":5}},"1054":{"start":{"line":2992,"column":8},"end":{"line":2992,"column":49}},"1055":{"start":{"line":2994,"column":4},"end":{"line":2994,"column":29}},"1056":{"start":{"line":2996,"column":4},"end":{"line":2998,"column":5}},"1057":{"start":{"line":2997,"column":8},"end":{"line":2997,"column":46}},"1058":{"start":{"line":2999,"column":4},"end":{"line":2999,"column":23}},"1059":{"start":{"line":3001,"column":4},"end":{"line":3003,"column":5}},"1060":{"start":{"line":3002,"column":8},"end":{"line":3002,"column":29}},"1061":{"start":{"line":3004,"column":4},"end":{"line":3004,"column":39}},"1062":{"start":{"line":3006,"column":4},"end":{"line":3008,"column":5}},"1063":{"start":{"line":3007,"column":8},"end":{"line":3007,"column":20}},"1064":{"start":{"line":3009,"column":4},"end":{"line":3009,"column":25}},"1065":{"start":{"line":3011,"column":4},"end":{"line":3013,"column":5}},"1066":{"start":{"line":3012,"column":8},"end":{"line":3012,"column":20}},"1067":{"start":{"line":3014,"column":4},"end":{"line":3014,"column":25}},"1068":{"start":{"line":3016,"column":4},"end":{"line":3018,"column":5}},"1069":{"start":{"line":3017,"column":8},"end":{"line":3017,"column":22}},"1070":{"start":{"line":3019,"column":4},"end":{"line":3019,"column":29}},"1071":{"start":{"line":3031,"column":0},"end":{"line":3249,"column":2}},"1072":{"start":{"line":3043,"column":4},"end":{"line":3046,"column":5}},"1073":{"start":{"line":3044,"column":8},"end":{"line":3044,"column":68}},"1074":{"start":{"line":3045,"column":8},"end":{"line":3045,"column":60}},"1075":{"start":{"line":3048,"column":4},"end":{"line":3048,"column":35}},"1076":{"start":{"line":3049,"column":4},"end":{"line":3052,"column":6}},"1077":{"start":{"line":3054,"column":4},"end":{"line":3246,"column":11}},"1078":{"start":{"line":3055,"column":8},"end":{"line":3245,"column":9}},"1079":{"start":{"line":3056,"column":12},"end":{"line":3244,"column":13}},"1080":{"start":{"line":3058,"column":16},"end":{"line":3058,"column":60}},"1081":{"start":{"line":3060,"column":16},"end":{"line":3062,"column":17}},"1082":{"start":{"line":3061,"column":20},"end":{"line":3061,"column":83}},"1083":{"start":{"line":3064,"column":16},"end":{"line":3064,"column":46}},"1084":{"start":{"line":3066,"column":16},"end":{"line":3066,"column":36}},"1085":{"start":{"line":3068,"column":16},"end":{"line":3150,"column":17}},"1086":{"start":{"line":3070,"column":20},"end":{"line":3149,"column":21}},"1087":{"start":{"line":3072,"column":24},"end":{"line":3072,"column":55}},"1088":{"start":{"line":3074,"column":24},"end":{"line":3074,"column":42}},"1089":{"start":{"line":3076,"column":24},"end":{"line":3081,"column":25}},"1090":{"start":{"line":3077,"column":28},"end":{"line":3080,"column":30}},"1091":{"start":{"line":3083,"column":24},"end":{"line":3088,"column":26}},"1092":{"start":{"line":3090,"column":24},"end":{"line":3090,"column":42}},"1093":{"start":{"line":3092,"column":24},"end":{"line":3146,"column":25}},"1094":{"start":{"line":3094,"column":28},"end":{"line":3094,"column":58}},"1095":{"start":{"line":3096,"column":28},"end":{"line":3096,"column":62}},"1096":{"start":{"line":3098,"column":28},"end":{"line":3102,"column":30}},"1097":{"start":{"line":3104,"column":28},"end":{"line":3104,"column":54}},"1098":{"start":{"line":3106,"column":28},"end":{"line":3112,"column":30}},"1099":{"start":{"line":3114,"column":28},"end":{"line":3114,"column":59}},"1100":{"start":{"line":3116,"column":28},"end":{"line":3116,"column":46}},"1101":{"start":{"line":3118,"column":28},"end":{"line":3129,"column":29}},"1102":{"start":{"line":3120,"column":32},"end":{"line":3120,"column":53}},"1103":{"start":{"line":3123,"column":32},"end":{"line":3126,"column":34}},"1104":{"start":{"line":3128,"column":32},"end":{"line":3128,"column":54}},"1105":{"start":{"line":3131,"column":28},"end":{"line":3143,"column":30}},"1106":{"start":{"line":3145,"column":28},"end":{"line":3145,"column":51}},"1107":{"start":{"line":3148,"column":24},"end":{"line":3148,"column":51}},"1108":{"start":{"line":3152,"column":16},"end":{"line":3152,"column":34}},"1109":{"start":{"line":3154,"column":16},"end":{"line":3203,"column":17}},"1110":{"start":{"line":3156,"column":20},"end":{"line":3156,"column":48}},"1111":{"start":{"line":3158,"column":20},"end":{"line":3200,"column":22}},"1112":{"start":{"line":3202,"column":20},"end":{"line":3202,"column":43}},"1113":{"start":{"line":3205,"column":16},"end":{"line":3234,"column":18}},"1114":{"start":{"line":3236,"column":16},"end":{"line":3243,"column":18}},"1115":{"start":{"line":3248,"column":4},"end":{"line":3248,"column":15}},"1116":{"start":{"line":3260,"column":0},"end":{"line":3566,"column":2}},"1117":{"start":{"line":3269,"column":4},"end":{"line":3269,"column":54}},"1118":{"start":{"line":3271,"column":4},"end":{"line":3271,"column":31}},"1119":{"start":{"line":3273,"column":4},"end":{"line":3273,"column":19}},"1120":{"start":{"line":3275,"column":4},"end":{"line":3470,"column":5}},"1121":{"start":{"line":3277,"column":8},"end":{"line":3277,"column":42}},"1122":{"start":{"line":3279,"column":8},"end":{"line":3279,"column":49}},"1123":{"start":{"line":3281,"column":8},"end":{"line":3281,"column":56}},"1124":{"start":{"line":3283,"column":8},"end":{"line":3283,"column":37}},"1125":{"start":{"line":3285,"column":8},"end":{"line":3285,"column":31}},"1126":{"start":{"line":3287,"column":8},"end":{"line":3287,"column":47}},"1127":{"start":{"line":3289,"column":8},"end":{"line":3289,"column":39}},"1128":{"start":{"line":3294,"column":8},"end":{"line":3302,"column":9}},"1129":{"start":{"line":3295,"column":12},"end":{"line":3301,"column":13}},"1130":{"start":{"line":3307,"column":8},"end":{"line":3369,"column":9}},"1131":{"start":{"line":3309,"column":12},"end":{"line":3324,"column":14}},"1132":{"start":{"line":3326,"column":12},"end":{"line":3342,"column":14}},"1133":{"start":{"line":3344,"column":12},"end":{"line":3348,"column":14}},"1134":{"start":{"line":3350,"column":12},"end":{"line":3366,"column":14}},"1135":{"start":{"line":3368,"column":12},"end":{"line":3368,"column":38}},"1136":{"start":{"line":3371,"column":8},"end":{"line":3371,"column":36}},"1137":{"start":{"line":3376,"column":8},"end":{"line":3399,"column":9}},"1138":{"start":{"line":3378,"column":12},"end":{"line":3378,"column":58}},"1139":{"start":{"line":3380,"column":12},"end":{"line":3380,"column":44}},"1140":{"start":{"line":3382,"column":12},"end":{"line":3398,"column":13}},"1141":{"start":{"line":3383,"column":16},"end":{"line":3383,"column":53}},"1142":{"start":{"line":3384,"column":16},"end":{"line":3397,"column":18}},"1143":{"start":{"line":3405,"column":8},"end":{"line":3408,"column":9}},"1144":{"start":{"line":3406,"column":12},"end":{"line":3406,"column":42}},"1145":{"start":{"line":3407,"column":12},"end":{"line":3407,"column":44}},"1146":{"start":{"line":3410,"column":8},"end":{"line":3410,"column":41}},"1147":{"start":{"line":3415,"column":8},"end":{"line":3424,"column":9}},"1148":{"start":{"line":3416,"column":12},"end":{"line":3423,"column":14}},"1149":{"start":{"line":3426,"column":8},"end":{"line":3467,"column":11}},"1150":{"start":{"line":3428,"column":16},"end":{"line":3463,"column":18}},"1151":{"start":{"line":3430,"column":20},"end":{"line":3430,"column":74}},"1152":{"start":{"line":3435,"column":20},"end":{"line":3435,"column":48}},"1153":{"start":{"line":3437,"column":20},"end":{"line":3442,"column":22}},"1154":{"start":{"line":3443,"column":20},"end":{"line":3443,"column":47}},"1155":{"start":{"line":3445,"column":20},"end":{"line":3445,"column":59}},"1156":{"start":{"line":3446,"column":20},"end":{"line":3446,"column":59}},"1157":{"start":{"line":3447,"column":20},"end":{"line":3447,"column":59}},"1158":{"start":{"line":3449,"column":20},"end":{"line":3449,"column":59}},"1159":{"start":{"line":3450,"column":20},"end":{"line":3450,"column":59}},"1160":{"start":{"line":3451,"column":20},"end":{"line":3451,"column":59}},"1161":{"start":{"line":3453,"column":20},"end":{"line":3453,"column":53}},"1162":{"start":{"line":3454,"column":20},"end":{"line":3454,"column":53}},"1163":{"start":{"line":3455,"column":20},"end":{"line":3455,"column":53}},"1164":{"start":{"line":3457,"column":20},"end":{"line":3457,"column":63}},"1165":{"start":{"line":3458,"column":20},"end":{"line":3458,"column":63}},"1166":{"start":{"line":3459,"column":20},"end":{"line":3459,"column":63}},"1167":{"start":{"line":3460,"column":20},"end":{"line":3460,"column":63}},"1168":{"start":{"line":3462,"column":20},"end":{"line":3462,"column":37}},"1169":{"start":{"line":3466,"column":12},"end":{"line":3466,"column":31}},"1170":{"start":{"line":3469,"column":8},"end":{"line":3469,"column":27}},"1171":{"start":{"line":3472,"column":4},"end":{"line":3565,"column":6}},"1172":{"start":{"line":3474,"column":8},"end":{"line":3474,"column":46}},"1173":{"start":{"line":3475,"column":8},"end":{"line":3560,"column":9}},"1174":{"start":{"line":3477,"column":12},"end":{"line":3477,"column":36}},"1175":{"start":{"line":3479,"column":12},"end":{"line":3521,"column":13}},"1176":{"start":{"line":3481,"column":16},"end":{"line":3481,"column":60}},"1177":{"start":{"line":3483,"column":16},"end":{"line":3483,"column":33}},"1178":{"start":{"line":3485,"column":16},"end":{"line":3487,"column":17}},"1179":{"start":{"line":3486,"column":20},"end":{"line":3486,"column":107}},"1180":{"start":{"line":3489,"column":16},"end":{"line":3491,"column":17}},"1181":{"start":{"line":3490,"column":20},"end":{"line":3490,"column":111}},"1182":{"start":{"line":3493,"column":16},"end":{"line":3497,"column":17}},"1183":{"start":{"line":3494,"column":20},"end":{"line":3494,"column":105}},"1184":{"start":{"line":3495,"column":20},"end":{"line":3495,"column":59}},"1185":{"start":{"line":3496,"column":20},"end":{"line":3496,"column":53}},"1186":{"start":{"line":3499,"column":16},"end":{"line":3505,"column":17}},"1187":{"start":{"line":3500,"column":20},"end":{"line":3500,"column":104}},"1188":{"start":{"line":3501,"column":20},"end":{"line":3501,"column":59}},"1189":{"start":{"line":3502,"column":20},"end":{"line":3502,"column":53}},"1190":{"start":{"line":3503,"column":20},"end":{"line":3503,"column":59}},"1191":{"start":{"line":3504,"column":20},"end":{"line":3504,"column":53}},"1192":{"start":{"line":3507,"column":16},"end":{"line":3507,"column":59}},"1193":{"start":{"line":3508,"column":16},"end":{"line":3508,"column":59}},"1194":{"start":{"line":3509,"column":16},"end":{"line":3509,"column":59}},"1195":{"start":{"line":3511,"column":16},"end":{"line":3511,"column":59}},"1196":{"start":{"line":3512,"column":16},"end":{"line":3512,"column":59}},"1197":{"start":{"line":3513,"column":16},"end":{"line":3513,"column":59}},"1198":{"start":{"line":3515,"column":16},"end":{"line":3520,"column":17}},"1199":{"start":{"line":3516,"column":20},"end":{"line":3516,"column":114}},"1200":{"start":{"line":3518,"column":20},"end":{"line":3518,"column":51}},"1201":{"start":{"line":3519,"column":20},"end":{"line":3519,"column":47}},"1202":{"start":{"line":3523,"column":12},"end":{"line":3523,"column":62}},"1203":{"start":{"line":3525,"column":12},"end":{"line":3525,"column":51}},"1204":{"start":{"line":3527,"column":12},"end":{"line":3527,"column":63}},"1205":{"start":{"line":3528,"column":12},"end":{"line":3528,"column":63}},"1206":{"start":{"line":3529,"column":12},"end":{"line":3529,"column":63}},"1207":{"start":{"line":3531,"column":12},"end":{"line":3531,"column":63}},"1208":{"start":{"line":3532,"column":12},"end":{"line":3532,"column":63}},"1209":{"start":{"line":3533,"column":12},"end":{"line":3533,"column":63}},"1210":{"start":{"line":3535,"column":12},"end":{"line":3535,"column":57}},"1211":{"start":{"line":3536,"column":12},"end":{"line":3536,"column":57}},"1212":{"start":{"line":3537,"column":12},"end":{"line":3537,"column":57}},"1213":{"start":{"line":3539,"column":12},"end":{"line":3539,"column":67}},"1214":{"start":{"line":3540,"column":12},"end":{"line":3540,"column":67}},"1215":{"start":{"line":3541,"column":12},"end":{"line":3541,"column":67}},"1216":{"start":{"line":3542,"column":12},"end":{"line":3542,"column":67}},"1217":{"start":{"line":3544,"column":12},"end":{"line":3546,"column":13}},"1218":{"start":{"line":3545,"column":16},"end":{"line":3545,"column":53}},"1219":{"start":{"line":3548,"column":12},"end":{"line":3550,"column":13}},"1220":{"start":{"line":3549,"column":16},"end":{"line":3549,"column":53}},"1221":{"start":{"line":3552,"column":12},"end":{"line":3559,"column":14}},"1222":{"start":{"line":3563,"column":12},"end":{"line":3563,"column":31}},"1223":{"start":{"line":3584,"column":0},"end":{"line":3656,"column":2}},"1224":{"start":{"line":3598,"column":4},"end":{"line":3598,"column":25}},"1225":{"start":{"line":3600,"column":4},"end":{"line":3600,"column":35}},"1226":{"start":{"line":3602,"column":4},"end":{"line":3602,"column":31}},"1227":{"start":{"line":3604,"column":4},"end":{"line":3604,"column":42}},"1228":{"start":{"line":3606,"column":4},"end":{"line":3608,"column":5}},"1229":{"start":{"line":3607,"column":8},"end":{"line":3607,"column":47}},"1230":{"start":{"line":3609,"column":4},"end":{"line":3609,"column":23}},"1231":{"start":{"line":3611,"column":4},"end":{"line":3613,"column":5}},"1232":{"start":{"line":3612,"column":8},"end":{"line":3612,"column":22}},"1233":{"start":{"line":3614,"column":4},"end":{"line":3614,"column":29}},"1234":{"start":{"line":3616,"column":4},"end":{"line":3618,"column":5}},"1235":{"start":{"line":3617,"column":8},"end":{"line":3617,"column":21}},"1236":{"start":{"line":3619,"column":4},"end":{"line":3619,"column":27}},"1237":{"start":{"line":3621,"column":4},"end":{"line":3623,"column":5}},"1238":{"start":{"line":3622,"column":8},"end":{"line":3622,"column":19}},"1239":{"start":{"line":3624,"column":4},"end":{"line":3624,"column":25}},"1240":{"start":{"line":3626,"column":4},"end":{"line":3628,"column":5}},"1241":{"start":{"line":3627,"column":8},"end":{"line":3627,"column":55}},"1242":{"start":{"line":3629,"column":4},"end":{"line":3629,"column":41}},"1243":{"start":{"line":3631,"column":4},"end":{"line":3633,"column":5}},"1244":{"start":{"line":3632,"column":8},"end":{"line":3632,"column":22}},"1245":{"start":{"line":3634,"column":4},"end":{"line":3634,"column":31}},"1246":{"start":{"line":3636,"column":4},"end":{"line":3638,"column":5}},"1247":{"start":{"line":3637,"column":8},"end":{"line":3637,"column":25}},"1248":{"start":{"line":3639,"column":4},"end":{"line":3639,"column":37}},"1249":{"start":{"line":3641,"column":4},"end":{"line":3643,"column":5}},"1250":{"start":{"line":3642,"column":8},"end":{"line":3642,"column":19}},"1251":{"start":{"line":3644,"column":4},"end":{"line":3644,"column":25}},"1252":{"start":{"line":3646,"column":4},"end":{"line":3648,"column":5}},"1253":{"start":{"line":3647,"column":8},"end":{"line":3647,"column":24}},"1254":{"start":{"line":3649,"column":4},"end":{"line":3649,"column":35}},"1255":{"start":{"line":3651,"column":4},"end":{"line":3653,"column":5}},"1256":{"start":{"line":3652,"column":8},"end":{"line":3652,"column":47}},"1257":{"start":{"line":3654,"column":4},"end":{"line":3654,"column":31}},"1258":{"start":{"line":3662,"column":0},"end":{"line":3662,"column":46}},"1259":{"start":{"line":3663,"column":0},"end":{"line":3663,"column":46}},"1260":{"start":{"line":3664,"column":0},"end":{"line":3664,"column":46}},"1261":{"start":{"line":3665,"column":0},"end":{"line":3665,"column":46}},"1262":{"start":{"line":3666,"column":0},"end":{"line":3666,"column":46}},"1263":{"start":{"line":3667,"column":0},"end":{"line":3667,"column":46}},"1264":{"start":{"line":3672,"column":0},"end":{"line":3718,"column":2}},"1265":{"start":{"line":3674,"column":4},"end":{"line":3674,"column":24}},"1266":{"start":{"line":3676,"column":4},"end":{"line":3713,"column":5}},"1267":{"start":{"line":3677,"column":8},"end":{"line":3680,"column":10}},"1268":{"start":{"line":3681,"column":11},"end":{"line":3713,"column":5}},"1269":{"start":{"line":3682,"column":8},"end":{"line":3684,"column":10}},"1270":{"start":{"line":3685,"column":11},"end":{"line":3713,"column":5}},"1271":{"start":{"line":3686,"column":8},"end":{"line":3692,"column":10}},"1272":{"start":{"line":3693,"column":11},"end":{"line":3713,"column":5}},"1273":{"start":{"line":3694,"column":8},"end":{"line":3699,"column":10}},"1274":{"start":{"line":3700,"column":11},"end":{"line":3713,"column":5}},"1275":{"start":{"line":3701,"column":8},"end":{"line":3706,"column":10}},"1276":{"start":{"line":3707,"column":11},"end":{"line":3713,"column":5}},"1277":{"start":{"line":3708,"column":8},"end":{"line":3708,"column":70}},"1278":{"start":{"line":3709,"column":8},"end":{"line":3709,"column":73}},"1279":{"start":{"line":3711,"column":8},"end":{"line":3711,"column":70}},"1280":{"start":{"line":3712,"column":8},"end":{"line":3712,"column":73}},"1281":{"start":{"line":3715,"column":4},"end":{"line":3715,"column":29}},"1282":{"start":{"line":3717,"column":4},"end":{"line":3717,"column":20}},"1283":{"start":{"line":3724,"column":0},"end":{"line":3743,"column":2}},"1284":{"start":{"line":3727,"column":4},"end":{"line":3727,"column":30}},"1285":{"start":{"line":3729,"column":4},"end":{"line":3742,"column":5}},"1286":{"start":{"line":3730,"column":8},"end":{"line":3736,"column":10}},"1287":{"start":{"line":3737,"column":8},"end":{"line":3737,"column":35}},"1288":{"start":{"line":3738,"column":8},"end":{"line":3738,"column":38}},"1289":{"start":{"line":3739,"column":8},"end":{"line":3739,"column":36}},"1290":{"start":{"line":3740,"column":8},"end":{"line":3740,"column":51}},"1291":{"start":{"line":3741,"column":8},"end":{"line":3741,"column":35}},"1292":{"start":{"line":3757,"column":0},"end":{"line":3812,"column":2}},"1293":{"start":{"line":3767,"column":4},"end":{"line":3767,"column":17}},"1294":{"start":{"line":3769,"column":4},"end":{"line":3769,"column":23}},"1295":{"start":{"line":3775,"column":4},"end":{"line":3777,"column":5}},"1296":{"start":{"line":3776,"column":8},"end":{"line":3776,"column":26}},"1297":{"start":{"line":3778,"column":4},"end":{"line":3778,"column":37}},"1298":{"start":{"line":3784,"column":4},"end":{"line":3786,"column":5}},"1299":{"start":{"line":3785,"column":8},"end":{"line":3785,"column":33}},"1300":{"start":{"line":3787,"column":4},"end":{"line":3787,"column":45}},"1301":{"start":{"line":3789,"column":4},"end":{"line":3791,"column":5}},"1302":{"start":{"line":3790,"column":8},"end":{"line":3790,"column":112}},"1303":{"start":{"line":3793,"column":4},"end":{"line":3795,"column":5}},"1304":{"start":{"line":3794,"column":8},"end":{"line":3794,"column":29}},"1305":{"start":{"line":3796,"column":4},"end":{"line":3796,"column":45}},"1306":{"start":{"line":3798,"column":4},"end":{"line":3800,"column":5}},"1307":{"start":{"line":3799,"column":8},"end":{"line":3799,"column":30}},"1308":{"start":{"line":3801,"column":4},"end":{"line":3801,"column":47}},"1309":{"start":{"line":3803,"column":4},"end":{"line":3805,"column":5}},"1310":{"start":{"line":3804,"column":8},"end":{"line":3804,"column":26}},"1311":{"start":{"line":3806,"column":4},"end":{"line":3806,"column":37}},"1312":{"start":{"line":3808,"column":4},"end":{"line":3810,"column":5}},"1313":{"start":{"line":3809,"column":8},"end":{"line":3809,"column":25}},"1314":{"start":{"line":3811,"column":4},"end":{"line":3811,"column":35}},"1315":{"start":{"line":3815,"column":0},"end":{"line":3824,"column":2}},"1316":{"start":{"line":3818,"column":4},"end":{"line":3818,"column":19}},"1317":{"start":{"line":3820,"column":4},"end":{"line":3820,"column":29}},"1318":{"start":{"line":3821,"column":4},"end":{"line":3821,"column":36}},"1319":{"start":{"line":3823,"column":4},"end":{"line":3823,"column":31}},"1320":{"start":{"line":3826,"column":0},"end":{"line":3864,"column":2}},"1321":{"start":{"line":3829,"column":4},"end":{"line":3829,"column":41}},"1322":{"start":{"line":3830,"column":4},"end":{"line":3830,"column":23}},"1323":{"start":{"line":3831,"column":4},"end":{"line":3831,"column":24}},"1324":{"start":{"line":3832,"column":4},"end":{"line":3832,"column":19}},"1325":{"start":{"line":3833,"column":4},"end":{"line":3833,"column":52}},"1326":{"start":{"line":3834,"column":4},"end":{"line":3834,"column":28}},"1327":{"start":{"line":3836,"column":4},"end":{"line":3836,"column":67}},"1328":{"start":{"line":3839,"column":4},"end":{"line":3839,"column":75}},"1329":{"start":{"line":3840,"column":4},"end":{"line":3840,"column":75}},"1330":{"start":{"line":3841,"column":4},"end":{"line":3841,"column":75}},"1331":{"start":{"line":3842,"column":4},"end":{"line":3842,"column":75}},"1332":{"start":{"line":3843,"column":4},"end":{"line":3843,"column":75}},"1333":{"start":{"line":3844,"column":4},"end":{"line":3844,"column":75}},"1334":{"start":{"line":3847,"column":4},"end":{"line":3849,"column":5}},"1335":{"start":{"line":3848,"column":8},"end":{"line":3848,"column":101}},"1336":{"start":{"line":3852,"column":4},"end":{"line":3852,"column":159}},"1337":{"start":{"line":3853,"column":4},"end":{"line":3853,"column":84}},"1338":{"start":{"line":3854,"column":4},"end":{"line":3854,"column":30}},"1339":{"start":{"line":3859,"column":4},"end":{"line":3863,"column":7}},"1340":{"start":{"line":3866,"column":0},"end":{"line":3883,"column":2}},"1341":{"start":{"line":3870,"column":4},"end":{"line":3870,"column":132}},"1342":{"start":{"line":3872,"column":4},"end":{"line":3872,"column":38}},"1343":{"start":{"line":3874,"column":4},"end":{"line":3874,"column":35}},"1344":{"start":{"line":3876,"column":4},"end":{"line":3876,"column":30}},"1345":{"start":{"line":3878,"column":4},"end":{"line":3878,"column":50}},"1346":{"start":{"line":3880,"column":4},"end":{"line":3880,"column":29}},"1347":{"start":{"line":3882,"column":4},"end":{"line":3882,"column":46}},"1348":{"start":{"line":3894,"column":0},"end":{"line":3915,"column":2}},"1349":{"start":{"line":3901,"column":4},"end":{"line":3901,"column":17}},"1350":{"start":{"line":3902,"column":4},"end":{"line":3910,"column":5}},"1351":{"start":{"line":3903,"column":8},"end":{"line":3909,"column":9}},"1352":{"start":{"line":3904,"column":12},"end":{"line":3904,"column":34}},"1353":{"start":{"line":3905,"column":15},"end":{"line":3909,"column":9}},"1354":{"start":{"line":3906,"column":12},"end":{"line":3906,"column":31}},"1355":{"start":{"line":3908,"column":12},"end":{"line":3908,"column":36}},"1356":{"start":{"line":3911,"column":4},"end":{"line":3911,"column":21}},"1357":{"start":{"line":3912,"column":4},"end":{"line":3912,"column":33}},"1358":{"start":{"line":3913,"column":4},"end":{"line":3913,"column":33}},"1359":{"start":{"line":3914,"column":4},"end":{"line":3914,"column":31}},"1360":{"start":{"line":3921,"column":0},"end":{"line":3921,"column":38}},"1361":{"start":{"line":3922,"column":0},"end":{"line":3922,"column":35}},"1362":{"start":{"line":3948,"column":0},"end":{"line":4058,"column":2}},"1363":{"start":{"line":3970,"column":4},"end":{"line":3970,"column":17}},"1364":{"start":{"line":3971,"column":4},"end":{"line":3971,"column":21}},"1365":{"start":{"line":3972,"column":4},"end":{"line":3972,"column":23}},"1366":{"start":{"line":3974,"column":4},"end":{"line":3976,"column":5}},"1367":{"start":{"line":3975,"column":8},"end":{"line":3975,"column":56}},"1368":{"start":{"line":3977,"column":4},"end":{"line":3977,"column":23}},"1369":{"start":{"line":3979,"column":4},"end":{"line":3981,"column":5}},"1370":{"start":{"line":3980,"column":8},"end":{"line":3980,"column":56}},"1371":{"start":{"line":3982,"column":4},"end":{"line":3982,"column":23}},"1372":{"start":{"line":3984,"column":4},"end":{"line":3986,"column":5}},"1373":{"start":{"line":3985,"column":8},"end":{"line":3985,"column":46}},"1374":{"start":{"line":3987,"column":4},"end":{"line":3987,"column":25}},"1375":{"start":{"line":3989,"column":4},"end":{"line":3991,"column":5}},"1376":{"start":{"line":3990,"column":8},"end":{"line":3990,"column":20}},"1377":{"start":{"line":3992,"column":4},"end":{"line":3992,"column":21}},"1378":{"start":{"line":3994,"column":4},"end":{"line":3996,"column":5}},"1379":{"start":{"line":3995,"column":8},"end":{"line":3995,"column":53}},"1380":{"start":{"line":3997,"column":4},"end":{"line":3997,"column":25}},"1381":{"start":{"line":3999,"column":4},"end":{"line":4001,"column":5}},"1382":{"start":{"line":4000,"column":8},"end":{"line":4000,"column":53}},"1383":{"start":{"line":4002,"column":4},"end":{"line":4002,"column":27}},"1384":{"start":{"line":4004,"column":4},"end":{"line":4006,"column":5}},"1385":{"start":{"line":4005,"column":8},"end":{"line":4005,"column":58}},"1386":{"start":{"line":4007,"column":4},"end":{"line":4007,"column":31}},"1387":{"start":{"line":4009,"column":4},"end":{"line":4011,"column":5}},"1388":{"start":{"line":4010,"column":8},"end":{"line":4010,"column":72}},"1389":{"start":{"line":4012,"column":4},"end":{"line":4012,"column":31}},"1390":{"start":{"line":4014,"column":4},"end":{"line":4016,"column":5}},"1391":{"start":{"line":4015,"column":8},"end":{"line":4015,"column":60}},"1392":{"start":{"line":4017,"column":4},"end":{"line":4017,"column":35}},"1393":{"start":{"line":4019,"column":4},"end":{"line":4021,"column":5}},"1394":{"start":{"line":4020,"column":8},"end":{"line":4020,"column":23}},"1395":{"start":{"line":4022,"column":4},"end":{"line":4022,"column":33}},"1396":{"start":{"line":4024,"column":4},"end":{"line":4026,"column":5}},"1397":{"start":{"line":4025,"column":8},"end":{"line":4025,"column":46}},"1398":{"start":{"line":4027,"column":4},"end":{"line":4027,"column":25}},"1399":{"start":{"line":4029,"column":4},"end":{"line":4031,"column":5}},"1400":{"start":{"line":4030,"column":8},"end":{"line":4030,"column":31}},"1401":{"start":{"line":4032,"column":4},"end":{"line":4032,"column":43}},"1402":{"start":{"line":4034,"column":4},"end":{"line":4036,"column":5}},"1403":{"start":{"line":4035,"column":8},"end":{"line":4035,"column":21}},"1404":{"start":{"line":4037,"column":4},"end":{"line":4037,"column":23}},"1405":{"start":{"line":4039,"column":4},"end":{"line":4041,"column":5}},"1406":{"start":{"line":4040,"column":8},"end":{"line":4040,"column":21}},"1407":{"start":{"line":4042,"column":4},"end":{"line":4042,"column":27}},"1408":{"start":{"line":4044,"column":4},"end":{"line":4046,"column":5}},"1409":{"start":{"line":4045,"column":8},"end":{"line":4045,"column":28}},"1410":{"start":{"line":4047,"column":4},"end":{"line":4047,"column":43}},"1411":{"start":{"line":4049,"column":4},"end":{"line":4051,"column":5}},"1412":{"start":{"line":4050,"column":8},"end":{"line":4050,"column":33}},"1413":{"start":{"line":4052,"column":4},"end":{"line":4052,"column":45}},"1414":{"start":{"line":4054,"column":4},"end":{"line":4056,"column":5}},"1415":{"start":{"line":4055,"column":8},"end":{"line":4055,"column":59}},"1416":{"start":{"line":4057,"column":4},"end":{"line":4057,"column":29}},"1417":{"start":{"line":4064,"column":0},"end":{"line":4064,"column":44}},"1418":{"start":{"line":4065,"column":0},"end":{"line":4065,"column":42}},"1419":{"start":{"line":4066,"column":0},"end":{"line":4066,"column":43}},"1420":{"start":{"line":4067,"column":0},"end":{"line":4067,"column":48}},"1421":{"start":{"line":4068,"column":0},"end":{"line":4068,"column":54}},"1422":{"start":{"line":4069,"column":0},"end":{"line":4069,"column":44}},"1423":{"start":{"line":4075,"column":0},"end":{"line":4075,"column":41}},"1424":{"start":{"line":4076,"column":0},"end":{"line":4076,"column":54}},"1425":{"start":{"line":4077,"column":0},"end":{"line":4077,"column":54}},"1426":{"start":{"line":4078,"column":0},"end":{"line":4078,"column":66}},"1427":{"start":{"line":4079,"column":0},"end":{"line":4079,"column":66}},"1428":{"start":{"line":4080,"column":0},"end":{"line":4080,"column":59}},"1429":{"start":{"line":4081,"column":0},"end":{"line":4081,"column":57}},"1430":{"start":{"line":4082,"column":0},"end":{"line":4082,"column":57}},"1431":{"start":{"line":4088,"column":0},"end":{"line":4088,"column":47}},"1432":{"start":{"line":4089,"column":0},"end":{"line":4089,"column":54}},"1433":{"start":{"line":4090,"column":0},"end":{"line":4090,"column":56}},"1434":{"start":{"line":4096,"column":0},"end":{"line":4096,"column":46}},"1435":{"start":{"line":4097,"column":0},"end":{"line":4097,"column":61}},"1436":{"start":{"line":4098,"column":0},"end":{"line":4098,"column":60}},"1437":{"start":{"line":4099,"column":0},"end":{"line":4099,"column":45}},"1438":{"start":{"line":4100,"column":0},"end":{"line":4100,"column":60}},"1439":{"start":{"line":4101,"column":0},"end":{"line":4101,"column":59}},"1440":{"start":{"line":4107,"column":0},"end":{"line":4107,"column":45}},"1441":{"start":{"line":4108,"column":0},"end":{"line":4108,"column":36}},"1442":{"start":{"line":4109,"column":0},"end":{"line":4109,"column":37}},"1443":{"start":{"line":4110,"column":0},"end":{"line":4110,"column":46}},"1444":{"start":{"line":4111,"column":0},"end":{"line":4111,"column":35}},"1445":{"start":{"line":4112,"column":0},"end":{"line":4112,"column":44}},"1446":{"start":{"line":4113,"column":0},"end":{"line":4113,"column":37}},"1447":{"start":{"line":4114,"column":0},"end":{"line":4114,"column":42}},"1448":{"start":{"line":4120,"column":0},"end":{"line":4120,"column":47}},"1449":{"start":{"line":4121,"column":0},"end":{"line":4121,"column":45}},"1450":{"start":{"line":4122,"column":0},"end":{"line":4122,"column":46}},"1451":{"start":{"line":4123,"column":0},"end":{"line":4123,"column":45}},"1452":{"start":{"line":4124,"column":0},"end":{"line":4124,"column":48}},"1453":{"start":{"line":4125,"column":0},"end":{"line":4125,"column":46}},"1454":{"start":{"line":4126,"column":0},"end":{"line":4126,"column":47}},"1455":{"start":{"line":4127,"column":0},"end":{"line":4127,"column":45}},"1456":{"start":{"line":4139,"column":0},"end":{"line":4218,"column":2}},"1457":{"start":{"line":4148,"column":4},"end":{"line":4148,"column":26}},"1458":{"start":{"line":4150,"column":4},"end":{"line":4150,"column":25}},"1459":{"start":{"line":4152,"column":4},"end":{"line":4152,"column":62}},"1460":{"start":{"line":4154,"column":4},"end":{"line":4159,"column":5}},"1461":{"start":{"line":4158,"column":8},"end":{"line":4158,"column":68}},"1462":{"start":{"line":4161,"column":4},"end":{"line":4215,"column":5}},"1463":{"start":{"line":4163,"column":8},"end":{"line":4163,"column":39}},"1464":{"start":{"line":4165,"column":8},"end":{"line":4211,"column":10}},"1465":{"start":{"line":4171,"column":16},"end":{"line":4171,"column":68}},"1466":{"start":{"line":4172,"column":16},"end":{"line":4172,"column":85}},"1467":{"start":{"line":4173,"column":16},"end":{"line":4173,"column":97}},"1468":{"start":{"line":4174,"column":16},"end":{"line":4174,"column":93}},"1469":{"start":{"line":4175,"column":16},"end":{"line":4175,"column":87}},"1470":{"start":{"line":4179,"column":16},"end":{"line":4179,"column":107}},"1471":{"start":{"line":4180,"column":16},"end":{"line":4180,"column":95}},"1472":{"start":{"line":4181,"column":16},"end":{"line":4181,"column":95}},"1473":{"start":{"line":4182,"column":16},"end":{"line":4182,"column":91}},"1474":{"start":{"line":4183,"column":16},"end":{"line":4183,"column":91}},"1475":{"start":{"line":4184,"column":16},"end":{"line":4187,"column":18}},"1476":{"start":{"line":4188,"column":16},"end":{"line":4188,"column":109}},"1477":{"start":{"line":4189,"column":16},"end":{"line":4189,"column":99}},"1478":{"start":{"line":4190,"column":16},"end":{"line":4190,"column":87}},"1479":{"start":{"line":4191,"column":16},"end":{"line":4191,"column":87}},"1480":{"start":{"line":4192,"column":16},"end":{"line":4192,"column":107}},"1481":{"start":{"line":4193,"column":16},"end":{"line":4193,"column":52}},"1482":{"start":{"line":4194,"column":16},"end":{"line":4194,"column":36}},"1483":{"start":{"line":4200,"column":16},"end":{"line":4202,"column":17}},"1484":{"start":{"line":4201,"column":20},"end":{"line":4201,"column":79}},"1485":{"start":{"line":4208,"column":16},"end":{"line":4208,"column":95}},"1486":{"start":{"line":4209,"column":16},"end":{"line":4209,"column":36}},"1487":{"start":{"line":4214,"column":8},"end":{"line":4214,"column":28}},"1488":{"start":{"line":4217,"column":4},"end":{"line":4217,"column":25}},"1489":{"start":{"line":4231,"column":0},"end":{"line":4321,"column":2}},"1490":{"start":{"line":4240,"column":4},"end":{"line":4240,"column":25}},"1491":{"start":{"line":4242,"column":4},"end":{"line":4318,"column":5}},"1492":{"start":{"line":4244,"column":8},"end":{"line":4244,"column":34}},"1493":{"start":{"line":4246,"column":8},"end":{"line":4317,"column":9}},"1494":{"start":{"line":4248,"column":12},"end":{"line":4248,"column":59}},"1495":{"start":{"line":4250,"column":12},"end":{"line":4316,"column":13}},"1496":{"start":{"line":4256,"column":16},"end":{"line":4256,"column":39}},"1497":{"start":{"line":4258,"column":16},"end":{"line":4260,"column":17}},"1498":{"start":{"line":4259,"column":20},"end":{"line":4259,"column":45}},"1499":{"start":{"line":4262,"column":16},"end":{"line":4264,"column":17}},"1500":{"start":{"line":4263,"column":20},"end":{"line":4263,"column":42}},"1501":{"start":{"line":4266,"column":16},"end":{"line":4268,"column":17}},"1502":{"start":{"line":4267,"column":20},"end":{"line":4267,"column":44}},"1503":{"start":{"line":4270,"column":16},"end":{"line":4272,"column":17}},"1504":{"start":{"line":4271,"column":20},"end":{"line":4271,"column":52}},"1505":{"start":{"line":4274,"column":16},"end":{"line":4276,"column":17}},"1506":{"start":{"line":4275,"column":20},"end":{"line":4275,"column":48}},"1507":{"start":{"line":4278,"column":16},"end":{"line":4280,"column":17}},"1508":{"start":{"line":4279,"column":20},"end":{"line":4279,"column":43}},"1509":{"start":{"line":4282,"column":16},"end":{"line":4284,"column":17}},"1510":{"start":{"line":4283,"column":20},"end":{"line":4283,"column":45}},"1511":{"start":{"line":4286,"column":16},"end":{"line":4288,"column":17}},"1512":{"start":{"line":4287,"column":20},"end":{"line":4287,"column":48}},"1513":{"start":{"line":4290,"column":16},"end":{"line":4292,"column":17}},"1514":{"start":{"line":4291,"column":20},"end":{"line":4291,"column":40}},"1515":{"start":{"line":4294,"column":16},"end":{"line":4296,"column":17}},"1516":{"start":{"line":4295,"column":20},"end":{"line":4295,"column":49}},"1517":{"start":{"line":4298,"column":16},"end":{"line":4300,"column":17}},"1518":{"start":{"line":4299,"column":20},"end":{"line":4299,"column":49}},"1519":{"start":{"line":4302,"column":16},"end":{"line":4304,"column":17}},"1520":{"start":{"line":4303,"column":20},"end":{"line":4303,"column":66}},"1521":{"start":{"line":4306,"column":16},"end":{"line":4315,"column":18}},"1522":{"start":{"line":4320,"column":4},"end":{"line":4320,"column":23}},"1523":{"start":{"line":4323,"column":0},"end":{"line":4323,"column":32}},"1524":{"start":{"line":4330,"column":0},"end":{"line":4332,"column":2}},"1525":{"start":{"line":4331,"column":4},"end":{"line":4331,"column":52}},"1526":{"start":{"line":4339,"column":0},"end":{"line":4345,"column":2}},"1527":{"start":{"line":4343,"column":4},"end":{"line":4343,"column":29}},"1528":{"start":{"line":4344,"column":4},"end":{"line":4344,"column":21}},"1529":{"start":{"line":4361,"column":0},"end":{"line":4409,"column":2}},"1530":{"start":{"line":4374,"column":4},"end":{"line":4374,"column":17}},"1531":{"start":{"line":4375,"column":4},"end":{"line":4375,"column":17}},"1532":{"start":{"line":4376,"column":4},"end":{"line":4376,"column":17}},"1533":{"start":{"line":4377,"column":4},"end":{"line":4377,"column":39}},"1534":{"start":{"line":4378,"column":4},"end":{"line":4378,"column":21}},"1535":{"start":{"line":4379,"column":4},"end":{"line":4379,"column":21}},"1536":{"start":{"line":4380,"column":4},"end":{"line":4380,"column":21}},"1537":{"start":{"line":4381,"column":4},"end":{"line":4383,"column":5}},"1538":{"start":{"line":4382,"column":8},"end":{"line":4382,"column":61}},"1539":{"start":{"line":4384,"column":4},"end":{"line":4384,"column":23}},"1540":{"start":{"line":4386,"column":4},"end":{"line":4392,"column":5}},"1541":{"start":{"line":4387,"column":8},"end":{"line":4391,"column":10}},"1542":{"start":{"line":4393,"column":4},"end":{"line":4393,"column":37}},"1543":{"start":{"line":4395,"column":4},"end":{"line":4401,"column":5}},"1544":{"start":{"line":4396,"column":8},"end":{"line":4400,"column":9}},"1545":{"start":{"line":4402,"column":4},"end":{"line":4402,"column":39}},"1546":{"start":{"line":4404,"column":4},"end":{"line":4406,"column":5}},"1547":{"start":{"line":4405,"column":8},"end":{"line":4405,"column":43}},"1548":{"start":{"line":4408,"column":4},"end":{"line":4408,"column":25}},"1549":{"start":{"line":4415,"column":0},"end":{"line":4425,"column":2}},"1550":{"start":{"line":4416,"column":4},"end":{"line":4424,"column":6}},"1551":{"start":{"line":4432,"column":0},"end":{"line":4469,"column":2}},"1552":{"start":{"line":4433,"column":4},"end":{"line":4468,"column":7}},"1553":{"start":{"line":4472,"column":0},"end":{"line":4484,"column":2}},"1554":{"start":{"line":4474,"column":4},"end":{"line":4474,"column":15}},"1555":{"start":{"line":4475,"column":4},"end":{"line":4475,"column":15}},"1556":{"start":{"line":4477,"column":4},"end":{"line":4479,"column":5}},"1557":{"start":{"line":4478,"column":8},"end":{"line":4478,"column":19}},"1558":{"start":{"line":4481,"column":4},"end":{"line":4483,"column":5}},"1559":{"start":{"line":4482,"column":8},"end":{"line":4482,"column":19}},"1560":{"start":{"line":4486,"column":0},"end":{"line":4491,"column":2}},"1561":{"start":{"line":4487,"column":4},"end":{"line":4490,"column":6}},"1562":{"start":{"line":4493,"column":0},"end":{"line":4498,"column":2}},"1563":{"start":{"line":4494,"column":4},"end":{"line":4497,"column":22}},"1564":{"start":{"line":4500,"column":0},"end":{"line":4517,"column":2}},"1565":{"start":{"line":4502,"column":4},"end":{"line":4502,"column":15}},"1566":{"start":{"line":4503,"column":4},"end":{"line":4503,"column":15}},"1567":{"start":{"line":4504,"column":4},"end":{"line":4504,"column":15}},"1568":{"start":{"line":4506,"column":4},"end":{"line":4508,"column":5}},"1569":{"start":{"line":4507,"column":8},"end":{"line":4507,"column":19}},"1570":{"start":{"line":4510,"column":4},"end":{"line":4512,"column":5}},"1571":{"start":{"line":4511,"column":8},"end":{"line":4511,"column":19}},"1572":{"start":{"line":4514,"column":4},"end":{"line":4516,"column":5}},"1573":{"start":{"line":4515,"column":8},"end":{"line":4515,"column":19}},"1574":{"start":{"line":4519,"column":0},"end":{"line":4532,"column":2}},"1575":{"start":{"line":4521,"column":4},"end":{"line":4525,"column":5}},"1576":{"start":{"line":4522,"column":8},"end":{"line":4522,"column":22}},"1577":{"start":{"line":4523,"column":8},"end":{"line":4523,"column":22}},"1578":{"start":{"line":4524,"column":8},"end":{"line":4524,"column":22}},"1579":{"start":{"line":4527,"column":4},"end":{"line":4529,"column":5}},"1580":{"start":{"line":4528,"column":8},"end":{"line":4528,"column":77}},"1581":{"start":{"line":4531,"column":4},"end":{"line":4531,"column":16}},"1582":{"start":{"line":4534,"column":0},"end":{"line":4540,"column":2}},"1583":{"start":{"line":4535,"column":4},"end":{"line":4539,"column":6}},"1584":{"start":{"line":4542,"column":0},"end":{"line":4547,"column":2}},"1585":{"start":{"line":4543,"column":4},"end":{"line":4543,"column":17}},"1586":{"start":{"line":4544,"column":4},"end":{"line":4544,"column":17}},"1587":{"start":{"line":4545,"column":4},"end":{"line":4545,"column":17}},"1588":{"start":{"line":4546,"column":4},"end":{"line":4546,"column":16}},"1589":{"start":{"line":4549,"column":0},"end":{"line":4558,"column":2}},"1590":{"start":{"line":4551,"column":4},"end":{"line":4551,"column":52}},"1591":{"start":{"line":4553,"column":4},"end":{"line":4553,"column":22}},"1592":{"start":{"line":4555,"column":4},"end":{"line":4555,"column":53}},"1593":{"start":{"line":4557,"column":4},"end":{"line":4557,"column":25}},"1594":{"start":{"line":4560,"column":0},"end":{"line":4564,"column":2}},"1595":{"start":{"line":4561,"column":4},"end":{"line":4561,"column":22}},"1596":{"start":{"line":4562,"column":4},"end":{"line":4562,"column":22}},"1597":{"start":{"line":4563,"column":4},"end":{"line":4563,"column":48}},"1598":{"start":{"line":4566,"column":0},"end":{"line":4571,"column":2}},"1599":{"start":{"line":4568,"column":4},"end":{"line":4568,"column":63}},"1600":{"start":{"line":4570,"column":4},"end":{"line":4570,"column":32}},"1601":{"start":{"line":4573,"column":0},"end":{"line":4578,"column":2}},"1602":{"start":{"line":4574,"column":4},"end":{"line":4574,"column":18}},"1603":{"start":{"line":4575,"column":4},"end":{"line":4575,"column":18}},"1604":{"start":{"line":4576,"column":4},"end":{"line":4576,"column":18}},"1605":{"start":{"line":4577,"column":4},"end":{"line":4577,"column":16}},"1606":{"start":{"line":4580,"column":0},"end":{"line":4582,"column":2}},"1607":{"start":{"line":4581,"column":4},"end":{"line":4581,"column":63}},"1608":{"start":{"line":4584,"column":0},"end":{"line":4590,"column":2}},"1609":{"start":{"line":4585,"column":4},"end":{"line":4589,"column":6}},"1610":{"start":{"line":4592,"column":0},"end":{"line":4609,"column":2}},"1611":{"start":{"line":4593,"column":4},"end":{"line":4607,"column":5}},"1612":{"start":{"line":4594,"column":8},"end":{"line":4594,"column":22}},"1613":{"start":{"line":4595,"column":8},"end":{"line":4595,"column":22}},"1614":{"start":{"line":4596,"column":8},"end":{"line":4596,"column":22}},"1615":{"start":{"line":4597,"column":11},"end":{"line":4607,"column":5}},"1616":{"start":{"line":4598,"column":8},"end":{"line":4598,"column":83}},"1617":{"start":{"line":4599,"column":8},"end":{"line":4599,"column":83}},"1618":{"start":{"line":4600,"column":8},"end":{"line":4600,"column":83}},"1619":{"start":{"line":4601,"column":8},"end":{"line":4601,"column":19}},"1620":{"start":{"line":4602,"column":8},"end":{"line":4602,"column":19}},"1621":{"start":{"line":4603,"column":8},"end":{"line":4603,"column":19}},"1622":{"start":{"line":4605,"column":8},"end":{"line":4605,"column":70}},"1623":{"start":{"line":4606,"column":8},"end":{"line":4606,"column":43}},"1624":{"start":{"line":4608,"column":4},"end":{"line":4608,"column":16}},"1625":{"start":{"line":4612,"column":0},"end":{"line":4614,"column":2}},"1626":{"start":{"line":4613,"column":4},"end":{"line":4613,"column":60}},"1627":{"start":{"line":4616,"column":0},"end":{"line":4633,"column":2}},"1628":{"start":{"line":4618,"column":4},"end":{"line":4618,"column":27}},"1629":{"start":{"line":4620,"column":4},"end":{"line":4620,"column":28}},"1630":{"start":{"line":4622,"column":4},"end":{"line":4624,"column":5}},"1631":{"start":{"line":4623,"column":8},"end":{"line":4623,"column":20}},"1632":{"start":{"line":4626,"column":4},"end":{"line":4626,"column":38}},"1633":{"start":{"line":4628,"column":4},"end":{"line":4628,"column":24}},"1634":{"start":{"line":4629,"column":4},"end":{"line":4629,"column":24}},"1635":{"start":{"line":4630,"column":4},"end":{"line":4630,"column":24}},"1636":{"start":{"line":4632,"column":4},"end":{"line":4632,"column":16}},"1637":{"start":{"line":4635,"column":0},"end":{"line":4657,"column":2}},"1638":{"start":{"line":4637,"column":4},"end":{"line":4637,"column":15}},"1639":{"start":{"line":4638,"column":4},"end":{"line":4638,"column":15}},"1640":{"start":{"line":4639,"column":4},"end":{"line":4639,"column":15}},"1641":{"start":{"line":4640,"column":4},"end":{"line":4640,"column":15}},"1642":{"start":{"line":4642,"column":4},"end":{"line":4644,"column":5}},"1643":{"start":{"line":4643,"column":8},"end":{"line":4643,"column":19}},"1644":{"start":{"line":4646,"column":4},"end":{"line":4648,"column":5}},"1645":{"start":{"line":4647,"column":8},"end":{"line":4647,"column":19}},"1646":{"start":{"line":4650,"column":4},"end":{"line":4652,"column":5}},"1647":{"start":{"line":4651,"column":8},"end":{"line":4651,"column":19}},"1648":{"start":{"line":4654,"column":4},"end":{"line":4656,"column":5}},"1649":{"start":{"line":4655,"column":8},"end":{"line":4655,"column":19}},"1650":{"start":{"line":4659,"column":0},"end":{"line":4664,"column":2}},"1651":{"start":{"line":4660,"column":4},"end":{"line":4660,"column":18}},"1652":{"start":{"line":4661,"column":4},"end":{"line":4661,"column":18}},"1653":{"start":{"line":4662,"column":4},"end":{"line":4662,"column":18}},"1654":{"start":{"line":4663,"column":4},"end":{"line":4663,"column":16}},"1655":{"start":{"line":4666,"column":0},"end":{"line":4673,"column":2}},"1656":{"start":{"line":4667,"column":4},"end":{"line":4672,"column":6}},"1657":{"start":{"line":4675,"column":0},"end":{"line":4693,"column":2}},"1658":{"start":{"line":4676,"column":4},"end":{"line":4692,"column":5}},"1659":{"start":{"line":4677,"column":8},"end":{"line":4677,"column":22}},"1660":{"start":{"line":4678,"column":8},"end":{"line":4678,"column":22}},"1661":{"start":{"line":4679,"column":8},"end":{"line":4679,"column":22}},"1662":{"start":{"line":4680,"column":11},"end":{"line":4692,"column":5}},"1663":{"start":{"line":4681,"column":8},"end":{"line":4681,"column":106}},"1664":{"start":{"line":4682,"column":8},"end":{"line":4682,"column":106}},"1665":{"start":{"line":4683,"column":8},"end":{"line":4683,"column":106}},"1666":{"start":{"line":4684,"column":8},"end":{"line":4684,"column":106}},"1667":{"start":{"line":4685,"column":8},"end":{"line":4685,"column":19}},"1668":{"start":{"line":4686,"column":8},"end":{"line":4686,"column":19}},"1669":{"start":{"line":4687,"column":8},"end":{"line":4687,"column":19}},"1670":{"start":{"line":4688,"column":8},"end":{"line":4688,"column":19}},"1671":{"start":{"line":4690,"column":8},"end":{"line":4690,"column":70}},"1672":{"start":{"line":4691,"column":8},"end":{"line":4691,"column":43}},"1673":{"start":{"line":4696,"column":0},"end":{"line":4714,"column":2}},"1674":{"start":{"line":4699,"column":4},"end":{"line":4699,"column":27}},"1675":{"start":{"line":4701,"column":4},"end":{"line":4701,"column":65}},"1676":{"start":{"line":4703,"column":4},"end":{"line":4705,"column":5}},"1677":{"start":{"line":4704,"column":8},"end":{"line":4704,"column":20}},"1678":{"start":{"line":4707,"column":4},"end":{"line":4707,"column":38}},"1679":{"start":{"line":4709,"column":4},"end":{"line":4709,"column":24}},"1680":{"start":{"line":4710,"column":4},"end":{"line":4710,"column":24}},"1681":{"start":{"line":4711,"column":4},"end":{"line":4711,"column":24}},"1682":{"start":{"line":4713,"column":4},"end":{"line":4713,"column":16}},"1683":{"start":{"line":4716,"column":0},"end":{"line":4732,"column":2}},"1684":{"start":{"line":4718,"column":4},"end":{"line":4722,"column":5}},"1685":{"start":{"line":4719,"column":8},"end":{"line":4719,"column":22}},"1686":{"start":{"line":4720,"column":8},"end":{"line":4720,"column":22}},"1687":{"start":{"line":4721,"column":8},"end":{"line":4721,"column":22}},"1688":{"start":{"line":4724,"column":4},"end":{"line":4729,"column":5}},"1689":{"start":{"line":4725,"column":8},"end":{"line":4725,"column":22}},"1690":{"start":{"line":4726,"column":8},"end":{"line":4726,"column":22}},"1691":{"start":{"line":4727,"column":8},"end":{"line":4727,"column":22}},"1692":{"start":{"line":4728,"column":8},"end":{"line":4728,"column":22}},"1693":{"start":{"line":4731,"column":4},"end":{"line":4731,"column":16}},"1694":{"start":{"line":4734,"column":0},"end":{"line":4736,"column":2}},"1695":{"start":{"line":4735,"column":4},"end":{"line":4735,"column":22}},"1696":{"start":{"line":4738,"column":0},"end":{"line":4757,"column":2}},"1697":{"start":{"line":4740,"column":4},"end":{"line":4747,"column":5}},"1698":{"start":{"line":4741,"column":8},"end":{"line":4746,"column":9}},"1699":{"start":{"line":4749,"column":4},"end":{"line":4752,"column":5}},"1700":{"start":{"line":4750,"column":8},"end":{"line":4750,"column":59}},"1701":{"start":{"line":4751,"column":8},"end":{"line":4751,"column":62}},"1702":{"start":{"line":4754,"column":4},"end":{"line":4754,"column":30}},"1703":{"start":{"line":4756,"column":4},"end":{"line":4756,"column":16}},"1704":{"start":{"line":4759,"column":0},"end":{"line":4768,"column":2}},"1705":{"start":{"line":4761,"column":4},"end":{"line":4761,"column":21}},"1706":{"start":{"line":4763,"column":4},"end":{"line":4765,"column":5}},"1707":{"start":{"line":4764,"column":8},"end":{"line":4764,"column":45}},"1708":{"start":{"line":4767,"column":4},"end":{"line":4767,"column":19}},"1709":{"start":{"line":4770,"column":0},"end":{"line":4813,"column":2}},"1710":{"start":{"line":4774,"column":4},"end":{"line":4774,"column":23}},"1711":{"start":{"line":4776,"column":4},"end":{"line":4776,"column":74}},"1712":{"start":{"line":4778,"column":4},"end":{"line":4778,"column":25}},"1713":{"start":{"line":4780,"column":4},"end":{"line":4780,"column":36}},"1714":{"start":{"line":4782,"column":4},"end":{"line":4782,"column":25}},"1715":{"start":{"line":4784,"column":4},"end":{"line":4799,"column":5}},"1716":{"start":{"line":4786,"column":8},"end":{"line":4786,"column":21}},"1717":{"start":{"line":4788,"column":8},"end":{"line":4790,"column":9}},"1718":{"start":{"line":4789,"column":12},"end":{"line":4789,"column":72}},"1719":{"start":{"line":4792,"column":8},"end":{"line":4792,"column":41}},"1720":{"start":{"line":4794,"column":8},"end":{"line":4798,"column":9}},"1721":{"start":{"line":4796,"column":12},"end":{"line":4796,"column":39}},"1722":{"start":{"line":4797,"column":12},"end":{"line":4797,"column":46}},"1723":{"start":{"line":4801,"column":4},"end":{"line":4801,"column":33}},"1724":{"start":{"line":4805,"column":4},"end":{"line":4805,"column":83}},"1725":{"start":{"line":4807,"column":4},"end":{"line":4809,"column":5}},"1726":{"start":{"line":4808,"column":8},"end":{"line":4808,"column":70}},"1727":{"start":{"line":4815,"column":0},"end":{"line":4857,"column":2}},"1728":{"start":{"line":4819,"column":4},"end":{"line":4819,"column":23}},"1729":{"start":{"line":4821,"column":4},"end":{"line":4821,"column":74}},"1730":{"start":{"line":4823,"column":4},"end":{"line":4823,"column":25}},"1731":{"start":{"line":4825,"column":4},"end":{"line":4825,"column":36}},"1732":{"start":{"line":4827,"column":4},"end":{"line":4827,"column":25}},"1733":{"start":{"line":4829,"column":4},"end":{"line":4843,"column":5}},"1734":{"start":{"line":4831,"column":8},"end":{"line":4831,"column":21}},"1735":{"start":{"line":4833,"column":8},"end":{"line":4835,"column":9}},"1736":{"start":{"line":4834,"column":12},"end":{"line":4834,"column":72}},"1737":{"start":{"line":4837,"column":8},"end":{"line":4837,"column":41}},"1738":{"start":{"line":4839,"column":8},"end":{"line":4842,"column":9}},"1739":{"start":{"line":4840,"column":12},"end":{"line":4840,"column":39}},"1740":{"start":{"line":4841,"column":12},"end":{"line":4841,"column":46}},"1741":{"start":{"line":4845,"column":4},"end":{"line":4845,"column":33}},"1742":{"start":{"line":4849,"column":4},"end":{"line":4849,"column":83}},"1743":{"start":{"line":4851,"column":4},"end":{"line":4853,"column":5}},"1744":{"start":{"line":4852,"column":8},"end":{"line":4852,"column":70}},"1745":{"start":{"line":4860,"column":0},"end":{"line":4879,"column":2}},"1746":{"start":{"line":4862,"column":4},"end":{"line":4862,"column":36}},"1747":{"start":{"line":4864,"column":4},"end":{"line":4864,"column":63}},"1748":{"start":{"line":4866,"column":4},"end":{"line":4866,"column":75}},"1749":{"start":{"line":4868,"column":4},"end":{"line":4868,"column":62}},"1750":{"start":{"line":4869,"column":4},"end":{"line":4869,"column":62}},"1751":{"start":{"line":4870,"column":4},"end":{"line":4870,"column":62}},"1752":{"start":{"line":4872,"column":4},"end":{"line":4872,"column":77}},"1753":{"start":{"line":4874,"column":4},"end":{"line":4878,"column":5}},"1754":{"start":{"line":4875,"column":8},"end":{"line":4875,"column":85}},"1755":{"start":{"line":4876,"column":8},"end":{"line":4876,"column":65}},"1756":{"start":{"line":4877,"column":8},"end":{"line":4877,"column":85}},"1757":{"start":{"line":4881,"column":0},"end":{"line":4918,"column":2}},"1758":{"start":{"line":4883,"column":4},"end":{"line":4883,"column":33}},"1759":{"start":{"line":4884,"column":4},"end":{"line":4884,"column":33}},"1760":{"start":{"line":4885,"column":4},"end":{"line":4885,"column":33}},"1761":{"start":{"line":4887,"column":4},"end":{"line":4887,"column":33}},"1762":{"start":{"line":4888,"column":4},"end":{"line":4888,"column":33}},"1763":{"start":{"line":4889,"column":4},"end":{"line":4889,"column":33}},"1764":{"start":{"line":4891,"column":4},"end":{"line":4911,"column":5}},"1765":{"start":{"line":4892,"column":8},"end":{"line":4894,"column":9}},"1766":{"start":{"line":4893,"column":12},"end":{"line":4893,"column":37}},"1767":{"start":{"line":4895,"column":8},"end":{"line":4897,"column":9}},"1768":{"start":{"line":4896,"column":12},"end":{"line":4896,"column":37}},"1769":{"start":{"line":4898,"column":8},"end":{"line":4900,"column":9}},"1770":{"start":{"line":4899,"column":12},"end":{"line":4899,"column":37}},"1771":{"start":{"line":4902,"column":8},"end":{"line":4904,"column":9}},"1772":{"start":{"line":4903,"column":12},"end":{"line":4903,"column":37}},"1773":{"start":{"line":4905,"column":8},"end":{"line":4907,"column":9}},"1774":{"start":{"line":4906,"column":12},"end":{"line":4906,"column":37}},"1775":{"start":{"line":4908,"column":8},"end":{"line":4910,"column":9}},"1776":{"start":{"line":4909,"column":12},"end":{"line":4909,"column":37}},"1777":{"start":{"line":4913,"column":4},"end":{"line":4917,"column":5}},"1778":{"start":{"line":4920,"column":0},"end":{"line":4936,"column":2}},"1779":{"start":{"line":4921,"column":4},"end":{"line":4921,"column":21}},"1780":{"start":{"line":4922,"column":4},"end":{"line":4922,"column":21}},"1781":{"start":{"line":4923,"column":4},"end":{"line":4923,"column":21}},"1782":{"start":{"line":4925,"column":4},"end":{"line":4929,"column":5}},"1783":{"start":{"line":4926,"column":8},"end":{"line":4926,"column":38}},"1784":{"start":{"line":4927,"column":8},"end":{"line":4927,"column":38}},"1785":{"start":{"line":4928,"column":8},"end":{"line":4928,"column":38}},"1786":{"start":{"line":4931,"column":4},"end":{"line":4935,"column":6}},"1787":{"start":{"line":4938,"column":0},"end":{"line":4947,"column":2}},"1788":{"start":{"line":4940,"column":4},"end":{"line":4944,"column":5}},"1789":{"start":{"line":4941,"column":8},"end":{"line":4941,"column":32}},"1790":{"start":{"line":4942,"column":8},"end":{"line":4942,"column":32}},"1791":{"start":{"line":4943,"column":8},"end":{"line":4943,"column":32}},"1792":{"start":{"line":4946,"column":4},"end":{"line":4946,"column":16}},"1793":{"start":{"line":4950,"column":0},"end":{"line":4957,"column":2}},"1794":{"start":{"line":4952,"column":4},"end":{"line":4952,"column":55}},"1795":{"start":{"line":4954,"column":4},"end":{"line":4956,"column":5}},"1796":{"start":{"line":4955,"column":8},"end":{"line":4955,"column":54}},"1797":{"start":{"line":4965,"column":0},"end":{"line":4971,"column":2}},"1798":{"start":{"line":4969,"column":4},"end":{"line":4969,"column":29}},"1799":{"start":{"line":4970,"column":4},"end":{"line":4970,"column":35}},"1800":{"start":{"line":4983,"column":0},"end":{"line":5030,"column":2}},"1801":{"start":{"line":4993,"column":4},"end":{"line":4993,"column":17}},"1802":{"start":{"line":4995,"column":4},"end":{"line":4995,"column":21}},"1803":{"start":{"line":4997,"column":4},"end":{"line":4999,"column":5}},"1804":{"start":{"line":4998,"column":8},"end":{"line":4998,"column":54}},"1805":{"start":{"line":5000,"column":4},"end":{"line":5000,"column":27}},"1806":{"start":{"line":5002,"column":4},"end":{"line":5008,"column":5}},"1807":{"start":{"line":5003,"column":8},"end":{"line":5007,"column":10}},"1808":{"start":{"line":5009,"column":4},"end":{"line":5009,"column":33}},"1809":{"start":{"line":5011,"column":4},"end":{"line":5017,"column":5}},"1810":{"start":{"line":5012,"column":8},"end":{"line":5016,"column":10}},"1811":{"start":{"line":5018,"column":4},"end":{"line":5018,"column":25}},"1812":{"start":{"line":5020,"column":4},"end":{"line":5022,"column":5}},"1813":{"start":{"line":5021,"column":8},"end":{"line":5021,"column":25}},"1814":{"start":{"line":5023,"column":4},"end":{"line":5023,"column":35}},"1815":{"start":{"line":5025,"column":4},"end":{"line":5025,"column":25}},"1816":{"start":{"line":5027,"column":4},"end":{"line":5027,"column":35}},"1817":{"start":{"line":5029,"column":4},"end":{"line":5029,"column":42}},"1818":{"start":{"line":5036,"column":0},"end":{"line":5051,"column":2}},"1819":{"start":{"line":5038,"column":4},"end":{"line":5038,"column":52}},"1820":{"start":{"line":5040,"column":4},"end":{"line":5040,"column":51}},"1821":{"start":{"line":5042,"column":4},"end":{"line":5042,"column":43}},"1822":{"start":{"line":5044,"column":4},"end":{"line":5044,"column":40}},"1823":{"start":{"line":5045,"column":4},"end":{"line":5045,"column":40}},"1824":{"start":{"line":5046,"column":4},"end":{"line":5046,"column":40}},"1825":{"start":{"line":5048,"column":4},"end":{"line":5048,"column":30}},"1826":{"start":{"line":5050,"column":4},"end":{"line":5050,"column":20}},"1827":{"start":{"line":5058,"column":0},"end":{"line":5062,"column":2}},"1828":{"start":{"line":5061,"column":4},"end":{"line":5061,"column":46}},"1829":{"start":{"line":5069,"column":0},"end":{"line":5073,"column":2}},"1830":{"start":{"line":5072,"column":4},"end":{"line":5072,"column":53}},"1831":{"start":{"line":5075,"column":0},"end":{"line":5095,"column":2}},"1832":{"start":{"line":5082,"column":4},"end":{"line":5082,"column":39}},"1833":{"start":{"line":5083,"column":4},"end":{"line":5088,"column":5}},"1834":{"start":{"line":5085,"column":8},"end":{"line":5085,"column":37}},"1835":{"start":{"line":5086,"column":8},"end":{"line":5086,"column":32}},"1836":{"start":{"line":5087,"column":8},"end":{"line":5087,"column":15}},"1837":{"start":{"line":5090,"column":4},"end":{"line":5090,"column":52}},"1838":{"start":{"line":5092,"column":4},"end":{"line":5092,"column":52}},"1839":{"start":{"line":5094,"column":4},"end":{"line":5094,"column":28}},"1840":{"start":{"line":5097,"column":0},"end":{"line":5113,"column":2}},"1841":{"start":{"line":5101,"column":4},"end":{"line":5111,"column":5}},"1842":{"start":{"line":5103,"column":8},"end":{"line":5106,"column":10}},"1843":{"start":{"line":5110,"column":8},"end":{"line":5110,"column":20}},"1844":{"start":{"line":5125,"column":0},"end":{"line":5220,"column":2}},"1845":{"start":{"line":5133,"column":4},"end":{"line":5133,"column":31}},"1846":{"start":{"line":5134,"column":4},"end":{"line":5134,"column":35}},"1847":{"start":{"line":5136,"column":4},"end":{"line":5138,"column":5}},"1848":{"start":{"line":5137,"column":8},"end":{"line":5137,"column":26}},"1849":{"start":{"line":5140,"column":4},"end":{"line":5142,"column":5}},"1850":{"start":{"line":5141,"column":8},"end":{"line":5141,"column":55}},"1851":{"start":{"line":5144,"column":4},"end":{"line":5146,"column":5}},"1852":{"start":{"line":5145,"column":8},"end":{"line":5145,"column":22}},"1853":{"start":{"line":5148,"column":4},"end":{"line":5150,"column":5}},"1854":{"start":{"line":5149,"column":8},"end":{"line":5149,"column":34}},"1855":{"start":{"line":5152,"column":4},"end":{"line":5152,"column":60}},"1856":{"start":{"line":5154,"column":4},"end":{"line":5161,"column":6}},"1857":{"start":{"line":5163,"column":4},"end":{"line":5171,"column":5}},"1858":{"start":{"line":5164,"column":8},"end":{"line":5170,"column":10}},"1859":{"start":{"line":5173,"column":4},"end":{"line":5213,"column":5}},"1860":{"start":{"line":5174,"column":8},"end":{"line":5174,"column":59}},"1861":{"start":{"line":5175,"column":8},"end":{"line":5175,"column":63}},"1862":{"start":{"line":5176,"column":8},"end":{"line":5176,"column":63}},"1863":{"start":{"line":5178,"column":8},"end":{"line":5184,"column":10}},"1864":{"start":{"line":5188,"column":8},"end":{"line":5192,"column":29}},"1865":{"start":{"line":5195,"column":8},"end":{"line":5195,"column":53}},"1866":{"start":{"line":5196,"column":8},"end":{"line":5196,"column":57}},"1867":{"start":{"line":5198,"column":8},"end":{"line":5211,"column":10}},"1868":{"start":{"line":5212,"column":8},"end":{"line":5212,"column":35}},"1869":{"start":{"line":5215,"column":4},"end":{"line":5215,"column":36}},"1870":{"start":{"line":5216,"column":4},"end":{"line":5216,"column":36}},"1871":{"start":{"line":5217,"column":4},"end":{"line":5217,"column":36}},"1872":{"start":{"line":5219,"column":4},"end":{"line":5219,"column":25}},"1873":{"start":{"line":5232,"column":0},"end":{"line":5317,"column":2}},"1874":{"start":{"line":5240,"column":4},"end":{"line":5240,"column":31}},"1875":{"start":{"line":5241,"column":4},"end":{"line":5241,"column":35}},"1876":{"start":{"line":5243,"column":4},"end":{"line":5245,"column":5}},"1877":{"start":{"line":5244,"column":8},"end":{"line":5244,"column":26}},"1878":{"start":{"line":5247,"column":4},"end":{"line":5249,"column":5}},"1879":{"start":{"line":5248,"column":8},"end":{"line":5248,"column":55}},"1880":{"start":{"line":5251,"column":4},"end":{"line":5253,"column":5}},"1881":{"start":{"line":5252,"column":8},"end":{"line":5252,"column":22}},"1882":{"start":{"line":5255,"column":4},"end":{"line":5257,"column":5}},"1883":{"start":{"line":5256,"column":8},"end":{"line":5256,"column":34}},"1884":{"start":{"line":5260,"column":4},"end":{"line":5260,"column":60}},"1885":{"start":{"line":5261,"column":4},"end":{"line":5268,"column":6}},"1886":{"start":{"line":5270,"column":4},"end":{"line":5273,"column":5}},"1887":{"start":{"line":5271,"column":8},"end":{"line":5271,"column":62}},"1888":{"start":{"line":5272,"column":8},"end":{"line":5272,"column":100}},"1889":{"start":{"line":5275,"column":4},"end":{"line":5310,"column":5}},"1890":{"start":{"line":5276,"column":8},"end":{"line":5276,"column":57}},"1891":{"start":{"line":5278,"column":8},"end":{"line":5278,"column":25}},"1892":{"start":{"line":5279,"column":8},"end":{"line":5279,"column":25}},"1893":{"start":{"line":5280,"column":8},"end":{"line":5280,"column":25}},"1894":{"start":{"line":5282,"column":8},"end":{"line":5282,"column":77}},"1895":{"start":{"line":5285,"column":8},"end":{"line":5289,"column":29}},"1896":{"start":{"line":5291,"column":8},"end":{"line":5291,"column":69}},"1897":{"start":{"line":5292,"column":8},"end":{"line":5296,"column":10}},"1898":{"start":{"line":5298,"column":8},"end":{"line":5307,"column":10}},"1899":{"start":{"line":5309,"column":8},"end":{"line":5309,"column":35}},"1900":{"start":{"line":5312,"column":4},"end":{"line":5312,"column":36}},"1901":{"start":{"line":5313,"column":4},"end":{"line":5313,"column":36}},"1902":{"start":{"line":5314,"column":4},"end":{"line":5314,"column":36}},"1903":{"start":{"line":5316,"column":4},"end":{"line":5316,"column":25}},"1904":{"start":{"line":5330,"column":0},"end":{"line":5419,"column":2}},"1905":{"start":{"line":5339,"column":4},"end":{"line":5339,"column":31}},"1906":{"start":{"line":5340,"column":4},"end":{"line":5340,"column":35}},"1907":{"start":{"line":5342,"column":4},"end":{"line":5344,"column":5}},"1908":{"start":{"line":5343,"column":8},"end":{"line":5343,"column":17}},"1909":{"start":{"line":5346,"column":4},"end":{"line":5348,"column":5}},"1910":{"start":{"line":5347,"column":8},"end":{"line":5347,"column":22}},"1911":{"start":{"line":5350,"column":4},"end":{"line":5352,"column":5}},"1912":{"start":{"line":5351,"column":8},"end":{"line":5351,"column":41}},"1913":{"start":{"line":5354,"column":4},"end":{"line":5354,"column":27}},"1914":{"start":{"line":5355,"column":4},"end":{"line":5355,"column":53}},"1915":{"start":{"line":5356,"column":4},"end":{"line":5356,"column":51}},"1916":{"start":{"line":5357,"column":4},"end":{"line":5357,"column":59}},"1917":{"start":{"line":5358,"column":4},"end":{"line":5358,"column":108}},"1918":{"start":{"line":5360,"column":4},"end":{"line":5360,"column":19}},"1919":{"start":{"line":5362,"column":4},"end":{"line":5362,"column":22}},"1920":{"start":{"line":5363,"column":4},"end":{"line":5363,"column":22}},"1921":{"start":{"line":5365,"column":4},"end":{"line":5418,"column":5}},"1922":{"start":{"line":5366,"column":8},"end":{"line":5402,"column":9}},"1923":{"start":{"line":5368,"column":12},"end":{"line":5368,"column":28}},"1924":{"start":{"line":5370,"column":12},"end":{"line":5370,"column":81}},"1925":{"start":{"line":5372,"column":12},"end":{"line":5376,"column":15}},"1926":{"start":{"line":5378,"column":12},"end":{"line":5378,"column":35}},"1927":{"start":{"line":5379,"column":12},"end":{"line":5379,"column":38}},"1928":{"start":{"line":5380,"column":12},"end":{"line":5380,"column":36}},"1929":{"start":{"line":5381,"column":12},"end":{"line":5381,"column":51}},"1930":{"start":{"line":5382,"column":12},"end":{"line":5382,"column":35}},"1931":{"start":{"line":5384,"column":12},"end":{"line":5387,"column":15}},"1932":{"start":{"line":5388,"column":12},"end":{"line":5388,"column":37}},"1933":{"start":{"line":5390,"column":12},"end":{"line":5393,"column":15}},"1934":{"start":{"line":5395,"column":12},"end":{"line":5395,"column":26}},"1935":{"start":{"line":5396,"column":12},"end":{"line":5396,"column":26}},"1936":{"start":{"line":5397,"column":12},"end":{"line":5397,"column":31}},"1937":{"start":{"line":5399,"column":12},"end":{"line":5401,"column":13}},"1938":{"start":{"line":5400,"column":16},"end":{"line":5400,"column":29}},"1939":{"start":{"line":5404,"column":8},"end":{"line":5404,"column":50}},"1940":{"start":{"line":5405,"column":8},"end":{"line":5405,"column":39}},"1941":{"start":{"line":5406,"column":8},"end":{"line":5406,"column":39}},"1942":{"start":{"line":5407,"column":8},"end":{"line":5407,"column":39}},"1943":{"start":{"line":5409,"column":8},"end":{"line":5409,"column":56}},"1944":{"start":{"line":5410,"column":8},"end":{"line":5410,"column":56}},"1945":{"start":{"line":5411,"column":8},"end":{"line":5411,"column":56}},"1946":{"start":{"line":5413,"column":8},"end":{"line":5413,"column":40}},"1947":{"start":{"line":5414,"column":8},"end":{"line":5414,"column":40}},"1948":{"start":{"line":5415,"column":8},"end":{"line":5415,"column":40}},"1949":{"start":{"line":5417,"column":8},"end":{"line":5417,"column":25}},"1950":{"start":{"line":5427,"column":0},"end":{"line":5515,"column":2}},"1951":{"start":{"line":5436,"column":4},"end":{"line":5436,"column":28}},"1952":{"start":{"line":5437,"column":4},"end":{"line":5447,"column":5}},"1953":{"start":{"line":5439,"column":8},"end":{"line":5439,"column":55}},"1954":{"start":{"line":5441,"column":8},"end":{"line":5445,"column":11}},"1955":{"start":{"line":5449,"column":4},"end":{"line":5449,"column":27}},"1956":{"start":{"line":5450,"column":4},"end":{"line":5460,"column":5}},"1957":{"start":{"line":5451,"column":8},"end":{"line":5451,"column":50}},"1958":{"start":{"line":5452,"column":8},"end":{"line":5452,"column":50}},"1959":{"start":{"line":5453,"column":8},"end":{"line":5453,"column":50}},"1960":{"start":{"line":5455,"column":8},"end":{"line":5459,"column":11}},"1961":{"start":{"line":5466,"column":4},"end":{"line":5466,"column":28}},"1962":{"start":{"line":5467,"column":4},"end":{"line":5467,"column":22}},"1963":{"start":{"line":5468,"column":4},"end":{"line":5468,"column":19}},"1964":{"start":{"line":5470,"column":4},"end":{"line":5470,"column":27}},"1965":{"start":{"line":5471,"column":4},"end":{"line":5471,"column":51}},"1966":{"start":{"line":5472,"column":4},"end":{"line":5472,"column":24}},"1967":{"start":{"line":5474,"column":4},"end":{"line":5501,"column":5}},"1968":{"start":{"line":5476,"column":8},"end":{"line":5476,"column":37}},"1969":{"start":{"line":5477,"column":8},"end":{"line":5477,"column":37}},"1970":{"start":{"line":5478,"column":8},"end":{"line":5478,"column":37}},"1971":{"start":{"line":5480,"column":8},"end":{"line":5484,"column":9}},"1972":{"start":{"line":5481,"column":12},"end":{"line":5481,"column":92}},"1973":{"start":{"line":5482,"column":12},"end":{"line":5482,"column":45}},"1974":{"start":{"line":5483,"column":12},"end":{"line":5483,"column":26}},"1975":{"start":{"line":5486,"column":8},"end":{"line":5490,"column":9}},"1976":{"start":{"line":5487,"column":12},"end":{"line":5487,"column":92}},"1977":{"start":{"line":5488,"column":12},"end":{"line":5488,"column":45}},"1978":{"start":{"line":5489,"column":12},"end":{"line":5489,"column":26}},"1979":{"start":{"line":5492,"column":8},"end":{"line":5496,"column":9}},"1980":{"start":{"line":5493,"column":12},"end":{"line":5493,"column":92}},"1981":{"start":{"line":5494,"column":12},"end":{"line":5494,"column":45}},"1982":{"start":{"line":5495,"column":12},"end":{"line":5495,"column":26}},"1983":{"start":{"line":5498,"column":8},"end":{"line":5498,"column":79}},"1984":{"start":{"line":5500,"column":8},"end":{"line":5500,"column":25}},"1985":{"start":{"line":5503,"column":4},"end":{"line":5503,"column":120}},"1986":{"start":{"line":5504,"column":4},"end":{"line":5504,"column":56}},"1987":{"start":{"line":5506,"column":4},"end":{"line":5506,"column":25}},"1988":{"start":{"line":5507,"column":4},"end":{"line":5507,"column":28}},"1989":{"start":{"line":5510,"column":4},"end":{"line":5512,"column":5}},"1990":{"start":{"line":5511,"column":8},"end":{"line":5511,"column":75}},"1991":{"start":{"line":5514,"column":4},"end":{"line":5514,"column":16}},"1992":{"start":{"line":5528,"column":0},"end":{"line":5809,"column":2}},"1993":{"start":{"line":5537,"column":4},"end":{"line":5537,"column":35}},"1994":{"start":{"line":5539,"column":4},"end":{"line":5539,"column":31}},"1995":{"start":{"line":5541,"column":4},"end":{"line":5543,"column":5}},"1996":{"start":{"line":5542,"column":8},"end":{"line":5542,"column":22}},"1997":{"start":{"line":5545,"column":4},"end":{"line":5547,"column":5}},"1998":{"start":{"line":5546,"column":8},"end":{"line":5546,"column":33}},"1999":{"start":{"line":5549,"column":4},"end":{"line":5549,"column":30}},"2000":{"start":{"line":5551,"column":4},"end":{"line":5551,"column":65}},"2001":{"start":{"line":5553,"column":4},"end":{"line":5553,"column":34}},"2002":{"start":{"line":5554,"column":4},"end":{"line":5554,"column":29}},"2003":{"start":{"line":5556,"column":4},"end":{"line":5556,"column":23}},"2004":{"start":{"line":5557,"column":4},"end":{"line":5557,"column":29}},"2005":{"start":{"line":5558,"column":4},"end":{"line":5558,"column":28}},"2006":{"start":{"line":5559,"column":4},"end":{"line":5559,"column":38}},"2007":{"start":{"line":5561,"column":4},"end":{"line":5796,"column":5}},"2008":{"start":{"line":5562,"column":8},"end":{"line":5562,"column":44}},"2009":{"start":{"line":5564,"column":8},"end":{"line":5564,"column":29}},"2010":{"start":{"line":5565,"column":8},"end":{"line":5565,"column":51}},"2011":{"start":{"line":5567,"column":8},"end":{"line":5673,"column":9}},"2012":{"start":{"line":5569,"column":12},"end":{"line":5569,"column":47}},"2013":{"start":{"line":5570,"column":12},"end":{"line":5570,"column":51}},"2014":{"start":{"line":5571,"column":12},"end":{"line":5571,"column":51}},"2015":{"start":{"line":5573,"column":12},"end":{"line":5589,"column":33}},"2016":{"start":{"line":5591,"column":12},"end":{"line":5591,"column":65}},"2017":{"start":{"line":5592,"column":12},"end":{"line":5592,"column":53}},"2018":{"start":{"line":5594,"column":12},"end":{"line":5598,"column":14}},"2019":{"start":{"line":5600,"column":12},"end":{"line":5604,"column":14}},"2020":{"start":{"line":5606,"column":12},"end":{"line":5606,"column":62}},"2021":{"start":{"line":5609,"column":12},"end":{"line":5642,"column":13}},"2022":{"start":{"line":5610,"column":16},"end":{"line":5610,"column":72}},"2023":{"start":{"line":5611,"column":16},"end":{"line":5618,"column":18}},"2024":{"start":{"line":5620,"column":16},"end":{"line":5636,"column":18}},"2025":{"start":{"line":5638,"column":16},"end":{"line":5638,"column":43}},"2026":{"start":{"line":5640,"column":16},"end":{"line":5640,"column":51}},"2027":{"start":{"line":5641,"column":16},"end":{"line":5641,"column":57}},"2028":{"start":{"line":5644,"column":12},"end":{"line":5672,"column":13}},"2029":{"start":{"line":5645,"column":16},"end":{"line":5671,"column":19}},"2030":{"start":{"line":5677,"column":8},"end":{"line":5677,"column":30}},"2031":{"start":{"line":5678,"column":8},"end":{"line":5759,"column":9}},"2032":{"start":{"line":5679,"column":12},"end":{"line":5679,"column":44}},"2033":{"start":{"line":5681,"column":12},"end":{"line":5683,"column":13}},"2034":{"start":{"line":5682,"column":16},"end":{"line":5682,"column":25}},"2035":{"start":{"line":5685,"column":12},"end":{"line":5688,"column":14}},"2036":{"start":{"line":5690,"column":12},"end":{"line":5690,"column":63}},"2037":{"start":{"line":5693,"column":12},"end":{"line":5697,"column":14}},"2038":{"start":{"line":5699,"column":12},"end":{"line":5703,"column":14}},"2039":{"start":{"line":5705,"column":12},"end":{"line":5709,"column":14}},"2040":{"start":{"line":5711,"column":12},"end":{"line":5715,"column":14}},"2041":{"start":{"line":5717,"column":12},"end":{"line":5758,"column":13}},"2042":{"start":{"line":5719,"column":16},"end":{"line":5721,"column":17}},"2043":{"start":{"line":5720,"column":20},"end":{"line":5720,"column":29}},"2044":{"start":{"line":5723,"column":16},"end":{"line":5723,"column":54}},"2045":{"start":{"line":5725,"column":16},"end":{"line":5727,"column":17}},"2046":{"start":{"line":5726,"column":20},"end":{"line":5726,"column":29}},"2047":{"start":{"line":5729,"column":16},"end":{"line":5757,"column":17}},"2048":{"start":{"line":5730,"column":20},"end":{"line":5730,"column":71}},"2049":{"start":{"line":5732,"column":20},"end":{"line":5736,"column":22}},"2050":{"start":{"line":5738,"column":20},"end":{"line":5742,"column":22}},"2051":{"start":{"line":5744,"column":20},"end":{"line":5748,"column":22}},"2052":{"start":{"line":5750,"column":20},"end":{"line":5754,"column":22}},"2053":{"start":{"line":5756,"column":20},"end":{"line":5756,"column":50}},"2054":{"start":{"line":5766,"column":8},"end":{"line":5784,"column":9}},"2055":{"start":{"line":5767,"column":12},"end":{"line":5767,"column":42}},"2056":{"start":{"line":5769,"column":12},"end":{"line":5769,"column":136}},"2057":{"start":{"line":5771,"column":12},"end":{"line":5778,"column":13}},"2058":{"start":{"line":5772,"column":16},"end":{"line":5772,"column":49}},"2059":{"start":{"line":5775,"column":16},"end":{"line":5775,"column":72}},"2060":{"start":{"line":5776,"column":16},"end":{"line":5776,"column":37}},"2061":{"start":{"line":5777,"column":16},"end":{"line":5777,"column":49}},"2062":{"start":{"line":5780,"column":12},"end":{"line":5780,"column":49}},"2063":{"start":{"line":5781,"column":12},"end":{"line":5781,"column":58}},"2064":{"start":{"line":5783,"column":12},"end":{"line":5783,"column":74}},"2065":{"start":{"line":5794,"column":8},"end":{"line":5794,"column":45}},"2066":{"start":{"line":5795,"column":8},"end":{"line":5795,"column":47}},"2067":{"start":{"line":5798,"column":4},"end":{"line":5798,"column":43}},"2068":{"start":{"line":5799,"column":4},"end":{"line":5799,"column":56}},"2069":{"start":{"line":5800,"column":4},"end":{"line":5800,"column":82}},"2070":{"start":{"line":5801,"column":4},"end":{"line":5801,"column":54}},"2071":{"start":{"line":5802,"column":4},"end":{"line":5802,"column":79}},"2072":{"start":{"line":5804,"column":4},"end":{"line":5808,"column":6}},"2073":{"start":{"line":5810,"column":0},"end":{"line":5812,"column":1}},"2074":{"start":{"line":5811,"column":4},"end":{"line":5811,"column":29}}},"branchMap":{"1":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":0},"end":{"line":1,"column":0}},{"start":{"line":1,"column":0},"end":{"line":1,"column":0}}]},"2":{"line":5,"type":"if","locations":[{"start":{"line":5,"column":0},"end":{"line":5,"column":0}},{"start":{"line":5,"column":0},"end":{"line":5,"column":0}}]},"3":{"line":9,"type":"if","locations":[{"start":{"line":9,"column":0},"end":{"line":9,"column":0}},{"start":{"line":9,"column":0},"end":{"line":9,"column":0}}]},"4":{"line":10,"type":"if","locations":[{"start":{"line":10,"column":4},"end":{"line":10,"column":4}},{"start":{"line":10,"column":4},"end":{"line":10,"column":4}}]},"5":{"line":60,"type":"if","locations":[{"start":{"line":60,"column":4},"end":{"line":60,"column":4}},{"start":{"line":60,"column":4},"end":{"line":60,"column":4}}]},"6":{"line":65,"type":"if","locations":[{"start":{"line":65,"column":4},"end":{"line":65,"column":4}},{"start":{"line":65,"column":4},"end":{"line":65,"column":4}}]},"7":{"line":70,"type":"if","locations":[{"start":{"line":70,"column":4},"end":{"line":70,"column":4}},{"start":{"line":70,"column":4},"end":{"line":70,"column":4}}]},"8":{"line":75,"type":"if","locations":[{"start":{"line":75,"column":4},"end":{"line":75,"column":4}},{"start":{"line":75,"column":4},"end":{"line":75,"column":4}}]},"9":{"line":80,"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":80,"column":4}},{"start":{"line":80,"column":4},"end":{"line":80,"column":4}}]},"10":{"line":85,"type":"if","locations":[{"start":{"line":85,"column":4},"end":{"line":85,"column":4}},{"start":{"line":85,"column":4},"end":{"line":85,"column":4}}]},"11":{"line":90,"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":90,"column":4}},{"start":{"line":90,"column":4},"end":{"line":90,"column":4}}]},"12":{"line":113,"type":"if","locations":[{"start":{"line":113,"column":4},"end":{"line":113,"column":4}},{"start":{"line":113,"column":4},"end":{"line":113,"column":4}}]},"13":{"line":118,"type":"if","locations":[{"start":{"line":118,"column":4},"end":{"line":118,"column":4}},{"start":{"line":118,"column":4},"end":{"line":118,"column":4}}]},"14":{"line":123,"type":"if","locations":[{"start":{"line":123,"column":4},"end":{"line":123,"column":4}},{"start":{"line":123,"column":4},"end":{"line":123,"column":4}}]},"15":{"line":130,"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":130,"column":4}},{"start":{"line":130,"column":4},"end":{"line":130,"column":4}}]},"16":{"line":140,"type":"if","locations":[{"start":{"line":140,"column":4},"end":{"line":140,"column":4}},{"start":{"line":140,"column":4},"end":{"line":140,"column":4}}]},"17":{"line":149,"type":"if","locations":[{"start":{"line":149,"column":4},"end":{"line":149,"column":4}},{"start":{"line":149,"column":4},"end":{"line":149,"column":4}}]},"18":{"line":151,"type":"if","locations":[{"start":{"line":151,"column":11},"end":{"line":151,"column":11}},{"start":{"line":151,"column":11},"end":{"line":151,"column":11}}]},"19":{"line":153,"type":"if","locations":[{"start":{"line":153,"column":11},"end":{"line":153,"column":11}},{"start":{"line":153,"column":11},"end":{"line":153,"column":11}}]},"20":{"line":212,"type":"if","locations":[{"start":{"line":212,"column":4},"end":{"line":212,"column":4}},{"start":{"line":212,"column":4},"end":{"line":212,"column":4}}]},"21":{"line":247,"type":"if","locations":[{"start":{"line":247,"column":4},"end":{"line":247,"column":4}},{"start":{"line":247,"column":4},"end":{"line":247,"column":4}}]},"22":{"line":297,"type":"binary-expr","locations":[{"start":{"line":297,"column":27},"end":{"line":297,"column":59}},{"start":{"line":297,"column":63},"end":{"line":297,"column":98}},{"start":{"line":297,"column":102},"end":{"line":297,"column":140}}]},"23":{"line":300,"type":"if","locations":[{"start":{"line":300,"column":4},"end":{"line":300,"column":4}},{"start":{"line":300,"column":4},"end":{"line":300,"column":4}}]},"24":{"line":301,"type":"binary-expr","locations":[{"start":{"line":301,"column":42},"end":{"line":301,"column":73}},{"start":{"line":301,"column":77},"end":{"line":301,"column":111}},{"start":{"line":301,"column":115},"end":{"line":301,"column":152}}]},"25":{"line":302,"type":"binary-expr","locations":[{"start":{"line":302,"column":35},"end":{"line":302,"column":59}},{"start":{"line":302,"column":63},"end":{"line":302,"column":90}},{"start":{"line":302,"column":94},"end":{"line":302,"column":124}}]},"26":{"line":322,"type":"if","locations":[{"start":{"line":322,"column":4},"end":{"line":322,"column":4}},{"start":{"line":322,"column":4},"end":{"line":322,"column":4}}]},"27":{"line":333,"type":"if","locations":[{"start":{"line":333,"column":4},"end":{"line":333,"column":4}},{"start":{"line":333,"column":4},"end":{"line":333,"column":4}}]},"28":{"line":360,"type":"if","locations":[{"start":{"line":360,"column":4},"end":{"line":360,"column":4}},{"start":{"line":360,"column":4},"end":{"line":360,"column":4}}]},"29":{"line":366,"type":"if","locations":[{"start":{"line":366,"column":11},"end":{"line":366,"column":11}},{"start":{"line":366,"column":11},"end":{"line":366,"column":11}}]},"30":{"line":373,"type":"if","locations":[{"start":{"line":373,"column":4},"end":{"line":373,"column":4}},{"start":{"line":373,"column":4},"end":{"line":373,"column":4}}]},"31":{"line":379,"type":"if","locations":[{"start":{"line":379,"column":11},"end":{"line":379,"column":11}},{"start":{"line":379,"column":11},"end":{"line":379,"column":11}}]},"32":{"line":386,"type":"if","locations":[{"start":{"line":386,"column":4},"end":{"line":386,"column":4}},{"start":{"line":386,"column":4},"end":{"line":386,"column":4}}]},"33":{"line":390,"type":"if","locations":[{"start":{"line":390,"column":11},"end":{"line":390,"column":11}},{"start":{"line":390,"column":11},"end":{"line":390,"column":11}}]},"34":{"line":412,"type":"if","locations":[{"start":{"line":412,"column":4},"end":{"line":412,"column":4}},{"start":{"line":412,"column":4},"end":{"line":412,"column":4}}]},"35":{"line":413,"type":"binary-expr","locations":[{"start":{"line":413,"column":24},"end":{"line":413,"column":39}},{"start":{"line":413,"column":43},"end":{"line":413,"column":61}},{"start":{"line":413,"column":65},"end":{"line":413,"column":86}},{"start":{"line":413,"column":90},"end":{"line":413,"column":91}}]},"36":{"line":414,"type":"binary-expr","locations":[{"start":{"line":414,"column":24},"end":{"line":414,"column":39}},{"start":{"line":414,"column":43},"end":{"line":414,"column":61}},{"start":{"line":414,"column":65},"end":{"line":414,"column":86}},{"start":{"line":414,"column":90},"end":{"line":414,"column":91}}]},"37":{"line":426,"type":"switch","locations":[{"start":{"line":428,"column":8},"end":{"line":430,"column":18}},{"start":{"line":432,"column":8},"end":{"line":434,"column":18}},{"start":{"line":436,"column":8},"end":{"line":438,"column":18}},{"start":{"line":440,"column":8},"end":{"line":442,"column":18}},{"start":{"line":444,"column":8},"end":{"line":446,"column":18}},{"start":{"line":448,"column":8},"end":{"line":450,"column":18}}]},"38":{"line":459,"type":"switch","locations":[{"start":{"line":461,"column":8},"end":{"line":461,"column":16}},{"start":{"line":462,"column":8},"end":{"line":464,"column":18}},{"start":{"line":466,"column":8},"end":{"line":466,"column":16}},{"start":{"line":467,"column":8},"end":{"line":469,"column":18}},{"start":{"line":471,"column":8},"end":{"line":471,"column":16}},{"start":{"line":472,"column":8},"end":{"line":474,"column":18}},{"start":{"line":476,"column":8},"end":{"line":476,"column":16}},{"start":{"line":477,"column":8},"end":{"line":479,"column":18}},{"start":{"line":481,"column":8},"end":{"line":483,"column":18}},{"start":{"line":485,"column":8},"end":{"line":487,"column":18}}]},"39":{"line":514,"type":"binary-expr","locations":[{"start":{"line":514,"column":47},"end":{"line":514,"column":87}},{"start":{"line":514,"column":91},"end":{"line":514,"column":93}}]},"40":{"line":532,"type":"if","locations":[{"start":{"line":532,"column":8},"end":{"line":532,"column":8}},{"start":{"line":532,"column":8},"end":{"line":532,"column":8}}]},"41":{"line":532,"type":"binary-expr","locations":[{"start":{"line":532,"column":11},"end":{"line":532,"column":16}},{"start":{"line":532,"column":20},"end":{"line":532,"column":37}}]},"42":{"line":544,"type":"if","locations":[{"start":{"line":544,"column":20},"end":{"line":544,"column":20}},{"start":{"line":544,"column":20},"end":{"line":544,"column":20}}]},"43":{"line":545,"type":"if","locations":[{"start":{"line":545,"column":24},"end":{"line":545,"column":24}},{"start":{"line":545,"column":24},"end":{"line":545,"column":24}}]},"44":{"line":555,"type":"if","locations":[{"start":{"line":555,"column":28},"end":{"line":555,"column":28}},{"start":{"line":555,"column":28},"end":{"line":555,"column":28}}]},"45":{"line":557,"type":"if","locations":[{"start":{"line":557,"column":32},"end":{"line":557,"column":32}},{"start":{"line":557,"column":32},"end":{"line":557,"column":32}}]},"46":{"line":558,"type":"if","locations":[{"start":{"line":558,"column":36},"end":{"line":558,"column":36}},{"start":{"line":558,"column":36},"end":{"line":558,"column":36}}]},"47":{"line":564,"type":"if","locations":[{"start":{"line":564,"column":36},"end":{"line":564,"column":36}},{"start":{"line":564,"column":36},"end":{"line":564,"column":36}}]},"48":{"line":589,"type":"binary-expr","locations":[{"start":{"line":589,"column":31},"end":{"line":589,"column":55}},{"start":{"line":589,"column":59},"end":{"line":589,"column":61}}]},"49":{"line":622,"type":"if","locations":[{"start":{"line":622,"column":4},"end":{"line":622,"column":4}},{"start":{"line":622,"column":4},"end":{"line":622,"column":4}}]},"50":{"line":648,"type":"if","locations":[{"start":{"line":648,"column":4},"end":{"line":648,"column":4}},{"start":{"line":648,"column":4},"end":{"line":648,"column":4}}]},"51":{"line":653,"type":"if","locations":[{"start":{"line":653,"column":4},"end":{"line":653,"column":4}},{"start":{"line":653,"column":4},"end":{"line":653,"column":4}}]},"52":{"line":658,"type":"if","locations":[{"start":{"line":658,"column":4},"end":{"line":658,"column":4}},{"start":{"line":658,"column":4},"end":{"line":658,"column":4}}]},"53":{"line":663,"type":"if","locations":[{"start":{"line":663,"column":4},"end":{"line":663,"column":4}},{"start":{"line":663,"column":4},"end":{"line":663,"column":4}}]},"54":{"line":668,"type":"if","locations":[{"start":{"line":668,"column":4},"end":{"line":668,"column":4}},{"start":{"line":668,"column":4},"end":{"line":668,"column":4}}]},"55":{"line":809,"type":"if","locations":[{"start":{"line":809,"column":4},"end":{"line":809,"column":4}},{"start":{"line":809,"column":4},"end":{"line":809,"column":4}}]},"56":{"line":814,"type":"if","locations":[{"start":{"line":814,"column":4},"end":{"line":814,"column":4}},{"start":{"line":814,"column":4},"end":{"line":814,"column":4}}]},"57":{"line":818,"type":"if","locations":[{"start":{"line":818,"column":8},"end":{"line":818,"column":8}},{"start":{"line":818,"column":8},"end":{"line":818,"column":8}}]},"58":{"line":822,"type":"if","locations":[{"start":{"line":822,"column":8},"end":{"line":822,"column":8}},{"start":{"line":822,"column":8},"end":{"line":822,"column":8}}]},"59":{"line":826,"type":"if","locations":[{"start":{"line":826,"column":8},"end":{"line":826,"column":8}},{"start":{"line":826,"column":8},"end":{"line":826,"column":8}}]},"60":{"line":874,"type":"if","locations":[{"start":{"line":874,"column":4},"end":{"line":874,"column":4}},{"start":{"line":874,"column":4},"end":{"line":874,"column":4}}]},"61":{"line":879,"type":"if","locations":[{"start":{"line":879,"column":4},"end":{"line":879,"column":4}},{"start":{"line":879,"column":4},"end":{"line":879,"column":4}}]},"62":{"line":884,"type":"if","locations":[{"start":{"line":884,"column":4},"end":{"line":884,"column":4}},{"start":{"line":884,"column":4},"end":{"line":884,"column":4}}]},"63":{"line":889,"type":"if","locations":[{"start":{"line":889,"column":4},"end":{"line":889,"column":4}},{"start":{"line":889,"column":4},"end":{"line":889,"column":4}}]},"64":{"line":894,"type":"if","locations":[{"start":{"line":894,"column":4},"end":{"line":894,"column":4}},{"start":{"line":894,"column":4},"end":{"line":894,"column":4}}]},"65":{"line":899,"type":"if","locations":[{"start":{"line":899,"column":4},"end":{"line":899,"column":4}},{"start":{"line":899,"column":4},"end":{"line":899,"column":4}}]},"66":{"line":904,"type":"if","locations":[{"start":{"line":904,"column":4},"end":{"line":904,"column":4}},{"start":{"line":904,"column":4},"end":{"line":904,"column":4}}]},"67":{"line":909,"type":"if","locations":[{"start":{"line":909,"column":4},"end":{"line":909,"column":4}},{"start":{"line":909,"column":4},"end":{"line":909,"column":4}}]},"68":{"line":914,"type":"if","locations":[{"start":{"line":914,"column":4},"end":{"line":914,"column":4}},{"start":{"line":914,"column":4},"end":{"line":914,"column":4}}]},"69":{"line":919,"type":"if","locations":[{"start":{"line":919,"column":4},"end":{"line":919,"column":4}},{"start":{"line":919,"column":4},"end":{"line":919,"column":4}}]},"70":{"line":1046,"type":"if","locations":[{"start":{"line":1046,"column":4},"end":{"line":1046,"column":4}},{"start":{"line":1046,"column":4},"end":{"line":1046,"column":4}}]},"71":{"line":1051,"type":"if","locations":[{"start":{"line":1051,"column":4},"end":{"line":1051,"column":4}},{"start":{"line":1051,"column":4},"end":{"line":1051,"column":4}}]},"72":{"line":1056,"type":"if","locations":[{"start":{"line":1056,"column":4},"end":{"line":1056,"column":4}},{"start":{"line":1056,"column":4},"end":{"line":1056,"column":4}}]},"73":{"line":1061,"type":"if","locations":[{"start":{"line":1061,"column":4},"end":{"line":1061,"column":4}},{"start":{"line":1061,"column":4},"end":{"line":1061,"column":4}}]},"74":{"line":1066,"type":"if","locations":[{"start":{"line":1066,"column":4},"end":{"line":1066,"column":4}},{"start":{"line":1066,"column":4},"end":{"line":1066,"column":4}}]},"75":{"line":1084,"type":"if","locations":[{"start":{"line":1084,"column":4},"end":{"line":1084,"column":4}},{"start":{"line":1084,"column":4},"end":{"line":1084,"column":4}}]},"76":{"line":1089,"type":"if","locations":[{"start":{"line":1089,"column":4},"end":{"line":1089,"column":4}},{"start":{"line":1089,"column":4},"end":{"line":1089,"column":4}}]},"77":{"line":1094,"type":"if","locations":[{"start":{"line":1094,"column":4},"end":{"line":1094,"column":4}},{"start":{"line":1094,"column":4},"end":{"line":1094,"column":4}}]},"78":{"line":1099,"type":"if","locations":[{"start":{"line":1099,"column":4},"end":{"line":1099,"column":4}},{"start":{"line":1099,"column":4},"end":{"line":1099,"column":4}}]},"79":{"line":1104,"type":"if","locations":[{"start":{"line":1104,"column":4},"end":{"line":1104,"column":4}},{"start":{"line":1104,"column":4},"end":{"line":1104,"column":4}}]},"80":{"line":1109,"type":"if","locations":[{"start":{"line":1109,"column":4},"end":{"line":1109,"column":4}},{"start":{"line":1109,"column":4},"end":{"line":1109,"column":4}}]},"81":{"line":1114,"type":"if","locations":[{"start":{"line":1114,"column":4},"end":{"line":1114,"column":4}},{"start":{"line":1114,"column":4},"end":{"line":1114,"column":4}}]},"82":{"line":1119,"type":"if","locations":[{"start":{"line":1119,"column":4},"end":{"line":1119,"column":4}},{"start":{"line":1119,"column":4},"end":{"line":1119,"column":4}}]},"83":{"line":1124,"type":"if","locations":[{"start":{"line":1124,"column":4},"end":{"line":1124,"column":4}},{"start":{"line":1124,"column":4},"end":{"line":1124,"column":4}}]},"84":{"line":1129,"type":"if","locations":[{"start":{"line":1129,"column":4},"end":{"line":1129,"column":4}},{"start":{"line":1129,"column":4},"end":{"line":1129,"column":4}}]},"85":{"line":1134,"type":"if","locations":[{"start":{"line":1134,"column":4},"end":{"line":1134,"column":4}},{"start":{"line":1134,"column":4},"end":{"line":1134,"column":4}}]},"86":{"line":1139,"type":"if","locations":[{"start":{"line":1139,"column":4},"end":{"line":1139,"column":4}},{"start":{"line":1139,"column":4},"end":{"line":1139,"column":4}}]},"87":{"line":1144,"type":"if","locations":[{"start":{"line":1144,"column":4},"end":{"line":1144,"column":4}},{"start":{"line":1144,"column":4},"end":{"line":1144,"column":4}}]},"88":{"line":1149,"type":"if","locations":[{"start":{"line":1149,"column":4},"end":{"line":1149,"column":4}},{"start":{"line":1149,"column":4},"end":{"line":1149,"column":4}}]},"89":{"line":1154,"type":"if","locations":[{"start":{"line":1154,"column":4},"end":{"line":1154,"column":4}},{"start":{"line":1154,"column":4},"end":{"line":1154,"column":4}}]},"90":{"line":1159,"type":"if","locations":[{"start":{"line":1159,"column":4},"end":{"line":1159,"column":4}},{"start":{"line":1159,"column":4},"end":{"line":1159,"column":4}}]},"91":{"line":1164,"type":"if","locations":[{"start":{"line":1164,"column":4},"end":{"line":1164,"column":4}},{"start":{"line":1164,"column":4},"end":{"line":1164,"column":4}}]},"92":{"line":1169,"type":"if","locations":[{"start":{"line":1169,"column":4},"end":{"line":1169,"column":4}},{"start":{"line":1169,"column":4},"end":{"line":1169,"column":4}}]},"93":{"line":1174,"type":"if","locations":[{"start":{"line":1174,"column":4},"end":{"line":1174,"column":4}},{"start":{"line":1174,"column":4},"end":{"line":1174,"column":4}}]},"94":{"line":1179,"type":"if","locations":[{"start":{"line":1179,"column":4},"end":{"line":1179,"column":4}},{"start":{"line":1179,"column":4},"end":{"line":1179,"column":4}}]},"95":{"line":1184,"type":"if","locations":[{"start":{"line":1184,"column":4},"end":{"line":1184,"column":4}},{"start":{"line":1184,"column":4},"end":{"line":1184,"column":4}}]},"96":{"line":1189,"type":"if","locations":[{"start":{"line":1189,"column":4},"end":{"line":1189,"column":4}},{"start":{"line":1189,"column":4},"end":{"line":1189,"column":4}}]},"97":{"line":1194,"type":"if","locations":[{"start":{"line":1194,"column":4},"end":{"line":1194,"column":4}},{"start":{"line":1194,"column":4},"end":{"line":1194,"column":4}}]},"98":{"line":1199,"type":"if","locations":[{"start":{"line":1199,"column":4},"end":{"line":1199,"column":4}},{"start":{"line":1199,"column":4},"end":{"line":1199,"column":4}}]},"99":{"line":1204,"type":"if","locations":[{"start":{"line":1204,"column":4},"end":{"line":1204,"column":4}},{"start":{"line":1204,"column":4},"end":{"line":1204,"column":4}}]},"100":{"line":1209,"type":"if","locations":[{"start":{"line":1209,"column":4},"end":{"line":1209,"column":4}},{"start":{"line":1209,"column":4},"end":{"line":1209,"column":4}}]},"101":{"line":1214,"type":"if","locations":[{"start":{"line":1214,"column":4},"end":{"line":1214,"column":4}},{"start":{"line":1214,"column":4},"end":{"line":1214,"column":4}}]},"102":{"line":1219,"type":"if","locations":[{"start":{"line":1219,"column":4},"end":{"line":1219,"column":4}},{"start":{"line":1219,"column":4},"end":{"line":1219,"column":4}}]},"103":{"line":1224,"type":"if","locations":[{"start":{"line":1224,"column":4},"end":{"line":1224,"column":4}},{"start":{"line":1224,"column":4},"end":{"line":1224,"column":4}}]},"104":{"line":1229,"type":"if","locations":[{"start":{"line":1229,"column":4},"end":{"line":1229,"column":4}},{"start":{"line":1229,"column":4},"end":{"line":1229,"column":4}}]},"105":{"line":1234,"type":"if","locations":[{"start":{"line":1234,"column":4},"end":{"line":1234,"column":4}},{"start":{"line":1234,"column":4},"end":{"line":1234,"column":4}}]},"106":{"line":1239,"type":"if","locations":[{"start":{"line":1239,"column":4},"end":{"line":1239,"column":4}},{"start":{"line":1239,"column":4},"end":{"line":1239,"column":4}}]},"107":{"line":1244,"type":"if","locations":[{"start":{"line":1244,"column":4},"end":{"line":1244,"column":4}},{"start":{"line":1244,"column":4},"end":{"line":1244,"column":4}}]},"108":{"line":1249,"type":"if","locations":[{"start":{"line":1249,"column":4},"end":{"line":1249,"column":4}},{"start":{"line":1249,"column":4},"end":{"line":1249,"column":4}}]},"109":{"line":1254,"type":"if","locations":[{"start":{"line":1254,"column":4},"end":{"line":1254,"column":4}},{"start":{"line":1254,"column":4},"end":{"line":1254,"column":4}}]},"110":{"line":1259,"type":"if","locations":[{"start":{"line":1259,"column":4},"end":{"line":1259,"column":4}},{"start":{"line":1259,"column":4},"end":{"line":1259,"column":4}}]},"111":{"line":1264,"type":"if","locations":[{"start":{"line":1264,"column":4},"end":{"line":1264,"column":4}},{"start":{"line":1264,"column":4},"end":{"line":1264,"column":4}}]},"112":{"line":1269,"type":"if","locations":[{"start":{"line":1269,"column":4},"end":{"line":1269,"column":4}},{"start":{"line":1269,"column":4},"end":{"line":1269,"column":4}}]},"113":{"line":1274,"type":"if","locations":[{"start":{"line":1274,"column":4},"end":{"line":1274,"column":4}},{"start":{"line":1274,"column":4},"end":{"line":1274,"column":4}}]},"114":{"line":1279,"type":"if","locations":[{"start":{"line":1279,"column":4},"end":{"line":1279,"column":4}},{"start":{"line":1279,"column":4},"end":{"line":1279,"column":4}}]},"115":{"line":1284,"type":"if","locations":[{"start":{"line":1284,"column":4},"end":{"line":1284,"column":4}},{"start":{"line":1284,"column":4},"end":{"line":1284,"column":4}}]},"116":{"line":1289,"type":"if","locations":[{"start":{"line":1289,"column":4},"end":{"line":1289,"column":4}},{"start":{"line":1289,"column":4},"end":{"line":1289,"column":4}}]},"117":{"line":1294,"type":"if","locations":[{"start":{"line":1294,"column":4},"end":{"line":1294,"column":4}},{"start":{"line":1294,"column":4},"end":{"line":1294,"column":4}}]},"118":{"line":1299,"type":"if","locations":[{"start":{"line":1299,"column":4},"end":{"line":1299,"column":4}},{"start":{"line":1299,"column":4},"end":{"line":1299,"column":4}}]},"119":{"line":1304,"type":"if","locations":[{"start":{"line":1304,"column":4},"end":{"line":1304,"column":4}},{"start":{"line":1304,"column":4},"end":{"line":1304,"column":4}}]},"120":{"line":1309,"type":"if","locations":[{"start":{"line":1309,"column":4},"end":{"line":1309,"column":4}},{"start":{"line":1309,"column":4},"end":{"line":1309,"column":4}}]},"121":{"line":1314,"type":"if","locations":[{"start":{"line":1314,"column":4},"end":{"line":1314,"column":4}},{"start":{"line":1314,"column":4},"end":{"line":1314,"column":4}}]},"122":{"line":1319,"type":"if","locations":[{"start":{"line":1319,"column":4},"end":{"line":1319,"column":4}},{"start":{"line":1319,"column":4},"end":{"line":1319,"column":4}}]},"123":{"line":1324,"type":"if","locations":[{"start":{"line":1324,"column":4},"end":{"line":1324,"column":4}},{"start":{"line":1324,"column":4},"end":{"line":1324,"column":4}}]},"124":{"line":1329,"type":"if","locations":[{"start":{"line":1329,"column":4},"end":{"line":1329,"column":4}},{"start":{"line":1329,"column":4},"end":{"line":1329,"column":4}}]},"125":{"line":1452,"type":"if","locations":[{"start":{"line":1452,"column":4},"end":{"line":1452,"column":4}},{"start":{"line":1452,"column":4},"end":{"line":1452,"column":4}}]},"126":{"line":1518,"type":"if","locations":[{"start":{"line":1518,"column":11},"end":{"line":1518,"column":11}},{"start":{"line":1518,"column":11},"end":{"line":1518,"column":11}}]},"127":{"line":1593,"type":"if","locations":[{"start":{"line":1593,"column":4},"end":{"line":1593,"column":4}},{"start":{"line":1593,"column":4},"end":{"line":1593,"column":4}}]},"128":{"line":1632,"type":"if","locations":[{"start":{"line":1632,"column":4},"end":{"line":1632,"column":4}},{"start":{"line":1632,"column":4},"end":{"line":1632,"column":4}}]},"129":{"line":1636,"type":"if","locations":[{"start":{"line":1636,"column":4},"end":{"line":1636,"column":4}},{"start":{"line":1636,"column":4},"end":{"line":1636,"column":4}}]},"130":{"line":1640,"type":"if","locations":[{"start":{"line":1640,"column":4},"end":{"line":1640,"column":4}},{"start":{"line":1640,"column":4},"end":{"line":1640,"column":4}}]},"131":{"line":1664,"type":"if","locations":[{"start":{"line":1664,"column":4},"end":{"line":1664,"column":4}},{"start":{"line":1664,"column":4},"end":{"line":1664,"column":4}}]},"132":{"line":1668,"type":"if","locations":[{"start":{"line":1668,"column":4},"end":{"line":1668,"column":4}},{"start":{"line":1668,"column":4},"end":{"line":1668,"column":4}}]},"133":{"line":1672,"type":"if","locations":[{"start":{"line":1672,"column":4},"end":{"line":1672,"column":4}},{"start":{"line":1672,"column":4},"end":{"line":1672,"column":4}}]},"134":{"line":1676,"type":"if","locations":[{"start":{"line":1676,"column":4},"end":{"line":1676,"column":4}},{"start":{"line":1676,"column":4},"end":{"line":1676,"column":4}}]},"135":{"line":1731,"type":"if","locations":[{"start":{"line":1731,"column":4},"end":{"line":1731,"column":4}},{"start":{"line":1731,"column":4},"end":{"line":1731,"column":4}}]},"136":{"line":1738,"type":"if","locations":[{"start":{"line":1738,"column":11},"end":{"line":1738,"column":11}},{"start":{"line":1738,"column":11},"end":{"line":1738,"column":11}}]},"137":{"line":1762,"type":"if","locations":[{"start":{"line":1762,"column":4},"end":{"line":1762,"column":4}},{"start":{"line":1762,"column":4},"end":{"line":1762,"column":4}}]},"138":{"line":1768,"type":"if","locations":[{"start":{"line":1768,"column":4},"end":{"line":1768,"column":4}},{"start":{"line":1768,"column":4},"end":{"line":1768,"column":4}}]},"139":{"line":1881,"type":"if","locations":[{"start":{"line":1881,"column":4},"end":{"line":1881,"column":4}},{"start":{"line":1881,"column":4},"end":{"line":1881,"column":4}}]},"140":{"line":1886,"type":"if","locations":[{"start":{"line":1886,"column":4},"end":{"line":1886,"column":4}},{"start":{"line":1886,"column":4},"end":{"line":1886,"column":4}}]},"141":{"line":1891,"type":"if","locations":[{"start":{"line":1891,"column":4},"end":{"line":1891,"column":4}},{"start":{"line":1891,"column":4},"end":{"line":1891,"column":4}}]},"142":{"line":1896,"type":"if","locations":[{"start":{"line":1896,"column":4},"end":{"line":1896,"column":4}},{"start":{"line":1896,"column":4},"end":{"line":1896,"column":4}}]},"143":{"line":1901,"type":"if","locations":[{"start":{"line":1901,"column":4},"end":{"line":1901,"column":4}},{"start":{"line":1901,"column":4},"end":{"line":1901,"column":4}}]},"144":{"line":1906,"type":"if","locations":[{"start":{"line":1906,"column":4},"end":{"line":1906,"column":4}},{"start":{"line":1906,"column":4},"end":{"line":1906,"column":4}}]},"145":{"line":1911,"type":"if","locations":[{"start":{"line":1911,"column":4},"end":{"line":1911,"column":4}},{"start":{"line":1911,"column":4},"end":{"line":1911,"column":4}}]},"146":{"line":1916,"type":"if","locations":[{"start":{"line":1916,"column":4},"end":{"line":1916,"column":4}},{"start":{"line":1916,"column":4},"end":{"line":1916,"column":4}}]},"147":{"line":1921,"type":"if","locations":[{"start":{"line":1921,"column":4},"end":{"line":1921,"column":4}},{"start":{"line":1921,"column":4},"end":{"line":1921,"column":4}}]},"148":{"line":1926,"type":"if","locations":[{"start":{"line":1926,"column":4},"end":{"line":1926,"column":4}},{"start":{"line":1926,"column":4},"end":{"line":1926,"column":4}}]},"149":{"line":1959,"type":"if","locations":[{"start":{"line":1959,"column":4},"end":{"line":1959,"column":4}},{"start":{"line":1959,"column":4},"end":{"line":1959,"column":4}}]},"150":{"line":1963,"type":"if","locations":[{"start":{"line":1963,"column":4},"end":{"line":1963,"column":4}},{"start":{"line":1963,"column":4},"end":{"line":1963,"column":4}}]},"151":{"line":2047,"type":"if","locations":[{"start":{"line":2047,"column":12},"end":{"line":2047,"column":12}},{"start":{"line":2047,"column":12},"end":{"line":2047,"column":12}}]},"152":{"line":2061,"type":"if","locations":[{"start":{"line":2061,"column":4},"end":{"line":2061,"column":4}},{"start":{"line":2061,"column":4},"end":{"line":2061,"column":4}}]},"153":{"line":2128,"type":"if","locations":[{"start":{"line":2128,"column":8},"end":{"line":2128,"column":8}},{"start":{"line":2128,"column":8},"end":{"line":2128,"column":8}}]},"154":{"line":2184,"type":"if","locations":[{"start":{"line":2184,"column":12},"end":{"line":2184,"column":12}},{"start":{"line":2184,"column":12},"end":{"line":2184,"column":12}}]},"155":{"line":2202,"type":"if","locations":[{"start":{"line":2202,"column":12},"end":{"line":2202,"column":12}},{"start":{"line":2202,"column":12},"end":{"line":2202,"column":12}}]},"156":{"line":2203,"type":"binary-expr","locations":[{"start":{"line":2203,"column":17},"end":{"line":2203,"column":38}},{"start":{"line":2203,"column":42},"end":{"line":2203,"column":63}},{"start":{"line":2204,"column":17},"end":{"line":2204,"column":38}},{"start":{"line":2204,"column":42},"end":{"line":2204,"column":63}},{"start":{"line":2205,"column":17},"end":{"line":2205,"column":38}},{"start":{"line":2205,"column":42},"end":{"line":2205,"column":63}},{"start":{"line":2206,"column":17},"end":{"line":2206,"column":38}},{"start":{"line":2206,"column":42},"end":{"line":2206,"column":63}},{"start":{"line":2207,"column":17},"end":{"line":2207,"column":38}},{"start":{"line":2207,"column":42},"end":{"line":2207,"column":63}},{"start":{"line":2208,"column":17},"end":{"line":2208,"column":38}},{"start":{"line":2208,"column":42},"end":{"line":2208,"column":63}}]},"157":{"line":2221,"type":"if","locations":[{"start":{"line":2221,"column":16},"end":{"line":2221,"column":16}},{"start":{"line":2221,"column":16},"end":{"line":2221,"column":16}}]},"158":{"line":2260,"type":"if","locations":[{"start":{"line":2260,"column":8},"end":{"line":2260,"column":8}},{"start":{"line":2260,"column":8},"end":{"line":2260,"column":8}}]},"159":{"line":2261,"type":"binary-expr","locations":[{"start":{"line":2261,"column":13},"end":{"line":2261,"column":60}},{"start":{"line":2262,"column":12},"end":{"line":2262,"column":59}},{"start":{"line":2263,"column":13},"end":{"line":2263,"column":60}},{"start":{"line":2264,"column":12},"end":{"line":2264,"column":59}},{"start":{"line":2265,"column":13},"end":{"line":2265,"column":60}},{"start":{"line":2266,"column":12},"end":{"line":2266,"column":59}}]},"160":{"line":2296,"type":"if","locations":[{"start":{"line":2296,"column":12},"end":{"line":2296,"column":12}},{"start":{"line":2296,"column":12},"end":{"line":2296,"column":12}}]},"161":{"line":2296,"type":"binary-expr","locations":[{"start":{"line":2296,"column":16},"end":{"line":2296,"column":25}},{"start":{"line":2296,"column":29},"end":{"line":2296,"column":72}}]},"162":{"line":2310,"type":"if","locations":[{"start":{"line":2310,"column":12},"end":{"line":2310,"column":12}},{"start":{"line":2310,"column":12},"end":{"line":2310,"column":12}}]},"163":{"line":2315,"type":"if","locations":[{"start":{"line":2315,"column":8},"end":{"line":2315,"column":8}},{"start":{"line":2315,"column":8},"end":{"line":2315,"column":8}}]},"164":{"line":2333,"type":"if","locations":[{"start":{"line":2333,"column":4},"end":{"line":2333,"column":4}},{"start":{"line":2333,"column":4},"end":{"line":2333,"column":4}}]},"165":{"line":2333,"type":"binary-expr","locations":[{"start":{"line":2333,"column":8},"end":{"line":2333,"column":38}},{"start":{"line":2333,"column":42},"end":{"line":2333,"column":68}}]},"166":{"line":2385,"type":"if","locations":[{"start":{"line":2385,"column":4},"end":{"line":2385,"column":4}},{"start":{"line":2385,"column":4},"end":{"line":2385,"column":4}}]},"167":{"line":2453,"type":"if","locations":[{"start":{"line":2453,"column":4},"end":{"line":2453,"column":4}},{"start":{"line":2453,"column":4},"end":{"line":2453,"column":4}}]},"168":{"line":2525,"type":"if","locations":[{"start":{"line":2525,"column":1},"end":{"line":2525,"column":1}},{"start":{"line":2525,"column":1},"end":{"line":2525,"column":1}}]},"169":{"line":2530,"type":"if","locations":[{"start":{"line":2530,"column":1},"end":{"line":2530,"column":1}},{"start":{"line":2530,"column":1},"end":{"line":2530,"column":1}}]},"170":{"line":2535,"type":"if","locations":[{"start":{"line":2535,"column":1},"end":{"line":2535,"column":1}},{"start":{"line":2535,"column":1},"end":{"line":2535,"column":1}}]},"171":{"line":2540,"type":"if","locations":[{"start":{"line":2540,"column":1},"end":{"line":2540,"column":1}},{"start":{"line":2540,"column":1},"end":{"line":2540,"column":1}}]},"172":{"line":2545,"type":"if","locations":[{"start":{"line":2545,"column":1},"end":{"line":2545,"column":1}},{"start":{"line":2545,"column":1},"end":{"line":2545,"column":1}}]},"173":{"line":2550,"type":"if","locations":[{"start":{"line":2550,"column":1},"end":{"line":2550,"column":1}},{"start":{"line":2550,"column":1},"end":{"line":2550,"column":1}}]},"174":{"line":2555,"type":"if","locations":[{"start":{"line":2555,"column":1},"end":{"line":2555,"column":1}},{"start":{"line":2555,"column":1},"end":{"line":2555,"column":1}}]},"175":{"line":2560,"type":"if","locations":[{"start":{"line":2560,"column":1},"end":{"line":2560,"column":1}},{"start":{"line":2560,"column":1},"end":{"line":2560,"column":1}}]},"176":{"line":2565,"type":"if","locations":[{"start":{"line":2565,"column":1},"end":{"line":2565,"column":1}},{"start":{"line":2565,"column":1},"end":{"line":2565,"column":1}}]},"177":{"line":2570,"type":"if","locations":[{"start":{"line":2570,"column":1},"end":{"line":2570,"column":1}},{"start":{"line":2570,"column":1},"end":{"line":2570,"column":1}}]},"178":{"line":2575,"type":"if","locations":[{"start":{"line":2575,"column":1},"end":{"line":2575,"column":1}},{"start":{"line":2575,"column":1},"end":{"line":2575,"column":1}}]},"179":{"line":2580,"type":"if","locations":[{"start":{"line":2580,"column":1},"end":{"line":2580,"column":1}},{"start":{"line":2580,"column":1},"end":{"line":2580,"column":1}}]},"180":{"line":2585,"type":"if","locations":[{"start":{"line":2585,"column":1},"end":{"line":2585,"column":1}},{"start":{"line":2585,"column":1},"end":{"line":2585,"column":1}}]},"181":{"line":2590,"type":"if","locations":[{"start":{"line":2590,"column":1},"end":{"line":2590,"column":1}},{"start":{"line":2590,"column":1},"end":{"line":2590,"column":1}}]},"182":{"line":2595,"type":"if","locations":[{"start":{"line":2595,"column":1},"end":{"line":2595,"column":1}},{"start":{"line":2595,"column":1},"end":{"line":2595,"column":1}}]},"183":{"line":2600,"type":"if","locations":[{"start":{"line":2600,"column":1},"end":{"line":2600,"column":1}},{"start":{"line":2600,"column":1},"end":{"line":2600,"column":1}}]},"184":{"line":2605,"type":"if","locations":[{"start":{"line":2605,"column":1},"end":{"line":2605,"column":1}},{"start":{"line":2605,"column":1},"end":{"line":2605,"column":1}}]},"185":{"line":2610,"type":"if","locations":[{"start":{"line":2610,"column":1},"end":{"line":2610,"column":1}},{"start":{"line":2610,"column":1},"end":{"line":2610,"column":1}}]},"186":{"line":2615,"type":"if","locations":[{"start":{"line":2615,"column":1},"end":{"line":2615,"column":1}},{"start":{"line":2615,"column":1},"end":{"line":2615,"column":1}}]},"187":{"line":2620,"type":"if","locations":[{"start":{"line":2620,"column":1},"end":{"line":2620,"column":1}},{"start":{"line":2620,"column":1},"end":{"line":2620,"column":1}}]},"188":{"line":2625,"type":"if","locations":[{"start":{"line":2625,"column":1},"end":{"line":2625,"column":1}},{"start":{"line":2625,"column":1},"end":{"line":2625,"column":1}}]},"189":{"line":2630,"type":"if","locations":[{"start":{"line":2630,"column":1},"end":{"line":2630,"column":1}},{"start":{"line":2630,"column":1},"end":{"line":2630,"column":1}}]},"190":{"line":2635,"type":"if","locations":[{"start":{"line":2635,"column":1},"end":{"line":2635,"column":1}},{"start":{"line":2635,"column":1},"end":{"line":2635,"column":1}}]},"191":{"line":2640,"type":"if","locations":[{"start":{"line":2640,"column":1},"end":{"line":2640,"column":1}},{"start":{"line":2640,"column":1},"end":{"line":2640,"column":1}}]},"192":{"line":2645,"type":"if","locations":[{"start":{"line":2645,"column":1},"end":{"line":2645,"column":1}},{"start":{"line":2645,"column":1},"end":{"line":2645,"column":1}}]},"193":{"line":2650,"type":"if","locations":[{"start":{"line":2650,"column":1},"end":{"line":2650,"column":1}},{"start":{"line":2650,"column":1},"end":{"line":2650,"column":1}}]},"194":{"line":2655,"type":"if","locations":[{"start":{"line":2655,"column":1},"end":{"line":2655,"column":1}},{"start":{"line":2655,"column":1},"end":{"line":2655,"column":1}}]},"195":{"line":2715,"type":"if","locations":[{"start":{"line":2715,"column":4},"end":{"line":2715,"column":4}},{"start":{"line":2715,"column":4},"end":{"line":2715,"column":4}}]},"196":{"line":2810,"type":"binary-expr","locations":[{"start":{"line":2810,"column":20},"end":{"line":2810,"column":28}},{"start":{"line":2810,"column":32},"end":{"line":2810,"column":56}}]},"197":{"line":2811,"type":"binary-expr","locations":[{"start":{"line":2811,"column":20},"end":{"line":2811,"column":28}},{"start":{"line":2811,"column":32},"end":{"line":2811,"column":56}}]},"198":{"line":2812,"type":"binary-expr","locations":[{"start":{"line":2812,"column":27},"end":{"line":2812,"column":42}},{"start":{"line":2812,"column":46},"end":{"line":2812,"column":70}}]},"199":{"line":2813,"type":"binary-expr","locations":[{"start":{"line":2813,"column":22},"end":{"line":2813,"column":32}},{"start":{"line":2813,"column":36},"end":{"line":2813,"column":70}}]},"200":{"line":2814,"type":"cond-expr","locations":[{"start":{"line":2814,"column":45},"end":{"line":2814,"column":46}},{"start":{"line":2814,"column":49},"end":{"line":2814,"column":53}}]},"201":{"line":2815,"type":"cond-expr","locations":[{"start":{"line":2815,"column":53},"end":{"line":2815,"column":54}},{"start":{"line":2815,"column":57},"end":{"line":2815,"column":65}}]},"202":{"line":2816,"type":"cond-expr","locations":[{"start":{"line":2816,"column":63},"end":{"line":2816,"column":67}},{"start":{"line":2816,"column":70},"end":{"line":2816,"column":83}}]},"203":{"line":2817,"type":"cond-expr","locations":[{"start":{"line":2817,"column":65},"end":{"line":2817,"column":69}},{"start":{"line":2817,"column":72},"end":{"line":2817,"column":86}}]},"204":{"line":2818,"type":"cond-expr","locations":[{"start":{"line":2818,"column":57},"end":{"line":2818,"column":61}},{"start":{"line":2818,"column":64},"end":{"line":2818,"column":74}}]},"205":{"line":2819,"type":"cond-expr","locations":[{"start":{"line":2819,"column":67},"end":{"line":2819,"column":70}},{"start":{"line":2819,"column":73},"end":{"line":2819,"column":88}}]},"206":{"line":2820,"type":"cond-expr","locations":[{"start":{"line":2820,"column":65},"end":{"line":2820,"column":68}},{"start":{"line":2820,"column":71},"end":{"line":2820,"column":85}}]},"207":{"line":2821,"type":"cond-expr","locations":[{"start":{"line":2821,"column":77},"end":{"line":2821,"column":78}},{"start":{"line":2821,"column":81},"end":{"line":2821,"column":101}}]},"208":{"line":2822,"type":"cond-expr","locations":[{"start":{"line":2822,"column":75},"end":{"line":2822,"column":76}},{"start":{"line":2822,"column":79},"end":{"line":2822,"column":98}}]},"209":{"line":2823,"type":"cond-expr","locations":[{"start":{"line":2823,"column":63},"end":{"line":2823,"column":68}},{"start":{"line":2823,"column":71},"end":{"line":2823,"column":84}}]},"210":{"line":2824,"type":"cond-expr","locations":[{"start":{"line":2824,"column":47},"end":{"line":2824,"column":51}},{"start":{"line":2824,"column":54},"end":{"line":2824,"column":59}}]},"211":{"line":2891,"type":"if","locations":[{"start":{"line":2891,"column":4},"end":{"line":2891,"column":4}},{"start":{"line":2891,"column":4},"end":{"line":2891,"column":4}}]},"212":{"line":2895,"type":"if","locations":[{"start":{"line":2895,"column":4},"end":{"line":2895,"column":4}},{"start":{"line":2895,"column":4},"end":{"line":2895,"column":4}}]},"213":{"line":2972,"type":"if","locations":[{"start":{"line":2972,"column":4},"end":{"line":2972,"column":4}},{"start":{"line":2972,"column":4},"end":{"line":2972,"column":4}}]},"214":{"line":2976,"type":"if","locations":[{"start":{"line":2976,"column":4},"end":{"line":2976,"column":4}},{"start":{"line":2976,"column":4},"end":{"line":2976,"column":4}}]},"215":{"line":2981,"type":"if","locations":[{"start":{"line":2981,"column":4},"end":{"line":2981,"column":4}},{"start":{"line":2981,"column":4},"end":{"line":2981,"column":4}}]},"216":{"line":2986,"type":"if","locations":[{"start":{"line":2986,"column":4},"end":{"line":2986,"column":4}},{"start":{"line":2986,"column":4},"end":{"line":2986,"column":4}}]},"217":{"line":2991,"type":"if","locations":[{"start":{"line":2991,"column":4},"end":{"line":2991,"column":4}},{"start":{"line":2991,"column":4},"end":{"line":2991,"column":4}}]},"218":{"line":2996,"type":"if","locations":[{"start":{"line":2996,"column":4},"end":{"line":2996,"column":4}},{"start":{"line":2996,"column":4},"end":{"line":2996,"column":4}}]},"219":{"line":3001,"type":"if","locations":[{"start":{"line":3001,"column":4},"end":{"line":3001,"column":4}},{"start":{"line":3001,"column":4},"end":{"line":3001,"column":4}}]},"220":{"line":3006,"type":"if","locations":[{"start":{"line":3006,"column":4},"end":{"line":3006,"column":4}},{"start":{"line":3006,"column":4},"end":{"line":3006,"column":4}}]},"221":{"line":3011,"type":"if","locations":[{"start":{"line":3011,"column":4},"end":{"line":3011,"column":4}},{"start":{"line":3011,"column":4},"end":{"line":3011,"column":4}}]},"222":{"line":3016,"type":"if","locations":[{"start":{"line":3016,"column":4},"end":{"line":3016,"column":4}},{"start":{"line":3016,"column":4},"end":{"line":3016,"column":4}}]},"223":{"line":3043,"type":"if","locations":[{"start":{"line":3043,"column":4},"end":{"line":3043,"column":4}},{"start":{"line":3043,"column":4},"end":{"line":3043,"column":4}}]},"224":{"line":3056,"type":"if","locations":[{"start":{"line":3056,"column":12},"end":{"line":3056,"column":12}},{"start":{"line":3056,"column":12},"end":{"line":3056,"column":12}}]},"225":{"line":3060,"type":"if","locations":[{"start":{"line":3060,"column":16},"end":{"line":3060,"column":16}},{"start":{"line":3060,"column":16},"end":{"line":3060,"column":16}}]},"226":{"line":3060,"type":"binary-expr","locations":[{"start":{"line":3060,"column":20},"end":{"line":3060,"column":35}},{"start":{"line":3060,"column":39},"end":{"line":3060,"column":65}}]},"227":{"line":3068,"type":"if","locations":[{"start":{"line":3068,"column":16},"end":{"line":3068,"column":16}},{"start":{"line":3068,"column":16},"end":{"line":3068,"column":16}}]},"228":{"line":3068,"type":"binary-expr","locations":[{"start":{"line":3068,"column":20},"end":{"line":3068,"column":33}},{"start":{"line":3068,"column":37},"end":{"line":3068,"column":61}}]},"229":{"line":3076,"type":"if","locations":[{"start":{"line":3076,"column":24},"end":{"line":3076,"column":24}},{"start":{"line":3076,"column":24},"end":{"line":3076,"column":24}}]},"230":{"line":3206,"type":"binary-expr","locations":[{"start":{"line":3206,"column":20},"end":{"line":3206,"column":29}},{"start":{"line":3206,"column":33},"end":{"line":3206,"column":41}}]},"231":{"line":3405,"type":"if","locations":[{"start":{"line":3405,"column":8},"end":{"line":3405,"column":8}},{"start":{"line":3405,"column":8},"end":{"line":3405,"column":8}}]},"232":{"line":3475,"type":"if","locations":[{"start":{"line":3475,"column":8},"end":{"line":3475,"column":8}},{"start":{"line":3475,"column":8},"end":{"line":3475,"column":8}}]},"233":{"line":3485,"type":"if","locations":[{"start":{"line":3485,"column":16},"end":{"line":3485,"column":16}},{"start":{"line":3485,"column":16},"end":{"line":3485,"column":16}}]},"234":{"line":3489,"type":"if","locations":[{"start":{"line":3489,"column":16},"end":{"line":3489,"column":16}},{"start":{"line":3489,"column":16},"end":{"line":3489,"column":16}}]},"235":{"line":3493,"type":"if","locations":[{"start":{"line":3493,"column":16},"end":{"line":3493,"column":16}},{"start":{"line":3493,"column":16},"end":{"line":3493,"column":16}}]},"236":{"line":3499,"type":"if","locations":[{"start":{"line":3499,"column":16},"end":{"line":3499,"column":16}},{"start":{"line":3499,"column":16},"end":{"line":3499,"column":16}}]},"237":{"line":3515,"type":"if","locations":[{"start":{"line":3515,"column":16},"end":{"line":3515,"column":16}},{"start":{"line":3515,"column":16},"end":{"line":3515,"column":16}}]},"238":{"line":3606,"type":"if","locations":[{"start":{"line":3606,"column":4},"end":{"line":3606,"column":4}},{"start":{"line":3606,"column":4},"end":{"line":3606,"column":4}}]},"239":{"line":3611,"type":"if","locations":[{"start":{"line":3611,"column":4},"end":{"line":3611,"column":4}},{"start":{"line":3611,"column":4},"end":{"line":3611,"column":4}}]},"240":{"line":3616,"type":"if","locations":[{"start":{"line":3616,"column":4},"end":{"line":3616,"column":4}},{"start":{"line":3616,"column":4},"end":{"line":3616,"column":4}}]},"241":{"line":3621,"type":"if","locations":[{"start":{"line":3621,"column":4},"end":{"line":3621,"column":4}},{"start":{"line":3621,"column":4},"end":{"line":3621,"column":4}}]},"242":{"line":3626,"type":"if","locations":[{"start":{"line":3626,"column":4},"end":{"line":3626,"column":4}},{"start":{"line":3626,"column":4},"end":{"line":3626,"column":4}}]},"243":{"line":3631,"type":"if","locations":[{"start":{"line":3631,"column":4},"end":{"line":3631,"column":4}},{"start":{"line":3631,"column":4},"end":{"line":3631,"column":4}}]},"244":{"line":3636,"type":"if","locations":[{"start":{"line":3636,"column":4},"end":{"line":3636,"column":4}},{"start":{"line":3636,"column":4},"end":{"line":3636,"column":4}}]},"245":{"line":3641,"type":"if","locations":[{"start":{"line":3641,"column":4},"end":{"line":3641,"column":4}},{"start":{"line":3641,"column":4},"end":{"line":3641,"column":4}}]},"246":{"line":3646,"type":"if","locations":[{"start":{"line":3646,"column":4},"end":{"line":3646,"column":4}},{"start":{"line":3646,"column":4},"end":{"line":3646,"column":4}}]},"247":{"line":3651,"type":"if","locations":[{"start":{"line":3651,"column":4},"end":{"line":3651,"column":4}},{"start":{"line":3651,"column":4},"end":{"line":3651,"column":4}}]},"248":{"line":3676,"type":"if","locations":[{"start":{"line":3676,"column":4},"end":{"line":3676,"column":4}},{"start":{"line":3676,"column":4},"end":{"line":3676,"column":4}}]},"249":{"line":3681,"type":"if","locations":[{"start":{"line":3681,"column":11},"end":{"line":3681,"column":11}},{"start":{"line":3681,"column":11},"end":{"line":3681,"column":11}}]},"250":{"line":3685,"type":"if","locations":[{"start":{"line":3685,"column":11},"end":{"line":3685,"column":11}},{"start":{"line":3685,"column":11},"end":{"line":3685,"column":11}}]},"251":{"line":3693,"type":"if","locations":[{"start":{"line":3693,"column":11},"end":{"line":3693,"column":11}},{"start":{"line":3693,"column":11},"end":{"line":3693,"column":11}}]},"252":{"line":3700,"type":"if","locations":[{"start":{"line":3700,"column":11},"end":{"line":3700,"column":11}},{"start":{"line":3700,"column":11},"end":{"line":3700,"column":11}}]},"253":{"line":3707,"type":"if","locations":[{"start":{"line":3707,"column":11},"end":{"line":3707,"column":11}},{"start":{"line":3707,"column":11},"end":{"line":3707,"column":11}}]},"254":{"line":3729,"type":"if","locations":[{"start":{"line":3729,"column":4},"end":{"line":3729,"column":4}},{"start":{"line":3729,"column":4},"end":{"line":3729,"column":4}}]},"255":{"line":3775,"type":"if","locations":[{"start":{"line":3775,"column":4},"end":{"line":3775,"column":4}},{"start":{"line":3775,"column":4},"end":{"line":3775,"column":4}}]},"256":{"line":3784,"type":"if","locations":[{"start":{"line":3784,"column":4},"end":{"line":3784,"column":4}},{"start":{"line":3784,"column":4},"end":{"line":3784,"column":4}}]},"257":{"line":3789,"type":"if","locations":[{"start":{"line":3789,"column":4},"end":{"line":3789,"column":4}},{"start":{"line":3789,"column":4},"end":{"line":3789,"column":4}}]},"258":{"line":3793,"type":"if","locations":[{"start":{"line":3793,"column":4},"end":{"line":3793,"column":4}},{"start":{"line":3793,"column":4},"end":{"line":3793,"column":4}}]},"259":{"line":3798,"type":"if","locations":[{"start":{"line":3798,"column":4},"end":{"line":3798,"column":4}},{"start":{"line":3798,"column":4},"end":{"line":3798,"column":4}}]},"260":{"line":3803,"type":"if","locations":[{"start":{"line":3803,"column":4},"end":{"line":3803,"column":4}},{"start":{"line":3803,"column":4},"end":{"line":3803,"column":4}}]},"261":{"line":3808,"type":"if","locations":[{"start":{"line":3808,"column":4},"end":{"line":3808,"column":4}},{"start":{"line":3808,"column":4},"end":{"line":3808,"column":4}}]},"262":{"line":3902,"type":"if","locations":[{"start":{"line":3902,"column":4},"end":{"line":3902,"column":4}},{"start":{"line":3902,"column":4},"end":{"line":3902,"column":4}}]},"263":{"line":3903,"type":"if","locations":[{"start":{"line":3903,"column":8},"end":{"line":3903,"column":8}},{"start":{"line":3903,"column":8},"end":{"line":3903,"column":8}}]},"264":{"line":3905,"type":"if","locations":[{"start":{"line":3905,"column":15},"end":{"line":3905,"column":15}},{"start":{"line":3905,"column":15},"end":{"line":3905,"column":15}}]},"265":{"line":3974,"type":"if","locations":[{"start":{"line":3974,"column":4},"end":{"line":3974,"column":4}},{"start":{"line":3974,"column":4},"end":{"line":3974,"column":4}}]},"266":{"line":3979,"type":"if","locations":[{"start":{"line":3979,"column":4},"end":{"line":3979,"column":4}},{"start":{"line":3979,"column":4},"end":{"line":3979,"column":4}}]},"267":{"line":3984,"type":"if","locations":[{"start":{"line":3984,"column":4},"end":{"line":3984,"column":4}},{"start":{"line":3984,"column":4},"end":{"line":3984,"column":4}}]},"268":{"line":3989,"type":"if","locations":[{"start":{"line":3989,"column":4},"end":{"line":3989,"column":4}},{"start":{"line":3989,"column":4},"end":{"line":3989,"column":4}}]},"269":{"line":3994,"type":"if","locations":[{"start":{"line":3994,"column":4},"end":{"line":3994,"column":4}},{"start":{"line":3994,"column":4},"end":{"line":3994,"column":4}}]},"270":{"line":3999,"type":"if","locations":[{"start":{"line":3999,"column":4},"end":{"line":3999,"column":4}},{"start":{"line":3999,"column":4},"end":{"line":3999,"column":4}}]},"271":{"line":4004,"type":"if","locations":[{"start":{"line":4004,"column":4},"end":{"line":4004,"column":4}},{"start":{"line":4004,"column":4},"end":{"line":4004,"column":4}}]},"272":{"line":4009,"type":"if","locations":[{"start":{"line":4009,"column":4},"end":{"line":4009,"column":4}},{"start":{"line":4009,"column":4},"end":{"line":4009,"column":4}}]},"273":{"line":4014,"type":"if","locations":[{"start":{"line":4014,"column":4},"end":{"line":4014,"column":4}},{"start":{"line":4014,"column":4},"end":{"line":4014,"column":4}}]},"274":{"line":4019,"type":"if","locations":[{"start":{"line":4019,"column":4},"end":{"line":4019,"column":4}},{"start":{"line":4019,"column":4},"end":{"line":4019,"column":4}}]},"275":{"line":4024,"type":"if","locations":[{"start":{"line":4024,"column":4},"end":{"line":4024,"column":4}},{"start":{"line":4024,"column":4},"end":{"line":4024,"column":4}}]},"276":{"line":4029,"type":"if","locations":[{"start":{"line":4029,"column":4},"end":{"line":4029,"column":4}},{"start":{"line":4029,"column":4},"end":{"line":4029,"column":4}}]},"277":{"line":4034,"type":"if","locations":[{"start":{"line":4034,"column":4},"end":{"line":4034,"column":4}},{"start":{"line":4034,"column":4},"end":{"line":4034,"column":4}}]},"278":{"line":4039,"type":"if","locations":[{"start":{"line":4039,"column":4},"end":{"line":4039,"column":4}},{"start":{"line":4039,"column":4},"end":{"line":4039,"column":4}}]},"279":{"line":4044,"type":"if","locations":[{"start":{"line":4044,"column":4},"end":{"line":4044,"column":4}},{"start":{"line":4044,"column":4},"end":{"line":4044,"column":4}}]},"280":{"line":4049,"type":"if","locations":[{"start":{"line":4049,"column":4},"end":{"line":4049,"column":4}},{"start":{"line":4049,"column":4},"end":{"line":4049,"column":4}}]},"281":{"line":4054,"type":"if","locations":[{"start":{"line":4054,"column":4},"end":{"line":4054,"column":4}},{"start":{"line":4054,"column":4},"end":{"line":4054,"column":4}}]},"282":{"line":4154,"type":"if","locations":[{"start":{"line":4154,"column":4},"end":{"line":4154,"column":4}},{"start":{"line":4154,"column":4},"end":{"line":4154,"column":4}}]},"283":{"line":4154,"type":"binary-expr","locations":[{"start":{"line":4154,"column":8},"end":{"line":4154,"column":22}},{"start":{"line":4154,"column":26},"end":{"line":4154,"column":46}},{"start":{"line":4154,"column":50},"end":{"line":4154,"column":79}}]},"284":{"line":4161,"type":"if","locations":[{"start":{"line":4161,"column":4},"end":{"line":4161,"column":4}},{"start":{"line":4161,"column":4},"end":{"line":4161,"column":4}}]},"285":{"line":4200,"type":"if","locations":[{"start":{"line":4200,"column":16},"end":{"line":4200,"column":16}},{"start":{"line":4200,"column":16},"end":{"line":4200,"column":16}}]},"286":{"line":4246,"type":"if","locations":[{"start":{"line":4246,"column":8},"end":{"line":4246,"column":8}},{"start":{"line":4246,"column":8},"end":{"line":4246,"column":8}}]},"287":{"line":4250,"type":"if","locations":[{"start":{"line":4250,"column":12},"end":{"line":4250,"column":12}},{"start":{"line":4250,"column":12},"end":{"line":4250,"column":12}}]},"288":{"line":4251,"type":"binary-expr","locations":[{"start":{"line":4251,"column":16},"end":{"line":4251,"column":30}},{"start":{"line":4252,"column":16},"end":{"line":4252,"column":36}},{"start":{"line":4253,"column":16},"end":{"line":4253,"column":45}}]},"289":{"line":4258,"type":"if","locations":[{"start":{"line":4258,"column":16},"end":{"line":4258,"column":16}},{"start":{"line":4258,"column":16},"end":{"line":4258,"column":16}}]},"290":{"line":4262,"type":"if","locations":[{"start":{"line":4262,"column":16},"end":{"line":4262,"column":16}},{"start":{"line":4262,"column":16},"end":{"line":4262,"column":16}}]},"291":{"line":4266,"type":"if","locations":[{"start":{"line":4266,"column":16},"end":{"line":4266,"column":16}},{"start":{"line":4266,"column":16},"end":{"line":4266,"column":16}}]},"292":{"line":4270,"type":"if","locations":[{"start":{"line":4270,"column":16},"end":{"line":4270,"column":16}},{"start":{"line":4270,"column":16},"end":{"line":4270,"column":16}}]},"293":{"line":4274,"type":"if","locations":[{"start":{"line":4274,"column":16},"end":{"line":4274,"column":16}},{"start":{"line":4274,"column":16},"end":{"line":4274,"column":16}}]},"294":{"line":4278,"type":"if","locations":[{"start":{"line":4278,"column":16},"end":{"line":4278,"column":16}},{"start":{"line":4278,"column":16},"end":{"line":4278,"column":16}}]},"295":{"line":4282,"type":"if","locations":[{"start":{"line":4282,"column":16},"end":{"line":4282,"column":16}},{"start":{"line":4282,"column":16},"end":{"line":4282,"column":16}}]},"296":{"line":4286,"type":"if","locations":[{"start":{"line":4286,"column":16},"end":{"line":4286,"column":16}},{"start":{"line":4286,"column":16},"end":{"line":4286,"column":16}}]},"297":{"line":4290,"type":"if","locations":[{"start":{"line":4290,"column":16},"end":{"line":4290,"column":16}},{"start":{"line":4290,"column":16},"end":{"line":4290,"column":16}}]},"298":{"line":4294,"type":"if","locations":[{"start":{"line":4294,"column":16},"end":{"line":4294,"column":16}},{"start":{"line":4294,"column":16},"end":{"line":4294,"column":16}}]},"299":{"line":4298,"type":"if","locations":[{"start":{"line":4298,"column":16},"end":{"line":4298,"column":16}},{"start":{"line":4298,"column":16},"end":{"line":4298,"column":16}}]},"300":{"line":4302,"type":"if","locations":[{"start":{"line":4302,"column":16},"end":{"line":4302,"column":16}},{"start":{"line":4302,"column":16},"end":{"line":4302,"column":16}}]},"301":{"line":4381,"type":"if","locations":[{"start":{"line":4381,"column":4},"end":{"line":4381,"column":4}},{"start":{"line":4381,"column":4},"end":{"line":4381,"column":4}}]},"302":{"line":4386,"type":"if","locations":[{"start":{"line":4386,"column":4},"end":{"line":4386,"column":4}},{"start":{"line":4386,"column":4},"end":{"line":4386,"column":4}}]},"303":{"line":4395,"type":"if","locations":[{"start":{"line":4395,"column":4},"end":{"line":4395,"column":4}},{"start":{"line":4395,"column":4},"end":{"line":4395,"column":4}}]},"304":{"line":4404,"type":"if","locations":[{"start":{"line":4404,"column":4},"end":{"line":4404,"column":4}},{"start":{"line":4404,"column":4},"end":{"line":4404,"column":4}}]},"305":{"line":4434,"type":"binary-expr","locations":[{"start":{"line":4435,"column":9},"end":{"line":4435,"column":31}},{"start":{"line":4436,"column":9},"end":{"line":4436,"column":31}},{"start":{"line":4437,"column":9},"end":{"line":4437,"column":31}},{"start":{"line":4441,"column":9},"end":{"line":4441,"column":31}},{"start":{"line":4442,"column":9},"end":{"line":4442,"column":31}},{"start":{"line":4443,"column":9},"end":{"line":4443,"column":31}},{"start":{"line":4447,"column":9},"end":{"line":4447,"column":31}},{"start":{"line":4448,"column":9},"end":{"line":4448,"column":31}},{"start":{"line":4449,"column":9},"end":{"line":4449,"column":31}},{"start":{"line":4453,"column":9},"end":{"line":4453,"column":31}},{"start":{"line":4454,"column":9},"end":{"line":4454,"column":31}},{"start":{"line":4455,"column":9},"end":{"line":4455,"column":31}},{"start":{"line":4459,"column":9},"end":{"line":4459,"column":31}},{"start":{"line":4460,"column":9},"end":{"line":4460,"column":31}},{"start":{"line":4461,"column":9},"end":{"line":4461,"column":31}},{"start":{"line":4465,"column":9},"end":{"line":4465,"column":31}},{"start":{"line":4466,"column":9},"end":{"line":4466,"column":31}},{"start":{"line":4467,"column":9},"end":{"line":4467,"column":31}}]},"306":{"line":4477,"type":"if","locations":[{"start":{"line":4477,"column":4},"end":{"line":4477,"column":4}},{"start":{"line":4477,"column":4},"end":{"line":4477,"column":4}}]},"307":{"line":4481,"type":"if","locations":[{"start":{"line":4481,"column":4},"end":{"line":4481,"column":4}},{"start":{"line":4481,"column":4},"end":{"line":4481,"column":4}}]},"308":{"line":4494,"type":"binary-expr","locations":[{"start":{"line":4494,"column":16},"end":{"line":4494,"column":29}},{"start":{"line":4495,"column":5},"end":{"line":4495,"column":18}},{"start":{"line":4496,"column":6},"end":{"line":4496,"column":19}},{"start":{"line":4497,"column":5},"end":{"line":4497,"column":18}}]},"309":{"line":4506,"type":"if","locations":[{"start":{"line":4506,"column":4},"end":{"line":4506,"column":4}},{"start":{"line":4506,"column":4},"end":{"line":4506,"column":4}}]},"310":{"line":4510,"type":"if","locations":[{"start":{"line":4510,"column":4},"end":{"line":4510,"column":4}},{"start":{"line":4510,"column":4},"end":{"line":4510,"column":4}}]},"311":{"line":4514,"type":"if","locations":[{"start":{"line":4514,"column":4},"end":{"line":4514,"column":4}},{"start":{"line":4514,"column":4},"end":{"line":4514,"column":4}}]},"312":{"line":4521,"type":"if","locations":[{"start":{"line":4521,"column":4},"end":{"line":4521,"column":4}},{"start":{"line":4521,"column":4},"end":{"line":4521,"column":4}}]},"313":{"line":4527,"type":"if","locations":[{"start":{"line":4527,"column":4},"end":{"line":4527,"column":4}},{"start":{"line":4527,"column":4},"end":{"line":4527,"column":4}}]},"314":{"line":4593,"type":"if","locations":[{"start":{"line":4593,"column":4},"end":{"line":4593,"column":4}},{"start":{"line":4593,"column":4},"end":{"line":4593,"column":4}}]},"315":{"line":4597,"type":"if","locations":[{"start":{"line":4597,"column":11},"end":{"line":4597,"column":11}},{"start":{"line":4597,"column":11},"end":{"line":4597,"column":11}}]},"316":{"line":4622,"type":"if","locations":[{"start":{"line":4622,"column":4},"end":{"line":4622,"column":4}},{"start":{"line":4622,"column":4},"end":{"line":4622,"column":4}}]},"317":{"line":4642,"type":"if","locations":[{"start":{"line":4642,"column":4},"end":{"line":4642,"column":4}},{"start":{"line":4642,"column":4},"end":{"line":4642,"column":4}}]},"318":{"line":4646,"type":"if","locations":[{"start":{"line":4646,"column":4},"end":{"line":4646,"column":4}},{"start":{"line":4646,"column":4},"end":{"line":4646,"column":4}}]},"319":{"line":4650,"type":"if","locations":[{"start":{"line":4650,"column":4},"end":{"line":4650,"column":4}},{"start":{"line":4650,"column":4},"end":{"line":4650,"column":4}}]},"320":{"line":4654,"type":"if","locations":[{"start":{"line":4654,"column":4},"end":{"line":4654,"column":4}},{"start":{"line":4654,"column":4},"end":{"line":4654,"column":4}}]},"321":{"line":4676,"type":"if","locations":[{"start":{"line":4676,"column":4},"end":{"line":4676,"column":4}},{"start":{"line":4676,"column":4},"end":{"line":4676,"column":4}}]},"322":{"line":4680,"type":"if","locations":[{"start":{"line":4680,"column":11},"end":{"line":4680,"column":11}},{"start":{"line":4680,"column":11},"end":{"line":4680,"column":11}}]},"323":{"line":4703,"type":"if","locations":[{"start":{"line":4703,"column":4},"end":{"line":4703,"column":4}},{"start":{"line":4703,"column":4},"end":{"line":4703,"column":4}}]},"324":{"line":4718,"type":"if","locations":[{"start":{"line":4718,"column":4},"end":{"line":4718,"column":4}},{"start":{"line":4718,"column":4},"end":{"line":4718,"column":4}}]},"325":{"line":4724,"type":"if","locations":[{"start":{"line":4724,"column":4},"end":{"line":4724,"column":4}},{"start":{"line":4724,"column":4},"end":{"line":4724,"column":4}}]},"326":{"line":4740,"type":"if","locations":[{"start":{"line":4740,"column":4},"end":{"line":4740,"column":4}},{"start":{"line":4740,"column":4},"end":{"line":4740,"column":4}}]},"327":{"line":4749,"type":"if","locations":[{"start":{"line":4749,"column":4},"end":{"line":4749,"column":4}},{"start":{"line":4749,"column":4},"end":{"line":4749,"column":4}}]},"328":{"line":4794,"type":"if","locations":[{"start":{"line":4794,"column":8},"end":{"line":4794,"column":8}},{"start":{"line":4794,"column":8},"end":{"line":4794,"column":8}}]},"329":{"line":4839,"type":"if","locations":[{"start":{"line":4839,"column":8},"end":{"line":4839,"column":8}},{"start":{"line":4839,"column":8},"end":{"line":4839,"column":8}}]},"330":{"line":4892,"type":"if","locations":[{"start":{"line":4892,"column":8},"end":{"line":4892,"column":8}},{"start":{"line":4892,"column":8},"end":{"line":4892,"column":8}}]},"331":{"line":4895,"type":"if","locations":[{"start":{"line":4895,"column":8},"end":{"line":4895,"column":8}},{"start":{"line":4895,"column":8},"end":{"line":4895,"column":8}}]},"332":{"line":4898,"type":"if","locations":[{"start":{"line":4898,"column":8},"end":{"line":4898,"column":8}},{"start":{"line":4898,"column":8},"end":{"line":4898,"column":8}}]},"333":{"line":4902,"type":"if","locations":[{"start":{"line":4902,"column":8},"end":{"line":4902,"column":8}},{"start":{"line":4902,"column":8},"end":{"line":4902,"column":8}}]},"334":{"line":4905,"type":"if","locations":[{"start":{"line":4905,"column":8},"end":{"line":4905,"column":8}},{"start":{"line":4905,"column":8},"end":{"line":4905,"column":8}}]},"335":{"line":4908,"type":"if","locations":[{"start":{"line":4908,"column":8},"end":{"line":4908,"column":8}},{"start":{"line":4908,"column":8},"end":{"line":4908,"column":8}}]},"336":{"line":4997,"type":"if","locations":[{"start":{"line":4997,"column":4},"end":{"line":4997,"column":4}},{"start":{"line":4997,"column":4},"end":{"line":4997,"column":4}}]},"337":{"line":5002,"type":"if","locations":[{"start":{"line":5002,"column":4},"end":{"line":5002,"column":4}},{"start":{"line":5002,"column":4},"end":{"line":5002,"column":4}}]},"338":{"line":5011,"type":"if","locations":[{"start":{"line":5011,"column":4},"end":{"line":5011,"column":4}},{"start":{"line":5011,"column":4},"end":{"line":5011,"column":4}}]},"339":{"line":5020,"type":"if","locations":[{"start":{"line":5020,"column":4},"end":{"line":5020,"column":4}},{"start":{"line":5020,"column":4},"end":{"line":5020,"column":4}}]},"340":{"line":5083,"type":"if","locations":[{"start":{"line":5083,"column":4},"end":{"line":5083,"column":4}},{"start":{"line":5083,"column":4},"end":{"line":5083,"column":4}}]},"341":{"line":5101,"type":"if","locations":[{"start":{"line":5101,"column":4},"end":{"line":5101,"column":4}},{"start":{"line":5101,"column":4},"end":{"line":5101,"column":4}}]},"342":{"line":5136,"type":"if","locations":[{"start":{"line":5136,"column":4},"end":{"line":5136,"column":4}},{"start":{"line":5136,"column":4},"end":{"line":5136,"column":4}}]},"343":{"line":5140,"type":"if","locations":[{"start":{"line":5140,"column":4},"end":{"line":5140,"column":4}},{"start":{"line":5140,"column":4},"end":{"line":5140,"column":4}}]},"344":{"line":5144,"type":"if","locations":[{"start":{"line":5144,"column":4},"end":{"line":5144,"column":4}},{"start":{"line":5144,"column":4},"end":{"line":5144,"column":4}}]},"345":{"line":5148,"type":"if","locations":[{"start":{"line":5148,"column":4},"end":{"line":5148,"column":4}},{"start":{"line":5148,"column":4},"end":{"line":5148,"column":4}}]},"346":{"line":5243,"type":"if","locations":[{"start":{"line":5243,"column":4},"end":{"line":5243,"column":4}},{"start":{"line":5243,"column":4},"end":{"line":5243,"column":4}}]},"347":{"line":5247,"type":"if","locations":[{"start":{"line":5247,"column":4},"end":{"line":5247,"column":4}},{"start":{"line":5247,"column":4},"end":{"line":5247,"column":4}}]},"348":{"line":5251,"type":"if","locations":[{"start":{"line":5251,"column":4},"end":{"line":5251,"column":4}},{"start":{"line":5251,"column":4},"end":{"line":5251,"column":4}}]},"349":{"line":5255,"type":"if","locations":[{"start":{"line":5255,"column":4},"end":{"line":5255,"column":4}},{"start":{"line":5255,"column":4},"end":{"line":5255,"column":4}}]},"350":{"line":5342,"type":"if","locations":[{"start":{"line":5342,"column":4},"end":{"line":5342,"column":4}},{"start":{"line":5342,"column":4},"end":{"line":5342,"column":4}}]},"351":{"line":5342,"type":"binary-expr","locations":[{"start":{"line":5342,"column":7},"end":{"line":5342,"column":19}},{"start":{"line":5342,"column":23},"end":{"line":5342,"column":49}}]},"352":{"line":5346,"type":"if","locations":[{"start":{"line":5346,"column":4},"end":{"line":5346,"column":4}},{"start":{"line":5346,"column":4},"end":{"line":5346,"column":4}}]},"353":{"line":5346,"type":"binary-expr","locations":[{"start":{"line":5346,"column":7},"end":{"line":5346,"column":23}},{"start":{"line":5346,"column":27},"end":{"line":5346,"column":57}}]},"354":{"line":5350,"type":"if","locations":[{"start":{"line":5350,"column":4},"end":{"line":5350,"column":4}},{"start":{"line":5350,"column":4},"end":{"line":5350,"column":4}}]},"355":{"line":5350,"type":"binary-expr","locations":[{"start":{"line":5350,"column":7},"end":{"line":5350,"column":39}},{"start":{"line":5350,"column":43},"end":{"line":5350,"column":89}}]},"356":{"line":5355,"type":"binary-expr","locations":[{"start":{"line":5355,"column":29},"end":{"line":5355,"column":47}},{"start":{"line":5355,"column":51},"end":{"line":5355,"column":52}}]},"357":{"line":5356,"type":"binary-expr","locations":[{"start":{"line":5356,"column":27},"end":{"line":5356,"column":45}},{"start":{"line":5356,"column":49},"end":{"line":5356,"column":50}}]},"358":{"line":5358,"type":"cond-expr","locations":[{"start":{"line":5358,"column":53},"end":{"line":5358,"column":90}},{"start":{"line":5358,"column":94},"end":{"line":5358,"column":107}}]},"359":{"line":5366,"type":"if","locations":[{"start":{"line":5366,"column":8},"end":{"line":5366,"column":8}},{"start":{"line":5366,"column":8},"end":{"line":5366,"column":8}}]},"360":{"line":5366,"type":"binary-expr","locations":[{"start":{"line":5366,"column":11},"end":{"line":5366,"column":43}},{"start":{"line":5366,"column":47},"end":{"line":5366,"column":65}}]},"361":{"line":5391,"type":"cond-expr","locations":[{"start":{"line":5391,"column":57},"end":{"line":5391,"column":61}},{"start":{"line":5391,"column":64},"end":{"line":5391,"column":76}}]},"362":{"line":5399,"type":"if","locations":[{"start":{"line":5399,"column":12},"end":{"line":5399,"column":12}},{"start":{"line":5399,"column":12},"end":{"line":5399,"column":12}}]},"363":{"line":5480,"type":"if","locations":[{"start":{"line":5480,"column":8},"end":{"line":5480,"column":8}},{"start":{"line":5480,"column":8},"end":{"line":5480,"column":8}}]},"364":{"line":5486,"type":"if","locations":[{"start":{"line":5486,"column":8},"end":{"line":5486,"column":8}},{"start":{"line":5486,"column":8},"end":{"line":5486,"column":8}}]},"365":{"line":5492,"type":"if","locations":[{"start":{"line":5492,"column":8},"end":{"line":5492,"column":8}},{"start":{"line":5492,"column":8},"end":{"line":5492,"column":8}}]},"366":{"line":5541,"type":"if","locations":[{"start":{"line":5541,"column":4},"end":{"line":5541,"column":4}},{"start":{"line":5541,"column":4},"end":{"line":5541,"column":4}}]},"367":{"line":5541,"type":"binary-expr","locations":[{"start":{"line":5541,"column":7},"end":{"line":5541,"column":23}},{"start":{"line":5541,"column":27},"end":{"line":5541,"column":57}},{"start":{"line":5541,"column":61},"end":{"line":5541,"column":74}}]},"368":{"line":5545,"type":"if","locations":[{"start":{"line":5545,"column":4},"end":{"line":5545,"column":4}},{"start":{"line":5545,"column":4},"end":{"line":5545,"column":4}}]},"369":{"line":5545,"type":"binary-expr","locations":[{"start":{"line":5545,"column":7},"end":{"line":5545,"column":34}},{"start":{"line":5545,"column":38},"end":{"line":5545,"column":79}}]},"370":{"line":5609,"type":"if","locations":[{"start":{"line":5609,"column":12},"end":{"line":5609,"column":12}},{"start":{"line":5609,"column":12},"end":{"line":5609,"column":12}}]},"371":{"line":5634,"type":"cond-expr","locations":[{"start":{"line":5634,"column":43},"end":{"line":5634,"column":79}},{"start":{"line":5635,"column":43},"end":{"line":5635,"column":79}}]},"372":{"line":5644,"type":"if","locations":[{"start":{"line":5644,"column":12},"end":{"line":5644,"column":12}},{"start":{"line":5644,"column":12},"end":{"line":5644,"column":12}}]},"373":{"line":5681,"type":"if","locations":[{"start":{"line":5681,"column":12},"end":{"line":5681,"column":12}},{"start":{"line":5681,"column":12},"end":{"line":5681,"column":12}}]},"374":{"line":5719,"type":"if","locations":[{"start":{"line":5719,"column":16},"end":{"line":5719,"column":16}},{"start":{"line":5719,"column":16},"end":{"line":5719,"column":16}}]},"375":{"line":5725,"type":"if","locations":[{"start":{"line":5725,"column":16},"end":{"line":5725,"column":16}},{"start":{"line":5725,"column":16},"end":{"line":5725,"column":16}}]},"376":{"line":5729,"type":"if","locations":[{"start":{"line":5729,"column":16},"end":{"line":5729,"column":16}},{"start":{"line":5729,"column":16},"end":{"line":5729,"column":16}}]},"377":{"line":5771,"type":"if","locations":[{"start":{"line":5771,"column":12},"end":{"line":5771,"column":12}},{"start":{"line":5771,"column":12},"end":{"line":5771,"column":12}}]},"378":{"line":5810,"type":"if","locations":[{"start":{"line":5810,"column":0},"end":{"line":5810,"column":0}},{"start":{"line":5810,"column":0},"end":{"line":5810,"column":0}}]}},"l":{"1":1,"2":1,"5":1,"6":1,"9":1,"10":1,"11":0,"12":0,"15":1,"23":1,"27":1,"28":1,"44":1,"56":1,"57":1,"58":1,"60":1,"61":0,"63":1,"65":1,"66":1,"68":1,"70":1,"71":1,"73":1,"75":1,"76":1,"78":1,"80":1,"81":1,"83":1,"85":1,"86":1,"88":1,"90":1,"91":1,"93":1,"104":1,"111":1,"113":1,"114":0,"116":1,"118":1,"119":0,"121":1,"123":1,"124":0,"126":1,"128":1,"130":1,"131":1,"138":1,"140":1,"141":0,"142":0,"145":1,"147":1,"149":1,"150":1,"151":0,"152":0,"153":0,"154":0,"156":0,"157":0,"160":1,"162":1,"169":1,"170":1,"171":1,"180":1,"181":2,"182":2,"183":2,"184":2,"192":1,"196":2,"197":2,"204":1,"205":0,"211":1,"212":1,"213":0,"214":0,"222":1,"223":0,"230":1,"231":0,"238":1,"239":1,"240":1,"241":1,"245":0,"247":0,"248":0,"251":0,"260":1,"265":0,"267":0,"269":0,"271":0,"272":0,"273":0,"275":0,"276":0,"277":0,"278":0,"279":0,"280":0,"282":0,"283":0,"284":0,"285":0,"286":0,"287":0,"289":0,"291":0,"292":0,"293":0,"294":0,"295":0,"297":0,"298":0,"300":0,"301":0,"302":0,"310":1,"311":0,"312":0,"313":0,"314":0,"321":1,"322":0,"323":0,"324":0,"332":1,"333":0,"334":0,"335":0,"342":1,"343":0,"350":1,"351":0,"352":0,"353":0,"355":0,"357":0,"358":0,"360":0,"362":0,"363":0,"364":0,"366":0,"368":0,"369":0,"370":0,"373":0,"375":0,"376":0,"377":0,"379":0,"381":0,"382":0,"383":0,"386":0,"388":0,"390":0,"392":0,"402":1,"403":0,"404":0,"411":1,"412":0,"413":0,"414":0,"416":0,"417":0,"425":1,"426":0,"429":0,"430":0,"433":0,"434":0,"437":0,"438":0,"441":0,"442":0,"445":0,"446":0,"449":0,"450":0,"458":1,"459":0,"463":0,"464":0,"468":0,"469":0,"473":0,"474":0,"478":0,"479":0,"482":0,"483":0,"486":0,"487":0,"490":1,"493":0,"494":0,"495":0,"498":1,"501":0,"504":1,"507":0,"510":1,"514":0,"515":0,"518":1,"521":0,"524":1,"527":0,"529":0,"530":0,"532":0,"534":0,"536":0,"537":0,"539":0,"540":0,"541":0,"542":0,"544":0,"545":0,"547":0,"548":0,"550":0,"552":0,"553":0,"555":0,"557":0,"558":0,"559":0,"560":0,"561":0,"564":0,"565":0,"566":0,"568":0,"573":0,"574":0,"584":1,"589":0,"591":0,"602":1,"606":1,"607":1,"614":1,"615":0,"621":1,"622":0,"623":0,"624":0,"632":1,"641":1,"648":0,"649":0,"651":0,"653":0,"654":0,"656":0,"658":0,"659":0,"661":0,"663":0,"664":0,"666":0,"668":0,"669":0,"671":0,"681":1,"686":0,"687":0,"689":0,"691":0,"692":0,"693":0,"695":0,"696":0,"697":0,"698":0,"699":0,"700":0,"701":0,"702":0,"703":0,"704":0,"705":0,"710":0,"711":0,"715":0,"716":0,"718":0,"736":1,"741":0,"743":0,"745":0,"746":0,"747":0,"749":0,"750":0,"752":0,"753":0,"755":0,"756":0,"757":0,"760":0,"761":0,"764":0,"765":0,"766":0,"767":0,"768":0,"774":0,"785":0,"796":1,"803":0,"805":0,"807":0,"809":0,"810":0,"812":0,"814":0,"816":0,"818":0,"819":0,"822":0,"823":0,"826":0,"827":0,"830":0,"851":1,"868":0,"869":0,"870":0,"871":0,"872":0,"874":0,"875":0,"877":0,"879":0,"880":0,"882":0,"884":0,"885":0,"887":0,"889":0,"890":0,"892":0,"894":0,"895":0,"897":0,"899":0,"900":0,"902":0,"904":0,"905":0,"907":0,"909":0,"910":0,"912":0,"914":0,"915":0,"917":0,"919":0,"920":0,"922":0,"985":1,"1044":0,"1045":0,"1046":0,"1047":0,"1049":0,"1051":0,"1052":0,"1054":0,"1056":0,"1057":0,"1059":0,"1061":0,"1062":0,"1064":0,"1066":0,"1067":0,"1082":0,"1084":0,"1085":0,"1087":0,"1089":0,"1090":0,"1092":0,"1094":0,"1095":0,"1097":0,"1099":0,"1100":0,"1102":0,"1104":0,"1105":0,"1107":0,"1109":0,"1110":0,"1112":0,"1114":0,"1115":0,"1117":0,"1119":0,"1120":0,"1122":0,"1124":0,"1125":0,"1127":0,"1129":0,"1130":0,"1132":0,"1134":0,"1135":0,"1137":0,"1139":0,"1140":0,"1142":0,"1144":0,"1145":0,"1147":0,"1149":0,"1150":0,"1152":0,"1154":0,"1155":0,"1157":0,"1159":0,"1160":0,"1162":0,"1164":0,"1165":0,"1167":0,"1169":0,"1170":0,"1172":0,"1174":0,"1175":0,"1177":0,"1179":0,"1180":0,"1182":0,"1184":0,"1185":0,"1187":0,"1189":0,"1190":0,"1192":0,"1194":0,"1195":0,"1197":0,"1199":0,"1200":0,"1202":0,"1204":0,"1205":0,"1207":0,"1209":0,"1210":0,"1212":0,"1214":0,"1215":0,"1217":0,"1219":0,"1220":0,"1222":0,"1224":0,"1225":0,"1227":0,"1229":0,"1230":0,"1232":0,"1234":0,"1235":0,"1237":0,"1239":0,"1240":0,"1242":0,"1244":0,"1245":0,"1247":0,"1249":0,"1250":0,"1252":0,"1254":0,"1255":0,"1257":0,"1259":0,"1260":0,"1262":0,"1264":0,"1265":0,"1267":0,"1269":0,"1270":0,"1272":0,"1274":0,"1275":0,"1277":0,"1279":0,"1280":0,"1282":0,"1284":0,"1285":0,"1287":0,"1289":0,"1290":0,"1292":0,"1294":0,"1295":0,"1297":0,"1299":0,"1300":0,"1302":0,"1304":0,"1305":0,"1307":0,"1309":0,"1310":0,"1312":0,"1314":0,"1315":0,"1317":0,"1319":0,"1320":0,"1322":0,"1324":0,"1325":0,"1327":0,"1329":0,"1330":0,"1332":0,"1340":1,"1341":1,"1342":1,"1348":1,"1349":1,"1350":1,"1356":1,"1357":1,"1358":1,"1359":1,"1360":1,"1366":1,"1367":1,"1368":1,"1369":1,"1370":1,"1371":1,"1372":1,"1373":1,"1374":1,"1375":1,"1376":1,"1382":1,"1383":1,"1384":1,"1385":1,"1386":1,"1392":1,"1393":1,"1394":1,"1395":1,"1396":1,"1397":1,"1398":1,"1399":1,"1405":1,"1406":1,"1407":1,"1413":1,"1414":1,"1420":1,"1421":1,"1422":1,"1423":1,"1424":1,"1425":1,"1426":1,"1427":1,"1428":1,"1429":1,"1430":1,"1439":1,"1446":0,"1448":0,"1450":0,"1452":0,"1454":0,"1505":0,"1518":0,"1520":0,"1576":0,"1590":0,"1593":0,"1594":0,"1602":0,"1604":0,"1608":0,"1609":0,"1613":0,"1616":0,"1625":1,"1630":0,"1632":0,"1633":0,"1636":0,"1637":0,"1640":0,"1641":0,"1648":1,"1649":0,"1655":1,"1662":0,"1664":0,"1665":0,"1668":0,"1669":0,"1672":0,"1673":0,"1676":0,"1677":0,"1681":1,"1682":0,"1683":0,"1684":0,"1685":0,"1688":1,"1689":0,"1690":0,"1696":0,"1702":0,"1705":1,"1706":0,"1707":0,"1708":0,"1709":0,"1712":1,"1713":0,"1714":0,"1715":0,"1718":1,"1719":0,"1720":0,"1721":0,"1724":1,"1725":0,"1726":0,"1727":0,"1730":1,"1731":0,"1732":0,"1738":0,"1739":0,"1747":1,"1748":0,"1756":1,"1758":0,"1760":0,"1762":0,"1763":0,"1766":0,"1768":0,"1769":0,"1770":0,"1773":0,"1775":0,"1776":0,"1777":0,"1779":0,"1780":0,"1781":0,"1783":0,"1784":0,"1785":0,"1787":0,"1852":1,"1873":0,"1874":0,"1875":0,"1876":0,"1877":0,"1878":0,"1879":0,"1881":0,"1882":0,"1884":0,"1886":0,"1887":0,"1889":0,"1891":0,"1892":0,"1894":0,"1896":0,"1897":0,"1899":0,"1901":0,"1902":0,"1904":0,"1906":0,"1907":0,"1909":0,"1911":0,"1912":0,"1914":0,"1916":0,"1917":0,"1919":0,"1921":0,"1922":0,"1924":0,"1926":0,"1927":0,"1929":0,"1931":0,"1933":0,"1935":0,"1943":1,"1944":1,"1955":1,"1957":0,"1959":0,"1960":0,"1963":0,"1965":0,"1967":0,"1969":0,"1971":0,"1973":0,"1975":0,"1977":0,"1979":0,"1980":0,"1981":0,"1983":0,"1984":0,"1985":0,"1987":0,"1988":0,"1989":0,"1990":0,"1992":0,"1993":0,"1994":0,"1996":0,"1997":0,"1998":0,"2000":0,"2006":0,"2007":0,"2008":0,"2015":0,"2016":0,"2029":0,"2030":0,"2040":0,"2042":0,"2044":0,"2046":0,"2047":0,"2048":0,"2049":0,"2053":0,"2055":0,"2057":0,"2058":0,"2061":0,"2062":0,"2065":0,"2067":0,"2070":1,"2072":0,"2073":0,"2074":0,"2075":0,"2077":0,"2078":0,"2079":0,"2082":0,"2088":1,"2090":0,"2092":0,"2093":0,"2100":0,"2102":0,"2104":0,"2106":0,"2107":0,"2108":0,"2110":0,"2127":0,"2128":0,"2136":0,"2137":0,"2138":0,"2139":0,"2141":0,"2145":0,"2173":1,"2181":1,"2183":0,"2184":0,"2185":0,"2189":0,"2199":1,"2201":0,"2202":0,"2211":0,"2221":0,"2222":0,"2225":0,"2232":0,"2235":0,"2250":0,"2252":0,"2254":0,"2260":0,"2268":0,"2269":0,"2270":0,"2272":0,"2273":0,"2274":0,"2277":0,"2279":0,"2294":0,"2295":0,"2296":0,"2297":0,"2306":0,"2307":0,"2308":0,"2309":0,"2310":0,"2311":0,"2312":0,"2315":0,"2316":0,"2320":0,"2331":1,"2333":0,"2334":0,"2337":0,"2339":0,"2341":0,"2342":0,"2349":0,"2351":0,"2353":0,"2355":0,"2356":0,"2364":0,"2375":1,"2381":0,"2382":0,"2383":0,"2385":0,"2386":0,"2388":0,"2396":1,"2397":1,"2407":1,"2414":0,"2415":0,"2416":0,"2417":0,"2418":0,"2425":1,"2426":0,"2441":1,"2446":0,"2447":0,"2449":0,"2451":0,"2453":0,"2454":0,"2456":0,"2458":0,"2465":1,"2466":0,"2475":1,"2478":0,"2479":0,"2487":1,"2488":0,"2490":1,"2520":0,"2521":0,"2523":0,"2525":0,"2526":0,"2528":0,"2530":0,"2531":0,"2533":0,"2535":0,"2536":0,"2538":0,"2540":0,"2541":0,"2543":0,"2545":0,"2546":0,"2548":0,"2550":0,"2551":0,"2553":0,"2555":0,"2556":0,"2558":0,"2560":0,"2561":0,"2563":0,"2565":0,"2566":0,"2568":0,"2570":0,"2571":0,"2573":0,"2575":0,"2576":0,"2578":0,"2580":0,"2581":0,"2583":0,"2585":0,"2586":0,"2588":0,"2590":0,"2591":0,"2593":0,"2595":0,"2596":0,"2598":0,"2600":0,"2601":0,"2603":0,"2605":0,"2606":0,"2608":0,"2610":0,"2611":0,"2613":0,"2615":0,"2616":0,"2618":0,"2620":0,"2621":0,"2623":0,"2625":0,"2626":0,"2628":0,"2630":0,"2631":0,"2633":0,"2635":0,"2636":0,"2638":0,"2640":0,"2641":0,"2643":0,"2645":0,"2646":0,"2648":0,"2650":0,"2651":0,"2653":0,"2655":0,"2656":0,"2658":0,"2660":0,"2663":1,"2665":0,"2704":1,"2709":0,"2710":0,"2711":0,"2713":0,"2715":0,"2716":0,"2718":0,"2720":0,"2727":1,"2728":0,"2735":1,"2736":0,"2745":1,"2747":0,"2749":0,"2791":1,"2809":0,"2810":0,"2811":0,"2812":0,"2813":0,"2814":0,"2815":0,"2816":0,"2817":0,"2818":0,"2819":0,"2820":0,"2821":0,"2822":0,"2823":0,"2824":0,"2826":0,"2828":0,"2830":0,"2837":1,"2839":0,"2874":0,"2876":0,"2886":1,"2891":0,"2892":0,"2895":0,"2896":0,"2899":0,"2925":1,"2931":0,"2932":0,"2933":0,"2934":0,"2935":0,"2954":1,"2968":1,"2969":1,"2970":1,"2971":1,"2972":1,"2973":0,"2976":1,"2977":1,"2979":1,"2981":1,"2982":1,"2984":1,"2986":1,"2987":1,"2989":1,"2991":1,"2992":1,"2994":1,"2996":1,"2997":1,"2999":1,"3001":1,"3002":1,"3004":1,"3006":1,"3007":1,"3009":1,"3011":1,"3012":1,"3014":1,"3016":1,"3017":1,"3019":1,"3031":1,"3043":1,"3044":1,"3045":1,"3048":0,"3049":0,"3054":0,"3055":0,"3056":0,"3058":0,"3060":0,"3061":0,"3064":0,"3066":0,"3068":0,"3070":0,"3072":0,"3074":0,"3076":0,"3077":0,"3083":0,"3090":0,"3092":0,"3094":0,"3096":0,"3098":0,"3104":0,"3106":0,"3114":0,"3116":0,"3118":0,"3120":0,"3123":0,"3128":0,"3131":0,"3145":0,"3148":0,"3152":0,"3154":0,"3156":0,"3158":0,"3202":0,"3205":0,"3236":0,"3248":0,"3260":1,"3269":0,"3271":0,"3273":0,"3275":0,"3277":0,"3279":0,"3281":0,"3283":0,"3285":0,"3287":0,"3289":0,"3294":0,"3295":0,"3307":0,"3309":0,"3326":0,"3344":0,"3350":0,"3368":0,"3371":0,"3376":0,"3378":0,"3380":0,"3382":0,"3383":0,"3384":0,"3405":0,"3406":0,"3407":0,"3410":0,"3415":0,"3416":0,"3426":0,"3428":0,"3430":0,"3435":0,"3437":0,"3443":0,"3445":0,"3446":0,"3447":0,"3449":0,"3450":0,"3451":0,"3453":0,"3454":0,"3455":0,"3457":0,"3458":0,"3459":0,"3460":0,"3462":0,"3466":0,"3469":0,"3472":0,"3474":0,"3475":0,"3477":0,"3479":0,"3481":0,"3483":0,"3485":0,"3486":0,"3489":0,"3490":0,"3493":0,"3494":0,"3495":0,"3496":0,"3499":0,"3500":0,"3501":0,"3502":0,"3503":0,"3504":0,"3507":0,"3508":0,"3509":0,"3511":0,"3512":0,"3513":0,"3515":0,"3516":0,"3518":0,"3519":0,"3523":0,"3525":0,"3527":0,"3528":0,"3529":0,"3531":0,"3532":0,"3533":0,"3535":0,"3536":0,"3537":0,"3539":0,"3540":0,"3541":0,"3542":0,"3544":0,"3545":0,"3548":0,"3549":0,"3552":0,"3563":0,"3584":1,"3598":0,"3600":0,"3602":0,"3604":0,"3606":0,"3607":0,"3609":0,"3611":0,"3612":0,"3614":0,"3616":0,"3617":0,"3619":0,"3621":0,"3622":0,"3624":0,"3626":0,"3627":0,"3629":0,"3631":0,"3632":0,"3634":0,"3636":0,"3637":0,"3639":0,"3641":0,"3642":0,"3644":0,"3646":0,"3647":0,"3649":0,"3651":0,"3652":0,"3654":0,"3662":1,"3663":1,"3664":1,"3665":1,"3666":1,"3667":1,"3672":1,"3674":0,"3676":0,"3677":0,"3681":0,"3682":0,"3685":0,"3686":0,"3693":0,"3694":0,"3700":0,"3701":0,"3707":0,"3708":0,"3709":0,"3711":0,"3712":0,"3715":0,"3717":0,"3724":1,"3727":0,"3729":0,"3730":0,"3737":0,"3738":0,"3739":0,"3740":0,"3741":0,"3757":1,"3767":0,"3769":0,"3775":0,"3776":0,"3778":0,"3784":0,"3785":0,"3787":0,"3789":0,"3790":0,"3793":0,"3794":0,"3796":0,"3798":0,"3799":0,"3801":0,"3803":0,"3804":0,"3806":0,"3808":0,"3809":0,"3811":0,"3815":1,"3818":0,"3820":0,"3821":0,"3823":0,"3826":1,"3829":0,"3830":0,"3831":0,"3832":0,"3833":0,"3834":0,"3836":0,"3839":0,"3840":0,"3841":0,"3842":0,"3843":0,"3844":0,"3847":0,"3848":0,"3852":0,"3853":0,"3854":0,"3859":0,"3866":1,"3870":0,"3872":0,"3874":0,"3876":0,"3878":0,"3880":0,"3882":0,"3894":1,"3901":0,"3902":0,"3903":0,"3904":0,"3905":0,"3906":0,"3908":0,"3911":0,"3912":0,"3913":0,"3914":0,"3921":1,"3922":1,"3948":1,"3970":0,"3971":0,"3972":0,"3974":0,"3975":0,"3977":0,"3979":0,"3980":0,"3982":0,"3984":0,"3985":0,"3987":0,"3989":0,"3990":0,"3992":0,"3994":0,"3995":0,"3997":0,"3999":0,"4000":0,"4002":0,"4004":0,"4005":0,"4007":0,"4009":0,"4010":0,"4012":0,"4014":0,"4015":0,"4017":0,"4019":0,"4020":0,"4022":0,"4024":0,"4025":0,"4027":0,"4029":0,"4030":0,"4032":0,"4034":0,"4035":0,"4037":0,"4039":0,"4040":0,"4042":0,"4044":0,"4045":0,"4047":0,"4049":0,"4050":0,"4052":0,"4054":0,"4055":0,"4057":0,"4064":1,"4065":1,"4066":1,"4067":1,"4068":1,"4069":1,"4075":1,"4076":1,"4077":1,"4078":1,"4079":1,"4080":1,"4081":1,"4082":1,"4088":1,"4089":1,"4090":1,"4096":1,"4097":1,"4098":1,"4099":1,"4100":1,"4101":1,"4107":1,"4108":1,"4109":1,"4110":1,"4111":1,"4112":1,"4113":1,"4114":1,"4120":1,"4121":1,"4122":1,"4123":1,"4124":1,"4125":1,"4126":1,"4127":1,"4139":1,"4148":0,"4150":0,"4152":0,"4154":0,"4158":0,"4161":0,"4163":0,"4165":0,"4171":0,"4172":0,"4173":0,"4174":0,"4175":0,"4179":0,"4180":0,"4181":0,"4182":0,"4183":0,"4184":0,"4188":0,"4189":0,"4190":0,"4191":0,"4192":0,"4193":0,"4194":0,"4200":0,"4201":0,"4208":0,"4209":0,"4214":0,"4217":0,"4231":1,"4240":0,"4242":0,"4244":0,"4246":0,"4248":0,"4250":0,"4256":0,"4258":0,"4259":0,"4262":0,"4263":0,"4266":0,"4267":0,"4270":0,"4271":0,"4274":0,"4275":0,"4278":0,"4279":0,"4282":0,"4283":0,"4286":0,"4287":0,"4290":0,"4291":0,"4294":0,"4295":0,"4298":0,"4299":0,"4302":0,"4303":0,"4306":0,"4320":0,"4323":1,"4330":1,"4331":1,"4339":1,"4343":0,"4344":0,"4361":1,"4374":0,"4375":0,"4376":0,"4377":0,"4378":0,"4379":0,"4380":0,"4381":0,"4382":0,"4384":0,"4386":0,"4387":0,"4393":0,"4395":0,"4396":0,"4402":0,"4404":0,"4405":0,"4408":0,"4415":1,"4416":0,"4432":1,"4433":0,"4472":1,"4474":0,"4475":0,"4477":0,"4478":0,"4481":0,"4482":0,"4486":1,"4487":0,"4493":1,"4494":0,"4500":1,"4502":7,"4503":7,"4504":7,"4506":7,"4507":2,"4510":7,"4511":3,"4514":7,"4515":2,"4519":1,"4521":0,"4522":0,"4523":0,"4524":0,"4527":0,"4528":0,"4531":0,"4534":1,"4535":0,"4542":1,"4543":0,"4544":0,"4545":0,"4546":0,"4549":1,"4551":0,"4553":0,"4555":0,"4557":0,"4560":1,"4561":0,"4562":0,"4563":0,"4566":1,"4568":0,"4570":0,"4573":1,"4574":0,"4575":0,"4576":0,"4577":0,"4580":1,"4581":0,"4584":1,"4585":0,"4592":1,"4593":0,"4594":0,"4595":0,"4596":0,"4597":0,"4598":0,"4599":0,"4600":0,"4601":0,"4602":0,"4603":0,"4605":0,"4606":0,"4608":0,"4612":1,"4613":0,"4616":1,"4618":0,"4620":0,"4622":0,"4623":0,"4626":0,"4628":0,"4629":0,"4630":0,"4632":0,"4635":1,"4637":2,"4638":2,"4639":2,"4640":2,"4642":2,"4643":0,"4646":2,"4647":0,"4650":2,"4651":0,"4654":2,"4655":0,"4659":1,"4660":0,"4661":0,"4662":0,"4663":0,"4666":1,"4667":0,"4675":1,"4676":0,"4677":0,"4678":0,"4679":0,"4680":0,"4681":0,"4682":0,"4683":0,"4684":0,"4685":0,"4686":0,"4687":0,"4688":0,"4690":0,"4691":0,"4696":1,"4699":0,"4701":0,"4703":0,"4704":0,"4707":0,"4709":0,"4710":0,"4711":0,"4713":0,"4716":1,"4718":0,"4719":0,"4720":0,"4721":0,"4724":0,"4725":0,"4726":0,"4727":0,"4728":0,"4731":0,"4734":1,"4735":0,"4738":1,"4740":0,"4741":0,"4749":0,"4750":0,"4751":0,"4754":0,"4756":0,"4759":1,"4761":0,"4763":0,"4764":0,"4767":0,"4770":1,"4774":0,"4776":0,"4778":0,"4780":0,"4782":0,"4784":0,"4786":0,"4788":0,"4789":0,"4792":0,"4794":0,"4796":0,"4797":0,"4801":0,"4805":0,"4807":0,"4808":0,"4815":1,"4819":0,"4821":0,"4823":0,"4825":0,"4827":0,"4829":0,"4831":0,"4833":0,"4834":0,"4837":0,"4839":0,"4840":0,"4841":0,"4845":0,"4849":0,"4851":0,"4852":0,"4860":1,"4862":0,"4864":0,"4866":0,"4868":0,"4869":0,"4870":0,"4872":0,"4874":0,"4875":0,"4876":0,"4877":0,"4881":1,"4883":0,"4884":0,"4885":0,"4887":0,"4888":0,"4889":0,"4891":0,"4892":0,"4893":0,"4895":0,"4896":0,"4898":0,"4899":0,"4902":0,"4903":0,"4905":0,"4906":0,"4908":0,"4909":0,"4913":0,"4920":1,"4921":0,"4922":0,"4923":0,"4925":0,"4926":0,"4927":0,"4928":0,"4931":0,"4938":1,"4940":0,"4941":0,"4942":0,"4943":0,"4946":0,"4950":1,"4952":0,"4954":0,"4955":0,"4965":1,"4969":0,"4970":0,"4983":1,"4993":0,"4995":0,"4997":0,"4998":0,"5000":0,"5002":0,"5003":0,"5009":0,"5011":0,"5012":0,"5018":0,"5020":0,"5021":0,"5023":0,"5025":0,"5027":0,"5029":0,"5036":1,"5038":0,"5040":0,"5042":0,"5044":0,"5045":0,"5046":0,"5048":0,"5050":0,"5058":1,"5061":0,"5069":1,"5072":0,"5075":1,"5082":0,"5083":0,"5085":0,"5086":0,"5087":0,"5090":0,"5092":0,"5094":0,"5097":1,"5101":0,"5103":0,"5110":0,"5125":1,"5133":0,"5134":0,"5136":0,"5137":0,"5140":0,"5141":0,"5144":0,"5145":0,"5148":0,"5149":0,"5152":0,"5154":0,"5163":0,"5164":0,"5173":0,"5174":0,"5175":0,"5176":0,"5178":0,"5188":0,"5195":0,"5196":0,"5198":0,"5212":0,"5215":0,"5216":0,"5217":0,"5219":0,"5232":1,"5240":0,"5241":0,"5243":0,"5244":0,"5247":0,"5248":0,"5251":0,"5252":0,"5255":0,"5256":0,"5260":0,"5261":0,"5270":0,"5271":0,"5272":0,"5275":0,"5276":0,"5278":0,"5279":0,"5280":0,"5282":0,"5285":0,"5291":0,"5292":0,"5298":0,"5309":0,"5312":0,"5313":0,"5314":0,"5316":0,"5330":1,"5339":0,"5340":0,"5342":0,"5343":0,"5346":0,"5347":0,"5350":0,"5351":0,"5354":0,"5355":0,"5356":0,"5357":0,"5358":0,"5360":0,"5362":0,"5363":0,"5365":0,"5366":0,"5368":0,"5370":0,"5372":0,"5378":0,"5379":0,"5380":0,"5381":0,"5382":0,"5384":0,"5388":0,"5390":0,"5395":0,"5396":0,"5397":0,"5399":0,"5400":0,"5404":0,"5405":0,"5406":0,"5407":0,"5409":0,"5410":0,"5411":0,"5413":0,"5414":0,"5415":0,"5417":0,"5427":1,"5436":0,"5437":0,"5439":0,"5441":0,"5449":0,"5450":0,"5451":0,"5452":0,"5453":0,"5455":0,"5466":0,"5467":0,"5468":0,"5470":0,"5471":0,"5472":0,"5474":0,"5476":0,"5477":0,"5478":0,"5480":0,"5481":0,"5482":0,"5483":0,"5486":0,"5487":0,"5488":0,"5489":0,"5492":0,"5493":0,"5494":0,"5495":0,"5498":0,"5500":0,"5503":0,"5504":0,"5506":0,"5507":0,"5510":0,"5511":0,"5514":0,"5528":1,"5537":0,"5539":0,"5541":0,"5542":0,"5545":0,"5546":0,"5549":0,"5551":0,"5553":0,"5554":0,"5556":0,"5557":0,"5558":0,"5559":0,"5561":0,"5562":0,"5564":0,"5565":0,"5567":0,"5569":0,"5570":0,"5571":0,"5573":0,"5591":0,"5592":0,"5594":0,"5600":0,"5606":0,"5609":0,"5610":0,"5611":0,"5620":0,"5638":0,"5640":0,"5641":0,"5644":0,"5645":0,"5677":0,"5678":0,"5679":0,"5681":0,"5682":0,"5685":0,"5690":0,"5693":0,"5699":0,"5705":0,"5711":0,"5717":0,"5719":0,"5720":0,"5723":0,"5725":0,"5726":0,"5729":0,"5730":0,"5732":0,"5738":0,"5744":0,"5750":0,"5756":0,"5766":0,"5767":0,"5769":0,"5771":0,"5772":0,"5775":0,"5776":0,"5777":0,"5780":0,"5781":0,"5783":0,"5794":0,"5795":0,"5798":0,"5799":0,"5800":0,"5801":0,"5802":0,"5804":0,"5810":1,"5811":1}}} diff --git a/build/coverage/lcov-report/base.css b/build/coverage/lcov-report/base.css deleted file mode 100644 index 29737bc..0000000 --- a/build/coverage/lcov-report/base.css +++ /dev/null @@ -1,213 +0,0 @@ -body, html { - margin:0; padding: 0; - height: 100%; -} -body { - font-family: Helvetica Neue, Helvetica, Arial; - font-size: 14px; - color:#333; -} -.small { font-size: 12px; } -*, *:after, *:before { - -webkit-box-sizing:border-box; - -moz-box-sizing:border-box; - box-sizing:border-box; - } -h1 { font-size: 20px; margin: 0;} -h2 { font-size: 14px; } -pre { - font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; - margin: 0; - padding: 0; - -moz-tab-size: 2; - -o-tab-size: 2; - tab-size: 2; -} -a { color:#0074D9; text-decoration:none; } -a:hover { text-decoration:underline; } -.strong { font-weight: bold; } -.space-top1 { padding: 10px 0 0 0; } -.pad2y { padding: 20px 0; } -.pad1y { padding: 10px 0; } -.pad2x { padding: 0 20px; } -.pad2 { padding: 20px; } -.pad1 { padding: 10px; } -.space-left2 { padding-left:55px; } -.space-right2 { padding-right:20px; } -.center { text-align:center; } -.clearfix { display:block; } -.clearfix:after { - content:''; - display:block; - height:0; - clear:both; - visibility:hidden; - } -.fl { float: left; } -@media only screen and (max-width:640px) { - .col3 { width:100%; max-width:100%; } - .hide-mobile { display:none!important; } -} - -.quiet { - color: #7f7f7f; - color: rgba(0,0,0,0.5); -} -.quiet a { opacity: 0.7; } - -.fraction { - font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; - font-size: 10px; - color: #555; - background: #E8E8E8; - padding: 4px 5px; - border-radius: 3px; - vertical-align: middle; -} - -div.path a:link, div.path a:visited { color: #333; } -table.coverage { - border-collapse: collapse; - margin: 10px 0 0 0; - padding: 0; -} - -table.coverage td { - margin: 0; - padding: 0; - vertical-align: top; -} -table.coverage td.line-count { - text-align: right; - padding: 0 5px 0 20px; -} -table.coverage td.line-coverage { - text-align: right; - padding-right: 10px; - min-width:20px; -} - -table.coverage td span.cline-any { - display: inline-block; - padding: 0 5px; - width: 100%; -} -.missing-if-branch { - display: inline-block; - margin-right: 5px; - border-radius: 3px; - position: relative; - padding: 0 4px; - background: #333; - color: yellow; -} - -.skip-if-branch { - display: none; - margin-right: 10px; - position: relative; - padding: 0 4px; - background: #ccc; - color: white; -} -.missing-if-branch .typ, .skip-if-branch .typ { - color: inherit !important; -} -.coverage-summary { - border-collapse: collapse; - width: 100%; -} -.coverage-summary tr { border-bottom: 1px solid #bbb; } -.keyline-all { border: 1px solid #ddd; } -.coverage-summary td, .coverage-summary th { padding: 10px; } -.coverage-summary tbody { border: 1px solid #bbb; } -.coverage-summary td { border-right: 1px solid #bbb; } -.coverage-summary td:last-child { border-right: none; } -.coverage-summary th { - text-align: left; - font-weight: normal; - white-space: nowrap; -} -.coverage-summary th.file { border-right: none !important; } -.coverage-summary th.pct { } -.coverage-summary th.pic, -.coverage-summary th.abs, -.coverage-summary td.pct, -.coverage-summary td.abs { text-align: right; } -.coverage-summary td.file { white-space: nowrap; } -.coverage-summary td.pic { min-width: 120px !important; } -.coverage-summary tfoot td { } - -.coverage-summary .sorter { - height: 10px; - width: 7px; - display: inline-block; - margin-left: 0.5em; - background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; -} -.coverage-summary .sorted .sorter { - background-position: 0 -20px; -} -.coverage-summary .sorted-desc .sorter { - background-position: 0 -10px; -} -.status-line { height: 10px; } -/* dark red */ -.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } -.low .chart { border:1px solid #C21F39 } -/* medium red */ -.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } -/* light red */ -.low, .cline-no { background:#FCE1E5 } -/* light green */ -.high, .cline-yes { background:rgb(230,245,208) } -/* medium green */ -.cstat-yes { background:rgb(161,215,106) } -/* dark green */ -.status-line.high, .high .cover-fill { background:rgb(77,146,33) } -.high .chart { border:1px solid rgb(77,146,33) } -/* dark yellow (gold) */ -.medium .chart { border:1px solid #f9cd0b; } -.status-line.medium, .medium .cover-fill { background: #f9cd0b; } -/* light yellow */ -.medium { background: #fff4c2; } -/* light gray */ -span.cline-neutral { background: #eaeaea; } - -.cbranch-no { background: yellow !important; color: #111; } - -.cstat-skip { background: #ddd; color: #111; } -.fstat-skip { background: #ddd; color: #111 !important; } -.cbranch-skip { background: #ddd !important; color: #111; } - - -.cover-fill, .cover-empty { - display:inline-block; - height: 12px; -} -.chart { - line-height: 0; -} -.cover-empty { - background: white; -} -.cover-full { - border-right: none !important; -} -pre.prettyprint { - border: none !important; - padding: 0 !important; - margin: 0 !important; -} -.com { color: #999 !important; } -.ignore-none { color: #999; font-weight: normal; } - -.wrapper { - min-height: 100%; - height: auto !important; - height: 100%; - margin: 0 auto -48px; -} -.footer, .push { - height: 48px; -} diff --git a/build/coverage/lcov-report/build/game-lib.js.html b/build/coverage/lcov-report/build/game-lib.js.html deleted file mode 100644 index fb37725..0000000 --- a/build/coverage/lcov-report/build/game-lib.js.html +++ /dev/null @@ -1,17498 +0,0 @@ - - - - Code coverage report for build/game-lib.js - - - - - - - -
-
-

- all files / build/ game-lib.js -

-
-
- 17.41% - Statements - 361/2074 -
-
- 4.94% - Branches - 40/810 -
-
- 8.44% - Functions - 13/154 -
-
- 17.41% - Lines - 361/2074 -
-
-
-
-

-
-
1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36 -37 -38 -39 -40 -41 -42 -43 -44 -45 -46 -47 -48 -49 -50 -51 -52 -53 -54 -55 -56 -57 -58 -59 -60 -61 -62 -63 -64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76 -77 -78 -79 -80 -81 -82 -83 -84 -85 -86 -87 -88 -89 -90 -91 -92 -93 -94 -95 -96 -97 -98 -99 -100 -101 -102 -103 -104 -105 -106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123 -124 -125 -126 -127 -128 -129 -130 -131 -132 -133 -134 -135 -136 -137 -138 -139 -140 -141 -142 -143 -144 -145 -146 -147 -148 -149 -150 -151 -152 -153 -154 -155 -156 -157 -158 -159 -160 -161 -162 -163 -164 -165 -166 -167 -168 -169 -170 -171 -172 -173 -174 -175 -176 -177 -178 -179 -180 -181 -182 -183 -184 -185 -186 -187 -188 -189 -190 -191 -192 -193 -194 -195 -196 -197 -198 -199 -200 -201 -202 -203 -204 -205 -206 -207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264 -265 -266 -267 -268 -269 -270 -271 -272 -273 -274 -275 -276 -277 -278 -279 -280 -281 -282 -283 -284 -285 -286 -287 -288 -289 -290 -291 -292 -293 -294 -295 -296 -297 -298 -299 -300 -301 -302 -303 -304 -305 -306 -307 -308 -309 -310 -311 -312 -313 -314 -315 -316 -317 -318 -319 -320 -321 -322 -323 -324 -325 -326 -327 -328 -329 -330 -331 -332 -333 -334 -335 -336 -337 -338 -339 -340 -341 -342 -343 -344 -345 -346 -347 -348 -349 -350 -351 -352 -353 -354 -355 -356 -357 -358 -359 -360 -361 -362 -363 -364 -365 -366 -367 -368 -369 -370 -371 -372 -373 -374 -375 -376 -377 -378 -379 -380 -381 -382 -383 -384 -385 -386 -387 -388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425 -426 -427 -428 -429 -430 -431 -432 -433 -434 -435 -436 -437 -438 -439 -440 -441 -442 -443 -444 -445 -446 -447 -448 -449 -450 -451 -452 -453 -454 -455 -456 -457 -458 -459 -460 -461 -462 -463 -464 -465 -466 -467 -468 -469 -470 -471 -472 -473 -474 -475 -476 -477 -478 -479 -480 -481 -482 -483 -484 -485 -486 -487 -488 -489 -490 -491 -492 -493 -494 -495 -496 -497 -498 -499 -500 -501 -502 -503 -504 -505 -506 -507 -508 -509 -510 -511 -512 -513 -514 -515 -516 -517 -518 -519 -520 -521 -522 -523 -524 -525 -526 -527 -528 -529 -530 -531 -532 -533 -534 -535 -536 -537 -538 -539 -540 -541 -542 -543 -544 -545 -546 -547 -548 -549 -550 -551 -552 -553 -554 -555 -556 -557 -558 -559 -560 -561 -562 -563 -564 -565 -566 -567 -568 -569 -570 -571 -572 -573 -574 -575 -576 -577 -578 -579 -580 -581 -582 -583 -584 -585 -586 -587 -588 -589 -590 -591 -592 -593 -594 -595 -596 -597 -598 -599 -600 -601 -602 -603 -604 -605 -606 -607 -608 -609 -610 -611 -612 -613 -614 -615 -616 -617 -618 -619 -620 -621 -622 -623 -624 -625 -626 -627 -628 -629 -630 -631 -632 -633 -634 -635 -636 -637 -638 -639 -640 -641 -642 -643 -644 -645 -646 -647 -648 -649 -650 -651 -652 -653 -654 -655 -656 -657 -658 -659 -660 -661 -662 -663 -664 -665 -666 -667 -668 -669 -670 -671 -672 -673 -674 -675 -676 -677 -678 -679 -680 -681 -682 -683 -684 -685 -686 -687 -688 -689 -690 -691 -692 -693 -694 -695 -696 -697 -698 -699 -700 -701 -702 -703 -704 -705 -706 -707 -708 -709 -710 -711 -712 -713 -714 -715 -716 -717 -718 -719 -720 -721 -722 -723 -724 -725 -726 -727 -728 -729 -730 -731 -732 -733 -734 -735 -736 -737 -738 -739 -740 -741 -742 -743 -744 -745 -746 -747 -748 -749 -750 -751 -752 -753 -754 -755 -756 -757 -758 -759 -760 -761 -762 -763 -764 -765 -766 -767 -768 -769 -770 -771 -772 -773 -774 -775 -776 -777 -778 -779 -780 -781 -782 -783 -784 -785 -786 -787 -788 -789 -790 -791 -792 -793 -794 -795 -796 -797 -798 -799 -800 -801 -802 -803 -804 -805 -806 -807 -808 -809 -810 -811 -812 -813 -814 -815 -816 -817 -818 -819 -820 -821 -822 -823 -824 -825 -826 -827 -828 -829 -830 -831 -832 -833 -834 -835 -836 -837 -838 -839 -840 -841 -842 -843 -844 -845 -846 -847 -848 -849 -850 -851 -852 -853 -854 -855 -856 -857 -858 -859 -860 -861 -862 -863 -864 -865 -866 -867 -868 -869 -870 -871 -872 -873 -874 -875 -876 -877 -878 -879 -880 -881 -882 -883 -884 -885 -886 -887 -888 -889 -890 -891 -892 -893 -894 -895 -896 -897 -898 -899 -900 -901 -902 -903 -904 -905 -906 -907 -908 -909 -910 -911 -912 -913 -914 -915 -916 -917 -918 -919 -920 -921 -922 -923 -924 -925 -926 -927 -928 -929 -930 -931 -932 -933 -934 -935 -936 -937 -938 -939 -940 -941 -942 -943 -944 -945 -946 -947 -948 -949 -950 -951 -952 -953 -954 -955 -956 -957 -958 -959 -960 -961 -962 -963 -964 -965 -966 -967 -968 -969 -970 -971 -972 -973 -974 -975 -976 -977 -978 -979 -980 -981 -982 -983 -984 -985 -986 -987 -988 -989 -990 -991 -992 -993 -994 -995 -996 -997 -998 -999 -1000 -1001 -1002 -1003 -1004 -1005 -1006 -1007 -1008 -1009 -1010 -1011 -1012 -1013 -1014 -1015 -1016 -1017 -1018 -1019 -1020 -1021 -1022 -1023 -1024 -1025 -1026 -1027 -1028 -1029 -1030 -1031 -1032 -1033 -1034 -1035 -1036 -1037 -1038 -1039 -1040 -1041 -1042 -1043 -1044 -1045 -1046 -1047 -1048 -1049 -1050 -1051 -1052 -1053 -1054 -1055 -1056 -1057 -1058 -1059 -1060 -1061 -1062 -1063 -1064 -1065 -1066 -1067 -1068 -1069 -1070 -1071 -1072 -1073 -1074 -1075 -1076 -1077 -1078 -1079 -1080 -1081 -1082 -1083 -1084 -1085 -1086 -1087 -1088 -1089 -1090 -1091 -1092 -1093 -1094 -1095 -1096 -1097 -1098 -1099 -1100 -1101 -1102 -1103 -1104 -1105 -1106 -1107 -1108 -1109 -1110 -1111 -1112 -1113 -1114 -1115 -1116 -1117 -1118 -1119 -1120 -1121 -1122 -1123 -1124 -1125 -1126 -1127 -1128 -1129 -1130 -1131 -1132 -1133 -1134 -1135 -1136 -1137 -1138 -1139 -1140 -1141 -1142 -1143 -1144 -1145 -1146 -1147 -1148 -1149 -1150 -1151 -1152 -1153 -1154 -1155 -1156 -1157 -1158 -1159 -1160 -1161 -1162 -1163 -1164 -1165 -1166 -1167 -1168 -1169 -1170 -1171 -1172 -1173 -1174 -1175 -1176 -1177 -1178 -1179 -1180 -1181 -1182 -1183 -1184 -1185 -1186 -1187 -1188 -1189 -1190 -1191 -1192 -1193 -1194 -1195 -1196 -1197 -1198 -1199 -1200 -1201 -1202 -1203 -1204 -1205 -1206 -1207 -1208 -1209 -1210 -1211 -1212 -1213 -1214 -1215 -1216 -1217 -1218 -1219 -1220 -1221 -1222 -1223 -1224 -1225 -1226 -1227 -1228 -1229 -1230 -1231 -1232 -1233 -1234 -1235 -1236 -1237 -1238 -1239 -1240 -1241 -1242 -1243 -1244 -1245 -1246 -1247 -1248 -1249 -1250 -1251 -1252 -1253 -1254 -1255 -1256 -1257 -1258 -1259 -1260 -1261 -1262 -1263 -1264 -1265 -1266 -1267 -1268 -1269 -1270 -1271 -1272 -1273 -1274 -1275 -1276 -1277 -1278 -1279 -1280 -1281 -1282 -1283 -1284 -1285 -1286 -1287 -1288 -1289 -1290 -1291 -1292 -1293 -1294 -1295 -1296 -1297 -1298 -1299 -1300 -1301 -1302 -1303 -1304 -1305 -1306 -1307 -1308 -1309 -1310 -1311 -1312 -1313 -1314 -1315 -1316 -1317 -1318 -1319 -1320 -1321 -1322 -1323 -1324 -1325 -1326 -1327 -1328 -1329 -1330 -1331 -1332 -1333 -1334 -1335 -1336 -1337 -1338 -1339 -1340 -1341 -1342 -1343 -1344 -1345 -1346 -1347 -1348 -1349 -1350 -1351 -1352 -1353 -1354 -1355 -1356 -1357 -1358 -1359 -1360 -1361 -1362 -1363 -1364 -1365 -1366 -1367 -1368 -1369 -1370 -1371 -1372 -1373 -1374 -1375 -1376 -1377 -1378 -1379 -1380 -1381 -1382 -1383 -1384 -1385 -1386 -1387 -1388 -1389 -1390 -1391 -1392 -1393 -1394 -1395 -1396 -1397 -1398 -1399 -1400 -1401 -1402 -1403 -1404 -1405 -1406 -1407 -1408 -1409 -1410 -1411 -1412 -1413 -1414 -1415 -1416 -1417 -1418 -1419 -1420 -1421 -1422 -1423 -1424 -1425 -1426 -1427 -1428 -1429 -1430 -1431 -1432 -1433 -1434 -1435 -1436 -1437 -1438 -1439 -1440 -1441 -1442 -1443 -1444 -1445 -1446 -1447 -1448 -1449 -1450 -1451 -1452 -1453 -1454 -1455 -1456 -1457 -1458 -1459 -1460 -1461 -1462 -1463 -1464 -1465 -1466 -1467 -1468 -1469 -1470 -1471 -1472 -1473 -1474 -1475 -1476 -1477 -1478 -1479 -1480 -1481 -1482 -1483 -1484 -1485 -1486 -1487 -1488 -1489 -1490 -1491 -1492 -1493 -1494 -1495 -1496 -1497 -1498 -1499 -1500 -1501 -1502 -1503 -1504 -1505 -1506 -1507 -1508 -1509 -1510 -1511 -1512 -1513 -1514 -1515 -1516 -1517 -1518 -1519 -1520 -1521 -1522 -1523 -1524 -1525 -1526 -1527 -1528 -1529 -1530 -1531 -1532 -1533 -1534 -1535 -1536 -1537 -1538 -1539 -1540 -1541 -1542 -1543 -1544 -1545 -1546 -1547 -1548 -1549 -1550 -1551 -1552 -1553 -1554 -1555 -1556 -1557 -1558 -1559 -1560 -1561 -1562 -1563 -1564 -1565 -1566 -1567 -1568 -1569 -1570 -1571 -1572 -1573 -1574 -1575 -1576 -1577 -1578 -1579 -1580 -1581 -1582 -1583 -1584 -1585 -1586 -1587 -1588 -1589 -1590 -1591 -1592 -1593 -1594 -1595 -1596 -1597 -1598 -1599 -1600 -1601 -1602 -1603 -1604 -1605 -1606 -1607 -1608 -1609 -1610 -1611 -1612 -1613 -1614 -1615 -1616 -1617 -1618 -1619 -1620 -1621 -1622 -1623 -1624 -1625 -1626 -1627 -1628 -1629 -1630 -1631 -1632 -1633 -1634 -1635 -1636 -1637 -1638 -1639 -1640 -1641 -1642 -1643 -1644 -1645 -1646 -1647 -1648 -1649 -1650 -1651 -1652 -1653 -1654 -1655 -1656 -1657 -1658 -1659 -1660 -1661 -1662 -1663 -1664 -1665 -1666 -1667 -1668 -1669 -1670 -1671 -1672 -1673 -1674 -1675 -1676 -1677 -1678 -1679 -1680 -1681 -1682 -1683 -1684 -1685 -1686 -1687 -1688 -1689 -1690 -1691 -1692 -1693 -1694 -1695 -1696 -1697 -1698 -1699 -1700 -1701 -1702 -1703 -1704 -1705 -1706 -1707 -1708 -1709 -1710 -1711 -1712 -1713 -1714 -1715 -1716 -1717 -1718 -1719 -1720 -1721 -1722 -1723 -1724 -1725 -1726 -1727 -1728 -1729 -1730 -1731 -1732 -1733 -1734 -1735 -1736 -1737 -1738 -1739 -1740 -1741 -1742 -1743 -1744 -1745 -1746 -1747 -1748 -1749 -1750 -1751 -1752 -1753 -1754 -1755 -1756 -1757 -1758 -1759 -1760 -1761 -1762 -1763 -1764 -1765 -1766 -1767 -1768 -1769 -1770 -1771 -1772 -1773 -1774 -1775 -1776 -1777 -1778 -1779 -1780 -1781 -1782 -1783 -1784 -1785 -1786 -1787 -1788 -1789 -1790 -1791 -1792 -1793 -1794 -1795 -1796 -1797 -1798 -1799 -1800 -1801 -1802 -1803 -1804 -1805 -1806 -1807 -1808 -1809 -1810 -1811 -1812 -1813 -1814 -1815 -1816 -1817 -1818 -1819 -1820 -1821 -1822 -1823 -1824 -1825 -1826 -1827 -1828 -1829 -1830 -1831 -1832 -1833 -1834 -1835 -1836 -1837 -1838 -1839 -1840 -1841 -1842 -1843 -1844 -1845 -1846 -1847 -1848 -1849 -1850 -1851 -1852 -1853 -1854 -1855 -1856 -1857 -1858 -1859 -1860 -1861 -1862 -1863 -1864 -1865 -1866 -1867 -1868 -1869 -1870 -1871 -1872 -1873 -1874 -1875 -1876 -1877 -1878 -1879 -1880 -1881 -1882 -1883 -1884 -1885 -1886 -1887 -1888 -1889 -1890 -1891 -1892 -1893 -1894 -1895 -1896 -1897 -1898 -1899 -1900 -1901 -1902 -1903 -1904 -1905 -1906 -1907 -1908 -1909 -1910 -1911 -1912 -1913 -1914 -1915 -1916 -1917 -1918 -1919 -1920 -1921 -1922 -1923 -1924 -1925 -1926 -1927 -1928 -1929 -1930 -1931 -1932 -1933 -1934 -1935 -1936 -1937 -1938 -1939 -1940 -1941 -1942 -1943 -1944 -1945 -1946 -1947 -1948 -1949 -1950 -1951 -1952 -1953 -1954 -1955 -1956 -1957 -1958 -1959 -1960 -1961 -1962 -1963 -1964 -1965 -1966 -1967 -1968 -1969 -1970 -1971 -1972 -1973 -1974 -1975 -1976 -1977 -1978 -1979 -1980 -1981 -1982 -1983 -1984 -1985 -1986 -1987 -1988 -1989 -1990 -1991 -1992 -1993 -1994 -1995 -1996 -1997 -1998 -1999 -2000 -2001 -2002 -2003 -2004 -2005 -2006 -2007 -2008 -2009 -2010 -2011 -2012 -2013 -2014 -2015 -2016 -2017 -2018 -2019 -2020 -2021 -2022 -2023 -2024 -2025 -2026 -2027 -2028 -2029 -2030 -2031 -2032 -2033 -2034 -2035 -2036 -2037 -2038 -2039 -2040 -2041 -2042 -2043 -2044 -2045 -2046 -2047 -2048 -2049 -2050 -2051 -2052 -2053 -2054 -2055 -2056 -2057 -2058 -2059 -2060 -2061 -2062 -2063 -2064 -2065 -2066 -2067 -2068 -2069 -2070 -2071 -2072 -2073 -2074 -2075 -2076 -2077 -2078 -2079 -2080 -2081 -2082 -2083 -2084 -2085 -2086 -2087 -2088 -2089 -2090 -2091 -2092 -2093 -2094 -2095 -2096 -2097 -2098 -2099 -2100 -2101 -2102 -2103 -2104 -2105 -2106 -2107 -2108 -2109 -2110 -2111 -2112 -2113 -2114 -2115 -2116 -2117 -2118 -2119 -2120 -2121 -2122 -2123 -2124 -2125 -2126 -2127 -2128 -2129 -2130 -2131 -2132 -2133 -2134 -2135 -2136 -2137 -2138 -2139 -2140 -2141 -2142 -2143 -2144 -2145 -2146 -2147 -2148 -2149 -2150 -2151 -2152 -2153 -2154 -2155 -2156 -2157 -2158 -2159 -2160 -2161 -2162 -2163 -2164 -2165 -2166 -2167 -2168 -2169 -2170 -2171 -2172 -2173 -2174 -2175 -2176 -2177 -2178 -2179 -2180 -2181 -2182 -2183 -2184 -2185 -2186 -2187 -2188 -2189 -2190 -2191 -2192 -2193 -2194 -2195 -2196 -2197 -2198 -2199 -2200 -2201 -2202 -2203 -2204 -2205 -2206 -2207 -2208 -2209 -2210 -2211 -2212 -2213 -2214 -2215 -2216 -2217 -2218 -2219 -2220 -2221 -2222 -2223 -2224 -2225 -2226 -2227 -2228 -2229 -2230 -2231 -2232 -2233 -2234 -2235 -2236 -2237 -2238 -2239 -2240 -2241 -2242 -2243 -2244 -2245 -2246 -2247 -2248 -2249 -2250 -2251 -2252 -2253 -2254 -2255 -2256 -2257 -2258 -2259 -2260 -2261 -2262 -2263 -2264 -2265 -2266 -2267 -2268 -2269 -2270 -2271 -2272 -2273 -2274 -2275 -2276 -2277 -2278 -2279 -2280 -2281 -2282 -2283 -2284 -2285 -2286 -2287 -2288 -2289 -2290 -2291 -2292 -2293 -2294 -2295 -2296 -2297 -2298 -2299 -2300 -2301 -2302 -2303 -2304 -2305 -2306 -2307 -2308 -2309 -2310 -2311 -2312 -2313 -2314 -2315 -2316 -2317 -2318 -2319 -2320 -2321 -2322 -2323 -2324 -2325 -2326 -2327 -2328 -2329 -2330 -2331 -2332 -2333 -2334 -2335 -2336 -2337 -2338 -2339 -2340 -2341 -2342 -2343 -2344 -2345 -2346 -2347 -2348 -2349 -2350 -2351 -2352 -2353 -2354 -2355 -2356 -2357 -2358 -2359 -2360 -2361 -2362 -2363 -2364 -2365 -2366 -2367 -2368 -2369 -2370 -2371 -2372 -2373 -2374 -2375 -2376 -2377 -2378 -2379 -2380 -2381 -2382 -2383 -2384 -2385 -2386 -2387 -2388 -2389 -2390 -2391 -2392 -2393 -2394 -2395 -2396 -2397 -2398 -2399 -2400 -2401 -2402 -2403 -2404 -2405 -2406 -2407 -2408 -2409 -2410 -2411 -2412 -2413 -2414 -2415 -2416 -2417 -2418 -2419 -2420 -2421 -2422 -2423 -2424 -2425 -2426 -2427 -2428 -2429 -2430 -2431 -2432 -2433 -2434 -2435 -2436 -2437 -2438 -2439 -2440 -2441 -2442 -2443 -2444 -2445 -2446 -2447 -2448 -2449 -2450 -2451 -2452 -2453 -2454 -2455 -2456 -2457 -2458 -2459 -2460 -2461 -2462 -2463 -2464 -2465 -2466 -2467 -2468 -2469 -2470 -2471 -2472 -2473 -2474 -2475 -2476 -2477 -2478 -2479 -2480 -2481 -2482 -2483 -2484 -2485 -2486 -2487 -2488 -2489 -2490 -2491 -2492 -2493 -2494 -2495 -2496 -2497 -2498 -2499 -2500 -2501 -2502 -2503 -2504 -2505 -2506 -2507 -2508 -2509 -2510 -2511 -2512 -2513 -2514 -2515 -2516 -2517 -2518 -2519 -2520 -2521 -2522 -2523 -2524 -2525 -2526 -2527 -2528 -2529 -2530 -2531 -2532 -2533 -2534 -2535 -2536 -2537 -2538 -2539 -2540 -2541 -2542 -2543 -2544 -2545 -2546 -2547 -2548 -2549 -2550 -2551 -2552 -2553 -2554 -2555 -2556 -2557 -2558 -2559 -2560 -2561 -2562 -2563 -2564 -2565 -2566 -2567 -2568 -2569 -2570 -2571 -2572 -2573 -2574 -2575 -2576 -2577 -2578 -2579 -2580 -2581 -2582 -2583 -2584 -2585 -2586 -2587 -2588 -2589 -2590 -2591 -2592 -2593 -2594 -2595 -2596 -2597 -2598 -2599 -2600 -2601 -2602 -2603 -2604 -2605 -2606 -2607 -2608 -2609 -2610 -2611 -2612 -2613 -2614 -2615 -2616 -2617 -2618 -2619 -2620 -2621 -2622 -2623 -2624 -2625 -2626 -2627 -2628 -2629 -2630 -2631 -2632 -2633 -2634 -2635 -2636 -2637 -2638 -2639 -2640 -2641 -2642 -2643 -2644 -2645 -2646 -2647 -2648 -2649 -2650 -2651 -2652 -2653 -2654 -2655 -2656 -2657 -2658 -2659 -2660 -2661 -2662 -2663 -2664 -2665 -2666 -2667 -2668 -2669 -2670 -2671 -2672 -2673 -2674 -2675 -2676 -2677 -2678 -2679 -2680 -2681 -2682 -2683 -2684 -2685 -2686 -2687 -2688 -2689 -2690 -2691 -2692 -2693 -2694 -2695 -2696 -2697 -2698 -2699 -2700 -2701 -2702 -2703 -2704 -2705 -2706 -2707 -2708 -2709 -2710 -2711 -2712 -2713 -2714 -2715 -2716 -2717 -2718 -2719 -2720 -2721 -2722 -2723 -2724 -2725 -2726 -2727 -2728 -2729 -2730 -2731 -2732 -2733 -2734 -2735 -2736 -2737 -2738 -2739 -2740 -2741 -2742 -2743 -2744 -2745 -2746 -2747 -2748 -2749 -2750 -2751 -2752 -2753 -2754 -2755 -2756 -2757 -2758 -2759 -2760 -2761 -2762 -2763 -2764 -2765 -2766 -2767 -2768 -2769 -2770 -2771 -2772 -2773 -2774 -2775 -2776 -2777 -2778 -2779 -2780 -2781 -2782 -2783 -2784 -2785 -2786 -2787 -2788 -2789 -2790 -2791 -2792 -2793 -2794 -2795 -2796 -2797 -2798 -2799 -2800 -2801 -2802 -2803 -2804 -2805 -2806 -2807 -2808 -2809 -2810 -2811 -2812 -2813 -2814 -2815 -2816 -2817 -2818 -2819 -2820 -2821 -2822 -2823 -2824 -2825 -2826 -2827 -2828 -2829 -2830 -2831 -2832 -2833 -2834 -2835 -2836 -2837 -2838 -2839 -2840 -2841 -2842 -2843 -2844 -2845 -2846 -2847 -2848 -2849 -2850 -2851 -2852 -2853 -2854 -2855 -2856 -2857 -2858 -2859 -2860 -2861 -2862 -2863 -2864 -2865 -2866 -2867 -2868 -2869 -2870 -2871 -2872 -2873 -2874 -2875 -2876 -2877 -2878 -2879 -2880 -2881 -2882 -2883 -2884 -2885 -2886 -2887 -2888 -2889 -2890 -2891 -2892 -2893 -2894 -2895 -2896 -2897 -2898 -2899 -2900 -2901 -2902 -2903 -2904 -2905 -2906 -2907 -2908 -2909 -2910 -2911 -2912 -2913 -2914 -2915 -2916 -2917 -2918 -2919 -2920 -2921 -2922 -2923 -2924 -2925 -2926 -2927 -2928 -2929 -2930 -2931 -2932 -2933 -2934 -2935 -2936 -2937 -2938 -2939 -2940 -2941 -2942 -2943 -2944 -2945 -2946 -2947 -2948 -2949 -2950 -2951 -2952 -2953 -2954 -2955 -2956 -2957 -2958 -2959 -2960 -2961 -2962 -2963 -2964 -2965 -2966 -2967 -2968 -2969 -2970 -2971 -2972 -2973 -2974 -2975 -2976 -2977 -2978 -2979 -2980 -2981 -2982 -2983 -2984 -2985 -2986 -2987 -2988 -2989 -2990 -2991 -2992 -2993 -2994 -2995 -2996 -2997 -2998 -2999 -3000 -3001 -3002 -3003 -3004 -3005 -3006 -3007 -3008 -3009 -3010 -3011 -3012 -3013 -3014 -3015 -3016 -3017 -3018 -3019 -3020 -3021 -3022 -3023 -3024 -3025 -3026 -3027 -3028 -3029 -3030 -3031 -3032 -3033 -3034 -3035 -3036 -3037 -3038 -3039 -3040 -3041 -3042 -3043 -3044 -3045 -3046 -3047 -3048 -3049 -3050 -3051 -3052 -3053 -3054 -3055 -3056 -3057 -3058 -3059 -3060 -3061 -3062 -3063 -3064 -3065 -3066 -3067 -3068 -3069 -3070 -3071 -3072 -3073 -3074 -3075 -3076 -3077 -3078 -3079 -3080 -3081 -3082 -3083 -3084 -3085 -3086 -3087 -3088 -3089 -3090 -3091 -3092 -3093 -3094 -3095 -3096 -3097 -3098 -3099 -3100 -3101 -3102 -3103 -3104 -3105 -3106 -3107 -3108 -3109 -3110 -3111 -3112 -3113 -3114 -3115 -3116 -3117 -3118 -3119 -3120 -3121 -3122 -3123 -3124 -3125 -3126 -3127 -3128 -3129 -3130 -3131 -3132 -3133 -3134 -3135 -3136 -3137 -3138 -3139 -3140 -3141 -3142 -3143 -3144 -3145 -3146 -3147 -3148 -3149 -3150 -3151 -3152 -3153 -3154 -3155 -3156 -3157 -3158 -3159 -3160 -3161 -3162 -3163 -3164 -3165 -3166 -3167 -3168 -3169 -3170 -3171 -3172 -3173 -3174 -3175 -3176 -3177 -3178 -3179 -3180 -3181 -3182 -3183 -3184 -3185 -3186 -3187 -3188 -3189 -3190 -3191 -3192 -3193 -3194 -3195 -3196 -3197 -3198 -3199 -3200 -3201 -3202 -3203 -3204 -3205 -3206 -3207 -3208 -3209 -3210 -3211 -3212 -3213 -3214 -3215 -3216 -3217 -3218 -3219 -3220 -3221 -3222 -3223 -3224 -3225 -3226 -3227 -3228 -3229 -3230 -3231 -3232 -3233 -3234 -3235 -3236 -3237 -3238 -3239 -3240 -3241 -3242 -3243 -3244 -3245 -3246 -3247 -3248 -3249 -3250 -3251 -3252 -3253 -3254 -3255 -3256 -3257 -3258 -3259 -3260 -3261 -3262 -3263 -3264 -3265 -3266 -3267 -3268 -3269 -3270 -3271 -3272 -3273 -3274 -3275 -3276 -3277 -3278 -3279 -3280 -3281 -3282 -3283 -3284 -3285 -3286 -3287 -3288 -3289 -3290 -3291 -3292 -3293 -3294 -3295 -3296 -3297 -3298 -3299 -3300 -3301 -3302 -3303 -3304 -3305 -3306 -3307 -3308 -3309 -3310 -3311 -3312 -3313 -3314 -3315 -3316 -3317 -3318 -3319 -3320 -3321 -3322 -3323 -3324 -3325 -3326 -3327 -3328 -3329 -3330 -3331 -3332 -3333 -3334 -3335 -3336 -3337 -3338 -3339 -3340 -3341 -3342 -3343 -3344 -3345 -3346 -3347 -3348 -3349 -3350 -3351 -3352 -3353 -3354 -3355 -3356 -3357 -3358 -3359 -3360 -3361 -3362 -3363 -3364 -3365 -3366 -3367 -3368 -3369 -3370 -3371 -3372 -3373 -3374 -3375 -3376 -3377 -3378 -3379 -3380 -3381 -3382 -3383 -3384 -3385 -3386 -3387 -3388 -3389 -3390 -3391 -3392 -3393 -3394 -3395 -3396 -3397 -3398 -3399 -3400 -3401 -3402 -3403 -3404 -3405 -3406 -3407 -3408 -3409 -3410 -3411 -3412 -3413 -3414 -3415 -3416 -3417 -3418 -3419 -3420 -3421 -3422 -3423 -3424 -3425 -3426 -3427 -3428 -3429 -3430 -3431 -3432 -3433 -3434 -3435 -3436 -3437 -3438 -3439 -3440 -3441 -3442 -3443 -3444 -3445 -3446 -3447 -3448 -3449 -3450 -3451 -3452 -3453 -3454 -3455 -3456 -3457 -3458 -3459 -3460 -3461 -3462 -3463 -3464 -3465 -3466 -3467 -3468 -3469 -3470 -3471 -3472 -3473 -3474 -3475 -3476 -3477 -3478 -3479 -3480 -3481 -3482 -3483 -3484 -3485 -3486 -3487 -3488 -3489 -3490 -3491 -3492 -3493 -3494 -3495 -3496 -3497 -3498 -3499 -3500 -3501 -3502 -3503 -3504 -3505 -3506 -3507 -3508 -3509 -3510 -3511 -3512 -3513 -3514 -3515 -3516 -3517 -3518 -3519 -3520 -3521 -3522 -3523 -3524 -3525 -3526 -3527 -3528 -3529 -3530 -3531 -3532 -3533 -3534 -3535 -3536 -3537 -3538 -3539 -3540 -3541 -3542 -3543 -3544 -3545 -3546 -3547 -3548 -3549 -3550 -3551 -3552 -3553 -3554 -3555 -3556 -3557 -3558 -3559 -3560 -3561 -3562 -3563 -3564 -3565 -3566 -3567 -3568 -3569 -3570 -3571 -3572 -3573 -3574 -3575 -3576 -3577 -3578 -3579 -3580 -3581 -3582 -3583 -3584 -3585 -3586 -3587 -3588 -3589 -3590 -3591 -3592 -3593 -3594 -3595 -3596 -3597 -3598 -3599 -3600 -3601 -3602 -3603 -3604 -3605 -3606 -3607 -3608 -3609 -3610 -3611 -3612 -3613 -3614 -3615 -3616 -3617 -3618 -3619 -3620 -3621 -3622 -3623 -3624 -3625 -3626 -3627 -3628 -3629 -3630 -3631 -3632 -3633 -3634 -3635 -3636 -3637 -3638 -3639 -3640 -3641 -3642 -3643 -3644 -3645 -3646 -3647 -3648 -3649 -3650 -3651 -3652 -3653 -3654 -3655 -3656 -3657 -3658 -3659 -3660 -3661 -3662 -3663 -3664 -3665 -3666 -3667 -3668 -3669 -3670 -3671 -3672 -3673 -3674 -3675 -3676 -3677 -3678 -3679 -3680 -3681 -3682 -3683 -3684 -3685 -3686 -3687 -3688 -3689 -3690 -3691 -3692 -3693 -3694 -3695 -3696 -3697 -3698 -3699 -3700 -3701 -3702 -3703 -3704 -3705 -3706 -3707 -3708 -3709 -3710 -3711 -3712 -3713 -3714 -3715 -3716 -3717 -3718 -3719 -3720 -3721 -3722 -3723 -3724 -3725 -3726 -3727 -3728 -3729 -3730 -3731 -3732 -3733 -3734 -3735 -3736 -3737 -3738 -3739 -3740 -3741 -3742 -3743 -3744 -3745 -3746 -3747 -3748 -3749 -3750 -3751 -3752 -3753 -3754 -3755 -3756 -3757 -3758 -3759 -3760 -3761 -3762 -3763 -3764 -3765 -3766 -3767 -3768 -3769 -3770 -3771 -3772 -3773 -3774 -3775 -3776 -3777 -3778 -3779 -3780 -3781 -3782 -3783 -3784 -3785 -3786 -3787 -3788 -3789 -3790 -3791 -3792 -3793 -3794 -3795 -3796 -3797 -3798 -3799 -3800 -3801 -3802 -3803 -3804 -3805 -3806 -3807 -3808 -3809 -3810 -3811 -3812 -3813 -3814 -3815 -3816 -3817 -3818 -3819 -3820 -3821 -3822 -3823 -3824 -3825 -3826 -3827 -3828 -3829 -3830 -3831 -3832 -3833 -3834 -3835 -3836 -3837 -3838 -3839 -3840 -3841 -3842 -3843 -3844 -3845 -3846 -3847 -3848 -3849 -3850 -3851 -3852 -3853 -3854 -3855 -3856 -3857 -3858 -3859 -3860 -3861 -3862 -3863 -3864 -3865 -3866 -3867 -3868 -3869 -3870 -3871 -3872 -3873 -3874 -3875 -3876 -3877 -3878 -3879 -3880 -3881 -3882 -3883 -3884 -3885 -3886 -3887 -3888 -3889 -3890 -3891 -3892 -3893 -3894 -3895 -3896 -3897 -3898 -3899 -3900 -3901 -3902 -3903 -3904 -3905 -3906 -3907 -3908 -3909 -3910 -3911 -3912 -3913 -3914 -3915 -3916 -3917 -3918 -3919 -3920 -3921 -3922 -3923 -3924 -3925 -3926 -3927 -3928 -3929 -3930 -3931 -3932 -3933 -3934 -3935 -3936 -3937 -3938 -3939 -3940 -3941 -3942 -3943 -3944 -3945 -3946 -3947 -3948 -3949 -3950 -3951 -3952 -3953 -3954 -3955 -3956 -3957 -3958 -3959 -3960 -3961 -3962 -3963 -3964 -3965 -3966 -3967 -3968 -3969 -3970 -3971 -3972 -3973 -3974 -3975 -3976 -3977 -3978 -3979 -3980 -3981 -3982 -3983 -3984 -3985 -3986 -3987 -3988 -3989 -3990 -3991 -3992 -3993 -3994 -3995 -3996 -3997 -3998 -3999 -4000 -4001 -4002 -4003 -4004 -4005 -4006 -4007 -4008 -4009 -4010 -4011 -4012 -4013 -4014 -4015 -4016 -4017 -4018 -4019 -4020 -4021 -4022 -4023 -4024 -4025 -4026 -4027 -4028 -4029 -4030 -4031 -4032 -4033 -4034 -4035 -4036 -4037 -4038 -4039 -4040 -4041 -4042 -4043 -4044 -4045 -4046 -4047 -4048 -4049 -4050 -4051 -4052 -4053 -4054 -4055 -4056 -4057 -4058 -4059 -4060 -4061 -4062 -4063 -4064 -4065 -4066 -4067 -4068 -4069 -4070 -4071 -4072 -4073 -4074 -4075 -4076 -4077 -4078 -4079 -4080 -4081 -4082 -4083 -4084 -4085 -4086 -4087 -4088 -4089 -4090 -4091 -4092 -4093 -4094 -4095 -4096 -4097 -4098 -4099 -4100 -4101 -4102 -4103 -4104 -4105 -4106 -4107 -4108 -4109 -4110 -4111 -4112 -4113 -4114 -4115 -4116 -4117 -4118 -4119 -4120 -4121 -4122 -4123 -4124 -4125 -4126 -4127 -4128 -4129 -4130 -4131 -4132 -4133 -4134 -4135 -4136 -4137 -4138 -4139 -4140 -4141 -4142 -4143 -4144 -4145 -4146 -4147 -4148 -4149 -4150 -4151 -4152 -4153 -4154 -4155 -4156 -4157 -4158 -4159 -4160 -4161 -4162 -4163 -4164 -4165 -4166 -4167 -4168 -4169 -4170 -4171 -4172 -4173 -4174 -4175 -4176 -4177 -4178 -4179 -4180 -4181 -4182 -4183 -4184 -4185 -4186 -4187 -4188 -4189 -4190 -4191 -4192 -4193 -4194 -4195 -4196 -4197 -4198 -4199 -4200 -4201 -4202 -4203 -4204 -4205 -4206 -4207 -4208 -4209 -4210 -4211 -4212 -4213 -4214 -4215 -4216 -4217 -4218 -4219 -4220 -4221 -4222 -4223 -4224 -4225 -4226 -4227 -4228 -4229 -4230 -4231 -4232 -4233 -4234 -4235 -4236 -4237 -4238 -4239 -4240 -4241 -4242 -4243 -4244 -4245 -4246 -4247 -4248 -4249 -4250 -4251 -4252 -4253 -4254 -4255 -4256 -4257 -4258 -4259 -4260 -4261 -4262 -4263 -4264 -4265 -4266 -4267 -4268 -4269 -4270 -4271 -4272 -4273 -4274 -4275 -4276 -4277 -4278 -4279 -4280 -4281 -4282 -4283 -4284 -4285 -4286 -4287 -4288 -4289 -4290 -4291 -4292 -4293 -4294 -4295 -4296 -4297 -4298 -4299 -4300 -4301 -4302 -4303 -4304 -4305 -4306 -4307 -4308 -4309 -4310 -4311 -4312 -4313 -4314 -4315 -4316 -4317 -4318 -4319 -4320 -4321 -4322 -4323 -4324 -4325 -4326 -4327 -4328 -4329 -4330 -4331 -4332 -4333 -4334 -4335 -4336 -4337 -4338 -4339 -4340 -4341 -4342 -4343 -4344 -4345 -4346 -4347 -4348 -4349 -4350 -4351 -4352 -4353 -4354 -4355 -4356 -4357 -4358 -4359 -4360 -4361 -4362 -4363 -4364 -4365 -4366 -4367 -4368 -4369 -4370 -4371 -4372 -4373 -4374 -4375 -4376 -4377 -4378 -4379 -4380 -4381 -4382 -4383 -4384 -4385 -4386 -4387 -4388 -4389 -4390 -4391 -4392 -4393 -4394 -4395 -4396 -4397 -4398 -4399 -4400 -4401 -4402 -4403 -4404 -4405 -4406 -4407 -4408 -4409 -4410 -4411 -4412 -4413 -4414 -4415 -4416 -4417 -4418 -4419 -4420 -4421 -4422 -4423 -4424 -4425 -4426 -4427 -4428 -4429 -4430 -4431 -4432 -4433 -4434 -4435 -4436 -4437 -4438 -4439 -4440 -4441 -4442 -4443 -4444 -4445 -4446 -4447 -4448 -4449 -4450 -4451 -4452 -4453 -4454 -4455 -4456 -4457 -4458 -4459 -4460 -4461 -4462 -4463 -4464 -4465 -4466 -4467 -4468 -4469 -4470 -4471 -4472 -4473 -4474 -4475 -4476 -4477 -4478 -4479 -4480 -4481 -4482 -4483 -4484 -4485 -4486 -4487 -4488 -4489 -4490 -4491 -4492 -4493 -4494 -4495 -4496 -4497 -4498 -4499 -4500 -4501 -4502 -4503 -4504 -4505 -4506 -4507 -4508 -4509 -4510 -4511 -4512 -4513 -4514 -4515 -4516 -4517 -4518 -4519 -4520 -4521 -4522 -4523 -4524 -4525 -4526 -4527 -4528 -4529 -4530 -4531 -4532 -4533 -4534 -4535 -4536 -4537 -4538 -4539 -4540 -4541 -4542 -4543 -4544 -4545 -4546 -4547 -4548 -4549 -4550 -4551 -4552 -4553 -4554 -4555 -4556 -4557 -4558 -4559 -4560 -4561 -4562 -4563 -4564 -4565 -4566 -4567 -4568 -4569 -4570 -4571 -4572 -4573 -4574 -4575 -4576 -4577 -4578 -4579 -4580 -4581 -4582 -4583 -4584 -4585 -4586 -4587 -4588 -4589 -4590 -4591 -4592 -4593 -4594 -4595 -4596 -4597 -4598 -4599 -4600 -4601 -4602 -4603 -4604 -4605 -4606 -4607 -4608 -4609 -4610 -4611 -4612 -4613 -4614 -4615 -4616 -4617 -4618 -4619 -4620 -4621 -4622 -4623 -4624 -4625 -4626 -4627 -4628 -4629 -4630 -4631 -4632 -4633 -4634 -4635 -4636 -4637 -4638 -4639 -4640 -4641 -4642 -4643 -4644 -4645 -4646 -4647 -4648 -4649 -4650 -4651 -4652 -4653 -4654 -4655 -4656 -4657 -4658 -4659 -4660 -4661 -4662 -4663 -4664 -4665 -4666 -4667 -4668 -4669 -4670 -4671 -4672 -4673 -4674 -4675 -4676 -4677 -4678 -4679 -4680 -4681 -4682 -4683 -4684 -4685 -4686 -4687 -4688 -4689 -4690 -4691 -4692 -4693 -4694 -4695 -4696 -4697 -4698 -4699 -4700 -4701 -4702 -4703 -4704 -4705 -4706 -4707 -4708 -4709 -4710 -4711 -4712 -4713 -4714 -4715 -4716 -4717 -4718 -4719 -4720 -4721 -4722 -4723 -4724 -4725 -4726 -4727 -4728 -4729 -4730 -4731 -4732 -4733 -4734 -4735 -4736 -4737 -4738 -4739 -4740 -4741 -4742 -4743 -4744 -4745 -4746 -4747 -4748 -4749 -4750 -4751 -4752 -4753 -4754 -4755 -4756 -4757 -4758 -4759 -4760 -4761 -4762 -4763 -4764 -4765 -4766 -4767 -4768 -4769 -4770 -4771 -4772 -4773 -4774 -4775 -4776 -4777 -4778 -4779 -4780 -4781 -4782 -4783 -4784 -4785 -4786 -4787 -4788 -4789 -4790 -4791 -4792 -4793 -4794 -4795 -4796 -4797 -4798 -4799 -4800 -4801 -4802 -4803 -4804 -4805 -4806 -4807 -4808 -4809 -4810 -4811 -4812 -4813 -4814 -4815 -4816 -4817 -4818 -4819 -4820 -4821 -4822 -4823 -4824 -4825 -4826 -4827 -4828 -4829 -4830 -4831 -4832 -4833 -4834 -4835 -4836 -4837 -4838 -4839 -4840 -4841 -4842 -4843 -4844 -4845 -4846 -4847 -4848 -4849 -4850 -4851 -4852 -4853 -4854 -4855 -4856 -4857 -4858 -4859 -4860 -4861 -4862 -4863 -4864 -4865 -4866 -4867 -4868 -4869 -4870 -4871 -4872 -4873 -4874 -4875 -4876 -4877 -4878 -4879 -4880 -4881 -4882 -4883 -4884 -4885 -4886 -4887 -4888 -4889 -4890 -4891 -4892 -4893 -4894 -4895 -4896 -4897 -4898 -4899 -4900 -4901 -4902 -4903 -4904 -4905 -4906 -4907 -4908 -4909 -4910 -4911 -4912 -4913 -4914 -4915 -4916 -4917 -4918 -4919 -4920 -4921 -4922 -4923 -4924 -4925 -4926 -4927 -4928 -4929 -4930 -4931 -4932 -4933 -4934 -4935 -4936 -4937 -4938 -4939 -4940 -4941 -4942 -4943 -4944 -4945 -4946 -4947 -4948 -4949 -4950 -4951 -4952 -4953 -4954 -4955 -4956 -4957 -4958 -4959 -4960 -4961 -4962 -4963 -4964 -4965 -4966 -4967 -4968 -4969 -4970 -4971 -4972 -4973 -4974 -4975 -4976 -4977 -4978 -4979 -4980 -4981 -4982 -4983 -4984 -4985 -4986 -4987 -4988 -4989 -4990 -4991 -4992 -4993 -4994 -4995 -4996 -4997 -4998 -4999 -5000 -5001 -5002 -5003 -5004 -5005 -5006 -5007 -5008 -5009 -5010 -5011 -5012 -5013 -5014 -5015 -5016 -5017 -5018 -5019 -5020 -5021 -5022 -5023 -5024 -5025 -5026 -5027 -5028 -5029 -5030 -5031 -5032 -5033 -5034 -5035 -5036 -5037 -5038 -5039 -5040 -5041 -5042 -5043 -5044 -5045 -5046 -5047 -5048 -5049 -5050 -5051 -5052 -5053 -5054 -5055 -5056 -5057 -5058 -5059 -5060 -5061 -5062 -5063 -5064 -5065 -5066 -5067 -5068 -5069 -5070 -5071 -5072 -5073 -5074 -5075 -5076 -5077 -5078 -5079 -5080 -5081 -5082 -5083 -5084 -5085 -5086 -5087 -5088 -5089 -5090 -5091 -5092 -5093 -5094 -5095 -5096 -5097 -5098 -5099 -5100 -5101 -5102 -5103 -5104 -5105 -5106 -5107 -5108 -5109 -5110 -5111 -5112 -5113 -5114 -5115 -5116 -5117 -5118 -5119 -5120 -5121 -5122 -5123 -5124 -5125 -5126 -5127 -5128 -5129 -5130 -5131 -5132 -5133 -5134 -5135 -5136 -5137 -5138 -5139 -5140 -5141 -5142 -5143 -5144 -5145 -5146 -5147 -5148 -5149 -5150 -5151 -5152 -5153 -5154 -5155 -5156 -5157 -5158 -5159 -5160 -5161 -5162 -5163 -5164 -5165 -5166 -5167 -5168 -5169 -5170 -5171 -5172 -5173 -5174 -5175 -5176 -5177 -5178 -5179 -5180 -5181 -5182 -5183 -5184 -5185 -5186 -5187 -5188 -5189 -5190 -5191 -5192 -5193 -5194 -5195 -5196 -5197 -5198 -5199 -5200 -5201 -5202 -5203 -5204 -5205 -5206 -5207 -5208 -5209 -5210 -5211 -5212 -5213 -5214 -5215 -5216 -5217 -5218 -5219 -5220 -5221 -5222 -5223 -5224 -5225 -5226 -5227 -5228 -5229 -5230 -5231 -5232 -5233 -5234 -5235 -5236 -5237 -5238 -5239 -5240 -5241 -5242 -5243 -5244 -5245 -5246 -5247 -5248 -5249 -5250 -5251 -5252 -5253 -5254 -5255 -5256 -5257 -5258 -5259 -5260 -5261 -5262 -5263 -5264 -5265 -5266 -5267 -5268 -5269 -5270 -5271 -5272 -5273 -5274 -5275 -5276 -5277 -5278 -5279 -5280 -5281 -5282 -5283 -5284 -5285 -5286 -5287 -5288 -5289 -5290 -5291 -5292 -5293 -5294 -5295 -5296 -5297 -5298 -5299 -5300 -5301 -5302 -5303 -5304 -5305 -5306 -5307 -5308 -5309 -5310 -5311 -5312 -5313 -5314 -5315 -5316 -5317 -5318 -5319 -5320 -5321 -5322 -5323 -5324 -5325 -5326 -5327 -5328 -5329 -5330 -5331 -5332 -5333 -5334 -5335 -5336 -5337 -5338 -5339 -5340 -5341 -5342 -5343 -5344 -5345 -5346 -5347 -5348 -5349 -5350 -5351 -5352 -5353 -5354 -5355 -5356 -5357 -5358 -5359 -5360 -5361 -5362 -5363 -5364 -5365 -5366 -5367 -5368 -5369 -5370 -5371 -5372 -5373 -5374 -5375 -5376 -5377 -5378 -5379 -5380 -5381 -5382 -5383 -5384 -5385 -5386 -5387 -5388 -5389 -5390 -5391 -5392 -5393 -5394 -5395 -5396 -5397 -5398 -5399 -5400 -5401 -5402 -5403 -5404 -5405 -5406 -5407 -5408 -5409 -5410 -5411 -5412 -5413 -5414 -5415 -5416 -5417 -5418 -5419 -5420 -5421 -5422 -5423 -5424 -5425 -5426 -5427 -5428 -5429 -5430 -5431 -5432 -5433 -5434 -5435 -5436 -5437 -5438 -5439 -5440 -5441 -5442 -5443 -5444 -5445 -5446 -5447 -5448 -5449 -5450 -5451 -5452 -5453 -5454 -5455 -5456 -5457 -5458 -5459 -5460 -5461 -5462 -5463 -5464 -5465 -5466 -5467 -5468 -5469 -5470 -5471 -5472 -5473 -5474 -5475 -5476 -5477 -5478 -5479 -5480 -5481 -5482 -5483 -5484 -5485 -5486 -5487 -5488 -5489 -5490 -5491 -5492 -5493 -5494 -5495 -5496 -5497 -5498 -5499 -5500 -5501 -5502 -5503 -5504 -5505 -5506 -5507 -5508 -5509 -5510 -5511 -5512 -5513 -5514 -5515 -5516 -5517 -5518 -5519 -5520 -5521 -5522 -5523 -5524 -5525 -5526 -5527 -5528 -5529 -5530 -5531 -5532 -5533 -5534 -5535 -5536 -5537 -5538 -5539 -5540 -5541 -5542 -5543 -5544 -5545 -5546 -5547 -5548 -5549 -5550 -5551 -5552 -5553 -5554 -5555 -5556 -5557 -5558 -5559 -5560 -5561 -5562 -5563 -5564 -5565 -5566 -5567 -5568 -5569 -5570 -5571 -5572 -5573 -5574 -5575 -5576 -5577 -5578 -5579 -5580 -5581 -5582 -5583 -5584 -5585 -5586 -5587 -5588 -5589 -5590 -5591 -5592 -5593 -5594 -5595 -5596 -5597 -5598 -5599 -5600 -5601 -5602 -5603 -5604 -5605 -5606 -5607 -5608 -5609 -5610 -5611 -5612 -5613 -5614 -5615 -5616 -5617 -5618 -5619 -5620 -5621 -5622 -5623 -5624 -5625 -5626 -5627 -5628 -5629 -5630 -5631 -5632 -5633 -5634 -5635 -5636 -5637 -5638 -5639 -5640 -5641 -5642 -5643 -5644 -5645 -5646 -5647 -5648 -5649 -5650 -5651 -5652 -5653 -5654 -5655 -5656 -5657 -5658 -5659 -5660 -5661 -5662 -5663 -5664 -5665 -5666 -5667 -5668 -5669 -5670 -5671 -5672 -5673 -5674 -5675 -5676 -5677 -5678 -5679 -5680 -5681 -5682 -5683 -5684 -5685 -5686 -5687 -5688 -5689 -5690 -5691 -5692 -5693 -5694 -5695 -5696 -5697 -5698 -5699 -5700 -5701 -5702 -5703 -5704 -5705 -5706 -5707 -5708 -5709 -5710 -5711 -5712 -5713 -5714 -5715 -5716 -5717 -5718 -5719 -5720 -5721 -5722 -5723 -5724 -5725 -5726 -5727 -5728 -5729 -5730 -5731 -5732 -5733 -5734 -5735 -5736 -5737 -5738 -5739 -5740 -5741 -5742 -5743 -5744 -5745 -5746 -5747 -5748 -5749 -5750 -5751 -5752 -5753 -5754 -5755 -5756 -5757 -5758 -5759 -5760 -5761 -5762 -5763 -5764 -5765 -5766 -5767 -5768 -5769 -5770 -5771 -5772 -5773 -5774 -5775 -5776 -5777 -5778 -5779 -5780 -5781 -5782 -5783 -5784 -5785 -5786 -5787 -5788 -5789 -5790 -5791 -5792 -5793 -5794 -5795 -5796 -5797 -5798 -5799 -5800 -5801 -5802 -5803 -5804 -5805 -5806 -5807 -5808 -5809 -5810 -5811 -58121× -1× -  -  -1× -1× -  -  -1× -1× -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -  -1× -  -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -1× -  -  -1× -  -1× -  -  -1× -  -1× -  -  -1× -  -1× -  -1× -1× -  -  -  -  -  -  -1× -  -1× -  -  -  -  -1× -  -1× -  -1× -1× -  -  -  -  -  -  -  -  -  -1× -  -1× -  -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -  -  -  -1× -2× -2× -2× -2× -  -  -  -  -  -  -  -1× -  -  -  -2× -2× -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -1× -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -1× -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -1× -  -  -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -1× -1× -  -1× -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -1× -1× -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -1× -1× -1× -1× -1× -1× -1× -1× -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -7× -7× -7× -  -7× -2× -  -  -7× -3× -  -  -7× -2× -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -1× -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -2× -2× -2× -2× -  -2× -  -  -  -2× -  -  -  -2× -  -  -  -2× -  -  -  -  -1× -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -1× -1× - 
Iif (typeof GameLib == 'undefined') {
-    function GameLib() {}
-}
- 
-Eif (typeof GameLib.D3 == 'undefined') {
-    GameLib.D3 = function(){};
-}
- 
-Eif (typeof Q == 'undefined') {
-    Iif (typeof require == 'undefined') {
-        console.warn('You need the Q promise library for the GameLib.D3');
-        throw new Error('You need the Q promise library for the GameLib.D3');
-    }
- 
-    var Q = require('q');
-}
-/**
- * BoneWeight object - associates a vertex to a bone with some weight
- * @param boneIndex int
- * @param weight float
- * @constructor
- */
-GameLib.D3.BoneWeight = function(
-    boneIndex,
-    weight
-) {
-    this.boneIndex = boneIndex;
-    this.weight = weight;
-};
-/**
- * Bone Superset
- * @param id
- * @param name string
- * @param boneId
- * @param childBoneIds
- * @param parentBoneId
- * @param quaternion
- * @param position
- * @param rotation
- * @param scale GameLib.D3.Vector3
- * @param up
- * @constructor
- */
-GameLib.D3.Bone = function(
-    id,
-    boneId,
-    name,
-    childBoneIds,
-    parentBoneId,
-    quaternion,
-    position,
-    rotation,
-    scale,
-    up
-) {
-    this.id = id;
-    this.name = name;
-    this.boneId = boneId;
- 
-    Iif (typeof childBoneIds == 'undefined') {
-        childBoneIds = [];
-    }
-    this.childBoneIds = childBoneIds;
- 
-    Eif (typeof parentBoneId == 'undefined') {
-        parentBoneId = null;
-    }
-    this.parentBoneId = parentBoneId;
- 
-    Eif (typeof quaternion == 'undefined') {
-        quaternion = new GameLib.D3.Vector4();
-    }
-    this.quaternion = quaternion;
- 
-    Eif (typeof position == 'undefined') {
-        position = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.position = position;
- 
-    Eif (typeof rotation == 'undefined') {
-        rotation = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.rotation = rotation;
- 
-    Eif (typeof scale == 'undefined') {
-        scale = new GameLib.D3.Vector3(1,1,1);
-    }
-    this.scale = scale;
- 
-    Eif (typeof up == 'undefined') {
-        up = new GameLib.D3.Vector3(0,1,0);
-    }
-    this.up = up;
-};
-/**
- * Physics Broadphase Superset
- * @param id
- * @param name String
- * @param broadphaseType Number
- * @param engine GameLib.D3.Engine
- * @param createInstance Boolean
- * @constructor
- */
-GameLib.D3.Broadphase = function(
-    id,
-    name,
-    broadphaseType,
-    engine,
-    createInstance
-) {
-    this.id = id;
- 
-    Iif (typeof name == 'undefined') {
-        name = 'broadphase-' + broadphaseType;
-    }
-    this.name = name;
- 
-    Iif (typeof broadphaseType == 'undefined') {
-        broadphaseType = GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE;
-    }
-    this.broadphaseType = broadphaseType;
- 
-    Iif (typeof engine == 'undefined') {
-        engine = null;
-    }
-    this.engine = engine;
- 
-    this.instance = null;
- 
-    Eif (createInstance) {
-        this.createInstance();
-    }
-};
- 
-/**
- * Creates a custom Broadphase instance based on the engine type
- */
-GameLib.D3.Broadphase.prototype.createInstance = function() {
- 
-    Iif (!(this.engine instanceof GameLib.D3.Engine)) {
-        console.warn('No Engine');
-        throw new Error('No Engine');
-    }
- 
-    this.engine.isNotCannonThrow();
- 
-    var instance = null;
- 
-    Eif (this.broadphaseType == GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE) {
-        instance = new this.engine.instance.NaiveBroadphase();
-    } else if (this.broadphaseType == GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID) {
-        instance = new this.engine.instance.GridBroadphase();
-    } else if (this.broadphaseType == GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP) {
-        instance = new this.engine.instance.SAPBroardphase();
-    } else {
-        console.warn('Unsupported broadphase type: ' + this.broadphaseType);
-        throw new Error('Unsupported broadphase type: ' + this.broadphaseType);
-    }
- 
-    this.instance = instance;
- 
-    return instance;
-};
- 
-/**
- * Broadphase Types
- * @type {number}
- */
-GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE = 0x1;
-GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID = 0x2;
-GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP = 0x3;
-/**
- * Color Superset
- * @param r
- * @param g
- * @param b
- * @param a
- * @constructor
- */
-GameLib.D3.Color = function(r, g, b, a) {
-    this.r = r;
-    this.g = g;
-    this.b = b;
-    this.a = a;
-};
-/**
- * Engine Superset
- * @param engineType
- * @param instance {CANNON | Ammo | Goblin}
- * @constructor
- */
-GameLib.D3.Engine = function(
-    engineType,
-    instance
-) {
-    this.engineType = engineType;
-    this.instance = instance;
-};
- 
-/**
- * True if CANNON physics
- * @returns {boolean}
- */
-GameLib.D3.Engine.prototype.isCannon = function() {
-    return (this.engineType == GameLib.D3.Engine.ENGINE_TYPE_CANNON)
-};
- 
-/**
- * Logs a warning and throws an error if not cannon
- */
-GameLib.D3.Engine.prototype.isNotCannonThrow = function() {
-    Iif (this.engineType != GameLib.D3.Engine.ENGINE_TYPE_CANNON) {
-        console.warn('Only CANNON supported for this function');
-        throw new Error('Only CANNON supported for this function');
-    }
-};
- 
-/**
- * True if Ammo physics
- * @returns {boolean}
- */
-GameLib.D3.Engine.prototype.isAmmo = function() {
-    return (this.engineType == GameLib.D3.Engine.ENGINE_TYPE_AMMO)
-};
- 
-/**
- * True if Goblin physics
- * @returns {boolean}
- */
-GameLib.D3.Engine.prototype.isGoblin = function() {
-    return (this.engineType == GameLib.D3.Engine.ENGINE_TYPE_GOBLIN)
-};
- 
-/**
- * Physics GameLib.D3.Engine Types
- * @type {number}
- */
-GameLib.D3.Engine.ENGINE_TYPE_CANNON = 0x1;
-GameLib.D3.Engine.ENGINE_TYPE_AMMO = 0x2;
-GameLib.D3.Engine.ENGINE_TYPE_GOBLIN = 0x3;
-GameLib.D3.Entity = function(
-    meshId,
-    componentIds
-) {
-    this.meshId = meshId;
- 
-    if (typeof componentIds == 'undefined') {
-        componentIds = [];
-    }
- 
-    this.componentIds = componentIds;
-};
-/**
- * Fly Controls
- * @param camera
- * @param THREE
- * @param canvas
- * @constructor
- */
-GameLib.D3.FlyControls = function(
-    camera,
-    THREE,
-    canvas
-) {
-    this.flySpeed = 100;
- 
-    this.canvas = canvas;
- 
-    this.THREE = THREE;
- 
-    this.yaw = 0;
-    this.pitch = 0;
-    this.canRotate = false;
- 
-    this.moveForward = false;
-    this.moveBackward = false;
-    this.moveLeft = false;
-    this.moveRight = false;
-    this.moveUp = false;
-    this.moveDown = false;
- 
-    this.mouseUpCallback = this.onMouseUp.bind(this);
-    this.mouseDownCallback = this.onMouseDown.bind(this);
-    this.mouseMoveCallback = this.onMouseMove.bind(this);
-    this.mouseWheelCallback = this.onMouseWheel.bind(this);
-    this.keyDownCallback = this.onKeyDown.bind(this);
-    this.keyUpCallback = this.onKeyUp.bind(this);
- 
-    this.camera = camera;
- 
-    this.canvas.addEventListener('keydown', this.keyDownCallback, false);
-    this.canvas.addEventListener('keyup', this.keyUpCallback, false);
-    this.canvas.addEventListener('mousedown', this.mouseDownCallback, false);
-    this.canvas.addEventListener('mouseup', this.mouseUpCallback, false);
-    this.canvas.addEventListener('mousewheel', this.mouseWheelCallback, false);
- 
-    this.havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
-    this.element = document.body;
- 
-    if (this.havePointerLock) {
-        this.element.requestPointerLock = this.element.requestPointerLock || this.element.mozRequestPointerLock || this.element.webkitRequestPointerLock;
-        document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock;
-    }
-};
- 
-/**
- * Go forward / backward on mouse wheel
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onMouseWheel = function(event) {
-    this.moveForward = true;
-    this.applyTranslation(event.wheelDelta * 0.001);
-    event.preventDefault();
-    this.moveForward = false;
-};
- 
-/**
- * Start rotating the camera on mouse middle button down
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onMouseDown = function(event) {
-    if (event.button == 1) {
-        this.canRotate = true;
-        this.canvas.addEventListener('mousemove', this.mouseMoveCallback, false);
-    }
-};
- 
-/**
- * Stop rotating on middle mouse button down
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onMouseUp = function(event) {
-    if (event.button == 1) {
-        this.canRotate = false;
-        this.canvas.removeEventListener('mousemove', this.mouseMoveCallback);
-    }
-};
- 
-/**
- * Apply current yaw and pitch to camera
- */
-GameLib.D3.FlyControls.prototype.applyRotation = function() {
-    this.camera.rotation.set(this.pitch, this.yaw, 0, "YXZ");
-};
- 
-/**
- * Apply current position to camera
- * @param deltaTime
- */
-GameLib.D3.FlyControls.prototype.applyTranslation = function(deltaTime) {
-    var direction = new this.THREE.Vector3(0, 0, -1);
-    var rotation = new this.THREE.Euler(0, 0, 0, "YXZ");
-    rotation.set(this.pitch, this.yaw, 0, "YXZ");
- 
-    direction = direction.applyEuler(rotation);
- 
-    var forward = direction.normalize();
-    var right = forward.cross(new this.THREE.Vector3(0, 1, 0));
- 
-    if(this.moveForward) {
- 
-        this.camera.position.x += forward.x * (deltaTime * this.flySpeed);
-        this.camera.position.y += forward.y * (deltaTime * this.flySpeed);
-        this.camera.position.z += forward.z * (deltaTime * this.flySpeed);
- 
-    } else if(this.moveBackward) {
- 
-        this.camera.position.x -= forward.x * (deltaTime * this.flySpeed);
-        this.camera.position.y -= forward.y * (deltaTime * this.flySpeed);
-        this.camera.position.z -= forward.z * (deltaTime * this.flySpeed);
-    }
- 
-    if(this.moveLeft) {
- 
-        this.camera.position.x -= right.x * (deltaTime * this.flySpeed);
-        this.camera.position.y -= right.y * (deltaTime * this.flySpeed);
-        this.camera.position.z -= right.z * (deltaTime * this.flySpeed);
- 
-    } else if(this.moveRight) {
- 
-        this.camera.position.x += right.x * (deltaTime * this.flySpeed);
-        this.camera.position.y += right.y * (deltaTime * this.flySpeed);
-        this.camera.position.z += right.z * (deltaTime * this.flySpeed);
-    }
- 
-    if(this.moveUp) {
- 
-        this.camera.position.y += (deltaTime * this.flySpeed);
- 
-    } else if(this.moveDown) {
- 
-        this.camera.position.y -= (deltaTime * this.flySpeed);
- 
-    }
-};
- 
-/**
- * This update function should be called from the animation function in order to apply the 'frame rate independent'
- * movement to the camera
- * @param deltaTime
- */
-GameLib.D3.FlyControls.prototype.update = function(deltaTime) {
-    this.applyRotation();
-    this.applyTranslation(deltaTime);
-};
- 
-/**
- * Rotate on mouse move
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onMouseMove = function ( event ) {
-    if (this.canRotate) {
-        var movementX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
-        var movementY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
- 
-        this.yaw -= movementX * 0.002;
-        this.pitch -= movementY * 0.002;
-    }
-};
- 
-/**
- * Keyboard controls
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onKeyDown = function ( event ) {
-    switch ( event.keyCode ) {
- 
-        case 87: // w
-            this.moveForward = true;
-            break;
- 
-        case 65: // a
-            this.moveLeft = true;
-            break;
- 
-        case 83: // s
-            this.moveBackward = true;
-            break;
- 
-        case 68: // d
-            this.moveRight = true;
-            break;
- 
-        case 104: // keypad up arrow
-            this.moveUp = true;
-            break;
- 
-        case 98: // keypad down arrow
-            this.moveDown = true;
-            break;
-    }
-};
- 
-/**
- * Keyboard controls
- * @param event
- */
-GameLib.D3.FlyControls.prototype.onKeyUp = function ( event ) {
-    switch ( event.keyCode ) {
- 
-        case 38: // up
-        case 87: // w
-            this.moveForward = false;
-            break;
- 
-        case 37: // left
-        case 65: // a
-            this.moveLeft = false;
-            break;
- 
-        case 40: // down
-        case 83: // s
-            this.moveBackward = false;
-            break;
- 
-        case 39: // right
-        case 68: // d
-            this.moveRight = false;
-            break;
- 
-        case 104: // keypad up arrow
-            this.moveUp = false;
-            break;
- 
-        case 98: // keypad down arrow
-            this.moveDown = false;
-            break;
-    }
-};
-GameLib.D3.Game = function (
- 
-) {
-    this.scenes = {};
-    this.physicsWorlds = [];
-    this.sceneToPhysicsWorldsMap = {};
-};
- 
-GameLib.D3.Game.prototype.AddScene = function(
-    scene
-) {
-    this.scenes[scene.name] = scene;
-};
- 
-GameLib.D3.Game.prototype.AddPhysicsWorld = function(
-    physicsWorld
-) {
-    this.physicsWorlds.push(physicsWorld);
-};
- 
-GameLib.D3.Game.prototype.LinkPhysicsWorldToScene = function(
-    physicsWorld,
-    scene
-) {
-    this.sceneToPhysicsWorldsMap[scene.name] = this.sceneToPhysicsWorldsMap[scene.name] || [];
-    this.sceneToPhysicsWorldsMap[scene.name].push(physicsWorld);
-};
- 
-GameLib.D3.Game.prototype.GetPhysicsWorldsForScene = function (
-    scene
-) {
-    return this.sceneToPhysicsWorldsMap[scene.name];
-};
- 
-GameLib.D3.Game.prototype.ProcessPhysics = function (
-    timestep
-) {
-    for(var s in this.sceneToPhysicsWorldsMap) {
- 
-        var physicsWorldArray = this.sceneToPhysicsWorldsMap[s];
-        var scene = this.scenes[s];
- 
-        if(scene && physicsWorldArray) {
- 
-            for(var i = 0, l = physicsWorldArray.length; i < l; i++) {
- 
-                var physicsWorld = physicsWorldArray[i];
-                physicsWorld.Step(timestep);
- 
-                for(var p in physicsWorld.linkedPairs) {
-                    var pair = physicsWorld.linkedPairs[p];
-                    var mesh = pair.threeMesh;
-                    var body = pair.physicsBody;
- 
-                    if(mesh) {
-                        if(physicsWorld.engineType === GameLib.D3.Physics.TYPE_CANNON) {
- 
-                            var quaternion = new THREE.Quaternion();
-                            quaternion.copy(body.rigidBodyInstance.quaternion);
- 
-                            var quaternionCopy = quaternion.clone();
- 
-                            var position = new THREE.Vector3();
-                            position.copy(body.rigidBodyInstance.position);
- 
-                            if(mesh.permutate) {
- 
-                                if(mesh.permutate.offset) {
-                                    if(mesh.permutate.offset.quaternion) {
-                                        var offsetQuaternion = new THREE.Quaternion();
-                                        offsetQuaternion.copy(mesh.permutate.offset.quaternion);
-                                        quaternion = quaternion.multiply(offsetQuaternion).normalize();
-                                    }
- 
-                                    if(mesh.permutate.offset.position) {
-                                        var offsetPosition = new THREE.Vector3();
-                                        offsetPosition.copy(mesh.permutate.offset.position);
-                                        //position = position.add(offsetPosition);
-                                        position = position.add(offsetPosition.applyQuaternion(quaternionCopy));
-                                    }
-                                }
-                            }
- 
-                            mesh.position.copy(position);
-                            mesh.quaternion.copy(quaternion);
-                        }
-                    }
-                }
-            }
-        }
- 
-    }
-};
- 
-GameLib.D3.Game.prototype.LinkPair = function (
-    threeMesh,
-    physicsBody,
-    physicsWorld
-) {
-    physicsWorld.linkedPairs = physicsWorld.linkedPairs || [];
- 
-    physicsWorld.linkedPairs.push({
-        threeMesh : threeMesh,
-        physicsBody : physicsBody
-    });
-};
-/**
- * Graphics Superset
- * @param graphicsType
- * @param instance {THREE}
- * @constructor
- */
-GameLib.D3.Graphics = function(
-    graphicsType,
-    instance
-) {
-    this.graphicsType = graphicsType;
-    this.instance = instance;
-};
- 
-/**
- * True if THREE physics
- * @returns {boolean}
- */
-GameLib.D3.Graphics.prototype.isThree = function() {
-    return (this.graphicsType == GameLib.D3.Graphics.GRAPHICS_TYPE_THREE)
-};
- 
-/**
- * Logs a warning and throws an error if not cannon
- */
-GameLib.D3.Graphics.prototype.isNotThreeThrow = function() {
-    if (this.graphicsType != GameLib.D3.Graphics.GRAPHICS_TYPE_THREE) {
-        console.warn('Only THREE supported for this function');
-        throw new Error('Only THREE supported for this function');
-    }
-};
- 
-/**
- * Physics GameLib.D3.Graphics Types
- * @type {number}
- */
-GameLib.D3.Graphics.GRAPHICS_TYPE_THREE = 0x1;
-/**
- * @param sizeX Number
- * @param sizeY Number
- * @param matrix matrix 2D Array with height data (Column Major)
- * @param elementSize Number
- * @param heightScale Number
- * @constructor
- */
-GameLib.D3.Heightmap = function(
-    sizeX,
-    sizeY,
-    matrix,
-    elementSize,
-    heightScale
-) {
-    if (typeof sizeX == 'undefined') {
-        sizeX = 0;
-    }
-    this.sizeX = sizeX;
- 
-    if (typeof sizeY == 'undefined') {
-        sizeY = 0;
-    }
-    this.sizeY = sizeY;
- 
-    if (typeof matrix == 'undefined') {
-        matrix = [];
-    }
-    this.matrix = matrix;
- 
-    if (typeof elementSize == 'undefined') {
-        elementSize = 10;
-    }
-    this.elementSize = elementSize;
- 
-    if (typeof heightScale == 'undefined') {
-        heightScale = 15;
-    }
-    this.elementSize = heightScale;
-};
- 
-/**
- * Creates a graphics instance mesh from the graphics, physics and physics shape
- * @param graphics GameLib.D3.Graphics
- * @param shape GameLib.D3.Shape
- * @param engine GameLib.D3.Engine
- * @returns {THREE.Mesh|this.meshes}
- */
-GameLib.D3.Heightmap.GenerateInstanceMesh = function(
-    graphics,
-    shape,
-    engine
-) {
-    graphics.isNotThreeThrow();
-    engine.isNotCannonThrow();
- 
-    var geometry = new graphics.instance.Geometry();
- 
-    var v0 = new engine.instance.Vec3();
-    var v1 = new engine.instance.Vec3();
-    var v2 = new engine.instance.Vec3();
- 
-     for (var xi = 0; xi < shape.instance.data.length - 1; xi++) {
-        for (var yi = 0; yi < shape.instance.data[xi].length - 1; yi++) {
-            for (var k = 0; k < 2; k++) {
-                shape.instance.getConvexTrianglePillar(xi, yi, k===0);
-                v0.copy(shape.instance.pillarConvex.vertices[0]);
-                v1.copy(shape.instance.pillarConvex.vertices[1]);
-                v2.copy(shape.instance.pillarConvex.vertices[2]);
-                v0.vadd(shape.instance.pillarOffset, v0);
-                v1.vadd(shape.instance.pillarOffset, v1);
-                v2.vadd(shape.instance.pillarOffset, v2);
-                geometry.vertices.push(
-                    new graphics.instance.Vector3(v0.x, v0.y, v0.z),
-                    new graphics.instance.Vector3(v1.x, v1.y, v1.z),
-                    new graphics.instance.Vector3(v2.x, v2.y, v2.z)
-                );
-                var i = geometry.vertices.length - 3;
-                geometry.faces.push(new graphics.instance.Face3(i, i+1, i+2));
-            }
-        }
-    }
-    geometry.computeBoundingSphere();
-    geometry.computeFaceNormals();
- 
-    return new graphics.instance.Mesh(
-        geometry,
-        new graphics.instance.MeshNormalMaterial(
-            {
-                wireframe: false,
-                shading : graphics.instance.SmoothShading
-            }
-        )
-    );
-};
- 
-/**
- * Needs an RGBA
- * @param imagePath string
- * @param heightScale
- * @param callback
- * @constructor
- */
-GameLib.D3.Heightmap.GenerateHeightmapDataFromImage = function (
-    imagePath,
-    heightScale,
-    callback
-) {
-    var img = new Image();
- 
-    img.onload = function () {
- 
-        var canvas = document.createElement('canvas');
-        canvas.width = img.width;
-        canvas.height = img.height;
- 
-        var context = canvas.getContext('2d');
-        context.drawImage(img, 0, 0);
- 
-        var imgd = context.getImageData(0, 0, img.width, img.height);
-        var pixels = imgd.data;
- 
-        var heightList = [];
-        for (var i = 0, n = pixels.length; i < n; i += (4)) {
-            heightList.push(pixels[i]);
-        }
- 
-        var matrix = [];
-        var sizeX = img.width,
-            sizeY = img.height;
- 
-        for (var x = 0; x < sizeX; x++) {
-            matrix.push([]);
-            for (var j = 0; j < sizeY; j++) {
-                var height = (heightList[(sizeX - x) + j * sizeY] / 255) * heightScale;
-                matrix[x].push(height);
-            }
-        }
- 
-        // todo: delete canvas here
- 
-        callback(
-            new GameLib.D3.Heightmap(
-                sizeX,
-                sizeY,
-                matrix,
-                10,
-                heightScale
-            )
-        );
-    };
- 
-    img.src = imagePath;
-};
-/**
- * Image
- * @param id
- * @param textureLink
- * @param filename
- * @param size
- * @param contentType
- * @constructor
- */
-GameLib.D3.Image = function(
-    id,
-    textureLink,
-    filename,
-    size,
-    contentType
-) {
-    this.id = id;
- 
-    this.filename = filename;
- 
-    this.textureLink = textureLink;
- 
-    if (typeof size == 'undefined') {
-        size = 0;
-    }
-    this.size = size;
- 
-    if (typeof contentType == 'undefined') {
- 
-        contentType = 'application/octet-stream';
- 
-        if (this.filename.match(/(png)$/i)) {
-            contentType = 'image/png';
-        }
- 
-        if (this.filename.match(/(jpg|jpeg)$/i)) {
-            contentType = 'image/jpeg';
-        }
- 
-        if (this.filename.match(/(gif)$/i)) {
-            contentType = 'image/gif';
-        }
-    }
-    this.contentType = contentType;
-};
-/**
- * Light Superset
- * @param id
- * @param lightType
- * @param name
- * @param color
- * @param intensity
- * @param position
- * @param targetPosition
- * @param quaternion
- * @param rotation
- * @param scale
- * @param distance
- * @param decay
- * @param power
- * @param angle
- * @param penumbra
- * @constructor
- */
-GameLib.D3.Light = function(
-    id,
-    lightType,
-    name,
-    color,
-    intensity,
-    position,
-    targetPosition,
-    quaternion,
-    rotation,
-    scale,
-    distance,
-    decay,
-    power,
-    angle,
-    penumbra
-) {
-    this.id = id;
-    this.lightType = lightType;
-    this.name = name;
-    this.color = color;
-    this.intensity = intensity;
- 
-    if (typeof position == 'undefined') {
-        position = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.position = position;
- 
-    if (typeof targetPosition == 'undefined') {
-        targetPosition = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.targetPosition = targetPosition;
- 
-    if (typeof quaternion == 'undefined'){
-        quaternion = new GameLib.D3.Vector4();
-    }
-    this.quaternion = quaternion;
- 
-    if (typeof rotation == 'undefined'){
-        rotation = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.rotation = rotation;
- 
-    if (typeof scale == 'undefined'){
-        scale = new GameLib.D3.Vector3(1,1,1);
-    }
-    this.scale = scale;
- 
-    if (typeof distance == 'undefined'){
-        distance = 0;
-    }
-    this.distance = distance;
- 
-    if (typeof decay == 'undefined'){
-        decay = 1;
-    }
-    this.decay = decay;
- 
-    if (typeof power == 'undefined'){
-        power = 4 * Math.PI;
-    }
-    this.power = power;
- 
-    if (typeof angle == 'undefined'){
-        angle = Math.PI / 3;
-    }
-    this.angle = angle;
- 
-    if (typeof penumbra == 'undefined'){
-        penumbra = 0;
-    }
-    this.penumbra = penumbra;
-};
-/**
- * Material Superset
- * @param id
- * @param name
- * @param materialType
- * @param opacity
- * @param side
- * @param transparent
- * @param maps
- * @param specular
- * @param lightMapIntensity
- * @param aoMapIntensity
- * @param color
- * @param emissive
- * @param emissiveIntensity
- * @param combine
- * @param shininess
- * @param reflectivity
- * @param refractionRatio
- * @param fog
- * @param wireframe
- * @param wireframeLineWidth
- * @param wireframeLineCap
- * @param wireframeLineJoin
- * @param vertexColors
- * @param skinning
- * @param morphTargets
- * @param morphNormals
- * @param lineWidth
- * @param lineCap
- * @param lineJoin
- * @param dashSize
- * @param gapWidth
- * @param blending
- * @param blendSrc
- * @param blendDst
- * @param blendEquation
- * @param depthTest
- * @param depthFunc
- * @param depthWrite
- * @param polygonOffset
- * @param polygonOffsetFactor
- * @param polygonOffsetUnits
- * @param alphaTest
- * @param clippingPlanes
- * @param clipShadows
- * @param visible
- * @param overdraw
- * @param shading
- * @param bumpScale
- * @param normalScale
- * @param displacementScale
- * @param displacementBias
- * @param roughness
- * @param metalness
- * @param pointSize
- * @param pointSizeAttenuation
- * @param spriteRotation
- * @param envMapIntensity
- * @constructor
- */
-GameLib.D3.Material = function(
-    id,
-    name,
-    materialType,
-    opacity,
-    side,
-    transparent,
-    maps,
-    specular,
-    lightMapIntensity,
-    aoMapIntensity,
-    color,
-    emissive,
-    emissiveIntensity,
-    combine,
-    shininess,
-    reflectivity,
-    refractionRatio,
-    fog,
-    wireframe,
-    wireframeLineWidth,
-    wireframeLineCap,
-    wireframeLineJoin,
-    vertexColors,
-    skinning,
-    morphTargets,
-    morphNormals,
-    lineWidth,
-    lineCap,
-    lineJoin,
-    dashSize,
-    gapWidth,
-    blending,
-    blendSrc,
-    blendDst,
-    blendEquation,
-    depthTest,
-    depthFunc,
-    depthWrite,
-    polygonOffset,
-    polygonOffsetFactor,
-    polygonOffsetUnits,
-    alphaTest,
-    clippingPlanes,
-    clipShadows,
-    visible,
-    overdraw,
-    shading,
-    bumpScale,
-    normalScale,
-    displacementScale,
-    displacementBias,
-    roughness,
-    metalness,
-    pointSize,
-    pointSizeAttenuation,
-    spriteRotation,
-    envMapIntensity
-) {
-    this.id = id;
-    this.name = name;
-    if (typeof materialType == 'undefined') {
-        materialType = GameLib.D3.Material.TYPE_MESH_STANDARD;
-    }
-    this.materialType = materialType;
- 
-    if (typeof opacity == 'undefined') {
-        opacity = 1.0;
-    }
-    this.opacity = opacity;
- 
-    if (typeof side == 'undefined') {
-        side = GameLib.D3.Material.TYPE_FRONT_SIDE;
-    }
-    this.side = side;
- 
-    if (typeof transparent == 'undefined') {
-        transparent = false;
-    }
-    this.transparent = transparent;
- 
-    if (typeof maps == 'undefined') {
-        maps = {
-            alpha: null,
-            ao: null,
-            bump: null,
-            diffuse: null,
-            displacement: null,
-            emissive: null,
-            environment: null,
-            light: null,
-            metalness: null,
-            normal: null,
-            roughness: null,
-            specular: null
-        };
-    }
-    this.maps = maps;
- 
-    if (typeof specular == 'undefined') {
-        specular = new GameLib.D3.Color(0.06, 0.06, 0.06, 0.06);
-    }
-    this.specular = specular;
- 
-    if (typeof lightMapIntensity == 'undefined') {
-        lightMapIntensity = 1;
-    }
-    this.lightMapIntensity = lightMapIntensity;
- 
-    if (typeof aoMapIntensity == 'undefined') {
-        aoMapIntensity = 1;
-    }
-    this.aoMapIntensity = aoMapIntensity;
- 
-    if (typeof color == 'undefined') {
-        color = new GameLib.D3.Color(1, 1, 1, 1)
-    }
-    this.color = color;
- 
-    if (typeof emissive == 'undefined') {
-        emissive = new GameLib.D3.Color(0, 0, 0, 0);
-    }
-    this.emissive = emissive;
- 
-    if (typeof emissiveIntensity == 'undefined') {
-        emissiveIntensity = 1;
-    }
-    this.emissiveIntensity = emissiveIntensity;
- 
-    if (typeof combine == 'undefined') {
-        combine = GameLib.D3.Material.TYPE_MULTIPLY_OPERATION;
-    }
-    this.combine = combine;
- 
-    if (typeof shininess == 'undefined') {
-        shininess = 30;
-    }
-    this.shininess = shininess;
- 
-    if (typeof reflectivity == 'undefined') {
-        reflectivity = 1;
-    }
-    this.reflectivity = reflectivity;
- 
-    if (typeof refractionRatio == 'undefined') {
-        refractionRatio = 0.98;
-    }
-    this.refractionRatio = refractionRatio;
- 
-    if (typeof fog == 'undefined') {
-        fog = true;
-    }
-    this.fog = fog;
- 
-    if (typeof wireframe == 'undefined') {
-        wireframe = false;
-    }
-    this.wireframe = wireframe;
- 
-    if (typeof wireframeLineWidth == 'undefined') {
-        wireframeLineWidth = 1;
-    }
-    this.wireframeLineWidth = wireframeLineWidth;
- 
-    if (typeof wireframeLineCap == 'undefined') {
-        wireframeLineCap = 'round';
-    }
-    this.wireframeLineCap = wireframeLineCap;
- 
-    if (typeof wireframeLineJoin == 'undefined') {
-        wireframeLineJoin = 'round';
-    }
-    this.wireframeLineJoin = wireframeLineJoin;
- 
-    if (typeof vertexColors == 'undefined') {
-        vertexColors = GameLib.D3.Material.TYPE_NO_COLORS;
-    }
-    this.vertexColors = vertexColors;
- 
-    if (typeof skinning == 'undefined') {
-        skinning = false;
-    }
-    this.skinning = skinning;
- 
-    if (typeof morphTargets == 'undefined') {
-        morphTargets = false;
-    }
-    this.morphTargets = morphTargets;
- 
-    if (typeof morphNormals == 'undefined') {
-        morphNormals = false;
-    }
-    this.morphNormals = morphNormals;
- 
-    if (typeof overdraw == 'undefined') {
-        overdraw = 0;
-    }
-    this.overdraw = overdraw;
- 
-    if (typeof lineWidth == 'undefined') {
-        lineWidth = 1;
-    }
-    this.lineWidth = lineWidth;
- 
-    if (typeof lineCap == 'undefined') {
-        lineCap = 'round';
-    }
-    this.lineCap = lineCap;
- 
-    if (typeof lineJoin == 'undefined') {
-        lineJoin = 'round';
-    }
-    this.lineJoin = lineJoin;
- 
-    if (typeof dashSize == 'undefined') {
-        dashSize = 3;
-    }
-    this.dashSize = dashSize;
- 
-    if (typeof gapWidth == 'undefined') {
-        gapWidth = 1;
-    }
-    this.gapWidth = gapWidth;
- 
-    if (typeof blending == 'undefined') {
-        blending = GameLib.D3.Material.TYPE_NORMAL_BLENDING;
-    }
-    this.blending = blending;
- 
-    if (typeof blendSrc == 'undefined') {
-        blendSrc = GameLib.D3.Material.TYPE_SRC_ALPHA_FACTOR;
-    }
-    this.blendSrc = blendSrc;
- 
-    if (typeof blendDst == 'undefined') {
-        blendDst = GameLib.D3.Material.TYPE_ONE_MINUS_SRC_ALPHA_FACTOR;
-    }
-    this.blendDst = blendDst;
- 
-    if (typeof blendEquation == 'undefined') {
-        blendEquation = GameLib.D3.Material.TYPE_ADD_EQUATION;
-    }
-    this.blendEquation = blendEquation;
- 
-    if (typeof depthTest == 'undefined') {
-        depthTest = true;
-    }
-    this.depthTest = depthTest;
- 
-    if (typeof depthFunc == 'undefined') {
-        depthFunc = GameLib.D3.Material.TYPE_LESS_EQUAL_DEPTH;
-    }
-    this.depthFunc = depthFunc;
- 
-    if (typeof depthWrite == 'undefined') {
-        depthWrite = true;
-    }
-    this.depthWrite = depthWrite;
- 
-    if (typeof polygonOffset == 'undefined') {
-        polygonOffset = false;
-    }
-    this.polygonOffset = polygonOffset;
- 
-    if (typeof polygonOffsetFactor == 'undefined') {
-        polygonOffsetFactor = 1;
-    }
-    this.polygonOffsetFactor = polygonOffsetFactor;
- 
-    if (typeof polygonOffsetUnits == 'undefined') {
-        polygonOffsetUnits = 1;
-    }
-    this.polygonOffsetUnits = polygonOffsetUnits;
- 
-    if (typeof alphaTest == 'undefined') {
-        alphaTest = 0;
-    }
-    this.alphaTest = alphaTest;
- 
-    if (typeof clippingPlanes == 'undefined') {
-        clippingPlanes = [];
-    }
-    this.clippingPlanes = clippingPlanes;
- 
-    if (typeof clipShadows == 'undefined') {
-        clipShadows = false;
-    }
-    this.clipShadows = clipShadows;
- 
-    if (typeof visible == 'undefined') {
-        visible = true;
-    }
-    this.visible = visible;
- 
-    if (typeof shading == 'undefined') {
-        shading = GameLib.D3.Material.TYPE_FLAT_SHADING;
-    }
-    this.shading = shading;
- 
-    if (typeof bumpScale == 'undefined') {
-        bumpScale = 1;
-    }
-    this.bumpScale = bumpScale;
- 
-    if (typeof normalScale == 'undefined') {
-        normalScale = 1;
-    }
-    this.normalScale = normalScale;
- 
-    if (typeof displacementScale == 'undefined') {
-        displacementScale = 1;
-    }
-    this.displacementScale = displacementScale;
- 
-    if (typeof displacementBias == 'undefined') {
-        displacementBias = 0;
-    }
-    this.displacementBias = displacementBias;
- 
-    if (typeof roughness == 'undefined') {
-        roughness = 0.5;
-    }
-    this.roughness = roughness;
- 
-    if (typeof metalness == 'undefined') {
-        metalness = 0.5;
-    }
-    this.metalness = metalness;
- 
-    if (typeof pointSize == 'undefined') {
-        pointSize = 1;
-    }
-    this.pointSize = pointSize;
- 
-    if (typeof pointSizeAttenuation == 'undefined') {
-        pointSizeAttenuation = true;
-    }
-    this.pointSizeAttenuation = pointSizeAttenuation;
- 
-    if (typeof spriteRotation == 'undefined') {
-        spriteRotation = 0;
-    }
-    this.spriteRotation = spriteRotation;
- 
-    if (typeof envMapIntensity == 'undefined') {
-        envMapIntensity = 1.0;
-    }
-    this.envMapIntensity = envMapIntensity;
- 
-};
- 
-/**
- * Combine Method
- * @type {number}
- */
-GameLib.D3.Material.TYPE_MULTIPLY_OPERATION = 0;
-GameLib.D3.Material.TYPE_MIX_OPERATION = 1;
-GameLib.D3.Material.TYPE_ADD_OPERATION = 2;
- 
-/**
- * Vertex Color Mode
- * @type {number}
- */
-GameLib.D3.Material.TYPE_NO_COLORS = 0;
-GameLib.D3.Material.TYPE_FACE_COLORS = 1;
-GameLib.D3.Material.TYPE_VERTEX_COLORS = 2;
- 
-/**
- * Blending Mode
- * @type {number}
- */
-GameLib.D3.Material.TYPE_NORMAL_BLENDING = 1;
-GameLib.D3.Material.TYPE_ADDITIVE_BLENDING = 2;
-GameLib.D3.Material.TYPE_SUBTRACTIVE_BLENDING = 3;
-GameLib.D3.Material.TYPE_MULTIPLY_BLENDING = 4;
-GameLib.D3.Material.TYPE_CUSTOM_BLENDING = 5;
- 
-/**
- * Blend Source and Destination
- * @type {number}
- */
-GameLib.D3.Material.TYPE_ZERO_FACTOR = 200;
-GameLib.D3.Material.TYPE_ONE_FACTOR = 201;
-GameLib.D3.Material.TYPE_SRC_COLOR_FACTOR = 202;
-GameLib.D3.Material.TYPE_ONE_MINUS_SRC_COLOR_FACTOR = 203;
-GameLib.D3.Material.TYPE_SRC_ALPHA_FACTOR = 204;
-GameLib.D3.Material.TYPE_ONE_MINUS_SRC_ALPHA_FACTOR = 205;
-GameLib.D3.Material.TYPE_DST_ALPHA_FACTOR = 206;
-GameLib.D3.Material.TYPE_ONE_MINUS_DST_ALPHA_FACTOR = 207;
-GameLib.D3.Material.TYPE_DST_COLOR_FACTOR = 208;
-GameLib.D3.Material.TYPE_ONE_MINUS_DST_COLOR_FACTOR = 209;
-GameLib.D3.Material.TYPE_SRC_ALPHA_SATURATE_FACTOR = 210;
- 
-/**
- * Blend Operation
- * @type {number}
- */
-GameLib.D3.Material.TYPE_ADD_EQUATION = 100;
-GameLib.D3.Material.TYPE_SUBTRACT_EQUATION = 101;
-GameLib.D3.Material.TYPE_REVERSE_SUBTRACT_EQUATION = 102;
-GameLib.D3.Material.TYPE_MIN_EQUATION = 103;
-GameLib.D3.Material.TYPE_MAX_EQUATION = 104;
- 
-/**
- * Depth Function
- * @type {number}
- */
-GameLib.D3.Material.TYPE_NEVER_DEPTH = 0;
-GameLib.D3.Material.TYPE_ALWAYS_DEPTH = 1;
-GameLib.D3.Material.TYPE_LESS_DEPTH = 2;
-GameLib.D3.Material.TYPE_LESS_EQUAL_DEPTH = 3;
-GameLib.D3.Material.TYPE_EQUAL_DEPTH = 4;
-GameLib.D3.Material.TYPE_GREATER_EQUAL_DEPTH = 5;
-GameLib.D3.Material.TYPE_GREATER_DEPTH = 6;
-GameLib.D3.Material.TYPE_NOT_EQUAL_DEPTH = 7;
- 
-/**
- * Culling Mode
- * @type {number}
- */
-GameLib.D3.Material.TYPE_FRONT_SIDE = 0;
-GameLib.D3.Material.TYPE_BACK_SIDE = 1;
-GameLib.D3.Material.TYPE_DOUBLE_SIDE = 2;
- 
-/**
- * Shading Type
- * @type {number}
- */
-GameLib.D3.Material.TYPE_FLAT_SHADING = 1;
-GameLib.D3.Material.TYPE_SMOOTH_SHADING = 2;
- 
-/**
- * Material Type
- * @type {string}
- */
-GameLib.D3.Material.TYPE_LINE_BASIC    = "LineBasicMaterial";
-GameLib.D3.Material.TYPE_LINE_DASHED   = "LineDashedMaterial";
-GameLib.D3.Material.TYPE_MESH_BASIC    = "MeshBasicMaterial";
-GameLib.D3.Material.TYPE_MESH_DEPTH    = "MeshDepthMaterial";
-GameLib.D3.Material.TYPE_MESH_LAMBERT  = "MeshLambertMaterial";
-GameLib.D3.Material.TYPE_MESH_NORMAL   = "MeshNormalMaterial";
-GameLib.D3.Material.TYPE_MESH_PHONG    = "MeshPhongMaterial";
-GameLib.D3.Material.TYPE_MESH_STANDARD = "MeshStandardMaterial";
-GameLib.D3.Material.TYPE_POINTS        = "PointsMaterial";
-GameLib.D3.Material.TYPE_SPRITE        = "SpriteMaterial";
-GameLib.D3.Material.TYPE_MULTI_MATERIAL= "MultiMaterial";
- 
-/**
- * Creates an instance Material from a GameLib.D3.Material
- * @param gameLibMaterial GameLib.D3.Material
- * @param graphics GameLib.D3.Graphics
- * @param uploadUrl String
- * @param progressCallback
- */
-GameLib.D3.Material.createInstanceMaterial = function(
-    gameLibMaterial,
-    graphics,
-    uploadUrl,
-    progressCallback
-) {
- 
-    var defer = Q.defer();
- 
-    var instanceMaterial = null;
- 
-    var blenderMaps = [];
- 
-    if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) {
- 
-        instanceMaterial = new graphics.instance.MeshStandardMaterial({
-            name: gameLibMaterial.name,
-            opacity: gameLibMaterial.opacity,
-            transparent: gameLibMaterial.transparent,
-            blending: gameLibMaterial.blending,
-            blendSrc: gameLibMaterial.blendSrc,
-            blendDst: gameLibMaterial.blendDst,
-            blendEquation: gameLibMaterial.blendEquation,
-            depthTest: gameLibMaterial.depthTest,
-            depthFunc: gameLibMaterial.depthFunc,
-            depthWrite: gameLibMaterial.depthWrite,
-            polygonOffset: gameLibMaterial.polygonOffset,
-            polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor,
-            polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits,
-            alphaTest: gameLibMaterial.alphaTest,
-            clippingPlanes: gameLibMaterial.clippingPlanes,
-            clipShadows: gameLibMaterial.clipShadows,
-            overdraw: gameLibMaterial.overdraw,
-            visible: gameLibMaterial.visible,
-            side: gameLibMaterial.side,
-            color: new graphics.instance.Color(
-                gameLibMaterial.color.r,
-                gameLibMaterial.color.g,
-                gameLibMaterial.color.b
-            ),
-            roughness: gameLibMaterial.roughness,
-            metalness: gameLibMaterial.metalness,
-            lightMapIntensity: gameLibMaterial.lightMapIntensity,
-            aoMapIntensity: gameLibMaterial.aoMapIntensity,
-            emissive: new graphics.instance.Color(
-                gameLibMaterial.emissive.r,
-                gameLibMaterial.emissive.g,
-                gameLibMaterial.emissive.b
-            ),
-            emissiveIntensity: gameLibMaterial.emissiveIntensity,
-            bumpScale: gameLibMaterial.bumpScale,
-            normalScale: gameLibMaterial.normalScale,
-            displacementScale: gameLibMaterial.displacementScale,
-            refractionRatio: gameLibMaterial.refractionRatio,
-            fog: gameLibMaterial.fog,
-            shading: gameLibMaterial.shading,
-            wireframe: gameLibMaterial.wireframe,
-            wireframeLinewidth: gameLibMaterial.wireframeLineWidth,
-            wireframeLinecap: gameLibMaterial.wireframeLineCap,
-            wireframeLinejoin: gameLibMaterial.wireframeLineJoin,
-            vertexColors: gameLibMaterial.vertexColors,
-            skinning: gameLibMaterial.skinning,
-            morphTargets: gameLibMaterial.morphTargets,
-            morphNormals: gameLibMaterial.morphNormals
-        });
- 
-        blenderMaps.push(
-            'diffuse',
-            'light',
-            'ao',
-            'emissive',
-            'bump',
-            'normal',
-            'displacement',
-            'roughness',
-            'metalness',
-            'alpha',
-            'environment'
-        );
-    } else if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) {
- 
-        instanceMaterial = new graphics.instance.MeshPhongMaterial({
-            name: gameLibMaterial.name,
-            opacity: gameLibMaterial.opacity,
-            transparent: gameLibMaterial.transparent,
-            blending: gameLibMaterial.blending,
-            blendSrc: gameLibMaterial.blendSrc,
-            blendDst: gameLibMaterial.blendDst,
-            blendEquation: gameLibMaterial.blendEquation,
-            depthTest: gameLibMaterial.depthTest,
-            depthFunc: gameLibMaterial.depthFunc,
-            depthWrite: gameLibMaterial.depthWrite,
-            polygonOffset: gameLibMaterial.polygonOffset,
-            polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor,
-            polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits,
-            alphaTest: gameLibMaterial.alphaTest,
-            clippingPlanes: gameLibMaterial.clippingPlanes,
-            clipShadows: gameLibMaterial.clipShadows,
-            overdraw: gameLibMaterial.overdraw,
-            visible: gameLibMaterial.visible,
-            side: gameLibMaterial.side,
-            color: new graphics.instance.Color(
-                gameLibMaterial.color.r,
-                gameLibMaterial.color.g,
-                gameLibMaterial.color.b
-            ),
-            specular: new graphics.instance.Color(
-                gameLibMaterial.specular.r,
-                gameLibMaterial.specular.g,
-                gameLibMaterial.specular.b
-            ),
-            shininess: gameLibMaterial.shininess,
-            lightMapIntensity: gameLibMaterial.lightMapIntensity,
-            aoMapIntensity: gameLibMaterial.aoMapIntensity,
-            emissive: new graphics.instance.Color(
-                gameLibMaterial.emissive.r,
-                gameLibMaterial.emissive.g,
-                gameLibMaterial.emissive.b
-            ),
-            emissiveIntensity: gameLibMaterial.emissiveIntensity,
-            bumpScale: gameLibMaterial.bumpScale,
-            normalScale: gameLibMaterial.normalScale,
-            displacementScale: gameLibMaterial.displacementScale,
-            combine: gameLibMaterial.combine,
-            refractionRatio: gameLibMaterial.refractionRatio,
-            fog: gameLibMaterial.fog,
-            shading: gameLibMaterial.shading,
-            wireframe: gameLibMaterial.wireframe,
-            wireframeLinewidth: gameLibMaterial.wireframeLineWidth,
-            wireframeLinecap: gameLibMaterial.wireframeLineCap,
-            wireframeLinejoin: gameLibMaterial.wireframeLineJoin,
-            vertexColors: gameLibMaterial.vertexColors,
-            skinning: gameLibMaterial.skinning,
-            morphTargets: gameLibMaterial.morphTargets,
-            morphNormals: gameLibMaterial.morphNormals
-        });
- 
-        blenderMaps.push(
-            'diffuse',
-            'light',
-            'ao',
-            'emissive',
-            'bump',
-            'normal',
-            'displacement',
-            'specular',
-            'alpha',
-            'environment'
-        );
- 
-    } else {
-        console.log("material type is not implemented yet: " + gameLibMaterial.materialType + " - material indexes could be screwed up");
-    }
- 
-    if (blenderMaps.length > 0) {
-        var textureMaps = GameLib.D3.Texture.loadMaps(
-            gameLibMaterial,
-            blenderMaps,
-            instanceMaterial,
-            graphics,
-            uploadUrl,
-            progressCallback
-        );
-        Q.all(textureMaps).then(
-            function(){
-                defer.resolve(instanceMaterial);
-            }
-        ).catch(
-            function(error){
-                console.log(error);
-                defer.reject(error);
-            }
-        )
-    } else {
-        defer.resolve(instanceMaterial);
-    }
- 
-    return defer.promise;
-};
-/**
- * Matrix 3 Maths
- * @param row0 GameLib.D3.Vector3
- * @param row1 GameLib.D3.Vector3
- * @param row2 GameLib.D3.Vector3
- * @constructor
- */
-GameLib.D3.Matrix3 = function(
-    row0,
-    row1,
-    row2
-) {
-    this.identity();
- 
-    if (row0) {
-        this.rows[0] = row0;
-    }
- 
-    if (row1) {
-        this.rows[1] = row1;
-    }
- 
-    if (row2) {
-        this.rows[2] = row2;
-    }
-};
- 
-/**
- * Set matrix to identity
- */
-GameLib.D3.Matrix3.prototype.identity = function () {
-    this.rows = [
-        new GameLib.D3.Vector4(1, 0, 0),
-        new GameLib.D3.Vector4(0, 1, 0),
-        new GameLib.D3.Vector4(0, 0, 1)
-    ];
-};
-GameLib.D3.Matrix4 = function(
-    row0,
-    row1,
-    row2,
-    row3
-) {
- 
-    this.identity();
- 
-    if (row0) {
-        this.rows[0] = row0;
-    }
- 
-    if (row1) {
-        this.rows[1] = row1;
-    }
- 
-    if (row2) {
-        this.rows[2] = row2;
-    }
- 
-    if (row3) {
-        this.rows[3] = row3;
-    }
-};
- 
-GameLib.D3.Matrix4.prototype.rotationMatrixX = function (radians) {
-    this.identity();
-    this.rows[1] = new GameLib.D3.Vector4(0, Math.cos(radians), -1 * Math.sin(radians), 0);
-    this.rows[2] = new GameLib.D3.Vector4(0, Math.sin(radians), Math.cos(radians), 0);
-    return this;
-};
- 
-GameLib.D3.Matrix4.prototype.rotationMatrixY = function (radians) {
-    this.identity();
-    this.rows[0] = new GameLib.D3.Vector4(
-        Math.cos(radians),
-        0,
-        Math.sin(radians),
-        0
-    );
-    this.rows[2] = new GameLib.D3.Vector4(
-        -1 * Math.sin(radians),
-        0,
-        Math.cos(radians),
-        0
-    );
-    return this;
-};
- 
-GameLib.D3.Matrix4.prototype.rotationMatrixZ = function (radians) {
-    this.identity();
-    this.rows[0] = new GameLib.D3.Vector4(Math.cos(radians), -1 * Math.sin(radians), 0, 0);
-    this.rows[1] = new GameLib.D3.Vector4(Math.sin(radians), Math.cos(radians), 0, 0);
-    return this;
-};
- 
-GameLib.D3.Matrix4.prototype.rotateX = function (radians, point) {
-    this.identity();
-    this.rotationMatrixX(radians);
-    return this.multiply(point);
-};
- 
-GameLib.D3.Matrix4.prototype.rotateY = function (radians, point) {
-    this.identity();
-    this.rotationMatrixY(radians);
-    return this.multiply(point);
-};
- 
-GameLib.D3.Matrix4.prototype.rotateZ = function (radians, point) {
-    this.identity();
-    this.rotationMatrixZ(radians);
-    return this.multiply(point);
-};
- 
-GameLib.D3.Matrix4.prototype.multiply = function (mvp) {
-    if (mvp instanceof GameLib.D3.Vector4) {
-        return new GameLib.D3.Vector4(
-            this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z + this.rows[0].w * mvp.w,
-            this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z + this.rows[1].w * mvp.w,
-            this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z + this.rows[2].w * mvp.w,
-            this.rows[3].x * mvp.x + this.rows[3].y * mvp.y + this.rows[3].z * mvp.z + this.rows[3].w * mvp.w
-        );
-    } else if (mvp instanceof GameLib.D3.Vector3) {
-        return new GameLib.D3.Vector3(
-            this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z,
-            this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z,
-            this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z
-        );
-    }
-};
- 
-GameLib.D3.Matrix4.prototype.identity = function () {
-    this.rows = [
-        new GameLib.D3.Vector4(1, 0, 0, 0),
-        new GameLib.D3.Vector4(0, 1, 0, 0),
-        new GameLib.D3.Vector4(0, 0, 1, 0),
-        new GameLib.D3.Vector4(0, 0, 0, 1)
-    ];
-};
- 
-GameLib.D3.Matrix4.prototype.lookAt = function (position, target, up) {
- 
-    var pv = new GameLib.D3.Vector3(position.x, position.y, position.z);
- 
-    var z = pv.subtract(target).normalize();
- 
-    if (z.squared() === 0) {
-        z.z = 1;
-    }
- 
-    var x = up.cross(z).normalize();
- 
-    if (x.squared() === 0) {
-        z.x += 0.0001;
-        x = up.cross(z).normalize();
-    }
- 
-    var y = z.cross(x);
- 
-    this.rows[0].x = x.x;
-    this.rows[0].y = x.y;
-    this.rows[0].z = x.z;
- 
-    this.rows[1].x = y.x;
-    this.rows[1].y = y.y;
-    this.rows[1].z = y.z;
- 
-    this.rows[2].x = z.x;
-    this.rows[2].y = z.y;
-    this.rows[2].z = z.z;
- 
-    return this;
- 
-    // te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;
-    // te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;
-    // te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;
- 
- 
-    // var matrix4 = new Matrix4();
-    //
-    // matrix4.rows[0] = side.negative();
-    // matrix4.rows[1] = _up;
-    // matrix4.rows[2] = forward;
- 
-    //
-    // matrix4.setColumn(0, side.negative());
-    // matrix4.setColumn(1, _up);
-    // matrix4.setColumn(2, forward);
- 
-    //return matrix4;
- 
-    // return new Matrix4(
-    //     new Vector4(
-    //         side.x,
-    //         side.y,
-    //         side.z,
-    //         side.negative().dot(position)
-    //     ),
-    //     new Vector4(
-    //         _up.x,
-    //         _up.y,
-    //         _up.z,
-    //         _up.negative().dot(position)
-    //     ),
-    //     new Vector4(
-    //         forward.negative().x,
-    //         forward.negative().y,
-    //         forward.negative().z,
-    //         forward.dot(position)
-    //     )
-    // )
-};
- 
-/**
- * Mesh Superset
- * @param id
- * @param path
- * @param name
- * @param meshType
- * @param vertices
- * @param faces
- * @param skeleton
- * @param faceVertexUvs
- * @param skinIndices
- * @param skinWeights
- * @param materials
- * @param position
- * @param quaternion
- * @param rotation
- * @param scale
- * @param up
- * @param physics
- * @param parentMeshId
- * @param parentSceneId
- * @constructor
- */
-GameLib.D3.Mesh = function(
-    id,
-    path,
-    name,
-    meshType,
-    vertices,
-    faces,
-    skeleton,
-    faceVertexUvs,
-    skinIndices,
-    skinWeights,
-    materials,
-    position,
-    quaternion,
-    rotation,
-    scale,
-    up,
-    physics,
-    parentMeshId,
-    parentSceneId
-) {
-    this.id = id;
-    this.meshId = GameLib.D3.Tools.RandomId();
-    this.path = path;
-    this.name = name;
-    this.meshType = meshType;
-    this.vertices = vertices;
-    this.faces = faces;
- 
-    if (typeof skeleton == 'undefined') {
-        skeleton = null;
-    }
-    this.skeleton = skeleton;
- 
-    if (typeof faceVertexUvs == 'undefined') {
-        faceVertexUvs = [];
-    }
-    this.faceVertexUvs = faceVertexUvs;
- 
-    if (typeof skinIndices == 'undefined') {
-        skinIndices = [];
-    }
-    this.skinIndices = skinIndices;
- 
-    if (typeof skinWeights == 'undefined') {
-        skinWeights = [];
-    }
-    this.skinWeights = skinWeights;
- 
-    if (typeof materials == 'undefined') {
-        materials = [];
-    }
-    this.materials = materials;
- 
-    if (typeof position == 'undefined') {
-        position = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.position = position;
- 
-    if (typeof quaternion == 'undefined') {
-        new GameLib.D3.Vector4();
-    }
-    this.quaternion = quaternion;
- 
-    if (typeof rotation == 'undefined') {
-        rotation = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.rotation = rotation;
- 
-    if (typeof scale == 'undefined') {
-        scale = new GameLib.D3.Vector3(1,1,1);
-    }
-    this.scale = scale;
- 
-    if (typeof up == 'undefined') {
-        up = new GameLib.D3.Vector3(0,1,0);
-    }
-    this.up = up;
- 
-    this.physics = physics;
- 
-    this.parentMeshId = parentMeshId;
- 
-    this.parentSceneId = parentSceneId;
-};
- 
- 
-/**
- * Mesh Type
- * @type {number}
- */
-GameLib.D3.Mesh.TYPE_NORMAL = 0;
-GameLib.D3.Mesh.TYPE_SKINNED = 1;
- 
- 
-/**
- * Creates a THREE Mesh from GameLib.D3.Mesh
- * @param gameLibMesh GameLib.D3.Mesh
- * @param instanceGeometry
- * @param instanceMaterial
- * @param graphics
- * @returns {*}
- */
-GameLib.D3.Mesh.createInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) {
- 
-    var threeMesh = null;
- 
-    if (gameLibMesh.meshType == GameLib.D3.Mesh.TYPE_NORMAL) {
-        threeMesh = new graphics.instance.Mesh(instanceGeometry, instanceMaterial);
-    }
- 
-    if (gameLibMesh.meshType == GameLib.D3.Mesh.TYPE_SKINNED) {
- 
-        var bones = gameLibMesh.skeleton.bones;
- 
-        var skinIndices = gameLibMesh.skinIndices;
- 
-        var skinWeights = gameLibMesh.skinWeights;
- 
-        var threeBones = [];
- 
-        for (var bi = 0; bi < bones.length; bi++) {
- 
-            var bone = new graphics.instance.Bone();
- 
-            bone.name = bones[bi].name;
- 
-            bone.position.x = bones[bi].position.x;
-            bone.position.y = bones[bi].position.y;
-            bone.position.z = bones[bi].position.z;
- 
-            bone.rotation.x = bones[bi].rotation.x;
-            bone.rotation.y = bones[bi].rotation.y;
-            bone.rotation.z = bones[bi].rotation.z;
- 
-            bone.quaternion.x = bones[bi].quaternion.x;
-            bone.quaternion.y = bones[bi].quaternion.y;
-            bone.quaternion.z = bones[bi].quaternion.z;
-            bone.quaternion.w = bones[bi].quaternion.w;
- 
-            bone.scale.x = bones[bi].scale.x;
-            bone.scale.y = bones[bi].scale.y;
-            bone.scale.z = bones[bi].scale.z;
- 
-            bone.up.x = bones[bi].up.x;
-            bone.up.y = bones[bi].up.y;
-            bone.up.z = bones[bi].up.z;
- 
-            threeBones.push(bone);
-        }
- 
-        /**
-         * Setup the bone relationships
-         */
-        for (var br = 0; br < bones.length; br++) {
-            for (var cbi = 0; cbi < bones[br].childBoneIds.length; cbi++) {
-                threeBones[br].add(threeBones[bones[br].childBoneIds[cbi]]);
-            }
-        }
- 
-        /**
-         * Setup bones (indexes)
-         */
-        for (var si = 0; si < skinIndices.length; si++) {
-            instanceGeometry.skinIndices.push(
-                new graphics.instance.Vector4(
-                    skinIndices[si].x,
-                    skinIndices[si].y,
-                    skinIndices[si].z,
-                    skinIndices[si].w
-                )
-            );
-        }
- 
-        /**
-         * Setup bones (weights)
-         */
-        for (var sw = 0; sw < skinWeights.length; sw++) {
-            instanceGeometry.skinWeights.push(
-                new graphics.instance.Vector4(
-                    skinWeights[sw].x,
-                    skinWeights[sw].y,
-                    skinWeights[sw].z,
-                    skinWeights[sw].w
-                )
-            );
-        }
- 
-        threeMesh = new graphics.instance.SkinnedMesh(instanceGeometry, instanceMaterial);
- 
-        var skeleton = new graphics.instance.Skeleton(threeBones);
- 
-        skeleton.useVertexTexture = gameLibMesh.skeleton.useVertexTexture;
- 
-        for (var i = 0; i < bones.length; i++) {
-            if (bones[i].parentBoneId === null) {
-                threeMesh.add(threeBones[i]);
-                break;
-            }
-        }
- 
-        threeMesh.bind(skeleton);
- 
-        threeMesh.pose();
- 
-        threeMesh.skeleton.skeletonHelper = new graphics.instance.SkeletonHelper(threeMesh);
-        threeMesh.skeleton.skeletonHelper.material.linewidth = 5;
-    }
- 
-    if (threeMesh == null) {
-        console.log('cannot handle meshes of type ' + gameLibMesh.meshType + ' yet.');
-    }
- 
-    gameLibMesh.threeMeshId = threeMesh.id;
- 
-    return threeMesh;
-};
- 
-GameLib.D3.prototype.invertWindingOrder = function(triangles) {
- 
-    for (var i = 0; i < triangles.length; i++) {
-        var v1 = triangles[i].v1;
-        triangles[i].v1 = triangles[i].v2;
-        triangles[i].v2 = v1;
- 
-        var backupUV = triangles[i].triangle.v1uv;
-        triangles[i].triangle.v1uv = triangles[i].triangle.v2uv;
-        triangles[i].triangle.v2uv = backupUV;
-    }
- 
-    return triangles;
-};
- 
-/**
- * This function resets a the winding order of a mesh from a reference point V (the average center of the mesh)
- */
-GameLib.D3.prototype.resetWindingOrder = function(faces, vertices) {
- 
-    var vertexList = new GameLib.D3.Vector3.Points();
- 
-    for (var v = 0; v < vertices.length; v++) {
-        vertexList.add(new GameLib.D3.Vector3(
-            vertices[v].position.x,
-            vertices[v].position.y,
-            vertices[v].position.z
-        ));
-    }
- 
-    var V = vertexList.average();
- 
-    var triangles = [];
- 
-    for (var s = 0; s < faces.length; s += 3) {
- 
-        var v0 = faces[s];
-        var v1 = faces[s+1];
-        var v2 = faces[s+2];
- 
-        triangles.push(
-            {
-                v0 : v0,
-                v1 : v1,
-                v2 : v2,
-                edges : [
-                    {v0: v0, v1: v1},
-                    {v0: v1, v1: v2},
-                    {v0: v2, v1: v0}
-                ],
-                winding : 0,
-                edgeIndex : -1,
-                processed : false
-            }
-        );
-    }
- 
-    for (var i = 0; i < triangles.length; i++) {
-        if (
-            GameLib.D3.Vector3.clockwise(
-                vertices[triangles[i].v0].position,
-                vertices[triangles[i].v1].position,
-                vertices[triangles[i].v2].position,
-                V
-            )
-        ) {
-            console.log('clockwise');
-            var bv1 = triangles[i].v1;
-            triangles[i].v1 = triangles[i].v2;
-            triangles[i].v2 = bv1;
-        } else {
-            console.log('not clockwise');
-        }
-    }
- 
-    return triangles;
-};
- 
-/**
- * This function resets the winding order for triangles in faces, given an initial triangle and orientation edge
- * used pseudocode from
- * http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh
- *  We need to use a graph traversal algorithm,
- *  lets assume we have method that returns neighbor of triangle on given edge
- *
- *      neighbor_on_egde( next_tria, edge )
- *
- *  to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it
- *  processed = set of processed triangles; initial empty
- *
- *  while to_process is not empty:
- *      next_tria, orientation_edge = to_process.pop()
- *      add next_tria in processed
- *      if next_tria is not opposite oriented than orientation_edge:
- *          change next_tria (ABC) orientation  (B<->C)
- *      for each edge (AB) in next_tria:
- *          neighbor_tria = neighbor_on_egde( next_tria, edge )
- *          if neighbor_tria exists and neighbor_tria not in processed:
- *              to_process add (neighbor_tria, edge opposite oriented (BA))
- * @param faces GameLib.D3.TriangleFace[]
- * @param orientationEdge GameLib.D3.Vector2
- * @returns {Array}
- */
-GameLib.D3.fixWindingOrder = function(faces, orientationEdge) {
- 
-    /**
-     * Checks if a TriangleFace belonging to a TriangleEdge has already been processed
-     * @param processed TriangleEdge[]
-     * @param triangle TriangleFace
-     * @returns {boolean}
-     */
-    function inProcessed(processed, triangle) {
- 
-        for (var i = 0; i < processed.length; i++) {
-            if (processed[i].triangle.equals(triangle)) {
-                return true;
-            }
-        }
- 
-        return false;
-    }
- 
-    /**
-     * Returns a neighbouring triangle on a specific edge - preserving the edge orientation
-     * @param edge GameLib.D3.Vector2
-     * @param faces GameLib.D3.TriangleFace[]
-     * @param currentTriangle
-     * @returns {*}
-     */
-    function neighbourOnEdge(edge, faces, currentTriangle) {
- 
-        for (var i = 0; i < faces.length; i++) {
-            if (
-                (faces[i].v0 == edge.x && faces[i].v1 == edge.y) ||
-                (faces[i].v1 == edge.x && faces[i].v2 == edge.y) ||
-                (faces[i].v2 == edge.x && faces[i].v0 == edge.y) ||
-                (faces[i].v0 == edge.y && faces[i].v1 == edge.x) ||
-                (faces[i].v1 == edge.y && faces[i].v2 == edge.x) ||
-                (faces[i].v2 == edge.y && faces[i].v0 == edge.x)
-            ) {
- 
-                var triangle = new GameLib.D3.TriangleFace(
-                    faces[i].v0,
-                    faces[i].v1,
-                    faces[i].v2,
-                    faces[i].materialIndex,
-                    faces[i].v0uv,
-                    faces[i].v1uv,
-                    faces[i].v2uv
-                );
- 
-                if (triangle.equals(currentTriangle)) {
-                    continue;
-                }
- 
-                return new GameLib.D3.TriangleEdge(
-                    triangle,
-                    edge
-                );
-            }
-        }
- 
-        return null;
-    }
- 
-    var toProcess = [
-        new GameLib.D3.TriangleEdge(
-            new GameLib.D3.TriangleFace(
-                faces[0].v0,
-                faces[0].v1,
-                faces[0].v2,
-                faces[0].materialIndex,
-                faces[0].v0uv,
-                faces[0].v1uv,
-                faces[0].v2uv
-            ),
-            orientationEdge
-        )
-    ];
- 
-    var processed = [];
- 
-    while (toProcess.length > 0) {
- 
-        var triangleEdge = toProcess.pop();
- 
-        /**
-         * If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed
-         * to have the same winding order)
-         */
-        if (
-            (triangleEdge.triangle.v0 == triangleEdge.edge.x &&
-            triangleEdge.triangle.v1 == triangleEdge.edge.y) ||
-            (triangleEdge.triangle.v1 == triangleEdge.edge.x &&
-            triangleEdge.triangle.v2 == triangleEdge.edge.y) ||
-            (triangleEdge.triangle.v2 == triangleEdge.edge.x &&
-            triangleEdge.triangle.v0 == triangleEdge.edge.y)
-        ) {
-            var backupV = triangleEdge.triangle.v1;
-            triangleEdge.triangle.v1 = triangleEdge.triangle.v2;
-            triangleEdge.triangle.v2 = backupV;
- 
-            var backupUV = triangleEdge.triangle.v1uv;
-            triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv;
-            triangleEdge.triangle.v2uv = backupUV;
-        }
- 
-        processed.push(triangleEdge);
- 
-        var edges = [
-            new GameLib.D3.Vector2(
-                triangleEdge.triangle.v0,
-                triangleEdge.triangle.v1
-            ),
-            new GameLib.D3.Vector2(
-                triangleEdge.triangle.v1,
-                triangleEdge.triangle.v2
-            ),
-            new GameLib.D3.Vector2(
-                triangleEdge.triangle.v2,
-                triangleEdge.triangle.v0
-            )
-        ];
- 
-        for (var j = 0; j < edges.length; j++) {
-            var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle);
-            if (neighbour && !inProcessed(processed, neighbour.triangle)) {
-                toProcess.push(neighbour);
-            }
-        }
-    }
- 
-    /**
-     * In processed - we will have some duplicates - only add the unique ones
-     * @type {Array}
-     */
-    var triangles = [];
-    for (var i = 0; i < processed.length; i++) {
-        var found = false;
-        for (var k = 0; k < triangles.length; k++) {
-            if (triangles[k].equals(processed[i].triangle)){
-                found = true;
-                break;
-            }
-        }
-        if (!found) {
-            triangles.push(processed[i].triangle);
-        }
-    }
- 
-    return triangles;
-};
- 
-/**
- * This is a work-around function to fix polys which don't triangulate because
- * they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around
- * Z then Y axis
- * @param verticesFlat []
- * @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY
- * @return []
- */
-GameLib.D3.fixPolyZPlane = function(verticesFlat, grain) {
- 
-    if ((verticesFlat.length % 3) != 0 && !(verticesFlat.length > 9)) {
-        console.log("The vertices are not in the right length : " + verticesFlat.length);
-    }
- 
-    var vertices = [];
- 
-    var points = new GameLib.D3.Vector4.Points();
- 
-    for (var i = 0; i < verticesFlat.length; i += 3) {
-        points.add(new GameLib.D3.Vector3(
-            verticesFlat[i],
-            verticesFlat[i + 1],
-            verticesFlat[i + 2]
-        ));
-    }
- 
-    points.toOrigin();
- 
-    points.maximizeXDistance(grain);
- 
-    points.maximizeYDistance(grain);
- 
-    for (i = 0; i < points.vectors.length; i++) {
-        vertices.push(
-            [
-                points.vectors[i].x,
-                points.vectors[i].y
-            ]
-        );
-    }
- 
-    return vertices;
-};
-/**
- * Physics SuperSet Namespace Object
- * @param id
- * @param name
- * @param engine GameLib.D3.Engine
- * @param worlds
- * @returns {{World: World}}
- * @constructor
- */
-GameLib.D3.Physics = function(
-    id,
-    name,
-    engine,
-    worlds
-) {
-    this.id = id;
-    this.name = name;
-    this.engine = engine;
- 
-    if (typeof worlds == 'undefined') {
-        worlds = [];
-    }
-    this.worlds = worlds;
-};
- 
- 
-/**
- * Solver Types
- * @type {number}
- */
-GameLib.D3.Physics.SPLIT_SOLVER = 0x1;
-GameLib.D3.Physics.GS_SOLVER = 0x2;
-/**
- * Contains a Poly vertex data structure
- * @param localIndex
- * @param mvertIndex
- * @param uv GameLib.D3.Vector2
- * @param materialIndex
- * @param edgeIndex
- * @constructor
- */
-GameLib.D3.PolyVertex = function(
-    localIndex,
-    mvertIndex,
-    uv,
-    materialIndex,
-    edgeIndex
-) {
-    this.localIndex = localIndex;
-    this.mvertIndex = mvertIndex;
-    this.uv = uv;
-    this.materialIndex = materialIndex;
-    this.edgeIndex = edgeIndex;
-};
- 
-/**
- * Clone a PolyVertex
- * @returns {GameLib.D3.PolyVertex}
- */
-GameLib.D3.PolyVertex.prototype.clone = function() {
-    return new GameLib.D3.PolyVertex(
-        this.localIndex,
-        this.mvertIndex,
-        this.uv.copy(),
-        this.materialIndex,
-        this.edgeIndex
-    )
-};
-/**
- * Raycast Vehicles :)
- * @param engine GameLib.D3.Engine
- * @param chassisBody GameLib.D3.RigidBody
- * @param wheels GameLib.D3.RaycastWheel[]
- * @constructor
- */
-GameLib.D3.RaycastVehicle = function(
-    engine,
-    chassisBody,
-    wheels
-) {
-    this.engine = engine;
-    this.engine.isNotCannonThrow();
- 
-    this.componentId = GameLib.D3.Tools.RandomId();
- 
-    this.chassisBody = chassisBody;
- 
-    if (typeof wheels == 'undefined') {
-        wheels = [];
-    }
-    this.wheels = wheels;
- 
-    this.instance = this.createInstance();
-};
- 
-/**
- * private
- * @returns {GameLib.D3.RaycastVehicle|GameLib.D3.Physics.RaycastVehicle|*}
- */
-GameLib.D3.RaycastVehicle.prototype.createInstance = function() {
-    return new this.engine.instance.RaycastVehicle({
-        chassisBody: this.chassisBody.instance
-    });
-};
- 
-/**
- * Adds a raycast wheel to this vehicle
- * @param wheel GameLib.D3.RaycastWheel
- */
-GameLib.D3.RaycastVehicle.prototype.addWheel = function (
-    wheel
-) {
-    this.wheels.push(wheel);
-    this.instance.addWheel(wheel.instance);
-};
- 
-/**
- * Returns updated wheel info
- * @returns {*}
- * @constructor
- */
-GameLib.D3.RaycastVehicle.prototype.getWheelInfo = function() {
-    return this.instance.wheelInfos;
-};
-GameLib.D3.RaycastWheel = function(
-    engine,
-    chassisConnectionPointLocal,
-    chassisConnectionPointWorld,
-    directionLocal,
-    directionWorld,
-    axleLocal,
-    axleWorld,
-    suspensionRestLength,
-    suspensionMaxLength,
-    radius,
-    suspensionStiffness,
-    dampingCompression,
-    dampingRelaxation,
-    frictionSlip,
-    steering,
-    rotation,
-    deltaRotation,
-    rollInfluence,
-    maxSuspensionForce,
-    isFrontWheel,
-    clippedInvContactDotSuspension,
-    suspensionRelativeVelocity,
-    suspensionForce,
-    skidInfo,
-    suspensionLength,
-    maxSuspensionTravel,
-    useCustomSlidingRotationalSpeed,
-    customSlidingRotationalSpeed
-) {
-    this.engine = engine;
-    this.engine.isNotCannonThrow();
- 
-    this.componentId = GameLib.D3.Tools.RandomId();
- 
-	if(typeof chassisConnectionPointLocal == 'undefined') {
-		chassisConnectionPointLocal = new this.engine.instance.Vec3();
-	}
-	this.chassisConnectionPointLocal = chassisConnectionPointLocal;
- 
-	if(typeof chassisConnectionPointWorld == 'undefined') {
-		chassisConnectionPointWorld = new this.engine.instance.Vec3();
-	}
-	this.chassisConnectionPointWorld = chassisConnectionPointWorld;
- 
-	if(typeof directionLocal == 'undefined') {
-		directionLocal = new this.engine.instance.Vec3();
-	}
-	this.directionLocal = directionLocal;
- 
-	if(typeof directionWorld == 'undefined') {
-		directionWorld = new this.engine.instance.Vec3();
-	}
-	this.directionWorld = directionWorld;
- 
-	if(typeof axleLocal == 'undefined') {
-		axleLocal = new this.engine.instance.Vec3();
-	}
-	this.axleLocal = axleLocal;
- 
-	if(typeof axleWorld == 'undefined') {
-		axleWorld = new this.engine.instance.Vec3();
-	}
-	this.axleWorld = axleWorld;
- 
-	if(typeof suspensionRestLength == 'undefined') {
-		suspensionRestLength = 1;
-	}
-	this.suspensionRestLength = suspensionRestLength;
- 
-	if(typeof suspensionMaxLength == 'undefined') {
-		suspensionMaxLength = 2;
-	}
-	this.suspensionMaxLength = suspensionMaxLength;
- 
-	if(typeof radius == 'undefined') {
-		radius = 1;
-	}
-	this.radius = radius;
- 
-	if(typeof suspensionStiffness == 'undefined') {
-		suspensionStiffness = 100;
-	}
-	this.suspensionStiffness = suspensionStiffness;
- 
-	if(typeof dampingCompression == 'undefined') {
-		dampingCompression = 10;
-	}
-	this.dampingCompression = dampingCompression;
- 
-	if(typeof dampingRelaxation == 'undefined') {
-		dampingRelaxation = 10;
-	}
-	this.dampingRelaxation = dampingRelaxation;
- 
-	if(typeof frictionSlip == 'undefined') {
-		frictionSlip = 10000;
-	}
-	this.frictionSlip = frictionSlip;
- 
-	if(typeof steering == 'undefined') {
-		steering = 0;
-	}
-	this.steering = steering;
- 
-	if(typeof rotation == 'undefined') {
-		rotation = 0;
-	}
-	this.rotation = rotation;
- 
-	if(typeof deltaRotation == 'undefined') {
-		deltaRotation = 0;
-	}
-	this.deltaRotation = deltaRotation;
- 
-	if(typeof rollInfluence == 'undefined') {
-		rollInfluence = 0.01;
-	}
-	this.rollInfluence = rollInfluence;
- 
-	if(typeof maxSuspensionForce == 'undefined') {
-		maxSuspensionForce = Number.MAX_VALUE;
-	}
-	this.maxSuspensionForce = maxSuspensionForce;
- 
-	if(typeof isFrontWheel == 'undefined') {
-		isFrontWheel = true;
-	}
-	this.isFrontWheel = isFrontWheel;
- 
-	if(typeof clippedInvContactDotSuspension == 'undefined') {
-		clippedInvContactDotSuspension = 1;
-	}
-	this.clippedInvContactDotSuspension = clippedInvContactDotSuspension;
- 
-	if(typeof suspensionRelativeVelocity == 'undefined') {
-		suspensionRelativeVelocity = 0;
-	}
-	this.suspensionRelativeVelocity = suspensionRelativeVelocity;
- 
-	if(typeof suspensionForce == 'undefined') {
-		suspensionForce = 0;
-	}
-	this.suspensionForce = suspensionForce;
- 
-	if(typeof skidInfo == 'undefined') {
-		skidInfo = 0;
-	}
-	this.skidInfo = skidInfo;
- 
-	if(typeof suspensionLength == 'undefined') {
-		suspensionLength = 0;
-	}
-	this.suspensionLength = suspensionLength;
- 
-	if(typeof maxSuspensionTravel == 'undefined') {
-		maxSuspensionTravel = 1;
-	}
-	this.maxSuspensionTravel = maxSuspensionTravel;
- 
-	if(typeof useCustomSlidingRotationalSpeed == 'undefined') {
-		useCustomSlidingRotationalSpeed = false;
-	}
-	this.useCustomSlidingRotationalSpeed = useCustomSlidingRotationalSpeed;
- 
-	if(typeof customSlidingRotationalSpeed == 'undefined') {
-		customSlidingRotationalSpeed = -0.1;
-	}
-	this.customSlidingRotationalSpeed = customSlidingRotationalSpeed;
- 
-    this.instance = this.createInstance();
-};
- 
-GameLib.D3.RaycastWheel.prototype.createInstance = function() {
-    
-    return new this.engine.instance.WheelInfo({
-        chassisConnectionPointLocal : this.chassisConnectionPointLocal,
-		chassisConnectionPointWorld : this.chassisConnectionPointWorld,
-		directionLocal : this.directionLocal,
-		directionWorld : this.directionWorld,
-		axleLocal : this.axleLocal,
-		axleWorld : this.axleWorld,
-		suspensionRestLength : this.suspensionRestLength,
-		suspensionMaxLength : this.suspensionMaxLength,
-		radius : this.radius,
-		suspensionStiffness : this.suspensionStiffness,
-		dampingCompression : this.dampingCompression,
-		dampingRelaxation : this.dampingRelaxation,
-		frictionSlip : this.frictionSlip,
-		steering : this.steering,
-		rotation : this.rotation,
-		deltaRotation : this.deltaRotation,
-		rollInfluence : this.rollInfluence,
-		maxSuspensionForce : this.maxSuspensionForce,
-		isFrontWheel : this.isFrontWheel,
-		clippedInvContactDotSuspension : this.clippedInvContactDotSuspension,
-		suspensionRelativeVelocity : this.suspensionRelativeVelocity,
-		suspensionForce : this.suspensionForce,
-		skidInfo : this.skidInfo,
-		suspensionLength : this.suspensionLength,
-		maxSuspensionTravel : this.maxSuspensionTravel,
-		useCustomSlidingRotationalSpeed : this.useCustomSlidingRotationalSpeed,
-		customSlidingRotationalSpeed : this.customSlidingRotationalSpeed
-    });
- 
-};
- 
-/**
- * Physics Rigid Body Vehicle Superset
- * @param engine GameLib.D3.Engine
- * @param chassisBody GameLib.D3.RigidBody
- * @param wheels GameLib.D3.RigidWheel[]
- * @constructor
- */
-GameLib.D3.RigidBodyVehicle = function(
-    engine,
-    chassisBody,
-    wheels
-) {
-    this.componentId = GameLib.D3.Tools.RandomId();
-    this.engine = engine;
-    this.engine.isNotCannonThrow();
- 
-    this.chassisBody = chassisBody;
- 
-    if (typeof wheels == 'undefined') {
-        wheels = [];
-    }
-    this.wheels = wheels;
- 
-    this.instance = this.createInstance();
-};
- 
-/**
- * Returns physics wheelbody info (for updates)
- * @returns {Array}
- */
-GameLib.D3.RigidBodyVehicle.prototype.getWheelInfo = function() {
-    return this.instance.wheelBodies;
-};
- 
-/**
- *
- * @returns {GameLib.D3.RigidVehicle}
- */
-GameLib.D3.RigidBodyVehicle.prototype.createInstance = function() {
-    return new this.engine.instance.RigidVehicle({
-        chassisBody: this.chassisBody.instance
-    });
-};
- 
-/**
- * Adds a wheel to this rigid body vehicle
- * @param wheel GameLib.D3.RigidWheel
- */
-GameLib.D3.RigidBodyVehicle.prototype.addWheel = function(wheel) {
- 
-    this.wheels.push(wheel);
- 
-    this.instance.addWheel({
-        body: wheel.body.instance,
-        position: new this.engine.instance.Vec3(
-            wheel.position.x,
-            wheel.position.y,
-            wheel.position.z
-        ),
-        axis: new this.engine.instance.Vec3(
-            wheel.axis.x,
-            wheel.axis.y,
-            wheel.axis.z
-        ),
-        direction: new this.engine.instance.Vec3(
-            wheel.direction.x,
-            wheel.direction.y,
-            wheel.direction.z
-        )
-    });
-    
-};
- 
-/**
- * RigidBody Superset
- * @param engine GameLib.D3.Engine
- * @param mass
- * @param friction
- * @param position
- * @param quaternion
- * @param velocity
- * @param angularVelocity
- * @param linearDamping
- * @param angularDamping
- * @param allowSleep
- * @param sleepSpeedLimit
- * @param sleepTimeLimit
- * @param collisionFilterGroup
- * @param collisionFilterMask
- * @param fixedRotation
- * @param shape GameLib.D3.Shape
- * @returns {GameLib.D3.Physics.RigidBody}
- * @constructor
- */
-GameLib.D3.RigidBody = function(
-    engine,
-    mass,
-    friction,
-    position,
-    quaternion,
-    velocity,
-    angularVelocity,
-    linearDamping,
-    angularDamping,
-    allowSleep,
-    sleepSpeedLimit,
-    sleepTimeLimit,
-    collisionFilterGroup,
-    collisionFilterMask,
-    fixedRotation,
-    shape
-) {
-    this.componentId = GameLib.D3.Tools.RandomId();
-    this.position = position || new GameLib.D3.Vector3();
-    this.velocity = velocity || new GameLib.D3.Vector3();
-    this.angularVelocity = angularVelocity || new GameLib.D3.Vector3();
-    this.quaternion = quaternion || new GameLib.D3.Vector4(0, 0, 0, 1);
-    this.mass = typeof mass == "undefined" ? 0 : mass;
-    this.friction = typeof friction == "undefined" ? 5 : friction;
-    this.linearDamping = typeof linearDamping == "undefined" ? 0.01 : linearDamping;
-    this.angularDamping = typeof angularDamping == "undefined" ? 0.01 : angularDamping;
-    this.allowSleep = typeof allowSleep == "undefined" ? true : allowSleep;
-    this.sleepSpeedLimit = typeof sleepSpeedLimit == "undefined" ? 0.1 : sleepSpeedLimit;
-    this.sleepTimeLimit = typeof sleepTimeLimit == "undefined" ? 1.0 : sleepTimeLimit;
-    this.collisionFilterGroup = typeof collisionFilterGroup == "undefined" ? 1 : collisionFilterGroup;
-    this.collisionFilterMask = typeof collisionFilterMask == "undefined" ? 1 : collisionFilterMask;
-    this.fixedRotation = typeof fixedRotation == "undefined" ? false : fixedRotation;
-    this.shape = typeof shape == "undefined" ? null : shape;
- 
-    this.engine = engine;
- 
-    this.engine.isNotCannonThrow();
- 
-    this.instance = this.createInstance();
-};
- 
-/**
- * private function
- * @returns {*}
- */
-GameLib.D3.RigidBody.prototype.createInstance = function() {
- 
-    var instance = new this.engine.instance.Body({
-        mass: mass,
-        friction: this.friction,
-        position: new this.engine.instance.Vec3(
-            this.position.x,
-            this.position.y,
-            this.position.z
-        ),
-        velocity: new this.engine.instance.Vec3(
-            this.velocity.x,
-            this.velocity.y,
-            this.velocity.z
-        ),
-        quaternion: new this.engine.instance.Quaternion(
-            this.quaternion.x,
-            this.quaternion.y,
-            this.quaternion.z,
-            this.quaternion.w
-        ),
-        angularVelocity: new this.engine.instance.Vec3(
-            this.angularVelocity.x,
-            this.angularVelocity.y,
-            this.angularVelocity.z
-        ),
-        linearDamping: this.linearDamping,
-        angularDamping: this.angularDamping,
-        allowSleep: this.allowSleep,
-        sleepSpeedLimit: this.sleepSpeedLimit,
-        sleepTimeLimit: this.sleepTimeLimit,
-        collisionFilterGroup: this.collisionFilterGroup,
-        collisionFilterMask: this.collisionFilterMask,
-        fixedRotation: this.fixedRotation,
-        shape: this.shape.instance
-    });
- 
-    this.instance = instance;
- 
-    return instance;
-};
- 
-/**
- * Adds a shape to this rigid body
- * @param shape GameLib.D3.Shape
- * @param offset GameLib.D3.Vector3
- * @param orientation GameLib.D3.Vector4
- * @constructor
- */
-GameLib.D3.RigidBody.prototype.addShape = function(
-    shape,
-    offset,
-    orientation
-) {
-    if (!offset) {
-        offset = new GameLib.D3.Vector3(0,0,0);
-    }
- 
-    if (!orientation) {
-        orientation = new GameLib.D3.Vector4(0,0,0,1);
-    }
- 
-    this.instance.addShape(
-        shape.instance,
-        new this.engine.instance.Vec3(
-            offset.x,
-            offset.y,
-            offset.z
-        ),
-        new this.engine.instance.Quaternion(
-            orientation.x,
-            orientation.y,
-            orientation.z,
-            orientation.w
-        )
-    );
-};
- 
- 
- 
-/**
- * Rigid Wheel superset
- * @param body GameLib.D3.RigidBody
- * @param position GameLib.D3.Vector3
- * @param axis GameLib.D3.Vector3
- * @param direction GameLib.D3.Vector3
- * @constructor
- */
-GameLib.D3.RigidWheel = function(
-    body,
-    position,
-    axis,
-    direction
-) {
-    this.componentId = GameLib.D3.Tools.RandomId();
-    this.body = body;
-    this.position = position;
-    this.axis = axis;
-    this.direction = direction;
-};
- 
-/**
- * Scenes are objects putting meshes into 'world space'
- * @param id
- * @param path String
- * @param name String
- * @param meshes GameLib.D3.Mesh[]
- * @param quaternion
- * @param position
- * @param rotation
- * @param scale
- * @param parentSceneId
- * @param lights
- * @param worlds
- * @param entities
- * @constructor
- */
-GameLib.D3.Scene = function(
-    id,
-    path,
-    name,
-    meshes,
-    quaternion,
-    position,
-    rotation,
-    scale,
-    parentSceneId,
-    lights,
-    worlds,
-    entities
-) {
-    this.id = id;
-    this.sceneId = GameLib.D3.Tools.RandomId();
-    this.path = path;
-    this.name = name;
-    Iif (this.name.trim() == "") {
-        this.name = 'unnamed';
-    }
- 
-    Eif (typeof meshes == 'undefined') {
-        meshes = [];
-    }
-    this.meshes = meshes;
- 
-    Eif (typeof quaternion == 'undefined') {
-        quaternion = new GameLib.D3.Vector4();
-    }
-    this.quaternion = quaternion;
- 
-    Eif (typeof position == 'undefined') {
-        position = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.position = position;
- 
-    Eif (typeof rotation == 'undefined') {
-        rotation = new GameLib.D3.Vector3(0,0,0);
-    }
-    this.rotation = rotation;
- 
-    Eif (typeof scale == 'undefined') {
-        scale = new GameLib.D3.Vector3(1,1,1);
-    }
-    this.scale = scale;
- 
-    Eif (typeof parentSceneId == 'undefined') {
-        parentSceneId = null;
-    }
-    this.parentSceneId = parentSceneId;
- 
-    Eif (typeof lights == 'undefined') {
-        lights = [];
-    }
-    this.lights = lights;
- 
-    Eif (typeof worlds == 'undefined') {
-        worlds = [];
-    }
-    this.worlds = worlds;
- 
-    Eif (typeof entities == 'undefined') {
-        entities = [];
-    }
-    this.entities = entities;
-};
- 
-/**
- * Loads a scene directly from the API
- * @param gameLibScene GameLib.D3.Scene
- * @param onLoaded callback
- * @param graphics GameLib.D3.Graphics
- * @param uploadUrl String
- * @param progressCallback callback
- * @param apiUrl
- */
-GameLib.D3.Scene.LoadSceneFromApi = function(
-    gameLibScene,
-    onLoaded,
-    graphics,
-    uploadUrl,
-    progressCallback,
-    apiUrl
-) {
- 
-    /**
-     * First check if this is a client or server side request
-     */
-    Eif (typeof XMLHttpRequest == 'undefined') {
-        console.warn('implement server side loading from API here');
-        return onLoaded(null, new Error('not implemented'));
-    }
- 
-    var xhr = new XMLHttpRequest();
-    xhr.open(
-        'GET',
-        apiUrl + '/scene/load' + gameLibScene.path + '/' + gameLibScene.name
-    );
- 
-    xhr.onreadystatechange = function(xhr) {
-        return function() {
-            if (xhr.readyState == 4) {
- 
-                var response = JSON.parse(xhr.responseText);
- 
-                if (!response.scene || response.scene.length == 0) {
-                    return onLoaded(null, null, new Error('Could not load scene'));
-                }
- 
-                var scene = response.scene[0];
- 
-                var physics3ds = [];
- 
-                if (scene.physics && scene.physics.length > 0) {
- 
-                    for (var p = 0; p < scene.physics.length; p++) {
- 
-                        var physics = scene.physics[p];
- 
-                        var engine = null;
- 
-                        if (physics.engine.engineType == GameLib.D3.Engine.ENGINE_TYPE_CANNON) {
-                            engine = new GameLib.D3.Engine(
-                                GameLib.D3.Engine.ENGINE_TYPE_CANNON,
-                                CANNON
-                            );
-                        }
- 
-                        var physics3d = new GameLib.D3.Physics(
-                            physics.id,
-                            physics.name,
-                            engine,
-                            null
-                        );
- 
-                        var worlds3d = [];
- 
-                        for (var w = 0; w < physics.worlds.length; w++) {
- 
-                            var world = physics.worlds[w];
- 
-                            var broadphase = world.broadphase;
- 
-                            var broadphase3d = new GameLib.D3.Physics.Broadphase(
-                                broadphase.id,
-                                broadphase.name,
-                                broadphase.broadphaseType
-                            );
- 
-                            var solver = world.solver;
- 
-                            var solver3d = new GameLib.D3.Physics.Solver(
-                                solver.id,
-                                solver.name,
-                                solver.solverType,
-                                solver.iterations,
-                                solver.tolerance
-                            );
- 
-                            var bodies = world.rigidBodies;
- 
-                            var bodies3d = [];
- 
-                            for (var b = 0; b < bodies.length; b++) {
- 
-                                var body = bodies[b];
- 
-                                //TODO: add all body properties here
-                                var body3d = new GameLib.D3.Physics.RigidBody(
-                                    body.id,
-                                    body.name
-                                );
- 
-                                bodies3d.push(body3d);
-                            }
- 
-                            var world3d = new GameLib.D3.Physics.World(
-                                null,
-                                world.name,
-                                physics3d,
-                                new GameLib.D3.Vector3(
-                                    world.gravity.x,
-                                    world.gravity.y,
-                                    world.gravity.z
-                                ),
-                                broadphase3d,
-                                solver3d,
-                                bodies3d
-                            );
- 
-                            worlds3d.push(world3d);
-                        }
- 
-                        physics3ds.push(physics3d);
-                    }
-                }
- 
-                var lights3d = [];
- 
-                for (var l = 0; l < scene.lights.length; l++) {
- 
-                    var light = scene.lights[l];
- 
-                    var light3d = new GameLib.D3.Light(
-                        light.id,
-                        light.lightType,
-                        light.name,
-                        new GameLib.D3.Color(
-                            light.color.r,
-                            light.color.g,
-                            light.color.b,
-                            light.color.a
-                        ),
-                        light.intensity,
-                        new GameLib.D3.Vector3(
-                            light.position.x,
-                            light.position.y,
-                            light.position.z
-                        ),
-                        new GameLib.D3.Vector3(
-                            light.targetPosition.x,
-                            light.targetPosition.y,
-                            light.targetPosition.z
-                        ),
-                        new GameLib.D3.Vector4(
-                            light.quaternion.x,
-                            light.quaternion.y,
-                            light.quaternion.z,
-                            light.quaternion.w
-                        ),
-                        new GameLib.D3.Vector3(
-                            light.rotation.x,
-                            light.rotation.y,
-                            light.rotation.z
-                        ),
-                        new GameLib.D3.Vector3(
-                            light.scale.x,
-                            light.scale.y,
-                            light.scale.z
-                        ),
-                        light.distance,
-                        light.decay,
-                        light.power,
-                        light.angle,
-                        light.penumbra
-                    );
- 
-                    lights3d.push(light3d);
-                }
- 
-                var scene3d = new GameLib.D3.Scene(
-                    scene._id || scene.id,
-                    scene.path,
-                    scene.name,
-                    scene.meshes,
-                    new GameLib.D3.Vector4(
-                        scene.quaternion.x,
-                        scene.quaternion.y,
-                        scene.quaternion.z,
-                        scene.quaternion.w
-                    ),
-                    new GameLib.D3.Vector3(
-                        scene.position.x,
-                        scene.position.y,
-                        scene.position.z
-                    ),
-                    new GameLib.D3.Vector3(
-                        scene.rotation.x,
-                        scene.rotation.y,
-                        scene.rotation.z
-                    ),
-                    new GameLib.D3.Vector3(
-                        scene.scale.x,
-                        scene.scale.y,
-                        scene.scale.z
-                    ),
-                    scene.parentSceneId,
-                    lights3d,
-                    physics3ds
-                );
- 
-                GameLib.D3.Scene.loadScene(
-                    scene3d,
-                    onLoaded,
-                    false,
-                    graphics,
-                    uploadUrl,
-                    progressCallback
-                );
-            }
-        }
-    }(xhr);
- 
-    xhr.send();
-};
- 
-/**
- * Loads a GameLib.D3.Scene object into a Graphics Instance Scene object
- * @param gameLibScene GameLib.D3.Scene
- * @param onLoaded callback when all meshes have loaded
- * @param computeNormals set to true to compute new face and vertex normals during load
- * @param graphics GameLib.D3.Graphics
- * @param uploadUrl
- * @param progressCallback
- */
-GameLib.D3.Scene.loadScene = function(
-    gameLibScene,
-    onLoaded,
-    computeNormals,
-    graphics,
-    uploadUrl,
-    progressCallback
-) {
- 
-    console.log("loading scene " + gameLibScene.name);
- 
-    graphics.isNotThreeThrow();
- 
-    var meshQ = [];
- 
-    for (var m = 0; m < gameLibScene.meshes.length; m++) {
- 
-        var mesh = gameLibScene.meshes[m];
- 
-        console.log("loading mesh " + mesh.name);
- 
-        var geometry = new graphics.instance.Geometry();
- 
-        var vertices = mesh.vertices;
- 
-        var faces = mesh.faces;
- 
-        var faceVertexUvs = mesh.faceVertexUvs;
- 
-        var materials = mesh.materials;
- 
-        /**
-         * Setup vertices
-         */
-        for (var v = 0; v < vertices.length; v++) {
-            geometry.vertices.push(
-                new graphics.instance.Vector3(
-                    vertices[v].position.x,
-                    vertices[v].position.y,
-                    vertices[v].position.z
-                )
-            )
-        }
- 
-        /**
-         * Setup faces
-         */
-        for (var f = 0; f < faces.length; f++) {
- 
-            var face = new graphics.instance.Face3(
-                faces[f].v0,
-                faces[f].v1,
-                faces[f].v2,
-                new graphics.instance.Vector3(
-                    faces[f].normal.x,
-                    faces[f].normal.y,
-                    faces[f].normal.z
-                ),
-                new graphics.instance.Color(
-                    faces[f].color.r,
-                    faces[f].color.g,
-                    faces[f].color.b
-                ),
-                faces[f].materialIndex
-            );
- 
-            face.vertexColors = [
-                new graphics.instance.Color(
-                    faces[f].vertexColors[0].r,
-                    faces[f].vertexColors[0].g,
-                    faces[f].vertexColors[0].b
-                ),
-                new graphics.instance.Color(
-                    faces[f].vertexColors[1].r,
-                    faces[f].vertexColors[1].g,
-                    faces[f].vertexColors[1].b
-                ),
-                new graphics.instance.Color(
-                    faces[f].vertexColors[2].r,
-                    faces[f].vertexColors[2].g,
-                    faces[f].vertexColors[2].b
-                )
-            ];
- 
-            face.normal = new graphics.instance.Vector3(
-                faces[f].normal.x,
-                faces[f].normal.y,
-                faces[f].normal.z
-            );
- 
-            face.vertexNormals = [
-                new graphics.instance.Vector3(
-                    faces[f].vertexNormals[0].x,
-                    faces[f].vertexNormals[0].y,
-                    faces[f].vertexNormals[0].z
-                ),
-                new graphics.instance.Vector3(
-                    faces[f].vertexNormals[1].x,
-                    faces[f].vertexNormals[1].y,
-                    faces[f].vertexNormals[1].z
-                ),
-                new graphics.instance.Vector3(
-                    faces[f].vertexNormals[2].x,
-                    faces[f].vertexNormals[2].y,
-                    faces[f].vertexNormals[2].z
-                )
-            ];
- 
-            geometry.faces.push(face);
-        }
- 
-        geometry.faceVertexUvs = [];
- 
-        /**
-         * Setup face UVs
-         */
-        for (var fm = 0; fm < faceVertexUvs.length; fm++) {
- 
-            var faceMaterialVertexUvs = faceVertexUvs[fm];
- 
-            geometry.faceVertexUvs[fm] = [];
- 
-            for (var fuv = 0; fuv < faceMaterialVertexUvs.length; fuv++) {
-                geometry.faceVertexUvs[fm][fuv] = [];
-                geometry.faceVertexUvs[fm][fuv].push(
-                    new graphics.instance.Vector2(
-                        faceMaterialVertexUvs[fuv][0].x,
-                        faceMaterialVertexUvs[fuv][0].y
-                    ),
-                    new graphics.instance.Vector2(
-                        faceMaterialVertexUvs[fuv][1].x,
-                        faceMaterialVertexUvs[fuv][1].y
-                    ),
-                    new graphics.instance.Vector2(
-                        faceMaterialVertexUvs[fuv][2].x,
-                        faceMaterialVertexUvs[fuv][2].y
-                    )
-                );
-            }
-        }
- 
-        /**
-         * Re-calculate normals (if we have to)
-         * @type {Array}
-         */
-        if (computeNormals) {
-            geometry.computeFaceNormals();
-            geometry.computeVertexNormals();
-        }
- 
-        var instanceMaterialLoaders = [];
- 
-        /**
-         * Setup materials
-         */
-        for (var mi = 0; mi < materials.length; mi++) {
-            instanceMaterialLoaders.push(
-                GameLib.D3.Material.createInstanceMaterial(
-                    materials[mi],
-                    graphics,
-                    uploadUrl,
-                    progressCallback
-                )
-            );
-        }
- 
-        var result = Q.all(instanceMaterialLoaders).then(
-            function(mesh, geometry) {
-                return function(materials) {
- 
-                    console.log("loaded material : " + materials[0].name);
- 
-                    /**
-                     * We don't support MultiMaterial atm - it doesn't work with raycasting
-                     */
-                    var material = materials[0];
- 
-                    var threeMesh = GameLib.D3.Mesh.createInstanceMesh(
-                        mesh,
-                        geometry,
-                        material,
-                        graphics
-                    );
-                    threeMesh.name = mesh.name;
- 
-                    threeMesh.position.x = mesh.position.x;
-                    threeMesh.position.y = mesh.position.y;
-                    threeMesh.position.z = mesh.position.z;
- 
-                    threeMesh.rotation.x = mesh.rotation.x;
-                    threeMesh.rotation.y = mesh.rotation.y;
-                    threeMesh.rotation.z = mesh.rotation.z;
- 
-                    threeMesh.scale.x = mesh.scale.x;
-                    threeMesh.scale.y = mesh.scale.y;
-                    threeMesh.scale.z = mesh.scale.z;
- 
-                    threeMesh.quaternion.x = mesh.quaternion.x;
-                    threeMesh.quaternion.y = mesh.quaternion.y;
-                    threeMesh.quaternion.z = mesh.quaternion.z;
-                    threeMesh.quaternion.w = mesh.quaternion.w;
- 
-                    return threeMesh;
-                };
-            }(mesh, geometry)
-        ).catch(function(error){
-            console.log(error);
-        });
- 
-        meshQ.push(result);
-    }
- 
-    Q.all(meshQ).then(
-        function(instanceMeshes){
-        console.log("all meshes have loaded");
-        if (typeof onLoaded != 'undefined') {
- 
-            var instanceLights = [];
- 
-            for (var sli = 0; sli < gameLibScene.lights.length; sli++) {
- 
-                var gameLibLight = gameLibScene.lights[sli];
- 
-                var light = null;
- 
-                if (gameLibLight.lightType == 'AmbientLight') {
-                    light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity);
-                }
- 
-                if (gameLibLight.lightType == 'DirectionalLight') {
-                    light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity);
-                }
- 
-                if (gameLibLight.lightType == 'PointLight') {
-                    light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity);
-                    light.distance = gameLibLight.distance;
-                    light.decay = gameLibLight.decay;
-                }
- 
-                if (gameLibLight.lightType == 'SpotLight') {
-                    light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity);
-                    light.distance = gameLibLight.distance;
-                    light.angle = gameLibLight.angle;
-                    light.penumbra = gameLibLight.penumbra;
-                    light.decay = gameLibLight.decay;
-                }
- 
-                light.position.x = gameLibLight.position.x;
-                light.position.y = gameLibLight.position.y;
-                light.position.z = gameLibLight.position.z;
- 
-                light.rotation.x = gameLibLight.rotation.x;
-                light.rotation.y = gameLibLight.rotation.y;
-                light.rotation.z = gameLibLight.rotation.z;
- 
-                if (light == null) {
-                    console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported');
-                } else {
-                    light.name = gameLibLight.name;
-                    instanceLights.push(light);
-                }
-            }
- 
-            var instanceScene = new graphics.instance.Scene();
- 
-            instanceScene.name = gameLibScene.name;
- 
-            instanceScene.position.x = gameLibScene.position.x;
-            instanceScene.position.y = gameLibScene.position.y;
-            instanceScene.position.z = gameLibScene.position.z;
- 
-            instanceScene.rotation.x = gameLibScene.rotation.x;
-            instanceScene.rotation.y = gameLibScene.rotation.y;
-            instanceScene.rotation.z = gameLibScene.rotation.z;
- 
-            instanceScene.scale.x = gameLibScene.scale.x;
-            instanceScene.scale.y = gameLibScene.scale.y;
-            instanceScene.scale.z = gameLibScene.scale.z;
- 
-            instanceScene.quaternion.x = gameLibScene.quaternion.x;
-            instanceScene.quaternion.y = gameLibScene.quaternion.y;
-            instanceScene.quaternion.z = gameLibScene.quaternion.z;
-            instanceScene.quaternion.w = gameLibScene.quaternion.w;
- 
-            for (var m = 0; m < instanceMeshes.length; m++) {
-                instanceScene.add(instanceMeshes[m]);
-            }
- 
-            for (var l = 0; l < instanceLights.length; l++) {
-                instanceScene.add(instanceLights[l]);
-            }
- 
-            onLoaded(
-                gameLibScene,
-                {
-                    scene: instanceScene,
-                    lights: instanceLights,
-                    meshes: instanceMeshes
-                }
-            );
-        }
-    }).catch(
-        function(error){
-            console.log(error);
-        }
-    );
-};
-/**
- * Physics Shape Superset
- * @param engine GameLib.D3.Engine
- * @param shapeType
- * @param scale GameLib.D3.Vector3
- * @param vertices Number[]
- * @param indices Number[]
- * @param radius Number
- * @param halfExtensions GameLib.D3.Vector3
- * @param radiusTop Number
- * @param radiusBottom Number
- * @param height Number
- * @param numSegments Number
- * @param heightmap GameLib.D3.Heightmap
- * @param elementSize
- * @constructor
- */
-GameLib.D3.Shape = function(
-    engine,
-    shapeType,
-    scale,
-    vertices,
-    indices,
-    radius,
-    halfExtensions,
-    radiusTop,
-    radiusBottom,
-    height,
-    numSegments,
-    heightmap
-) {
-    this.engine = engine;
- 
-    this.engine.isNotCannonThrow();
- 
-    this.shapeType = shapeType;
- 
-    this.instance = this.createInstance();
- 
-    if (typeof scale == 'undefined') {
-        scale = new GameLib.D3.Vector3(1, 1, 1)
-    }
-    this.scale = scale;
- 
-    if (typeof vertices == 'undefined') {
-        vertices = [];
-    }
-    this.vertices = vertices;
- 
-    if (typeof indices == 'undefined') {
-        indices = [];
-    }
-    this.indices = indices;
- 
-    if (typeof radius == 'undefined') {
-        radius = 1;
-    }
-    this.radius = radius;
- 
-    if (typeof halfExtensions == 'undefined') {
-        halfExtensions = new GameLib.D3.Vector3(1,1,1);
-    }
-    this.halfExtensions = halfExtensions;
- 
-    if (typeof radiusTop == 'undefined') {
-        radiusTop = 1;
-    }
-    this.radiusTop = radiusTop;
- 
-    if (typeof radiusBottom == 'undefined') {
-        radiusBottom = 1;
-    }
-    this.radiusBottom = radiusBottom;
- 
-    if (typeof height == 'undefined') {
-        height = 1;
-    }
-    this.height = height;
- 
-    if (typeof numSegments == 'undefined') {
-        numSegments = 1;
-    }
-    this.numSegments = numSegments;
- 
-    if (typeof heightmap == 'undefined') {
-        heightmap = new GameLib.D3.Heightmap();
-    }
-    this.heightmap = heightmap;
- 
-};
- 
-/**
- * Shape constants
- * @type {number}
- */
-GameLib.D3.Shape.SHAPE_TYPE_SPHERE        = 1;
-GameLib.D3.Shape.SHAPE_TYPE_BOX           = 2;
-GameLib.D3.Shape.SHAPE_TYPE_TRIMESH       = 3;
-GameLib.D3.Shape.SHAPE_TYPE_CYLINDER      = 4;
-GameLib.D3.Shape.SHAPE_TYPE_HEIGHT_MAP    = 5;
-GameLib.D3.Shape.SHAPE_TYPE_CONVEX_HULL   = 6;
- 
-/**
- *
- */
-GameLib.D3.Shape.prototype.createInstance = function() {
- 
-    var instance = null;
- 
-    if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_TRIMESH) {
-        instance = new this.engine.instance.Trimesh(
-            this.vertices,
-            this.indices
-        );
-    } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_SPHERE) {
-        instance = new this.engine.instance.Sphere(
-            this.radius
-        );
-    } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_BOX) {
-        instance = new this.engine.instance.Box(
-            new this.engine.instance.Vec3(
-                this.halfExtensions.x,
-                this.halfExtensions.y,
-                this.halfExtensions.z
-            )
-        );
-    } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_CYLINDER) {
-        instance = new this.engine.instance.Cylinder(
-            this.radiusTop,
-            this.radiusBottom,
-            this.height,
-            this.numSegments
-        );
-    } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_HEIGHT_MAP) {
-        instance = new this.engine.instance.Heightfield(
-            this.heightmap.matrix,
-            {
-                elementSize: this.heightmap.elementSize
-            }
-        );
-    } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_CONVEX_HULL) {
-        console.warn('Shape type not implemented: ' + this.shapeType);
-        throw new Error('Shape type not implemented: ' + this.shapeType);
-    } else {
-        console.warn('Shape type not implemented: ' + this.shapeType);
-        throw new Error('Shape type not implemented: ' + this.shapeType);
-    }
- 
-    this.instance = instance;
- 
-    return instance;
-};
- 
- 
-/**
- * update
- */
-GameLib.D3.Shape.prototype.update = function(
-    engine
-) {
-    engine.isNotCannonThrow();
- 
-    if(this.shapeType === GameLib.D3.Shape.SHAPE_TYPE_TRIMESH) {
-        this.instance.setScale(
-            new engine.instance.Vec3(
-                this.scale.x,
-                this.scale.y,
-                this.scale.z
-            )
-        );
-        this.instance.updateAABB();
-        this.instance.updateNormals();
-        this.instance.updateEdges();
-        this.instance.updateBoundingSphereRadius();
-        this.instance.updateTree();
-    }
-};
- 
-/**
- * Skeleton Superset
- * @param id
- * @param bones GameLib.D3.Bone
- * @param boneInverses
- * @param useVertexTexture
- * @param boneTextureWidth
- * @param boneTextureHeight
- * @param boneMatrices
- * @param boneTexture
- * @constructor
- */
-GameLib.D3.Skeleton = function(
-    id,
-    bones,
-    boneInverses,
-    useVertexTexture,
-    boneTextureWidth,
-    boneTextureHeight,
-    boneMatrices,
-    boneTexture
-) {
-    this.id = id;
- 
-    this.bones = bones;
- 
-    /**
-     * An array of Matrix4s that represent the inverse of the matrixWorld of the individual bones.
-     * @type GameLib.D3.Matrix4[]
-     */
-    if (typeof boneInverses == 'undefined') {
-        boneInverses = [];
-    }
-    this.boneInverses = boneInverses;
- 
-    /**
-     * Use a vertex texture in the shader - allows for more than 4 bones per vertex, not supported by all devices
-     * @type {boolean}
-     */
-    if (typeof useVertexTexture == 'undefined') {
-        useVertexTexture = false;
-    }
-    this.useVertexTexture = useVertexTexture;
- 
-    if (this.useVertexTexture == true) {
-        console.warn('support for vertex texture bones is not supported yet - something could break somewhere');
-    }
- 
-    if (typeof boneTextureWidth == 'undefined') {
-        boneTextureWidth = 0;
-    }
-    this.boneTextureWidth = boneTextureWidth;
- 
-    if (typeof boneTextureHeight == 'undefined') {
-        boneTextureHeight = 0;
-    }
-    this.boneTextureHeight = boneTextureHeight;
- 
-    if (typeof boneMatrices == 'undefined') {
-        boneMatrices = [];
-    }
-    this.boneMatrices = boneMatrices;
- 
-    if (typeof boneTexture == 'undefined') {
-        boneTexture = [];
-    }
-    this.boneTexture = boneTexture;
-};
- 
- 
-GameLib.D3.SkyBox = function (
-    graphics
-) {
-    this.id = null;
-    
-    this.graphics = graphics;
-    this.graphics.isNotThreeThrow();
-    
-    this.texturesFolder = null;
-};
- 
-GameLib.D3.SkyBox.prototype.load = function (
-    texturesFolder
-) {
-    this.texturesFolder = texturesFolder;
-    this.textures = [];
-    this.materials = [];
-    this.mesh = {};
-    this.scene = new this.graphics.instance.Scene();
-    this.textureCube = null;
- 
-    var textureLoader = new this.graphics.instance.TextureLoader();
- 
-    // this textures are used to display the skybox
-    this.textures.push(textureLoader.load(this.texturesFolder + "px.png"));
-    this.textures.push(textureLoader.load(this.texturesFolder + "nx.png"));
-    this.textures.push(textureLoader.load(this.texturesFolder + "py.png"));
-    this.textures.push(textureLoader.load(this.texturesFolder + "ny.png"));
-    this.textures.push(textureLoader.load(this.texturesFolder + "pz.png"));
-    this.textures.push(textureLoader.load(this.texturesFolder + "nz.png"));
- 
-    // assign textures to each cube face
-    for (var i = 0; i < 6; i ++) {
-        this.materials.push(new this.graphics.instance.MeshBasicMaterial({ map: this.textures[i] }));
-    }
- 
-    // create cube geometry
-    this.mesh = new this.graphics.instance.Mesh(new this.graphics.instance.CubeGeometry(1, 1, 1), new this.graphics.instance.MeshFaceMaterial(this.materials));
-    this.mesh.applyMatrix(new this.graphics.instance.Matrix4().makeScale(1, 1, -1));
-    this.scene.add(this.mesh);
- 
-    // Load env textureCube
-    // this is used for reflections on meshes
-    // mesh.material.envMap = this.textureCube;
-    this.textureCube = new this.graphics.instance.CubeTextureLoader().load([
-        this.texturesFolder + "px.png", this.texturesFolder + "nx.png",
-        this.texturesFolder + "py.png", this.texturesFolder + "ny.png",
-        this.texturesFolder + "pz.png", this.texturesFolder + "nz.png"
-    ]);
-};
- 
-GameLib.D3.SkyBox.prototype.render = function (
-    threeRenderer,
-    threeCamera
-) {
-    var cameraPosition = new this.graphics.instance.Vector3(threeCamera.position.x, threeCamera.position.y, threeCamera.position.z);
- 
-    threeCamera.position.set(0, 0, 0);
- 
-    var gl = threeRenderer.context;
- 
-    gl.disable(gl.DEPTH_TEST);
- 
-    threeRenderer.render(this.scene, threeCamera);
- 
-    gl.enable(gl.DEPTH_TEST);
- 
-    threeCamera.position.copy(cameraPosition);
-};
- 
-/**
- * Physics Solver Superset
- * @param id
- * @param name
- * @param solverType
- * @param iterations
- * @param tolerance
- * @constructor
- */
-GameLib.D3.Physics.Solver = function(
-    id,
-    name,
-    solverType,
-    iterations,
-    tolerance
-) {
-    this.id = id;
-    if (typeof name == 'undefined') {
-        if (solverType == GameLib.D3.Physics.SPLIT_SOLVER) {
-            name = 'split solver';
-        } else if (solverType == GameLib.D3.Physics.GS_SOLVER) {
-            name = 'gs solver';
-        } else {
-            name = 'unknown solver';
-        }
-    }
-    this.name = name;
-    this.solverType = solverType;
-    this.iterations = iterations;
-    this.tolerance = tolerance;
-};
- 
-/**
- * Solver Types
- * @type {number}
- */
-GameLib.D3.Physics.SPLIT_SOLVER = 0x1;
-GameLib.D3.Physics.GS_SOLVER = 0x2;
- 
-/**
- * Texture Superset
- * @param id
- * @param name
- * @param image
- * @param wrapS
- * @param wrapT
- * @param repeat
- * @param data
- * @param format
- * @param mapping
- * @param magFilter
- * @param minFilter
- * @param textureType
- * @param anisotropy
- * @param offset
- * @param generateMipmaps
- * @param flipY
- * @param mipmaps
- * @param unpackAlignment
- * @param premultiplyAlpha
- * @param encoding
- * @constructor
- */
-GameLib.D3.Texture = function(
-    id,
-    name,
-    image,
-    wrapS,
-    wrapT,
-    repeat,
-    data,
-    format,
-    mapping,
-    magFilter,
-    minFilter,
-    textureType,
-    anisotropy,
-    offset,
-    generateMipmaps,
-    flipY,
-    mipmaps,
-    unpackAlignment,
-    premultiplyAlpha,
-    encoding
-) {
-    this.id = id;
-    this.name = name;
-    this.image = image;
- 
-    if (typeof wrapS == 'undefined') {
-        wrapS = GameLib.D3.Texture.TYPE_REPEAT_WRAPPING;
-    }
-    this.wrapS = wrapS;
- 
-    if (typeof wrapT == 'undefined') {
-        wrapT = GameLib.D3.Texture.TYPE_REPEAT_WRAPPING;
-    }
-    this.wrapT = wrapT;
- 
-    if (typeof repeat == 'undefined') {
-        repeat = new GameLib.D3.Vector2(1, 1);
-    }
-    this.repeat = repeat;
- 
-    if (typeof data == 'undefined') {
-        data = null;
-    }
-    this.data = data;
- 
-    if (typeof format == 'undefined') {
-        format = GameLib.D3.Texture.TYPE_RGBA_FORMAT;
-    }
-    this.format = format;
- 
-    if (typeof mapping == 'undefined') {
-        mapping = GameLib.D3.Texture.TYPE_UV_MAPPING;
-    }
-    this.mapping = mapping;
- 
-    if (typeof magFilter == 'undefined') {
-        magFilter = GameLib.D3.Texture.TYPE_LINEAR_FILTER;
-    }
-    this.magFilter = magFilter;
- 
-    if (typeof minFilter == 'undefined') {
-        minFilter = GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_LINEAR_FILTER;
-    }
-    this.minFilter = minFilter;
- 
-    if (typeof textureType == 'undefined') {
-        textureType = GameLib.D3.Texture.TYPE_UNSIGNED_BYTE;
-    }
-    this.textureType = textureType;
- 
-    if (typeof anisotropy == 'undefined') {
-        anisotropy = 1;
-    }
-    this.anisotropy = anisotropy;
- 
-    if (typeof offset == 'undefined') {
-        offset = new GameLib.D3.Vector2(0, 0);
-    }
-    this.offset = offset;
- 
-    if (typeof generateMipmaps == 'undefined') {
-        generateMipmaps = true;
-    }
-    this.generateMipmaps = generateMipmaps;
- 
-    if (typeof flipY == 'undefined') {
-        flipY = true;
-    }
-    this.flipY = flipY;
- 
-    if (typeof mipmaps == 'undefined') {
-        mipmaps = [];
-    }
-    this.mipmaps = mipmaps;
- 
-    if (typeof unpackAlignment == 'undefined') {
-        unpackAlignment = 4;
-    }
-    this.unpackAlignment = unpackAlignment;
- 
-    if (typeof premultiplyAlpha == 'undefined') {
-        premultiplyAlpha = false;
-    }
-    this.premultiplyAlpha = premultiplyAlpha;
- 
-    if (typeof encoding == 'undefined') {
-        encoding = GameLib.D3.Texture.TYPE_LINEAR_ENCODING;
-    }
-    this.encoding = encoding;
-};
- 
-/**
- * Texture Formats
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_ALPHA_FORMAT = 1019;
-GameLib.D3.Texture.TYPE_RGB_FORMAT = 1020;
-GameLib.D3.Texture.TYPE_RGBA_FORMAT = 1021;
-GameLib.D3.Texture.TYPE_LUMINANCE_FORMAT = 1022;
-GameLib.D3.Texture.TYPE_LUMINANCE_ALPHA_FORMAT = 1023;
-GameLib.D3.Texture.TYPE_DEPTH_FORMAT = 1026;
- 
-/**
- * Mapping modes
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_UV_MAPPING = 300;
-GameLib.D3.Texture.TYPE_CUBE_REFLECTION_MAPPING = 301;
-GameLib.D3.Texture.TYPE_CUBE_REFRACTION_MAPPING = 302;
-GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFLECTION_MAPPING = 303;
-GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFRACTION_MAPPING = 304;
-GameLib.D3.Texture.TYPE_SPHERICAL_REFLECTION_MAPPING = 305;
-GameLib.D3.Texture.TYPE_CUBE_UV_REFLECTION_MAPPING = 306;
-GameLib.D3.Texture.TYPE_CUBE_UV_REFRACTION_MAPPING = 307;
- 
-/**
- * Wrapping Modes
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_REPEAT_WRAPPING = 1000;
-GameLib.D3.Texture.TYPE_CLAMP_TO_EDGE_WRAPPING = 1001;
-GameLib.D3.Texture.TYPE_MIRRORED_REPEAT_WRAPPING = 1002;
- 
-/**
- * Mipmap Filters
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_NEAREST_FILTER = 1003;
-GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_NEAREST_FILTER = 1004;
-GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_LINEAR_FILTER = 1005;
-GameLib.D3.Texture.TYPE_LINEAR_FILTER = 1006;
-GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_NEAREST_FILTER = 1007;
-GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_LINEAR_FILTER = 1008;
- 
-/**
- * Texture Data Types
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_UNSIGNED_BYTE = 1009;
-GameLib.D3.Texture.TYPE_BYTE = 1010;
-GameLib.D3.Texture.TYPE_SHORT = 1011;
-GameLib.D3.Texture.TYPE_UNSIGNED_SHORT = 1012;
-GameLib.D3.Texture.TYPE_INT = 1013;
-GameLib.D3.Texture.TYPE_UNSIGNED_INT = 1014;
-GameLib.D3.Texture.TYPE_FLOAT = 1015;
-GameLib.D3.Texture.TYPE_HALF_FLOAT = 1025;
- 
-/**
- * Encoding Modes
- * @type {number}
- */
-GameLib.D3.Texture.TYPE_LINEAR_ENCODING = 3000; // NO ENCODING AT ALL.
-GameLib.D3.Texture.TYPE_SRGB_ENCODING = 3001;
-GameLib.D3.Texture.TYPE_GAMMA_ENCODING = 3007; // USES GAMMA_FACTOR, FOR BACKWARDS COMPATIBILITY WITH WEBGLRENDERER.GAMMAINPUT/GAMMAOUTPUT
-GameLib.D3.Texture.TYPE_RGBE_ENCODING = 3002; // AKA RADIANCE.
-GameLib.D3.Texture.TYPE_LOG_LUV_ENCODING = 3003;
-GameLib.D3.Texture.TYPE_RGBM7_ENCODING = 3004;
-GameLib.D3.Texture.TYPE_RGBM16_ENCODING = 3005;
-GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256.
- 
-/**
- * Defers loading of an image and resolves once image is loaded
- * @param gameLibTexture GameLib.D3.Texture
- * @param instanceMaterial
- * @param instanceMaterialMapType
- * @param graphics GameLib.D3.Graphics
- * @param uploadUrl String
- * @param progressCallback
- * @returns {Promise}
- */
-GameLib.D3.Texture.loadMap = function(
-    gameLibTexture,
-    instanceMaterial,
-    instanceMaterialMapType,
-    graphics,
-    uploadUrl,
-    progressCallback
-) {
- 
-    var defer = Q.defer();
- 
-    var imagePath = null;
-    
-    var textureLoader = new graphics.instance.TextureLoader();
- 
-    if (gameLibTexture && gameLibTexture.image && gameLibTexture.image.filename) {
-        /**
-         * Else, load from upload source
-         */
-        imagePath = uploadUrl + '/' + gameLibTexture.image.filename;
-    }
- 
-    if (imagePath) {
- 
-        textureLoader.crossOrigin = '';
- 
-        textureLoader.load(
-            imagePath,
-            function(texture) {
-                /**
-                 * onLoad
-                 */
-                instanceMaterial[instanceMaterialMapType] = texture;
-                instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name;
-                instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy;
-                instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding;
-                instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY;
-                /**
-                 * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes
-                 */
-                instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps;
-                instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter;
-                instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter;
-                instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping;
-                instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps;
-                instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2(
-                    gameLibTexture.offset.x,
-                    gameLibTexture.offset.y
-                );
-                instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha;
-                instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType;
-                instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS;
-                instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT;
-                instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment;
-                instanceMaterial.needsUpdate = true;
-                defer.resolve(true);
-            },
-            function(xhr) {
-                /**
-                 * onProgress
-                 */
-                if (progressCallback) {
-                    progressCallback(Math.round(xhr.loaded / xhr.total * 100));
-                }
-            },
-            function(error) {
-                /**
-                 * onError
-                 */
-                console.log("an error occurred while trying to load the image : " + imagePath);
-                defer.resolve(null);
-            }
-        );
- 
-    } else {
-        defer.resolve(null);
-    }
- 
-    return defer.promise;
-};
- 
- 
-/**
- * Returns an array of image loading Promises
- * @param gameLibMaterial
- * @param blenderMaps
- * @param instanceMaterial
- * @param graphics GameLib.D3.Graphics
- * @param uploadUrl String
- * @param progressCallback
- * @returns Q[]
- */
-GameLib.D3.Texture.loadMaps = function(
-    gameLibMaterial,
-    blenderMaps,
-    instanceMaterial,
-    graphics,
-    uploadUrl,
-    progressCallback
-) {
- 
-    var textureMaps = [];
- 
-    for (var ti = 0; ti < blenderMaps.length; ti++) {
- 
-        var map = blenderMaps[ti];
- 
-        if (gameLibMaterial.maps.hasOwnProperty(map)) {
- 
-            var blenderTexture = gameLibMaterial.maps[map];
- 
-            if (
-                blenderTexture &&
-                blenderTexture.image &&
-                blenderTexture.image.filename
-            ) {
- 
-                var instanceMap = null;
- 
-                if (map == 'alpha') {
-                    instanceMap = 'alhpaMap';
-                }
- 
-                if (map == 'ao') {
-                    instanceMap = 'aoMap';
-                }
- 
-                if (map == 'bump') {
-                    instanceMap = 'bumpMap';
-                }
- 
-                if (map == 'displacement') {
-                    instanceMap = 'displacementMap';
-                }
- 
-                if (map == 'emissive') {
-                    instanceMap = 'emissiveMap';
-                }
- 
-                if (map == 'environment') {
-                    instanceMap = 'envMap';
-                }
- 
-                if (map == 'light') {
-                    instanceMap = 'lightMap';
-                }
- 
-                if (map == 'specular') {
-                    instanceMap = 'specularMap';
-                }
- 
-                if (map == 'diffuse') {
-                    instanceMap = 'map';
-                }
- 
-                if (map == 'roughness') {
-                    instanceMap = 'roughnessMap';
-                }
- 
-                if (map == 'metalness') {
-                    instanceMap = 'metalnessMap';
-                }
- 
-                if (instanceMap == null) {
-                    console.warn("unsupported map type : " + map);
-                }
- 
-                textureMaps.push(
-                    GameLib.D3.Texture.loadMap(
-                        gameLibMaterial.maps[map],
-                        instanceMaterial,
-                        instanceMap,
-                        graphics,
-                        uploadUrl,
-                        progressCallback
-                    )
-                );
-            }
-        }
-    }
- 
-    return textureMaps;
-};
- 
-GameLib.D3.Tools = function(){};
- 
-/**
- * Generates a random ID
- * @returns {string}
- * @constructor
- */
-GameLib.D3.Tools.RandomId = function() {
-    return Math.random().toString(36).substr(2, 10);
-};
-/**
- * TriangleEdge
- * @param triangle
- * @param edge
- * @constructor
- */
-GameLib.D3.TriangleEdge = function(
-    triangle,
-    edge
-) {
-    this.triangle = triangle;
-    this.edge = edge;
-};
-/**
- * TriangleFace
- * @param v0
- * @param v1
- * @param v2
- * @param materialIndex
- * @param v0uv
- * @param v1uv
- * @param v2uv
- * @param color
- * @param vertexColors
- * @param vertexNormals
- * @param normal
- * @constructor
- */
-GameLib.D3.TriangleFace = function(
-    v0,
-    v1,
-    v2,
-    materialIndex,
-    v0uv,
-    v1uv,
-    v2uv,
-    color,
-    vertexColors,
-    vertexNormals,
-    normal
-) {
-    this.v0 = v0;
-    this.v1 = v1;
-    this.v2 = v2;
-    this.materialIndex = materialIndex;
-    this.v0uv = v0uv;
-    this.v1uv = v1uv;
-    this.v2uv = v2uv;
-    if (!color) {
-        color = new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff);
-    }
-    this.color = color;
- 
-    if (!vertexColors) {
-        vertexColors = [
-            new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff),
-            new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff),
-            new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff)
-        ];
-    }
-    this.vertexColors = vertexColors;
- 
-    if (!vertexNormals) {
-        vertexNormals = [
-            new GameLib.D3.Vector3(),
-            new GameLib.D3.Vector3(),
-            new GameLib.D3.Vector3()
-        ]
-    }
-    this.vertexNormals = vertexNormals;
- 
-    if (!normal) {
-        normal = new GameLib.D3.Vector3(0);
-    }
- 
-    this.normal = normal;
-};
- 
-/**
- * Clone a TriangleFace
- * @returns {GameLib.D3.TriangleFace}
- */
-GameLib.D3.TriangleFace.prototype.clone = function(){
-    return new GameLib.D3.TriangleFace(
-        this.v0,
-        this.v1,
-        this.v2,
-        this.materialIndex,
-        this.v0uv.copy(),
-        this.v1uv.copy(),
-        this.v2uv.copy()
-    );
-};
- 
-/**
- * Returns true if two triangles are equal (their vertex indices match in some order)
- * @param triangle
- * @returns {boolean}
- */
-GameLib.D3.TriangleFace.prototype.equals = function(triangle) {
-    return !!(
-    (
-        (this.v0 == triangle.v0) &&
-        (this.v1 == triangle.v1) &&
-        (this.v2 == triangle.v2)
-    )
-    ||
-    (
-        (this.v0 == triangle.v0) &&
-        (this.v1 == triangle.v2) &&
-        (this.v2 == triangle.v1)
-    )
-    ||
-    (
-        (this.v0 == triangle.v1) &&
-        (this.v1 == triangle.v0) &&
-        (this.v2 == triangle.v2)
-    )
-    ||
-    (
-        (this.v0 == triangle.v1) &&
-        (this.v1 == triangle.v2) &&
-        (this.v2 == triangle.v0)
-    )
-    ||
-    (
-        (this.v0 == triangle.v2) &&
-        (this.v1 == triangle.v0) &&
-        (this.v2 == triangle.v1)
-    )
-    ||
-    (
-        (this.v0 == triangle.v2) &&
-        (this.v1 == triangle.v1) &&
-        (this.v2 == triangle.v0)
-    ));
-};
- 
- 
-GameLib.D3.Vector2 = function(x, y) {
- 
-    this.x = 0;
-    this.y = 0;
- 
-    if (x) {
-        this.x = x;
-    }
- 
-    if (y) {
-        this.y = y;
-    }
-};
- 
-GameLib.D3.Vector2.prototype.copy = function() {
-    return new GameLib.D3.Vector2(
-        this.x,
-        this.y
-    );
-};
- 
-GameLib.D3.Vector2.prototype.equals = function(v) {
-    return !!(((this.x == v.x) &&
-    (this.y == v.y)) ||
-    ((this.y == v.x) &&
-    (this.x == v.y)));
-};
- 
-GameLib.D3.Vector3 = function(x, y, z) {
- 
-    this.x = 0;
-    this.y = 0;
-    this.z = 0;
- 
-    if (x) {
-        this.x = x;
-    }
- 
-    if (y) {
-        this.y = y;
-    }
- 
-    if (z) {
-        this.z = z;
-    }
-};
- 
-GameLib.D3.Vector3.prototype.subtract = function (v) {
- 
-    if (v instanceof GameLib.D3.Vector3) {
-        this.x -= v.x;
-        this.y -= v.y;
-        this.z -= v.z;
-    }
- 
-    if (v instanceof GameLib.D3.Vector4) {
-        console.warn("trying to subtract vector of bigger length (4 vs 3))");
-    }
- 
-    return this;
-};
- 
-GameLib.D3.Vector3.prototype.cross = function (v) {
-    return new GameLib.D3.Vector3(
-        this.y * v.z - this.z * v.y,
-        this.z * v.x - this.x * v.z,
-        this.x * v.y - this.y * v.x
-    );
-};
- 
-GameLib.D3.Vector3.prototype.negative = function () {
-    this.x *= -1;
-    this.y *= -1;
-    this.z *= -1;
-    return this;
-};
- 
-GameLib.D3.Vector3.clockwise = function (u, v, w, viewPoint) {
- 
-    var normal = GameLib.D3.Vector3.normal(u, v, w);
- 
-    var uv = u.copy();
- 
-    var winding = normal.dot(uv.subtract(viewPoint));
- 
-    return (winding > 0);
-};
- 
-GameLib.D3.Vector3.normal = function (u, v, w) {
-    var vv = v.copy();
-    var wv = w.copy();
-    return vv.subtract(u).cross(wv.subtract(u));
-};
- 
-GameLib.D3.Vector3.prototype.lookAt = function (at, up) {
- 
-    var lookAtMatrix = GameLib.D3.Matrix4.lookAt(this, at, up);
- 
-    this.multiply(lookAtMatrix);
-};
- 
-GameLib.D3.Vector3.prototype.translate = function (v) {
-    this.x += v.x;
-    this.y += v.y;
-    this.z += v.z;
-    return this;
-};
- 
-GameLib.D3.Vector3.prototype.squared = function () {
-    return this.x * this.x + this.y * this.y + this.z * this.z;
-};
- 
-GameLib.D3.Vector3.prototype.copy = function () {
-    return new GameLib.D3.Vector3(
-        this.x,
-        this.y,
-        this.z
-    );
-};
- 
-GameLib.D3.Vector3.prototype.multiply = function (s) {
-    if (s instanceof GameLib.D3.Vector3) {
-        this.x *= s.x;
-        this.y *= s.y;
-        this.z *= s.z;
-    } else if (s instanceof GameLib.D3.Matrix4) {
-        var x = s.rows[0].x * this.x + s.rows[0].y * this.y + s.rows[0].z * this.z;
-        var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z;
-        var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z;
-        this.x = x;
-        this.y = y;
-        this.z = z;
-    } else {
-        console.log("functionality not implemented - please do this");
-        throw new Error("not implemented");
-    }
-    return this;
-};
- 
- 
-GameLib.D3.Vector3.prototype.dot = function (v) {
-    return (this.x * v.x) + (this.y * v.y) + (this.z * v.z);
-};
- 
-GameLib.D3.Vector3.prototype.normalize = function () {
- 
-    var EPSILON = 0.000001;
- 
-    var v2 = this.squared();
- 
-    if (v2 < EPSILON) {
-        return this; //do nothing for zero vector
-    }
- 
-    var invLength = 1 / Math.sqrt(v2);
- 
-    this.x *= invLength;
-    this.y *= invLength;
-    this.z *= invLength;
- 
-    return this;
-};
- 
-GameLib.D3.Vector4 = function(x, y, z, w) {
- 
-    this.x = 0;
-    this.y = 0;
-    this.z = 0;
-    this.w = 0;
- 
-    Iif (x) {
-        this.x = x;
-    }
- 
-    Iif (y) {
-        this.y = y;
-    }
- 
-    Iif (z) {
-        this.z = z;
-    }
- 
-    Iif (w) {
-        this.w = w;
-    }
-};
- 
-GameLib.D3.Vector4.prototype.translate = function (v) {
-    this.x += v.x;
-    this.y += v.y;
-    this.z += v.z;
-    return this;
-};
- 
-GameLib.D3.Vector4.prototype.copy = function () {
-    return new GameLib.D3.Vector4(
-        this.x,
-        this.y,
-        this.z,
-        this.w
-    );
-};
- 
-GameLib.D3.Vector4.prototype.multiply = function (s) {
-    if (s instanceof GameLib.D3.Vector3) {
-        this.x *= s.x;
-        this.y *= s.y;
-        this.z *= s.z;
-    } else if (s instanceof GameLib.D3.Matrix4) {
-        var x = s.rows[0].x * this.x + s.rows[0].y * this.y + s.rows[0].z * this.z + s.rows[0].w * this.w;
-        var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z + s.rows[1].w * this.w;
-        var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z + s.rows[2].w * this.w;
-        var w = s.rows[3].x * this.x + s.rows[3].y * this.y + s.rows[3].z * this.z + s.rows[3].w * this.w;
-        this.x = x;
-        this.y = y;
-        this.z = z;
-        this.w = w;
-    } else {
-        console.log("functionality not implemented - please do this");
-        throw new Error("not implemented");
-    }
-};
- 
- 
-GameLib.D3.Vector4.prototype.normalize = function () {
- 
-    // note - leave w untouched
-    var EPSILON = 0.000001;
- 
-    var v2 = this.x * this.x + this.y * this.y + this.z * this.z;
- 
-    if (v2 < EPSILON) {
-        return this; //do nothing for zero vector
-    }
- 
-    var invLength = 1 / Math.sqrt(v2);
- 
-    this.x *= invLength;
-    this.y *= invLength;
-    this.z *= invLength;
- 
-    return this;
-};
- 
-GameLib.D3.Vector4.prototype.subtract = function (v) {
- 
-    if (v instanceof GameLib.D3.Vector3) {
-        this.x -= v.x;
-        this.y -= v.y;
-        this.z -= v.z;
-    }
- 
-    if (v instanceof GameLib.D3.Vector4) {
-        this.x -= v.x;
-        this.y -= v.y;
-        this.z -= v.z;
-        this.w -= v.w;
-    }
- 
-    return this;
-};
- 
-GameLib.D3.Vector4.Points = function () {
-    this.vectors = [];
-};
- 
-GameLib.D3.Vector4.Points.prototype.add = function (vector) {
- 
-    if (vector instanceof GameLib.D3.Vector3) {
-        vector = new GameLib.D3.Vector4(
-            vector.x,
-            vector.y,
-            vector.z,
-            1
-        )
-    }
- 
-    if (!vector instanceof GameLib.D3.Vector4) {
-        console.warn("Vector needs to be of type Vector4");
-        throw new Error("Vector needs to be of type Vector4");
-    }
- 
-    this.vectors.push(vector);
- 
-    return this;
-};
- 
-GameLib.D3.Vector4.Points.prototype.copy = function () {
- 
-    var vectors = [];
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        vectors.push(this.vectors[i].copy());
-    }
- 
-    return vectors;
-};
- 
-GameLib.D3.Vector4.Points.prototype.maximizeXDistance = function (grain) {
- 
-//    console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2));
- 
-    var multiplier = 0;
- 
-    var rotationMatrixY = new GameLib.D3.Matrix4().rotationMatrixY(grain);
- 
-    var totalRadians = 0;
- 
-    var backupVectors = this.copy();
- 
-    var maxXDistance = 0;
- 
-    for (var i = 0; i < Math.PI * 2; i += grain) {
- 
-        multiplier++;
- 
-        for (var j = 0; j < this.vectors.length; j++) {
-            this.vectors[j] = rotationMatrixY.multiply(this.vectors[j]);
-        }
- 
-        var distances = this.distances();
- 
-        if (distances.x > maxXDistance) {
- 
-            maxXDistance = distances.x;
-            totalRadians = multiplier * grain;
-        }
-    }
- 
-    this.vectors = backupVectors;
- 
-//    console.log("distance: " + maxXDistance + " radians : " + totalRadians);
- 
-    var maxRotationMatrix = new GameLib.D3.Matrix4().rotationMatrixY(totalRadians);
- 
-    for (var k = 0; k < this.vectors.length; k++) {
-        this.vectors[k] = maxRotationMatrix.multiply(this.vectors[k]);
-    }
- 
-//    console.log("vectors (after): " + JSON.stringify(this.vectors, null, 2));
- 
-};
- 
-GameLib.D3.Vector4.Points.prototype.maximizeYDistance = function (grain) {
- 
-//    console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2));
- 
-    var multiplier = 0;
- 
-    var rotationMatrixX = new GameLib.D3.Matrix4().rotationMatrixX(grain);
- 
-    var totalRadians = 0;
- 
-    var backupVectors = this.copy();
- 
-    var maxYDistance = 0;
- 
-    for (var i = 0; i < Math.PI * 2; i += grain) {
- 
-        multiplier++;
- 
-        for (var j = 0; j < this.vectors.length; j++) {
-            this.vectors[j] = rotationMatrixX.multiply(this.vectors[j]);
-        }
- 
-        var distances = this.distances();
- 
-        if (distances.y > maxYDistance) {
-            maxYDistance = distances.y;
-            totalRadians = multiplier * grain;
-        }
-    }
- 
-    this.vectors = backupVectors;
- 
-//    console.log("distance: " + maxYDistance + " radians : " + totalRadians);
- 
-    var maxRotationMatrix = new GameLib.D3.Matrix4().rotationMatrixX(totalRadians);
- 
-    for (var k = 0; k < this.vectors.length; k++) {
-        this.vectors[k] = maxRotationMatrix.multiply(this.vectors[k]);
-    }
- 
-//    console.log("vectors (after): " + JSON.stringify(this.vectors, null, 2));
- 
-};
- 
- 
-GameLib.D3.Vector4.Points.prototype.lookAt = function (at, up) {
- 
-    var polyCenter = this.average();
- 
-    console.log("poly center : " + JSON.stringify(polyCenter));
- 
-    var lookAtMatrix = new GameLib.D3.Matrix4().lookAt(polyCenter, at, up);
- 
-    lookAtMatrix.rows[0] = new GameLib.D3.Vector4(1, 0, 0, 0);
-    lookAtMatrix.rows[1] = new GameLib.D3.Vector4(0, 0, 1, 0);
-    lookAtMatrix.rows[2] = new GameLib.D3.Vector4(0, 1, 0, 0);
- 
-    console.log("look at matrix : " + JSON.stringify(lookAtMatrix, null, 2));
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        console.log("vector " + i + " (before): " + JSON.stringify(this.vectors[i]));
-        this.vectors[i] = lookAtMatrix.multiply(this.vectors[i]);
-        console.log("vector " + i + " (after) : " + JSON.stringify(this.vectors[i]));
-    }
-};
- 
-GameLib.D3.Vector4.Points.prototype.distances = function () {
- 
-    var minX = this.vectors[0].x;
-    var minY = this.vectors[0].y;
-    var minZ = this.vectors[0].z;
- 
-    var maxX = this.vectors[0].x;
-    var maxY = this.vectors[0].y;
-    var maxZ = this.vectors[0].z;
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        if (this.vectors[i].x < minX) {
-            minX = this.vectors[i].x;
-        }
-        if (this.vectors[i].y < minY) {
-            minY = this.vectors[i].y;
-        }
-        if (this.vectors[i].z < minZ) {
-            minZ = this.vectors[i].z;
-        }
- 
-        if (this.vectors[i].x > maxX) {
-            maxX = this.vectors[i].x;
-        }
-        if (this.vectors[i].y > maxY) {
-            maxY = this.vectors[i].y;
-        }
-        if (this.vectors[i].z > maxZ) {
-            maxZ = this.vectors[i].z;
-        }
-    }
- 
-    return new GameLib.D3.Vector3(
-        Math.abs(maxX - minX),
-        Math.abs(maxY - minY),
-        Math.abs(maxY - minZ)
-    )
-};
- 
-GameLib.D3.Vector4.Points.prototype.average = function () {
-    var averageX = 0;
-    var averageY = 0;
-    var averageZ = 0;
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        averageX += this.vectors[i].x;
-        averageY += this.vectors[i].y;
-        averageZ += this.vectors[i].z;
-    }
- 
-    return new GameLib.D3.Vector3(
-        averageX / this.vectors.length,
-        averageY / this.vectors.length,
-        averageZ / this.vectors.length
-    );
-};
- 
-GameLib.D3.Vector4.Points.prototype.negative = function () {
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        this.vectors[i].x *= -1;
-        this.vectors[i].y *= -1;
-        this.vectors[i].z *= -1;
-    }
- 
-    return this;
-};
- 
- 
-GameLib.D3.Vector4.Points.prototype.toOrigin = function () {
- 
-    var distanceFromOrigin = this.average().negative();
- 
-    for (var i = 0; i < this.vectors.length; i++) {
-        this.vectors[i].translate(distanceFromOrigin);
-    }
-};
- 
-/**
- * The normal gets assigned when the face calculates its normal
- * @param position
- * @param boneWeights GameLib.D3.BoneWeight[]
- * @constructor
- */
-GameLib.D3.Vertex = function(
-    position,
-    boneWeights
-) {
-    this.position = position;
-    this.boneWeights = boneWeights;
-};
-/**
- * World SuperSet - contains the custom world instance
- * @param id
- * @param name
- * @param engine
- * @param gravity
- * @param broadphase
- * @param solver
- * @param rigidBodies
- * @constructor
- */
-GameLib.D3.World = function(
-    id,
-    name,
-    engine,
-    gravity,
-    broadphase,
-    solver,
-    rigidBodies
-) {
- 
-    this.id = id;
- 
-    this.name = name;
- 
-    if (typeof gravity == 'undefined') {
-        gravity = new GameLib.D3.Vector3(0, -9.81, 0);
-    }
-    this.gravity = gravity;
- 
-    if (typeof broadphase == 'undefined') {
-        broadphase = new GameLib.D3.Physics.Broadphase(
-            null,
-            'broadPhaseNaive',
-            GameLib.D3.Physics.BROADPHASE_TYPE_NAIVE
-        );
-    }
-    this.broadphase = broadphase;
- 
-    if (typeof solver == 'undefined') {
-        solver = new GameLib.D3.Physics.Solver(
-            null,
-            'GSSolver',
-            GameLib.D3.Physics.GS_SOLVER
-        );
-    }
-    this.solver = solver;
- 
-    if (typeof rigidBodies == 'undefined') {
-        rigidBodies = [];
-    }
-    this.rigidBodies = rigidBodies;
- 
-    this.engine = engine;
- 
-    this.engine.isNotCannonThrow();
- 
-    this.instance = this.createInstance();
-};
- 
-/**
- * private
- * @returns {GameLib.D3.World|GameLib.D3.Physics.World|*}
- */
-GameLib.D3.World.prototype.createInstance = function() {
- 
-    var instance = new this.engine.instance.World();
- 
-    instance.broadphase = this.broadphase.instance;
- 
-    instance.solver = this.solver.instance;
- 
-    instance.gravity.x = this.gravity.x;
-    instance.gravity.y = this.gravity.y;
-    instance.gravity.z = this.gravity.z;
- 
-    instance.name = this.name;
- 
-    return instance;
-};
- 
-/**
- *
- * @param rigidBody GameLib.D3.RigidBody
- * @constructor
- */
-GameLib.D3.World.prototype.addRigidBody = function(
-    rigidBody
-) {
-    this.instance.addBody(rigidBody.instance);
-};
- 
-/**
- *
- * @param vehicle (GameLib.D3.RigidBodyVehicle | GameLib.D3.RaycastVehicle)
- * @constructor
- */
-GameLib.D3.World.prototype.addVehicle = function(
-    vehicle // note: physics.vehicle
-) {
-    vehicle.instance.addToWorld(this.world.instance);
-};
- 
-GameLib.D3.World.prototype.step = function(
-    timeStep
-) {
-    // todo: figure out, why this call to internal step is more stable for trimesh collisions.....
-    //this.worldObject.internalStep(timeStep);
-    //return;
- 
-    var now = performance.now() / 1000;
-    if(!this.lastCallTime){
-        // last call time not saved, cant guess elapsed time. Take a simple step.
-        this.instance.step(timeStep);
-        this.lastCallTime = now;
-        return;
-    }
- 
-    var timeSinceLastCall = now - this.lastCallTime;
- 
-    this.instance.step(timeStep, timeSinceLastCall);
- 
-    this.lastCallTime = now;
-};
- 
-GameLib.D3.World.prototype.GetIndexedVertices = function(
-    triangleMeshShape
-) {
- 
-    if(this.engine.engineType == GameLib.D3.Physics.TYPE_CANNON) {
- 
-        return {
-            vertices : triangleMeshShape.vertices,
-            indices : triangleMeshShape.indices
-        };
- 
-    } else {
-        // todo: implement this for other physics engines.
-        return null;
-    }
- 
-};
- 
-/**
- * @param triangleMeshShape GameLib.D3.Shape
- * @param normalLength Number
- * @param scale GameLib.D3.Vector3
- * @param opacity Number
- * @param wireframeColor HexCode
- * @param graphics THREE
- * @returns {THREE.Mesh|this.meshes}
- * @constructor
- */
-GameLib.D3.World.prototype.generateWireframeViewTriangleMesh = function(
-    graphics,
-    triangleMeshShape,
-    normalLength,
-    scale,
-    opacity,
-    wireframeColor
-) {
-    graphics.isNotThreeThrow();
-    this.engine.isNotCannonThrow();
- 
-    if(typeof normalLength == 'undefined') {
-        normalLength = 10;
-    }
- 
-    if(typeof scale == 'undefined') {
-        scale = new graphics.instance.Vector3(1, 1, 1);
-    }
- 
-    if(typeof opacity == 'undefined') {
-        opacity = 0.5;
-    }
- 
-    if(typeof wireframeColor == 'undefined') {
-        wireframeColor = 0xfefefe;
-    }
- 
-    var graphicsGeometry = new graphics.instance.Geometry();
- 
-    var wireframeMesh = new graphics.instance.Mesh(
-        graphicsGeometry,
-        new graphics.instance.MeshBasicMaterial({
-            color: wireframeColor,
-            wireframe: true,
-            opacity: opacity
-        })
-    );
- 
-    for(var i = 0, l = triangleMeshShape.instance.vertices.length / 3; i < l; ++i) {
-        graphicsGeometry.vertices.push(
-            new graphics.instance.Vector3(
-                triangleMeshShape.instance.vertices[i * 3],
-                triangleMeshShape.instance.vertices[i * 3 + 1],
-                triangleMeshShape.instance.vertices[i * 3 + 2]
-            )
-        );
-    }
- 
-    for(var i = 0, l = triangleMeshShape.instance.indices.length / 3; i < l; ++i) {
-        var i0 = triangleMeshShape.instance.indices[i * 3];
-        var i1 = triangleMeshShape.instance.indices[i * 3 + 1];
-        var i2 = triangleMeshShape.instance.indices[i * 3 + 2];
- 
-        graphicsGeometry.faces.push(
-            new graphics.instance.Face3(
-                i0,
-                i1,
-                i2
-            )
-        );
- 
-        // Center point on the current triangle
- 
-        var centroid = new graphics.instance.Vector3()
-            .add(graphicsGeometry.vertices[i0])
-            .add(graphicsGeometry.vertices[i1])
-            .add(graphicsGeometry.vertices[i2])
-            .divideScalar(3);
- 
-        // Get the normal from the mesh shape itself
-        var normal = new this.engine.instance.Vec3();
-        triangleMeshShape.instance.getNormal(i , normal);
- 
-        var arrow = new graphics.instance.ArrowHelper(
-            new graphics.instance.Vector3(
-                normal.x,
-                normal.y,
-                normal.z
-            ),
-            centroid,
-            normalLength,
-            new graphics.instance.Color(
-                normal.x,
-                normal.y,
-                normal.z
-            )
-        );
-        wireframeMesh.add( arrow );
-    }
- 
-    wireframeMesh.scale.x = scale.x;
-    wireframeMesh.scale.y = scale.y;
-    wireframeMesh.scale.z = scale.z;
- 
-    return wireframeMesh;
-};
- 
-/**
- * @param convexPolyMeshShape GameLib.D3.Shape
- * @param normalLength Number
- * @param scale GameLib.D3.Vector3
- * @param opacity Number
- * @param wireframeColor HexCode
- * @param graphics THREE
- * @returns {THREE.Mesh|this.meshes}
- * @constructor
- */
-GameLib.D3.World.prototype.generateWireframeViewConvexPolyMesh = function(
-    graphics,
-    convexPolyMeshShape,
-    normalLength,
-    scale,
-    opacity,
-    wireframeColor
-) {
-    graphics.isNotThreeThrow();
-    this.engine.isNotCannonThrow();
- 
-    if(typeof normalLength == 'undefined') {
-        normalLength = 10;
-    }
- 
-    if(typeof scale == 'undefined') {
-        scale = new graphics.instance.Vector3(1, 1, 1);
-    }
- 
-    if(typeof opacity == 'undefined') {
-        opacity = 0.5;
-    }
- 
-    if(typeof wireframeColor == 'undefined') {
-        wireframeColor = 0xfefefe;
-    }
- 
- 
-    var graphicsGeometry = new graphics.instance.Geometry();
-    var wireframeMesh = new graphics.instance.Mesh(
-        graphicsGeometry,
-        new graphics.instance.MeshBasicMaterial({
-            color: wireframeColor,
-            wireframe: true,
-            opacity: opacity
-        })
-    );
- 
-    for(var i = 0, l = convexPolyMeshShape.instance.vertices.length; i < l; i++) {
-        var vertex = convexPolyMeshShape.instance.vertices[i];
-        graphicsGeometry.vertices.push(new graphics.instance.Vector3(vertex.x, vertex.y, vertex.z));
-    }
- 
-    for(var i = 0, l = convexPolyMeshShape.instance.faces.length; i < l; i++) {
-        var face = convexPolyMeshShape.instance.faces[i];
- 
-        var i0 = face[0];
-        var i1 = face[1];
-        var i2 = face[2];
- 
-        graphicsGeometry.faces.push(new graphics.instance.Face3(i0, i1, i2));
- 
-        // Center point on the current triangle
-        var centroid = new graphics.instance.Vector3()
-            .add(graphicsGeometry.vertices[i0])
-            .add(graphicsGeometry.vertices[i1])
-            .add(graphicsGeometry.vertices[i2])
-            .divideScalar(3);
- 
-        var normalVec3 = convexPolyMeshShape.instance.faceNormals[i];
-        var normal = new graphics.instance.Vector3(
-            normalVec3.x,
-            normalVec3.y,
-            normalVec3.z
-        );
- 
-        var arrow = new graphics.instance.ArrowHelper(
-            normal,
-            centroid,
-            normalLength,
-            new graphics.instance.Color(
-                normal.x,
-                normal.y,
-                normal.z
-            )
-        );
- 
-        wireframeMesh.add( arrow );
-    }
- 
-    wireframeMesh.scale.x = scale.x;
-    wireframeMesh.scale.y = scale.y;
-    wireframeMesh.scale.z = scale.z;
- 
-    return wireframeMesh;
-};
- 
-/**
- * @param graphics GameLib.D3.Graphics
- * @param graphicsMesh  THREE.Mesh
- * @param mass Number
- * @param friction Number
- * @param createCollisionSubMeshes Boolean
- * @param facesPerSubsection Number
- * @param subsectionsToMerge Number
- * @returns {Object}
- * @constructor
- */
-GameLib.D3.World.prototype.generateTriangleMeshShapeDivided = function(
-    graphics,
-    graphicsMesh,
-    mass,
-    friction,
-    createCollisionSubMeshes,
-    facesPerSubsection,
-    subsectionsToMerge
-) {
-    graphics.isNotThreeThrow();
-    this.engine.isNotCannonThrow();
- 
-    if(mass == null || typeof mass == 'undefined') {
-        mass = 0;
-    }
- 
-    if(friction == null || typeof friction == 'undefined') {
-        friction = 10;
-    }
- 
-    if(createCollisionSubMeshes == null || typeof createCollisionSubMeshes == 'undefined') {
-        createCollisionSubMeshes = false;
-    }
- 
-    var processedFaces = 0;
-    var facesPerSubSection = facesPerSubsection || 0;
-    var subMeshesToMerge = subsectionsToMerge || 0;
-    var totalAmtFaces = graphicsMesh.geometry.faces.length;
-    var facesToProcess = createCollisionSubMeshes ? (subMeshesToMerge * facesPerSubSection) : totalAmtFaces;
- 
-    var pairs = []; // output
- 
-    var vertices = [];
-    var indicies = [];
- 
-    for(var i = 0; i <= totalAmtFaces; i++) {
-        if(processedFaces == facesToProcess || i == totalAmtFaces) {
- 
-            var body = null;
- 
-            var meshShape = new this.engine.instance.Trimesh(vertices, indicies);
- 
-            meshShape.setScale(new this.engine.instance.Vec3(
-                graphicsMesh.scale.x,
-                graphicsMesh.scale.y,
-                graphicsMesh.scale.z
-            ));
- 
-            meshShape.updateAABB();
-            meshShape.updateNormals();
-            meshShape.updateEdges();
-            meshShape.updateBoundingSphereRadius();
-            meshShape.updateTree();
- 
-            body = new this.engine.instance.Body({
-                mass: mass,
-                friction: friction
-            });
-            body.addShape(meshShape);
- 
-            pairs.push({
-                threeObject : createCollisionSubMeshes ? null : graphicsMesh,
-                physicsObject : body
-            });
- 
-            vertices = [];
-            indicies = [];
-            processedFaces = 0;
- 
-            if(i == totalAmtFaces) {
-                return pairs;
-            }
-        }
- 
-        var face = graphicsMesh.geometry.faces[i];
-        indicies.push(indicies.length);
-        indicies.push(indicies.length);
-        indicies.push(indicies.length);
- 
-        var v0 = graphicsMesh.geometry.vertices[face.a];
-        var v1 = graphicsMesh.geometry.vertices[face.b];
-        var v2 = graphicsMesh.geometry.vertices[face.c];
- 
-        vertices.push(v0.x, v0.y, v0.z);
-        vertices.push(v1.x, v1.y, v1.z);
-        vertices.push(v2.x, v2.y, v2.z);
- 
-        processedFaces++;
-    }
-};
- 
-/**
- * @param graphics GameLib.D3.Graphics
- * @param graphicsMesh  THREE.Mesh
- * @returns {GameLib.D3.RigidBody}
- * @constructor
- */
-GameLib.D3.World.prototype.generateTriangleMeshShape = function(
-    graphics,
-    graphicsMesh
-) {
- 
-    // - - - - - - - - - - - - - - - - - - - - - - - - -
-    // Note: I did not test this yet with the API data.
-    // - - - - - - - - - - - - - - - - - - - - - - - - -
- 
-    var scaledVertices = [];
-    for(var i = 0, l = graphicsMesh.geometry.vertices.length; i < l; i++) {
- 
-        var vertex = graphicsMesh.geometry.vertices[i];
- 
-        scaledVertices.push(new this.engine.instance.Vec3(
-            vertex.x * graphicsMesh.scale.x,
-            vertex.y * graphicsMesh.scale.y,
-            vertex.z * graphicsMesh.scale.z
-        ));
- 
-    }
- 
-    var triangleFaces = [];
-    for(var f = 0, fl = graphicsMesh.geometry.faces.length; f < fl; f++) {
-        var i0 = graphicsMesh.geometry.faces[f].a;
-        var i1 = graphicsMesh.geometry.faces[f].b;
-        var i2 = graphicsMesh.geometry.faces[f].c;
- 
-        triangleFaces.push([
-            i0,
-            i1,
-            i2
-        ]);
-    }
- 
-    // - - - - - - - - - - - - - - - - - - -
-    // Create collision mesh
-    // - - - - - - - - - - - - - - - - - - -
- 
-    var reindexedFaces = {};
-    var vertices = [];
-    var faces = [];
- 
-    var processedFaces = 0;
-    var totalFacesToProcess = triangleFaces.length;
-    var flLastIndex = 0;
- 
-    for(var f = 0; f < totalFacesToProcess; f++) {
- 
-        var i0 = triangleFaces[f][0];
-        var i1 = triangleFaces[f][1];
-        var i2 = triangleFaces[f][2];
- 
-        if(typeof reindexedFaces[i0] === 'undefined') {
-            vertices.push(scaledVertices[i0].x, scaledVertices[i0].y, scaledVertices[i0].z);
-            reindexedFaces[i0] = flLastIndex;
-            flLastIndex++;
-        }
- 
-        if(typeof reindexedFaces[i1] === 'undefined') {
-            vertices.push(scaledVertices[i1].x, scaledVertices[i1].y, scaledVertices[i1].z);
-            reindexedFaces[i1] = flLastIndex;
-            flLastIndex++;
-        }
- 
-        if(typeof reindexedFaces[i2] === 'undefined') {
-            vertices.push(scaledVertices[i2].x, scaledVertices[i2].y, scaledVertices[i2].z);
-            reindexedFaces[i2] = flLastIndex;
-            flLastIndex++;
-        }
- 
-        faces.push(reindexedFaces[i0], reindexedFaces[i1], reindexedFaces[i2]);
- 
-        processedFaces++;
-    }
- 
-    var shape = GameLib.D3.Shape(this.engine, GameLib.D3.Shape.SHAPE_TYPE_TRIMESH, graphicsMesh.scale, vertices, faces);
-    var body = GameLib.D3.RigidBody(this.engine, 0, 12);
- 
-    body.addShape(shape);
-    this.addRigidBody(body);
- 
-    // process the mesh children recursively
-    for(var c in graphicsMesh.children) {
-        this.generateTriangleMeshShape(graphics, graphicsMesh.children[c]);
-    }
- 
-    return body;
-};
- 
-/**
- * @param triangleMeshBody GameLib.D3.RigidBody
- * @param rayscale Number
- * @param maxTriangleDistance Number
- * @param createCompoundShape Boolean
- * @param graphics GameLib.D3.Graphics
- * @param triangleMeshShapes  GameLib.D3.Shape[]
- * @param createDebugView Boolean
- * @returns {GameLib.D3.RigidBody}
- * @constructor
- */
-GameLib.D3.World.prototype.fixupTriangleMeshShape = function(
-    triangleMeshBody,
-    triangleMeshShapes,
-    rayscale,
-    maxTriangleDistance,
-    createCompoundShape,
-    graphics,
-    createDebugView
-) {
-    this.engine.isNotCannonThrow();
- 
-    graphics.isNotThreeThrow();
- 
-    if(rayscale == null || typeof rayscale == 'undefined' || rayscale == 0) {
-        rayscale = 10;
-    }
- 
-    if(maxTriangleDistance == null || typeof maxTriangleDistance == 'undefined') {
-        maxTriangleDistance = 13;
-    }
- 
-    var world = this.instance;
- 
-    var raycastResult = new this.engine.instance.RaycastResult();
- 
-    var brokenFaceIndicators = [];
-    var wireframeMeshes = [];
- 
-    var totalFaces = 0;
-    var totalBrokenFaces = 0;
-    var totalFixedFaces = 0;
-    var fixedTriangleMeshObjects = [];
- 
-    for(var i in triangleMeshShapes) {
-        var trimesh = triangleMeshShapes[i];
- 
-        var brokenFaces = [];
-        totalFaces += (trimesh.indices.length / 3);
- 
-        for(var face = 0; face < trimesh.indices.length / 3; face++) {
- 
-            var i0 = trimesh.indices[face * 3];
-            var i1 = trimesh.indices[face * 3 + 1];
-            var i2 = trimesh.indices[face * 3 + 2];
- 
-            var triangleCenterPoint = new graphics.instance.Vector3()
-                .add(new graphics.instance.Vector3(
-                    trimesh.vertices[i0 * 3],
-                    trimesh.vertices[i0 * 3 + 1],
-                    trimesh.vertices[i0 * 3 + 2])
-                )
-                .add(new graphics.instance.Vector3(
-                    trimesh.vertices[i1 * 3],
-                    trimesh.vertices[i1 * 3 + 1],
-                    trimesh.vertices[i1 * 3 + 2])
-                )
-                .add(new graphics.instance.Vector3(
-                    trimesh.vertices[i2 * 3],
-                    trimesh.vertices[i2 * 3 + 1],
-                    trimesh.vertices[i2 * 3 + 2])
-                )
-                .divideScalar(3);
- 
-            var triangleNormal = new this.engine.instance.Vec3();
-            trimesh.getNormal(face , triangleNormal);
- 
-            var from = new this.engine.instance.Vec3(
-                triangleCenterPoint.x + triangleNormal.x,
-                triangleCenterPoint.y + triangleNormal.y,
-                triangleCenterPoint.z + triangleNormal.z
-            );
- 
-            var to = new this.engine.instance.Vec3(
-                from.x - triangleNormal.x * rayscale,
-                from.y - triangleNormal.y * rayscale,
-                from.z - triangleNormal.z * rayscale
-            );
- 
-            world.raycastClosest(from, to, {}, raycastResult);
- 
-            // visualize results
-            if(createDebugView){
-                var graphicsGeometry = new graphics.instance.Geometry();
-                var wireframeMesh = new graphics.instance.Mesh(
-                    graphicsGeometry,
-                    new graphics.instance.MeshBasicMaterial({
-                        color: 0xff0000,
-                        wireframe: true,
-                        opacity: 1
-                    })
-                );
- 
-                var arrow = new graphics.instance.ArrowHelper(
-                    new graphics.instance.Vector3(
-                        triangleNormal.x,
-                        triangleNormal.y,
-                        triangleNormal.z
-                    ).normalize(),
- 
-                    new graphics.instance.Vector3(
-                        from.x,
-                        from.y,
-                        from.z
-                    ),
- 
-                    rayscale / 2,
-                    raycastResult.hasHit ? new graphics.instance.Color(0, 1, 0)
-                                         : new graphics.instance.Color(1, 0, 0)
-                );
- 
-                wireframeMesh.add( arrow );
- 
-                wireframeMeshes.add(wireframeMesh);
-                brokenFaceIndicators.push(wireframeMesh);
-            }
- 
-            if(!raycastResult.hasHit) {
-                brokenFaces.push({
-                    faceIndex : face,
- 
-                    vertices : [
-                        new this.engine.instance.Vec3(
-                            trimesh.vertices[i0 * 3],
-                            trimesh.vertices[i0 * 3 + 1],
-                            trimesh.vertices[i0 * 3 + 2]
-                        ),
- 
-                        new this.engine.instance.Vec3(
-                            trimesh.vertices[i1 * 3],
-                            trimesh.vertices[i1 * 3 + 1],
-                            trimesh.vertices[i1 * 3 + 2]
-                        ),
- 
-                        new this.engine.instance.Vec3(
-                            trimesh.vertices[i2 * 3],
-                            trimesh.vertices[i2 * 3 + 1],
-                            trimesh.vertices[i2 * 3 + 2]
-                        )
-                    ],
- 
-                    center : triangleCenterPoint,
- 
-                    parent : trimesh
-                });
-            }
-        }
- 
-        // fix up broken faces
- 
-        var bFaceIndexed = {};
-        for(var b = 0; b < brokenFaces.length; b++) {
-            var brokenFace = brokenFaces[b];
- 
-            if(brokenFace.marked) {
-                continue;
-            }
- 
-            bFaceIndexed[b] = {
-                indices : [],
-                vertices : []
-            };
- 
-            var indicesAmount = bFaceIndexed[b].indices.length;
- 
-            // add the current broken face itself to the array
-            bFaceIndexed[b].indices.push(
-                indicesAmount,
-                indicesAmount + 1,
-                indicesAmount + 2
-            );
- 
-            bFaceIndexed[b].vertices.push(
-                brokenFace.vertices[0].x,
-                brokenFace.vertices[0].y,
-                brokenFace.vertices[0].z
-            );
- 
-            bFaceIndexed[b].vertices.push(
-                brokenFace.vertices[1].x,
-                brokenFace.vertices[1].y,
-                brokenFace.vertices[1].z
-            );
- 
-            bFaceIndexed[b].vertices.push(
-                brokenFace.vertices[2].x,
-                brokenFace.vertices[2].y,
-                brokenFace.vertices[2].z
-            );
- 
-            for(var bb = 0; bb < brokenFaces.length; bb++) {
- 
-                if(bb == b) {
-                    continue;
-                }
- 
-                var otherBrokenFace = brokenFaces[bb];
- 
-                if(otherBrokenFace.marked) {
-                    continue;
-                }
- 
-                if(brokenFace.center.distanceTo(otherBrokenFace.center) <= maxTriangleDistance) {
-                    var indicesAmount = bFaceIndexed[b].indices.length;
- 
-                    bFaceIndexed[b].indices.push(
-                        indicesAmount,
-                        indicesAmount + 1,
-                        indicesAmount + 2
-                    );
- 
-                    bFaceIndexed[b].vertices.push(
-                        otherBrokenFace.vertices[0].x,
-                        otherBrokenFace.vertices[0].y,
-                        otherBrokenFace.vertices[0].z
-                    );
- 
-                    bFaceIndexed[b].vertices.push(
-                        otherBrokenFace.vertices[1].x,
-                        otherBrokenFace.vertices[1].y,
-                        otherBrokenFace.vertices[1].z
-                    );
- 
-                    bFaceIndexed[b].vertices.push(
-                        otherBrokenFace.vertices[2].x,
-                        otherBrokenFace.vertices[2].y,
-                        otherBrokenFace.vertices[2].z
-                    );
- 
-                    otherBrokenFace.marked = true;
-                }
-            }
-        }
- 
- 
-        // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-        // Decide if we want to create new rigid bodies, or create a compound mesh
-        // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- 
-        for(var e in bFaceIndexed) {
-            var element = bFaceIndexed[e];
- 
-            var shape = new GameLib.D3.Shape(this.engine, GameLib.D3.Shape.SHAPE_TYPE_TRIMESH, null, element.vertices, element.indices);
- 
-            if(createCompoundShape) {
-                triangleMeshBody.addShape(shape);
-            } else {
- 
-                var body = new GameLib.D3.RigidBody(this.engine, 0, 12);
-                body.addShape(shape);
-                this.instance.addRigidBody(body);
-            }
- 
-            fixedTriangleMeshObjects.push(shape);
-            totalFixedFaces += element.indices.length / 3;
- 
-            console.log("created mesh shape", element.indices.length / 3);
-        }
- 
-        // TODO: remove duplicate indices
-        /*trimesh.updateNormals();
-         trimesh.updateEdges();
-         trimesh.updateTree();
-         trimesh.updateAABB();
-         trimesh.updateBoundingSphereRadius();*/
- 
-        // map faceIndex to flat face index (faceIndex * 3) +0, 1, 2 -> triangle indices
-        console.log("i = " + i, brokenFaces);
-        totalBrokenFaces += brokenFaces.length;
-    }
- 
-    console.log("total faces", totalFaces);
-    console.log("total broken faces", totalBrokenFaces);
-    console.log("broken faces in percent", (totalBrokenFaces / totalFaces) * 100);
-    console.log("total fixed faces", totalFixedFaces);
-    console.log("fixed triangle mesh shapes", fixedTriangleMeshObjects.length);
- 
-    return {
-        brokenFaceIndicators : brokenFaceIndicators,
-        fixedTriangleMeshShapes : fixedTriangleMeshObjects,
-        wireframeMeshes : wireframeMeshes
-    };
-};
-Eif (typeof module !== 'undefined') {
-    module.exports = GameLib;
-}
-
-
- - - - - - - diff --git a/build/coverage/lcov-report/build/index.html b/build/coverage/lcov-report/build/index.html deleted file mode 100644 index f7c4869..0000000 --- a/build/coverage/lcov-report/build/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Code coverage report for build/ - - - - - - - -
-
-

- all files build/ -

-
-
- 17.41% - Statements - 361/2074 -
-
- 4.94% - Branches - 40/810 -
-
- 8.44% - Functions - 13/154 -
-
- 17.41% - Lines - 361/2074 -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
game-lib.js
17.41%361/20744.94%40/8108.44%13/15417.41%361/2074
-
-
- - - - - - - diff --git a/build/coverage/lcov-report/index.html b/build/coverage/lcov-report/index.html deleted file mode 100644 index 25c41b4..0000000 --- a/build/coverage/lcov-report/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - Code coverage report for All files - - - - - - - -
-
-

- / -

-
-
- 17.41% - Statements - 361/2074 -
-
- 4.94% - Branches - 40/810 -
-
- 8.44% - Functions - 13/154 -
-
- 17.41% - Lines - 361/2074 -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FileStatementsBranchesFunctionsLines
build/
17.41%361/20744.94%40/8108.44%13/15417.41%361/2074
-
-
- - - - - - - diff --git a/build/coverage/lcov-report/prettify.css b/build/coverage/lcov-report/prettify.css deleted file mode 100644 index b317a7c..0000000 --- a/build/coverage/lcov-report/prettify.css +++ /dev/null @@ -1 +0,0 @@ -.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/build/coverage/lcov-report/prettify.js b/build/coverage/lcov-report/prettify.js deleted file mode 100644 index ef51e03..0000000 --- a/build/coverage/lcov-report/prettify.js +++ /dev/null @@ -1 +0,0 @@ -window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/build/coverage/lcov-report/sort-arrow-sprite.png b/build/coverage/lcov-report/sort-arrow-sprite.png deleted file mode 100644 index 03f704a609c6fd0dbfdac63466a7d7c958b5cbf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>Jii$m5978H@?Fn+^JD|Y9yzj{W`447Gxa{7*dM7nnnD-Lb z6^}Hx2)'; - } - } - return cols; - } - // attaches a data attribute to every tr element with an object - // of data values keyed by column name - function loadRowData(tableRow) { - var tableCols = tableRow.querySelectorAll('td'), - colNode, - col, - data = {}, - i, - val; - for (i = 0; i < tableCols.length; i += 1) { - colNode = tableCols[i]; - col = cols[i]; - val = colNode.getAttribute('data-value'); - if (col.type === 'number') { - val = Number(val); - } - data[col.key] = val; - } - return data; - } - // loads all row data - function loadData() { - var rows = getTableBody().querySelectorAll('tr'), - i; - - for (i = 0; i < rows.length; i += 1) { - rows[i].data = loadRowData(rows[i]); - } - } - // sorts the table using the data for the ith column - function sortByIndex(index, desc) { - var key = cols[index].key, - sorter = function (a, b) { - a = a.data[key]; - b = b.data[key]; - return a < b ? -1 : a > b ? 1 : 0; - }, - finalSorter = sorter, - tableBody = document.querySelector('.coverage-summary tbody'), - rowNodes = tableBody.querySelectorAll('tr'), - rows = [], - i; - - if (desc) { - finalSorter = function (a, b) { - return -1 * sorter(a, b); - }; - } - - for (i = 0; i < rowNodes.length; i += 1) { - rows.push(rowNodes[i]); - tableBody.removeChild(rowNodes[i]); - } - - rows.sort(finalSorter); - - for (i = 0; i < rows.length; i += 1) { - tableBody.appendChild(rows[i]); - } - } - // removes sort indicators for current column being sorted - function removeSortIndicators() { - var col = getNthColumn(currentSort.index), - cls = col.className; - - cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); - col.className = cls; - } - // adds sort indicators for current column being sorted - function addSortIndicators() { - getNthColumn(currentSort.index).className += currentSort.desc ? ' sorted-desc' : ' sorted'; - } - // adds event listeners for all sorter widgets - function enableUI() { - var i, - el, - ithSorter = function ithSorter(i) { - var col = cols[i]; - - return function () { - var desc = col.defaultDescSort; - - if (currentSort.index === i) { - desc = !currentSort.desc; - } - sortByIndex(i, desc); - removeSortIndicators(); - currentSort.index = i; - currentSort.desc = desc; - addSortIndicators(); - }; - }; - for (i =0 ; i < cols.length; i += 1) { - if (cols[i].sortable) { - // add the click event handler on the th so users - // dont have to click on those tiny arrows - el = getNthColumn(i).querySelector('.sorter').parentElement; - if (el.addEventListener) { - el.addEventListener('click', ithSorter(i)); - } else { - el.attachEvent('onclick', ithSorter(i)); - } - } - } - } - // adds sorting functionality to the UI - return function () { - if (!getTable()) { - return; - } - cols = loadColumns(); - loadData(cols); - addSortIndicators(); - enableUI(); - }; -})(); - -window.addEventListener('load', addSorting); diff --git a/build/coverage/lcov.info b/build/coverage/lcov.info deleted file mode 100644 index 2662927..0000000 --- a/build/coverage/lcov.info +++ /dev/null @@ -1,3201 +0,0 @@ -TN: -SF:/usr/share/gamewheel/game-lib/build/game-lib.js -FN:2,GameLib -FN:6,(anonymous_2) -FN:23,(anonymous_3) -FN:44,(anonymous_4) -FN:104,(anonymous_5) -FN:138,(anonymous_6) -FN:180,(anonymous_7) -FN:192,(anonymous_8) -FN:204,(anonymous_9) -FN:211,(anonymous_10) -FN:222,(anonymous_11) -FN:230,(anonymous_12) -FN:241,(anonymous_13) -FN:260,(anonymous_14) -FN:310,(anonymous_15) -FN:321,(anonymous_16) -FN:332,(anonymous_17) -FN:342,(anonymous_18) -FN:350,(anonymous_19) -FN:402,(anonymous_20) -FN:411,(anonymous_21) -FN:425,(anonymous_22) -FN:458,(anonymous_23) -FN:490,(anonymous_24) -FN:498,(anonymous_25) -FN:504,(anonymous_26) -FN:510,(anonymous_27) -FN:518,(anonymous_28) -FN:524,(anonymous_29) -FN:584,(anonymous_30) -FN:602,(anonymous_31) -FN:614,(anonymous_32) -FN:621,(anonymous_33) -FN:641,(anonymous_34) -FN:681,(anonymous_35) -FN:736,(anonymous_36) -FN:743,(anonymous_37) -FN:796,(anonymous_38) -FN:851,(anonymous_39) -FN:985,(anonymous_40) -FN:1439,(anonymous_41) -FN:1603,(anonymous_42) -FN:1607,(anonymous_43) -FN:1625,(anonymous_44) -FN:1648,(anonymous_45) -FN:1655,(anonymous_46) -FN:1681,(anonymous_47) -FN:1688,(anonymous_48) -FN:1705,(anonymous_49) -FN:1712,(anonymous_50) -FN:1718,(anonymous_51) -FN:1724,(anonymous_52) -FN:1730,(anonymous_53) -FN:1747,(anonymous_54) -FN:1756,(anonymous_55) -FN:1852,(anonymous_56) -FN:1955,(anonymous_57) -FN:2070,(anonymous_58) -FN:2088,(anonymous_59) -FN:2173,(anonymous_60) -FN:2181,inProcessed -FN:2199,neighbourOnEdge -FN:2331,(anonymous_63) -FN:2375,(anonymous_64) -FN:2407,(anonymous_65) -FN:2425,(anonymous_66) -FN:2441,(anonymous_67) -FN:2465,(anonymous_68) -FN:2475,(anonymous_69) -FN:2487,(anonymous_70) -FN:2490,(anonymous_71) -FN:2663,(anonymous_72) -FN:2704,(anonymous_73) -FN:2727,(anonymous_74) -FN:2735,(anonymous_75) -FN:2745,(anonymous_76) -FN:2791,(anonymous_77) -FN:2837,(anonymous_78) -FN:2886,(anonymous_79) -FN:2925,(anonymous_80) -FN:2954,(anonymous_81) -FN:3031,(anonymous_82) -FN:3054,(anonymous_83) -FN:3055,(anonymous_84) -FN:3260,(anonymous_85) -FN:3427,(anonymous_86) -FN:3428,(anonymous_87) -FN:3465,(anonymous_88) -FN:3473,(anonymous_89) -FN:3562,(anonymous_90) -FN:3584,(anonymous_91) -FN:3672,(anonymous_92) -FN:3724,(anonymous_93) -FN:3757,(anonymous_94) -FN:3815,(anonymous_95) -FN:3826,(anonymous_96) -FN:3866,(anonymous_97) -FN:3894,(anonymous_98) -FN:3948,(anonymous_99) -FN:4139,(anonymous_100) -FN:4167,(anonymous_101) -FN:4196,(anonymous_102) -FN:4204,(anonymous_103) -FN:4231,(anonymous_104) -FN:4323,(anonymous_105) -FN:4330,(anonymous_106) -FN:4339,(anonymous_107) -FN:4361,(anonymous_108) -FN:4415,(anonymous_109) -FN:4432,(anonymous_110) -FN:4472,(anonymous_111) -FN:4486,(anonymous_112) -FN:4493,(anonymous_113) -FN:4500,(anonymous_114) -FN:4519,(anonymous_115) -FN:4534,(anonymous_116) -FN:4542,(anonymous_117) -FN:4549,(anonymous_118) -FN:4560,(anonymous_119) -FN:4566,(anonymous_120) -FN:4573,(anonymous_121) -FN:4580,(anonymous_122) -FN:4584,(anonymous_123) -FN:4592,(anonymous_124) -FN:4612,(anonymous_125) -FN:4616,(anonymous_126) -FN:4635,(anonymous_127) -FN:4659,(anonymous_128) -FN:4666,(anonymous_129) -FN:4675,(anonymous_130) -FN:4696,(anonymous_131) -FN:4716,(anonymous_132) -FN:4734,(anonymous_133) -FN:4738,(anonymous_134) -FN:4759,(anonymous_135) -FN:4770,(anonymous_136) -FN:4815,(anonymous_137) -FN:4860,(anonymous_138) -FN:4881,(anonymous_139) -FN:4920,(anonymous_140) -FN:4938,(anonymous_141) -FN:4950,(anonymous_142) -FN:4965,(anonymous_143) -FN:4983,(anonymous_144) -FN:5036,(anonymous_145) -FN:5058,(anonymous_146) -FN:5069,(anonymous_147) -FN:5075,(anonymous_148) -FN:5097,(anonymous_149) -FN:5125,(anonymous_150) -FN:5232,(anonymous_151) -FN:5330,(anonymous_152) -FN:5427,(anonymous_153) -FN:5528,(anonymous_154) -FNF:154 -FNH:13 -FNDA:0,GameLib -FNDA:0,(anonymous_2) -FNDA:1,(anonymous_3) -FNDA:1,(anonymous_4) -FNDA:1,(anonymous_5) -FNDA:1,(anonymous_6) -FNDA:2,(anonymous_7) -FNDA:2,(anonymous_8) -FNDA:0,(anonymous_9) -FNDA:1,(anonymous_10) -FNDA:0,(anonymous_11) -FNDA:0,(anonymous_12) -FNDA:0,(anonymous_13) -FNDA:0,(anonymous_14) -FNDA:0,(anonymous_15) -FNDA:0,(anonymous_16) -FNDA:0,(anonymous_17) -FNDA:0,(anonymous_18) -FNDA:0,(anonymous_19) -FNDA:0,(anonymous_20) -FNDA:0,(anonymous_21) -FNDA:0,(anonymous_22) -FNDA:0,(anonymous_23) -FNDA:0,(anonymous_24) -FNDA:0,(anonymous_25) -FNDA:0,(anonymous_26) -FNDA:0,(anonymous_27) -FNDA:0,(anonymous_28) -FNDA:0,(anonymous_29) -FNDA:0,(anonymous_30) -FNDA:1,(anonymous_31) -FNDA:0,(anonymous_32) -FNDA:0,(anonymous_33) -FNDA:0,(anonymous_34) -FNDA:0,(anonymous_35) -FNDA:0,(anonymous_36) -FNDA:0,(anonymous_37) -FNDA:0,(anonymous_38) -FNDA:0,(anonymous_39) -FNDA:0,(anonymous_40) -FNDA:0,(anonymous_41) -FNDA:0,(anonymous_42) -FNDA:0,(anonymous_43) -FNDA:0,(anonymous_44) -FNDA:0,(anonymous_45) -FNDA:0,(anonymous_46) -FNDA:0,(anonymous_47) -FNDA:0,(anonymous_48) -FNDA:0,(anonymous_49) -FNDA:0,(anonymous_50) -FNDA:0,(anonymous_51) -FNDA:0,(anonymous_52) -FNDA:0,(anonymous_53) -FNDA:0,(anonymous_54) -FNDA:0,(anonymous_55) -FNDA:0,(anonymous_56) -FNDA:0,(anonymous_57) -FNDA:0,(anonymous_58) -FNDA:0,(anonymous_59) -FNDA:0,(anonymous_60) -FNDA:0,inProcessed -FNDA:0,neighbourOnEdge -FNDA:0,(anonymous_63) -FNDA:0,(anonymous_64) -FNDA:0,(anonymous_65) -FNDA:0,(anonymous_66) -FNDA:0,(anonymous_67) -FNDA:0,(anonymous_68) -FNDA:0,(anonymous_69) -FNDA:0,(anonymous_70) -FNDA:0,(anonymous_71) -FNDA:0,(anonymous_72) -FNDA:0,(anonymous_73) -FNDA:0,(anonymous_74) -FNDA:0,(anonymous_75) -FNDA:0,(anonymous_76) -FNDA:0,(anonymous_77) -FNDA:0,(anonymous_78) -FNDA:0,(anonymous_79) -FNDA:0,(anonymous_80) -FNDA:1,(anonymous_81) -FNDA:1,(anonymous_82) -FNDA:0,(anonymous_83) -FNDA:0,(anonymous_84) -FNDA:0,(anonymous_85) -FNDA:0,(anonymous_86) -FNDA:0,(anonymous_87) -FNDA:0,(anonymous_88) -FNDA:0,(anonymous_89) -FNDA:0,(anonymous_90) -FNDA:0,(anonymous_91) -FNDA:0,(anonymous_92) -FNDA:0,(anonymous_93) -FNDA:0,(anonymous_94) -FNDA:0,(anonymous_95) -FNDA:0,(anonymous_96) -FNDA:0,(anonymous_97) -FNDA:0,(anonymous_98) -FNDA:0,(anonymous_99) -FNDA:0,(anonymous_100) -FNDA:0,(anonymous_101) -FNDA:0,(anonymous_102) -FNDA:0,(anonymous_103) -FNDA:0,(anonymous_104) -FNDA:0,(anonymous_105) -FNDA:1,(anonymous_106) -FNDA:0,(anonymous_107) -FNDA:0,(anonymous_108) -FNDA:0,(anonymous_109) -FNDA:0,(anonymous_110) -FNDA:0,(anonymous_111) -FNDA:0,(anonymous_112) -FNDA:0,(anonymous_113) -FNDA:7,(anonymous_114) -FNDA:0,(anonymous_115) -FNDA:0,(anonymous_116) -FNDA:0,(anonymous_117) -FNDA:0,(anonymous_118) -FNDA:0,(anonymous_119) -FNDA:0,(anonymous_120) -FNDA:0,(anonymous_121) -FNDA:0,(anonymous_122) -FNDA:0,(anonymous_123) -FNDA:0,(anonymous_124) -FNDA:0,(anonymous_125) -FNDA:0,(anonymous_126) -FNDA:2,(anonymous_127) -FNDA:0,(anonymous_128) -FNDA:0,(anonymous_129) -FNDA:0,(anonymous_130) -FNDA:0,(anonymous_131) -FNDA:0,(anonymous_132) -FNDA:0,(anonymous_133) -FNDA:0,(anonymous_134) -FNDA:0,(anonymous_135) -FNDA:0,(anonymous_136) -FNDA:0,(anonymous_137) -FNDA:0,(anonymous_138) -FNDA:0,(anonymous_139) -FNDA:0,(anonymous_140) -FNDA:0,(anonymous_141) -FNDA:0,(anonymous_142) -FNDA:0,(anonymous_143) -FNDA:0,(anonymous_144) -FNDA:0,(anonymous_145) -FNDA:0,(anonymous_146) -FNDA:0,(anonymous_147) -FNDA:0,(anonymous_148) -FNDA:0,(anonymous_149) -FNDA:0,(anonymous_150) -FNDA:0,(anonymous_151) -FNDA:0,(anonymous_152) -FNDA:0,(anonymous_153) -FNDA:0,(anonymous_154) -DA:1,1 -DA:2,1 -DA:5,1 -DA:6,1 -DA:9,1 -DA:10,1 -DA:11,0 -DA:12,0 -DA:15,1 -DA:23,1 -DA:27,1 -DA:28,1 -DA:44,1 -DA:56,1 -DA:57,1 -DA:58,1 -DA:60,1 -DA:61,0 -DA:63,1 -DA:65,1 -DA:66,1 -DA:68,1 -DA:70,1 -DA:71,1 -DA:73,1 -DA:75,1 -DA:76,1 -DA:78,1 -DA:80,1 -DA:81,1 -DA:83,1 -DA:85,1 -DA:86,1 -DA:88,1 -DA:90,1 -DA:91,1 -DA:93,1 -DA:104,1 -DA:111,1 -DA:113,1 -DA:114,0 -DA:116,1 -DA:118,1 -DA:119,0 -DA:121,1 -DA:123,1 -DA:124,0 -DA:126,1 -DA:128,1 -DA:130,1 -DA:131,1 -DA:138,1 -DA:140,1 -DA:141,0 -DA:142,0 -DA:145,1 -DA:147,1 -DA:149,1 -DA:150,1 -DA:151,0 -DA:152,0 -DA:153,0 -DA:154,0 -DA:156,0 -DA:157,0 -DA:160,1 -DA:162,1 -DA:169,1 -DA:170,1 -DA:171,1 -DA:180,1 -DA:181,2 -DA:182,2 -DA:183,2 -DA:184,2 -DA:192,1 -DA:196,2 -DA:197,2 -DA:204,1 -DA:205,0 -DA:211,1 -DA:212,1 -DA:213,0 -DA:214,0 -DA:222,1 -DA:223,0 -DA:230,1 -DA:231,0 -DA:238,1 -DA:239,1 -DA:240,1 -DA:241,1 -DA:245,0 -DA:247,0 -DA:248,0 -DA:251,0 -DA:260,1 -DA:265,0 -DA:267,0 -DA:269,0 -DA:271,0 -DA:272,0 -DA:273,0 -DA:275,0 -DA:276,0 -DA:277,0 -DA:278,0 -DA:279,0 -DA:280,0 -DA:282,0 -DA:283,0 -DA:284,0 -DA:285,0 -DA:286,0 -DA:287,0 -DA:289,0 -DA:291,0 -DA:292,0 -DA:293,0 -DA:294,0 -DA:295,0 -DA:297,0 -DA:298,0 -DA:300,0 -DA:301,0 -DA:302,0 -DA:310,1 -DA:311,0 -DA:312,0 -DA:313,0 -DA:314,0 -DA:321,1 -DA:322,0 -DA:323,0 -DA:324,0 -DA:332,1 -DA:333,0 -DA:334,0 -DA:335,0 -DA:342,1 -DA:343,0 -DA:350,1 -DA:351,0 -DA:352,0 -DA:353,0 -DA:355,0 -DA:357,0 -DA:358,0 -DA:360,0 -DA:362,0 -DA:363,0 -DA:364,0 -DA:366,0 -DA:368,0 -DA:369,0 -DA:370,0 -DA:373,0 -DA:375,0 -DA:376,0 -DA:377,0 -DA:379,0 -DA:381,0 -DA:382,0 -DA:383,0 -DA:386,0 -DA:388,0 -DA:390,0 -DA:392,0 -DA:402,1 -DA:403,0 -DA:404,0 -DA:411,1 -DA:412,0 -DA:413,0 -DA:414,0 -DA:416,0 -DA:417,0 -DA:425,1 -DA:426,0 -DA:429,0 -DA:430,0 -DA:433,0 -DA:434,0 -DA:437,0 -DA:438,0 -DA:441,0 -DA:442,0 -DA:445,0 -DA:446,0 -DA:449,0 -DA:450,0 -DA:458,1 -DA:459,0 -DA:463,0 -DA:464,0 -DA:468,0 -DA:469,0 -DA:473,0 -DA:474,0 -DA:478,0 -DA:479,0 -DA:482,0 -DA:483,0 -DA:486,0 -DA:487,0 -DA:490,1 -DA:493,0 -DA:494,0 -DA:495,0 -DA:498,1 -DA:501,0 -DA:504,1 -DA:507,0 -DA:510,1 -DA:514,0 -DA:515,0 -DA:518,1 -DA:521,0 -DA:524,1 -DA:527,0 -DA:529,0 -DA:530,0 -DA:532,0 -DA:534,0 -DA:536,0 -DA:537,0 -DA:539,0 -DA:540,0 -DA:541,0 -DA:542,0 -DA:544,0 -DA:545,0 -DA:547,0 -DA:548,0 -DA:550,0 -DA:552,0 -DA:553,0 -DA:555,0 -DA:557,0 -DA:558,0 -DA:559,0 -DA:560,0 -DA:561,0 -DA:564,0 -DA:565,0 -DA:566,0 -DA:568,0 -DA:573,0 -DA:574,0 -DA:584,1 -DA:589,0 -DA:591,0 -DA:602,1 -DA:606,1 -DA:607,1 -DA:614,1 -DA:615,0 -DA:621,1 -DA:622,0 -DA:623,0 -DA:624,0 -DA:632,1 -DA:641,1 -DA:648,0 -DA:649,0 -DA:651,0 -DA:653,0 -DA:654,0 -DA:656,0 -DA:658,0 -DA:659,0 -DA:661,0 -DA:663,0 -DA:664,0 -DA:666,0 -DA:668,0 -DA:669,0 -DA:671,0 -DA:681,1 -DA:686,0 -DA:687,0 -DA:689,0 -DA:691,0 -DA:692,0 -DA:693,0 -DA:695,0 -DA:696,0 -DA:697,0 -DA:698,0 -DA:699,0 -DA:700,0 -DA:701,0 -DA:702,0 -DA:703,0 -DA:704,0 -DA:705,0 -DA:710,0 -DA:711,0 -DA:715,0 -DA:716,0 -DA:718,0 -DA:736,1 -DA:741,0 -DA:743,0 -DA:745,0 -DA:746,0 -DA:747,0 -DA:749,0 -DA:750,0 -DA:752,0 -DA:753,0 -DA:755,0 -DA:756,0 -DA:757,0 -DA:760,0 -DA:761,0 -DA:764,0 -DA:765,0 -DA:766,0 -DA:767,0 -DA:768,0 -DA:774,0 -DA:785,0 -DA:796,1 -DA:803,0 -DA:805,0 -DA:807,0 -DA:809,0 -DA:810,0 -DA:812,0 -DA:814,0 -DA:816,0 -DA:818,0 -DA:819,0 -DA:822,0 -DA:823,0 -DA:826,0 -DA:827,0 -DA:830,0 -DA:851,1 -DA:868,0 -DA:869,0 -DA:870,0 -DA:871,0 -DA:872,0 -DA:874,0 -DA:875,0 -DA:877,0 -DA:879,0 -DA:880,0 -DA:882,0 -DA:884,0 -DA:885,0 -DA:887,0 -DA:889,0 -DA:890,0 -DA:892,0 -DA:894,0 -DA:895,0 -DA:897,0 -DA:899,0 -DA:900,0 -DA:902,0 -DA:904,0 -DA:905,0 -DA:907,0 -DA:909,0 -DA:910,0 -DA:912,0 -DA:914,0 -DA:915,0 -DA:917,0 -DA:919,0 -DA:920,0 -DA:922,0 -DA:985,1 -DA:1044,0 -DA:1045,0 -DA:1046,0 -DA:1047,0 -DA:1049,0 -DA:1051,0 -DA:1052,0 -DA:1054,0 -DA:1056,0 -DA:1057,0 -DA:1059,0 -DA:1061,0 -DA:1062,0 -DA:1064,0 -DA:1066,0 -DA:1067,0 -DA:1082,0 -DA:1084,0 -DA:1085,0 -DA:1087,0 -DA:1089,0 -DA:1090,0 -DA:1092,0 -DA:1094,0 -DA:1095,0 -DA:1097,0 -DA:1099,0 -DA:1100,0 -DA:1102,0 -DA:1104,0 -DA:1105,0 -DA:1107,0 -DA:1109,0 -DA:1110,0 -DA:1112,0 -DA:1114,0 -DA:1115,0 -DA:1117,0 -DA:1119,0 -DA:1120,0 -DA:1122,0 -DA:1124,0 -DA:1125,0 -DA:1127,0 -DA:1129,0 -DA:1130,0 -DA:1132,0 -DA:1134,0 -DA:1135,0 -DA:1137,0 -DA:1139,0 -DA:1140,0 -DA:1142,0 -DA:1144,0 -DA:1145,0 -DA:1147,0 -DA:1149,0 -DA:1150,0 -DA:1152,0 -DA:1154,0 -DA:1155,0 -DA:1157,0 -DA:1159,0 -DA:1160,0 -DA:1162,0 -DA:1164,0 -DA:1165,0 -DA:1167,0 -DA:1169,0 -DA:1170,0 -DA:1172,0 -DA:1174,0 -DA:1175,0 -DA:1177,0 -DA:1179,0 -DA:1180,0 -DA:1182,0 -DA:1184,0 -DA:1185,0 -DA:1187,0 -DA:1189,0 -DA:1190,0 -DA:1192,0 -DA:1194,0 -DA:1195,0 -DA:1197,0 -DA:1199,0 -DA:1200,0 -DA:1202,0 -DA:1204,0 -DA:1205,0 -DA:1207,0 -DA:1209,0 -DA:1210,0 -DA:1212,0 -DA:1214,0 -DA:1215,0 -DA:1217,0 -DA:1219,0 -DA:1220,0 -DA:1222,0 -DA:1224,0 -DA:1225,0 -DA:1227,0 -DA:1229,0 -DA:1230,0 -DA:1232,0 -DA:1234,0 -DA:1235,0 -DA:1237,0 -DA:1239,0 -DA:1240,0 -DA:1242,0 -DA:1244,0 -DA:1245,0 -DA:1247,0 -DA:1249,0 -DA:1250,0 -DA:1252,0 -DA:1254,0 -DA:1255,0 -DA:1257,0 -DA:1259,0 -DA:1260,0 -DA:1262,0 -DA:1264,0 -DA:1265,0 -DA:1267,0 -DA:1269,0 -DA:1270,0 -DA:1272,0 -DA:1274,0 -DA:1275,0 -DA:1277,0 -DA:1279,0 -DA:1280,0 -DA:1282,0 -DA:1284,0 -DA:1285,0 -DA:1287,0 -DA:1289,0 -DA:1290,0 -DA:1292,0 -DA:1294,0 -DA:1295,0 -DA:1297,0 -DA:1299,0 -DA:1300,0 -DA:1302,0 -DA:1304,0 -DA:1305,0 -DA:1307,0 -DA:1309,0 -DA:1310,0 -DA:1312,0 -DA:1314,0 -DA:1315,0 -DA:1317,0 -DA:1319,0 -DA:1320,0 -DA:1322,0 -DA:1324,0 -DA:1325,0 -DA:1327,0 -DA:1329,0 -DA:1330,0 -DA:1332,0 -DA:1340,1 -DA:1341,1 -DA:1342,1 -DA:1348,1 -DA:1349,1 -DA:1350,1 -DA:1356,1 -DA:1357,1 -DA:1358,1 -DA:1359,1 -DA:1360,1 -DA:1366,1 -DA:1367,1 -DA:1368,1 -DA:1369,1 -DA:1370,1 -DA:1371,1 -DA:1372,1 -DA:1373,1 -DA:1374,1 -DA:1375,1 -DA:1376,1 -DA:1382,1 -DA:1383,1 -DA:1384,1 -DA:1385,1 -DA:1386,1 -DA:1392,1 -DA:1393,1 -DA:1394,1 -DA:1395,1 -DA:1396,1 -DA:1397,1 -DA:1398,1 -DA:1399,1 -DA:1405,1 -DA:1406,1 -DA:1407,1 -DA:1413,1 -DA:1414,1 -DA:1420,1 -DA:1421,1 -DA:1422,1 -DA:1423,1 -DA:1424,1 -DA:1425,1 -DA:1426,1 -DA:1427,1 -DA:1428,1 -DA:1429,1 -DA:1430,1 -DA:1439,1 -DA:1446,0 -DA:1448,0 -DA:1450,0 -DA:1452,0 -DA:1454,0 -DA:1505,0 -DA:1518,0 -DA:1520,0 -DA:1576,0 -DA:1590,0 -DA:1593,0 -DA:1594,0 -DA:1602,0 -DA:1604,0 -DA:1608,0 -DA:1609,0 -DA:1613,0 -DA:1616,0 -DA:1625,1 -DA:1630,0 -DA:1632,0 -DA:1633,0 -DA:1636,0 -DA:1637,0 -DA:1640,0 -DA:1641,0 -DA:1648,1 -DA:1649,0 -DA:1655,1 -DA:1662,0 -DA:1664,0 -DA:1665,0 -DA:1668,0 -DA:1669,0 -DA:1672,0 -DA:1673,0 -DA:1676,0 -DA:1677,0 -DA:1681,1 -DA:1682,0 -DA:1683,0 -DA:1684,0 -DA:1685,0 -DA:1688,1 -DA:1689,0 -DA:1690,0 -DA:1696,0 -DA:1702,0 -DA:1705,1 -DA:1706,0 -DA:1707,0 -DA:1708,0 -DA:1709,0 -DA:1712,1 -DA:1713,0 -DA:1714,0 -DA:1715,0 -DA:1718,1 -DA:1719,0 -DA:1720,0 -DA:1721,0 -DA:1724,1 -DA:1725,0 -DA:1726,0 -DA:1727,0 -DA:1730,1 -DA:1731,0 -DA:1732,0 -DA:1738,0 -DA:1739,0 -DA:1747,1 -DA:1748,0 -DA:1756,1 -DA:1758,0 -DA:1760,0 -DA:1762,0 -DA:1763,0 -DA:1766,0 -DA:1768,0 -DA:1769,0 -DA:1770,0 -DA:1773,0 -DA:1775,0 -DA:1776,0 -DA:1777,0 -DA:1779,0 -DA:1780,0 -DA:1781,0 -DA:1783,0 -DA:1784,0 -DA:1785,0 -DA:1787,0 -DA:1852,1 -DA:1873,0 -DA:1874,0 -DA:1875,0 -DA:1876,0 -DA:1877,0 -DA:1878,0 -DA:1879,0 -DA:1881,0 -DA:1882,0 -DA:1884,0 -DA:1886,0 -DA:1887,0 -DA:1889,0 -DA:1891,0 -DA:1892,0 -DA:1894,0 -DA:1896,0 -DA:1897,0 -DA:1899,0 -DA:1901,0 -DA:1902,0 -DA:1904,0 -DA:1906,0 -DA:1907,0 -DA:1909,0 -DA:1911,0 -DA:1912,0 -DA:1914,0 -DA:1916,0 -DA:1917,0 -DA:1919,0 -DA:1921,0 -DA:1922,0 -DA:1924,0 -DA:1926,0 -DA:1927,0 -DA:1929,0 -DA:1931,0 -DA:1933,0 -DA:1935,0 -DA:1943,1 -DA:1944,1 -DA:1955,1 -DA:1957,0 -DA:1959,0 -DA:1960,0 -DA:1963,0 -DA:1965,0 -DA:1967,0 -DA:1969,0 -DA:1971,0 -DA:1973,0 -DA:1975,0 -DA:1977,0 -DA:1979,0 -DA:1980,0 -DA:1981,0 -DA:1983,0 -DA:1984,0 -DA:1985,0 -DA:1987,0 -DA:1988,0 -DA:1989,0 -DA:1990,0 -DA:1992,0 -DA:1993,0 -DA:1994,0 -DA:1996,0 -DA:1997,0 -DA:1998,0 -DA:2000,0 -DA:2006,0 -DA:2007,0 -DA:2008,0 -DA:2015,0 -DA:2016,0 -DA:2029,0 -DA:2030,0 -DA:2040,0 -DA:2042,0 -DA:2044,0 -DA:2046,0 -DA:2047,0 -DA:2048,0 -DA:2049,0 -DA:2053,0 -DA:2055,0 -DA:2057,0 -DA:2058,0 -DA:2061,0 -DA:2062,0 -DA:2065,0 -DA:2067,0 -DA:2070,1 -DA:2072,0 -DA:2073,0 -DA:2074,0 -DA:2075,0 -DA:2077,0 -DA:2078,0 -DA:2079,0 -DA:2082,0 -DA:2088,1 -DA:2090,0 -DA:2092,0 -DA:2093,0 -DA:2100,0 -DA:2102,0 -DA:2104,0 -DA:2106,0 -DA:2107,0 -DA:2108,0 -DA:2110,0 -DA:2127,0 -DA:2128,0 -DA:2136,0 -DA:2137,0 -DA:2138,0 -DA:2139,0 -DA:2141,0 -DA:2145,0 -DA:2173,1 -DA:2181,1 -DA:2183,0 -DA:2184,0 -DA:2185,0 -DA:2189,0 -DA:2199,1 -DA:2201,0 -DA:2202,0 -DA:2211,0 -DA:2221,0 -DA:2222,0 -DA:2225,0 -DA:2232,0 -DA:2235,0 -DA:2250,0 -DA:2252,0 -DA:2254,0 -DA:2260,0 -DA:2268,0 -DA:2269,0 -DA:2270,0 -DA:2272,0 -DA:2273,0 -DA:2274,0 -DA:2277,0 -DA:2279,0 -DA:2294,0 -DA:2295,0 -DA:2296,0 -DA:2297,0 -DA:2306,0 -DA:2307,0 -DA:2308,0 -DA:2309,0 -DA:2310,0 -DA:2311,0 -DA:2312,0 -DA:2315,0 -DA:2316,0 -DA:2320,0 -DA:2331,1 -DA:2333,0 -DA:2334,0 -DA:2337,0 -DA:2339,0 -DA:2341,0 -DA:2342,0 -DA:2349,0 -DA:2351,0 -DA:2353,0 -DA:2355,0 -DA:2356,0 -DA:2364,0 -DA:2375,1 -DA:2381,0 -DA:2382,0 -DA:2383,0 -DA:2385,0 -DA:2386,0 -DA:2388,0 -DA:2396,1 -DA:2397,1 -DA:2407,1 -DA:2414,0 -DA:2415,0 -DA:2416,0 -DA:2417,0 -DA:2418,0 -DA:2425,1 -DA:2426,0 -DA:2441,1 -DA:2446,0 -DA:2447,0 -DA:2449,0 -DA:2451,0 -DA:2453,0 -DA:2454,0 -DA:2456,0 -DA:2458,0 -DA:2465,1 -DA:2466,0 -DA:2475,1 -DA:2478,0 -DA:2479,0 -DA:2487,1 -DA:2488,0 -DA:2490,1 -DA:2520,0 -DA:2521,0 -DA:2523,0 -DA:2525,0 -DA:2526,0 -DA:2528,0 -DA:2530,0 -DA:2531,0 -DA:2533,0 -DA:2535,0 -DA:2536,0 -DA:2538,0 -DA:2540,0 -DA:2541,0 -DA:2543,0 -DA:2545,0 -DA:2546,0 -DA:2548,0 -DA:2550,0 -DA:2551,0 -DA:2553,0 -DA:2555,0 -DA:2556,0 -DA:2558,0 -DA:2560,0 -DA:2561,0 -DA:2563,0 -DA:2565,0 -DA:2566,0 -DA:2568,0 -DA:2570,0 -DA:2571,0 -DA:2573,0 -DA:2575,0 -DA:2576,0 -DA:2578,0 -DA:2580,0 -DA:2581,0 -DA:2583,0 -DA:2585,0 -DA:2586,0 -DA:2588,0 -DA:2590,0 -DA:2591,0 -DA:2593,0 -DA:2595,0 -DA:2596,0 -DA:2598,0 -DA:2600,0 -DA:2601,0 -DA:2603,0 -DA:2605,0 -DA:2606,0 -DA:2608,0 -DA:2610,0 -DA:2611,0 -DA:2613,0 -DA:2615,0 -DA:2616,0 -DA:2618,0 -DA:2620,0 -DA:2621,0 -DA:2623,0 -DA:2625,0 -DA:2626,0 -DA:2628,0 -DA:2630,0 -DA:2631,0 -DA:2633,0 -DA:2635,0 -DA:2636,0 -DA:2638,0 -DA:2640,0 -DA:2641,0 -DA:2643,0 -DA:2645,0 -DA:2646,0 -DA:2648,0 -DA:2650,0 -DA:2651,0 -DA:2653,0 -DA:2655,0 -DA:2656,0 -DA:2658,0 -DA:2660,0 -DA:2663,1 -DA:2665,0 -DA:2704,1 -DA:2709,0 -DA:2710,0 -DA:2711,0 -DA:2713,0 -DA:2715,0 -DA:2716,0 -DA:2718,0 -DA:2720,0 -DA:2727,1 -DA:2728,0 -DA:2735,1 -DA:2736,0 -DA:2745,1 -DA:2747,0 -DA:2749,0 -DA:2791,1 -DA:2809,0 -DA:2810,0 -DA:2811,0 -DA:2812,0 -DA:2813,0 -DA:2814,0 -DA:2815,0 -DA:2816,0 -DA:2817,0 -DA:2818,0 -DA:2819,0 -DA:2820,0 -DA:2821,0 -DA:2822,0 -DA:2823,0 -DA:2824,0 -DA:2826,0 -DA:2828,0 -DA:2830,0 -DA:2837,1 -DA:2839,0 -DA:2874,0 -DA:2876,0 -DA:2886,1 -DA:2891,0 -DA:2892,0 -DA:2895,0 -DA:2896,0 -DA:2899,0 -DA:2925,1 -DA:2931,0 -DA:2932,0 -DA:2933,0 -DA:2934,0 -DA:2935,0 -DA:2954,1 -DA:2968,1 -DA:2969,1 -DA:2970,1 -DA:2971,1 -DA:2972,1 -DA:2973,0 -DA:2976,1 -DA:2977,1 -DA:2979,1 -DA:2981,1 -DA:2982,1 -DA:2984,1 -DA:2986,1 -DA:2987,1 -DA:2989,1 -DA:2991,1 -DA:2992,1 -DA:2994,1 -DA:2996,1 -DA:2997,1 -DA:2999,1 -DA:3001,1 -DA:3002,1 -DA:3004,1 -DA:3006,1 -DA:3007,1 -DA:3009,1 -DA:3011,1 -DA:3012,1 -DA:3014,1 -DA:3016,1 -DA:3017,1 -DA:3019,1 -DA:3031,1 -DA:3043,1 -DA:3044,1 -DA:3045,1 -DA:3048,0 -DA:3049,0 -DA:3054,0 -DA:3055,0 -DA:3056,0 -DA:3058,0 -DA:3060,0 -DA:3061,0 -DA:3064,0 -DA:3066,0 -DA:3068,0 -DA:3070,0 -DA:3072,0 -DA:3074,0 -DA:3076,0 -DA:3077,0 -DA:3083,0 -DA:3090,0 -DA:3092,0 -DA:3094,0 -DA:3096,0 -DA:3098,0 -DA:3104,0 -DA:3106,0 -DA:3114,0 -DA:3116,0 -DA:3118,0 -DA:3120,0 -DA:3123,0 -DA:3128,0 -DA:3131,0 -DA:3145,0 -DA:3148,0 -DA:3152,0 -DA:3154,0 -DA:3156,0 -DA:3158,0 -DA:3202,0 -DA:3205,0 -DA:3236,0 -DA:3248,0 -DA:3260,1 -DA:3269,0 -DA:3271,0 -DA:3273,0 -DA:3275,0 -DA:3277,0 -DA:3279,0 -DA:3281,0 -DA:3283,0 -DA:3285,0 -DA:3287,0 -DA:3289,0 -DA:3294,0 -DA:3295,0 -DA:3307,0 -DA:3309,0 -DA:3326,0 -DA:3344,0 -DA:3350,0 -DA:3368,0 -DA:3371,0 -DA:3376,0 -DA:3378,0 -DA:3380,0 -DA:3382,0 -DA:3383,0 -DA:3384,0 -DA:3405,0 -DA:3406,0 -DA:3407,0 -DA:3410,0 -DA:3415,0 -DA:3416,0 -DA:3426,0 -DA:3428,0 -DA:3430,0 -DA:3435,0 -DA:3437,0 -DA:3443,0 -DA:3445,0 -DA:3446,0 -DA:3447,0 -DA:3449,0 -DA:3450,0 -DA:3451,0 -DA:3453,0 -DA:3454,0 -DA:3455,0 -DA:3457,0 -DA:3458,0 -DA:3459,0 -DA:3460,0 -DA:3462,0 -DA:3466,0 -DA:3469,0 -DA:3472,0 -DA:3474,0 -DA:3475,0 -DA:3477,0 -DA:3479,0 -DA:3481,0 -DA:3483,0 -DA:3485,0 -DA:3486,0 -DA:3489,0 -DA:3490,0 -DA:3493,0 -DA:3494,0 -DA:3495,0 -DA:3496,0 -DA:3499,0 -DA:3500,0 -DA:3501,0 -DA:3502,0 -DA:3503,0 -DA:3504,0 -DA:3507,0 -DA:3508,0 -DA:3509,0 -DA:3511,0 -DA:3512,0 -DA:3513,0 -DA:3515,0 -DA:3516,0 -DA:3518,0 -DA:3519,0 -DA:3523,0 -DA:3525,0 -DA:3527,0 -DA:3528,0 -DA:3529,0 -DA:3531,0 -DA:3532,0 -DA:3533,0 -DA:3535,0 -DA:3536,0 -DA:3537,0 -DA:3539,0 -DA:3540,0 -DA:3541,0 -DA:3542,0 -DA:3544,0 -DA:3545,0 -DA:3548,0 -DA:3549,0 -DA:3552,0 -DA:3563,0 -DA:3584,1 -DA:3598,0 -DA:3600,0 -DA:3602,0 -DA:3604,0 -DA:3606,0 -DA:3607,0 -DA:3609,0 -DA:3611,0 -DA:3612,0 -DA:3614,0 -DA:3616,0 -DA:3617,0 -DA:3619,0 -DA:3621,0 -DA:3622,0 -DA:3624,0 -DA:3626,0 -DA:3627,0 -DA:3629,0 -DA:3631,0 -DA:3632,0 -DA:3634,0 -DA:3636,0 -DA:3637,0 -DA:3639,0 -DA:3641,0 -DA:3642,0 -DA:3644,0 -DA:3646,0 -DA:3647,0 -DA:3649,0 -DA:3651,0 -DA:3652,0 -DA:3654,0 -DA:3662,1 -DA:3663,1 -DA:3664,1 -DA:3665,1 -DA:3666,1 -DA:3667,1 -DA:3672,1 -DA:3674,0 -DA:3676,0 -DA:3677,0 -DA:3681,0 -DA:3682,0 -DA:3685,0 -DA:3686,0 -DA:3693,0 -DA:3694,0 -DA:3700,0 -DA:3701,0 -DA:3707,0 -DA:3708,0 -DA:3709,0 -DA:3711,0 -DA:3712,0 -DA:3715,0 -DA:3717,0 -DA:3724,1 -DA:3727,0 -DA:3729,0 -DA:3730,0 -DA:3737,0 -DA:3738,0 -DA:3739,0 -DA:3740,0 -DA:3741,0 -DA:3757,1 -DA:3767,0 -DA:3769,0 -DA:3775,0 -DA:3776,0 -DA:3778,0 -DA:3784,0 -DA:3785,0 -DA:3787,0 -DA:3789,0 -DA:3790,0 -DA:3793,0 -DA:3794,0 -DA:3796,0 -DA:3798,0 -DA:3799,0 -DA:3801,0 -DA:3803,0 -DA:3804,0 -DA:3806,0 -DA:3808,0 -DA:3809,0 -DA:3811,0 -DA:3815,1 -DA:3818,0 -DA:3820,0 -DA:3821,0 -DA:3823,0 -DA:3826,1 -DA:3829,0 -DA:3830,0 -DA:3831,0 -DA:3832,0 -DA:3833,0 -DA:3834,0 -DA:3836,0 -DA:3839,0 -DA:3840,0 -DA:3841,0 -DA:3842,0 -DA:3843,0 -DA:3844,0 -DA:3847,0 -DA:3848,0 -DA:3852,0 -DA:3853,0 -DA:3854,0 -DA:3859,0 -DA:3866,1 -DA:3870,0 -DA:3872,0 -DA:3874,0 -DA:3876,0 -DA:3878,0 -DA:3880,0 -DA:3882,0 -DA:3894,1 -DA:3901,0 -DA:3902,0 -DA:3903,0 -DA:3904,0 -DA:3905,0 -DA:3906,0 -DA:3908,0 -DA:3911,0 -DA:3912,0 -DA:3913,0 -DA:3914,0 -DA:3921,1 -DA:3922,1 -DA:3948,1 -DA:3970,0 -DA:3971,0 -DA:3972,0 -DA:3974,0 -DA:3975,0 -DA:3977,0 -DA:3979,0 -DA:3980,0 -DA:3982,0 -DA:3984,0 -DA:3985,0 -DA:3987,0 -DA:3989,0 -DA:3990,0 -DA:3992,0 -DA:3994,0 -DA:3995,0 -DA:3997,0 -DA:3999,0 -DA:4000,0 -DA:4002,0 -DA:4004,0 -DA:4005,0 -DA:4007,0 -DA:4009,0 -DA:4010,0 -DA:4012,0 -DA:4014,0 -DA:4015,0 -DA:4017,0 -DA:4019,0 -DA:4020,0 -DA:4022,0 -DA:4024,0 -DA:4025,0 -DA:4027,0 -DA:4029,0 -DA:4030,0 -DA:4032,0 -DA:4034,0 -DA:4035,0 -DA:4037,0 -DA:4039,0 -DA:4040,0 -DA:4042,0 -DA:4044,0 -DA:4045,0 -DA:4047,0 -DA:4049,0 -DA:4050,0 -DA:4052,0 -DA:4054,0 -DA:4055,0 -DA:4057,0 -DA:4064,1 -DA:4065,1 -DA:4066,1 -DA:4067,1 -DA:4068,1 -DA:4069,1 -DA:4075,1 -DA:4076,1 -DA:4077,1 -DA:4078,1 -DA:4079,1 -DA:4080,1 -DA:4081,1 -DA:4082,1 -DA:4088,1 -DA:4089,1 -DA:4090,1 -DA:4096,1 -DA:4097,1 -DA:4098,1 -DA:4099,1 -DA:4100,1 -DA:4101,1 -DA:4107,1 -DA:4108,1 -DA:4109,1 -DA:4110,1 -DA:4111,1 -DA:4112,1 -DA:4113,1 -DA:4114,1 -DA:4120,1 -DA:4121,1 -DA:4122,1 -DA:4123,1 -DA:4124,1 -DA:4125,1 -DA:4126,1 -DA:4127,1 -DA:4139,1 -DA:4148,0 -DA:4150,0 -DA:4152,0 -DA:4154,0 -DA:4158,0 -DA:4161,0 -DA:4163,0 -DA:4165,0 -DA:4171,0 -DA:4172,0 -DA:4173,0 -DA:4174,0 -DA:4175,0 -DA:4179,0 -DA:4180,0 -DA:4181,0 -DA:4182,0 -DA:4183,0 -DA:4184,0 -DA:4188,0 -DA:4189,0 -DA:4190,0 -DA:4191,0 -DA:4192,0 -DA:4193,0 -DA:4194,0 -DA:4200,0 -DA:4201,0 -DA:4208,0 -DA:4209,0 -DA:4214,0 -DA:4217,0 -DA:4231,1 -DA:4240,0 -DA:4242,0 -DA:4244,0 -DA:4246,0 -DA:4248,0 -DA:4250,0 -DA:4256,0 -DA:4258,0 -DA:4259,0 -DA:4262,0 -DA:4263,0 -DA:4266,0 -DA:4267,0 -DA:4270,0 -DA:4271,0 -DA:4274,0 -DA:4275,0 -DA:4278,0 -DA:4279,0 -DA:4282,0 -DA:4283,0 -DA:4286,0 -DA:4287,0 -DA:4290,0 -DA:4291,0 -DA:4294,0 -DA:4295,0 -DA:4298,0 -DA:4299,0 -DA:4302,0 -DA:4303,0 -DA:4306,0 -DA:4320,0 -DA:4323,1 -DA:4330,1 -DA:4331,1 -DA:4339,1 -DA:4343,0 -DA:4344,0 -DA:4361,1 -DA:4374,0 -DA:4375,0 -DA:4376,0 -DA:4377,0 -DA:4378,0 -DA:4379,0 -DA:4380,0 -DA:4381,0 -DA:4382,0 -DA:4384,0 -DA:4386,0 -DA:4387,0 -DA:4393,0 -DA:4395,0 -DA:4396,0 -DA:4402,0 -DA:4404,0 -DA:4405,0 -DA:4408,0 -DA:4415,1 -DA:4416,0 -DA:4432,1 -DA:4433,0 -DA:4472,1 -DA:4474,0 -DA:4475,0 -DA:4477,0 -DA:4478,0 -DA:4481,0 -DA:4482,0 -DA:4486,1 -DA:4487,0 -DA:4493,1 -DA:4494,0 -DA:4500,1 -DA:4502,7 -DA:4503,7 -DA:4504,7 -DA:4506,7 -DA:4507,2 -DA:4510,7 -DA:4511,3 -DA:4514,7 -DA:4515,2 -DA:4519,1 -DA:4521,0 -DA:4522,0 -DA:4523,0 -DA:4524,0 -DA:4527,0 -DA:4528,0 -DA:4531,0 -DA:4534,1 -DA:4535,0 -DA:4542,1 -DA:4543,0 -DA:4544,0 -DA:4545,0 -DA:4546,0 -DA:4549,1 -DA:4551,0 -DA:4553,0 -DA:4555,0 -DA:4557,0 -DA:4560,1 -DA:4561,0 -DA:4562,0 -DA:4563,0 -DA:4566,1 -DA:4568,0 -DA:4570,0 -DA:4573,1 -DA:4574,0 -DA:4575,0 -DA:4576,0 -DA:4577,0 -DA:4580,1 -DA:4581,0 -DA:4584,1 -DA:4585,0 -DA:4592,1 -DA:4593,0 -DA:4594,0 -DA:4595,0 -DA:4596,0 -DA:4597,0 -DA:4598,0 -DA:4599,0 -DA:4600,0 -DA:4601,0 -DA:4602,0 -DA:4603,0 -DA:4605,0 -DA:4606,0 -DA:4608,0 -DA:4612,1 -DA:4613,0 -DA:4616,1 -DA:4618,0 -DA:4620,0 -DA:4622,0 -DA:4623,0 -DA:4626,0 -DA:4628,0 -DA:4629,0 -DA:4630,0 -DA:4632,0 -DA:4635,1 -DA:4637,2 -DA:4638,2 -DA:4639,2 -DA:4640,2 -DA:4642,2 -DA:4643,0 -DA:4646,2 -DA:4647,0 -DA:4650,2 -DA:4651,0 -DA:4654,2 -DA:4655,0 -DA:4659,1 -DA:4660,0 -DA:4661,0 -DA:4662,0 -DA:4663,0 -DA:4666,1 -DA:4667,0 -DA:4675,1 -DA:4676,0 -DA:4677,0 -DA:4678,0 -DA:4679,0 -DA:4680,0 -DA:4681,0 -DA:4682,0 -DA:4683,0 -DA:4684,0 -DA:4685,0 -DA:4686,0 -DA:4687,0 -DA:4688,0 -DA:4690,0 -DA:4691,0 -DA:4696,1 -DA:4699,0 -DA:4701,0 -DA:4703,0 -DA:4704,0 -DA:4707,0 -DA:4709,0 -DA:4710,0 -DA:4711,0 -DA:4713,0 -DA:4716,1 -DA:4718,0 -DA:4719,0 -DA:4720,0 -DA:4721,0 -DA:4724,0 -DA:4725,0 -DA:4726,0 -DA:4727,0 -DA:4728,0 -DA:4731,0 -DA:4734,1 -DA:4735,0 -DA:4738,1 -DA:4740,0 -DA:4741,0 -DA:4749,0 -DA:4750,0 -DA:4751,0 -DA:4754,0 -DA:4756,0 -DA:4759,1 -DA:4761,0 -DA:4763,0 -DA:4764,0 -DA:4767,0 -DA:4770,1 -DA:4774,0 -DA:4776,0 -DA:4778,0 -DA:4780,0 -DA:4782,0 -DA:4784,0 -DA:4786,0 -DA:4788,0 -DA:4789,0 -DA:4792,0 -DA:4794,0 -DA:4796,0 -DA:4797,0 -DA:4801,0 -DA:4805,0 -DA:4807,0 -DA:4808,0 -DA:4815,1 -DA:4819,0 -DA:4821,0 -DA:4823,0 -DA:4825,0 -DA:4827,0 -DA:4829,0 -DA:4831,0 -DA:4833,0 -DA:4834,0 -DA:4837,0 -DA:4839,0 -DA:4840,0 -DA:4841,0 -DA:4845,0 -DA:4849,0 -DA:4851,0 -DA:4852,0 -DA:4860,1 -DA:4862,0 -DA:4864,0 -DA:4866,0 -DA:4868,0 -DA:4869,0 -DA:4870,0 -DA:4872,0 -DA:4874,0 -DA:4875,0 -DA:4876,0 -DA:4877,0 -DA:4881,1 -DA:4883,0 -DA:4884,0 -DA:4885,0 -DA:4887,0 -DA:4888,0 -DA:4889,0 -DA:4891,0 -DA:4892,0 -DA:4893,0 -DA:4895,0 -DA:4896,0 -DA:4898,0 -DA:4899,0 -DA:4902,0 -DA:4903,0 -DA:4905,0 -DA:4906,0 -DA:4908,0 -DA:4909,0 -DA:4913,0 -DA:4920,1 -DA:4921,0 -DA:4922,0 -DA:4923,0 -DA:4925,0 -DA:4926,0 -DA:4927,0 -DA:4928,0 -DA:4931,0 -DA:4938,1 -DA:4940,0 -DA:4941,0 -DA:4942,0 -DA:4943,0 -DA:4946,0 -DA:4950,1 -DA:4952,0 -DA:4954,0 -DA:4955,0 -DA:4965,1 -DA:4969,0 -DA:4970,0 -DA:4983,1 -DA:4993,0 -DA:4995,0 -DA:4997,0 -DA:4998,0 -DA:5000,0 -DA:5002,0 -DA:5003,0 -DA:5009,0 -DA:5011,0 -DA:5012,0 -DA:5018,0 -DA:5020,0 -DA:5021,0 -DA:5023,0 -DA:5025,0 -DA:5027,0 -DA:5029,0 -DA:5036,1 -DA:5038,0 -DA:5040,0 -DA:5042,0 -DA:5044,0 -DA:5045,0 -DA:5046,0 -DA:5048,0 -DA:5050,0 -DA:5058,1 -DA:5061,0 -DA:5069,1 -DA:5072,0 -DA:5075,1 -DA:5082,0 -DA:5083,0 -DA:5085,0 -DA:5086,0 -DA:5087,0 -DA:5090,0 -DA:5092,0 -DA:5094,0 -DA:5097,1 -DA:5101,0 -DA:5103,0 -DA:5110,0 -DA:5125,1 -DA:5133,0 -DA:5134,0 -DA:5136,0 -DA:5137,0 -DA:5140,0 -DA:5141,0 -DA:5144,0 -DA:5145,0 -DA:5148,0 -DA:5149,0 -DA:5152,0 -DA:5154,0 -DA:5163,0 -DA:5164,0 -DA:5173,0 -DA:5174,0 -DA:5175,0 -DA:5176,0 -DA:5178,0 -DA:5188,0 -DA:5195,0 -DA:5196,0 -DA:5198,0 -DA:5212,0 -DA:5215,0 -DA:5216,0 -DA:5217,0 -DA:5219,0 -DA:5232,1 -DA:5240,0 -DA:5241,0 -DA:5243,0 -DA:5244,0 -DA:5247,0 -DA:5248,0 -DA:5251,0 -DA:5252,0 -DA:5255,0 -DA:5256,0 -DA:5260,0 -DA:5261,0 -DA:5270,0 -DA:5271,0 -DA:5272,0 -DA:5275,0 -DA:5276,0 -DA:5278,0 -DA:5279,0 -DA:5280,0 -DA:5282,0 -DA:5285,0 -DA:5291,0 -DA:5292,0 -DA:5298,0 -DA:5309,0 -DA:5312,0 -DA:5313,0 -DA:5314,0 -DA:5316,0 -DA:5330,1 -DA:5339,0 -DA:5340,0 -DA:5342,0 -DA:5343,0 -DA:5346,0 -DA:5347,0 -DA:5350,0 -DA:5351,0 -DA:5354,0 -DA:5355,0 -DA:5356,0 -DA:5357,0 -DA:5358,0 -DA:5360,0 -DA:5362,0 -DA:5363,0 -DA:5365,0 -DA:5366,0 -DA:5368,0 -DA:5370,0 -DA:5372,0 -DA:5378,0 -DA:5379,0 -DA:5380,0 -DA:5381,0 -DA:5382,0 -DA:5384,0 -DA:5388,0 -DA:5390,0 -DA:5395,0 -DA:5396,0 -DA:5397,0 -DA:5399,0 -DA:5400,0 -DA:5404,0 -DA:5405,0 -DA:5406,0 -DA:5407,0 -DA:5409,0 -DA:5410,0 -DA:5411,0 -DA:5413,0 -DA:5414,0 -DA:5415,0 -DA:5417,0 -DA:5427,1 -DA:5436,0 -DA:5437,0 -DA:5439,0 -DA:5441,0 -DA:5449,0 -DA:5450,0 -DA:5451,0 -DA:5452,0 -DA:5453,0 -DA:5455,0 -DA:5466,0 -DA:5467,0 -DA:5468,0 -DA:5470,0 -DA:5471,0 -DA:5472,0 -DA:5474,0 -DA:5476,0 -DA:5477,0 -DA:5478,0 -DA:5480,0 -DA:5481,0 -DA:5482,0 -DA:5483,0 -DA:5486,0 -DA:5487,0 -DA:5488,0 -DA:5489,0 -DA:5492,0 -DA:5493,0 -DA:5494,0 -DA:5495,0 -DA:5498,0 -DA:5500,0 -DA:5503,0 -DA:5504,0 -DA:5506,0 -DA:5507,0 -DA:5510,0 -DA:5511,0 -DA:5514,0 -DA:5528,1 -DA:5537,0 -DA:5539,0 -DA:5541,0 -DA:5542,0 -DA:5545,0 -DA:5546,0 -DA:5549,0 -DA:5551,0 -DA:5553,0 -DA:5554,0 -DA:5556,0 -DA:5557,0 -DA:5558,0 -DA:5559,0 -DA:5561,0 -DA:5562,0 -DA:5564,0 -DA:5565,0 -DA:5567,0 -DA:5569,0 -DA:5570,0 -DA:5571,0 -DA:5573,0 -DA:5591,0 -DA:5592,0 -DA:5594,0 -DA:5600,0 -DA:5606,0 -DA:5609,0 -DA:5610,0 -DA:5611,0 -DA:5620,0 -DA:5638,0 -DA:5640,0 -DA:5641,0 -DA:5644,0 -DA:5645,0 -DA:5677,0 -DA:5678,0 -DA:5679,0 -DA:5681,0 -DA:5682,0 -DA:5685,0 -DA:5690,0 -DA:5693,0 -DA:5699,0 -DA:5705,0 -DA:5711,0 -DA:5717,0 -DA:5719,0 -DA:5720,0 -DA:5723,0 -DA:5725,0 -DA:5726,0 -DA:5729,0 -DA:5730,0 -DA:5732,0 -DA:5738,0 -DA:5744,0 -DA:5750,0 -DA:5756,0 -DA:5766,0 -DA:5767,0 -DA:5769,0 -DA:5771,0 -DA:5772,0 -DA:5775,0 -DA:5776,0 -DA:5777,0 -DA:5780,0 -DA:5781,0 -DA:5783,0 -DA:5794,0 -DA:5795,0 -DA:5798,0 -DA:5799,0 -DA:5800,0 -DA:5801,0 -DA:5802,0 -DA:5804,0 -DA:5810,1 -DA:5811,1 -LF:2074 -LH:361 -BRDA:1,1,0,0 -BRDA:1,1,1,1 -BRDA:5,2,0,1 -BRDA:5,2,1,0 -BRDA:9,3,0,1 -BRDA:9,3,1,0 -BRDA:10,4,0,0 -BRDA:10,4,1,1 -BRDA:60,5,0,0 -BRDA:60,5,1,1 -BRDA:65,6,0,1 -BRDA:65,6,1,0 -BRDA:70,7,0,1 -BRDA:70,7,1,0 -BRDA:75,8,0,1 -BRDA:75,8,1,0 -BRDA:80,9,0,1 -BRDA:80,9,1,0 -BRDA:85,10,0,1 -BRDA:85,10,1,0 -BRDA:90,11,0,1 -BRDA:90,11,1,0 -BRDA:113,12,0,0 -BRDA:113,12,1,1 -BRDA:118,13,0,0 -BRDA:118,13,1,1 -BRDA:123,14,0,0 -BRDA:123,14,1,1 -BRDA:130,15,0,1 -BRDA:130,15,1,0 -BRDA:140,16,0,0 -BRDA:140,16,1,1 -BRDA:149,17,0,1 -BRDA:149,17,1,0 -BRDA:151,18,0,0 -BRDA:151,18,1,0 -BRDA:153,19,0,0 -BRDA:153,19,1,0 -BRDA:212,20,0,0 -BRDA:212,20,1,1 -BRDA:247,21,0,0 -BRDA:247,21,1,0 -BRDA:297,22,0,0 -BRDA:297,22,1,0 -BRDA:297,22,2,0 -BRDA:300,23,0,0 -BRDA:300,23,1,0 -BRDA:301,24,0,0 -BRDA:301,24,1,0 -BRDA:301,24,2,0 -BRDA:302,25,0,0 -BRDA:302,25,1,0 -BRDA:302,25,2,0 -BRDA:322,26,0,0 -BRDA:322,26,1,0 -BRDA:333,27,0,0 -BRDA:333,27,1,0 -BRDA:360,28,0,0 -BRDA:360,28,1,0 -BRDA:366,29,0,0 -BRDA:366,29,1,0 -BRDA:373,30,0,0 -BRDA:373,30,1,0 -BRDA:379,31,0,0 -BRDA:379,31,1,0 -BRDA:386,32,0,0 -BRDA:386,32,1,0 -BRDA:390,33,0,0 -BRDA:390,33,1,0 -BRDA:412,34,0,0 -BRDA:412,34,1,0 -BRDA:413,35,0,0 -BRDA:413,35,1,0 -BRDA:413,35,2,0 -BRDA:413,35,3,0 -BRDA:414,36,0,0 -BRDA:414,36,1,0 -BRDA:414,36,2,0 -BRDA:414,36,3,0 -BRDA:426,37,0,0 -BRDA:426,37,1,0 -BRDA:426,37,2,0 -BRDA:426,37,3,0 -BRDA:426,37,4,0 -BRDA:426,37,5,0 -BRDA:459,38,0,0 -BRDA:459,38,1,0 -BRDA:459,38,2,0 -BRDA:459,38,3,0 -BRDA:459,38,4,0 -BRDA:459,38,5,0 -BRDA:459,38,6,0 -BRDA:459,38,7,0 -BRDA:459,38,8,0 -BRDA:459,38,9,0 -BRDA:514,39,0,0 -BRDA:514,39,1,0 -BRDA:532,40,0,0 -BRDA:532,40,1,0 -BRDA:532,41,0,0 -BRDA:532,41,1,0 -BRDA:544,42,0,0 -BRDA:544,42,1,0 -BRDA:545,43,0,0 -BRDA:545,43,1,0 -BRDA:555,44,0,0 -BRDA:555,44,1,0 -BRDA:557,45,0,0 -BRDA:557,45,1,0 -BRDA:558,46,0,0 -BRDA:558,46,1,0 -BRDA:564,47,0,0 -BRDA:564,47,1,0 -BRDA:589,48,0,0 -BRDA:589,48,1,0 -BRDA:622,49,0,0 -BRDA:622,49,1,0 -BRDA:648,50,0,0 -BRDA:648,50,1,0 -BRDA:653,51,0,0 -BRDA:653,51,1,0 -BRDA:658,52,0,0 -BRDA:658,52,1,0 -BRDA:663,53,0,0 -BRDA:663,53,1,0 -BRDA:668,54,0,0 -BRDA:668,54,1,0 -BRDA:809,55,0,0 -BRDA:809,55,1,0 -BRDA:814,56,0,0 -BRDA:814,56,1,0 -BRDA:818,57,0,0 -BRDA:818,57,1,0 -BRDA:822,58,0,0 -BRDA:822,58,1,0 -BRDA:826,59,0,0 -BRDA:826,59,1,0 -BRDA:874,60,0,0 -BRDA:874,60,1,0 -BRDA:879,61,0,0 -BRDA:879,61,1,0 -BRDA:884,62,0,0 -BRDA:884,62,1,0 -BRDA:889,63,0,0 -BRDA:889,63,1,0 -BRDA:894,64,0,0 -BRDA:894,64,1,0 -BRDA:899,65,0,0 -BRDA:899,65,1,0 -BRDA:904,66,0,0 -BRDA:904,66,1,0 -BRDA:909,67,0,0 -BRDA:909,67,1,0 -BRDA:914,68,0,0 -BRDA:914,68,1,0 -BRDA:919,69,0,0 -BRDA:919,69,1,0 -BRDA:1046,70,0,0 -BRDA:1046,70,1,0 -BRDA:1051,71,0,0 -BRDA:1051,71,1,0 -BRDA:1056,72,0,0 -BRDA:1056,72,1,0 -BRDA:1061,73,0,0 -BRDA:1061,73,1,0 -BRDA:1066,74,0,0 -BRDA:1066,74,1,0 -BRDA:1084,75,0,0 -BRDA:1084,75,1,0 -BRDA:1089,76,0,0 -BRDA:1089,76,1,0 -BRDA:1094,77,0,0 -BRDA:1094,77,1,0 -BRDA:1099,78,0,0 -BRDA:1099,78,1,0 -BRDA:1104,79,0,0 -BRDA:1104,79,1,0 -BRDA:1109,80,0,0 -BRDA:1109,80,1,0 -BRDA:1114,81,0,0 -BRDA:1114,81,1,0 -BRDA:1119,82,0,0 -BRDA:1119,82,1,0 -BRDA:1124,83,0,0 -BRDA:1124,83,1,0 -BRDA:1129,84,0,0 -BRDA:1129,84,1,0 -BRDA:1134,85,0,0 -BRDA:1134,85,1,0 -BRDA:1139,86,0,0 -BRDA:1139,86,1,0 -BRDA:1144,87,0,0 -BRDA:1144,87,1,0 -BRDA:1149,88,0,0 -BRDA:1149,88,1,0 -BRDA:1154,89,0,0 -BRDA:1154,89,1,0 -BRDA:1159,90,0,0 -BRDA:1159,90,1,0 -BRDA:1164,91,0,0 -BRDA:1164,91,1,0 -BRDA:1169,92,0,0 -BRDA:1169,92,1,0 -BRDA:1174,93,0,0 -BRDA:1174,93,1,0 -BRDA:1179,94,0,0 -BRDA:1179,94,1,0 -BRDA:1184,95,0,0 -BRDA:1184,95,1,0 -BRDA:1189,96,0,0 -BRDA:1189,96,1,0 -BRDA:1194,97,0,0 -BRDA:1194,97,1,0 -BRDA:1199,98,0,0 -BRDA:1199,98,1,0 -BRDA:1204,99,0,0 -BRDA:1204,99,1,0 -BRDA:1209,100,0,0 -BRDA:1209,100,1,0 -BRDA:1214,101,0,0 -BRDA:1214,101,1,0 -BRDA:1219,102,0,0 -BRDA:1219,102,1,0 -BRDA:1224,103,0,0 -BRDA:1224,103,1,0 -BRDA:1229,104,0,0 -BRDA:1229,104,1,0 -BRDA:1234,105,0,0 -BRDA:1234,105,1,0 -BRDA:1239,106,0,0 -BRDA:1239,106,1,0 -BRDA:1244,107,0,0 -BRDA:1244,107,1,0 -BRDA:1249,108,0,0 -BRDA:1249,108,1,0 -BRDA:1254,109,0,0 -BRDA:1254,109,1,0 -BRDA:1259,110,0,0 -BRDA:1259,110,1,0 -BRDA:1264,111,0,0 -BRDA:1264,111,1,0 -BRDA:1269,112,0,0 -BRDA:1269,112,1,0 -BRDA:1274,113,0,0 -BRDA:1274,113,1,0 -BRDA:1279,114,0,0 -BRDA:1279,114,1,0 -BRDA:1284,115,0,0 -BRDA:1284,115,1,0 -BRDA:1289,116,0,0 -BRDA:1289,116,1,0 -BRDA:1294,117,0,0 -BRDA:1294,117,1,0 -BRDA:1299,118,0,0 -BRDA:1299,118,1,0 -BRDA:1304,119,0,0 -BRDA:1304,119,1,0 -BRDA:1309,120,0,0 -BRDA:1309,120,1,0 -BRDA:1314,121,0,0 -BRDA:1314,121,1,0 -BRDA:1319,122,0,0 -BRDA:1319,122,1,0 -BRDA:1324,123,0,0 -BRDA:1324,123,1,0 -BRDA:1329,124,0,0 -BRDA:1329,124,1,0 -BRDA:1452,125,0,0 -BRDA:1452,125,1,0 -BRDA:1518,126,0,0 -BRDA:1518,126,1,0 -BRDA:1593,127,0,0 -BRDA:1593,127,1,0 -BRDA:1632,128,0,0 -BRDA:1632,128,1,0 -BRDA:1636,129,0,0 -BRDA:1636,129,1,0 -BRDA:1640,130,0,0 -BRDA:1640,130,1,0 -BRDA:1664,131,0,0 -BRDA:1664,131,1,0 -BRDA:1668,132,0,0 -BRDA:1668,132,1,0 -BRDA:1672,133,0,0 -BRDA:1672,133,1,0 -BRDA:1676,134,0,0 -BRDA:1676,134,1,0 -BRDA:1731,135,0,0 -BRDA:1731,135,1,0 -BRDA:1738,136,0,0 -BRDA:1738,136,1,0 -BRDA:1762,137,0,0 -BRDA:1762,137,1,0 -BRDA:1768,138,0,0 -BRDA:1768,138,1,0 -BRDA:1881,139,0,0 -BRDA:1881,139,1,0 -BRDA:1886,140,0,0 -BRDA:1886,140,1,0 -BRDA:1891,141,0,0 -BRDA:1891,141,1,0 -BRDA:1896,142,0,0 -BRDA:1896,142,1,0 -BRDA:1901,143,0,0 -BRDA:1901,143,1,0 -BRDA:1906,144,0,0 -BRDA:1906,144,1,0 -BRDA:1911,145,0,0 -BRDA:1911,145,1,0 -BRDA:1916,146,0,0 -BRDA:1916,146,1,0 -BRDA:1921,147,0,0 -BRDA:1921,147,1,0 -BRDA:1926,148,0,0 -BRDA:1926,148,1,0 -BRDA:1959,149,0,0 -BRDA:1959,149,1,0 -BRDA:1963,150,0,0 -BRDA:1963,150,1,0 -BRDA:2047,151,0,0 -BRDA:2047,151,1,0 -BRDA:2061,152,0,0 -BRDA:2061,152,1,0 -BRDA:2128,153,0,0 -BRDA:2128,153,1,0 -BRDA:2184,154,0,0 -BRDA:2184,154,1,0 -BRDA:2202,155,0,0 -BRDA:2202,155,1,0 -BRDA:2203,156,0,0 -BRDA:2203,156,1,0 -BRDA:2203,156,2,0 -BRDA:2203,156,3,0 -BRDA:2203,156,4,0 -BRDA:2203,156,5,0 -BRDA:2203,156,6,0 -BRDA:2203,156,7,0 -BRDA:2203,156,8,0 -BRDA:2203,156,9,0 -BRDA:2203,156,10,0 -BRDA:2203,156,11,0 -BRDA:2221,157,0,0 -BRDA:2221,157,1,0 -BRDA:2260,158,0,0 -BRDA:2260,158,1,0 -BRDA:2261,159,0,0 -BRDA:2261,159,1,0 -BRDA:2261,159,2,0 -BRDA:2261,159,3,0 -BRDA:2261,159,4,0 -BRDA:2261,159,5,0 -BRDA:2296,160,0,0 -BRDA:2296,160,1,0 -BRDA:2296,161,0,0 -BRDA:2296,161,1,0 -BRDA:2310,162,0,0 -BRDA:2310,162,1,0 -BRDA:2315,163,0,0 -BRDA:2315,163,1,0 -BRDA:2333,164,0,0 -BRDA:2333,164,1,0 -BRDA:2333,165,0,0 -BRDA:2333,165,1,0 -BRDA:2385,166,0,0 -BRDA:2385,166,1,0 -BRDA:2453,167,0,0 -BRDA:2453,167,1,0 -BRDA:2525,168,0,0 -BRDA:2525,168,1,0 -BRDA:2530,169,0,0 -BRDA:2530,169,1,0 -BRDA:2535,170,0,0 -BRDA:2535,170,1,0 -BRDA:2540,171,0,0 -BRDA:2540,171,1,0 -BRDA:2545,172,0,0 -BRDA:2545,172,1,0 -BRDA:2550,173,0,0 -BRDA:2550,173,1,0 -BRDA:2555,174,0,0 -BRDA:2555,174,1,0 -BRDA:2560,175,0,0 -BRDA:2560,175,1,0 -BRDA:2565,176,0,0 -BRDA:2565,176,1,0 -BRDA:2570,177,0,0 -BRDA:2570,177,1,0 -BRDA:2575,178,0,0 -BRDA:2575,178,1,0 -BRDA:2580,179,0,0 -BRDA:2580,179,1,0 -BRDA:2585,180,0,0 -BRDA:2585,180,1,0 -BRDA:2590,181,0,0 -BRDA:2590,181,1,0 -BRDA:2595,182,0,0 -BRDA:2595,182,1,0 -BRDA:2600,183,0,0 -BRDA:2600,183,1,0 -BRDA:2605,184,0,0 -BRDA:2605,184,1,0 -BRDA:2610,185,0,0 -BRDA:2610,185,1,0 -BRDA:2615,186,0,0 -BRDA:2615,186,1,0 -BRDA:2620,187,0,0 -BRDA:2620,187,1,0 -BRDA:2625,188,0,0 -BRDA:2625,188,1,0 -BRDA:2630,189,0,0 -BRDA:2630,189,1,0 -BRDA:2635,190,0,0 -BRDA:2635,190,1,0 -BRDA:2640,191,0,0 -BRDA:2640,191,1,0 -BRDA:2645,192,0,0 -BRDA:2645,192,1,0 -BRDA:2650,193,0,0 -BRDA:2650,193,1,0 -BRDA:2655,194,0,0 -BRDA:2655,194,1,0 -BRDA:2715,195,0,0 -BRDA:2715,195,1,0 -BRDA:2810,196,0,0 -BRDA:2810,196,1,0 -BRDA:2811,197,0,0 -BRDA:2811,197,1,0 -BRDA:2812,198,0,0 -BRDA:2812,198,1,0 -BRDA:2813,199,0,0 -BRDA:2813,199,1,0 -BRDA:2814,200,0,0 -BRDA:2814,200,1,0 -BRDA:2815,201,0,0 -BRDA:2815,201,1,0 -BRDA:2816,202,0,0 -BRDA:2816,202,1,0 -BRDA:2817,203,0,0 -BRDA:2817,203,1,0 -BRDA:2818,204,0,0 -BRDA:2818,204,1,0 -BRDA:2819,205,0,0 -BRDA:2819,205,1,0 -BRDA:2820,206,0,0 -BRDA:2820,206,1,0 -BRDA:2821,207,0,0 -BRDA:2821,207,1,0 -BRDA:2822,208,0,0 -BRDA:2822,208,1,0 -BRDA:2823,209,0,0 -BRDA:2823,209,1,0 -BRDA:2824,210,0,0 -BRDA:2824,210,1,0 -BRDA:2891,211,0,0 -BRDA:2891,211,1,0 -BRDA:2895,212,0,0 -BRDA:2895,212,1,0 -BRDA:2972,213,0,0 -BRDA:2972,213,1,1 -BRDA:2976,214,0,1 -BRDA:2976,214,1,0 -BRDA:2981,215,0,1 -BRDA:2981,215,1,0 -BRDA:2986,216,0,1 -BRDA:2986,216,1,0 -BRDA:2991,217,0,1 -BRDA:2991,217,1,0 -BRDA:2996,218,0,1 -BRDA:2996,218,1,0 -BRDA:3001,219,0,1 -BRDA:3001,219,1,0 -BRDA:3006,220,0,1 -BRDA:3006,220,1,0 -BRDA:3011,221,0,1 -BRDA:3011,221,1,0 -BRDA:3016,222,0,1 -BRDA:3016,222,1,0 -BRDA:3043,223,0,1 -BRDA:3043,223,1,0 -BRDA:3056,224,0,0 -BRDA:3056,224,1,0 -BRDA:3060,225,0,0 -BRDA:3060,225,1,0 -BRDA:3060,226,0,0 -BRDA:3060,226,1,0 -BRDA:3068,227,0,0 -BRDA:3068,227,1,0 -BRDA:3068,228,0,0 -BRDA:3068,228,1,0 -BRDA:3076,229,0,0 -BRDA:3076,229,1,0 -BRDA:3206,230,0,0 -BRDA:3206,230,1,0 -BRDA:3405,231,0,0 -BRDA:3405,231,1,0 -BRDA:3475,232,0,0 -BRDA:3475,232,1,0 -BRDA:3485,233,0,0 -BRDA:3485,233,1,0 -BRDA:3489,234,0,0 -BRDA:3489,234,1,0 -BRDA:3493,235,0,0 -BRDA:3493,235,1,0 -BRDA:3499,236,0,0 -BRDA:3499,236,1,0 -BRDA:3515,237,0,0 -BRDA:3515,237,1,0 -BRDA:3606,238,0,0 -BRDA:3606,238,1,0 -BRDA:3611,239,0,0 -BRDA:3611,239,1,0 -BRDA:3616,240,0,0 -BRDA:3616,240,1,0 -BRDA:3621,241,0,0 -BRDA:3621,241,1,0 -BRDA:3626,242,0,0 -BRDA:3626,242,1,0 -BRDA:3631,243,0,0 -BRDA:3631,243,1,0 -BRDA:3636,244,0,0 -BRDA:3636,244,1,0 -BRDA:3641,245,0,0 -BRDA:3641,245,1,0 -BRDA:3646,246,0,0 -BRDA:3646,246,1,0 -BRDA:3651,247,0,0 -BRDA:3651,247,1,0 -BRDA:3676,248,0,0 -BRDA:3676,248,1,0 -BRDA:3681,249,0,0 -BRDA:3681,249,1,0 -BRDA:3685,250,0,0 -BRDA:3685,250,1,0 -BRDA:3693,251,0,0 -BRDA:3693,251,1,0 -BRDA:3700,252,0,0 -BRDA:3700,252,1,0 -BRDA:3707,253,0,0 -BRDA:3707,253,1,0 -BRDA:3729,254,0,0 -BRDA:3729,254,1,0 -BRDA:3775,255,0,0 -BRDA:3775,255,1,0 -BRDA:3784,256,0,0 -BRDA:3784,256,1,0 -BRDA:3789,257,0,0 -BRDA:3789,257,1,0 -BRDA:3793,258,0,0 -BRDA:3793,258,1,0 -BRDA:3798,259,0,0 -BRDA:3798,259,1,0 -BRDA:3803,260,0,0 -BRDA:3803,260,1,0 -BRDA:3808,261,0,0 -BRDA:3808,261,1,0 -BRDA:3902,262,0,0 -BRDA:3902,262,1,0 -BRDA:3903,263,0,0 -BRDA:3903,263,1,0 -BRDA:3905,264,0,0 -BRDA:3905,264,1,0 -BRDA:3974,265,0,0 -BRDA:3974,265,1,0 -BRDA:3979,266,0,0 -BRDA:3979,266,1,0 -BRDA:3984,267,0,0 -BRDA:3984,267,1,0 -BRDA:3989,268,0,0 -BRDA:3989,268,1,0 -BRDA:3994,269,0,0 -BRDA:3994,269,1,0 -BRDA:3999,270,0,0 -BRDA:3999,270,1,0 -BRDA:4004,271,0,0 -BRDA:4004,271,1,0 -BRDA:4009,272,0,0 -BRDA:4009,272,1,0 -BRDA:4014,273,0,0 -BRDA:4014,273,1,0 -BRDA:4019,274,0,0 -BRDA:4019,274,1,0 -BRDA:4024,275,0,0 -BRDA:4024,275,1,0 -BRDA:4029,276,0,0 -BRDA:4029,276,1,0 -BRDA:4034,277,0,0 -BRDA:4034,277,1,0 -BRDA:4039,278,0,0 -BRDA:4039,278,1,0 -BRDA:4044,279,0,0 -BRDA:4044,279,1,0 -BRDA:4049,280,0,0 -BRDA:4049,280,1,0 -BRDA:4054,281,0,0 -BRDA:4054,281,1,0 -BRDA:4154,282,0,0 -BRDA:4154,282,1,0 -BRDA:4154,283,0,0 -BRDA:4154,283,1,0 -BRDA:4154,283,2,0 -BRDA:4161,284,0,0 -BRDA:4161,284,1,0 -BRDA:4200,285,0,0 -BRDA:4200,285,1,0 -BRDA:4246,286,0,0 -BRDA:4246,286,1,0 -BRDA:4250,287,0,0 -BRDA:4250,287,1,0 -BRDA:4251,288,0,0 -BRDA:4251,288,1,0 -BRDA:4251,288,2,0 -BRDA:4258,289,0,0 -BRDA:4258,289,1,0 -BRDA:4262,290,0,0 -BRDA:4262,290,1,0 -BRDA:4266,291,0,0 -BRDA:4266,291,1,0 -BRDA:4270,292,0,0 -BRDA:4270,292,1,0 -BRDA:4274,293,0,0 -BRDA:4274,293,1,0 -BRDA:4278,294,0,0 -BRDA:4278,294,1,0 -BRDA:4282,295,0,0 -BRDA:4282,295,1,0 -BRDA:4286,296,0,0 -BRDA:4286,296,1,0 -BRDA:4290,297,0,0 -BRDA:4290,297,1,0 -BRDA:4294,298,0,0 -BRDA:4294,298,1,0 -BRDA:4298,299,0,0 -BRDA:4298,299,1,0 -BRDA:4302,300,0,0 -BRDA:4302,300,1,0 -BRDA:4381,301,0,0 -BRDA:4381,301,1,0 -BRDA:4386,302,0,0 -BRDA:4386,302,1,0 -BRDA:4395,303,0,0 -BRDA:4395,303,1,0 -BRDA:4404,304,0,0 -BRDA:4404,304,1,0 -BRDA:4434,305,0,0 -BRDA:4434,305,1,0 -BRDA:4434,305,2,0 -BRDA:4434,305,3,0 -BRDA:4434,305,4,0 -BRDA:4434,305,5,0 -BRDA:4434,305,6,0 -BRDA:4434,305,7,0 -BRDA:4434,305,8,0 -BRDA:4434,305,9,0 -BRDA:4434,305,10,0 -BRDA:4434,305,11,0 -BRDA:4434,305,12,0 -BRDA:4434,305,13,0 -BRDA:4434,305,14,0 -BRDA:4434,305,15,0 -BRDA:4434,305,16,0 -BRDA:4434,305,17,0 -BRDA:4477,306,0,0 -BRDA:4477,306,1,0 -BRDA:4481,307,0,0 -BRDA:4481,307,1,0 -BRDA:4494,308,0,0 -BRDA:4494,308,1,0 -BRDA:4494,308,2,0 -BRDA:4494,308,3,0 -BRDA:4506,309,0,2 -BRDA:4506,309,1,5 -BRDA:4510,310,0,3 -BRDA:4510,310,1,4 -BRDA:4514,311,0,2 -BRDA:4514,311,1,5 -BRDA:4521,312,0,0 -BRDA:4521,312,1,0 -BRDA:4527,313,0,0 -BRDA:4527,313,1,0 -BRDA:4593,314,0,0 -BRDA:4593,314,1,0 -BRDA:4597,315,0,0 -BRDA:4597,315,1,0 -BRDA:4622,316,0,0 -BRDA:4622,316,1,0 -BRDA:4642,317,0,0 -BRDA:4642,317,1,2 -BRDA:4646,318,0,0 -BRDA:4646,318,1,2 -BRDA:4650,319,0,0 -BRDA:4650,319,1,2 -BRDA:4654,320,0,0 -BRDA:4654,320,1,2 -BRDA:4676,321,0,0 -BRDA:4676,321,1,0 -BRDA:4680,322,0,0 -BRDA:4680,322,1,0 -BRDA:4703,323,0,0 -BRDA:4703,323,1,0 -BRDA:4718,324,0,0 -BRDA:4718,324,1,0 -BRDA:4724,325,0,0 -BRDA:4724,325,1,0 -BRDA:4740,326,0,0 -BRDA:4740,326,1,0 -BRDA:4749,327,0,0 -BRDA:4749,327,1,0 -BRDA:4794,328,0,0 -BRDA:4794,328,1,0 -BRDA:4839,329,0,0 -BRDA:4839,329,1,0 -BRDA:4892,330,0,0 -BRDA:4892,330,1,0 -BRDA:4895,331,0,0 -BRDA:4895,331,1,0 -BRDA:4898,332,0,0 -BRDA:4898,332,1,0 -BRDA:4902,333,0,0 -BRDA:4902,333,1,0 -BRDA:4905,334,0,0 -BRDA:4905,334,1,0 -BRDA:4908,335,0,0 -BRDA:4908,335,1,0 -BRDA:4997,336,0,0 -BRDA:4997,336,1,0 -BRDA:5002,337,0,0 -BRDA:5002,337,1,0 -BRDA:5011,338,0,0 -BRDA:5011,338,1,0 -BRDA:5020,339,0,0 -BRDA:5020,339,1,0 -BRDA:5083,340,0,0 -BRDA:5083,340,1,0 -BRDA:5101,341,0,0 -BRDA:5101,341,1,0 -BRDA:5136,342,0,0 -BRDA:5136,342,1,0 -BRDA:5140,343,0,0 -BRDA:5140,343,1,0 -BRDA:5144,344,0,0 -BRDA:5144,344,1,0 -BRDA:5148,345,0,0 -BRDA:5148,345,1,0 -BRDA:5243,346,0,0 -BRDA:5243,346,1,0 -BRDA:5247,347,0,0 -BRDA:5247,347,1,0 -BRDA:5251,348,0,0 -BRDA:5251,348,1,0 -BRDA:5255,349,0,0 -BRDA:5255,349,1,0 -BRDA:5342,350,0,0 -BRDA:5342,350,1,0 -BRDA:5342,351,0,0 -BRDA:5342,351,1,0 -BRDA:5346,352,0,0 -BRDA:5346,352,1,0 -BRDA:5346,353,0,0 -BRDA:5346,353,1,0 -BRDA:5350,354,0,0 -BRDA:5350,354,1,0 -BRDA:5350,355,0,0 -BRDA:5350,355,1,0 -BRDA:5355,356,0,0 -BRDA:5355,356,1,0 -BRDA:5356,357,0,0 -BRDA:5356,357,1,0 -BRDA:5358,358,0,0 -BRDA:5358,358,1,0 -BRDA:5366,359,0,0 -BRDA:5366,359,1,0 -BRDA:5366,360,0,0 -BRDA:5366,360,1,0 -BRDA:5391,361,0,0 -BRDA:5391,361,1,0 -BRDA:5399,362,0,0 -BRDA:5399,362,1,0 -BRDA:5480,363,0,0 -BRDA:5480,363,1,0 -BRDA:5486,364,0,0 -BRDA:5486,364,1,0 -BRDA:5492,365,0,0 -BRDA:5492,365,1,0 -BRDA:5541,366,0,0 -BRDA:5541,366,1,0 -BRDA:5541,367,0,0 -BRDA:5541,367,1,0 -BRDA:5541,367,2,0 -BRDA:5545,368,0,0 -BRDA:5545,368,1,0 -BRDA:5545,369,0,0 -BRDA:5545,369,1,0 -BRDA:5609,370,0,0 -BRDA:5609,370,1,0 -BRDA:5634,371,0,0 -BRDA:5634,371,1,0 -BRDA:5644,372,0,0 -BRDA:5644,372,1,0 -BRDA:5681,373,0,0 -BRDA:5681,373,1,0 -BRDA:5719,374,0,0 -BRDA:5719,374,1,0 -BRDA:5725,375,0,0 -BRDA:5725,375,1,0 -BRDA:5729,376,0,0 -BRDA:5729,376,1,0 -BRDA:5771,377,0,0 -BRDA:5771,377,1,0 -BRDA:5810,378,0,1 -BRDA:5810,378,1,0 -BRF:810 -BRH:40 -end_of_record diff --git a/build/game-lib-min.js b/build/game-lib-min.js deleted file mode 100644 index 9fde699..0000000 --- a/build/game-lib-min.js +++ /dev/null @@ -1,3 +0,0 @@ -function GameLib(){}if("undefined"==typeof GameLib.D3&&(GameLib.D3=function(){}),"undefined"==typeof Q){if("undefined"==typeof require)throw console.warn("You need the Q promise library for the GameLib.D3"),new Error("You need the Q promise library for the GameLib.D3");var Q=require("q")}GameLib.D3.BoneWeight=function(e,t){this.boneIndex=e,this.weight=t},GameLib.D3.Bone=function(e,t,i,n,s,o,a,r,h,c){this.id=e,this.name=i,this.boneId=t,"undefined"==typeof n&&(n=[]),this.childBoneIds=n,"undefined"==typeof s&&(s=null),this.parentBoneId=s,"undefined"==typeof o&&(o=new GameLib.D3.Vector4),this.quaternion=o,"undefined"==typeof a&&(a=new GameLib.D3.Vector3(0,0,0)),this.position=a,"undefined"==typeof r&&(r=new GameLib.D3.Vector3(0,0,0)),this.rotation=r,"undefined"==typeof h&&(h=new GameLib.D3.Vector3(1,1,1)),this.scale=h,"undefined"==typeof c&&(c=new GameLib.D3.Vector3(0,1,0)),this.up=c},GameLib.D3.Broadphase=function(e,t,i,n){this.id=e,"undefined"==typeof t&&(t="broadphase-"+i),this.name=t,"undefined"==typeof i&&(i=GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE),this.broadphaseType=i,this.engine=n,this.engine.isNotCannonThrow(),this.instance=this.createInstance()},GameLib.D3.Broadphase.prototype.createInstance=function(){var e=null;if(this.broadphaseType==GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE)e=new this.engine.instance.NaiveBroadphase;else if(this.broadphaseType==GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID)e=new this.engine.instance.GridBroadphase;else{if(this.broadphaseType!=GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP)throw console.warn("Unsupported broadphase type: "+this.broadphaseType),new Error("Unsupported broadphase type: "+this.broadphaseType);e=new this.engine.instance.SAPBroadphase}return e},GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE=1,GameLib.D3.Broadphase.BROADPHASE_TYPE_GRID=2,GameLib.D3.Broadphase.BROADPHASE_TYPE_SAP=3,GameLib.D3.Color=function(e,t,i,n){this.r=e,this.g=t,this.b=i,this.a=n},GameLib.D3.Engine=function(e,t){this.engineType=e,this.instance=t},GameLib.D3.Engine.prototype.isCannon=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_CANNON},GameLib.D3.Engine.prototype.isNotCannonThrow=function(){if(this.engineType!=GameLib.D3.Engine.ENGINE_TYPE_CANNON)throw console.warn("Only CANNON supported for this function"),new Error("Only CANNON supported for this function")},GameLib.D3.Engine.prototype.isAmmo=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_AMMO},GameLib.D3.Engine.prototype.isGoblin=function(){return this.engineType==GameLib.D3.Engine.ENGINE_TYPE_GOBLIN},GameLib.D3.Engine.ENGINE_TYPE_CANNON=1,GameLib.D3.Engine.ENGINE_TYPE_AMMO=2,GameLib.D3.Engine.ENGINE_TYPE_GOBLIN=3,GameLib.D3.Entity=function(e,t){this.meshId=e,"undefined"==typeof t&&(t=[]),this.componentIds=t},GameLib.D3.FlyControls=function(e,t,i){this.flySpeed=100,this.canvas=i,this.THREE=t,this.yaw=0,this.pitch=0,this.canRotate=!1,this.moveForward=!1,this.moveBackward=!1,this.moveLeft=!1,this.moveRight=!1,this.moveUp=!1,this.moveDown=!1,this.mouseUpCallback=this.onMouseUp.bind(this),this.mouseDownCallback=this.onMouseDown.bind(this),this.mouseMoveCallback=this.onMouseMove.bind(this),this.mouseWheelCallback=this.onMouseWheel.bind(this),this.keyDownCallback=this.onKeyDown.bind(this),this.keyUpCallback=this.onKeyUp.bind(this),this.camera=e,this.canvas.addEventListener("keydown",this.keyDownCallback,!1),this.canvas.addEventListener("keyup",this.keyUpCallback,!1),this.canvas.addEventListener("mousedown",this.mouseDownCallback,!1),this.canvas.addEventListener("mouseup",this.mouseUpCallback,!1),this.canvas.addEventListener("mousewheel",this.mouseWheelCallback,!1),this.havePointerLock="pointerLockElement"in document||"mozPointerLockElement"in document||"webkitPointerLockElement"in document,this.element=document.body,this.havePointerLock&&(this.element.requestPointerLock=this.element.requestPointerLock||this.element.mozRequestPointerLock||this.element.webkitRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock)},GameLib.D3.FlyControls.prototype.onMouseWheel=function(e){this.moveForward=!0,this.applyTranslation(.001*e.wheelDelta),e.preventDefault(),this.moveForward=!1},GameLib.D3.FlyControls.prototype.onMouseDown=function(e){1==e.button&&(this.canRotate=!0,this.canvas.addEventListener("mousemove",this.mouseMoveCallback,!1))},GameLib.D3.FlyControls.prototype.onMouseUp=function(e){1==e.button&&(this.canRotate=!1,this.canvas.removeEventListener("mousemove",this.mouseMoveCallback))},GameLib.D3.FlyControls.prototype.applyRotation=function(){this.camera.rotation.set(this.pitch,this.yaw,0,"YXZ")},GameLib.D3.FlyControls.prototype.applyTranslation=function(e){var t=new this.THREE.Vector3(0,0,-1),i=new this.THREE.Euler(0,0,0,"YXZ");i.set(this.pitch,this.yaw,0,"YXZ"),t=t.applyEuler(i);var n=t.normalize(),s=n.cross(new this.THREE.Vector3(0,1,0));this.moveForward?(this.camera.position.x+=n.x*(e*this.flySpeed),this.camera.position.y+=n.y*(e*this.flySpeed),this.camera.position.z+=n.z*(e*this.flySpeed)):this.moveBackward&&(this.camera.position.x-=n.x*(e*this.flySpeed),this.camera.position.y-=n.y*(e*this.flySpeed),this.camera.position.z-=n.z*(e*this.flySpeed)),this.moveLeft?(this.camera.position.x-=s.x*(e*this.flySpeed),this.camera.position.y-=s.y*(e*this.flySpeed),this.camera.position.z-=s.z*(e*this.flySpeed)):this.moveRight&&(this.camera.position.x+=s.x*(e*this.flySpeed),this.camera.position.y+=s.y*(e*this.flySpeed),this.camera.position.z+=s.z*(e*this.flySpeed)),this.moveUp?this.camera.position.y+=e*this.flySpeed:this.moveDown&&(this.camera.position.y-=e*this.flySpeed)},GameLib.D3.FlyControls.prototype.update=function(e){this.applyRotation(),this.applyTranslation(e)},GameLib.D3.FlyControls.prototype.onMouseMove=function(e){if(this.canRotate){var t=e.movementX||e.mozMovementX||e.webkitMovementX||0,i=e.movementY||e.mozMovementY||e.webkitMovementY||0;this.yaw-=.002*t,this.pitch-=.002*i}},GameLib.D3.FlyControls.prototype.onKeyDown=function(e){switch(e.keyCode){case 87:this.moveForward=!0;break;case 65:this.moveLeft=!0;break;case 83:this.moveBackward=!0;break;case 68:this.moveRight=!0;break;case 104:this.moveUp=!0;break;case 98:this.moveDown=!0}},GameLib.D3.FlyControls.prototype.onKeyUp=function(e){switch(e.keyCode){case 38:case 87:this.moveForward=!1;break;case 37:case 65:this.moveLeft=!1;break;case 40:case 83:this.moveBackward=!1;break;case 39:case 68:this.moveRight=!1;break;case 104:this.moveUp=!1;break;case 98:this.moveDown=!1}},GameLib.D3.Game=function(){this.scenes={},this.physicsWorlds=[],this.sceneToPhysicsWorldsMap={}},GameLib.D3.Game.prototype.AddScene=function(e){this.scenes[e.name]=e},GameLib.D3.Game.prototype.AddPhysicsWorld=function(e){this.physicsWorlds.push(e)},GameLib.D3.Game.prototype.LinkPhysicsWorldToScene=function(e,t){this.sceneToPhysicsWorldsMap[t.name]=this.sceneToPhysicsWorldsMap[t.name]||[],this.sceneToPhysicsWorldsMap[t.name].push(e)},GameLib.D3.Game.prototype.GetPhysicsWorldsForScene=function(e){return this.sceneToPhysicsWorldsMap[e.name]},GameLib.D3.Game.prototype.ProcessPhysics=function(e){for(var t in this.sceneToPhysicsWorldsMap){var i=this.sceneToPhysicsWorldsMap[t],n=this.scenes[t];if(n&&i)for(var s=0,o=i.length;s0){var r=GameLib.D3.Texture.loadMaps(e,a,o,t,i,n);Q.all(r).then(function(){s.resolve(o)}).catch(function(e){console.log(e),s.reject(e)})}else s.resolve(o);return s.promise},GameLib.D3.Matrix3=function(e,t,i){this.identity(),e&&(this.rows[0]=e),t&&(this.rows[1]=t),i&&(this.rows[2]=i)},GameLib.D3.Matrix3.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0),new GameLib.D3.Vector4(0,1,0),new GameLib.D3.Vector4(0,0,1)]},GameLib.D3.Matrix4=function(e,t,i,n){this.identity(),e&&(this.rows[0]=e),t&&(this.rows[1]=t),i&&(this.rows[2]=i),n&&(this.rows[3]=n)},GameLib.D3.Matrix4.prototype.rotationMatrixX=function(e){return this.identity(),this.rows[1]=new GameLib.D3.Vector4(0,Math.cos(e),-1*Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(0,Math.sin(e),Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixY=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),0,Math.sin(e),0),this.rows[2]=new GameLib.D3.Vector4(-1*Math.sin(e),0,Math.cos(e),0),this},GameLib.D3.Matrix4.prototype.rotationMatrixZ=function(e){return this.identity(),this.rows[0]=new GameLib.D3.Vector4(Math.cos(e),-1*Math.sin(e),0,0),this.rows[1]=new GameLib.D3.Vector4(Math.sin(e),Math.cos(e),0,0),this},GameLib.D3.Matrix4.prototype.rotateX=function(e,t){return this.identity(),this.rotationMatrixX(e),this.multiply(t)},GameLib.D3.Matrix4.prototype.rotateY=function(e,t){return this.identity(),this.rotationMatrixY(e),this.multiply(t)},GameLib.D3.Matrix4.prototype.rotateZ=function(e,t){return this.identity(),this.rotationMatrixZ(e),this.multiply(t)},GameLib.D3.Matrix4.prototype.multiply=function(e){return e instanceof GameLib.D3.Vector4?new GameLib.D3.Vector4(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z+this.rows[0].w*e.w,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z+this.rows[1].w*e.w,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z+this.rows[2].w*e.w,this.rows[3].x*e.x+this.rows[3].y*e.y+this.rows[3].z*e.z+this.rows[3].w*e.w):e instanceof GameLib.D3.Vector3?new GameLib.D3.Vector3(this.rows[0].x*e.x+this.rows[0].y*e.y+this.rows[0].z*e.z,this.rows[1].x*e.x+this.rows[1].y*e.y+this.rows[1].z*e.z,this.rows[2].x*e.x+this.rows[2].y*e.y+this.rows[2].z*e.z):void 0},GameLib.D3.Matrix4.prototype.identity=function(){this.rows=[new GameLib.D3.Vector4(1,0,0,0),new GameLib.D3.Vector4(0,1,0,0),new GameLib.D3.Vector4(0,0,1,0),new GameLib.D3.Vector4(0,0,0,1)]},GameLib.D3.Matrix4.prototype.lookAt=function(e,t,i){var n=new GameLib.D3.Vector3(e.x,e.y,e.z),s=n.subtract(t).normalize();0===s.squared()&&(s.z=1);var o=i.cross(s).normalize();0===o.squared()&&(s.x+=1e-4,o=i.cross(s).normalize());var a=s.cross(o);return this.rows[0].x=o.x,this.rows[0].y=o.y,this.rows[0].z=o.z,this.rows[1].x=a.x,this.rows[1].y=a.y,this.rows[1].z=a.z,this.rows[2].x=s.x,this.rows[2].y=s.y,this.rows[2].z=s.z,this},GameLib.D3.Mesh=function(e,t,i,n,s,o,a,r,h,c,l,p,d,m,u,f,y,v,L){this.id=e,this.meshId=GameLib.D3.Tools.RandomId(),this.path=t,this.name=i,this.meshType=n,this.vertices=s,this.faces=o,"undefined"==typeof a&&(a=null),this.skeleton=a,"undefined"==typeof r&&(r=[]),this.faceVertexUvs=r,"undefined"==typeof h&&(h=[]),this.skinIndices=h,"undefined"==typeof c&&(c=[]),this.skinWeights=c,"undefined"==typeof l&&(l=[]),this.materials=l,"undefined"==typeof p&&(p=new GameLib.D3.Vector3(0,0,0)),this.position=p,"undefined"==typeof d&&new GameLib.D3.Vector4,this.quaternion=d,"undefined"==typeof m&&(m=new GameLib.D3.Vector3(0,0,0)),this.rotation=m,"undefined"==typeof u&&(u=new GameLib.D3.Vector3(1,1,1)),this.scale=u,"undefined"==typeof f&&(f=new GameLib.D3.Vector3(0,1,0)),this.up=f,this.physics=y,this.parentMeshId=v,this.parentSceneId=L},GameLib.D3.Mesh.TYPE_NORMAL=0,GameLib.D3.Mesh.TYPE_SKINNED=1,GameLib.D3.Mesh.createInstanceMesh=function(e,t,i,n){var s=null;if(e.meshType==GameLib.D3.Mesh.TYPE_NORMAL&&(s=new n.instance.Mesh(t,i)),e.meshType==GameLib.D3.Mesh.TYPE_SKINNED){for(var o=e.skeleton.bones,a=e.skinIndices,r=e.skinWeights,h=[],c=0;c0;){var a=s.pop();if(a.triangle.v0==a.edge.x&&a.triangle.v1==a.edge.y||a.triangle.v1==a.edge.x&&a.triangle.v2==a.edge.y||a.triangle.v2==a.edge.x&&a.triangle.v0==a.edge.y){var r=a.triangle.v1;a.triangle.v1=a.triangle.v2,a.triangle.v2=r;var h=a.triangle.v1uv;a.triangle.v1uv=a.triangle.v2uv,a.triangle.v2uv=h}o.push(a);for(var c=[new GameLib.D3.Vector2(a.triangle.v0,a.triangle.v1),new GameLib.D3.Vector2(a.triangle.v1,a.triangle.v2),new GameLib.D3.Vector2(a.triangle.v2,a.triangle.v0)],l=0;l9||console.log("The vertices are not in the right length : "+e.length);for(var i=[],n=new GameLib.D3.Vector4.Points,s=0;s0&&console.warn("Implement physics worlds code here");for(var h=[],c=0;c0},GameLib.D3.Vector3.normal=function(e,t,i){var n=t.copy(),s=i.copy();return n.subtract(e).cross(s.subtract(e))},GameLib.D3.Vector3.prototype.lookAt=function(e,t){var i=GameLib.D3.Matrix4.lookAt(this,e,t);this.multiply(i)},GameLib.D3.Vector3.prototype.translate=function(e){return this.x+=e.x,this.y+=e.y,this.z+=e.z,this},GameLib.D3.Vector3.prototype.squared=function(){return this.x*this.x+this.y*this.y+this.z*this.z},GameLib.D3.Vector3.prototype.copy=function(){return new GameLib.D3.Vector3(this.x,this.y,this.z)},GameLib.D3.Vector3.prototype.multiply=function(e){if(e instanceof GameLib.D3.Vector3)this.x*=e.x,this.y*=e.y,this.z*=e.z;else{if(!(e instanceof GameLib.D3.Matrix4))throw console.log("functionality not implemented - please do this"),new Error("not implemented");var t=e.rows[0].x*this.x+e.rows[0].y*this.y+e.rows[0].z*this.z,i=e.rows[1].x*this.x+e.rows[1].y*this.y+e.rows[1].z*this.z,n=e.rows[2].x*this.x+e.rows[2].y*this.y+e.rows[2].z*this.z;this.x=t,this.y=i,this.z=n}return this},GameLib.D3.Vector3.prototype.dot=function(e){return this.x*e.x+this.y*e.y+this.z*e.z},GameLib.D3.Vector3.prototype.normalize=function(){var e=1e-6,t=this.squared();if(to&&(o=h.x,n=t*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixY(n),l=0;lo&&(o=h.y,n=t*e)}this.vectors=s;for(var c=(new GameLib.D3.Matrix4).rotationMatrixX(n),l=0;ln&&(n=this.vectors[a].x),this.vectors[a].y>s&&(s=this.vectors[a].y),this.vectors[a].z>o&&(o=this.vectors[a].z);return new GameLib.D3.Vector3(Math.abs(n-e),Math.abs(s-t),Math.abs(s-i))},GameLib.D3.Vector4.Points.prototype.average=function(){for(var e=0,t=0,i=0,n=0;n 0) { - var textureMaps = GameLib.D3.Texture.loadMaps( - gameLibMaterial, - blenderMaps, - instanceMaterial, - graphics, - uploadUrl, - progressCallback - ); - Q.all(textureMaps).then( - function(){ - defer.resolve(instanceMaterial); - } - ).catch( - function(error){ - console.log(error); - defer.reject(error); - } - ) - } else { - defer.resolve(instanceMaterial); - } - - return defer.promise; -}; -/** - * Matrix 3 Maths - * @param row0 GameLib.D3.Vector3 - * @param row1 GameLib.D3.Vector3 - * @param row2 GameLib.D3.Vector3 - * @constructor - */ -GameLib.D3.Matrix3 = function( - row0, - row1, - row2 -) { - this.identity(); - - if (row0) { - this.rows[0] = row0; - } - - if (row1) { - this.rows[1] = row1; - } - - if (row2) { - this.rows[2] = row2; - } -}; - -/** - * Set matrix to identity - */ -GameLib.D3.Matrix3.prototype.identity = function () { - this.rows = [ - new GameLib.D3.Vector4(1, 0, 0), - new GameLib.D3.Vector4(0, 1, 0), - new GameLib.D3.Vector4(0, 0, 1) - ]; -}; -GameLib.D3.Matrix4 = function( - row0, - row1, - row2, - row3 -) { - - this.identity(); - - if (row0) { - this.rows[0] = row0; - } - - if (row1) { - this.rows[1] = row1; - } - - if (row2) { - this.rows[2] = row2; - } - - if (row3) { - this.rows[3] = row3; - } -}; - -GameLib.D3.Matrix4.prototype.rotationMatrixX = function (radians) { - this.identity(); - this.rows[1] = new GameLib.D3.Vector4(0, Math.cos(radians), -1 * Math.sin(radians), 0); - this.rows[2] = new GameLib.D3.Vector4(0, Math.sin(radians), Math.cos(radians), 0); - return this; -}; - -GameLib.D3.Matrix4.prototype.rotationMatrixY = function (radians) { - this.identity(); - this.rows[0] = new GameLib.D3.Vector4( - Math.cos(radians), - 0, - Math.sin(radians), - 0 - ); - this.rows[2] = new GameLib.D3.Vector4( - -1 * Math.sin(radians), - 0, - Math.cos(radians), - 0 - ); - return this; -}; - -GameLib.D3.Matrix4.prototype.rotationMatrixZ = function (radians) { - this.identity(); - this.rows[0] = new GameLib.D3.Vector4(Math.cos(radians), -1 * Math.sin(radians), 0, 0); - this.rows[1] = new GameLib.D3.Vector4(Math.sin(radians), Math.cos(radians), 0, 0); - return this; -}; - -GameLib.D3.Matrix4.prototype.rotateX = function (radians, point) { - this.identity(); - this.rotationMatrixX(radians); - return this.multiply(point); -}; - -GameLib.D3.Matrix4.prototype.rotateY = function (radians, point) { - this.identity(); - this.rotationMatrixY(radians); - return this.multiply(point); -}; - -GameLib.D3.Matrix4.prototype.rotateZ = function (radians, point) { - this.identity(); - this.rotationMatrixZ(radians); - return this.multiply(point); -}; - -GameLib.D3.Matrix4.prototype.multiply = function (mvp) { - if (mvp instanceof GameLib.D3.Vector4) { - return new GameLib.D3.Vector4( - this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z + this.rows[0].w * mvp.w, - this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z + this.rows[1].w * mvp.w, - this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z + this.rows[2].w * mvp.w, - this.rows[3].x * mvp.x + this.rows[3].y * mvp.y + this.rows[3].z * mvp.z + this.rows[3].w * mvp.w - ); - } else if (mvp instanceof GameLib.D3.Vector3) { - return new GameLib.D3.Vector3( - this.rows[0].x * mvp.x + this.rows[0].y * mvp.y + this.rows[0].z * mvp.z, - this.rows[1].x * mvp.x + this.rows[1].y * mvp.y + this.rows[1].z * mvp.z, - this.rows[2].x * mvp.x + this.rows[2].y * mvp.y + this.rows[2].z * mvp.z - ); - } -}; - -GameLib.D3.Matrix4.prototype.identity = function () { - this.rows = [ - new GameLib.D3.Vector4(1, 0, 0, 0), - new GameLib.D3.Vector4(0, 1, 0, 0), - new GameLib.D3.Vector4(0, 0, 1, 0), - new GameLib.D3.Vector4(0, 0, 0, 1) - ]; -}; - -GameLib.D3.Matrix4.prototype.lookAt = function (position, target, up) { - - var pv = new GameLib.D3.Vector3(position.x, position.y, position.z); - - var z = pv.subtract(target).normalize(); - - if (z.squared() === 0) { - z.z = 1; - } - - var x = up.cross(z).normalize(); - - if (x.squared() === 0) { - z.x += 0.0001; - x = up.cross(z).normalize(); - } - - var y = z.cross(x); - - this.rows[0].x = x.x; - this.rows[0].y = x.y; - this.rows[0].z = x.z; - - this.rows[1].x = y.x; - this.rows[1].y = y.y; - this.rows[1].z = y.z; - - this.rows[2].x = z.x; - this.rows[2].y = z.y; - this.rows[2].z = z.z; - - return this; - - // te[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x; - // te[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y; - // te[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z; - - - // var matrix4 = new Matrix4(); - // - // matrix4.rows[0] = side.negative(); - // matrix4.rows[1] = _up; - // matrix4.rows[2] = forward; - - // - // matrix4.setColumn(0, side.negative()); - // matrix4.setColumn(1, _up); - // matrix4.setColumn(2, forward); - - //return matrix4; - - // return new Matrix4( - // new Vector4( - // side.x, - // side.y, - // side.z, - // side.negative().dot(position) - // ), - // new Vector4( - // _up.x, - // _up.y, - // _up.z, - // _up.negative().dot(position) - // ), - // new Vector4( - // forward.negative().x, - // forward.negative().y, - // forward.negative().z, - // forward.dot(position) - // ) - // ) -}; - -/** - * Mesh Superset - * @param id - * @param path - * @param name - * @param meshType - * @param vertices - * @param faces - * @param skeleton - * @param faceVertexUvs - * @param skinIndices - * @param skinWeights - * @param materials - * @param position - * @param quaternion - * @param rotation - * @param scale - * @param up - * @param physics - * @param parentMeshId - * @param parentSceneId - * @constructor - */ -GameLib.D3.Mesh = function( - id, - path, - name, - meshType, - vertices, - faces, - skeleton, - faceVertexUvs, - skinIndices, - skinWeights, - materials, - position, - quaternion, - rotation, - scale, - up, - physics, - parentMeshId, - parentSceneId -) { - this.id = id; - this.meshId = GameLib.D3.Tools.RandomId(); - this.path = path; - this.name = name; - this.meshType = meshType; - this.vertices = vertices; - this.faces = faces; - - if (typeof skeleton == 'undefined') { - skeleton = null; - } - this.skeleton = skeleton; - - if (typeof faceVertexUvs == 'undefined') { - faceVertexUvs = []; - } - this.faceVertexUvs = faceVertexUvs; - - if (typeof skinIndices == 'undefined') { - skinIndices = []; - } - this.skinIndices = skinIndices; - - if (typeof skinWeights == 'undefined') { - skinWeights = []; - } - this.skinWeights = skinWeights; - - if (typeof materials == 'undefined') { - materials = []; - } - this.materials = materials; - - if (typeof position == 'undefined') { - position = new GameLib.D3.Vector3(0,0,0); - } - this.position = position; - - if (typeof quaternion == 'undefined') { - new GameLib.D3.Vector4(); - } - this.quaternion = quaternion; - - if (typeof rotation == 'undefined') { - rotation = new GameLib.D3.Vector3(0,0,0); - } - this.rotation = rotation; - - if (typeof scale == 'undefined') { - scale = new GameLib.D3.Vector3(1,1,1); - } - this.scale = scale; - - if (typeof up == 'undefined') { - up = new GameLib.D3.Vector3(0,1,0); - } - this.up = up; - - this.physics = physics; - - this.parentMeshId = parentMeshId; - - this.parentSceneId = parentSceneId; -}; - - -/** - * Mesh Type - * @type {number} - */ -GameLib.D3.Mesh.TYPE_NORMAL = 0; -GameLib.D3.Mesh.TYPE_SKINNED = 1; - - -/** - * Creates a THREE Mesh from GameLib.D3.Mesh - * @param gameLibMesh GameLib.D3.Mesh - * @param instanceGeometry - * @param instanceMaterial - * @param graphics - * @returns {*} - */ -GameLib.D3.Mesh.createInstanceMesh = function(gameLibMesh, instanceGeometry, instanceMaterial, graphics) { - - var threeMesh = null; - - if (gameLibMesh.meshType == GameLib.D3.Mesh.TYPE_NORMAL) { - threeMesh = new graphics.instance.Mesh(instanceGeometry, instanceMaterial); - } - - if (gameLibMesh.meshType == GameLib.D3.Mesh.TYPE_SKINNED) { - - var bones = gameLibMesh.skeleton.bones; - - var skinIndices = gameLibMesh.skinIndices; - - var skinWeights = gameLibMesh.skinWeights; - - var threeBones = []; - - for (var bi = 0; bi < bones.length; bi++) { - - var bone = new graphics.instance.Bone(); - - bone.name = bones[bi].name; - - bone.position.x = bones[bi].position.x; - bone.position.y = bones[bi].position.y; - bone.position.z = bones[bi].position.z; - - bone.rotation.x = bones[bi].rotation.x; - bone.rotation.y = bones[bi].rotation.y; - bone.rotation.z = bones[bi].rotation.z; - - bone.quaternion.x = bones[bi].quaternion.x; - bone.quaternion.y = bones[bi].quaternion.y; - bone.quaternion.z = bones[bi].quaternion.z; - bone.quaternion.w = bones[bi].quaternion.w; - - bone.scale.x = bones[bi].scale.x; - bone.scale.y = bones[bi].scale.y; - bone.scale.z = bones[bi].scale.z; - - bone.up.x = bones[bi].up.x; - bone.up.y = bones[bi].up.y; - bone.up.z = bones[bi].up.z; - - threeBones.push(bone); - } - - /** - * Setup the bone relationships - */ - for (var br = 0; br < bones.length; br++) { - for (var cbi = 0; cbi < bones[br].childBoneIds.length; cbi++) { - threeBones[br].add(threeBones[bones[br].childBoneIds[cbi]]); - } - } - - /** - * Setup bones (indexes) - */ - for (var si = 0; si < skinIndices.length; si++) { - instanceGeometry.skinIndices.push( - new graphics.instance.Vector4( - skinIndices[si].x, - skinIndices[si].y, - skinIndices[si].z, - skinIndices[si].w - ) - ); - } - - /** - * Setup bones (weights) - */ - for (var sw = 0; sw < skinWeights.length; sw++) { - instanceGeometry.skinWeights.push( - new graphics.instance.Vector4( - skinWeights[sw].x, - skinWeights[sw].y, - skinWeights[sw].z, - skinWeights[sw].w - ) - ); - } - - threeMesh = new graphics.instance.SkinnedMesh(instanceGeometry, instanceMaterial); - - var skeleton = new graphics.instance.Skeleton(threeBones); - - skeleton.useVertexTexture = gameLibMesh.skeleton.useVertexTexture; - - for (var i = 0; i < bones.length; i++) { - if (bones[i].parentBoneId === null) { - threeMesh.add(threeBones[i]); - break; - } - } - - threeMesh.bind(skeleton); - - threeMesh.pose(); - - threeMesh.skeleton.skeletonHelper = new graphics.instance.SkeletonHelper(threeMesh); - threeMesh.skeleton.skeletonHelper.material.linewidth = 5; - } - - if (threeMesh == null) { - console.log('cannot handle meshes of type ' + gameLibMesh.meshType + ' yet.'); - } - - gameLibMesh.threeMeshId = threeMesh.id; - - return threeMesh; -}; - -GameLib.D3.prototype.invertWindingOrder = function(triangles) { - - for (var i = 0; i < triangles.length; i++) { - var v1 = triangles[i].v1; - triangles[i].v1 = triangles[i].v2; - triangles[i].v2 = v1; - - var backupUV = triangles[i].triangle.v1uv; - triangles[i].triangle.v1uv = triangles[i].triangle.v2uv; - triangles[i].triangle.v2uv = backupUV; - } - - return triangles; -}; - -/** - * This function resets a the winding order of a mesh from a reference point V (the average center of the mesh) - */ -GameLib.D3.prototype.resetWindingOrder = function(faces, vertices) { - - var vertexList = new GameLib.D3.Vector3.Points(); - - for (var v = 0; v < vertices.length; v++) { - vertexList.add(new GameLib.D3.Vector3( - vertices[v].position.x, - vertices[v].position.y, - vertices[v].position.z - )); - } - - var V = vertexList.average(); - - var triangles = []; - - for (var s = 0; s < faces.length; s += 3) { - - var v0 = faces[s]; - var v1 = faces[s+1]; - var v2 = faces[s+2]; - - triangles.push( - { - v0 : v0, - v1 : v1, - v2 : v2, - edges : [ - {v0: v0, v1: v1}, - {v0: v1, v1: v2}, - {v0: v2, v1: v0} - ], - winding : 0, - edgeIndex : -1, - processed : false - } - ); - } - - for (var i = 0; i < triangles.length; i++) { - if ( - GameLib.D3.Vector3.clockwise( - vertices[triangles[i].v0].position, - vertices[triangles[i].v1].position, - vertices[triangles[i].v2].position, - V - ) - ) { - console.log('clockwise'); - var bv1 = triangles[i].v1; - triangles[i].v1 = triangles[i].v2; - triangles[i].v2 = bv1; - } else { - console.log('not clockwise'); - } - } - - return triangles; -}; - -/** - * This function resets the winding order for triangles in faces, given an initial triangle and orientation edge - * used pseudocode from - * http://stackoverflow.com/questions/17036970/how-to-correct-winding-of-triangles-to-counter-clockwise-direction-of-a-3d-mesh - * We need to use a graph traversal algorithm, - * lets assume we have method that returns neighbor of triangle on given edge - * - * neighbor_on_egde( next_tria, edge ) - * - * to_process = set of pairs triangle and orientation edge, initial state is one good oriented triangle with any edge on it - * processed = set of processed triangles; initial empty - * - * while to_process is not empty: - * next_tria, orientation_edge = to_process.pop() - * add next_tria in processed - * if next_tria is not opposite oriented than orientation_edge: - * change next_tria (ABC) orientation (B<->C) - * for each edge (AB) in next_tria: - * neighbor_tria = neighbor_on_egde( next_tria, edge ) - * if neighbor_tria exists and neighbor_tria not in processed: - * to_process add (neighbor_tria, edge opposite oriented (BA)) - * @param faces GameLib.D3.TriangleFace[] - * @param orientationEdge GameLib.D3.Vector2 - * @returns {Array} - */ -GameLib.D3.fixWindingOrder = function(faces, orientationEdge) { - - /** - * Checks if a TriangleFace belonging to a TriangleEdge has already been processed - * @param processed TriangleEdge[] - * @param triangle TriangleFace - * @returns {boolean} - */ - function inProcessed(processed, triangle) { - - for (var i = 0; i < processed.length; i++) { - if (processed[i].triangle.equals(triangle)) { - return true; - } - } - - return false; - } - - /** - * Returns a neighbouring triangle on a specific edge - preserving the edge orientation - * @param edge GameLib.D3.Vector2 - * @param faces GameLib.D3.TriangleFace[] - * @param currentTriangle - * @returns {*} - */ - function neighbourOnEdge(edge, faces, currentTriangle) { - - for (var i = 0; i < faces.length; i++) { - if ( - (faces[i].v0 == edge.x && faces[i].v1 == edge.y) || - (faces[i].v1 == edge.x && faces[i].v2 == edge.y) || - (faces[i].v2 == edge.x && faces[i].v0 == edge.y) || - (faces[i].v0 == edge.y && faces[i].v1 == edge.x) || - (faces[i].v1 == edge.y && faces[i].v2 == edge.x) || - (faces[i].v2 == edge.y && faces[i].v0 == edge.x) - ) { - - var triangle = new GameLib.D3.TriangleFace( - faces[i].v0, - faces[i].v1, - faces[i].v2, - faces[i].materialIndex, - faces[i].v0uv, - faces[i].v1uv, - faces[i].v2uv - ); - - if (triangle.equals(currentTriangle)) { - continue; - } - - return new GameLib.D3.TriangleEdge( - triangle, - edge - ); - } - } - - return null; - } - - var toProcess = [ - new GameLib.D3.TriangleEdge( - new GameLib.D3.TriangleFace( - faces[0].v0, - faces[0].v1, - faces[0].v2, - faces[0].materialIndex, - faces[0].v0uv, - faces[0].v1uv, - faces[0].v2uv - ), - orientationEdge - ) - ]; - - var processed = []; - - while (toProcess.length > 0) { - - var triangleEdge = toProcess.pop(); - - /** - * If edge is the same orientation (i.e. the edge order is the same as the given triangle edge) it needs to be reversed - * to have the same winding order) - */ - if ( - (triangleEdge.triangle.v0 == triangleEdge.edge.x && - triangleEdge.triangle.v1 == triangleEdge.edge.y) || - (triangleEdge.triangle.v1 == triangleEdge.edge.x && - triangleEdge.triangle.v2 == triangleEdge.edge.y) || - (triangleEdge.triangle.v2 == triangleEdge.edge.x && - triangleEdge.triangle.v0 == triangleEdge.edge.y) - ) { - var backupV = triangleEdge.triangle.v1; - triangleEdge.triangle.v1 = triangleEdge.triangle.v2; - triangleEdge.triangle.v2 = backupV; - - var backupUV = triangleEdge.triangle.v1uv; - triangleEdge.triangle.v1uv = triangleEdge.triangle.v2uv; - triangleEdge.triangle.v2uv = backupUV; - } - - processed.push(triangleEdge); - - var edges = [ - new GameLib.D3.Vector2( - triangleEdge.triangle.v0, - triangleEdge.triangle.v1 - ), - new GameLib.D3.Vector2( - triangleEdge.triangle.v1, - triangleEdge.triangle.v2 - ), - new GameLib.D3.Vector2( - triangleEdge.triangle.v2, - triangleEdge.triangle.v0 - ) - ]; - - for (var j = 0; j < edges.length; j++) { - var neighbour = neighbourOnEdge(edges[j], faces, triangleEdge.triangle); - if (neighbour && !inProcessed(processed, neighbour.triangle)) { - toProcess.push(neighbour); - } - } - } - - /** - * In processed - we will have some duplicates - only add the unique ones - * @type {Array} - */ - var triangles = []; - for (var i = 0; i < processed.length; i++) { - var found = false; - for (var k = 0; k < triangles.length; k++) { - if (triangles[k].equals(processed[i].triangle)){ - found = true; - break; - } - } - if (!found) { - triangles.push(processed[i].triangle); - } - } - - return triangles; -}; - -/** - * This is a work-around function to fix polys which don't triangulate because - * they could lie on Z-plane (XZ or YZ)) - we translate the poly to the origin, systematically rotate the poly around - * Z then Y axis - * @param verticesFlat [] - * @param grain is the amount to systematically rotate the poly by - a finer grain means a more accurate maximum XY - * @return [] - */ -GameLib.D3.fixPolyZPlane = function(verticesFlat, grain) { - - if ((verticesFlat.length % 3) != 0 && !(verticesFlat.length > 9)) { - console.log("The vertices are not in the right length : " + verticesFlat.length); - } - - var vertices = []; - - var points = new GameLib.D3.Vector4.Points(); - - for (var i = 0; i < verticesFlat.length; i += 3) { - points.add(new GameLib.D3.Vector3( - verticesFlat[i], - verticesFlat[i + 1], - verticesFlat[i + 2] - )); - } - - points.toOrigin(); - - points.maximizeXDistance(grain); - - points.maximizeYDistance(grain); - - for (i = 0; i < points.vectors.length; i++) { - vertices.push( - [ - points.vectors[i].x, - points.vectors[i].y - ] - ); - } - - return vertices; -}; -/** - * Physics SuperSet Namespace Object - * @param id - * @param name - * @param engine GameLib.D3.Engine - * @param worlds - * @returns {{World: World}} - * @constructor - */ -GameLib.D3.Physics = function( - id, - name, - engine, - worlds -) { - this.id = id; - this.name = name; - this.engine = engine; - - if (typeof worlds == 'undefined') { - worlds = []; - } - this.worlds = worlds; -}; - - -/** - * Solver Types - * @type {number} - */ -GameLib.D3.Physics.SPLIT_SOLVER = 0x1; -GameLib.D3.Physics.GS_SOLVER = 0x2; -/** - * Contains a Poly vertex data structure - * @param localIndex - * @param mvertIndex - * @param uv GameLib.D3.Vector2 - * @param materialIndex - * @param edgeIndex - * @constructor - */ -GameLib.D3.PolyVertex = function( - localIndex, - mvertIndex, - uv, - materialIndex, - edgeIndex -) { - this.localIndex = localIndex; - this.mvertIndex = mvertIndex; - this.uv = uv; - this.materialIndex = materialIndex; - this.edgeIndex = edgeIndex; -}; - -/** - * Clone a PolyVertex - * @returns {GameLib.D3.PolyVertex} - */ -GameLib.D3.PolyVertex.prototype.clone = function() { - return new GameLib.D3.PolyVertex( - this.localIndex, - this.mvertIndex, - this.uv.copy(), - this.materialIndex, - this.edgeIndex - ) -}; -/** - * Raycast Vehicles :) - * @param engine GameLib.D3.Engine - * @param chassisBody GameLib.D3.RigidBody - * @param wheels GameLib.D3.RaycastWheel[] - * @constructor - */ -GameLib.D3.RaycastVehicle = function( - engine, - chassisBody, - wheels -) { - this.engine = engine; - this.engine.isNotCannonThrow(); - - this.componentId = GameLib.D3.Tools.RandomId(); - - this.chassisBody = chassisBody; - - if (typeof wheels == 'undefined') { - wheels = []; - } - this.wheels = wheels; - - this.instance = this.createInstance(); -}; - -/** - * private - * @returns {GameLib.D3.RaycastVehicle|GameLib.D3.Physics.RaycastVehicle|*} - */ -GameLib.D3.RaycastVehicle.prototype.createInstance = function() { - return new this.engine.instance.RaycastVehicle({ - chassisBody: this.chassisBody.instance - }); -}; - -/** - * Adds a raycast wheel to this vehicle - * @param wheel GameLib.D3.RaycastWheel - */ -GameLib.D3.RaycastVehicle.prototype.addWheel = function ( - wheel -) { - this.wheels.push(wheel); - this.instance.addWheel(wheel.instance); -}; - -/** - * Returns updated wheel info - * @returns {*} - * @constructor - */ -GameLib.D3.RaycastVehicle.prototype.getWheelInfo = function() { - return this.instance.wheelInfos; -}; -GameLib.D3.RaycastWheel = function( - engine, - chassisConnectionPointLocal, - chassisConnectionPointWorld, - directionLocal, - directionWorld, - axleLocal, - axleWorld, - suspensionRestLength, - suspensionMaxLength, - radius, - suspensionStiffness, - dampingCompression, - dampingRelaxation, - frictionSlip, - steering, - rotation, - deltaRotation, - rollInfluence, - maxSuspensionForce, - isFrontWheel, - clippedInvContactDotSuspension, - suspensionRelativeVelocity, - suspensionForce, - skidInfo, - suspensionLength, - maxSuspensionTravel, - useCustomSlidingRotationalSpeed, - customSlidingRotationalSpeed -) { - this.engine = engine; - this.engine.isNotCannonThrow(); - - this.componentId = GameLib.D3.Tools.RandomId(); - - if(typeof chassisConnectionPointLocal == 'undefined') { - chassisConnectionPointLocal = new this.engine.instance.Vec3(); - } - this.chassisConnectionPointLocal = chassisConnectionPointLocal; - - if(typeof chassisConnectionPointWorld == 'undefined') { - chassisConnectionPointWorld = new this.engine.instance.Vec3(); - } - this.chassisConnectionPointWorld = chassisConnectionPointWorld; - - if(typeof directionLocal == 'undefined') { - directionLocal = new this.engine.instance.Vec3(); - } - this.directionLocal = directionLocal; - - if(typeof directionWorld == 'undefined') { - directionWorld = new this.engine.instance.Vec3(); - } - this.directionWorld = directionWorld; - - if(typeof axleLocal == 'undefined') { - axleLocal = new this.engine.instance.Vec3(); - } - this.axleLocal = axleLocal; - - if(typeof axleWorld == 'undefined') { - axleWorld = new this.engine.instance.Vec3(); - } - this.axleWorld = axleWorld; - - if(typeof suspensionRestLength == 'undefined') { - suspensionRestLength = 1; - } - this.suspensionRestLength = suspensionRestLength; - - if(typeof suspensionMaxLength == 'undefined') { - suspensionMaxLength = 2; - } - this.suspensionMaxLength = suspensionMaxLength; - - if(typeof radius == 'undefined') { - radius = 1; - } - this.radius = radius; - - if(typeof suspensionStiffness == 'undefined') { - suspensionStiffness = 100; - } - this.suspensionStiffness = suspensionStiffness; - - if(typeof dampingCompression == 'undefined') { - dampingCompression = 10; - } - this.dampingCompression = dampingCompression; - - if(typeof dampingRelaxation == 'undefined') { - dampingRelaxation = 10; - } - this.dampingRelaxation = dampingRelaxation; - - if(typeof frictionSlip == 'undefined') { - frictionSlip = 10000; - } - this.frictionSlip = frictionSlip; - - if(typeof steering == 'undefined') { - steering = 0; - } - this.steering = steering; - - if(typeof rotation == 'undefined') { - rotation = 0; - } - this.rotation = rotation; - - if(typeof deltaRotation == 'undefined') { - deltaRotation = 0; - } - this.deltaRotation = deltaRotation; - - if(typeof rollInfluence == 'undefined') { - rollInfluence = 0.01; - } - this.rollInfluence = rollInfluence; - - if(typeof maxSuspensionForce == 'undefined') { - maxSuspensionForce = Number.MAX_VALUE; - } - this.maxSuspensionForce = maxSuspensionForce; - - if(typeof isFrontWheel == 'undefined') { - isFrontWheel = true; - } - this.isFrontWheel = isFrontWheel; - - if(typeof clippedInvContactDotSuspension == 'undefined') { - clippedInvContactDotSuspension = 1; - } - this.clippedInvContactDotSuspension = clippedInvContactDotSuspension; - - if(typeof suspensionRelativeVelocity == 'undefined') { - suspensionRelativeVelocity = 0; - } - this.suspensionRelativeVelocity = suspensionRelativeVelocity; - - if(typeof suspensionForce == 'undefined') { - suspensionForce = 0; - } - this.suspensionForce = suspensionForce; - - if(typeof skidInfo == 'undefined') { - skidInfo = 0; - } - this.skidInfo = skidInfo; - - if(typeof suspensionLength == 'undefined') { - suspensionLength = 0; - } - this.suspensionLength = suspensionLength; - - if(typeof maxSuspensionTravel == 'undefined') { - maxSuspensionTravel = 1; - } - this.maxSuspensionTravel = maxSuspensionTravel; - - if(typeof useCustomSlidingRotationalSpeed == 'undefined') { - useCustomSlidingRotationalSpeed = false; - } - this.useCustomSlidingRotationalSpeed = useCustomSlidingRotationalSpeed; - - if(typeof customSlidingRotationalSpeed == 'undefined') { - customSlidingRotationalSpeed = -0.1; - } - this.customSlidingRotationalSpeed = customSlidingRotationalSpeed; - - this.instance = this.createInstance(); -}; - -GameLib.D3.RaycastWheel.prototype.createInstance = function() { - - return new this.engine.instance.WheelInfo({ - chassisConnectionPointLocal : this.chassisConnectionPointLocal, - chassisConnectionPointWorld : this.chassisConnectionPointWorld, - directionLocal : this.directionLocal, - directionWorld : this.directionWorld, - axleLocal : this.axleLocal, - axleWorld : this.axleWorld, - suspensionRestLength : this.suspensionRestLength, - suspensionMaxLength : this.suspensionMaxLength, - radius : this.radius, - suspensionStiffness : this.suspensionStiffness, - dampingCompression : this.dampingCompression, - dampingRelaxation : this.dampingRelaxation, - frictionSlip : this.frictionSlip, - steering : this.steering, - rotation : this.rotation, - deltaRotation : this.deltaRotation, - rollInfluence : this.rollInfluence, - maxSuspensionForce : this.maxSuspensionForce, - isFrontWheel : this.isFrontWheel, - clippedInvContactDotSuspension : this.clippedInvContactDotSuspension, - suspensionRelativeVelocity : this.suspensionRelativeVelocity, - suspensionForce : this.suspensionForce, - skidInfo : this.skidInfo, - suspensionLength : this.suspensionLength, - maxSuspensionTravel : this.maxSuspensionTravel, - useCustomSlidingRotationalSpeed : this.useCustomSlidingRotationalSpeed, - customSlidingRotationalSpeed : this.customSlidingRotationalSpeed - }); - -}; - -/** - * Physics Rigid Body Vehicle Superset - * @param engine GameLib.D3.Engine - * @param chassisBody GameLib.D3.RigidBody - * @param wheels GameLib.D3.RigidWheel[] - * @constructor - */ -GameLib.D3.RigidBodyVehicle = function( - engine, - chassisBody, - wheels -) { - this.componentId = GameLib.D3.Tools.RandomId(); - this.engine = engine; - this.engine.isNotCannonThrow(); - - this.chassisBody = chassisBody; - - if (typeof wheels == 'undefined') { - wheels = []; - } - this.wheels = wheels; - - this.instance = this.createInstance(); -}; - -/** - * Returns physics wheelbody info (for updates) - * @returns {Array} - */ -GameLib.D3.RigidBodyVehicle.prototype.getWheelInfo = function() { - return this.instance.wheelBodies; -}; - -/** - * - * @returns {GameLib.D3.RigidVehicle} - */ -GameLib.D3.RigidBodyVehicle.prototype.createInstance = function() { - return new this.engine.instance.RigidVehicle({ - chassisBody: this.chassisBody.instance - }); -}; - -/** - * Adds a wheel to this rigid body vehicle - * @param wheel GameLib.D3.RigidWheel - */ -GameLib.D3.RigidBodyVehicle.prototype.addWheel = function(wheel) { - - this.wheels.push(wheel); - - this.instance.addWheel({ - body: wheel.body.instance, - position: new this.engine.instance.Vec3( - wheel.position.x, - wheel.position.y, - wheel.position.z - ), - axis: new this.engine.instance.Vec3( - wheel.axis.x, - wheel.axis.y, - wheel.axis.z - ), - direction: new this.engine.instance.Vec3( - wheel.direction.x, - wheel.direction.y, - wheel.direction.z - ) - }); - -}; - -/** - * RigidBody Superset - * @param engine GameLib.D3.Engine - * @param mass - * @param friction - * @param position - * @param quaternion - * @param velocity - * @param angularVelocity - * @param linearDamping - * @param angularDamping - * @param allowSleep - * @param sleepSpeedLimit - * @param sleepTimeLimit - * @param collisionFilterGroup - * @param collisionFilterMask - * @param fixedRotation - * @param shape GameLib.D3.Shape - * @returns {GameLib.D3.Physics.RigidBody} - * @constructor - */ -GameLib.D3.RigidBody = function( - engine, - mass, - friction, - position, - quaternion, - velocity, - angularVelocity, - linearDamping, - angularDamping, - allowSleep, - sleepSpeedLimit, - sleepTimeLimit, - collisionFilterGroup, - collisionFilterMask, - fixedRotation, - shape -) { - this.componentId = GameLib.D3.Tools.RandomId(); - this.position = position || new GameLib.D3.Vector3(); - this.velocity = velocity || new GameLib.D3.Vector3(); - this.angularVelocity = angularVelocity || new GameLib.D3.Vector3(); - this.quaternion = quaternion || new GameLib.D3.Vector4(0, 0, 0, 1); - this.mass = typeof mass == "undefined" ? 0 : mass; - this.friction = typeof friction == "undefined" ? 5 : friction; - this.linearDamping = typeof linearDamping == "undefined" ? 0.01 : linearDamping; - this.angularDamping = typeof angularDamping == "undefined" ? 0.01 : angularDamping; - this.allowSleep = typeof allowSleep == "undefined" ? true : allowSleep; - this.sleepSpeedLimit = typeof sleepSpeedLimit == "undefined" ? 0.1 : sleepSpeedLimit; - this.sleepTimeLimit = typeof sleepTimeLimit == "undefined" ? 1.0 : sleepTimeLimit; - this.collisionFilterGroup = typeof collisionFilterGroup == "undefined" ? 1 : collisionFilterGroup; - this.collisionFilterMask = typeof collisionFilterMask == "undefined" ? 1 : collisionFilterMask; - this.fixedRotation = typeof fixedRotation == "undefined" ? false : fixedRotation; - this.shape = typeof shape == "undefined" ? null : shape; - - this.engine = engine; - - this.engine.isNotCannonThrow(); - - this.instance = this.createInstance(); -}; - -/** - * private function - * @returns {*} - */ -GameLib.D3.RigidBody.prototype.createInstance = function() { - - var instance = new this.engine.instance.Body({ - mass: mass, - friction: this.friction, - position: new this.engine.instance.Vec3( - this.position.x, - this.position.y, - this.position.z - ), - velocity: new this.engine.instance.Vec3( - this.velocity.x, - this.velocity.y, - this.velocity.z - ), - quaternion: new this.engine.instance.Quaternion( - this.quaternion.x, - this.quaternion.y, - this.quaternion.z, - this.quaternion.w - ), - angularVelocity: new this.engine.instance.Vec3( - this.angularVelocity.x, - this.angularVelocity.y, - this.angularVelocity.z - ), - linearDamping: this.linearDamping, - angularDamping: this.angularDamping, - allowSleep: this.allowSleep, - sleepSpeedLimit: this.sleepSpeedLimit, - sleepTimeLimit: this.sleepTimeLimit, - collisionFilterGroup: this.collisionFilterGroup, - collisionFilterMask: this.collisionFilterMask, - fixedRotation: this.fixedRotation, - shape: this.shape.instance - }); - - this.instance = instance; - - return instance; -}; - -/** - * Adds a shape to this rigid body - * @param shape GameLib.D3.Shape - * @param offset GameLib.D3.Vector3 - * @param orientation GameLib.D3.Vector4 - * @constructor - */ -GameLib.D3.RigidBody.prototype.addShape = function( - shape, - offset, - orientation -) { - if (!offset) { - offset = new GameLib.D3.Vector3(0,0,0); - } - - if (!orientation) { - orientation = new GameLib.D3.Vector4(0,0,0,1); - } - - this.instance.addShape( - shape.instance, - new this.engine.instance.Vec3( - offset.x, - offset.y, - offset.z - ), - new this.engine.instance.Quaternion( - orientation.x, - orientation.y, - orientation.z, - orientation.w - ) - ); -}; - - - -/** - * Rigid Wheel superset - * @param body GameLib.D3.RigidBody - * @param position GameLib.D3.Vector3 - * @param axis GameLib.D3.Vector3 - * @param direction GameLib.D3.Vector3 - * @constructor - */ -GameLib.D3.RigidWheel = function( - body, - position, - axis, - direction -) { - this.componentId = GameLib.D3.Tools.RandomId(); - this.body = body; - this.position = position; - this.axis = axis; - this.direction = direction; -}; - -/** - * Scenes are objects putting meshes into 'world space' - * @param id - * @param path String - * @param name String - * @param meshes GameLib.D3.Mesh[] - * @param quaternion - * @param position - * @param rotation - * @param scale - * @param parentSceneId - * @param lights - * @param worlds - * @param entities - * @constructor - */ -GameLib.D3.Scene = function( - id, - path, - name, - meshes, - quaternion, - position, - rotation, - scale, - parentSceneId, - lights, - worlds, - entities -) { - this.id = id; - this.sceneId = GameLib.D3.Tools.RandomId(); - this.path = path; - this.name = name; - if (this.name.trim() == "") { - this.name = 'unnamed'; - } - - if (typeof meshes == 'undefined') { - meshes = []; - } - this.meshes = meshes; - - if (typeof quaternion == 'undefined') { - quaternion = new GameLib.D3.Vector4(); - } - this.quaternion = quaternion; - - if (typeof position == 'undefined') { - position = new GameLib.D3.Vector3(0,0,0); - } - this.position = position; - - if (typeof rotation == 'undefined') { - rotation = new GameLib.D3.Vector3(0,0,0); - } - this.rotation = rotation; - - if (typeof scale == 'undefined') { - scale = new GameLib.D3.Vector3(1,1,1); - } - this.scale = scale; - - if (typeof parentSceneId == 'undefined') { - parentSceneId = null; - } - this.parentSceneId = parentSceneId; - - if (typeof lights == 'undefined') { - lights = []; - } - this.lights = lights; - - if (typeof worlds == 'undefined') { - worlds = []; - } - this.worlds = worlds; - - if (typeof entities == 'undefined') { - entities = []; - } - this.entities = entities; -}; - -/** - * Loads a scene directly from the API - * @param gameLibScene GameLib.D3.Scene - * @param onLoaded callback - * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback callback - * @param apiUrl - */ -GameLib.D3.Scene.LoadSceneFromApi = function( - gameLibScene, - onLoaded, - graphics, - uploadUrl, - progressCallback, - apiUrl -) { - - /** - * First check if this is a client or server side request - */ - if (typeof XMLHttpRequest == 'undefined') { - console.warn('implement server side loading from API here'); - return onLoaded(null, new Error('not implemented')); - } - - var xhr = new XMLHttpRequest(); - xhr.open( - 'GET', - apiUrl + '/scene/load' + gameLibScene.path + '/' + gameLibScene.name - ); - - xhr.onreadystatechange = function(xhr) { - return function() { - if (xhr.readyState == 4) { - - var response = JSON.parse(xhr.responseText); - - if (!response.scene || response.scene.length == 0) { - return onLoaded(null, null, new Error('Could not load scene')); - } - - var scene = response.scene[0]; - - var physics3ds = []; - - if (scene.worlds && scene.worlds.length > 0) { - console.warn('Implement physics worlds code here'); - //TODO: physics world code here - } - - var lights3d = []; - - for (var l = 0; l < scene.lights.length; l++) { - - var light = scene.lights[l]; - - var light3d = new GameLib.D3.Light( - light.id, - light.lightType, - light.name, - new GameLib.D3.Color( - light.color.r, - light.color.g, - light.color.b, - light.color.a - ), - light.intensity, - new GameLib.D3.Vector3( - light.position.x, - light.position.y, - light.position.z - ), - new GameLib.D3.Vector3( - light.targetPosition.x, - light.targetPosition.y, - light.targetPosition.z - ), - new GameLib.D3.Vector4( - light.quaternion.x, - light.quaternion.y, - light.quaternion.z, - light.quaternion.w - ), - new GameLib.D3.Vector3( - light.rotation.x, - light.rotation.y, - light.rotation.z - ), - new GameLib.D3.Vector3( - light.scale.x, - light.scale.y, - light.scale.z - ), - light.distance, - light.decay, - light.power, - light.angle, - light.penumbra - ); - - lights3d.push(light3d); - } - - var scene3d = new GameLib.D3.Scene( - scene._id || scene.id, - scene.path, - scene.name, - scene.meshes, - new GameLib.D3.Vector4( - scene.quaternion.x, - scene.quaternion.y, - scene.quaternion.z, - scene.quaternion.w - ), - new GameLib.D3.Vector3( - scene.position.x, - scene.position.y, - scene.position.z - ), - new GameLib.D3.Vector3( - scene.rotation.x, - scene.rotation.y, - scene.rotation.z - ), - new GameLib.D3.Vector3( - scene.scale.x, - scene.scale.y, - scene.scale.z - ), - scene.parentSceneId, - lights3d, - physics3ds - ); - - GameLib.D3.Scene.LoadScene( - scene3d, - onLoaded, - false, - graphics, - uploadUrl, - progressCallback - ); - } - } - }(xhr); - - xhr.send(); -}; - -/** - * Loads a GameLib.D3.Scene object into a Graphics Instance Scene object - * @param gameLibScene GameLib.D3.Scene - * @param onLoaded callback when all meshes have loaded - * @param computeNormals set to true to compute new face and vertex normals during load - * @param graphics GameLib.D3.Graphics - * @param uploadUrl - * @param progressCallback - */ -GameLib.D3.Scene.LoadScene = function( - gameLibScene, - onLoaded, - computeNormals, - graphics, - uploadUrl, - progressCallback -) { - - console.log("loading scene " + gameLibScene.name); - - graphics.isNotThreeThrow(); - - var meshQ = []; - - for (var m = 0; m < gameLibScene.meshes.length; m++) { - - var mesh = gameLibScene.meshes[m]; - - console.log("loading mesh " + mesh.name); - - var geometry = new graphics.instance.Geometry(); - - var vertices = mesh.vertices; - - var faces = mesh.faces; - - var faceVertexUvs = mesh.faceVertexUvs; - - var materials = mesh.materials; - - /** - * Setup vertices - */ - for (var v = 0; v < vertices.length; v++) { - geometry.vertices.push( - new graphics.instance.Vector3( - vertices[v].position.x, - vertices[v].position.y, - vertices[v].position.z - ) - ) - } - - /** - * Setup faces - */ - for (var f = 0; f < faces.length; f++) { - - var face = new graphics.instance.Face3( - faces[f].v0, - faces[f].v1, - faces[f].v2, - new graphics.instance.Vector3( - faces[f].normal.x, - faces[f].normal.y, - faces[f].normal.z - ), - new graphics.instance.Color( - faces[f].color.r, - faces[f].color.g, - faces[f].color.b - ), - faces[f].materialIndex - ); - - face.vertexColors = [ - new graphics.instance.Color( - faces[f].vertexColors[0].r, - faces[f].vertexColors[0].g, - faces[f].vertexColors[0].b - ), - new graphics.instance.Color( - faces[f].vertexColors[1].r, - faces[f].vertexColors[1].g, - faces[f].vertexColors[1].b - ), - new graphics.instance.Color( - faces[f].vertexColors[2].r, - faces[f].vertexColors[2].g, - faces[f].vertexColors[2].b - ) - ]; - - face.normal = new graphics.instance.Vector3( - faces[f].normal.x, - faces[f].normal.y, - faces[f].normal.z - ); - - face.vertexNormals = [ - new graphics.instance.Vector3( - faces[f].vertexNormals[0].x, - faces[f].vertexNormals[0].y, - faces[f].vertexNormals[0].z - ), - new graphics.instance.Vector3( - faces[f].vertexNormals[1].x, - faces[f].vertexNormals[1].y, - faces[f].vertexNormals[1].z - ), - new graphics.instance.Vector3( - faces[f].vertexNormals[2].x, - faces[f].vertexNormals[2].y, - faces[f].vertexNormals[2].z - ) - ]; - - geometry.faces.push(face); - } - - geometry.faceVertexUvs = []; - - /** - * Setup face UVs - */ - for (var fm = 0; fm < faceVertexUvs.length; fm++) { - - var faceMaterialVertexUvs = faceVertexUvs[fm]; - - geometry.faceVertexUvs[fm] = []; - - for (var fuv = 0; fuv < faceMaterialVertexUvs.length; fuv++) { - geometry.faceVertexUvs[fm][fuv] = []; - geometry.faceVertexUvs[fm][fuv].push( - new graphics.instance.Vector2( - faceMaterialVertexUvs[fuv][0].x, - faceMaterialVertexUvs[fuv][0].y - ), - new graphics.instance.Vector2( - faceMaterialVertexUvs[fuv][1].x, - faceMaterialVertexUvs[fuv][1].y - ), - new graphics.instance.Vector2( - faceMaterialVertexUvs[fuv][2].x, - faceMaterialVertexUvs[fuv][2].y - ) - ); - } - } - - /** - * Re-calculate normals (if we have to) - * @type {Array} - */ - if (computeNormals) { - geometry.computeFaceNormals(); - geometry.computeVertexNormals(); - } - - var instanceMaterialLoaders = []; - - /** - * Setup materials - */ - for (var mi = 0; mi < materials.length; mi++) { - instanceMaterialLoaders.push( - GameLib.D3.Material.createInstanceMaterial( - materials[mi], - graphics, - uploadUrl, - progressCallback - ) - ); - } - - var result = Q.all(instanceMaterialLoaders).then( - function(mesh, geometry) { - return function(materials) { - - console.log("loaded material : " + materials[0].name); - - /** - * We don't support MultiMaterial atm - it doesn't work with raycasting - */ - var material = materials[0]; - - var threeMesh = GameLib.D3.Mesh.createInstanceMesh( - mesh, - geometry, - material, - graphics - ); - threeMesh.name = mesh.name; - - threeMesh.position.x = mesh.position.x; - threeMesh.position.y = mesh.position.y; - threeMesh.position.z = mesh.position.z; - - threeMesh.rotation.x = mesh.rotation.x; - threeMesh.rotation.y = mesh.rotation.y; - threeMesh.rotation.z = mesh.rotation.z; - - threeMesh.scale.x = mesh.scale.x; - threeMesh.scale.y = mesh.scale.y; - threeMesh.scale.z = mesh.scale.z; - - threeMesh.quaternion.x = mesh.quaternion.x; - threeMesh.quaternion.y = mesh.quaternion.y; - threeMesh.quaternion.z = mesh.quaternion.z; - threeMesh.quaternion.w = mesh.quaternion.w; - - return threeMesh; - }; - }(mesh, geometry) - ).catch(function(error){ - console.log(error); - }); - - meshQ.push(result); - } - - Q.all(meshQ).then( - function(instanceMeshes){ - console.log("all meshes have loaded"); - if (typeof onLoaded != 'undefined') { - - var instanceLights = []; - - for (var sli = 0; sli < gameLibScene.lights.length; sli++) { - - var gameLibLight = gameLibScene.lights[sli]; - - var light = null; - - if (gameLibLight.lightType == 'AmbientLight') { - light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity); - } - - if (gameLibLight.lightType == 'DirectionalLight') { - light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity); - } - - if (gameLibLight.lightType == 'PointLight') { - light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity); - light.distance = gameLibLight.distance; - light.decay = gameLibLight.decay; - } - - if (gameLibLight.lightType == 'SpotLight') { - light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity); - light.distance = gameLibLight.distance; - light.angle = gameLibLight.angle; - light.penumbra = gameLibLight.penumbra; - light.decay = gameLibLight.decay; - } - - light.position.x = gameLibLight.position.x; - light.position.y = gameLibLight.position.y; - light.position.z = gameLibLight.position.z; - - light.rotation.x = gameLibLight.rotation.x; - light.rotation.y = gameLibLight.rotation.y; - light.rotation.z = gameLibLight.rotation.z; - - if (light == null) { - console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported'); - } else { - light.name = gameLibLight.name; - instanceLights.push(light); - } - } - - var instanceScene = new graphics.instance.Scene(); - - instanceScene.name = gameLibScene.name; - - instanceScene.position.x = gameLibScene.position.x; - instanceScene.position.y = gameLibScene.position.y; - instanceScene.position.z = gameLibScene.position.z; - - instanceScene.rotation.x = gameLibScene.rotation.x; - instanceScene.rotation.y = gameLibScene.rotation.y; - instanceScene.rotation.z = gameLibScene.rotation.z; - - instanceScene.scale.x = gameLibScene.scale.x; - instanceScene.scale.y = gameLibScene.scale.y; - instanceScene.scale.z = gameLibScene.scale.z; - - instanceScene.quaternion.x = gameLibScene.quaternion.x; - instanceScene.quaternion.y = gameLibScene.quaternion.y; - instanceScene.quaternion.z = gameLibScene.quaternion.z; - instanceScene.quaternion.w = gameLibScene.quaternion.w; - - for (var m = 0; m < instanceMeshes.length; m++) { - instanceScene.add(instanceMeshes[m]); - } - - for (var l = 0; l < instanceLights.length; l++) { - instanceScene.add(instanceLights[l]); - } - - onLoaded( - gameLibScene, - { - scene: instanceScene, - lights: instanceLights, - meshes: instanceMeshes - } - ); - } - }).catch( - function(error){ - console.log(error); - } - ); -}; -/** - * Physics Shape Superset - * @param engine GameLib.D3.Engine - * @param shapeType - * @param scale GameLib.D3.Vector3 - * @param vertices Number[] - * @param indices Number[] - * @param radius Number - * @param halfExtensions GameLib.D3.Vector3 - * @param radiusTop Number - * @param radiusBottom Number - * @param height Number - * @param numSegments Number - * @param heightmap GameLib.D3.Heightmap - * @param elementSize - * @constructor - */ -GameLib.D3.Shape = function( - engine, - shapeType, - scale, - vertices, - indices, - radius, - halfExtensions, - radiusTop, - radiusBottom, - height, - numSegments, - heightmap -) { - this.engine = engine; - - this.engine.isNotCannonThrow(); - - this.shapeType = shapeType; - - this.instance = this.createInstance(); - - if (typeof scale == 'undefined') { - scale = new GameLib.D3.Vector3(1, 1, 1) - } - this.scale = scale; - - if (typeof vertices == 'undefined') { - vertices = []; - } - this.vertices = vertices; - - if (typeof indices == 'undefined') { - indices = []; - } - this.indices = indices; - - if (typeof radius == 'undefined') { - radius = 1; - } - this.radius = radius; - - if (typeof halfExtensions == 'undefined') { - halfExtensions = new GameLib.D3.Vector3(1,1,1); - } - this.halfExtensions = halfExtensions; - - if (typeof radiusTop == 'undefined') { - radiusTop = 1; - } - this.radiusTop = radiusTop; - - if (typeof radiusBottom == 'undefined') { - radiusBottom = 1; - } - this.radiusBottom = radiusBottom; - - if (typeof height == 'undefined') { - height = 1; - } - this.height = height; - - if (typeof numSegments == 'undefined') { - numSegments = 1; - } - this.numSegments = numSegments; - - if (typeof heightmap == 'undefined') { - heightmap = new GameLib.D3.Heightmap(); - } - this.heightmap = heightmap; - -}; - -/** - * Shape constants - * @type {number} - */ -GameLib.D3.Shape.SHAPE_TYPE_SPHERE = 1; -GameLib.D3.Shape.SHAPE_TYPE_BOX = 2; -GameLib.D3.Shape.SHAPE_TYPE_TRIMESH = 3; -GameLib.D3.Shape.SHAPE_TYPE_CYLINDER = 4; -GameLib.D3.Shape.SHAPE_TYPE_HEIGHT_MAP = 5; -GameLib.D3.Shape.SHAPE_TYPE_CONVEX_HULL = 6; - -/** - * - */ -GameLib.D3.Shape.prototype.createInstance = function() { - - var instance = null; - - if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_TRIMESH) { - instance = new this.engine.instance.Trimesh( - this.vertices, - this.indices - ); - } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_SPHERE) { - instance = new this.engine.instance.Sphere( - this.radius - ); - } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_BOX) { - instance = new this.engine.instance.Box( - new this.engine.instance.Vec3( - this.halfExtensions.x, - this.halfExtensions.y, - this.halfExtensions.z - ) - ); - } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_CYLINDER) { - instance = new this.engine.instance.Cylinder( - this.radiusTop, - this.radiusBottom, - this.height, - this.numSegments - ); - } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_HEIGHT_MAP) { - instance = new this.engine.instance.Heightfield( - this.heightmap.matrix, - { - elementSize: this.heightmap.elementSize - } - ); - } else if (this.shapeType == GameLib.D3.Shape.SHAPE_TYPE_CONVEX_HULL) { - console.warn('Shape type not implemented: ' + this.shapeType); - throw new Error('Shape type not implemented: ' + this.shapeType); - } else { - console.warn('Shape type not implemented: ' + this.shapeType); - throw new Error('Shape type not implemented: ' + this.shapeType); - } - - this.instance = instance; - - return instance; -}; - - -/** - * update - */ -GameLib.D3.Shape.prototype.update = function( - engine -) { - engine.isNotCannonThrow(); - - if(this.shapeType === GameLib.D3.Shape.SHAPE_TYPE_TRIMESH) { - this.instance.setScale( - new engine.instance.Vec3( - this.scale.x, - this.scale.y, - this.scale.z - ) - ); - this.instance.updateAABB(); - this.instance.updateNormals(); - this.instance.updateEdges(); - this.instance.updateBoundingSphereRadius(); - this.instance.updateTree(); - } -}; - -/** - * Skeleton Superset - * @param id - * @param bones GameLib.D3.Bone - * @param boneInverses - * @param useVertexTexture - * @param boneTextureWidth - * @param boneTextureHeight - * @param boneMatrices - * @param boneTexture - * @constructor - */ -GameLib.D3.Skeleton = function( - id, - bones, - boneInverses, - useVertexTexture, - boneTextureWidth, - boneTextureHeight, - boneMatrices, - boneTexture -) { - this.id = id; - - this.bones = bones; - - /** - * An array of Matrix4s that represent the inverse of the matrixWorld of the individual bones. - * @type GameLib.D3.Matrix4[] - */ - if (typeof boneInverses == 'undefined') { - boneInverses = []; - } - this.boneInverses = boneInverses; - - /** - * Use a vertex texture in the shader - allows for more than 4 bones per vertex, not supported by all devices - * @type {boolean} - */ - if (typeof useVertexTexture == 'undefined') { - useVertexTexture = false; - } - this.useVertexTexture = useVertexTexture; - - if (this.useVertexTexture == true) { - console.warn('support for vertex texture bones is not supported yet - something could break somewhere'); - } - - if (typeof boneTextureWidth == 'undefined') { - boneTextureWidth = 0; - } - this.boneTextureWidth = boneTextureWidth; - - if (typeof boneTextureHeight == 'undefined') { - boneTextureHeight = 0; - } - this.boneTextureHeight = boneTextureHeight; - - if (typeof boneMatrices == 'undefined') { - boneMatrices = []; - } - this.boneMatrices = boneMatrices; - - if (typeof boneTexture == 'undefined') { - boneTexture = []; - } - this.boneTexture = boneTexture; -}; - - -GameLib.D3.SkyBox = function ( - graphics -) { - this.id = null; - - this.graphics = graphics; - this.graphics.isNotThreeThrow(); - - this.texturesFolder = null; -}; - -GameLib.D3.SkyBox.prototype.load = function ( - texturesFolder -) { - this.texturesFolder = texturesFolder; - this.textures = []; - this.materials = []; - this.mesh = {}; - this.scene = new this.graphics.instance.Scene(); - this.textureCube = null; - - var textureLoader = new this.graphics.instance.TextureLoader(); - - // this textures are used to display the skybox - this.textures.push(textureLoader.load(this.texturesFolder + "px.png")); - this.textures.push(textureLoader.load(this.texturesFolder + "nx.png")); - this.textures.push(textureLoader.load(this.texturesFolder + "py.png")); - this.textures.push(textureLoader.load(this.texturesFolder + "ny.png")); - this.textures.push(textureLoader.load(this.texturesFolder + "pz.png")); - this.textures.push(textureLoader.load(this.texturesFolder + "nz.png")); - - // assign textures to each cube face - for (var i = 0; i < 6; i ++) { - this.materials.push(new this.graphics.instance.MeshBasicMaterial({ map: this.textures[i] })); - } - - // create cube geometry - this.mesh = new this.graphics.instance.Mesh(new this.graphics.instance.CubeGeometry(1, 1, 1), new this.graphics.instance.MeshFaceMaterial(this.materials)); - this.mesh.applyMatrix(new this.graphics.instance.Matrix4().makeScale(1, 1, -1)); - this.scene.add(this.mesh); - - // Load env textureCube - // this is used for reflections on meshes - // mesh.material.envMap = this.textureCube; - this.textureCube = new this.graphics.instance.CubeTextureLoader().load([ - this.texturesFolder + "px.png", this.texturesFolder + "nx.png", - this.texturesFolder + "py.png", this.texturesFolder + "ny.png", - this.texturesFolder + "pz.png", this.texturesFolder + "nz.png" - ]); -}; - -GameLib.D3.SkyBox.prototype.render = function ( - threeRenderer, - threeCamera -) { - var cameraPosition = new this.graphics.instance.Vector3(threeCamera.position.x, threeCamera.position.y, threeCamera.position.z); - - threeCamera.position.set(0, 0, 0); - - var gl = threeRenderer.context; - - gl.disable(gl.DEPTH_TEST); - - threeRenderer.render(this.scene, threeCamera); - - gl.enable(gl.DEPTH_TEST); - - threeCamera.position.copy(cameraPosition); -}; - -/** - * Physics Solver Superset - * @param id - * @param engine GameLib.D3.Engine - * @param solverType - * @param name - * @param iterations - * @param tolerance - * @constructor - */ -GameLib.D3.Solver = function( - id, - engine, - solverType, - name, - iterations, - tolerance -) { - this.id = id; - - this.engine = engine; - this.engine.isNotCannonThrow(); - - if (typeof solverType == 'undefined') { - solverType = GameLib.D3.Solver.GS_SOLVER; - } - this.solverType = solverType; - - if (typeof name == 'undefined') { - if (this.solverType == GameLib.D3.Solver.SPLIT_SOLVER) { - name = 'split solver'; - } else if (this.solverType == GameLib.D3.Solver.GS_SOLVER) { - name = 'gs solver'; - } else { - name = 'unknown solver'; - } - } - this.name = name; - - if (typeof iterations == 'undefined') { - iterations = 10; - } - this.iterations = iterations; - - if (typeof tolerance == 'undefined') { - tolerance = 1e-7; - } - this.tolerance = tolerance; - - this.instance = this.createInstance(); - - this.instance.tolerance = tolerance; - this.instance.iterations = iterations; -}; - -/** - * Creates a custom solver instance - * @returns {*} - */ -GameLib.D3.Solver.prototype.createInstance = function(){ - - var instance = null; - - if (this.solverType == GameLib.D3.Solver.SPLIT_SOLVER) { - instance = new this.engine.instance.SplitSolver(); - } else if (this.solverType == GameLib.D3.Solver.GS_SOLVER) { - instance = new this.engine.instance.GSSolver(); - } else { - console.warn('Unsupported solver type: ' + this.solverType); - throw new Error('Unsupported solver type: ' + this.solverType); - } - - return instance; -}; - -/** - * Solver Types - * @type {number} - */ -GameLib.D3.Solver.SPLIT_SOLVER = 0x1; -GameLib.D3.Solver.GS_SOLVER = 0x2; - -/** - * Texture Superset - * @param id - * @param name - * @param image - * @param wrapS - * @param wrapT - * @param repeat - * @param data - * @param format - * @param mapping - * @param magFilter - * @param minFilter - * @param textureType - * @param anisotropy - * @param offset - * @param generateMipmaps - * @param flipY - * @param mipmaps - * @param unpackAlignment - * @param premultiplyAlpha - * @param encoding - * @constructor - */ -GameLib.D3.Texture = function( - id, - name, - image, - wrapS, - wrapT, - repeat, - data, - format, - mapping, - magFilter, - minFilter, - textureType, - anisotropy, - offset, - generateMipmaps, - flipY, - mipmaps, - unpackAlignment, - premultiplyAlpha, - encoding -) { - this.id = id; - this.name = name; - this.image = image; - - if (typeof wrapS == 'undefined') { - wrapS = GameLib.D3.Texture.TYPE_REPEAT_WRAPPING; - } - this.wrapS = wrapS; - - if (typeof wrapT == 'undefined') { - wrapT = GameLib.D3.Texture.TYPE_REPEAT_WRAPPING; - } - this.wrapT = wrapT; - - if (typeof repeat == 'undefined') { - repeat = new GameLib.D3.Vector2(1, 1); - } - this.repeat = repeat; - - if (typeof data == 'undefined') { - data = null; - } - this.data = data; - - if (typeof format == 'undefined') { - format = GameLib.D3.Texture.TYPE_RGBA_FORMAT; - } - this.format = format; - - if (typeof mapping == 'undefined') { - mapping = GameLib.D3.Texture.TYPE_UV_MAPPING; - } - this.mapping = mapping; - - if (typeof magFilter == 'undefined') { - magFilter = GameLib.D3.Texture.TYPE_LINEAR_FILTER; - } - this.magFilter = magFilter; - - if (typeof minFilter == 'undefined') { - minFilter = GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_LINEAR_FILTER; - } - this.minFilter = minFilter; - - if (typeof textureType == 'undefined') { - textureType = GameLib.D3.Texture.TYPE_UNSIGNED_BYTE; - } - this.textureType = textureType; - - if (typeof anisotropy == 'undefined') { - anisotropy = 1; - } - this.anisotropy = anisotropy; - - if (typeof offset == 'undefined') { - offset = new GameLib.D3.Vector2(0, 0); - } - this.offset = offset; - - if (typeof generateMipmaps == 'undefined') { - generateMipmaps = true; - } - this.generateMipmaps = generateMipmaps; - - if (typeof flipY == 'undefined') { - flipY = true; - } - this.flipY = flipY; - - if (typeof mipmaps == 'undefined') { - mipmaps = []; - } - this.mipmaps = mipmaps; - - if (typeof unpackAlignment == 'undefined') { - unpackAlignment = 4; - } - this.unpackAlignment = unpackAlignment; - - if (typeof premultiplyAlpha == 'undefined') { - premultiplyAlpha = false; - } - this.premultiplyAlpha = premultiplyAlpha; - - if (typeof encoding == 'undefined') { - encoding = GameLib.D3.Texture.TYPE_LINEAR_ENCODING; - } - this.encoding = encoding; -}; - -/** - * Texture Formats - * @type {number} - */ -GameLib.D3.Texture.TYPE_ALPHA_FORMAT = 1019; -GameLib.D3.Texture.TYPE_RGB_FORMAT = 1020; -GameLib.D3.Texture.TYPE_RGBA_FORMAT = 1021; -GameLib.D3.Texture.TYPE_LUMINANCE_FORMAT = 1022; -GameLib.D3.Texture.TYPE_LUMINANCE_ALPHA_FORMAT = 1023; -GameLib.D3.Texture.TYPE_DEPTH_FORMAT = 1026; - -/** - * Mapping modes - * @type {number} - */ -GameLib.D3.Texture.TYPE_UV_MAPPING = 300; -GameLib.D3.Texture.TYPE_CUBE_REFLECTION_MAPPING = 301; -GameLib.D3.Texture.TYPE_CUBE_REFRACTION_MAPPING = 302; -GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFLECTION_MAPPING = 303; -GameLib.D3.Texture.TYPE_EQUI_RECTANGULAR_REFRACTION_MAPPING = 304; -GameLib.D3.Texture.TYPE_SPHERICAL_REFLECTION_MAPPING = 305; -GameLib.D3.Texture.TYPE_CUBE_UV_REFLECTION_MAPPING = 306; -GameLib.D3.Texture.TYPE_CUBE_UV_REFRACTION_MAPPING = 307; - -/** - * Wrapping Modes - * @type {number} - */ -GameLib.D3.Texture.TYPE_REPEAT_WRAPPING = 1000; -GameLib.D3.Texture.TYPE_CLAMP_TO_EDGE_WRAPPING = 1001; -GameLib.D3.Texture.TYPE_MIRRORED_REPEAT_WRAPPING = 1002; - -/** - * Mipmap Filters - * @type {number} - */ -GameLib.D3.Texture.TYPE_NEAREST_FILTER = 1003; -GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_NEAREST_FILTER = 1004; -GameLib.D3.Texture.TYPE_NEAREST_MIPMAP_LINEAR_FILTER = 1005; -GameLib.D3.Texture.TYPE_LINEAR_FILTER = 1006; -GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_NEAREST_FILTER = 1007; -GameLib.D3.Texture.TYPE_LINEAR_MIPMAP_LINEAR_FILTER = 1008; - -/** - * Texture Data Types - * @type {number} - */ -GameLib.D3.Texture.TYPE_UNSIGNED_BYTE = 1009; -GameLib.D3.Texture.TYPE_BYTE = 1010; -GameLib.D3.Texture.TYPE_SHORT = 1011; -GameLib.D3.Texture.TYPE_UNSIGNED_SHORT = 1012; -GameLib.D3.Texture.TYPE_INT = 1013; -GameLib.D3.Texture.TYPE_UNSIGNED_INT = 1014; -GameLib.D3.Texture.TYPE_FLOAT = 1015; -GameLib.D3.Texture.TYPE_HALF_FLOAT = 1025; - -/** - * Encoding Modes - * @type {number} - */ -GameLib.D3.Texture.TYPE_LINEAR_ENCODING = 3000; // NO ENCODING AT ALL. -GameLib.D3.Texture.TYPE_SRGB_ENCODING = 3001; -GameLib.D3.Texture.TYPE_GAMMA_ENCODING = 3007; // USES GAMMA_FACTOR, FOR BACKWARDS COMPATIBILITY WITH WEBGLRENDERER.GAMMAINPUT/GAMMAOUTPUT -GameLib.D3.Texture.TYPE_RGBE_ENCODING = 3002; // AKA RADIANCE. -GameLib.D3.Texture.TYPE_LOG_LUV_ENCODING = 3003; -GameLib.D3.Texture.TYPE_RGBM7_ENCODING = 3004; -GameLib.D3.Texture.TYPE_RGBM16_ENCODING = 3005; -GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256. - -/** - * Defers loading of an image and resolves once image is loaded - * @param gameLibTexture GameLib.D3.Texture - * @param instanceMaterial - * @param instanceMaterialMapType - * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback - * @returns {Promise} - */ -GameLib.D3.Texture.loadMap = function( - gameLibTexture, - instanceMaterial, - instanceMaterialMapType, - graphics, - uploadUrl, - progressCallback -) { - - var defer = Q.defer(); - - var imagePath = null; - - var textureLoader = new graphics.instance.TextureLoader(); - - if (gameLibTexture && gameLibTexture.image && gameLibTexture.image.filename) { - /** - * Else, load from upload source - */ - imagePath = uploadUrl + '/' + gameLibTexture.image.filename; - } - - if (imagePath) { - - textureLoader.crossOrigin = ''; - - textureLoader.load( - imagePath, - function(texture) { - /** - * onLoad - */ - instanceMaterial[instanceMaterialMapType] = texture; - instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; - instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; - instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; - instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; - /** - * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes - */ - instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; - instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; - instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; - instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; - instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; - instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( - gameLibTexture.offset.x, - gameLibTexture.offset.y - ); - instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; - instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; - instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; - instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; - instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; - instanceMaterial.needsUpdate = true; - defer.resolve(true); - }, - function(xhr) { - /** - * onProgress - */ - if (progressCallback) { - progressCallback(Math.round(xhr.loaded / xhr.total * 100)); - } - }, - function(error) { - /** - * onError - */ - console.log("an error occurred while trying to load the image : " + imagePath); - defer.resolve(null); - } - ); - - } else { - defer.resolve(null); - } - - return defer.promise; -}; - - -/** - * Returns an array of image loading Promises - * @param gameLibMaterial - * @param blenderMaps - * @param instanceMaterial - * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback - * @returns Q[] - */ -GameLib.D3.Texture.loadMaps = function( - gameLibMaterial, - blenderMaps, - instanceMaterial, - graphics, - uploadUrl, - progressCallback -) { - - var textureMaps = []; - - for (var ti = 0; ti < blenderMaps.length; ti++) { - - var map = blenderMaps[ti]; - - if (gameLibMaterial.maps.hasOwnProperty(map)) { - - var blenderTexture = gameLibMaterial.maps[map]; - - if ( - blenderTexture && - blenderTexture.image && - blenderTexture.image.filename - ) { - - var instanceMap = null; - - if (map == 'alpha') { - instanceMap = 'alhpaMap'; - } - - if (map == 'ao') { - instanceMap = 'aoMap'; - } - - if (map == 'bump') { - instanceMap = 'bumpMap'; - } - - if (map == 'displacement') { - instanceMap = 'displacementMap'; - } - - if (map == 'emissive') { - instanceMap = 'emissiveMap'; - } - - if (map == 'environment') { - instanceMap = 'envMap'; - } - - if (map == 'light') { - instanceMap = 'lightMap'; - } - - if (map == 'specular') { - instanceMap = 'specularMap'; - } - - if (map == 'diffuse') { - instanceMap = 'map'; - } - - if (map == 'roughness') { - instanceMap = 'roughnessMap'; - } - - if (map == 'metalness') { - instanceMap = 'metalnessMap'; - } - - if (instanceMap == null) { - console.warn("unsupported map type : " + map); - } - - textureMaps.push( - GameLib.D3.Texture.loadMap( - gameLibMaterial.maps[map], - instanceMaterial, - instanceMap, - graphics, - uploadUrl, - progressCallback - ) - ); - } - } - } - - return textureMaps; -}; - -GameLib.D3.Tools = function(){}; - -/** - * Generates a random ID - * @returns {string} - * @constructor - */ -GameLib.D3.Tools.RandomId = function() { - return Math.random().toString(36).substr(2, 10); -}; -/** - * TriangleEdge - * @param triangle - * @param edge - * @constructor - */ -GameLib.D3.TriangleEdge = function( - triangle, - edge -) { - this.triangle = triangle; - this.edge = edge; -}; -/** - * TriangleFace - * @param v0 - * @param v1 - * @param v2 - * @param materialIndex - * @param v0uv - * @param v1uv - * @param v2uv - * @param color - * @param vertexColors - * @param vertexNormals - * @param normal - * @constructor - */ -GameLib.D3.TriangleFace = function( - v0, - v1, - v2, - materialIndex, - v0uv, - v1uv, - v2uv, - color, - vertexColors, - vertexNormals, - normal -) { - this.v0 = v0; - this.v1 = v1; - this.v2 = v2; - this.materialIndex = materialIndex; - this.v0uv = v0uv; - this.v1uv = v1uv; - this.v2uv = v2uv; - if (!color) { - color = new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff); - } - this.color = color; - - if (!vertexColors) { - vertexColors = [ - new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff), - new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff), - new GameLib.D3.Color(0xff, 0xff, 0xff, 0xff) - ]; - } - this.vertexColors = vertexColors; - - if (!vertexNormals) { - vertexNormals = [ - new GameLib.D3.Vector3(), - new GameLib.D3.Vector3(), - new GameLib.D3.Vector3() - ] - } - this.vertexNormals = vertexNormals; - - if (!normal) { - normal = new GameLib.D3.Vector3(0); - } - - this.normal = normal; -}; - -/** - * Clone a TriangleFace - * @returns {GameLib.D3.TriangleFace} - */ -GameLib.D3.TriangleFace.prototype.clone = function(){ - return new GameLib.D3.TriangleFace( - this.v0, - this.v1, - this.v2, - this.materialIndex, - this.v0uv.copy(), - this.v1uv.copy(), - this.v2uv.copy() - ); -}; - -/** - * Returns true if two triangles are equal (their vertex indices match in some order) - * @param triangle - * @returns {boolean} - */ -GameLib.D3.TriangleFace.prototype.equals = function(triangle) { - return !!( - ( - (this.v0 == triangle.v0) && - (this.v1 == triangle.v1) && - (this.v2 == triangle.v2) - ) - || - ( - (this.v0 == triangle.v0) && - (this.v1 == triangle.v2) && - (this.v2 == triangle.v1) - ) - || - ( - (this.v0 == triangle.v1) && - (this.v1 == triangle.v0) && - (this.v2 == triangle.v2) - ) - || - ( - (this.v0 == triangle.v1) && - (this.v1 == triangle.v2) && - (this.v2 == triangle.v0) - ) - || - ( - (this.v0 == triangle.v2) && - (this.v1 == triangle.v0) && - (this.v2 == triangle.v1) - ) - || - ( - (this.v0 == triangle.v2) && - (this.v1 == triangle.v1) && - (this.v2 == triangle.v0) - )); -}; - - -GameLib.D3.Vector2 = function(x, y) { - - this.x = 0; - this.y = 0; - - if (x) { - this.x = x; - } - - if (y) { - this.y = y; - } -}; - -GameLib.D3.Vector2.prototype.copy = function() { - return new GameLib.D3.Vector2( - this.x, - this.y - ); -}; - -GameLib.D3.Vector2.prototype.equals = function(v) { - return !!(((this.x == v.x) && - (this.y == v.y)) || - ((this.y == v.x) && - (this.x == v.y))); -}; - -GameLib.D3.Vector3 = function(x, y, z) { - - this.x = 0; - this.y = 0; - this.z = 0; - - if (x) { - this.x = x; - } - - if (y) { - this.y = y; - } - - if (z) { - this.z = z; - } -}; - -GameLib.D3.Vector3.prototype.subtract = function (v) { - - if (v instanceof GameLib.D3.Vector3) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - } - - if (v instanceof GameLib.D3.Vector4) { - console.warn("trying to subtract vector of bigger length (4 vs 3))"); - } - - return this; -}; - -GameLib.D3.Vector3.prototype.cross = function (v) { - return new GameLib.D3.Vector3( - this.y * v.z - this.z * v.y, - this.z * v.x - this.x * v.z, - this.x * v.y - this.y * v.x - ); -}; - -GameLib.D3.Vector3.prototype.negative = function () { - this.x *= -1; - this.y *= -1; - this.z *= -1; - return this; -}; - -GameLib.D3.Vector3.clockwise = function (u, v, w, viewPoint) { - - var normal = GameLib.D3.Vector3.normal(u, v, w); - - var uv = u.copy(); - - var winding = normal.dot(uv.subtract(viewPoint)); - - return (winding > 0); -}; - -GameLib.D3.Vector3.normal = function (u, v, w) { - var vv = v.copy(); - var wv = w.copy(); - return vv.subtract(u).cross(wv.subtract(u)); -}; - -GameLib.D3.Vector3.prototype.lookAt = function (at, up) { - - var lookAtMatrix = GameLib.D3.Matrix4.lookAt(this, at, up); - - this.multiply(lookAtMatrix); -}; - -GameLib.D3.Vector3.prototype.translate = function (v) { - this.x += v.x; - this.y += v.y; - this.z += v.z; - return this; -}; - -GameLib.D3.Vector3.prototype.squared = function () { - return this.x * this.x + this.y * this.y + this.z * this.z; -}; - -GameLib.D3.Vector3.prototype.copy = function () { - return new GameLib.D3.Vector3( - this.x, - this.y, - this.z - ); -}; - -GameLib.D3.Vector3.prototype.multiply = function (s) { - if (s instanceof GameLib.D3.Vector3) { - this.x *= s.x; - this.y *= s.y; - this.z *= s.z; - } else if (s instanceof GameLib.D3.Matrix4) { - var x = s.rows[0].x * this.x + s.rows[0].y * this.y + s.rows[0].z * this.z; - var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z; - var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z; - this.x = x; - this.y = y; - this.z = z; - } else { - console.log("functionality not implemented - please do this"); - throw new Error("not implemented"); - } - return this; -}; - - -GameLib.D3.Vector3.prototype.dot = function (v) { - return (this.x * v.x) + (this.y * v.y) + (this.z * v.z); -}; - -GameLib.D3.Vector3.prototype.normalize = function () { - - var EPSILON = 0.000001; - - var v2 = this.squared(); - - if (v2 < EPSILON) { - return this; //do nothing for zero vector - } - - var invLength = 1 / Math.sqrt(v2); - - this.x *= invLength; - this.y *= invLength; - this.z *= invLength; - - return this; -}; - -GameLib.D3.Vector4 = function(x, y, z, w) { - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 0; - - if (x) { - this.x = x; - } - - if (y) { - this.y = y; - } - - if (z) { - this.z = z; - } - - if (w) { - this.w = w; - } -}; - -GameLib.D3.Vector4.prototype.translate = function (v) { - this.x += v.x; - this.y += v.y; - this.z += v.z; - return this; -}; - -GameLib.D3.Vector4.prototype.copy = function () { - return new GameLib.D3.Vector4( - this.x, - this.y, - this.z, - this.w - ); -}; - -GameLib.D3.Vector4.prototype.multiply = function (s) { - if (s instanceof GameLib.D3.Vector3) { - this.x *= s.x; - this.y *= s.y; - this.z *= s.z; - } else if (s instanceof GameLib.D3.Matrix4) { - var x = s.rows[0].x * this.x + s.rows[0].y * this.y + s.rows[0].z * this.z + s.rows[0].w * this.w; - var y = s.rows[1].x * this.x + s.rows[1].y * this.y + s.rows[1].z * this.z + s.rows[1].w * this.w; - var z = s.rows[2].x * this.x + s.rows[2].y * this.y + s.rows[2].z * this.z + s.rows[2].w * this.w; - var w = s.rows[3].x * this.x + s.rows[3].y * this.y + s.rows[3].z * this.z + s.rows[3].w * this.w; - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } else { - console.log("functionality not implemented - please do this"); - throw new Error("not implemented"); - } -}; - - -GameLib.D3.Vector4.prototype.normalize = function () { - - // note - leave w untouched - var EPSILON = 0.000001; - - var v2 = this.x * this.x + this.y * this.y + this.z * this.z; - - if (v2 < EPSILON) { - return this; //do nothing for zero vector - } - - var invLength = 1 / Math.sqrt(v2); - - this.x *= invLength; - this.y *= invLength; - this.z *= invLength; - - return this; -}; - -GameLib.D3.Vector4.prototype.subtract = function (v) { - - if (v instanceof GameLib.D3.Vector3) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - } - - if (v instanceof GameLib.D3.Vector4) { - this.x -= v.x; - this.y -= v.y; - this.z -= v.z; - this.w -= v.w; - } - - return this; -}; - -GameLib.D3.Vector4.Points = function () { - this.vectors = []; -}; - -GameLib.D3.Vector4.Points.prototype.add = function (vector) { - - if (vector instanceof GameLib.D3.Vector3) { - vector = new GameLib.D3.Vector4( - vector.x, - vector.y, - vector.z, - 1 - ) - } - - if (!vector instanceof GameLib.D3.Vector4) { - console.warn("Vector needs to be of type Vector4"); - throw new Error("Vector needs to be of type Vector4"); - } - - this.vectors.push(vector); - - return this; -}; - -GameLib.D3.Vector4.Points.prototype.copy = function () { - - var vectors = []; - - for (var i = 0; i < this.vectors.length; i++) { - vectors.push(this.vectors[i].copy()); - } - - return vectors; -}; - -GameLib.D3.Vector4.Points.prototype.maximizeXDistance = function (grain) { - -// console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2)); - - var multiplier = 0; - - var rotationMatrixY = new GameLib.D3.Matrix4().rotationMatrixY(grain); - - var totalRadians = 0; - - var backupVectors = this.copy(); - - var maxXDistance = 0; - - for (var i = 0; i < Math.PI * 2; i += grain) { - - multiplier++; - - for (var j = 0; j < this.vectors.length; j++) { - this.vectors[j] = rotationMatrixY.multiply(this.vectors[j]); - } - - var distances = this.distances(); - - if (distances.x > maxXDistance) { - - maxXDistance = distances.x; - totalRadians = multiplier * grain; - } - } - - this.vectors = backupVectors; - -// console.log("distance: " + maxXDistance + " radians : " + totalRadians); - - var maxRotationMatrix = new GameLib.D3.Matrix4().rotationMatrixY(totalRadians); - - for (var k = 0; k < this.vectors.length; k++) { - this.vectors[k] = maxRotationMatrix.multiply(this.vectors[k]); - } - -// console.log("vectors (after): " + JSON.stringify(this.vectors, null, 2)); - -}; - -GameLib.D3.Vector4.Points.prototype.maximizeYDistance = function (grain) { - -// console.log("vectors (before): " + JSON.stringify(this.vectors, null, 2)); - - var multiplier = 0; - - var rotationMatrixX = new GameLib.D3.Matrix4().rotationMatrixX(grain); - - var totalRadians = 0; - - var backupVectors = this.copy(); - - var maxYDistance = 0; - - for (var i = 0; i < Math.PI * 2; i += grain) { - - multiplier++; - - for (var j = 0; j < this.vectors.length; j++) { - this.vectors[j] = rotationMatrixX.multiply(this.vectors[j]); - } - - var distances = this.distances(); - - if (distances.y > maxYDistance) { - maxYDistance = distances.y; - totalRadians = multiplier * grain; - } - } - - this.vectors = backupVectors; - -// console.log("distance: " + maxYDistance + " radians : " + totalRadians); - - var maxRotationMatrix = new GameLib.D3.Matrix4().rotationMatrixX(totalRadians); - - for (var k = 0; k < this.vectors.length; k++) { - this.vectors[k] = maxRotationMatrix.multiply(this.vectors[k]); - } - -// console.log("vectors (after): " + JSON.stringify(this.vectors, null, 2)); - -}; - - -GameLib.D3.Vector4.Points.prototype.lookAt = function (at, up) { - - var polyCenter = this.average(); - - console.log("poly center : " + JSON.stringify(polyCenter)); - - var lookAtMatrix = new GameLib.D3.Matrix4().lookAt(polyCenter, at, up); - - lookAtMatrix.rows[0] = new GameLib.D3.Vector4(1, 0, 0, 0); - lookAtMatrix.rows[1] = new GameLib.D3.Vector4(0, 0, 1, 0); - lookAtMatrix.rows[2] = new GameLib.D3.Vector4(0, 1, 0, 0); - - console.log("look at matrix : " + JSON.stringify(lookAtMatrix, null, 2)); - - for (var i = 0; i < this.vectors.length; i++) { - console.log("vector " + i + " (before): " + JSON.stringify(this.vectors[i])); - this.vectors[i] = lookAtMatrix.multiply(this.vectors[i]); - console.log("vector " + i + " (after) : " + JSON.stringify(this.vectors[i])); - } -}; - -GameLib.D3.Vector4.Points.prototype.distances = function () { - - var minX = this.vectors[0].x; - var minY = this.vectors[0].y; - var minZ = this.vectors[0].z; - - var maxX = this.vectors[0].x; - var maxY = this.vectors[0].y; - var maxZ = this.vectors[0].z; - - for (var i = 0; i < this.vectors.length; i++) { - if (this.vectors[i].x < minX) { - minX = this.vectors[i].x; - } - if (this.vectors[i].y < minY) { - minY = this.vectors[i].y; - } - if (this.vectors[i].z < minZ) { - minZ = this.vectors[i].z; - } - - if (this.vectors[i].x > maxX) { - maxX = this.vectors[i].x; - } - if (this.vectors[i].y > maxY) { - maxY = this.vectors[i].y; - } - if (this.vectors[i].z > maxZ) { - maxZ = this.vectors[i].z; - } - } - - return new GameLib.D3.Vector3( - Math.abs(maxX - minX), - Math.abs(maxY - minY), - Math.abs(maxY - minZ) - ) -}; - -GameLib.D3.Vector4.Points.prototype.average = function () { - var averageX = 0; - var averageY = 0; - var averageZ = 0; - - for (var i = 0; i < this.vectors.length; i++) { - averageX += this.vectors[i].x; - averageY += this.vectors[i].y; - averageZ += this.vectors[i].z; - } - - return new GameLib.D3.Vector3( - averageX / this.vectors.length, - averageY / this.vectors.length, - averageZ / this.vectors.length - ); -}; - -GameLib.D3.Vector4.Points.prototype.negative = function () { - - for (var i = 0; i < this.vectors.length; i++) { - this.vectors[i].x *= -1; - this.vectors[i].y *= -1; - this.vectors[i].z *= -1; - } - - return this; -}; - - -GameLib.D3.Vector4.Points.prototype.toOrigin = function () { - - var distanceFromOrigin = this.average().negative(); - - for (var i = 0; i < this.vectors.length; i++) { - this.vectors[i].translate(distanceFromOrigin); - } -}; - -/** - * The normal gets assigned when the face calculates its normal - * @param position - * @param boneWeights GameLib.D3.BoneWeight[] - * @constructor - */ -GameLib.D3.Vertex = function( - position, - boneWeights -) { - this.position = position; - this.boneWeights = boneWeights; -}; -/** - * World SuperSet - contains the custom world instance - * @param id - * @param name - * @param engine - * @param gravity - * @param broadphase - * @param solver - * @param rigidBodies - * @constructor - */ -GameLib.D3.World = function( - id, - name, - engine, - gravity, - broadphase, - solver, - rigidBodies -) { - - this.id = id; - - this.name = name; - - if (typeof gravity == 'undefined') { - gravity = new GameLib.D3.Vector3(0, -9.81, 0); - } - this.gravity = gravity; - - if (typeof broadphase == 'undefined') { - broadphase = new GameLib.D3.Broadphase( - null, - 'broadPhaseNaive', - GameLib.D3.Broadphase.BROADPHASE_TYPE_NAIVE, - engine - ); - } - this.broadphase = broadphase; - - if (typeof solver == 'undefined') { - solver = new GameLib.D3.Solver( - null, - 'GSSolver', - GameLib.D3.Solver.GS_SOLVER - ); - } - this.solver = solver; - - if (typeof rigidBodies == 'undefined') { - rigidBodies = []; - } - this.rigidBodies = rigidBodies; - - this.engine = engine; - - this.engine.isNotCannonThrow(); - - this.instance = this.createInstance(); -}; - -/** - * private - * @returns {GameLib.D3.World|GameLib.D3.Physics.World|*} - */ -GameLib.D3.World.prototype.createInstance = function() { - - var instance = new this.engine.instance.World(); - - instance.broadphase = this.broadphase.instance; - - instance.solver = this.solver.instance; - - instance.gravity.x = this.gravity.x; - instance.gravity.y = this.gravity.y; - instance.gravity.z = this.gravity.z; - - instance.name = this.name; - - return instance; -}; - -/** - * - * @param rigidBody GameLib.D3.RigidBody - * @constructor - */ -GameLib.D3.World.prototype.addRigidBody = function( - rigidBody -) { - this.instance.addBody(rigidBody.instance); -}; - -/** - * - * @param vehicle (GameLib.D3.RigidBodyVehicle | GameLib.D3.RaycastVehicle) - * @constructor - */ -GameLib.D3.World.prototype.addVehicle = function( - vehicle -) { - vehicle.instance.addToWorld(this.instance); -}; - -GameLib.D3.World.prototype.step = function( - timeStep -) { - // todo: figure out, why this call to internal step is more stable for trimesh collisions..... - //this.worldObject.internalStep(timeStep); - //return; - - var now = performance.now() / 1000; - if(!this.lastCallTime){ - // last call time not saved, cant guess elapsed time. Take a simple step. - this.instance.step(timeStep); - this.lastCallTime = now; - return; - } - - var timeSinceLastCall = now - this.lastCallTime; - - this.instance.step(timeStep, timeSinceLastCall); - - this.lastCallTime = now; -}; - -GameLib.D3.World.prototype.GetIndexedVertices = function( - triangleMeshShape -) { - - if(this.engine.engineType == GameLib.D3.Physics.TYPE_CANNON) { - - return { - vertices : triangleMeshShape.vertices, - indices : triangleMeshShape.indices - }; - - } else { - // todo: implement this for other physics engines. - return null; - } - -}; - -/** - * @param triangleMeshShape GameLib.D3.Shape - * @param normalLength Number - * @param scale GameLib.D3.Vector3 - * @param opacity Number - * @param wireframeColor HexCode - * @param graphics THREE - * @returns {THREE.Mesh|this.meshes} - * @constructor - */ -GameLib.D3.World.prototype.generateWireframeViewTriangleMesh = function( - graphics, - triangleMeshShape, - normalLength, - scale, - opacity, - wireframeColor -) { - graphics.isNotThreeThrow(); - this.engine.isNotCannonThrow(); - - if(typeof normalLength == 'undefined') { - normalLength = 10; - } - - if(typeof scale == 'undefined') { - scale = new graphics.instance.Vector3(1, 1, 1); - } - - if(typeof opacity == 'undefined') { - opacity = 0.5; - } - - if(typeof wireframeColor == 'undefined') { - wireframeColor = 0xfefefe; - } - - var graphicsGeometry = new graphics.instance.Geometry(); - - var wireframeMesh = new graphics.instance.Mesh( - graphicsGeometry, - new graphics.instance.MeshBasicMaterial({ - color: wireframeColor, - wireframe: true, - opacity: opacity - }) - ); - - for(var v = 0, l = triangleMeshShape.instance.vertices.length / 3; v < l; ++v) { - graphicsGeometry.vertices.push( - new graphics.instance.Vector3( - triangleMeshShape.instance.vertices[v * 3], - triangleMeshShape.instance.vertices[v * 3 + 1], - triangleMeshShape.instance.vertices[v * 3 + 2] - ) - ); - } - - for(var i = 0, l = triangleMeshShape.instance.indices.length / 3; i < l; ++i) { - var i0 = triangleMeshShape.instance.indices[i * 3]; - var i1 = triangleMeshShape.instance.indices[i * 3 + 1]; - var i2 = triangleMeshShape.instance.indices[i * 3 + 2]; - - graphicsGeometry.faces.push( - new graphics.instance.Face3( - i0, - i1, - i2 - ) - ); - - // Center point on the current triangle - - var centroid = new graphics.instance.Vector3() - .add(graphicsGeometry.vertices[i0]) - .add(graphicsGeometry.vertices[i1]) - .add(graphicsGeometry.vertices[i2]) - .divideScalar(3); - - // Get the normal from the mesh shape itself - var normal = new this.engine.instance.Vec3(); - triangleMeshShape.instance.getNormal(i , normal); - - var arrow = new graphics.instance.ArrowHelper( - new graphics.instance.Vector3( - normal.x, - normal.y, - normal.z - ), - centroid, - normalLength, - new graphics.instance.Color( - normal.x, - normal.y, - normal.z - ) - ); - wireframeMesh.add( arrow ); - } - - wireframeMesh.scale.x = scale.x; - wireframeMesh.scale.y = scale.y; - wireframeMesh.scale.z = scale.z; - - return wireframeMesh; -}; - -/** - * @param convexPolyMeshShape GameLib.D3.Shape - * @param normalLength Number - * @param scale GameLib.D3.Vector3 - * @param opacity Number - * @param wireframeColor HexCode - * @param graphics THREE - * @returns {THREE.Mesh|this.meshes} - * @constructor - */ -GameLib.D3.World.prototype.generateWireframeViewConvexPolyMesh = function( - graphics, - convexPolyMeshShape, - normalLength, - scale, - opacity, - wireframeColor -) { - graphics.isNotThreeThrow(); - this.engine.isNotCannonThrow(); - - if(typeof normalLength == 'undefined') { - normalLength = 10; - } - - if(typeof scale == 'undefined') { - scale = new graphics.instance.Vector3(1, 1, 1); - } - - if(typeof opacity == 'undefined') { - opacity = 0.5; - } - - if(typeof wireframeColor == 'undefined') { - wireframeColor = 0xfefefe; - } - - - var graphicsGeometry = new graphics.instance.Geometry(); - var wireframeMesh = new graphics.instance.Mesh( - graphicsGeometry, - new graphics.instance.MeshBasicMaterial({ - color: wireframeColor, - wireframe: true, - opacity: opacity - }) - ); - - for(var i = 0, l = convexPolyMeshShape.instance.vertices.length; i < l; i++) { - var vertex = convexPolyMeshShape.instance.vertices[i]; - graphicsGeometry.vertices.push(new graphics.instance.Vector3(vertex.x, vertex.y, vertex.z)); - } - - for(var i = 0, l = convexPolyMeshShape.instance.faces.length; i < l; i++) { - var face = convexPolyMeshShape.instance.faces[i]; - - var i0 = face[0]; - var i1 = face[1]; - var i2 = face[2]; - - graphicsGeometry.faces.push(new graphics.instance.Face3(i0, i1, i2)); - - // Center point on the current triangle - var centroid = new graphics.instance.Vector3() - .add(graphicsGeometry.vertices[i0]) - .add(graphicsGeometry.vertices[i1]) - .add(graphicsGeometry.vertices[i2]) - .divideScalar(3); - - var normalVec3 = convexPolyMeshShape.instance.faceNormals[i]; - var normal = new graphics.instance.Vector3( - normalVec3.x, - normalVec3.y, - normalVec3.z - ); - - var arrow = new graphics.instance.ArrowHelper( - normal, - centroid, - normalLength, - new graphics.instance.Color( - normal.x, - normal.y, - normal.z - ) - ); - - wireframeMesh.add( arrow ); - } - - wireframeMesh.scale.x = scale.x; - wireframeMesh.scale.y = scale.y; - wireframeMesh.scale.z = scale.z; - - return wireframeMesh; -}; - -/** - * @param graphics GameLib.D3.Graphics - * @param graphicsMesh THREE.Mesh - * @param mass Number - * @param friction Number - * @param createCollisionSubMeshes Boolean - * @param facesPerSubsection Number - * @param subsectionsToMerge Number - * @returns {Object} - * @constructor - */ -GameLib.D3.World.prototype.generateTriangleMeshShapeDivided = function( - graphics, - graphicsMesh, - mass, - friction, - createCollisionSubMeshes, - facesPerSubsection, - subsectionsToMerge -) { - graphics.isNotThreeThrow(); - this.engine.isNotCannonThrow(); - - if(mass == null || typeof mass == 'undefined') { - mass = 0; - } - - if(friction == null || typeof friction == 'undefined') { - friction = 10; - } - - if(createCollisionSubMeshes == null || typeof createCollisionSubMeshes == 'undefined') { - createCollisionSubMeshes = false; - } - - var processedFaces = 0; - var facesPerSubSection = facesPerSubsection || 0; - var subMeshesToMerge = subsectionsToMerge || 0; - var totalAmtFaces = graphicsMesh.geometry.faces.length; - var facesToProcess = createCollisionSubMeshes ? (subMeshesToMerge * facesPerSubSection) : totalAmtFaces; - - var pairs = []; // output - - var vertices = []; - var indicies = []; - - for(var i = 0; i <= totalAmtFaces; i++) { - if(processedFaces == facesToProcess || i == totalAmtFaces) { - - var body = null; - - var meshShape = new this.engine.instance.Trimesh(vertices, indicies); - - meshShape.setScale(new this.engine.instance.Vec3( - graphicsMesh.scale.x, - graphicsMesh.scale.y, - graphicsMesh.scale.z - )); - - meshShape.updateAABB(); - meshShape.updateNormals(); - meshShape.updateEdges(); - meshShape.updateBoundingSphereRadius(); - meshShape.updateTree(); - - body = new this.engine.instance.Body({ - mass: mass, - friction: friction - }); - body.addShape(meshShape); - - pairs.push({ - threeObject : createCollisionSubMeshes ? null : graphicsMesh, - physicsObject : body - }); - - vertices = []; - indicies = []; - processedFaces = 0; - - if(i == totalAmtFaces) { - return pairs; - } - } - - var face = graphicsMesh.geometry.faces[i]; - indicies.push(indicies.length); - indicies.push(indicies.length); - indicies.push(indicies.length); - - var v0 = graphicsMesh.geometry.vertices[face.a]; - var v1 = graphicsMesh.geometry.vertices[face.b]; - var v2 = graphicsMesh.geometry.vertices[face.c]; - - vertices.push(v0.x, v0.y, v0.z); - vertices.push(v1.x, v1.y, v1.z); - vertices.push(v2.x, v2.y, v2.z); - - processedFaces++; - } -}; - -/** - * @param graphics GameLib.D3.Graphics - * @param graphicsMesh THREE.Mesh - * @returns {GameLib.D3.RigidBody} - * @constructor - */ -GameLib.D3.World.prototype.generateTriangleMeshShape = function( - graphics, - graphicsMesh -) { - - // - - - - - - - - - - - - - - - - - - - - - - - - - - // Note: I did not test this yet with the API data. - // - - - - - - - - - - - - - - - - - - - - - - - - - - - var scaledVertices = []; - for(var i = 0, l = graphicsMesh.geometry.vertices.length; i < l; i++) { - - var vertex = graphicsMesh.geometry.vertices[i]; - - scaledVertices.push(new this.engine.instance.Vec3( - vertex.x * graphicsMesh.scale.x, - vertex.y * graphicsMesh.scale.y, - vertex.z * graphicsMesh.scale.z - )); - - } - - var triangleFaces = []; - for(var f = 0, fl = graphicsMesh.geometry.faces.length; f < fl; f++) { - var i0 = graphicsMesh.geometry.faces[f].a; - var i1 = graphicsMesh.geometry.faces[f].b; - var i2 = graphicsMesh.geometry.faces[f].c; - - triangleFaces.push([ - i0, - i1, - i2 - ]); - } - - // - - - - - - - - - - - - - - - - - - - - // Create collision mesh - // - - - - - - - - - - - - - - - - - - - - - var reindexedFaces = {}; - var vertices = []; - var faces = []; - - var processedFaces = 0; - var totalFacesToProcess = triangleFaces.length; - var flLastIndex = 0; - - for(var f = 0; f < totalFacesToProcess; f++) { - - var i0 = triangleFaces[f][0]; - var i1 = triangleFaces[f][1]; - var i2 = triangleFaces[f][2]; - - if(typeof reindexedFaces[i0] === 'undefined') { - vertices.push(scaledVertices[i0].x, scaledVertices[i0].y, scaledVertices[i0].z); - reindexedFaces[i0] = flLastIndex; - flLastIndex++; - } - - if(typeof reindexedFaces[i1] === 'undefined') { - vertices.push(scaledVertices[i1].x, scaledVertices[i1].y, scaledVertices[i1].z); - reindexedFaces[i1] = flLastIndex; - flLastIndex++; - } - - if(typeof reindexedFaces[i2] === 'undefined') { - vertices.push(scaledVertices[i2].x, scaledVertices[i2].y, scaledVertices[i2].z); - reindexedFaces[i2] = flLastIndex; - flLastIndex++; - } - - faces.push(reindexedFaces[i0], reindexedFaces[i1], reindexedFaces[i2]); - - processedFaces++; - } - - var shape = GameLib.D3.Shape(this.engine, GameLib.D3.Shape.SHAPE_TYPE_TRIMESH, graphicsMesh.scale, vertices, faces); - var body = GameLib.D3.RigidBody(this.engine, 0, 12); - - body.addShape(shape); - this.addRigidBody(body); - - // process the mesh children recursively - for(var c in graphicsMesh.children) { - this.generateTriangleMeshShape(graphics, graphicsMesh.children[c]); - } - - return body; -}; - -/** - * @param triangleMeshBody GameLib.D3.RigidBody - * @param rayscale Number - * @param maxTriangleDistance Number - * @param createCompoundShape Boolean - * @param graphics GameLib.D3.Graphics - * @param triangleMeshShapes GameLib.D3.Shape[] - * @param createDebugView Boolean - * @returns {GameLib.D3.RigidBody} - * @constructor - */ -GameLib.D3.World.prototype.fixupTriangleMeshShape = function( - triangleMeshBody, - triangleMeshShapes, - rayscale, - maxTriangleDistance, - createCompoundShape, - graphics, - createDebugView -) { - this.engine.isNotCannonThrow(); - - graphics.isNotThreeThrow(); - - if(rayscale == null || typeof rayscale == 'undefined' || rayscale == 0) { - rayscale = 10; - } - - if(maxTriangleDistance == null || typeof maxTriangleDistance == 'undefined') { - maxTriangleDistance = 13; - } - - var world = this.instance; - - var raycastResult = new this.engine.instance.RaycastResult(); - - var brokenFaceIndicators = []; - var wireframeMeshes = []; - - var totalFaces = 0; - var totalBrokenFaces = 0; - var totalFixedFaces = 0; - var fixedTriangleMeshObjects = []; - - for(var i in triangleMeshShapes) { - var trimesh = triangleMeshShapes[i]; - - var brokenFaces = []; - totalFaces += (trimesh.indices.length / 3); - - for(var face = 0; face < trimesh.indices.length / 3; face++) { - - var i0 = trimesh.indices[face * 3]; - var i1 = trimesh.indices[face * 3 + 1]; - var i2 = trimesh.indices[face * 3 + 2]; - - var triangleCenterPoint = new graphics.instance.Vector3() - .add(new graphics.instance.Vector3( - trimesh.vertices[i0 * 3], - trimesh.vertices[i0 * 3 + 1], - trimesh.vertices[i0 * 3 + 2]) - ) - .add(new graphics.instance.Vector3( - trimesh.vertices[i1 * 3], - trimesh.vertices[i1 * 3 + 1], - trimesh.vertices[i1 * 3 + 2]) - ) - .add(new graphics.instance.Vector3( - trimesh.vertices[i2 * 3], - trimesh.vertices[i2 * 3 + 1], - trimesh.vertices[i2 * 3 + 2]) - ) - .divideScalar(3); - - var triangleNormal = new this.engine.instance.Vec3(); - trimesh.getNormal(face , triangleNormal); - - var from = new this.engine.instance.Vec3( - triangleCenterPoint.x + triangleNormal.x, - triangleCenterPoint.y + triangleNormal.y, - triangleCenterPoint.z + triangleNormal.z - ); - - var to = new this.engine.instance.Vec3( - from.x - triangleNormal.x * rayscale, - from.y - triangleNormal.y * rayscale, - from.z - triangleNormal.z * rayscale - ); - - world.raycastClosest(from, to, {}, raycastResult); - - // visualize results - if(createDebugView){ - var graphicsGeometry = new graphics.instance.Geometry(); - var wireframeMesh = new graphics.instance.Mesh( - graphicsGeometry, - new graphics.instance.MeshBasicMaterial({ - color: 0xff0000, - wireframe: true, - opacity: 1 - }) - ); - - var arrow = new graphics.instance.ArrowHelper( - new graphics.instance.Vector3( - triangleNormal.x, - triangleNormal.y, - triangleNormal.z - ).normalize(), - - new graphics.instance.Vector3( - from.x, - from.y, - from.z - ), - - rayscale / 2, - raycastResult.hasHit ? new graphics.instance.Color(0, 1, 0) - : new graphics.instance.Color(1, 0, 0) - ); - - wireframeMesh.add( arrow ); - - wireframeMeshes.add(wireframeMesh); - brokenFaceIndicators.push(wireframeMesh); - } - - if(!raycastResult.hasHit) { - brokenFaces.push({ - faceIndex : face, - - vertices : [ - new this.engine.instance.Vec3( - trimesh.vertices[i0 * 3], - trimesh.vertices[i0 * 3 + 1], - trimesh.vertices[i0 * 3 + 2] - ), - - new this.engine.instance.Vec3( - trimesh.vertices[i1 * 3], - trimesh.vertices[i1 * 3 + 1], - trimesh.vertices[i1 * 3 + 2] - ), - - new this.engine.instance.Vec3( - trimesh.vertices[i2 * 3], - trimesh.vertices[i2 * 3 + 1], - trimesh.vertices[i2 * 3 + 2] - ) - ], - - center : triangleCenterPoint, - - parent : trimesh - }); - } - } - - // fix up broken faces - - var bFaceIndexed = {}; - for(var b = 0; b < brokenFaces.length; b++) { - var brokenFace = brokenFaces[b]; - - if(brokenFace.marked) { - continue; - } - - bFaceIndexed[b] = { - indices : [], - vertices : [] - }; - - var indicesAmount = bFaceIndexed[b].indices.length; - - // add the current broken face itself to the array - bFaceIndexed[b].indices.push( - indicesAmount, - indicesAmount + 1, - indicesAmount + 2 - ); - - bFaceIndexed[b].vertices.push( - brokenFace.vertices[0].x, - brokenFace.vertices[0].y, - brokenFace.vertices[0].z - ); - - bFaceIndexed[b].vertices.push( - brokenFace.vertices[1].x, - brokenFace.vertices[1].y, - brokenFace.vertices[1].z - ); - - bFaceIndexed[b].vertices.push( - brokenFace.vertices[2].x, - brokenFace.vertices[2].y, - brokenFace.vertices[2].z - ); - - for(var bb = 0; bb < brokenFaces.length; bb++) { - - if(bb == b) { - continue; - } - - var otherBrokenFace = brokenFaces[bb]; - - if(otherBrokenFace.marked) { - continue; - } - - if(brokenFace.center.distanceTo(otherBrokenFace.center) <= maxTriangleDistance) { - var indicesAmount = bFaceIndexed[b].indices.length; - - bFaceIndexed[b].indices.push( - indicesAmount, - indicesAmount + 1, - indicesAmount + 2 - ); - - bFaceIndexed[b].vertices.push( - otherBrokenFace.vertices[0].x, - otherBrokenFace.vertices[0].y, - otherBrokenFace.vertices[0].z - ); - - bFaceIndexed[b].vertices.push( - otherBrokenFace.vertices[1].x, - otherBrokenFace.vertices[1].y, - otherBrokenFace.vertices[1].z - ); - - bFaceIndexed[b].vertices.push( - otherBrokenFace.vertices[2].x, - otherBrokenFace.vertices[2].y, - otherBrokenFace.vertices[2].z - ); - - otherBrokenFace.marked = true; - } - } - } - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Decide if we want to create new rigid bodies, or create a compound mesh - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - for(var e in bFaceIndexed) { - var element = bFaceIndexed[e]; - - var shape = new GameLib.D3.Shape(this.engine, GameLib.D3.Shape.SHAPE_TYPE_TRIMESH, null, element.vertices, element.indices); - - if(createCompoundShape) { - triangleMeshBody.addShape(shape); - } else { - - var body = new GameLib.D3.RigidBody(this.engine, 0, 12); - body.addShape(shape); - this.instance.addRigidBody(body); - } - - fixedTriangleMeshObjects.push(shape); - totalFixedFaces += element.indices.length / 3; - - console.log("created mesh shape", element.indices.length / 3); - } - - // TODO: remove duplicate indices - /*trimesh.updateNormals(); - trimesh.updateEdges(); - trimesh.updateTree(); - trimesh.updateAABB(); - trimesh.updateBoundingSphereRadius();*/ - - // map faceIndex to flat face index (faceIndex * 3) +0, 1, 2 -> triangle indices - console.log("i = " + i, brokenFaces); - totalBrokenFaces += brokenFaces.length; - } - - console.log("total faces", totalFaces); - console.log("total broken faces", totalBrokenFaces); - console.log("broken faces in percent", (totalBrokenFaces / totalFaces) * 100); - console.log("total fixed faces", totalFixedFaces); - console.log("fixed triangle mesh shapes", fixedTriangleMeshObjects.length); - - return { - brokenFaceIndicators : brokenFaceIndicators, - fixedTriangleMeshShapes : fixedTriangleMeshObjects, - wireframeMeshes : wireframeMeshes - }; -}; -if (typeof module !== 'undefined') { - module.exports = GameLib; -} \ No newline at end of file From 6d098fc84d5cb22a5d0c1a4d53d996e48f8a5320 Mon Sep 17 00:00:00 2001 From: cybafelo Date: Tue, 1 Nov 2016 15:29:36 +0000 Subject: [PATCH 4/6] git ignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3e2e84b --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +build/ +node_modules/ From 9b6c5d4348415dc3ac938c4f9f15efac03939bba Mon Sep 17 00:00:00 2001 From: "Theunis J. Botha" Date: Tue, 1 Nov 2016 18:59:26 +0100 Subject: [PATCH 5/6] current progress - starting to load textures sparse --- src/game-lib-material.js | 325 +++++++++++++++++++++++---------------- src/game-lib-scene.js | 249 ++++++++++++++---------------- src/game-lib-texture.js | 234 ++++++++++++++++++---------- 3 files changed, 465 insertions(+), 343 deletions(-) diff --git a/src/game-lib-material.js b/src/game-lib-material.js index 5cd7a91..efd4015 100644 --- a/src/game-lib-material.js +++ b/src/game-lib-material.js @@ -408,6 +408,26 @@ GameLib.D3.Material = function( } this.envMapIntensity = envMapIntensity; + /** + * @type GameLib.D3.Material.ImageLoadedCallback[] + */ + this.OnImageLoadedCallbacks = []; +}; + +/** + * Assigns a copy of the loaded texture map to the instance material + * @param instanceMaterial + * @param instanceMapId + * @returns {Function} + * @constructor + */ +GameLib.D3.Material.ImageLoadedCallback = function( + instanceMaterial, + instanceMapId +) { + return function(texture) { + instanceMaterial[instanceMapId] = texture.clone(); + }; }; /** @@ -508,75 +528,145 @@ GameLib.D3.Material.TYPE_MULTI_MATERIAL= "MultiMaterial"; /** * Creates an instance Material from a GameLib.D3.Material - * @param gameLibMaterial GameLib.D3.Material + * @param apiMaterial GameLib.D3.Material * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback + * @param imageLoader GameLib.D3.Texture */ GameLib.D3.Material.CreateInstanceMaterial = function( - gameLibMaterial, + apiMaterial, graphics, - uploadUrl, - progressCallback + imageLoader ) { - - var defer = Q.defer(); + var gameLibMaterial = new GameLib.D3.Material( + apiMaterial.id, + apiMaterial.name, + apiMaterial.materialType, + apiMaterial.opacity, + apiMaterial.side, + apiMaterial.transparent, + apiMaterial.maps, + new GameLib.D3.Color( + apiMaterial.specular.r, + apiMaterial.specular.g, + apiMaterial.specular.b, + apiMaterial.specular.a + ), + apiMaterial.lightMapIntensity, + apiMaterial.aoMapIntensity, + new GameLib.D3.Color( + apiMaterial.color.r, + apiMaterial.color.g, + apiMaterial.color.b, + apiMaterial.color.a + ), + new GameLib.D3.Color( + apiMaterial.emissive.r, + apiMaterial.emissive.g, + apiMaterial.emissive.b, + apiMaterial.emissive.a + ), + apiMaterial.emissiveIntensity, + apiMaterial.combine, + apiMaterial.shininess, + apiMaterial.reflectivity, + apiMaterial.refractionRatio, + apiMaterial.fog, + apiMaterial.wireframe, + apiMaterial.wireframeLineWidth, + apiMaterial.wireframeLineCap, + apiMaterial.wireframeLineJoin, + apiMaterial.vertexColors, + apiMaterial.skinning, + apiMaterial.morphTargets, + apiMaterial.morphNormals, + apiMaterial.lineWidth, + apiMaterial.lineCap, + apiMaterial.lineJoin, + apiMaterial.dashSize, + apiMaterial.gapWidth, + apiMaterial.blending, + apiMaterial.blendSrc, + apiMaterial.blendDst, + apiMaterial.blendEquation, + apiMaterial.depthTest, + apiMaterial.depthFunc, + apiMaterial.depthWrite, + apiMaterial.polygonOffset, + apiMaterial.polygonOffsetFactor, + apiMaterial.polygonOffsetUnits, + apiMaterial.alphaTest, + apiMaterial.clippingPlanes, + apiMaterial.clipShadows, + apiMaterial.visible, + apiMaterial.overdraw, + apiMaterial.shading, + apiMaterial.bumpScale, + apiMaterial.normalScale, + apiMaterial.displacementScale, + apiMaterial.displacementBias, + apiMaterial.roughness, + apiMaterial.metalness, + apiMaterial.pointSize, + apiMaterial.pointSizeAttenuation, + apiMaterial.spriteRotation, + apiMaterial.envMapIntensity + ); var instanceMaterial = null; var blenderMaps = []; - if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) { + if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) { instanceMaterial = new graphics.instance.MeshStandardMaterial({ - name: gameLibMaterial.name, - opacity: gameLibMaterial.opacity, - transparent: gameLibMaterial.transparent, - blending: gameLibMaterial.blending, - blendSrc: gameLibMaterial.blendSrc, - blendDst: gameLibMaterial.blendDst, - blendEquation: gameLibMaterial.blendEquation, - depthTest: gameLibMaterial.depthTest, - depthFunc: gameLibMaterial.depthFunc, - depthWrite: gameLibMaterial.depthWrite, - polygonOffset: gameLibMaterial.polygonOffset, - polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, - polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, - alphaTest: gameLibMaterial.alphaTest, - clippingPlanes: gameLibMaterial.clippingPlanes, - clipShadows: gameLibMaterial.clipShadows, - overdraw: gameLibMaterial.overdraw, - visible: gameLibMaterial.visible, - side: gameLibMaterial.side, + name: apiMaterial.name, + opacity: apiMaterial.opacity, + transparent: apiMaterial.transparent, + blending: apiMaterial.blending, + blendSrc: apiMaterial.blendSrc, + blendDst: apiMaterial.blendDst, + blendEquation: apiMaterial.blendEquation, + depthTest: apiMaterial.depthTest, + depthFunc: apiMaterial.depthFunc, + depthWrite: apiMaterial.depthWrite, + polygonOffset: apiMaterial.polygonOffset, + polygonOffsetFactor: apiMaterial.polygonOffsetFactor, + polygonOffsetUnits: apiMaterial.polygonOffsetUnits, + alphaTest: apiMaterial.alphaTest, + clippingPlanes: apiMaterial.clippingPlanes, + clipShadows: apiMaterial.clipShadows, + overdraw: apiMaterial.overdraw, + visible: apiMaterial.visible, + side: apiMaterial.side, color: new graphics.instance.Color( - gameLibMaterial.color.r, - gameLibMaterial.color.g, - gameLibMaterial.color.b + apiMaterial.color.r, + apiMaterial.color.g, + apiMaterial.color.b ), - roughness: gameLibMaterial.roughness, - metalness: gameLibMaterial.metalness, - lightMapIntensity: gameLibMaterial.lightMapIntensity, - aoMapIntensity: gameLibMaterial.aoMapIntensity, + roughness: apiMaterial.roughness, + metalness: apiMaterial.metalness, + lightMapIntensity: apiMaterial.lightMapIntensity, + aoMapIntensity: apiMaterial.aoMapIntensity, emissive: new graphics.instance.Color( - gameLibMaterial.emissive.r, - gameLibMaterial.emissive.g, - gameLibMaterial.emissive.b + apiMaterial.emissive.r, + apiMaterial.emissive.g, + apiMaterial.emissive.b ), - emissiveIntensity: gameLibMaterial.emissiveIntensity, - bumpScale: gameLibMaterial.bumpScale, - normalScale: gameLibMaterial.normalScale, - displacementScale: gameLibMaterial.displacementScale, - refractionRatio: gameLibMaterial.refractionRatio, - fog: gameLibMaterial.fog, - shading: gameLibMaterial.shading, - wireframe: gameLibMaterial.wireframe, - wireframeLinewidth: gameLibMaterial.wireframeLineWidth, - wireframeLinecap: gameLibMaterial.wireframeLineCap, - wireframeLinejoin: gameLibMaterial.wireframeLineJoin, - vertexColors: gameLibMaterial.vertexColors, - skinning: gameLibMaterial.skinning, - morphTargets: gameLibMaterial.morphTargets, - morphNormals: gameLibMaterial.morphNormals + emissiveIntensity: apiMaterial.emissiveIntensity, + bumpScale: apiMaterial.bumpScale, + normalScale: apiMaterial.normalScale, + displacementScale: apiMaterial.displacementScale, + refractionRatio: apiMaterial.refractionRatio, + fog: apiMaterial.fog, + shading: apiMaterial.shading, + wireframe: apiMaterial.wireframe, + wireframeLinewidth: apiMaterial.wireframeLineWidth, + wireframeLinecap: apiMaterial.wireframeLineCap, + wireframeLinejoin: apiMaterial.wireframeLineJoin, + vertexColors: apiMaterial.vertexColors, + skinning: apiMaterial.skinning, + morphTargets: apiMaterial.morphTargets, + morphNormals: apiMaterial.morphNormals }); blenderMaps.push( @@ -592,62 +682,63 @@ GameLib.D3.Material.CreateInstanceMaterial = function( 'alpha', 'environment' ); - } else if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) { + + } else if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) { instanceMaterial = new graphics.instance.MeshPhongMaterial({ - name: gameLibMaterial.name, - opacity: gameLibMaterial.opacity, - transparent: gameLibMaterial.transparent, - blending: gameLibMaterial.blending, - blendSrc: gameLibMaterial.blendSrc, - blendDst: gameLibMaterial.blendDst, - blendEquation: gameLibMaterial.blendEquation, - depthTest: gameLibMaterial.depthTest, - depthFunc: gameLibMaterial.depthFunc, - depthWrite: gameLibMaterial.depthWrite, - polygonOffset: gameLibMaterial.polygonOffset, - polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, - polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, - alphaTest: gameLibMaterial.alphaTest, - clippingPlanes: gameLibMaterial.clippingPlanes, - clipShadows: gameLibMaterial.clipShadows, - overdraw: gameLibMaterial.overdraw, - visible: gameLibMaterial.visible, - side: gameLibMaterial.side, + name: apiMaterial.name, + opacity: apiMaterial.opacity, + transparent: apiMaterial.transparent, + blending: apiMaterial.blending, + blendSrc: apiMaterial.blendSrc, + blendDst: apiMaterial.blendDst, + blendEquation: apiMaterial.blendEquation, + depthTest: apiMaterial.depthTest, + depthFunc: apiMaterial.depthFunc, + depthWrite: apiMaterial.depthWrite, + polygonOffset: apiMaterial.polygonOffset, + polygonOffsetFactor: apiMaterial.polygonOffsetFactor, + polygonOffsetUnits: apiMaterial.polygonOffsetUnits, + alphaTest: apiMaterial.alphaTest, + clippingPlanes: apiMaterial.clippingPlanes, + clipShadows: apiMaterial.clipShadows, + overdraw: apiMaterial.overdraw, + visible: apiMaterial.visible, + side: apiMaterial.side, color: new graphics.instance.Color( - gameLibMaterial.color.r, - gameLibMaterial.color.g, - gameLibMaterial.color.b + apiMaterial.color.r, + apiMaterial.color.g, + apiMaterial.color.b ), specular: new graphics.instance.Color( - gameLibMaterial.specular.r, - gameLibMaterial.specular.g, - gameLibMaterial.specular.b + apiMaterial.specular.r, + apiMaterial.specular.g, + apiMaterial.specular.b ), - shininess: gameLibMaterial.shininess, - lightMapIntensity: gameLibMaterial.lightMapIntensity, - aoMapIntensity: gameLibMaterial.aoMapIntensity, + shininess: apiMaterial.shininess, + lightMapIntensity: apiMaterial.lightMapIntensity, + aoMapIntensity: apiMaterial.aoMapIntensity, emissive: new graphics.instance.Color( - gameLibMaterial.emissive.r, - gameLibMaterial.emissive.g, - gameLibMaterial.emissive.b + apiMaterial.emissive.r, + apiMaterial.emissive.g, + apiMaterial.emissive.b ), - emissiveIntensity: gameLibMaterial.emissiveIntensity, - bumpScale: gameLibMaterial.bumpScale, - normalScale: gameLibMaterial.normalScale, - displacementScale: gameLibMaterial.displacementScale, - combine: gameLibMaterial.combine, - refractionRatio: gameLibMaterial.refractionRatio, - fog: gameLibMaterial.fog, - shading: gameLibMaterial.shading, - wireframe: gameLibMaterial.wireframe, - wireframeLinewidth: gameLibMaterial.wireframeLineWidth, - wireframeLinecap: gameLibMaterial.wireframeLineCap, - wireframeLinejoin: gameLibMaterial.wireframeLineJoin, - vertexColors: gameLibMaterial.vertexColors, - skinning: gameLibMaterial.skinning, - morphTargets: gameLibMaterial.morphTargets, - morphNormals: gameLibMaterial.morphNormals + emissiveIntensity: apiMaterial.emissiveIntensity, + bumpScale: apiMaterial.bumpScale, + normalScale: apiMaterial.normalScale, + displacementScale: apiMaterial.displacementScale, + combine: apiMaterial.combine, + refractionRatio: apiMaterial.refractionRatio, + fog: apiMaterial.fog, + shading: apiMaterial.shading, + wireframe: apiMaterial.wireframe, + wireframeLinewidth: apiMaterial.wireframeLineWidth, + wireframeLinecap: apiMaterial.wireframeLineCap, + wireframeLinejoin: apiMaterial.wireframeLineJoin, + vertexColors: apiMaterial.vertexColors, + skinning: apiMaterial.skinning, + morphTargets: apiMaterial.morphTargets, + morphNormals: apiMaterial.morphNormals }); blenderMaps.push( @@ -664,40 +755,16 @@ GameLib.D3.Material.CreateInstanceMaterial = function( ); } else { - console.log("material type is not implemented yet: " + gameLibMaterial.materialType + " - material indexes could be screwed up"); - defer.reject(null); - return defer.promise; + console.log("material type is not implemented yet: " + apiMaterial.materialType + " - material indexes could be screwed up"); } if (blenderMaps.length > 0) { - - var textureMaps = GameLib.D3.Texture.LoadMaps( + imageLoader.setup( gameLibMaterial, - blenderMaps, instanceMaterial, - graphics, - uploadUrl, - progressCallback + blenderMaps ); - - if (textureMaps.length > 0) { - Q.all(textureMaps).then( - function onFulfilled(map){ - defer.resolve(instanceMaterial); - }, - function onRejected(message) { - console.log(message); - defer.reject(message); - }, - function onProgress(progress) { - console.log('progress'); - } - ) - } - - } else { - defer.resolve(instanceMaterial); } - return defer.promise; + return instanceMaterial; }; \ No newline at end of file diff --git a/src/game-lib-scene.js b/src/game-lib-scene.js index 91c908d..b1f104c 100644 --- a/src/game-lib-scene.js +++ b/src/game-lib-scene.js @@ -254,9 +254,20 @@ GameLib.D3.Scene.LoadScene = function( console.log("loading scene " + gameLibScene.name); + if (typeof onLoaded == 'undefined') { + console.warn('No on loaded callback has been specified'); + throw new Error('No on loaded callback has been specified'); + } + graphics.isNotThreeThrow(); - var meshQ = []; + var instanceMeshes = []; + + var gameLibTexture = new GameLib.D3.Texture( + graphics, + uploadUrl, + progressCallback + ); for (var m = 0; m < gameLibScene.meshes.length; m++) { @@ -393,148 +404,123 @@ GameLib.D3.Scene.LoadScene = function( geometry.computeVertexNormals(); } - var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( + var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( materials[0], graphics, - uploadUrl, - progressCallback + gameLibTexture ); - var result = instanceMaterial.then( - - (function(__mesh, __geometry) { - return function(materials) { - - console.log("loaded material : " + materials[0].name); - - /** - * We don't support MultiMaterial atm - it doesn't work with raycasting - */ - var material = materials[0]; - - var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh( - __mesh, - __geometry, - material, - graphics - ); - instanceMesh.name = __mesh.name; - - instanceMesh.position.x = __mesh.position.x; - instanceMesh.position.y = __mesh.position.y; - instanceMesh.position.z = __mesh.position.z; - - instanceMesh.rotation.x = __mesh.rotation.x; - instanceMesh.rotation.y = __mesh.rotation.y; - instanceMesh.rotation.z = __mesh.rotation.z; - - instanceMesh.scale.x = __mesh.scale.x; - instanceMesh.scale.y = __mesh.scale.y; - instanceMesh.scale.z = __mesh.scale.z; - - instanceMesh.quaternion.x = __mesh.quaternion.x; - instanceMesh.quaternion.y = __mesh.quaternion.y; - instanceMesh.quaternion.z = __mesh.quaternion.z; - instanceMesh.quaternion.w = __mesh.quaternion.w; - - return instanceMesh; - }; - })(mesh, geometry), - function onRejected(message) { - console.log(message); - return null; - }, - function onProgress(progress) { - console.log('material progress'); - } + var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh( + mesh, + geometry, + instanceMaterial, + graphics ); - meshQ.push(result); + instanceMesh.name = mesh.name; + + instanceMesh.position.x = mesh.position.x; + instanceMesh.position.y = mesh.position.y; + instanceMesh.position.z = mesh.position.z; + + instanceMesh.rotation.x = mesh.rotation.x; + instanceMesh.rotation.y = mesh.rotation.y; + instanceMesh.rotation.z = mesh.rotation.z; + + instanceMesh.scale.x = mesh.scale.x; + instanceMesh.scale.y = mesh.scale.y; + instanceMesh.scale.z = mesh.scale.z; + + instanceMesh.quaternion.x = mesh.quaternion.x; + instanceMesh.quaternion.y = mesh.quaternion.y; + instanceMesh.quaternion.z = mesh.quaternion.z; + instanceMesh.quaternion.w = mesh.quaternion.w; + + instanceMeshes.push(instanceMesh); } - debugger; - console.log('hi'); + console.log("created all meshes"); - Q.all(meshQ).then( - function(instanceMeshes){ - console.log("all meshes have loaded"); - if (typeof onLoaded != 'undefined') { + var instanceLights = []; - var instanceLights = []; + if (gameLibScene.lights && gameLibScene.lights.length > 0) { - for (var sli = 0; sli < gameLibScene.lights.length; sli++) { + for (var glsl = 0; glsl < gameLibScene.lights.length; glsl++) { - var gameLibLight = gameLibScene.lights[sli]; + var gameLibLight = gameLibScene.lights[glsl]; - var light = null; + var light = null; - if (gameLibLight.lightType == 'AmbientLight') { - light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity); - } - - if (gameLibLight.lightType == 'DirectionalLight') { - light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity); - } - - if (gameLibLight.lightType == 'PointLight') { - light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity); - light.distance = gameLibLight.distance; - light.decay = gameLibLight.decay; - } - - if (gameLibLight.lightType == 'SpotLight') { - light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity); - light.distance = gameLibLight.distance; - light.angle = gameLibLight.angle; - light.penumbra = gameLibLight.penumbra; - light.decay = gameLibLight.decay; - } - - light.position.x = gameLibLight.position.x; - light.position.y = gameLibLight.position.y; - light.position.z = gameLibLight.position.z; - - light.rotation.x = gameLibLight.rotation.x; - light.rotation.y = gameLibLight.rotation.y; - light.rotation.z = gameLibLight.rotation.z; - - if (light == null) { - console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported'); - } else { - light.name = gameLibLight.name; - instanceLights.push(light); - } + if (gameLibLight.lightType == 'AmbientLight') { + light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity); } - var instanceScene = new graphics.instance.Scene(); - - instanceScene.name = gameLibScene.name; - - instanceScene.position.x = gameLibScene.position.x; - instanceScene.position.y = gameLibScene.position.y; - instanceScene.position.z = gameLibScene.position.z; - - instanceScene.rotation.x = gameLibScene.rotation.x; - instanceScene.rotation.y = gameLibScene.rotation.y; - instanceScene.rotation.z = gameLibScene.rotation.z; - - instanceScene.scale.x = gameLibScene.scale.x; - instanceScene.scale.y = gameLibScene.scale.y; - instanceScene.scale.z = gameLibScene.scale.z; - - instanceScene.quaternion.x = gameLibScene.quaternion.x; - instanceScene.quaternion.y = gameLibScene.quaternion.y; - instanceScene.quaternion.z = gameLibScene.quaternion.z; - instanceScene.quaternion.w = gameLibScene.quaternion.w; - - for (var m = 0; m < instanceMeshes.length; m++) { - instanceScene.add(instanceMeshes[m]); + if (gameLibLight.lightType == 'DirectionalLight') { + light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity); } - for (var l = 0; l < instanceLights.length; l++) { - instanceScene.add(instanceLights[l]); + if (gameLibLight.lightType == 'PointLight') { + light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity); + light.distance = gameLibLight.distance; + light.decay = gameLibLight.decay; } + if (gameLibLight.lightType == 'SpotLight') { + light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity); + light.distance = gameLibLight.distance; + light.angle = gameLibLight.angle; + light.penumbra = gameLibLight.penumbra; + light.decay = gameLibLight.decay; + } + + light.position.x = gameLibLight.position.x; + light.position.y = gameLibLight.position.y; + light.position.z = gameLibLight.position.z; + + light.rotation.x = gameLibLight.rotation.x; + light.rotation.y = gameLibLight.rotation.y; + light.rotation.z = gameLibLight.rotation.z; + + if (light == null) { + console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported'); + } else { + light.name = gameLibLight.name; + instanceLights.push(light); + } + } + } + + var instanceScene = new graphics.instance.Scene(); + + instanceScene.name = gameLibScene.name; + + instanceScene.position.x = gameLibScene.position.x; + instanceScene.position.y = gameLibScene.position.y; + instanceScene.position.z = gameLibScene.position.z; + + instanceScene.rotation.x = gameLibScene.rotation.x; + instanceScene.rotation.y = gameLibScene.rotation.y; + instanceScene.rotation.z = gameLibScene.rotation.z; + + instanceScene.scale.x = gameLibScene.scale.x; + instanceScene.scale.y = gameLibScene.scale.y; + instanceScene.scale.z = gameLibScene.scale.z; + + instanceScene.quaternion.x = gameLibScene.quaternion.x; + instanceScene.quaternion.y = gameLibScene.quaternion.y; + instanceScene.quaternion.z = gameLibScene.quaternion.z; + instanceScene.quaternion.w = gameLibScene.quaternion.w; + + for (var im = 0; im < instanceMeshes.length; im++) { + instanceScene.add(instanceMeshes[im]); + } + + for (var l = 0; l < instanceLights.length; l++) { + instanceScene.add(instanceLights[l]); + } + + gameLibTexture.start.then( + function onFullfilled() { onLoaded( gameLibScene, { @@ -543,14 +529,13 @@ GameLib.D3.Scene.LoadScene = function( meshes: instanceMeshes } ); - } - }, - function(error) { - console.log(error); - } - ).catch( - function(error){ - console.log(error); + }, + function onRejected(message) { + console.log('Image loading failed with the following message: ' + message); + }, + function onProgress() { + console.log('loading images...'); } ); -}; \ No newline at end of file + +}; diff --git a/src/game-lib-texture.js b/src/game-lib-texture.js index 73a0ba7..6539348 100644 --- a/src/game-lib-texture.js +++ b/src/game-lib-texture.js @@ -240,79 +240,51 @@ GameLib.D3.Texture.LoadMap = function( return defer.promise; } - textureLoader.crossOrigin = ''; - - textureLoader.load( - imagePath, - function(texture) { - /** - * onLoad - */ - instanceMaterial[instanceMaterialMapType] = texture; - instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name; - instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy; - instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding; - instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY; - /** - * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes - */ - instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps; - instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter; - instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter; - instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping; - instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps; - instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2( - gameLibTexture.offset.x, - gameLibTexture.offset.y - ); - instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha; - instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType; - instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS; - instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT; - instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment; - instanceMaterial.needsUpdate = true; - defer.resolve(true); - }, - function(xhr) { - /** - * onProgress - */ - if (progressCallback) { - progressCallback(Math.round(xhr.loaded / xhr.total * 100)); - } - }, - function(error) { - /** - * onError - */ - console.log('Image could not be loaded: ' + imagePath, error); - defer.reject('Image could not be loaded: ' + imagePath); - } - ); + return defer.promise; }; - /** - * Returns an array of image loading Promises - * @param gameLibMaterial - * @param blenderMaps - * @param instanceMaterial + * Image Loader - attempts to reduce image loading calls by only loading the necessary images once - and setting + * them up per material later. * @param graphics GameLib.D3.Graphics * @param uploadUrl String * @param progressCallback - * @returns Q[] + * @constructor */ -GameLib.D3.Texture.LoadMaps = function( - gameLibMaterial, - blenderMaps, - instanceMaterial, +GameLib.D3.Texture = function( graphics, uploadUrl, progressCallback ) { - var textureMaps = []; + this.graphics = graphics; + this.graphics.isNotThreeThrow(); + + this.textureLoader = new this.graphics.instance.TextureLoader(); + this.textureLoader.crossOrigin = ''; + + this.uploadUrl = uploadUrl; + this.progressCallback = progressCallback; + this.urls = []; + this.gameLibMaterials = []; +}; + + +/** + * Sets up the Texture Loader by Notifying it of any images that we intend to download soon + * Instead of starting the download immediately - we should collect all the image URLs and attempt + * to download them only once - then after they have downloaded, we execute any pending OnImageLoaded callbacks + * on the Material + * @param gameLibMaterial + * @param instanceMaterial + * @param blenderMaps + */ +GameLib.D3.Texture.prototype.setup = function( + gameLibMaterial, + instanceMaterial, + blenderMaps +) { for (var ti = 0; ti < blenderMaps.length; ti++) { @@ -328,69 +300,167 @@ GameLib.D3.Texture.LoadMaps = function( blenderTexture.image.filename ) { - var instanceMap = null; + var instanceMapId = null; if (map == 'alpha') { - instanceMap = 'alhpaMap'; + instanceMapId = 'alhpaMap'; } if (map == 'ao') { - instanceMap = 'aoMap'; + instanceMapId = 'aoMap'; } if (map == 'bump') { - instanceMap = 'bumpMap'; + instanceMapId = 'bumpMap'; } if (map == 'displacement') { - instanceMap = 'displacementMap'; + instanceMapId = 'displacementMap'; } if (map == 'emissive') { - instanceMap = 'emissiveMap'; + instanceMapId = 'emissiveMap'; } if (map == 'environment') { - instanceMap = 'envMap'; + instanceMapId = 'envMap'; } if (map == 'light') { - instanceMap = 'lightMap'; + instanceMapId = 'lightMap'; } if (map == 'specular') { - instanceMap = 'specularMap'; + instanceMapId = 'specularMap'; } if (map == 'diffuse') { - instanceMap = 'map'; + instanceMapId = 'map'; } if (map == 'roughness') { - instanceMap = 'roughnessMap'; + instanceMapId = 'roughnessMap'; } if (map == 'metalness') { - instanceMap = 'metalnessMap'; + instanceMapId = 'metalnessMap'; } - if (instanceMap == null) { + if (instanceMapId == null) { console.warn("unsupported map type : " + map); } - textureMaps.push( - GameLib.D3.Texture.LoadMap( - gameLibMaterial.maps[map], + gameLibMaterial.OnImageLoadedCallbacks.push( + new GameLib.D3.Material.ImageLoadedCallback( instanceMaterial, - instanceMap, - graphics, - uploadUrl, - progressCallback + instanceMapId ) ); + + this.notify( + gameLibMaterial, + blenderTexture.image.filename + ); } } } - - return textureMaps; }; + +/** + * Notifies the texture loader to load the image (if not already started) + * @param gameLibMaterial + * @param fileName + * @constructor + */ +GameLib.D3.Texture.prototype.notify = function( + gameLibMaterial, + fileName +) { + this.gameLibMaterials.push(gameLibMaterial); + this.urls.push(this.uploadUrl + '/' + fileName); +}; + +GameLib.D3.Texture.prototype.loadTexture = function(url, gameLibTexture) { + + var defer = Q.defer(); + + this.textureLoader.load( + url, + function onLoad(textureInstance){ + textureInstance.name = gameLibTexture.name; + textureInstance.anisotropy = gameLibTexture.anisotropy; + textureInstance.encoding = gameLibTexture.encoding; + textureInstance.flipY = gameLibTexture.flipY; + /** + * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes + */ + textureInstance.generateMipmaps = gameLibTexture.generateMipmaps; + textureInstance.magFilter = gameLibTexture.magFilter; + textureInstance.minFilter = gameLibTexture.minFilter; + textureInstance.mapping = gameLibTexture.mapping; + textureInstance.mipmaps = gameLibTexture.mipmaps; + textureInstance.offset = new this.graphics.instance.Vector2( + gameLibTexture.offset.x, + gameLibTexture.offset.y + ); + textureInstance.premultiplyAlpha = gameLibTexture.premultiplyAlpha; + textureInstance.textureType = gameLibTexture.textureType; + textureInstance.wrapS = gameLibTexture.wrapS; + textureInstance.wrapT = gameLibTexture.wrapT; + textureInstance.unpackAlignment = gameLibTexture.unpackAlignment; + textureInstance.needsUpdate = true; + defer.resolve(textureInstance); + }, + function onProgress(xhr){ + if (this.progressCallback) { + this.progressCallback(Math.round(xhr.loaded / xhr.total * 100)) + } + }, + function onError() { + defer.resolve(null); + } + ); + + return defer.promise; +}; + +/** + * Starts a Image Loading Process - when all are done - executes all calbacks registered + * on materials listening for an image load to complete + * @returns {promise.promise|jQuery.promise|*|Promise|promise} + */ +GameLib.D3.Texture.prototype.start = function() { + + var defer = Q.defer(); + + var texturesToLoad = []; + + for (var u = 0; u < this.urls.length; u++) { + texturesToLoad.push(this.loadTexture(url, this.gameLibMaterials[u])); + } + + Q.all(texturesToLoad).then( + function(texture) { + return function onFulfilled(results) { + + for (var r = 0; r < results.length; r++) { + for (var t = 0; t < texture.gameLibMaterials.length; t++) { + for (var cb = 0; cb < texture.gameLibMaterials[t].OnImageLoadedCallbacks.length; cb++) { + texture.gameLibMaterials[t].OnImageLoadedCallbacks(results[r]); + } + } + } + + defer.resolve(results); + }; + }(this), + function onRejected(message){ + defer.reject(message); + }, + function onProgress(){ + console.log('progress'); + } + ); + + return defer.promise; +}; \ No newline at end of file From c988516f8d954229093a469948da69c9a11e6f0b Mon Sep 17 00:00:00 2001 From: "Theunis J. Botha" Date: Thu, 3 Nov 2016 14:33:14 +0100 Subject: [PATCH 6/6] fixed image loading - tests passing --- src/api-lib.js/api-lib-scene.js | 9 + src/game-lib-material.js | 347 +++++++++++++++++++------------- src/game-lib-scene.js | 253 ++++++++++++++++++----- src/game-lib-texture.js | 265 ++---------------------- 4 files changed, 440 insertions(+), 434 deletions(-) create mode 100644 src/api-lib.js/api-lib-scene.js diff --git a/src/api-lib.js/api-lib-scene.js b/src/api-lib.js/api-lib-scene.js new file mode 100644 index 0000000..c626a41 --- /dev/null +++ b/src/api-lib.js/api-lib-scene.js @@ -0,0 +1,9 @@ +ApiLib = function() { + +}; + +ApiLib.Scene = function( + +) { + +}; \ No newline at end of file diff --git a/src/game-lib-material.js b/src/game-lib-material.js index efd4015..c31d8cf 100644 --- a/src/game-lib-material.js +++ b/src/game-lib-material.js @@ -407,11 +407,6 @@ GameLib.D3.Material = function( envMapIntensity = 1.0; } this.envMapIntensity = envMapIntensity; - - /** - * @type GameLib.D3.Material.ImageLoadedCallback[] - */ - this.OnImageLoadedCallbacks = []; }; /** @@ -530,13 +525,115 @@ GameLib.D3.Material.TYPE_MULTI_MATERIAL= "MultiMaterial"; * Creates an instance Material from a GameLib.D3.Material * @param apiMaterial GameLib.D3.Material * @param graphics GameLib.D3.Graphics - * @param imageLoader GameLib.D3.Texture + * @param gameLibScene GameLib.D3.Scene */ GameLib.D3.Material.CreateInstanceMaterial = function( apiMaterial, graphics, - imageLoader + gameLibScene ) { + var maps = apiMaterial.maps; + + var gameLibTextures = []; + + for (var map in maps) { + if (maps.hasOwnProperty(map)) { + if (maps[map]) { + var instanceMapId = null; + + if (map == 'alpha') { + instanceMapId = 'alhpaMap'; + } + + if (map == 'ao') { + instanceMapId = 'aoMap'; + } + + if (map == 'bump') { + instanceMapId = 'bumpMap'; + } + + if (map == 'displacement') { + instanceMapId = 'displacementMap'; + } + + if (map == 'emissive') { + instanceMapId = 'emissiveMap'; + } + + if (map == 'environment') { + instanceMapId = 'envMap'; + } + + if (map == 'light') { + instanceMapId = 'lightMap'; + } + + if (map == 'specular') { + instanceMapId = 'specularMap'; + } + + if (map == 'diffuse') { + instanceMapId = 'map'; + } + + if (map == 'roughness') { + instanceMapId = 'roughnessMap'; + } + + if (map == 'metalness') { + instanceMapId = 'metalnessMap'; + } + + if (instanceMapId == null) { + console.warn("unsupported map type : " + map); + } + + var apiTexture = maps[map]; + + var apiImage = apiTexture.image; + + var gameLibTexture = new GameLib.D3.Texture( + apiTexture.id, + apiTexture.name, + new GameLib.D3.Image( + apiImage.id, + apiImage.textureLink, + apiImage.filename, + apiImage.size, + apiImage.contentType + ), + apiTexture.wrapS, + apiTexture.wrapT, + new GameLib.D3.Vector2( + apiTexture.repeat.x, + apiTexture.repeat.y + ), + apiTexture.data, + apiTexture.format, + apiTexture.mapping, + apiTexture.magFilter, + apiTexture.minFilter, + apiTexture.textureType, + apiTexture.anisotropy, + new GameLib.D3.Vector2( + apiTexture.offset.x, + apiTexture.offset.y + ), + apiTexture.generateMipmaps, + apiTexture.flipY, + apiTexture.mipmaps, + apiTexture.unpackAlignment, + apiTexture.premultiplyAlpha, + apiTexture.encoding, + instanceMapId + ); + + gameLibTextures.push(gameLibTexture); + } + } + } + var gameLibMaterial = new GameLib.D3.Material( apiMaterial.id, apiMaterial.name, @@ -544,7 +641,7 @@ GameLib.D3.Material.CreateInstanceMaterial = function( apiMaterial.opacity, apiMaterial.side, apiMaterial.transparent, - apiMaterial.maps, + gameLibTextures, new GameLib.D3.Color( apiMaterial.specular.r, apiMaterial.specular.g, @@ -614,156 +711,134 @@ GameLib.D3.Material.CreateInstanceMaterial = function( var instanceMaterial = null; - var blenderMaps = []; - - if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) { + if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) { instanceMaterial = new graphics.instance.MeshStandardMaterial({ - name: apiMaterial.name, - opacity: apiMaterial.opacity, - transparent: apiMaterial.transparent, - blending: apiMaterial.blending, - blendSrc: apiMaterial.blendSrc, - blendDst: apiMaterial.blendDst, - blendEquation: apiMaterial.blendEquation, - depthTest: apiMaterial.depthTest, - depthFunc: apiMaterial.depthFunc, - depthWrite: apiMaterial.depthWrite, - polygonOffset: apiMaterial.polygonOffset, - polygonOffsetFactor: apiMaterial.polygonOffsetFactor, - polygonOffsetUnits: apiMaterial.polygonOffsetUnits, - alphaTest: apiMaterial.alphaTest, - clippingPlanes: apiMaterial.clippingPlanes, - clipShadows: apiMaterial.clipShadows, - overdraw: apiMaterial.overdraw, - visible: apiMaterial.visible, - side: apiMaterial.side, + name: gameLibMaterial.name, + opacity: gameLibMaterial.opacity, + transparent: gameLibMaterial.transparent, + blending: gameLibMaterial.blending, + blendSrc: gameLibMaterial.blendSrc, + blendDst: gameLibMaterial.blendDst, + blendEquation: gameLibMaterial.blendEquation, + depthTest: gameLibMaterial.depthTest, + depthFunc: gameLibMaterial.depthFunc, + depthWrite: gameLibMaterial.depthWrite, + polygonOffset: gameLibMaterial.polygonOffset, + polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, + polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, + alphaTest: gameLibMaterial.alphaTest, + clippingPlanes: gameLibMaterial.clippingPlanes, + clipShadows: gameLibMaterial.clipShadows, + overdraw: gameLibMaterial.overdraw, + visible: gameLibMaterial.visible, + side: gameLibMaterial.side, color: new graphics.instance.Color( - apiMaterial.color.r, - apiMaterial.color.g, - apiMaterial.color.b + gameLibMaterial.color.r, + gameLibMaterial.color.g, + gameLibMaterial.color.b ), - roughness: apiMaterial.roughness, - metalness: apiMaterial.metalness, - lightMapIntensity: apiMaterial.lightMapIntensity, - aoMapIntensity: apiMaterial.aoMapIntensity, + roughness: gameLibMaterial.roughness, + metalness: gameLibMaterial.metalness, + lightMapIntensity: gameLibMaterial.lightMapIntensity, + aoMapIntensity: gameLibMaterial.aoMapIntensity, emissive: new graphics.instance.Color( - apiMaterial.emissive.r, - apiMaterial.emissive.g, - apiMaterial.emissive.b + gameLibMaterial.emissive.r, + gameLibMaterial.emissive.g, + gameLibMaterial.emissive.b ), - emissiveIntensity: apiMaterial.emissiveIntensity, - bumpScale: apiMaterial.bumpScale, - normalScale: apiMaterial.normalScale, - displacementScale: apiMaterial.displacementScale, - refractionRatio: apiMaterial.refractionRatio, - fog: apiMaterial.fog, - shading: apiMaterial.shading, - wireframe: apiMaterial.wireframe, - wireframeLinewidth: apiMaterial.wireframeLineWidth, - wireframeLinecap: apiMaterial.wireframeLineCap, - wireframeLinejoin: apiMaterial.wireframeLineJoin, - vertexColors: apiMaterial.vertexColors, - skinning: apiMaterial.skinning, - morphTargets: apiMaterial.morphTargets, - morphNormals: apiMaterial.morphNormals + emissiveIntensity: gameLibMaterial.emissiveIntensity, + bumpScale: gameLibMaterial.bumpScale, + normalScale: gameLibMaterial.normalScale, + displacementScale: gameLibMaterial.displacementScale, + refractionRatio: gameLibMaterial.refractionRatio, + fog: gameLibMaterial.fog, + shading: gameLibMaterial.shading, + wireframe: gameLibMaterial.wireframe, + wireframeLinewidth: gameLibMaterial.wireframeLineWidth, + wireframeLinecap: gameLibMaterial.wireframeLineCap, + wireframeLinejoin: gameLibMaterial.wireframeLineJoin, + vertexColors: gameLibMaterial.vertexColors, + skinning: gameLibMaterial.skinning, + morphTargets: gameLibMaterial.morphTargets, + morphNormals: gameLibMaterial.morphNormals }); - blenderMaps.push( - 'diffuse', - 'light', - 'ao', - 'emissive', - 'bump', - 'normal', - 'displacement', - 'roughness', - 'metalness', - 'alpha', - 'environment' - ); - - } else if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) { + } else if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) { instanceMaterial = new graphics.instance.MeshPhongMaterial({ - name: apiMaterial.name, - opacity: apiMaterial.opacity, - transparent: apiMaterial.transparent, - blending: apiMaterial.blending, - blendSrc: apiMaterial.blendSrc, - blendDst: apiMaterial.blendDst, - blendEquation: apiMaterial.blendEquation, - depthTest: apiMaterial.depthTest, - depthFunc: apiMaterial.depthFunc, - depthWrite: apiMaterial.depthWrite, - polygonOffset: apiMaterial.polygonOffset, - polygonOffsetFactor: apiMaterial.polygonOffsetFactor, - polygonOffsetUnits: apiMaterial.polygonOffsetUnits, - alphaTest: apiMaterial.alphaTest, - clippingPlanes: apiMaterial.clippingPlanes, - clipShadows: apiMaterial.clipShadows, - overdraw: apiMaterial.overdraw, - visible: apiMaterial.visible, - side: apiMaterial.side, + name: gameLibMaterial.name, + opacity: gameLibMaterial.opacity, + transparent: gameLibMaterial.transparent, + blending: gameLibMaterial.blending, + blendSrc: gameLibMaterial.blendSrc, + blendDst: gameLibMaterial.blendDst, + blendEquation: gameLibMaterial.blendEquation, + depthTest: gameLibMaterial.depthTest, + depthFunc: gameLibMaterial.depthFunc, + depthWrite: gameLibMaterial.depthWrite, + polygonOffset: gameLibMaterial.polygonOffset, + polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, + polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, + alphaTest: gameLibMaterial.alphaTest, + clippingPlanes: gameLibMaterial.clippingPlanes, + clipShadows: gameLibMaterial.clipShadows, + overdraw: gameLibMaterial.overdraw, + visible: gameLibMaterial.visible, + side: gameLibMaterial.side, color: new graphics.instance.Color( - apiMaterial.color.r, - apiMaterial.color.g, - apiMaterial.color.b + gameLibMaterial.color.r, + gameLibMaterial.color.g, + gameLibMaterial.color.b ), specular: new graphics.instance.Color( - apiMaterial.specular.r, - apiMaterial.specular.g, - apiMaterial.specular.b + gameLibMaterial.specular.r, + gameLibMaterial.specular.g, + gameLibMaterial.specular.b ), - shininess: apiMaterial.shininess, - lightMapIntensity: apiMaterial.lightMapIntensity, - aoMapIntensity: apiMaterial.aoMapIntensity, + shininess: gameLibMaterial.shininess, + lightMapIntensity: gameLibMaterial.lightMapIntensity, + aoMapIntensity: gameLibMaterial.aoMapIntensity, emissive: new graphics.instance.Color( - apiMaterial.emissive.r, - apiMaterial.emissive.g, - apiMaterial.emissive.b + gameLibMaterial.emissive.r, + gameLibMaterial.emissive.g, + gameLibMaterial.emissive.b ), - emissiveIntensity: apiMaterial.emissiveIntensity, - bumpScale: apiMaterial.bumpScale, - normalScale: apiMaterial.normalScale, - displacementScale: apiMaterial.displacementScale, - combine: apiMaterial.combine, - refractionRatio: apiMaterial.refractionRatio, - fog: apiMaterial.fog, - shading: apiMaterial.shading, - wireframe: apiMaterial.wireframe, - wireframeLinewidth: apiMaterial.wireframeLineWidth, - wireframeLinecap: apiMaterial.wireframeLineCap, - wireframeLinejoin: apiMaterial.wireframeLineJoin, - vertexColors: apiMaterial.vertexColors, - skinning: apiMaterial.skinning, - morphTargets: apiMaterial.morphTargets, - morphNormals: apiMaterial.morphNormals + emissiveIntensity: gameLibMaterial.emissiveIntensity, + bumpScale: gameLibMaterial.bumpScale, + normalScale: gameLibMaterial.normalScale, + displacementScale: gameLibMaterial.displacementScale, + combine: gameLibMaterial.combine, + refractionRatio: gameLibMaterial.refractionRatio, + fog: gameLibMaterial.fog, + shading: gameLibMaterial.shading, + wireframe: gameLibMaterial.wireframe, + wireframeLinewidth: gameLibMaterial.wireframeLineWidth, + wireframeLinecap: gameLibMaterial.wireframeLineCap, + wireframeLinejoin: gameLibMaterial.wireframeLineJoin, + vertexColors: gameLibMaterial.vertexColors, + skinning: gameLibMaterial.skinning, + morphTargets: gameLibMaterial.morphTargets, + morphNormals: gameLibMaterial.morphNormals }); - blenderMaps.push( - 'diffuse', - 'light', - 'ao', - 'emissive', - 'bump', - 'normal', - 'displacement', - 'specular', - 'alpha', - 'environment' - ); - } else { console.log("material type is not implemented yet: " + apiMaterial.materialType + " - material indexes could be screwed up"); } - if (blenderMaps.length > 0) { - imageLoader.setup( - gameLibMaterial, - instanceMaterial, - blenderMaps - ); + /** + * Here we need to notify the scene of all the textures which need to be created once image loading for the + * textures are complete. (this download process will be started at a later stage) + * The Notification objects take care of applying the loaded instance texture(s) to the instance material + * once it is loaded + */ + for (var t = 0; t < gameLibTextures.length; t++) { + gameLibScene.notify( + new GameLib.D3.Texture.Notification( + gameLibTextures[t], + instanceMaterial + ) + ) } return instanceMaterial; diff --git a/src/game-lib-scene.js b/src/game-lib-scene.js index b1f104c..7192961 100644 --- a/src/game-lib-scene.js +++ b/src/game-lib-scene.js @@ -1,23 +1,27 @@ /** * Scenes are objects putting meshes into 'world space' - * @param id + * @param id Mongo.ObjectId * @param path String * @param name String + * @param graphics GameLib.D3.Graphics * @param meshes GameLib.D3.Mesh[] - * @param quaternion - * @param position - * @param rotation - * @param scale - * @param parentSceneId - * @param lights - * @param worlds - * @param entities + * @param quaternion GameLib.D3.Vector4 + * @param position GameLib.D3.Vector3 + * @param rotation GameLib.D3.Vector3 + * @param scale GameLib.D3.Vector3 + * @param parentSceneId String + * @param lights GameLib.D3.Light[] + * @param worlds GameLib.D3.World[] + * @param entities GameLib.D3.Entity[] + * @param progressCallback + * @param uploadUrl String * @constructor */ GameLib.D3.Scene = function( id, path, name, + graphics, meshes, quaternion, position, @@ -26,12 +30,23 @@ GameLib.D3.Scene = function( parentSceneId, lights, worlds, - entities + entities, + progressCallback, + uploadUrl ) { this.id = id; this.sceneId = GameLib.D3.Tools.RandomId(); this.path = path; this.name = name; + + this.graphics = graphics; + + if (graphics) { + this.graphics.isNotThreeThrow(); + this.textureLoader = new this.graphics.instance.TextureLoader(); + this.textureLoader.crossOrigin = ''; + } + if (this.name.trim() == "") { this.name = 'unnamed'; } @@ -80,6 +95,142 @@ GameLib.D3.Scene = function( entities = []; } this.entities = entities; + + this.uploadUrl = uploadUrl; + + this.progressCallback = progressCallback; + + this.urls = []; + this.notifications = []; +}; + +/** + * Notification objects manage the links between image filenames, instance texture + * map IDs, and instance materials. + * @param notification GameLib.D3.Texture.Notificatio + * @constructor + */ +GameLib.D3.Scene.prototype.notify = function( + notification +) { + var url = this.uploadUrl + '/' + notification.gameLibTexture.image.filename; + + if (this.urls.indexOf(url) == -1) { + this.urls.push(url); + } + + this.notifications.push(notification); +}; + +/** + * Promises to loads a texture + * @param url + * @returns {promise.promise|jQuery.promise|*|promise|Promise} + */ +GameLib.D3.Scene.prototype.loadTexture = function(url) { + + var defer = Q.defer(); + + this.textureLoader.load( + url, + function onLoad(textureInstance){ + defer.resolve(textureInstance); + }, + function onProgress(xhr){ + if (this.progressCallback) { + this.progressCallback(Math.round(xhr.loaded / xhr.total * 100)) + } + }, + function onError() { + defer.resolve(null); + } + ); + + return defer.promise; +}; + +/** + * Starts a Image Loading Process - when all are done - executes all calbacks registered + * on materials listening for an image load to complete + * @param urls + * @param onLoadedCallback + * @returns {jQuery.promise|promise.promise|*|Promise|promise} + */ +GameLib.D3.Scene.prototype.loadTextures = function(urls, onLoadedCallback) { + + var texturesToLoad = []; + + for (var u = 0; u < urls.length; u++) { + texturesToLoad.push(this.loadTexture(urls[u])); + } + + Q.all(texturesToLoad).then( + + function onFulfilled(textureInstances) { + + var loadedTexturesInstances = []; + + for (var t = 0; t < textureInstances.length; t++) { + + var instanceTexture = textureInstances[t]; + + if (!instanceTexture) { + continue; + } + + for (var n = 0; n < this.notifications.length; n++) { + + var notification = this.notifications[n]; + + var gameLibTexture = notification.gameLibTexture; + + var instanceMaterial = notification.instanceMaterial; + + var instanceMapId = gameLibTexture.instanceMapId; + + var filename = gameLibTexture.image.filename; + + if (instanceTexture.image.src.match(new RegExp(filename + '$'))) { + instanceMaterial[instanceMapId] = new this.graphics.instance.Texture( + instanceTexture.image, + gameLibTexture.mapping, + gameLibTexture.wrapS, + gameLibTexture.wrapT, + gameLibTexture.magFilter, + gameLibTexture.minFilter, + gameLibTexture.format, + gameLibTexture.textureType, + gameLibTexture.anisotropy + ); + + instanceMaterial[instanceMapId].name = gameLibTexture.name; + instanceMaterial[instanceMapId].flipY = gameLibTexture.flipY; + instanceMaterial[instanceMapId].encoding = gameLibTexture.encoding; + instanceMaterial[instanceMapId].flipY = gameLibTexture.flipY; + instanceMaterial[instanceMapId].offset.x = gameLibTexture.offset.x; + instanceMaterial[instanceMapId].offset.y = gameLibTexture.offset.y; + instanceMaterial[instanceMapId].mipmaps = gameLibTexture.mipmaps; + instanceMaterial[instanceMapId].unpackAlignment = gameLibTexture.unpackAlignment; + instanceMaterial[instanceMapId].premultiplyAlpha = gameLibTexture.premultiplyAlpha; + instanceMaterial[instanceMapId].needsUpdate = true; + instanceMaterial.needsUpdate = true; + + loadedTexturesInstances.push(instanceMaterial[instanceMapId]); + } + } + } + + onLoadedCallback(loadedTexturesInstances); + + }.bind(this), + function onRejected(message){ + console.log('Promise failed : ' + message); + }, + function onProgress(){ + console.log('progress'); + } + ); + }; /** @@ -126,7 +277,7 @@ GameLib.D3.Scene.LoadSceneFromApi = function( var scene = response.scene[0]; - var physics3ds = []; + var entities = []; if (scene.worlds && scene.worlds.length > 0) { console.warn('Implement physics worlds code here'); @@ -192,6 +343,7 @@ GameLib.D3.Scene.LoadSceneFromApi = function( scene._id || scene.id, scene.path, scene.name, + graphics, scene.meshes, new GameLib.D3.Vector4( scene.quaternion.x, @@ -216,16 +368,17 @@ GameLib.D3.Scene.LoadSceneFromApi = function( ), scene.parentSceneId, lights3d, - physics3ds + entities, + uploadUrl, + progressCallback, + uploadUrl ); GameLib.D3.Scene.LoadScene( scene3d, onLoaded, false, - graphics, - uploadUrl, - progressCallback + graphics ); } } @@ -240,16 +393,12 @@ GameLib.D3.Scene.LoadSceneFromApi = function( * @param onLoaded callback when all meshes have loaded * @param computeNormals set to true to compute new face and vertex normals during load * @param graphics GameLib.D3.Graphics - * @param uploadUrl - * @param progressCallback */ GameLib.D3.Scene.LoadScene = function( gameLibScene, onLoaded, computeNormals, - graphics, - uploadUrl, - progressCallback + graphics ) { console.log("loading scene " + gameLibScene.name); @@ -263,12 +412,6 @@ GameLib.D3.Scene.LoadScene = function( var instanceMeshes = []; - var gameLibTexture = new GameLib.D3.Texture( - graphics, - uploadUrl, - progressCallback - ); - for (var m = 0; m < gameLibScene.meshes.length; m++) { var mesh = gameLibScene.meshes[m]; @@ -407,7 +550,7 @@ GameLib.D3.Scene.LoadScene = function( var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( materials[0], graphics, - gameLibTexture + gameLibScene ); var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh( @@ -519,23 +662,43 @@ GameLib.D3.Scene.LoadScene = function( instanceScene.add(instanceLights[l]); } - gameLibTexture.start.then( - function onFullfilled() { - onLoaded( - gameLibScene, - { - scene: instanceScene, - lights: instanceLights, - meshes: instanceMeshes - } - ); - }, - function onRejected(message) { - console.log('Image loading failed with the following message: ' + message); - }, - function onProgress() { - console.log('loading images...'); - } - ); + gameLibScene.loadTextures(gameLibScene.urls, function(loadedTextures) { + + console.log('Found image data and applied it to ' + loadedTextures.length + ' textures'); + + onLoaded( + gameLibScene, + { + scene: instanceScene, + lights: instanceLights, + meshes: instanceMeshes + } + ); + }); }; + +GameLib.D3.Scene.FromAPIScene = function( + apiScene, + graphics, + progressCallback, + uploadUrl +) { + return new GameLib.D3.Scene( + apiScene.id, + apiScene.path, + apiScene.name, + graphics, + apiScene.meshes, + apiScene.quaternion, + apiScene.position, + apiScene.rotation, + apiScene.scale, + apiScene.parentSceneId, + apiScene.lights, + apiScene.worlds, + apiScene.entities, + progressCallback, + uploadUrl + ) +}; diff --git a/src/game-lib-texture.js b/src/game-lib-texture.js index 6539348..ce116c3 100644 --- a/src/game-lib-texture.js +++ b/src/game-lib-texture.js @@ -20,6 +20,7 @@ * @param unpackAlignment * @param premultiplyAlpha * @param encoding + * @param instanceMapId * @constructor */ GameLib.D3.Texture = function( @@ -42,7 +43,8 @@ GameLib.D3.Texture = function( mipmaps, unpackAlignment, premultiplyAlpha, - encoding + encoding, + instanceMapId ) { this.id = id; this.name = name; @@ -132,6 +134,8 @@ GameLib.D3.Texture = function( encoding = GameLib.D3.Texture.TYPE_LINEAR_ENCODING; } this.encoding = encoding; + + this.instanceMapId = instanceMapId; }; /** @@ -204,263 +208,18 @@ GameLib.D3.Texture.TYPE_RGBM16_ENCODING = 3005; GameLib.D3.Texture.TYPE_RGBD_ENCODING = 3006; // MAXRANGE IS 256. /** - * Defers loading of an image and resolves once image is loaded - * @param gameLibTexture GameLib.D3.Texture + * A Notification object stores an association between a gameLibTexture and a instance material map. * @param instanceMaterial - * @param instanceMaterialMapType - * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback - * @returns {Promise} + * @param gameLibTexture + * @constructor */ -GameLib.D3.Texture.LoadMap = function( +GameLib.D3.Texture.Notification = function( gameLibTexture, - instanceMaterial, - instanceMaterialMapType, - graphics, - uploadUrl, - progressCallback + instanceMaterial ) { - - var defer = Q.defer(); - - var imagePath = null; - - var textureLoader = new graphics.instance.TextureLoader(); - - if (gameLibTexture && gameLibTexture.image && gameLibTexture.image.filename) { - /** - * Else, load from upload source - */ - imagePath = uploadUrl + '/' + gameLibTexture.image.filename; - } - - if (!imagePath) { - defer.reject("No image path"); - return defer.promise; - } - - - - return defer.promise; -}; - -/** - * Image Loader - attempts to reduce image loading calls by only loading the necessary images once - and setting - * them up per material later. - * @param graphics GameLib.D3.Graphics - * @param uploadUrl String - * @param progressCallback - * @constructor - */ -GameLib.D3.Texture = function( - graphics, - uploadUrl, - progressCallback -) { - this.graphics = graphics; - this.graphics.isNotThreeThrow(); - - this.textureLoader = new this.graphics.instance.TextureLoader(); - this.textureLoader.crossOrigin = ''; - - this.uploadUrl = uploadUrl; - this.progressCallback = progressCallback; - this.urls = []; - this.gameLibMaterials = []; + this.gameLibTexture = gameLibTexture; + this.instanceMaterial = instanceMaterial; }; -/** - * Sets up the Texture Loader by Notifying it of any images that we intend to download soon - * Instead of starting the download immediately - we should collect all the image URLs and attempt - * to download them only once - then after they have downloaded, we execute any pending OnImageLoaded callbacks - * on the Material - * @param gameLibMaterial - * @param instanceMaterial - * @param blenderMaps - */ -GameLib.D3.Texture.prototype.setup = function( - gameLibMaterial, - instanceMaterial, - blenderMaps -) { - for (var ti = 0; ti < blenderMaps.length; ti++) { - - var map = blenderMaps[ti]; - - if (gameLibMaterial.maps.hasOwnProperty(map)) { - - var blenderTexture = gameLibMaterial.maps[map]; - - if ( - blenderTexture && - blenderTexture.image && - blenderTexture.image.filename - ) { - - var instanceMapId = null; - - if (map == 'alpha') { - instanceMapId = 'alhpaMap'; - } - - if (map == 'ao') { - instanceMapId = 'aoMap'; - } - - if (map == 'bump') { - instanceMapId = 'bumpMap'; - } - - if (map == 'displacement') { - instanceMapId = 'displacementMap'; - } - - if (map == 'emissive') { - instanceMapId = 'emissiveMap'; - } - - if (map == 'environment') { - instanceMapId = 'envMap'; - } - - if (map == 'light') { - instanceMapId = 'lightMap'; - } - - if (map == 'specular') { - instanceMapId = 'specularMap'; - } - - if (map == 'diffuse') { - instanceMapId = 'map'; - } - - if (map == 'roughness') { - instanceMapId = 'roughnessMap'; - } - - if (map == 'metalness') { - instanceMapId = 'metalnessMap'; - } - - if (instanceMapId == null) { - console.warn("unsupported map type : " + map); - } - - gameLibMaterial.OnImageLoadedCallbacks.push( - new GameLib.D3.Material.ImageLoadedCallback( - instanceMaterial, - instanceMapId - ) - ); - - this.notify( - gameLibMaterial, - blenderTexture.image.filename - ); - } - } - } -}; - -/** - * Notifies the texture loader to load the image (if not already started) - * @param gameLibMaterial - * @param fileName - * @constructor - */ -GameLib.D3.Texture.prototype.notify = function( - gameLibMaterial, - fileName -) { - this.gameLibMaterials.push(gameLibMaterial); - this.urls.push(this.uploadUrl + '/' + fileName); -}; - -GameLib.D3.Texture.prototype.loadTexture = function(url, gameLibTexture) { - - var defer = Q.defer(); - - this.textureLoader.load( - url, - function onLoad(textureInstance){ - textureInstance.name = gameLibTexture.name; - textureInstance.anisotropy = gameLibTexture.anisotropy; - textureInstance.encoding = gameLibTexture.encoding; - textureInstance.flipY = gameLibTexture.flipY; - /** - * We don't restore the format since this changing from OS to OS and breaks the implementation sometimes - */ - textureInstance.generateMipmaps = gameLibTexture.generateMipmaps; - textureInstance.magFilter = gameLibTexture.magFilter; - textureInstance.minFilter = gameLibTexture.minFilter; - textureInstance.mapping = gameLibTexture.mapping; - textureInstance.mipmaps = gameLibTexture.mipmaps; - textureInstance.offset = new this.graphics.instance.Vector2( - gameLibTexture.offset.x, - gameLibTexture.offset.y - ); - textureInstance.premultiplyAlpha = gameLibTexture.premultiplyAlpha; - textureInstance.textureType = gameLibTexture.textureType; - textureInstance.wrapS = gameLibTexture.wrapS; - textureInstance.wrapT = gameLibTexture.wrapT; - textureInstance.unpackAlignment = gameLibTexture.unpackAlignment; - textureInstance.needsUpdate = true; - defer.resolve(textureInstance); - }, - function onProgress(xhr){ - if (this.progressCallback) { - this.progressCallback(Math.round(xhr.loaded / xhr.total * 100)) - } - }, - function onError() { - defer.resolve(null); - } - ); - - return defer.promise; -}; - -/** - * Starts a Image Loading Process - when all are done - executes all calbacks registered - * on materials listening for an image load to complete - * @returns {promise.promise|jQuery.promise|*|Promise|promise} - */ -GameLib.D3.Texture.prototype.start = function() { - - var defer = Q.defer(); - - var texturesToLoad = []; - - for (var u = 0; u < this.urls.length; u++) { - texturesToLoad.push(this.loadTexture(url, this.gameLibMaterials[u])); - } - - Q.all(texturesToLoad).then( - function(texture) { - return function onFulfilled(results) { - - for (var r = 0; r < results.length; r++) { - for (var t = 0; t < texture.gameLibMaterials.length; t++) { - for (var cb = 0; cb < texture.gameLibMaterials[t].OnImageLoadedCallbacks.length; cb++) { - texture.gameLibMaterials[t].OnImageLoadedCallbacks(results[r]); - } - } - } - - defer.resolve(results); - }; - }(this), - function onRejected(message){ - defer.reject(message); - }, - function onProgress(){ - console.log('progress'); - } - ); - - return defer.promise; -}; \ No newline at end of file